Merge "Change Special:ChangePassword to use OOUI"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 3 Nov 2015 18:03:32 +0000 (18:03 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 3 Nov 2015 18:03:32 +0000 (18:03 +0000)
487 files changed:
RELEASE-NOTES-1.27
autoload.php
composer.json
docs/extension.schema.json
docs/hooks.txt
includes/AjaxResponse.php
includes/Block.php
includes/Category.php
includes/Collation.php
includes/DefaultSettings.php
includes/EditPage.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Html.php
includes/HtmlFormatter.php
includes/Import.php
includes/Linker.php
includes/MagicWord.php
includes/MediaWiki.php
includes/MovePage.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Preferences.php
includes/PrefixSearch.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteStats.php
includes/TemplateParser.php
includes/Title.php
includes/User.php
includes/UserRightsProxy.php
includes/api/ApiDelete.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiHelp.php
includes/api/ApiMain.php
includes/api/ApiMessage.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryORM.php [deleted file]
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiStashEdit.php
includes/api/ApiUpload.php
includes/api/i18n/ar.json
includes/api/i18n/ca.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/id.json [new file with mode: 0644]
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/kn.json [new file with mode: 0644]
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/lb.json
includes/api/i18n/lt.json
includes/api/i18n/mr.json
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/ps.json
includes/api/i18n/pt-br.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sd.json [new file with mode: 0644]
includes/api/i18n/tcy.json [new file with mode: 0644]
includes/api/i18n/te.json
includes/api/i18n/tr.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/cache/BacklinkCache.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/LinkCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/changes/CategoryMembershipChange.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntry.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/clientpool/RedisConnectionPool.php
includes/compat/RunningStatCompat.php [new file with mode: 0644]
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabasePostgres.php
includes/db/IDatabase.php
includes/db/IORMRow.php [deleted file]
includes/db/IORMTable.php [deleted file]
includes/db/ORMIterator.php [deleted file]
includes/db/ORMResult.php [deleted file]
includes/db/ORMRow.php [deleted file]
includes/db/ORMTable.php [deleted file]
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LBFactoryMulti.php
includes/db/loadbalancer/LBFactorySimple.php
includes/db/loadbalancer/LBFactorySingle.php
includes/db/loadbalancer/LoadBalancer.php
includes/db/loadbalancer/LoadMonitorMySQL.php
includes/debug/logger/LoggerFactory.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksDeletionUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/SiteStatsUpdate.php
includes/deferred/SquidUpdate.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/exception/ErrorPageError.php
includes/exception/MWExceptionHandler.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/FileBackendStore.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLRadioField.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ar.json
includes/installer/i18n/ast.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/ca.json
includes/installer/i18n/cs.json
includes/installer/i18n/da.json
includes/installer/i18n/de.json
includes/installer/i18n/el.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/he.json
includes/installer/i18n/id.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lt.json
includes/installer/i18n/mr.json
includes/installer/i18n/nl.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/sco.json
includes/installer/i18n/sd.json
includes/installer/i18n/yi.json
includes/installer/i18n/zh-hans.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/README
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/libs/IEUrlExtension.php
includes/libs/MapCacheLRU.php
includes/libs/ObjectFactory.php
includes/libs/ProcessCacheLRU.php
includes/libs/RunningStat.php [deleted file]
includes/libs/Xhprof.php
includes/libs/composer/ComposerInstalled.php [new file with mode: 0644]
includes/libs/objectcache/APCBagOStuff.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/EmptyBagOStuff.php
includes/libs/objectcache/HashBagOStuff.php
includes/libs/objectcache/IExpiringStore.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedClient.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedPhpBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/MultiWriteBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WinCacheBagOStuff.php
includes/libs/objectcache/XCacheBagOStuff.php
includes/media/Bitmap.php
includes/media/DjVu.php
includes/media/FormatMetadata.php
includes/media/MediaHandler.php
includes/media/TransformationalImageHandler.php
includes/mime.info
includes/mime.types
includes/objectcache/MemcachedBagOStuff.php [deleted file]
includes/objectcache/MemcachedClient.php [deleted file]
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MemcachedPhpBagOStuff.php [deleted file]
includes/objectcache/MultiWriteBagOStuff.php [deleted file]
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/parser/CacheTime.php
includes/parser/DateFormatter.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/Profiler.php
includes/profiler/TransactionProfiler.php
includes/profiler/output/ProfilerOutputUdp.php [deleted file]
includes/registration/ExtensionRegistry.php
includes/resourceloader/DerivativeResourceLoaderContext.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelList.php
includes/search/SearchResultSet.php
includes/skins/Skin.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/tidy/RaggettWrapper.php
includes/title/MediaWikiTitleCodec.php
includes/upload/UploadBase.php
includes/upload/UploadStash.php
includes/utils/FileContentsHasher.php
includes/utils/MWCryptHKDF.php
includes/utils/MWCryptRand.php
includes/utils/UIDGenerator.php
includes/widget/AUTHORS.txt
languages/Language.php
languages/classes/LanguageHy.php
languages/classes/LanguageWa.php
languages/i18n/af.json
languages/i18n/aln.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bn.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/cs.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/gom-latn.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/nah.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/olo.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/tcy.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/uz.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/yi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
load.php
maintenance/archives/patch-msg_resource.sql
maintenance/backupTextPass.inc
maintenance/createAndPromote.php
maintenance/dictionary/mediawiki.dic
maintenance/doMaintenance.php
maintenance/findOrphanedFiles.php [new file with mode: 0644]
maintenance/importDump.php
maintenance/install.php
maintenance/language/zhtable/Makefile.py
maintenance/mssql/tables.sql
maintenance/namespaceDupes.php
maintenance/populateCategory.php
maintenance/refreshLinks.php
maintenance/storage/recompressTracked.php
maintenance/tables.sql
maintenance/updateSpecialPages.php
maintenance/userOptions.inc
mw-config/config.js
opensearch_desc.php
package.json
phpcs.xml
resources/Resources.php
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/cs.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/src/jquery/jquery.tablesorter.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.search.css [changed mode: 0644->0755]
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki.widgets/AUTHORS.txt
resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
resources/src/mediawiki/api.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.Dialog.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.css
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.raggett.css [new file with mode: 0644]
resources/src/mediawiki/page/gallery.js
tests/TestsAutoLoader.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php [deleted file]
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/LinkFilterTest.php
tests/phpunit/includes/changes/EnhancedChangesListTest.php
tests/phpunit/includes/changes/TestRecentChangesHelper.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/db/ORMRowTest.php [deleted file]
tests/phpunit/includes/db/ORMTableTest.php [deleted file]
tests/phpunit/includes/db/TestORMRowTest.php [deleted file]
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/RunningStatTest.php [deleted file]
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/BagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/MultiWriteBagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/WANObjectCacheTest.php [deleted file]
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ResourcesTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
thumb.php

index b34b3c0..f549620 100644 (file)
@@ -9,7 +9,7 @@ MediaWiki 1.27 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.27 ===
-* Removed $wgUseLinkNamespaceDBFields
+* $wgUseLinkNamespaceDBFields was removed.
 * Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
   $wgResourceLoaderMinifierMaxLineLength, because there was little value in
   making the behavior configurable. The default values (`false` for the former,
@@ -43,6 +43,9 @@ production.
    PasswordFactory themselves.
 ** A new constructor, User::newSystemUser(), has been added to simplify the
    creation of passwordless "system" users for logged actions.
+* $wgMaxSquidPurgeTitles was removed.
+* $wgAjaxWatch was removed. This is now enabled by default.
+* (T27397) WebP is enabled by default as an uploadable filetype
 
 === New features in 1.27 ===
 * $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
@@ -74,8 +77,11 @@ production.
   into the redirect destination.
 * prop=imageinfo&iiprop=uploadwarning will no longer include the possibility of
   "was-deleted" warning.
+* Added difftotextpst to query=revisions which preforms a pre-save transform on
+  the text before diffing it.
 
 === Action API internal changes in 1.27 ===
+* ApiQueryORM removed.
 
 === Languages updated in 1.27 ===
 
@@ -84,6 +90,12 @@ regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Bugzilla reports.
 
 === Other changes in 1.27 ===
+* ProfilerOutputUdp was removed. Note that there is a ProfilerOutputStats class.
+* WikiPage::doDeleteArticleReal() and WikiPage::doDeleteArticle() now
+  ignore the 2nd and 3rd arguments (formerly $id and $commit).
+* Removed "loaderScripts" option from ResourceLoaderFileModule class.
+* Removed ORM-like wrapper added in 1.20.
+* LinkCache::getGoodLinks and LinkCache::getBadLinks were removed (deprecated in 1.26).
 
 == Compatibility ==
 
index 673072b..6c792e2 100644 (file)
@@ -103,7 +103,6 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryLangLinks' => __DIR__ . '/includes/api/ApiQueryLangLinks.php',
        'ApiQueryLinks' => __DIR__ . '/includes/api/ApiQueryLinks.php',
        'ApiQueryLogEvents' => __DIR__ . '/includes/api/ApiQueryLogEvents.php',
-       'ApiQueryORM' => __DIR__ . '/includes/api/ApiQueryORM.php',
        'ApiQueryPagePropNames' => __DIR__ . '/includes/api/ApiQueryPagePropNames.php',
        'ApiQueryPageProps' => __DIR__ . '/includes/api/ApiQueryPageProps.php',
        'ApiQueryPagesWithProp' => __DIR__ . '/includes/api/ApiQueryPagesWithProp.php',
@@ -243,6 +242,7 @@ $wgAutoloadLocalClasses = array(
        'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
        'CompareParsers' => __DIR__ . '/maintenance/compareParsers.php',
        'ComposerHookHandler' => __DIR__ . '/includes/composer/ComposerHookHandler.php',
+       'ComposerInstalled' => __DIR__ . '/includes/libs/composer/ComposerInstalled.php',
        'ComposerJson' => __DIR__ . '/includes/libs/composer/ComposerJson.php',
        'ComposerLock' => __DIR__ . '/includes/libs/composer/ComposerLock.php',
        'ComposerPackageModifier' => __DIR__ . '/includes/composer/ComposerPackageModifier.php',
@@ -446,6 +446,7 @@ $wgAutoloadLocalClasses = array(
        'FileRepoStatus' => __DIR__ . '/includes/filerepo/FileRepoStatus.php',
        'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
        'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
+       'FindOrphanedFiles' => __DIR__ . '/maintenance/findOrphanedFiles.php',
        'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
        'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
        'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
@@ -541,9 +542,8 @@ $wgAutoloadLocalClasses = array(
        'IDatabase' => __DIR__ . '/includes/db/IDatabase.php',
        'IEContentAnalyzer' => __DIR__ . '/includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
+       'IExpiringStore' => __DIR__ . '/includes/libs/objectcache/IExpiringStore.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
-       'IORMRow' => __DIR__ . '/includes/db/IORMRow.php',
-       'IORMTable' => __DIR__ . '/includes/db/IORMTable.php',
        'IP' => __DIR__ . '/includes/utils/IP.php',
        'IPSet' => __DIR__ . '/includes/compat/IPSetCompat.php',
        'IPTC' => __DIR__ . '/includes/media/IPTC.php',
@@ -721,7 +721,7 @@ $wgAutoloadLocalClasses = array(
        'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
        'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
-       'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MWMemcached' => __DIR__ . '/includes/libs/objectcache/MemcachedClient.php',
        'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
        'MWNamespace' => __DIR__ . '/includes/MWNamespace.php',
        'MWOldPassword' => __DIR__ . '/includes/password/MWOldPassword.php',
@@ -779,11 +779,11 @@ $wgAutoloadLocalClasses = array(
        'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
-       'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MemCachedClientforWiki' => __DIR__ . '/includes/libs/objectcache/MemcachedClient.php',
        'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
-       'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
+       'MemcachedBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedBagOStuff.php',
        'MemcachedPeclBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPeclBagOStuff.php',
-       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPhpBagOStuff.php',
+       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedPhpBagOStuff.php',
        'MemoizedCallable' => __DIR__ . '/includes/libs/MemoizedCallable.php',
        'MemoryFileBackend' => __DIR__ . '/includes/filebackend/MemoryFileBackend.php',
        'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
@@ -817,7 +817,7 @@ $wgAutoloadLocalClasses = array(
        'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
-       'MultiWriteBagOStuff' => __DIR__ . '/includes/objectcache/MultiWriteBagOStuff.php',
+       'MultiWriteBagOStuff' => __DIR__ . '/includes/libs/objectcache/MultiWriteBagOStuff.php',
        'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
        'MutableContext' => __DIR__ . '/includes/context/MutableContext.php',
        'MwSql' => __DIR__ . '/maintenance/sql.php',
@@ -847,10 +847,6 @@ $wgAutoloadLocalClasses = array(
        'OOUIHTMLForm' => __DIR__ . '/includes/htmlform/OOUIHTMLForm.php',
        'ORAField' => __DIR__ . '/includes/db/DatabaseOracle.php',
        'ORAResult' => __DIR__ . '/includes/db/DatabaseOracle.php',
-       'ORMIterator' => __DIR__ . '/includes/db/ORMIterator.php',
-       'ORMResult' => __DIR__ . '/includes/db/ORMResult.php',
-       'ORMRow' => __DIR__ . '/includes/db/ORMRow.php',
-       'ORMTable' => __DIR__ . '/includes/db/ORMTable.php',
        'ObjectCache' => __DIR__ . '/includes/objectcache/ObjectCache.php',
        'ObjectCacheSessionHandler' => __DIR__ . '/includes/objectcache/ObjectCacheSessionHandler.php',
        'ObjectFactory' => __DIR__ . '/includes/libs/ObjectFactory.php',
@@ -955,7 +951,6 @@ $wgAutoloadLocalClasses = array(
        'ProfilerOutputDump' => __DIR__ . '/includes/profiler/output/ProfilerOutputDump.php',
        'ProfilerOutputStats' => __DIR__ . '/includes/profiler/output/ProfilerOutputStats.php',
        'ProfilerOutputText' => __DIR__ . '/includes/profiler/output/ProfilerOutputText.php',
-       'ProfilerOutputUdp' => __DIR__ . '/includes/profiler/output/ProfilerOutputUdp.php',
        'ProfilerSectionOnly' => __DIR__ . '/includes/profiler/ProfilerSectionOnly.php',
        'ProfilerStub' => __DIR__ . '/includes/profiler/ProfilerStub.php',
        'ProfilerXhprof' => __DIR__ . '/includes/profiler/ProfilerXhprof.php',
@@ -1077,7 +1072,7 @@ $wgAutoloadLocalClasses = array(
        'RollbackEdits' => __DIR__ . '/maintenance/rollbackEdits.php',
        'RowUpdateGenerator' => __DIR__ . '/includes/utils/RowUpdateGenerator.php',
        'RunJobs' => __DIR__ . '/maintenance/runJobs.php',
-       'RunningStat' => __DIR__ . '/includes/libs/RunningStat.php',
+       'RunningStat' => __DIR__ . '/includes/compat/RunningStatCompat.php',
        'SQLiteField' => __DIR__ . '/includes/db/DatabaseSqlite.php',
        'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
index 6209017..553ec44 100644 (file)
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.16",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.12.12",
+               "oojs/oojs-ui": "0.13.0",
                "oyejorge/less.php": "1.7.0.9",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
+               "wikimedia/base-convert": "1.0.1",
                "wikimedia/cdb": "1.3.0",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
                "wikimedia/composer-merge-plugin": "1.2.1",
                "wikimedia/ip-set": "1.0.1",
                "wikimedia/relpath": "1.0.3",
+               "wikimedia/running-stat": "1.1.0",
                "wikimedia/utfnormal": "1.0.3",
                "wikimedia/wrappedstring": "2.0.0",
                "zordius/lightncandy": "0.21"
@@ -39,7 +41,7 @@
                "jakub-onderka/php-parallel-lint": "0.9",
                "justinrainbow/json-schema": "~1.3",
                "mediawiki/mediawiki-codesniffer": "0.4.0",
-               "monolog/monolog": "1.14.0",
+               "monolog/monolog": "~1.17.2",
                "nmred/kafka-php": "0.1.4",
                "phpunit/phpunit": "3.7.37",
                "wikimedia/avro": "1.7.7"
index 218a19c..dde4fa1 100644 (file)
                "ResourceModules": {
                        "type": "object",
                        "description": "ResourceLoader modules to register",
-                       "additionalProperties": false,
                        "patternProperties": {
                                "^[a-zA-Z0-9-\\.]+$": {
                                        "type": "object",
-                                       "description": "A single ResourceLoader module descriptor",
-                                       "properties": {
-                                               "localBasePath": {
-                                                       "type": "string",
-                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
-                                               },
-                                               "remoteBasePath": {
-                                                       "type": "string",
-                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
-                                               },
-                                               "remoteExtPath": {
-                                                       "type": "string",
-                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
-                                               },
-                                               "scripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to always include (array of file paths)",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "languageScripts": {
-                                                       "type": "object",
-                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
-                                                       "patternProperties": {
-                                                               "^[a-zA-Z0-9-]{2,}$": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                       "anyOf": [
+                                               {
+                                                       "description": "A ResourceLoaderFileModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "localBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+                                                               },
+                                                               "remoteBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+                                                               },
+                                                               "remoteExtPath": {
+                                                                       "type": "string",
+                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+                                                               },
+                                                               "scripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to always include (array of file paths)",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
-                                                               }
-                                                       }
-                                               },
-                                               "skinScripts": {
-                                                       "type": "object",
-                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
-                                                       "patternProperties": {
-                                                               ".+": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                                               },
+                                                               "languageScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+                                                                       "patternProperties": {
+                                                                               "^[a-zA-Z0-9-]{2,}$": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "skinScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "debugScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in debug contexts",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
-                                                               }
-                                                       }
-                                               },
-                                               "debugScripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to include in debug contexts",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "loaderScripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to include in the startup module",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "dependencies": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Modules which must be loaded before this module",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "styles": {
-                                                       "type": ["string", "array", "object"],
-                                                       "description": "Styles to always load",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "skinStyles": {
-                                                       "type": "object",
-                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
-                                                       "patternProperties": {
-                                                               ".+": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                                               },
+                                                               "loaderScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in the startup module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "dependencies": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Modules which must be loaded before this module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": ["string", "array", "object"],
+                                                                       "description": "Styles to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "skinStyles": {
+                                                                       "type": "object",
+                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "messages": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Messages to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group which this module should be loaded together with"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "templates": {
+                                                                       "type": "object",
+                                                                       "description": "Templates to be loaded for client-side usage"
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
                                                                }
                                                        }
                                                },
-                                               "messages": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Messages to always load",
-                                                       "items": {
-                                                               "type": "string"
+                                               {
+                                                       "description": "A ResourceLoaderImageModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderImageModule"]
+                                                               },
+                                                               "data": {
+                                                                       "type": "string"
+                                                               },
+                                                               "prefix": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selector": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithoutVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "variants": {
+                                                                       "type": "object"
+                                                               },
+                                                               "images": {
+                                                                       "type": "object"
+                                                               },
+                                                               "position": {
+                                                                       "enum": [
+                                                                               "top",
+                                                                               "bottom"
+                                                                       ]
+                                                               }
                                                        }
                                                },
-                                               "group": {
-                                                       "type": "string",
-                                                       "description": "Group which this module should be loaded together with"
-                                               },
-                                               "position": {
-                                                       "type": "string",
-                                                       "description": "Position on the page to load this module at",
-                                                       "enum": [
-                                                               "bottom",
-                                                               "top"
-                                                       ]
-                                               },
-                                               "templates": {
-                                                       "type": "object",
-                                                       "description": "Templates to be loaded for client-side usage"
+                                               {
+                                                       "description": "An arbitrary ResourceLoaderModule definition",
+                                                       "properties": {
+                                                               "class": {
+                                                                       "type": "string",
+                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+                                                               }
+                                                       },
+                                                       "required": ["class"]
                                                }
-                                       }
+                                       ]
                                }
                        }
                },
index 0e76d58..427f35e 100644 (file)
@@ -575,6 +575,7 @@ $error: if the deletion was prohibited, the (raw HTML) error message to display
   (added in 1.13)
 $status: Status object, modify this to throw an error. Overridden by $error
   (added in 1.20)
+$suppress: Whether this is a suppression deletion or not (added in 1.27)
 
 'ArticleDeleteAfterSuccess': Output after an article has been deleted.
 $title: Title of the article that has been deleted.
@@ -767,7 +768,7 @@ $name: Image name being checked
 
 'BaseTemplateAfterPortlet': After output of portlets, allow injecting
 custom HTML after the section. Any uses of the hook need to handle escaping.
-$template BaseTemplate
+$template: BaseTemplate
 $portlet: string portlet name
 &$html: string
 
@@ -1362,10 +1363,10 @@ $user: user who performed the undeletion
 $reason: reason
 
 'FileUpload': When a file upload occurs.
-$file : Image object representing the file that was uploaded
-$reupload : Boolean indicating if there was a previously another image there or
+$file: Image object representing the file that was uploaded
+$reupload: Boolean indicating if there was a previously another image there or
   not (since 1.17)
-$hasDescription : Boolean indicating that there was already a description page
+$hasDescription: Boolean indicating that there was already a description page
   and a new one from the comment wasn't created (since 1.17)
 
 'FormatAutocomments': When an autocomment is formatted by the Linker.
index 6c2efc2..34bb65f 100644 (file)
@@ -276,13 +276,11 @@ class AjaxResponse {
         * @return bool
         */
        function loadFromMemcached( $mckey, $touched ) {
-               global $wgMemc;
-
                if ( !$touched ) {
                        return false;
                }
 
-               $mcvalue = $wgMemc->get( $mckey );
+               $mcvalue = ObjectCache::getMainWANInstance()->get( $mckey );
                if ( $mcvalue ) {
                        # Check to see if the value has been invalidated
                        if ( $touched <= $mcvalue['timestamp'] ) {
@@ -304,9 +302,7 @@ class AjaxResponse {
         * @return bool
         */
        function storeInMemcached( $mckey, $expiry = 86400 ) {
-               global $wgMemc;
-
-               $wgMemc->set( $mckey,
+               ObjectCache::getMainWANInstance()->set( $mckey,
                        array(
                                'timestamp' => wfTimestampNow(),
                                'value' => $this->mText
index 0ec4ad1..b57b3e8 100644 (file)
@@ -679,16 +679,17 @@ class Block {
         * @return bool
         */
        public static function isWhitelistedFromAutoblocks( $ip ) {
-               global $wgMemc;
-
                // Try to get the autoblock_whitelist from the cache, as it's faster
                // than getting the msg raw and explode()'ing it.
-               $key = wfMemcKey( 'ipb', 'autoblock', 'whitelist' );
-               $lines = $wgMemc->get( $key );
-               if ( !$lines ) {
-                       $lines = explode( "\n", wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
-                       $wgMemc->set( $key, $lines, 3600 * 24 );
-               }
+               $cache = ObjectCache::getMainWANInstance();
+               $lines = $cache->getWithSetCallback(
+                       wfMemcKey( 'ipb', 'autoblock', 'whitelist' ),
+                       $cache::TTL_DAY,
+                       function () {
+                               return explode( "\n",
+                                       wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
+                       }
+               );
 
                wfDebug( "Checking the autoblock whitelist..\n" );
 
index 3a21e25..3860172 100644 (file)
@@ -304,32 +304,16 @@ class Category {
                        return false;
                }
 
-               # Note, we must use names for this, since categorylinks does.
-               if ( $this->mName === null ) {
-                       if ( !$this->initialize() ) {
-                               return false;
-                       }
+               # If we have just a category name, find out whether there is an
+               # existing row. Or if we have just an ID, get the name, because
+               # that's what categorylinks uses.
+               if ( !$this->initialize() ) {
+                       return false;
                }
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->startAtomic( __METHOD__ );
 
-               # Insert the row if it doesn't exist yet (e.g., this is being run via
-               # update.php from a pre-1.16 schema).  TODO: This will cause lots and
-               # lots of gaps on some non-MySQL DBMSes if you run populateCategory.php
-               # repeatedly.  Plus it's an extra query that's unneeded almost all the
-               # time.  This should be rewritten somehow, probably.
-               $seqVal = $dbw->nextSequenceValue( 'category_cat_id_seq' );
-               $dbw->insert(
-                       'category',
-                       array(
-                               'cat_id' => $seqVal,
-                               'cat_title' => $this->mName
-                       ),
-                       __METHOD__,
-                       'IGNORE'
-               );
-
                $cond1 = $dbw->conditional( array( 'page_namespace' => NS_CATEGORY ), 1, 'NULL' );
                $cond2 = $dbw->conditional( array( 'page_namespace' => NS_FILE ), 1, 'NULL' );
                $result = $dbw->selectRow(
@@ -342,16 +326,40 @@ class Category {
                        __METHOD__,
                        array( 'LOCK IN SHARE MODE' )
                );
-               $ret = $dbw->update(
-                       'category',
-                       array(
-                               'cat_pages' => $result->pages,
-                               'cat_subcats' => $result->subcats,
-                               'cat_files' => $result->files
-                       ),
-                       array( 'cat_title' => $this->mName ),
-                       __METHOD__
-               );
+
+               if ( $this->mID ) {
+                       # The category row already exists, so do a plain UPDATE instead
+                       # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap
+                       # in the cat_id sequence. The row may or may not be "affected".
+                       $dbw->update(
+                               'category',
+                               array(
+                                       'cat_pages' => $result->pages,
+                                       'cat_subcats' => $result->subcats,
+                                       'cat_files' => $result->files
+                               ),
+                               array( 'cat_title' => $this->mName ),
+                               __METHOD__
+                       );
+               } else {
+                       $dbw->upsert(
+                               'category',
+                               array(
+                                       'cat_title' => $this->mName,
+                                       'cat_pages' => $result->pages,
+                                       'cat_subcats' => $result->subcats,
+                                       'cat_files' => $result->files
+                               ),
+                               array( 'cat_title' ),
+                               array(
+                                       'cat_pages' => $result->pages,
+                                       'cat_subcats' => $result->subcats,
+                                       'cat_files' => $result->files
+                               ),
+                               __METHOD__
+                       );
+               }
+
                $dbw->endAtomic( __METHOD__ );
 
                # Now we should update our local counts.
@@ -359,6 +367,6 @@ class Category {
                $this->mSubcats = $result->subcats;
                $this->mFiles = $result->files;
 
-               return $ret;
+               return true;
        }
 }
index c1f0b38..7fa5c6e 100644 (file)
@@ -406,14 +406,15 @@ class IcuCollation extends Collation {
                        }
                }
 
-               // Sort the letters.
-               //
-               // It's impossible to have the precompiled data file properly sorted,
-               // because the sort order changes depending on ICU version. If the
-               // array is not properly sorted, the binary search will return random
-               // results.
-               //
-               // We also take this opportunity to remove primary collisions.
+               /* Sort the letters.
+                *
+                * It's impossible to have the precompiled data file properly sorted,
+                * because the sort order changes depending on ICU version. If the
+                * array is not properly sorted, the binary search will return random
+                * results.
+                *
+                * We also take this opportunity to remove primary collisions.
+                */
                $letterMap = array();
                foreach ( $letters as $letter ) {
                        $key = $this->getPrimarySortKey( $letter );
@@ -428,38 +429,40 @@ 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.
+
+               /* 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();
@@ -505,7 +508,7 @@ class IcuCollation extends Collation {
 
                // Save to cache
                $this->firstLetterData = $data;
-               $cache->set( $cacheKey, $data, 86400 * 7 /* 1 week */ );
+               $cache->set( $cacheKey, $data, $cache::TTL_WEEK );
                return $data;
        }
 
index 9eff602..6032ba3 100644 (file)
@@ -720,6 +720,14 @@ $wgCopyUploadAsyncTimeout = false;
  */
 $wgMaxUploadSize = 1024 * 1024 * 100; # 100MB
 
+/**
+ * Minimum upload chunk size, in bytes. When using chunked upload, non-final
+ * chunks smaller than this will be rejected. May be reduced based on the
+ * 'upload_max_filesize' or 'post_max_size' PHP settings.
+ * @since 1.26
+ */
+$wgMinUploadChunkSize = 1024; # 1KB
+
 /**
  * Point the upload navigation link to an external URL
  * Useful if you want to use a shared repository by default
@@ -797,7 +805,7 @@ $wgRepositoryBaseUrl = "https://commons.wikimedia.org/wiki/File:";
  * such as odt or doc, and untrusted users are allowed to upload files, then
  * your wiki will be vulnerable to cross-site request forgery (CSRF).
  */
-$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
+$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg', 'webp' );
 
 /**
  * Files with these extensions will never be allowed as uploads.
@@ -2203,8 +2211,8 @@ $wgObjectCaches = array(
        CACHE_DB => array( 'class' => 'SqlBagOStuff', 'loggroup' => 'SQLBagOStuff' ),
 
        CACHE_ANYTHING => array( 'factory' => 'ObjectCache::newAnything' ),
-       CACHE_ACCEL => array( 'factory' => 'ObjectCache::newAccelerator' ),
-       CACHE_MEMCACHED => array( 'factory' => 'ObjectCache::newMemcached', 'loggroup' => 'memcached' ),
+       CACHE_ACCEL => array( 'factory' => 'ObjectCache::getLocalServerInstance' ),
+       CACHE_MEMCACHED => array( 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ),
 
        'db-replicated' => array(
                'class'       => 'ReplicatedBagOStuff',
@@ -2255,7 +2263,8 @@ $wgMainWANCache = false;
  * the value is an associative array of parameters. The "cacheId" parameter is
  * a cache identifier from $wgObjectCaches. The "relayerConfig" parameter is an
  * array used to construct an EventRelayer object. The "pool" parameter is a
- * string that is used as a PubSub channel prefix.
+ * string that is used as a PubSub channel prefix. The "loggroup" parameter
+ * controls where log events are sent.
  *
  * @since 1.26
  */
@@ -2611,11 +2620,6 @@ $wgSquidServers = array();
  */
 $wgSquidServersNoPurge = array();
 
-/**
- * Maximum number of titles to purge in any one client operation
- */
-$wgMaxSquidPurgeTitles = 400;
-
 /**
  * Whether to use a Host header in purge requests sent to the proxy servers
  * configured in $wgSquidServers. Set this to false to support Squid
@@ -3362,10 +3366,11 @@ $wgEdititis = false;
 $wgSend404Code = true;
 
 /**
- * The $wgShowRollbackEditCount variable is used to show how many edits will be
- * rollback. The numeric value of the variable are the limit up to are counted.
- * If the value is false or 0, the edits are not counted. Disabling this will
- * furthermore prevent MediaWiki from hiding some useless rollback links.
+ * The $wgShowRollbackEditCount variable is used to show how many edits can be rolled back.
+ * The numeric value of the variable controls how many edits MediaWiki will look back to
+ * determine whether a rollback is allowed (by checking that they are all from the same author).
+ * If the value is false or 0, the edits are not counted. Disabling this will prevent MediaWiki
+ * from hiding some useless rollback links.
  *
  * @since 1.20
  */
@@ -3392,14 +3397,14 @@ $wgMangleFlashPolicy = true;
 /** @} */ # End of output format settings }
 
 /*************************************************************************//**
- * @name   Resource loader settings
+ * @name   ResourceLoader settings
  * @{
  */
 
 /**
  * Client-side resource modules.
  *
- * Extensions should add their resource loader module definitions
+ * Extensions should add their ResourceLoader module definitions
  * to the $wgResourceModules variable.
  *
  * @par Example:
@@ -3524,7 +3529,7 @@ $wgResourceLoaderSources = array();
 $wgResourceBasePath = null;
 
 /**
- * Maximum time in seconds to cache resources served by the resource loader.
+ * Maximum time in seconds to cache resources served by ResourceLoader.
  * Used to set last modified headers (max-age/s-maxage).
  *
  * Following options to distinguish:
@@ -3731,7 +3736,7 @@ $wgResourceLoaderStorageVersion = 1;
  */
 $wgAllowSiteCSSOnRestrictedPages = false;
 
-/** @} */ # End of resource loader settings }
+/** @} */ # End of ResourceLoader settings }
 
 /*************************************************************************//**
  * @name   Page title and interwiki link settings
@@ -4539,6 +4544,7 @@ $wgDefaultUserOptions = array(
        'gender' => 'unknown',
        'hideminor' => 0,
        'hidepatrolled' => 0,
+       'hidecategorization' => 1,
        'imagesize' => 2,
        'math' => 1,
        'minordefault' => 0,
@@ -4570,6 +4576,7 @@ $wgDefaultUserOptions = array(
        'watchlisthideminor' => 0,
        'watchlisthideown' => 0,
        'watchlisthidepatrolled' => 0,
+       'watchlisthidecategorization' => 1,
        'watchmoves' => 0,
        'watchrollback' => 0,
        'wllimit' => 250,
@@ -5196,74 +5203,85 @@ $wgApplyIpBlocksToXff = false;
  * @par Example:
  * To set a generic maximum of 4 hits in 60 seconds:
  * @code
- * $wgRateLimits = array( 4, 60 );
+ *     $wgRateLimits = array( 4, 60 );
  * @endcode
  *
- * You could also limit per action and then type of users. See the inline
- * code for a template to use.
- *
- * This option set is experimental and likely to change.
+ * @par Example:
+ * You could also limit per action and then type of users.
+ * @code
+ *     $wgRateLimits = array(
+ *         'edit' => array(
+ *             'anon' => array( x, y ), // any and all anonymous edits (aggregate)
+ *             'user' => array( x, y ), // each logged-in user
+ *             'newbie' => array( x, y ), // each new autoconfirmed accounts; overrides 'user'
+ *             'ip' => array( x, y ), // each anon and recent account
+ *             'subnet' => array( x, y ), // ... within a /24 subnet in IPv4 or /64 in IPv6
+ *         )
+ *     )
+ * @endcode
  *
- * @warning Requires memcached.
+ * @warning Requires that $wgMainCacheType is set to something persistent
  */
 $wgRateLimits = array(
+       // Page edits
        'edit' => array(
-               'anon' => null, // for any and all anonymous edits (aggregate)
-               'user' => null, // for each logged-in user
-               'newbie' => null, // for each recent (autoconfirmed) account; overrides 'user'
-               'ip' => null, // for each anon and recent account
-               'subnet' => null, // ... within a /24 subnet in IPv4 or /64 in IPv6
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
+       // Page moves
        'move' => array(
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+               'newbie' => array( 2, 120 ),
+               'user' => array( 8, 60 ),
        ),
-       'mailpassword' => array( // triggering password resets emails
-               'anon' => null,
+       // File uploads
+       'upload' => array(
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
-       'emailuser' => array( // emailing other users using MediaWiki
-               'user' => null,
+       // Page rollbacks
+       'rollback' => array(
+               'user' => array( 10, 60 ),
+               'newbie' => array( 5, 120 )
        ),
-       'linkpurge' => array( // purges of link tables
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Triggering password resets emails
+       'mailpassword' => array(
+               'ip' => array( 5, 3600 ),
        ),
-       'renderfile' => array( // files rendered via thumb.php or thumb_handler.php
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Emailing other users using MediaWiki
+       'emailuser' => array(
+               'ip' => array( 5, 86400 ),
+               'newbie' => array( 5, 86400 ),
+               'user' => array( 20, 86400 ),
        ),
-       'renderfile-nonstandard' => array( // same as above but for non-standard thumbnails
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Purging pages
+       'purge' => array(
+               'ip' => array( 30, 60 ),
+               'user' => array( 30, 60 ),
        ),
-       'stashedit' => array( // stashing edits into cache before save
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Purges of link tables
+       'linkpurge' => array(
+               'ip' => array( 30, 60 ),
+               'user' => array( 30, 60 ),
        ),
-       'changetag' => array( // adding or removing change tags
-               'user' => null,
-               'newbie' => null,
+       // Files rendered via thumb.php or thumb_handler.php
+       'renderfile' => array(
+               'ip' => array( 700, 30 ),
+               'user' => array( 700, 30 ),
        ),
-       'purge' => array( // purging pages
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Same as above but for non-standard thumbnails
+       'renderfile-nonstandard' => array(
+               'ip' => array( 70, 30 ),
+               'user' => array( 70, 30 ),
+       ),
+       // Stashing edits into cache before save
+       'stashedit' => array(
+               'ip' => array( 30, 60 ),
+               'newbie' => array( 30, 60 ),
+       ),
+       // Adding or removing change tags
+       'changetag' => array(
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
 );
 
@@ -5495,7 +5513,7 @@ $wgTrxProfilerLimits = array(
        'JobRunner' => array(
                'readQueryTime' => 30,
                'writeQueryTime' => 5,
-               'maxAffected' => 500
+               'maxAffected' => 1000
        ),
        // Command-line scripts
        'Maintenance' => array(
@@ -6169,6 +6187,12 @@ $wgRCEngines = array(
        'udp' => 'UDPRCFeedEngine',
 );
 
+/**
+ * Treat category membership changes as a RecentChange
+ * @since 1.27
+ */
+$wgRCWatchCategoryMembership = false;
+
 /**
  * Use RC Patrolling to check for vandalism
  */
@@ -6718,6 +6742,7 @@ $wgJobClasses = array(
        'ThumbnailRender' => 'ThumbnailRenderJob',
        'recentChangesUpdate' => 'RecentChangesUpdateJob',
        'refreshLinksPrioritized' => 'RefreshLinksJob', // for cascading protection
+       'refreshLinksDynamic' => 'RefreshLinksJob', // for pages with dynamic content
        'activityUpdateJob' => 'ActivityUpdateJob',
        'enqueue' => 'EnqueueJob', // local queue for multi-DC setups
        'null' => 'NullJob'
@@ -7332,12 +7357,6 @@ $wgUseAjax = true;
  */
 $wgAjaxExportList = array();
 
-/**
- * Enable watching/unwatching pages using AJAX.
- * Requires $wgUseAjax to be true too.
- */
-$wgAjaxWatch = true;
-
 /**
  * Enable AJAX check for file overwrite, pre-upload
  */
index 23a7de4..2bddc3e 100644 (file)
@@ -537,6 +537,20 @@ class EditPage {
                        return;
                }
 
+               $revision = $this->mArticle->getRevisionFetched();
+               // Disallow editing revisions with content models different from the current one
+               if ( $revision && $revision->getContentModel() !== $this->contentModel ) {
+                       $this->displayViewSourcePage(
+                               $this->getContentObject(),
+                               wfMessage(
+                                       'contentmodelediterror',
+                                       $revision->getContentModel(),
+                                       $this->contentModel
+                               )->plain()
+                       );
+                       return;
+               }
+
                $this->isConflict = false;
                // css / js subpages of user pages get a special treatment
                $this->isCssJsSubpage = $this->mTitle->isCssJsSubpage();
@@ -647,6 +661,20 @@ class EditPage {
                        throw new PermissionsError( $action, $permErrors );
                }
 
+               $this->displayViewSourcePage(
+                       $content,
+                       $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' )
+               );
+       }
+
+       /**
+        * Display a read-only View Source page
+        * @param Content $content content object
+        * @param string $errorMessage additional wikitext error message to display
+        */
+       protected function displayViewSourcePage( Content $content, $errorMessage = '' ) {
+               global $wgOut;
+
                Hooks::run( 'EditPage::showReadOnlyForm:initial', array( $this, &$wgOut ) );
 
                $wgOut->setRobotPolicy( 'noindex,nofollow' );
@@ -658,8 +686,10 @@ class EditPage {
                $wgOut->addHTML( $this->editFormPageTop );
                $wgOut->addHTML( $this->editFormTextTop );
 
-               $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' ) );
-               $wgOut->addHTML( "<hr />\n" );
+               if ( $errorMessage !== '' ) {
+                       $wgOut->addWikiText( $errorMessage );
+                       $wgOut->addHTML( "<hr />\n" );
+               }
 
                # If the user made changes, preserve them when showing the markup
                # (This happens when a user is blocked during edit, for instance)
@@ -667,7 +697,13 @@ class EditPage {
                        $text = $this->textbox1;
                        $wgOut->addWikiMsg( 'viewyourtext' );
                } else {
-                       $text = $this->toEditText( $content );
+                       try {
+                               $text = $this->toEditText( $content );
+                       } catch ( MWException $e ) {
+                               # Serialize using the default format if the content model is not supported
+                               # (e.g. for an old revision with a different model)
+                               $text = $content->serialize();
+                       }
                        $wgOut->addWikiMsg( 'viewsourcetext' );
                }
 
@@ -2005,7 +2041,7 @@ class EditPage {
        }
 
        /**
-        * @param Title $title
+        * @param User $user
         * @param string $oldModel
         * @param string $newModel
         * @param string $reason
@@ -2023,26 +2059,26 @@ class EditPage {
                $log->publish( $logid );
        }
 
-
        /**
         * Register the change of watch status
         */
        protected function updateWatchlist() {
                global $wgUser;
 
-               if ( $wgUser->isLoggedIn()
-                       && $this->watchthis != $wgUser->isWatched( $this->mTitle, WatchedItem::IGNORE_USER_RIGHTS )
-               ) {
-                       $fname = __METHOD__;
-                       $title = $this->mTitle;
-                       $watch = $this->watchthis;
-
-                       // Do this in its own transaction to reduce contention...
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->onTransactionIdle( function () use ( $dbw, $title, $watch, $wgUser, $fname ) {
-                               WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
-                       } );
+               if ( !$wgUser->isLoggedIn() ) {
+                       return;
                }
+
+               $user = $wgUser;
+               $title = $this->mTitle;
+               $watch = $this->watchthis;
+               // Do this in its own transaction to reduce contention...
+               DeferredUpdates::addCallableUpdate( function () use ( $user, $title, $watch ) {
+                       if ( $watch == $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) ) {
+                               return; // nothing to change
+                       }
+                       WatchAction::doWatchOrUnwatch( $watch, $title, $user );
+               } );
        }
 
        /**
@@ -2188,6 +2224,8 @@ class EditPage {
                }
 
                # Use the title defined by DISPLAYTITLE magic word when present
+               # NOTE: getDisplayTitle() returns HTML while getPrefixedText() returns plain text.
+               #       setPageTitle() treats the input as wikitext, which should be safe in either case.
                $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
                if ( $displayTitle === false ) {
                        $displayTitle = $contextTitle->getPrefixedText();
index 5e7f5b2..8b41ad4 100644 (file)
@@ -190,6 +190,7 @@ class FileDeleteForm {
                        $page = WikiPage::factory( $title );
                        $dbw = wfGetDB( DB_MASTER );
                        try {
+                               $dbw->startAtomic( __METHOD__ );
                                // delete the associated article first
                                $error = '';
                                $deleteStatus = $page->doDeleteArticleReal( $reason, $suppress, 0, false, $error, $user );
@@ -198,11 +199,15 @@ class FileDeleteForm {
                                if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress, $user );
                                        if ( $status->isOK() ) {
-                                               $dbw->commit( __METHOD__ );
                                                $status->value = $deleteStatus->value; // log id
+                                               $dbw->endAtomic( __METHOD__ );
                                        } else {
+                                               // Page deleted but file still there? rollback page delete
                                                $dbw->rollback( __METHOD__ );
                                        }
+                               } else {
+                                       // Done; nothing changed
+                                       $dbw->endAtomic( __METHOD__ );
                                }
                        } catch ( Exception $e ) {
                                // Rollback before returning to prevent UI from displaying
index 243df92..3bc3a90 100644 (file)
@@ -1355,24 +1355,14 @@ function wfReadOnlyReason() {
                return $readOnly;
        }
 
-       static $autoReadOnly = null;
-       if ( $autoReadOnly === null ) {
+       static $lbReadOnly = null;
+       if ( $lbReadOnly === null ) {
                // Callers use this method to be aware that data presented to a user
                // may be very stale and thus allowing submissions can be problematic.
-               try {
-                       if ( wfGetLB()->getLaggedSlaveMode() ) {
-                               $autoReadOnly = 'The database has been automatically locked ' .
-                                       'while the slave database servers catch up to the master';
-                       } else {
-                               $autoReadOnly = false;
-                       }
-               } catch ( DBConnectionError $e ) {
-                       $autoReadOnly = 'The database has been automatically locked ' .
-                               'until the slave database servers become available';
-               }
+               $lbReadOnly = wfGetLB()->getReadOnlyReason();
        }
 
-       return $autoReadOnly;
+       return $lbReadOnly;
 }
 
 /**
@@ -1985,8 +1975,11 @@ function wfGetAllCallers( $limit = 3 ) {
  * @return string
  */
 function wfFormatStackFrame( $frame ) {
-       return isset( $frame['class'] ) ?
-               $frame['class'] . '::' . $frame['function'] :
+       if ( !isset( $frame['function'] ) ) {
+               return 'NO_FUNCTION_GIVEN';
+       }
+       return isset( $frame['class'] ) && isset( $frame['type'] ) ?
+               $frame['class'] . $frame['type'] . $frame['function'] :
                $frame['function'];
 }
 
@@ -2856,16 +2849,17 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
        $status = false;
        $logMsg = false;
 
-       // According to the documentation, it is possible for stream_select()
-       // to fail due to EINTR. I haven't managed to induce this in testing
-       // despite sending various signals. If it did happen, the error
-       // message would take the form:
-       //
-       // stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
-       //
-       // where [4] is the value of the macro EINTR and "Interrupted system
-       // call" is string which according to the Linux manual is "possibly"
-       // localised according to LC_MESSAGES.
+       /* According to the documentation, it is possible for stream_select()
+        * to fail due to EINTR. I haven't managed to induce this in testing
+        * despite sending various signals. If it did happen, the error
+        * message would take the form:
+        *
+        * stream_select(): unable to select [4]: Interrupted system call (max_fd=5)
+        *
+        * where [4] is the value of the macro EINTR and "Interrupted system
+        * call" is string which according to the Linux manual is "possibly"
+        * localised according to LC_MESSAGES.
+        */
        $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4;
        $eintrMessage = "stream_select(): unable to select [$eintr]";
 
@@ -3342,97 +3336,7 @@ function wfRelativePath( $path, $from ) {
 function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
        $lowercase = true, $engine = 'auto'
 ) {
-       $input = (string)$input;
-       if (
-               $sourceBase < 2 ||
-               $sourceBase > 36 ||
-               $destBase < 2 ||
-               $destBase > 36 ||
-               $sourceBase != (int)$sourceBase ||
-               $destBase != (int)$destBase ||
-               $pad != (int)$pad ||
-               !preg_match(
-                       "/^[" . substr( '0123456789abcdefghijklmnopqrstuvwxyz', 0, $sourceBase ) . "]+$/i",
-                       $input
-               )
-       ) {
-               return false;
-       }
-
-       static $baseChars = array(
-               10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f',
-               16 => 'g', 17 => 'h', 18 => 'i', 19 => 'j', 20 => 'k', 21 => 'l',
-               22 => 'm', 23 => 'n', 24 => 'o', 25 => 'p', 26 => 'q', 27 => 'r',
-               28 => 's', 29 => 't', 30 => 'u', 31 => 'v', 32 => 'w', 33 => 'x',
-               34 => 'y', 35 => 'z',
-
-               '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,
-               '6' => 6, '7' => 7, '8' => 8, '9' => 9, 'a' => 10, 'b' => 11,
-               'c' => 12, 'd' => 13, 'e' => 14, 'f' => 15, 'g' => 16, 'h' => 17,
-               'i' => 18, 'j' => 19, 'k' => 20, 'l' => 21, 'm' => 22, 'n' => 23,
-               'o' => 24, 'p' => 25, 'q' => 26, 'r' => 27, 's' => 28, 't' => 29,
-               'u' => 30, 'v' => 31, 'w' => 32, 'x' => 33, 'y' => 34, 'z' => 35
-       );
-
-       if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
-               // Removing leading zeros works around broken base detection code in
-               // some PHP versions (see <https://bugs.php.net/bug.php?id=50175> and
-               // <https://bugs.php.net/bug.php?id=55398>).
-               $result = gmp_strval( gmp_init( ltrim( $input, '0' ) ?: '0', $sourceBase ), $destBase );
-       } elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
-               $decimal = '0';
-               foreach ( str_split( strtolower( $input ) ) as $char ) {
-                       $decimal = bcmul( $decimal, $sourceBase );
-                       $decimal = bcadd( $decimal, $baseChars[$char] );
-               }
-
-               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
-               for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
-                       $result .= $baseChars[bcmod( $decimal, $destBase )];
-               }
-               // @codingStandardsIgnoreEnd
-
-               $result = strrev( $result );
-       } else {
-               $inDigits = array();
-               foreach ( str_split( strtolower( $input ) ) as $char ) {
-                       $inDigits[] = $baseChars[$char];
-               }
-
-               // Iterate over the input, modulo-ing out an output digit
-               // at a time until input is gone.
-               $result = '';
-               while ( $inDigits ) {
-                       $work = 0;
-                       $workDigits = array();
-
-                       // Long division...
-                       foreach ( $inDigits as $digit ) {
-                               $work *= $sourceBase;
-                               $work += $digit;
-
-                               if ( $workDigits || $work >= $destBase ) {
-                                       $workDigits[] = (int)( $work / $destBase );
-                               }
-                               $work %= $destBase;
-                       }
-
-                       // All that division leaves us with a remainder,
-                       // which is conveniently our next output digit.
-                       $result .= $baseChars[$work];
-
-                       // And we continue!
-                       $inDigits = $workDigits;
-               }
-
-               $result = strrev( $result );
-       }
-
-       if ( !$lowercase ) {
-               $result = strtoupper( $result );
-       }
-
-       return str_pad( $result, $pad, '0', STR_PAD_LEFT );
+       return Wikimedia\base_convert( $input, $sourceBase, $destBase, $pad, $lowercase, $engine );
 }
 
 /**
@@ -3554,11 +3458,10 @@ function wfGetPrecompiledData( $name ) {
  * @return string
  */
 function wfMemcKey( /*...*/ ) {
-       global $wgCachePrefix;
-       $prefix = $wgCachePrefix === false ? wfWikiID() : $wgCachePrefix;
-       $args = func_get_args();
-       $key = $prefix . ':' . implode( ':', $args );
-       return strtr( $key, ' ', '_' );
+       return call_user_func_array(
+               array( ObjectCache::getLocalClusterInstance(), 'makeKey' ),
+               func_get_args()
+       );
 }
 
 /**
@@ -3573,13 +3476,11 @@ function wfMemcKey( /*...*/ ) {
  */
 function wfForeignMemcKey( $db, $prefix /*...*/ ) {
        $args = array_slice( func_get_args(), 2 );
-       if ( $prefix ) {
-               // Match wfWikiID() logic
-               $key = "$db-$prefix:" . implode( ':', $args );
-       } else {
-               $key = $db . ':' . implode( ':', $args );
-       }
-       return strtr( $key, ' ', '_' );
+       $keyspace = $prefix ? "$db-$prefix" : $db;
+       return call_user_func_array(
+               array( ObjectCache::getLocalClusterInstance(), 'makeKeyInternal' ),
+               array( $keyspace, $args )
+       );
 }
 
 /**
@@ -3594,9 +3495,10 @@ function wfForeignMemcKey( $db, $prefix /*...*/ ) {
  * @return string
  */
 function wfGlobalCacheKey( /*...*/ ) {
-       $args = func_get_args();
-       $key = 'global:' . implode( ':', $args );
-       return strtr( $key, ' ', '_' );
+       return call_user_func_array(
+               array( ObjectCache::getLocalClusterInstance(), 'makeGlobalKey' ),
+               func_get_args()
+       );
 }
 
 /**
@@ -3737,16 +3639,16 @@ function wfScript( $script = 'index' ) {
  */
 function wfGetScriptUrl() {
        if ( isset( $_SERVER['SCRIPT_NAME'] ) ) {
-               #
-               # as it was called, minus the query string.
-               #
-               # Some sites use Apache rewrite rules to handle subdomains,
-               # and have PHP set up in a weird way that causes PHP_SELF
-               # to contain the rewritten URL instead of the one that the
-               # outside world sees.
-               #
-               # If in this mode, use SCRIPT_URL instead, which mod_rewrite
-               # provides containing the "before" URL.
+               /* as it was called, minus the query string.
+                *
+                * Some sites use Apache rewrite rules to handle subdomains,
+                * and have PHP set up in a weird way that causes PHP_SELF
+                * to contain the rewritten URL instead of the one that the
+                * outside world sees.
+                *
+                * If in this mode, use SCRIPT_URL instead, which mod_rewrite
+                * provides containing the "before" URL.
+                */
                return $_SERVER['SCRIPT_NAME'];
        } else {
                return $_SERVER['URL'];
@@ -3936,12 +3838,13 @@ function wfTransactionalTimeLimit() {
  * Converts shorthand byte notation to integer form
  *
  * @param string $string
+ * @param int $default Returned if $string is empty
  * @return int
  */
-function wfShorthandToInteger( $string = '' ) {
+function wfShorthandToInteger( $string = '', $default = -1 ) {
        $string = trim( $string );
        if ( $string === '' ) {
-               return -1;
+               return $default;
        }
        $last = $string[strlen( $string ) - 1];
        $val = intval( $string );
@@ -4107,7 +4010,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                return $bad;
        }
 
-       $cache = ObjectCache::newAccelerator( 'hash' );
+       $cache = ObjectCache::getLocalServerInstance( 'hash' );
        $key = wfMemcKey( 'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist ) );
        $badImages = $cache->get( $key );
 
index a414562..980d350 100644 (file)
@@ -232,8 +232,11 @@ class Hooks {
 
        /**
         * Handle PHP errors issued inside a hook. Catch errors that have to do
-        * with a function expecting a reference, and pass all others through to
-        * MWExceptionHandler::handleError() for default processing.
+        * with a function expecting a reference, missing arguments, or wrong argument
+        * types. Pass all others through to to the default error handler.
+        *
+        * This is useful for throwing errors for major callback invocation errors
+        * (with regard to parameter signature) which PHP just gives warnings for.
         *
         * @since 1.18
         *
@@ -243,13 +246,14 @@ class Hooks {
         * @return bool
         */
        public static function hookErrorHandler( $errno, $errstr ) {
-               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false ) {
+               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false
+                       || strpos( $errstr, 'Missing argument ' ) !== false
+                       || strpos( $errstr, ' expects parameter ' ) !== false
+               ) {
                        throw new MWHookException( $errstr, $errno );
                }
 
-               // Delegate unhandled errors to the default MW handler
-               return call_user_func_array(
-                       'MWExceptionHandler::handleError', func_get_args()
-               );
+               // Delegate unhandled errors to the default handlers
+               return false;
        }
 }
index c61dca8..b7958dd 100644 (file)
@@ -597,7 +597,6 @@ class Html {
                                // we may as well not call htmlspecialchars().
                                // @todo FIXME: Verify that we actually need to
                                // escape \n\r\t here, and explain why, exactly.
-                               #
                                // We could call Sanitizer::encodeAttribute() for this, but we
                                // don't because we're stubborn and like our marginal savings on
                                // byte size from not having to encode unnecessary quotes.
@@ -745,10 +744,10 @@ class Html {
        }
 
        /**
-        * Convenience function to produce a checkbox (input element with type=checkbox)
+        * Convenience function to produce a radio button (input element with type=radio)
         *
         * @param string $name Name attribute
-        * @param bool $checked Whether the checkbox is checked or not
+        * @param bool $checked Whether the radio button is checked or not
         * @param array $attribs Array of additional attributes
         * @return string Raw HTML
         */
index 83db268..2d81b28 100644 (file)
@@ -74,10 +74,8 @@ class HtmlFormatter {
                        }
 
                        // Workaround for bug that caused spaces before references
-                       // to disappear during processing:
-                       // https://phabricator.wikimedia.org/T55086
-                       //
-                       // Please replace with a better fix if one can be found.
+                       // to disappear during processing: https://phabricator.wikimedia.org/T55086
+                       // TODO: Please replace with a better fix if one can be found.
                        $html = str_replace( ' <', '&#32;<', $html );
 
                        libxml_use_internal_errors( true );
@@ -295,7 +293,6 @@ class HtmlFormatter {
                        $html = $this->fixLibXml( $html );
                        if ( wfIsWindows() ) {
                                // Cleanup for CRLF misprocessing of unknown origin on Windows.
-                               //
                                // If this error continues in the future, please track it down in the
                                // XML code paths if possible and fix there.
                                $html = str_replace( '&#13;', '', $html );
index 33ab4ea..3d94c33 100644 (file)
@@ -515,6 +515,7 @@ class WikiImporter {
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
                        case XMLReader::TEXT:
+                       case XMLReader::CDATA:
                        case XMLReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->reader->value;
                                break;
index 2e33bd1..b5e7e2f 100644 (file)
@@ -623,7 +623,6 @@ class Linker {
                        # Create a thumbnail. Alignment depends on the writing direction of
                        # the page content language (right-aligned for LTR languages,
                        # left-aligned for RTL languages)
-                       #
                        # If a thumbnail width has not been provided, it is set
                        # to the default user option as specified in Language*.php
                        if ( $fp['align'] == '' ) {
@@ -1465,17 +1464,19 @@ class Linker {
                                        $linkText = $text;
                                        $linkTarget = Linker::normalizeSubpageLink( $title, $match[1], $linkText );
 
-                                       $target = Title::newFromText( $linkTarget );
-                                       if ( $target ) {
-                                               if ( $target->getText() == '' && !$target->isExternal()
-                                                       && !$local && $title
-                                               ) {
-                                                       $newTarget = clone ( $title );
-                                                       $newTarget->setFragment( '#' . $target->getFragment() );
-                                                       $target = $newTarget;
-                                               }
+                                       if ( $linkTarget !== null ) {
+                                               $target = Title::newFromText( $linkTarget );
+                                               if ( $target ) {
+                                                       if ( $target->getText() == '' && !$target->isExternal()
+                                                               && !$local && $title
+                                                       ) {
+                                                               $newTarget = clone $title;
+                                                               $newTarget->setFragment( '#' . $target->getFragment() );
+                                                               $target = $newTarget;
+                                                       }
 
-                                               $thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
+                                                       $thelink = Linker::makeCommentLink( $target, $linkText . $inside, $wikiId ) . $trail;
+                                               }
                                        }
                                }
                                if ( $thelink ) {
index 2c7ba91..80e60d2 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Parser
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * This class encapsulates "magic words" such as "#redirect", __NOTOC__, etc.
  *
@@ -951,13 +953,28 @@ class MagicWordArray {
                                continue;
                        }
                        $matches = array();
-                       if ( preg_match_all( $regex, $text, $matches, PREG_SET_ORDER ) ) {
+                       $res = preg_match_all( $regex, $text, $matches, PREG_SET_ORDER );
+                       if ( $res === false ) {
+                               LoggerFactory::getInstance( 'parser' )->warning( 'preg_match_all returned false', array(
+                                       'code' => preg_last_error(),
+                                       'regex' => $regex,
+                                       'text' => $text,
+                               ) );
+                       } elseif ( $res ) {
                                foreach ( $matches as $m ) {
                                        list( $name, $param ) = $this->parseMatch( $m );
                                        $found[$name] = $param;
                                }
                        }
-                       $text = preg_replace( $regex, '', $text );
+                       $res = preg_replace( $regex, '', $text );
+                       if ( $res === null ) {
+                               LoggerFactory::getInstance( 'parser' )->warning( 'preg_replace returned null', array(
+                                       'code' => preg_last_error(),
+                                       'regex' => $regex,
+                                       'text' => $text,
+                               ) );
+                       }
+                       $text = $res;
                }
                return $found;
        }
index aee6ee1..676108c 100644 (file)
@@ -203,10 +203,9 @@ class MediaWiki {
                        // curid and oldid request  parameters would allow page titles to be enumerated even
                        // when they are not guessable. So we reset the title to Special:Badtitle before the
                        // permissions error is displayed.
-                       //
+
                        // The skin mostly uses $this->context->getTitle() these days, but some extensions
                        // still use $wgTitle.
-
                        $badTitle = SpecialPage::getTitleFor( 'Badtitle' );
                        $this->context->setTitle( $badTitle );
                        $wgTitle = $badTitle;
@@ -516,6 +515,7 @@ class MediaWiki {
                if ( $factory->laggedSlaveUsed() ) {
                        $maxAge = $this->config->get( 'CdnMaxageLagged' );
                        $this->context->getOutput()->lowerCdnMaxage( $maxAge );
+                       $request->response()->header( "X-Database-Lagged: true" );
                        wfDebugLog( 'replication', "Lagged DB used; CDN cache TTL limited to $maxAge seconds" );
                }
        }
@@ -628,7 +628,7 @@ class MediaWiki {
                                        // redirecting to HTTPS. It's likely such a request is going
                                        // to fail due to post data being lost, but let's try anyway
                                        // and just log the instance.
-                                       //
+
                                        // @todo FIXME: See if we could issue a 307 or 308 here, need
                                        // to see how clients (automated & browser) behave when we do
                                        wfDebugLog( 'RedirectedPosts', "Redirected from HTTP to HTTPS: $oldUrl" );
@@ -690,7 +690,7 @@ class MediaWiki {
                Profiler::instance()->getTransactionProfiler()->resetExpectations();
 
                // Do any deferred jobs
-               DeferredUpdates::doUpdates( 'commit', 'enqueue' );
+               DeferredUpdates::doUpdates( 'enqueue' );
 
                // Make sure any lazy jobs are pushed
                JobQueueGroup::pushLazyJobs();
index 2cd9698..736cd8d 100644 (file)
@@ -247,7 +247,7 @@ class MovePage {
                        RepoGroup::singleton()->clearCache( $this->newTitle ); # clear false negative cache
                }
 
-               $dbw->begin( __METHOD__ ); # If $file was a LocalFile, its transaction would have closed our own.
+               $dbw->startAtomic( __METHOD__ );
                $pageid = $this->oldTitle->getArticleID( Title::GAID_FOR_UPDATE );
                $protected = $this->oldTitle->isProtected();
 
@@ -369,12 +369,13 @@ class MovePage {
                        WatchedItem::duplicateEntries( $this->oldTitle, $this->newTitle );
                }
 
-               $dbw->commit( __METHOD__ );
+               $dbw->endAtomic( __METHOD__ );
+
+               $params = array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason );
+               $dbw->onTransactionIdle( function () use ( $params ) {
+                       Hooks::run( 'TitleMoveComplete', $params );
+               } );
 
-               Hooks::run(
-                       'TitleMoveComplete',
-                       array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason )
-               );
                return Status::newGood();
        }
 
index 4f99f34..81724c5 100644 (file)
@@ -50,7 +50,7 @@ class OutputPage extends ContextSource {
 
        /**
         * @var array Additional stylesheets. Looks like this is for extensions.
-        *   Might be replaced by resource loader.
+        *   Might be replaced by ResourceLoader.
         */
        protected $mExtStyles = array();
 
@@ -132,7 +132,7 @@ class OutputPage extends ContextSource {
        private $mLanguageLinks = array();
 
        /**
-        * Used for JavaScript (pre resource loader)
+        * Used for JavaScript (predates ResourceLoader)
         * @todo We should split JS / CSS.
         * mScripts content is inserted as is in "<head>" by Skin. This might
         * contain either a link to a stylesheet or inline CSS.
@@ -151,8 +151,6 @@ class OutputPage extends ContextSource {
        /** @var array Array of elements in "<head>". Parser might add its own headers! */
        protected $mHeadItems = array();
 
-       // @todo FIXME: Next 5 variables probably come from the resource loader
-
        /** @var array */
        protected $mModules = array();
 
@@ -224,7 +222,7 @@ class OutputPage extends ContextSource {
        /**
         * @var bool Comes from the parser. This was probably made to load CSS/JS
         * only if we had "<gallery>". Used directly in CategoryPage.php.
-        * Looks like resource loader can replace this.
+        * Looks like ResourceLoader can replace this.
         */
        public $mNoGallery = false;
 
@@ -458,6 +456,8 @@ class OutputPage extends ContextSource {
 
        /**
         * Add raw HTML to the list of scripts (including \<script\> tag, etc.)
+        * Internal use only. Use OutputPage::addModules() or OutputPage::addJsConfigVars()
+        * if possible.
         *
         * @param string $script Raw HTML
         */
@@ -468,26 +468,31 @@ class OutputPage extends ContextSource {
        /**
         * Register and add a stylesheet from an extension directory.
         *
+        * @deprecated since 1.27 use addModuleStyles() or addStyle() instead
         * @param string $url Path to sheet.  Provide either a full url (beginning
         *             with 'http', etc) or a relative path from the document root
         *             (beginning with '/').  Otherwise it behaves identically to
         *             addStyle() and draws from the /skins folder.
         */
        public function addExtensionStyle( $url ) {
+               wfDeprecated( __METHOD__, '1.27' );
                array_push( $this->mExtStyles, $url );
        }
 
        /**
         * Get all styles added by extensions
         *
+        * @deprecated since 1.27
         * @return array
         */
        function getExtStyle() {
+               wfDeprecated( __METHOD__, '1.27' );
                return $this->mExtStyles;
        }
 
        /**
         * Add a JavaScript file out of skins/common, or a given relative path.
+        * Internal use only. Use OutputPage::addModules() if possible.
         *
         * @param string $file Filename in skins/common or complete on-server path
         *              (/foo/bar.js)
@@ -508,6 +513,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Add a self-contained script tag with the given contents
+        * Internal use only. Use OutputPage::addModules() if possible.
         *
         * @param string $script JavaScript text, no "<script>" tags
         */
@@ -568,8 +574,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add one or more modules recognized by the resource loader. Modules added
-        * through this function will be loaded by the resource loader when the
+        * Add one or more modules recognized by ResourceLoader. Modules added
+        * through this function will be loaded by ResourceLoader when the
         * page loads.
         *
         * @param string|array $modules Module name (string) or array of module names
@@ -591,8 +597,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add only JS of one or more modules recognized by the resource loader. Module
-        * scripts added through this function will be loaded by the resource loader when
+        * Add only JS of one or more modules recognized by ResourceLoader. Module
+        * scripts added through this function will be loaded by ResourceLoader when
         * the page loads.
         *
         * @param string|array $modules Module name (string) or array of module names
@@ -610,25 +616,11 @@ class OutputPage extends ContextSource {
         * @return array Array of module names
         */
        public function getModuleStyles( $filter = false, $position = null ) {
-               // T97420
-               $resourceLoader = $this->getResourceLoader();
-
-               foreach ( $this->mModuleStyles as $val ) {
-                       $module = $resourceLoader->getModule( $val );
-
-                       if ( $module instanceof ResourceLoaderModule && $module->isPositionDefault() ) {
-                               $warning = __METHOD__ . ': style module should define its position explicitly: ' .
-                                       $val . ' ' . get_class( $module );
-                               wfDebugLog( 'resourceloader', $warning );
-                               wfLogWarning( $warning );
-                       }
-               }
-
                return $this->getModules( $filter, $position, 'mModuleStyles' );
        }
 
        /**
-        * Add only CSS of one or more modules recognized by the resource loader.
+        * Add only CSS of one or more modules recognized by ResourceLoader.
         *
         * Module styles added through this function will be added using standard link CSS
         * tags, rather than as a combined Javascript and CSS package. Thus, they will
@@ -707,6 +699,12 @@ class OutputPage extends ContextSource {
        /**
         * Add or replace an header item to the output
         *
+        * Whenever possible, use more specific options like ResourceLoader modules,
+        * OutputPage::addLink(), OutputPage::addMetaLink() and OutputPage::addFeedLink()
+        * Fallback options for those are: OutputPage::addStyle, OutputPage::addScript(),
+        * OutputPage::addInlineScript() and OutputPage::addInlineStyle()
+        * This would be your very LAST fallback.
+        *
         * @param string $name Item name
         * @param string $value Raw HTML
         */
@@ -1041,6 +1039,7 @@ class OutputPage extends ContextSource {
         * @param string|Message $str String or Message to add to the subtitle
         */
        public function appendSubtitle( $str ) {
+               wfDeprecated( __METHOD__, '1.19' );
                $this->addSubtitle( $str );
        }
 
@@ -1764,6 +1763,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         */
        public function addParserOutputNoText( $parserOutput ) {
+               wfDeprecated( __METHOD__, '1.24' );
                $this->addParserOutputMetadata( $parserOutput );
        }
 
@@ -2344,6 +2344,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.18
         */
        function blockedPage() {
+               wfDeprecated( __METHOD__, '1.18' );
                throw new UserBlockedError( $this->getUser()->mBlock );
        }
 
@@ -2495,6 +2496,7 @@ class OutputPage extends ContextSource {
         * @throws PermissionsError
         */
        public function permissionRequired( $permission ) {
+               wfDeprecated( __METHOD__, '1.18' );
                throw new PermissionsError( $permission );
        }
 
@@ -2504,6 +2506,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.19; throw the exception directly
         */
        public function loginToUse() {
+               wfDeprecated( __METHOD__, '1.19' );
                throw new PermissionsError( 'read' );
        }
 
@@ -3074,10 +3077,6 @@ class OutputPage extends ContextSource {
                        ResourceLoaderModule::TYPE_SCRIPTS
                );
 
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleStyles( true, 'bottom' ),
-                       ResourceLoaderModule::TYPE_STYLES
-               );
-
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the bottom
                $modules = $this->getModules( true, 'bottom' );
@@ -3143,9 +3142,6 @@ class OutputPage extends ContextSource {
         * @return string
         */
        function getBottomScripts() {
-               // In case the skin wants to add bottom CSS
-               $this->getSkin()->setupSkinUserCss( $this );
-
                return $this->getScriptsForBottomQueue();
        }
 
@@ -3624,7 +3620,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Add a local or specified stylesheet, with the given media options.
-        * Meant primarily for internal use...
+        * Internal use only. Use OutputPage::addModuleStyles() if possible.
         *
         * @param string $style URL to the file
         * @param string $media To specify a media type, 'screen', 'printable', 'handheld' or any.
@@ -3649,6 +3645,8 @@ class OutputPage extends ContextSource {
 
        /**
         * Adds inline CSS styles
+        * Internal use only. Use OutputPage::addModuleStyles() if possible.
+        *
         * @param mixed $style_css Inline CSS
         * @param string $flip Set to 'flip' to flip the CSS if needed
         */
@@ -3684,7 +3682,7 @@ class OutputPage extends ContextSource {
                $otherTags = array(); // Tags to append after the normal <link> tags
                $resourceLoader = $this->getResourceLoader();
 
-               $moduleStyles = $this->getModuleStyles( true, 'top' );
+               $moduleStyles = $this->getModuleStyles();
 
                // Per-site custom styles
                $moduleStyles[] = 'site';
@@ -3856,18 +3854,19 @@ class OutputPage extends ContextSource {
                                if ( $media == $targetMedia ) {
                                        $media = '';
                                } elseif ( preg_match( $screenMediaQueryRegex, $media ) === 1 ) {
-                                       // This regex will not attempt to understand a comma-separated media_query_list
-                                       //
-                                       // Example supported values for $media:
-                                       // 'screen', 'only screen', 'screen and (min-width: 982px)' ),
-                                       // Example NOT supported value for $media:
-                                       // '3d-glasses, screen, print and resolution > 90dpi'
-                                       //
-                                       // If it's a print request, we never want any kind of screen stylesheets
-                                       // If it's a handheld request (currently the only other choice with a switch),
-                                       // we don't want simple 'screen' but we might want screen queries that
-                                       // have a max-width or something, so we'll pass all others on and let the
-                                       // client do the query.
+                                       /* This regex will not attempt to understand a comma-separated media_query_list
+                                        *
+                                        * Example supported values for $media:
+                                        * 'screen', 'only screen', 'screen and (min-width: 982px)' ),
+                                        * Example NOT supported value for $media:
+                                        * '3d-glasses, screen, print and resolution > 90dpi'
+                                        *
+                                        * If it's a print request, we never want any kind of screen stylesheets
+                                        * If it's a handheld request (currently the only other choice with a switch),
+                                        * we don't want simple 'screen' but we might want screen queries that
+                                        * have a max-width or something, so we'll pass all others on and let the
+                                        * client do the query.
+                                        */
                                        if ( $targetMedia == 'print' || $media == 'screen' ) {
                                                return null;
                                        }
@@ -3962,6 +3961,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.17
         */
        public function includeJQuery( array $modules = array() ) {
+               wfDeprecated( __METHOD__, '1.17' );
                return array();
        }
 
index 233ebf2..333d040 100644 (file)
@@ -180,7 +180,7 @@ HTML;
  * @param string $mwVersion See wfGenericError
  */
 function wfMissingVendorError( $type, $mwVersion ) {
-       $shortText = "Installing some external dependencies (e.g. via composer) is also required.";
+       $shortText = "Installing some external dependencies (e.g. via composer) is required.";
 
        $longText = "Error: You are missing some external dependencies. \n"
                . "MediaWiki now also has some external dependencies that need to be installed\n"
index b3ee207..0f8dcc3 100644 (file)
@@ -892,6 +892,14 @@ class Preferences {
                        'section' => 'rc/advancedrc',
                );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $defaultPreferences['hidecategorization'] = array(
+                               'type' => 'toggle',
+                               'label-message' => 'tog-hidecategorization',
+                               'section' => 'rc/advancedrc',
+                       );
+               }
+
                if ( $user->useRCPatrol() ) {
                        $defaultPreferences['hidepatrolled'] = array(
                                'type' => 'toggle',
@@ -999,6 +1007,14 @@ class Preferences {
                        'label-message' => 'tog-watchlisthideliu',
                );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $defaultPreferences['watchlisthidecategorization'] = array(
+                               'type' => 'toggle',
+                               'section' => 'watchlist/advancedwatchlist',
+                               'label-message' => 'tog-watchlisthidecategorization',
+                       );
+               }
+
                if ( $user->useRCPatrol() ) {
                        $defaultPreferences['watchlisthidepatrolled'] = array(
                                'type' => 'toggle',
index 430b4b8..f36635b 100644 (file)
@@ -258,12 +258,18 @@ abstract class PrefixSearch {
                return $array;
        }
 
+       /**
+        * Get a redirect's destination from a title
+        * @param Title $title A title to redirect. It may not redirect or even exist
+        * @return null|string If title exists and redirects, get the destination's prefixed name
+        */
        private function getRedirectTarget( $title ) {
                $page = WikiPage::factory( $title );
                if ( !$page->exists() ) {
                        return null;
                }
-               return $page->getRedirectTarget()->getPrefixedText();
+               $redir = $page->getRedirectTarget();
+               return $redir ? $redir->getPrefixedText() : null;
        }
 
        /**
index 24c025f..a498817 100644 (file)
@@ -1530,12 +1530,13 @@ class Revision implements IDBAccessObject {
         */
        protected function loadText() {
                // Caching may be beneficial for massive use of external storage
-               global $wgRevisionCacheExpiry, $wgMemc;
+               global $wgRevisionCacheExpiry;
 
+               $cache = ObjectCache::getMainWANInstance();
                $textId = $this->getTextId();
                $key = wfMemcKey( 'revisiontext', 'textid', $textId );
                if ( $wgRevisionCacheExpiry ) {
-                       $text = $wgMemc->get( $key );
+                       $text = $cache->get( $key );
                        if ( is_string( $text ) ) {
                                wfDebug( __METHOD__ . ": got id $textId from cache\n" );
                                return $text;
@@ -1582,7 +1583,7 @@ class Revision implements IDBAccessObject {
 
                # No negative caching -- negative hits on text rows may be due to corrupted slave servers
                if ( $wgRevisionCacheExpiry && $text !== false ) {
-                       $wgMemc->set( $key, $text, $wgRevisionCacheExpiry );
+                       $cache->set( $key, $text, $wgRevisionCacheExpiry );
                }
 
                return $text;
index f88dd05..a856f1e 100644 (file)
@@ -476,7 +476,8 @@ class Sanitizer {
                                }
 
                                $badtag = false;
-                               if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
+                               $t = strtolower( $t );
+                               if ( isset( $htmlelements[$t] ) ) {
                                        # Check our stack
                                        if ( $slash && isset( $htmlsingleonly[$t] ) ) {
                                                $badtag = true;
@@ -596,7 +597,8 @@ class Sanitizer {
                                        list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
 
                                        $badtag = false;
-                                       if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
+                                       $t = strtolower( $t );
+                                       if ( isset( $htmlelements[$t] ) ) {
                                                if ( is_callable( $processCallback ) ) {
                                                        call_user_func_array( $processCallback, array( &$params, $args ) );
                                                }
index 67c99c9..0b6b018 100644 (file)
@@ -373,6 +373,15 @@ if ( $wgResourceLoaderMaxQueryLength === false ) {
        unset( $suhosinMaxValueLength );
 }
 
+// Ensure the minimum chunk size is less than PHP upload limits or the maximum
+// upload size.
+$wgMinUploadChunkSize = min(
+       $wgMinUploadChunkSize,
+       $wgMaxUploadSize,
+       wfShorthandToInteger( ini_get( 'upload_max_filesize' ), 1e100 ),
+       wfShorthandToInteger( ini_get( 'post_max_size' ), 1e100 ) - 1024 # Leave room for other parameters
+);
+
 /**
  * Definitions of the NS_ constants are in Defines.php
  * @private
@@ -680,7 +689,7 @@ $wgTitle = null;
 Profiler::instance()->scopedProfileOut( $ps_globals );
 $ps_extensions = Profiler::instance()->scopedProfileIn( $fname . '-extensions' );
 
-// Extension setup functions for extensions other than skins
+// Extension setup functions
 // Entries should be added to this variable during the inclusion
 // of the extension file. This allows the extension to perform
 // any necessary initialisation in the fully initialised environment
index 76e7f7e..33bab65 100644 (file)
@@ -180,23 +180,24 @@ class SiteStats {
         * @return int
         */
        static function numberingroup( $group ) {
-               if ( !isset( self::$groupMemberCounts[$group] ) ) {
-                       global $wgMemc;
-                       $key = wfMemcKey( 'SiteStats', 'groupcounts', $group );
-                       $hit = $wgMemc->get( $key );
-                       if ( !$hit ) {
+               $cache = ObjectCache::getMainWANInstance();
+               return $cache->getWithSetCallback(
+                       wfMemcKey( 'SiteStats', 'groupcounts', $group ),
+                       $cache::TTL_HOUR,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
                                $dbr = wfGetDB( DB_SLAVE );
-                               $hit = $dbr->selectField(
+
+                               $setOpts += Database::getCacheSetOptions( $dbr );
+
+                               return $dbr->selectField(
                                        'user_groups',
                                        'COUNT(*)',
                                        array( 'ug_group' => $group ),
                                        __METHOD__
                                );
-                               $wgMemc->set( $key, $hit, 3600 );
-                       }
-                       self::$groupMemberCounts[$group] = $hit;
-               }
-               return self::$groupMemberCounts[$group];
+                       },
+                       array( 'pcTTL' => 10 )
+               );
        }
 
        /**
index 3c62c14..8ce3420 100644 (file)
@@ -41,7 +41,7 @@ class TemplateParser {
         * @param boolean $forceRecompile
         */
        public function __construct( $templateDir = null, $forceRecompile = false ) {
-               $this->templateDir = $templateDir ? $templateDir : __DIR__ . '/templates';
+               $this->templateDir = $templateDir ?: __DIR__ . '/templates';
                $this->forceRecompile = $forceRecompile;
        }
 
@@ -49,7 +49,7 @@ class TemplateParser {
         * Constructs the location of the the source Mustache template
         * @param string $templateName The name of the template
         * @return string
-        * @throws UnexpectedValueException Disallows upwards directory traversal via $templateName
+        * @throws UnexpectedValueException If $templateName attempts upwards directory traversal
         */
        protected function getTemplateFilename( $templateName ) {
                // Prevent upwards directory traversal using same methods as Title::secureAndSplit
@@ -103,10 +103,8 @@ class TemplateParser {
 
                if ( $secretKey ) {
                        // See if the compiled PHP code is stored in cache.
-                       // CACHE_ACCEL throws an exception if no suitable object cache is present, so fall
-                       // back to CACHE_ANYTHING.
-                       $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
-                       $key = wfMemcKey( 'template', $templateName, $fastHash );
+                       $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
+                       $key = $cache->makeKey( 'template', $templateName, $fastHash );
                        $code = $this->forceRecompile ? null : $cache->get( $key );
 
                        if ( !$code ) {
index 8e5fae9..9ada4f3 100644 (file)
@@ -1008,10 +1008,8 @@ class Title {
         */
        public function getNsText() {
                if ( $this->isExternal() ) {
-                       // This probably shouldn't even happen. ohh man, oh yuck.
-                       // But for interwiki transclusion it sometimes does.
-                       // Shit. Shit shit shit.
-                       //
+                       // This probably shouldn't even happen,
+                       // but for interwiki transclusion it sometimes does.
                        // Use the canonical namespaces if possible to try to
                        // resolve a foreign namespace.
                        if ( MWNamespace::exists( $this->mNamespace ) ) {
@@ -1420,6 +1418,7 @@ class Title {
         * Deprecated for public use, use Title::makeTitle() with fragment parameter.
         * Still in active use privately.
         *
+        * @private
         * @param string $fragment Text
         */
        public function setFragment( $fragment ) {
index 5bf6f44..b09e4e4 100644 (file)
@@ -186,21 +186,6 @@ class User implements IDBAccessObject {
        /** @var string */
        public $mRealName;
 
-       /**
-        * These fields were marked "@private", but were defined as public to
-        * maintain compatibility with PHP4 code since PHP4 didn't support access
-        * restrictions. AuthManager makes password handling pluggable, meaning
-        * these fields don't make sense anymore. If this broke something, see
-        * T89459 for the context of the change.
-        * @deprecated These are mostly unused, but kept for now to raise errors on attempted access.
-        */
-       // @{
-       private $mPassword = null;
-       private $mNewpassword;
-       private $mNewpassTime;
-       private $mPasswordExpires;
-       // @}
-
        /** @var string */
        public $mEmail;
        /** @var string TS_MW timestamp from the DB */
@@ -402,6 +387,25 @@ class User implements IDBAccessObject {
                return true;
        }
 
+       /**
+        * @since 1.27
+        * @param string $wikiId
+        * @param integer $userId
+        */
+       public static function purge( $wikiId, $userId ) {
+               $cache = ObjectCache::getMainWANInstance();
+               $cache->delete( $cache->makeGlobalKey( 'user', 'id', $wikiId, $userId ) );
+       }
+
+       /**
+        * @since 1.27
+        * @param WANObjectCache $cache
+        * @return string
+        */
+       protected function getCacheKey( WANObjectCache $cache ) {
+               return $cache->makeGlobalKey( 'user', 'id', wfWikiID(), $this->mId );
+       }
+
        /**
         * Load user data from shared cache, given mId has already been set.
         *
@@ -414,8 +418,8 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               $key = wfMemcKey( 'user', 'id', $this->mId );
-               $data = ObjectCache::getMainWANInstance()->get( $key );
+               $cache = ObjectCache::getMainWANInstance();
+               $data = $cache->get( $this->getCacheKey( $cache ) );
                if ( !is_array( $data ) || $data['mVersion'] < self::VERSION ) {
                        // Object is expired
                        return false;
@@ -451,10 +455,11 @@ class User implements IDBAccessObject {
                        $data[$name] = $this->$name;
                }
                $data['mVersion'] = self::VERSION;
-               $key = wfMemcKey( 'user', 'id', $this->mId );
-
                $opts = Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
-               ObjectCache::getMainWANInstance()->set( $key, $data, 3600, $opts );
+
+               $cache = ObjectCache::getMainWANInstance();
+               $key = $this->getCacheKey( $cache );
+               $cache->set( $key, $data, $cache::TTL_HOUR, $opts );
        }
 
        /** @name newFrom*() static factory methods */
@@ -1752,8 +1757,6 @@ class User implements IDBAccessObject {
                        return false;
                }
 
-               global $wgMemc;
-
                $limits = $wgRateLimits[$action];
                $keys = array();
                $id = $this->getId();
@@ -1808,11 +1811,13 @@ class User implements IDBAccessObject {
                        $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
                }
 
+               $cache = ObjectCache::getLocalClusterInstance();
+
                $triggered = false;
                foreach ( $keys as $key => $limit ) {
                        list( $max, $period ) = $limit;
                        $summary = "(limit $max in {$period}s)";
-                       $count = $wgMemc->get( $key );
+                       $count = $cache->get( $key );
                        // Already pinged?
                        if ( $count ) {
                                if ( $count >= $max ) {
@@ -1825,11 +1830,11 @@ class User implements IDBAccessObject {
                        } else {
                                wfDebug( __METHOD__ . ": adding record for $key $summary\n" );
                                if ( $incrBy > 0 ) {
-                                       $wgMemc->add( $key, 0, intval( $period ) ); // first ping
+                                       $cache->add( $key, 0, intval( $period ) ); // first ping
                                }
                        }
                        if ( $incrBy > 0 ) {
-                               $wgMemc->incr( $key, $incrBy );
+                               $cache->incr( $key, $incrBy );
                        }
                }
 
@@ -2242,17 +2247,17 @@ class User implements IDBAccessObject {
         * @param string $mode Use 'refresh' to clear now; otherwise before DB commit
         */
        public function clearSharedCache( $mode = 'changed' ) {
-               $id = $this->getId();
-               if ( !$id ) {
+               if ( !$this->getId() ) {
                        return;
                }
 
-               $key = wfMemcKey( 'user', 'id', $id );
+               $cache = ObjectCache::getMainWANInstance();
+               $key = $this->getCacheKey( $cache );
                if ( $mode === 'refresh' ) {
-                       ObjectCache::getMainWANInstance()->delete( $key, 1 );
+                       $cache->delete( $key, 1 );
                } else {
-                       wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $key ) {
-                               ObjectCache::getMainWANInstance()->delete( $key );
+                       wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $cache, $key ) {
+                               $cache->delete( $key );
                        } );
                }
        }
@@ -2412,32 +2417,32 @@ class User implements IDBAccessObject {
 
        /**
         * Actually set the password and such
+        * @since 1.27 cannot set a password for a user not in the database
         * @param string|null $str New password to set or null to set an invalid
         *  password hash meaning that the user will not be able to log in
         *  through the web interface.
         */
        private function setPasswordInternal( $str ) {
                $id = self::idFromName( $this->getName() );
-               if ( $id ) {
-                       $passwordFactory = new PasswordFactory();
-                       $passwordFactory->init( RequestContext::getMain()->getConfig() );
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update(
-                               'user',
-                               array(
-                                       'user_password' => $passwordFactory->newFromPlaintext( $str )->toString(),
-                                       'user_newpassword' => PasswordFactory::newInvalidPassword()->toString(),
-                                       'user_newpass_time' => $dbw->timestampOrNull( null ),
-                               ),
-                               array(
-                                       'user_id' => $id,
-                               ),
-                               __METHOD__
-                       );
-                       $this->mPassword = null;
-               } else {
-                       $this->mPassword = $str;
+               if ( $id == 0 ) {
+                       throw new LogicException( 'Cannot set a password for a user that is not in the database.' );
                }
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array(
+                               'user_password' => $passwordFactory->newFromPlaintext( $str )->toString(),
+                               'user_newpassword' => PasswordFactory::newInvalidPassword()->toString(),
+                               'user_newpass_time' => $dbw->timestampOrNull( null ),
+                       ),
+                       array(
+                               'user_id' => $id,
+                       ),
+                       __METHOD__
+               );
        }
 
        /**
@@ -2478,6 +2483,11 @@ class User implements IDBAccessObject {
         * @param bool $throttle If true, reset the throttle timestamp to the present
         */
        public function setNewpassword( $str, $throttle = true ) {
+               $id = $this->getId();
+               if ( $id == 0 ) {
+                       throw new LogicException( 'Cannot set new password for a user that is not in the database.' );
+               }
+
                $dbw = wfGetDB( DB_MASTER );
 
                $passwordFactory = new PasswordFactory();
@@ -3889,11 +3899,6 @@ class User implements IDBAccessObject {
                }
                $this->mId = $dbw->insertId();
 
-               // Set the password now that it's in the DB, if applicable
-               if ( $this->mPassword !== null ) {
-                       $this->setPasswordInternal( $this->mPassword );
-               }
-
                // Clear instance cache other than user table data, which is already accurate
                $this->clearInstanceCache();
 
@@ -4092,13 +4097,13 @@ class User implements IDBAccessObject {
                        __METHOD__
                );
                try {
-                       $mNewpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+                       $newPassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
                } catch ( PasswordError $e ) {
                        wfDebug( 'Invalid password hash found in database.' );
-                       $mNewpassword = PasswordFactory::newInvalidPassword();
+                       $newPassword = PasswordFactory::newInvalidPassword();
                }
 
-               if ( $mNewpassword->equals( $plaintext ) ) {
+               if ( $newPassword->equals( $plaintext ) ) {
                        if ( is_null( $row->user_newpass_time ) ) {
                                return true;
                        }
@@ -5246,7 +5251,7 @@ class User implements IDBAccessObject {
 
                # Note that the pattern requirement will always be satisfied if the
                # input is empty, so we need required in all cases.
-               #
+
                # @todo FIXME: Bug 23769: This needs to not claim the password is required
                # if e-mail confirmation is being used.  Since HTML5 input validation
                # is b0rked anyway in some browsers, just return nothing.  When it's
index 3a3eb53..e686ae3 100644 (file)
@@ -278,9 +278,10 @@ class UserRightsProxy {
                        array( 'user_id' => $this->id ),
                        __METHOD__ );
 
-               $key = wfForeignMemcKey( $this->database, false, 'user', 'id', $this->id );
-               $this->db->onTransactionPreCommitOrIdle( function() use ( $key ) {
-                       ObjectCache::getMainWANInstance()->delete( $key );
+               $wikiId = $this->db->getWikiID();
+               $userId = $this->id;
+               $this->db->onTransactionPreCommitOrIdle( function() use ( $wikiId, $userId ) {
+                       User::purge( $wikiId, $userId );
                } );
        }
 }
index acb260c..bfd841f 100644 (file)
@@ -100,7 +100,7 @@ class ApiDelete extends ApiBase {
 
                // Apply change tags to the log entry, if requested
                if ( count( $params['tags'] ) ) {
-                       ChangeTags::addTags( $params['tags'], null, null, $status->value, null, $user );
+                       ChangeTags::addTags( $params['tags'], null, null, $status->value, null );
                }
 
                $r = array(
index d24112c..5adde87 100644 (file)
@@ -155,6 +155,7 @@ class ApiFeedRecentChanges extends ApiBase {
                        'hideliu' => false,
                        'hidepatrolled' => false,
                        'hidemyself' => false,
+                       'hidecategorization' => false,
 
                        'tagfilter' => array(
                                ApiBase::PARAM_TYPE => 'string',
index abec828..c33b27b 100644 (file)
@@ -91,7 +91,7 @@ class ApiHelp extends ApiBase {
         * @return string
         */
        public static function getHelp( IContextSource $context, $modules, array $options ) {
-               global $wgMemc, $wgContLang;
+               global $wgContLang;
 
                if ( !is_array( $modules ) ) {
                        $modules = array( $modules );
@@ -104,6 +104,7 @@ class ApiHelp extends ApiBase {
                }
                $out->setPageTitle( $context->msg( 'api-help-title' ) );
 
+               $cache = ObjectCache::getMainWANInstance();
                $cacheKey = null;
                if ( count( $modules ) == 1 && $modules[0] instanceof ApiMain &&
                        $options['recursivesubmodules'] && $context->getLanguage() === $wgContLang
@@ -114,7 +115,7 @@ class ApiHelp extends ApiBase {
                                $cacheKey = wfMemcKey( 'apihelp', $modules[0]->getModulePath(),
                                        (int)!empty( $options['toc'] ),
                                        str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
-                               $cached = $wgMemc->get( $cacheKey );
+                               $cached = $cache->get( $cacheKey );
                                if ( $cached ) {
                                        $out->addHTML( $cached );
                                        return;
@@ -151,7 +152,7 @@ class ApiHelp extends ApiBase {
                $out->addHTML( $html );
 
                if ( $cacheKey !== null ) {
-                       $wgMemc->set( $cacheKey, $out->getHTML(), $cacheHelpTimeout );
+                       $cache->set( $cacheKey, $out->getHTML(), $cacheHelpTimeout );
                }
        }
 
index 5d2db47..c641c95 100644 (file)
@@ -1596,25 +1596,19 @@ class ApiMain extends ApiBase {
         */
        public function makeHelpMsg() {
                wfDeprecated( __METHOD__, '1.25' );
-               global $wgMemc;
-               $this->setHelp();
-               // Get help text from cache if present
-               $key = wfMemcKey( 'apihelp', $this->getModuleName(),
-                       str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
 
+               $this->setHelp();
                $cacheHelpTimeout = $this->getConfig()->get( 'APICacheHelpTimeout' );
-               if ( $cacheHelpTimeout > 0 ) {
-                       $cached = $wgMemc->get( $key );
-                       if ( $cached ) {
-                               return $cached;
-                       }
-               }
-               $retval = $this->reallyMakeHelpMsg();
-               if ( $cacheHelpTimeout > 0 ) {
-                       $wgMemc->set( $key, $retval, $cacheHelpTimeout );
-               }
 
-               return $retval;
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       wfMemcKey(
+                               'apihelp',
+                               $this->getModuleName(),
+                               str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) )
+                       ),
+                       $cacheHelpTimeout > 0 ? $cacheHelpTimeout : WANObjectCache::TTL_UNCACHEABLE,
+                       array( $this, 'reallyMakeHelpMsg' )
+               );
        }
 
        /**
index db826a6..370911a 100644 (file)
 
 /**
  * Interface for messages with machine-readable data for use by the API
+ *
+ * The idea is that it's a Message that has some extra data for the API to use when interpreting it
+ * as an error (or, in the future, as a warning). Internals of MediaWiki often use messages (or
+ * message keys, or Status objects containing messages) to pass information about errors to the user
+ * (see e.g. Title::getUserPermissionsErrors()) and the API has to make do with that.
+ *
  * @since 1.25
  * @ingroup API
  */
index 0711c90..30978a1 100644 (file)
@@ -169,11 +169,9 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                                ),
                        ),
                        'min' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'max' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'limit' => array(
index 4f7984e..8cb1119 100644 (file)
@@ -392,7 +392,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_DFLT => null,
                        ),
                        'start' => array(
                                ApiBase::PARAM_TYPE => 'timestamp',
index 877423e..699cba8 100644 (file)
@@ -374,7 +374,6 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                )
                        ),
                        'mime' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                        ),
                        'limit' => array(
index e853cdc..da895e2 100644 (file)
@@ -94,6 +94,9 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
                        }
                }
 
+               $dir = $params['dir'];
+               $this->addTimestampWhereRange( 'rev_timestamp', $dir, $params['start'], $params['end'] );
+
                if ( $this->fld_tags ) {
                        $this->addTables( 'tag_summary' );
                        $this->addJoinConds(
@@ -141,8 +144,6 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
                        }
                }
 
-               $dir = $params['dir'];
-
                if ( $params['continue'] !== null ) {
                        $op = ( $dir == 'newer' ? '>' : '<' );
                        $cont = explode( '|', $params['continue'] );
index b05c75c..7967826 100644 (file)
@@ -827,7 +827,6 @@ class ApiQueryInfo extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'protection',
@@ -851,7 +850,6 @@ class ApiQueryInfo extends ApiQueryBase {
                        ),
                        'token' => array(
                                ApiBase::PARAM_DEPRECATED => true,
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() )
                        ),
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
deleted file mode 100644 (file)
index dc10c91..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-<?php
-
-/**
- * Base query module for querying results from ORMTables.
- *
- * 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
- *
- * @since 1.21
- *
- * @file
- * @ingroup API
- *
- * @license GNU GPL v2+
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class ApiQueryORM extends ApiQueryBase {
-
-       /**
-        * Returns an instance of the IORMTable table being queried.
-        *
-        * @since 1.21
-        *
-        * @return IORMTable
-        */
-       abstract protected function getTable();
-
-       /**
-        * Returns the name of the individual rows.
-        * For example: page, user, contest, campaign, etc.
-        * This is used to appropriately name elements in XML.
-        * Deriving classes typically override this method.
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       protected function getRowName() {
-               return 'item';
-       }
-
-       /**
-        * Returns the name of the list of rows.
-        * For example: pages, users, contests, campaigns, etc.
-        * This is used to appropriately name nodes in the output.
-        * Deriving classes typically override this method.
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       protected function getListName() {
-               return 'items';
-       }
-
-       /**
-        * Returns the path to where the items results should be added in the result.
-        *
-        * @since 1.21
-        *
-        * @return null|string|array
-        */
-       protected function getResultPath() {
-               return null;
-       }
-
-       /**
-        * Get the parameters, find out what the conditions for the query are,
-        * run it, and add the results.
-        *
-        * @since 1.21
-        */
-       public function execute() {
-               $params = $this->getParams();
-
-               if ( !in_array( 'id', $params['props'] ) ) {
-                       $params['props'][] = 'id';
-               }
-
-               $results = $this->getResults( $params, $this->getConditions( $params ) );
-               $this->addResults( $params, $results );
-       }
-
-       /**
-        * Get the request parameters and remove all params set
-        * to null (ie those that are not actually provided).
-        *
-        * @since 1.21
-        *
-        * @return array
-        */
-       protected function getParams() {
-               return array_filter(
-                       $this->extractRequestParams(),
-                       function ( $prop ) {
-                               return isset( $prop );
-                       }
-               );
-       }
-
-       /**
-        * Get the conditions for the query. These will be provided as
-        * regular parameters, together with limit, props, continue,
-        * and possibly others which we need to get rid off.
-        *
-        * @since 1.21
-        *
-        * @param array $params
-        *
-        * @return array
-        */
-       protected function getConditions( array $params ) {
-               $conditions = array();
-               $fields = $this->getTable()->getFields();
-
-               foreach ( $params as $name => $value ) {
-                       if ( array_key_exists( $name, $fields ) ) {
-                               $conditions[$name] = $value;
-                       }
-               }
-
-               return $conditions;
-       }
-
-       /**
-        * Get the actual results.
-        *
-        * @since 1.21
-        *
-        * @param array $params
-        * @param array $conditions
-        *
-        * @return ORMResult
-        */
-       protected function getResults( array $params, array $conditions ) {
-               return $this->getTable()->select(
-                       $params['props'],
-                       $conditions,
-                       array(
-                               'LIMIT' => $params['limit'] + 1,
-                               'ORDER BY' => $this->getTable()->getPrefixedField( 'id' ) . ' ASC',
-                       ),
-                       __METHOD__
-               );
-       }
-
-       /**
-        * Serialize the results and add them to the result object.
-        *
-        * @since 1.21
-        *
-        * @param array $params
-        * @param ORMResult $results
-        */
-       protected function addResults( array $params, ORMResult $results ) {
-               $serializedResults = array();
-               $count = 0;
-
-               foreach ( $results as /* IORMRow */ $result ) {
-                       if ( ++$count > $params['limit'] ) {
-                               // We've reached the one extra which shows that
-                               // there are additional pages to be had. Stop here...
-                               $this->setContinueEnumParameter( 'continue', $result->getId() );
-                               break;
-                       }
-
-                       $serializedResults[] = $this->formatRow( $result, $params );
-               }
-
-               $this->setIndexedTagNames( $serializedResults );
-               $this->addSerializedResults( $serializedResults );
-       }
-
-       /**
-        * Formats a row to it's desired output format.
-        *
-        * @since 1.21
-        *
-        * @param IORMRow $result
-        * @param array $params
-        *
-        * @return mixed
-        */
-       protected function formatRow( IORMRow $result, array $params ) {
-               return $result->toArray( $params['props'] );
-       }
-
-       /**
-        * Set the tag names for formats such as XML.
-        *
-        * @since 1.21
-        *
-        * @param array $serializedResults
-        */
-       protected function setIndexedTagNames( array &$serializedResults ) {
-               ApiResult::setIndexedTagName( $serializedResults, $this->getRowName() );
-       }
-
-       /**
-        * Add the serialized results to the result object.
-        *
-        * @since 1.21
-        *
-        * @param array $serializedResults
-        */
-       protected function addSerializedResults( array $serializedResults ) {
-               $this->getResult()->addValue(
-                       $this->getResultPath(),
-                       $this->getListName(),
-                       $serializedResults
-               );
-       }
-
-       /**
-        * @see ApiBase::getAllowedParams()
-        * @return array
-        */
-       public function getAllowedParams() {
-               $params = array(
-                       'props' => array(
-                               ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_REQUIRED => true,
-                               ApiBase::PARAM_HELP_MSG => 'api-orm-param-props',
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 20,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2,
-                               ApiBase::PARAM_HELP_MSG => 'api-orm-param-limit',
-                       ),
-                       'continue' => array(
-                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
-                       ),
-               );
-
-               return array_merge( $this->getTable()->getAPIParams(), $params );
-       }
-
-       /**
-        * @see ApiBase::getParamDescription()
-        * @deprecated since 1.25
-        * @return array
-        */
-       public function getParamDescription() {
-               $descriptions = array(
-                       'props' => 'Fields to query',
-                       'continue' => 'Offset number from where to continue the query',
-                       'limit' => 'Max amount of rows to return',
-               );
-
-               return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions );
-       }
-}
index ed0a2a7..0a11f4b 100644 (file)
@@ -678,14 +678,9 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
                        ),
                        'type' => array(
-                               ApiBase::PARAM_DFLT => 'edit|new|log',
+                               ApiBase::PARAM_DFLT => 'edit|new|log|categorize',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'edit',
-                                       'external',
-                                       'new',
-                                       'log'
-                               )
+                               ApiBase::PARAM_TYPE => RecentChange::getChangeTypes()
                        ),
                        'toponly' => false,
                        'continue' => array(
index f8dbf23..ebc5c2e 100644 (file)
@@ -31,8 +31,8 @@
  */
 abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
-       protected $limit, $diffto, $difftotext, $expandTemplates, $generateXML, $section,
-               $parseContent, $fetchContent, $contentFormat, $setParsedLimit = true;
+       protected $limit, $diffto, $difftotext, $difftotextpst, $expandTemplates, $generateXML,
+               $section, $parseContent, $fetchContent, $contentFormat, $setParsedLimit = true;
 
        protected $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
                $fld_size = false, $fld_sha1 = false, $fld_comment = false,
@@ -61,6 +61,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
        protected function parseParameters( $params ) {
                if ( !is_null( $params['difftotext'] ) ) {
                        $this->difftotext = $params['difftotext'];
+                       $this->difftotextpst = $params['difftotextpst'];
                } elseif ( !is_null( $params['diffto'] ) ) {
                        if ( $params['diffto'] == 'cur' ) {
                                $params['diffto'] = 0;
@@ -385,6 +386,11 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                        $this->contentFormat
                                                );
 
+                                               if ( $this->difftotextpst ) {
+                                                       $popts = ParserOptions::newFromContext( $this->getContext() );
+                                                       $difftocontent = $difftocontent->preSaveTransform( $title, $user, $popts );
+                                               }
+
                                                $engine = $handler->createDifferenceEngine( $context );
                                                $engine->setContent( $content, $difftocontent );
                                        }
@@ -479,20 +485,20 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-parse',
                        ),
                        'section' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-section',
                        ),
                        'diffto' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-diffto',
                        ),
                        'difftotext' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotext',
                        ),
+                       'difftotextpst' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotextpst',
+                       ),
                        'contentformat' => array(
                                ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-contentformat',
                        ),
                );
index 32607a5..637fc4c 100644 (file)
@@ -308,7 +308,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true,
                        ),
                        'what' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => array(
                                        'title',
                                        'text',
index bcd5d9e..3d56128 100644 (file)
@@ -246,6 +246,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['misermode'] = (bool)$config->get( 'MiserMode' );
 
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
+               $data['minuploadchunksize'] = (int)$this->getConfig()->get( 'MinUploadChunkSize' );
 
                $data['thumblimits'] = $config->get( 'ThumbLimits' );
                ApiResult::setArrayType( $data['thumblimits'], 'BCassoc' );
@@ -539,18 +540,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        protected function appendInstalledLibraries( $property ) {
                global $IP;
-               $path = "$IP/composer.lock";
+               $path = "$IP/vendor/composer/installed.json";
                if ( !file_exists( $path ) ) {
-                       // Maybe they're using mediawiki/vendor?
-                       $path = "$IP/vendor/composer.lock";
-                       if ( !file_exists( $path ) ) {
-                               return true;
-                       }
+                       return true;
                }
 
                $data = array();
-               $lock = new ComposerLock( $path );
-               foreach ( $lock->getInstalledDependencies() as $name => $info ) {
+               $installed = new ComposerInstalled( $path );
+               foreach ( $installed->getInstalledDependencies() as $name => $info ) {
                        if ( strpos( $info['type'], 'mediawiki-' ) === 0 ) {
                                // Skip any extensions or skins since they'll be listed
                                // in their proper section
@@ -803,7 +800,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $subscribers ),
                        );
 
-                       ApiResult::setArrayType( $arr['subscribers'], 'BCarray' );
+                       ApiResult::setArrayType( $arr['subscribers'], 'array' );
                        ApiResult::setIndexedTagName( $arr['subscribers'], 's' );
                        $data[] = $arr;
                }
index 3de72bf..0a75961 100644 (file)
@@ -78,12 +78,10 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                return array(
                        'filekey' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_DFLT => null
                        ),
                        'sessionkey' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DEPRECATED => true,
-                               ApiBase::PARAM_DFLT => null
                        ),
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
index f916537..93c0dd0 100644 (file)
@@ -250,7 +250,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'blockinfo',
index 1d0048c..a826c1b 100644 (file)
@@ -294,7 +294,6 @@ class ApiQueryUsers extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'blockinfo',
index 648d259..75fc33e 100644 (file)
@@ -483,14 +483,10 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                )
                        ),
                        'type' => array(
-                               ApiBase::PARAM_DFLT => 'edit|new|log',
+                               ApiBase::PARAM_DFLT => 'edit|new|log|categorize',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'edit',
-                                       'external',
-                                       'new',
-                                       'log',
-                               )
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
+                               ApiBase::PARAM_TYPE => RecentChange::getChangeTypes()
                        ),
                        'owner' => array(
                                ApiBase::PARAM_TYPE => 'user'
index e87fc97..ebddd51 100644 (file)
@@ -39,7 +39,7 @@ class ApiStashEdit extends ApiBase {
        const ERROR_UNCACHEABLE = 'uncacheable';
 
        public function execute() {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                $user = $this->getUser();
                $params = $this->extractRequestParams();
@@ -111,11 +111,10 @@ class ApiStashEdit extends ApiBase {
                // De-duplicate requests on the same key
                if ( $user->pingLimiter( 'stashedit' ) ) {
                        $status = 'ratelimited';
-               } elseif ( $wgMemc->lock( $key, 0, 30 ) ) {
+               } elseif ( $cache->lock( $key, 0, 30 ) ) {
                        /** @noinspection PhpUnusedLocalVariableInspection */
-                       $unlocker = new ScopedCallback( function() use ( $key ) {
-                               global $wgMemc;
-                               $wgMemc->unlock( $key );
+                       $unlocker = new ScopedCallback( function() use ( $cache, $key ) {
+                               $cache->unlock( $key );
                        } );
                        $status = self::parseAndStash( $page, $content, $user );
                } else {
@@ -133,7 +132,7 @@ class ApiStashEdit extends ApiBase {
         * @since 1.25
         */
        public static function parseAndStash( WikiPage $page, Content $content, User $user ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                $format = $content->getDefaultFormat();
                $editInfo = $page->prepareContentForEdit( $content, null, $user, $format, false );
@@ -146,7 +145,7 @@ class ApiStashEdit extends ApiBase {
                        );
 
                        if ( $stashInfo ) {
-                               $ok = $wgMemc->set( $key, $stashInfo, $ttl );
+                               $ok = $cache->set( $key, $stashInfo, $ttl );
                                if ( $ok ) {
                                        wfDebugLog( 'StashEdit', "Cached parser output for key '$key'." );
                                        return self::ERROR_NONE;
@@ -173,7 +172,7 @@ class ApiStashEdit extends ApiBase {
         * will do nothing. Provided the values are cacheable, they will be stored
         * in memcached so that final edit submission might make use of them.
         *
-        * @param Article|WikiPage $page Page title
+        * @param Page|Article|WikiPage $page Page title
         * @param Content $content Proposed page content
         * @param Content $pstContent The result of preSaveTransform() on $content
         * @param ParserOutput $pOut The result of getParserOutput() on $pstContent
@@ -186,7 +185,7 @@ class ApiStashEdit extends ApiBase {
                Page $page, Content $content, Content $pstContent, ParserOutput $pOut,
                ParserOptions $pstOpts, ParserOptions $pOpts, $timestamp
        ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                // getIsPreview() controls parser function behavior that references things
                // like user/revision that don't exists yet. The user/text should already
@@ -219,7 +218,7 @@ class ApiStashEdit extends ApiBase {
                        return false;
                }
 
-               $ok = $wgMemc->set( $key, $stashInfo, $ttl );
+               $ok = $cache->set( $key, $stashInfo, $ttl );
                if ( !$ok ) {
                        wfDebugLog( 'StashEdit', "Failed to cache preview parser output for key '$key'." );
                } else {
@@ -247,17 +246,17 @@ class ApiStashEdit extends ApiBase {
         * @return stdClass|bool Returns false on cache miss
         */
        public static function checkCache( Title $title, Content $content, User $user ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                $key = self::getStashKey( $title, $content, $user );
-               $editInfo = $wgMemc->get( $key );
+               $editInfo = $cache->get( $key );
                if ( !is_object( $editInfo ) ) {
                        $start = microtime( true );
                        // We ignore user aborts and keep parsing. Block on any prior parsing
                        // so as to use it's results and make use of the time spent parsing.
-                       if ( $wgMemc->lock( $key, 30, 30 ) ) {
-                               $editInfo = $wgMemc->get( $key );
-                               $wgMemc->unlock( $key );
+                       if ( $cache->lock( $key, 30, 30 ) ) {
+                               $editInfo = $cache->get( $key );
+                               $cache->unlock( $key );
                        }
                        $sec = microtime( true ) - $start;
                        if ( $sec > .01 ) {
index b621cb0..5e13e98 100644 (file)
@@ -82,7 +82,7 @@ class ApiUpload extends ApiBase {
 
                // Check if the uploaded file is sane
                if ( $this->mParams['chunk'] ) {
-                       $maxSize = $this->mUpload->getMaxUploadSize();
+                       $maxSize = UploadBase::getMaxUploadSize();
                        if ( $this->mParams['filesize'] > $maxSize ) {
                                $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
                        }
@@ -139,6 +139,12 @@ class ApiUpload extends ApiBase {
                        return $this->getStashResult( $warnings );
                }
 
+               // Check throttle after we've handled warnings
+               if ( UploadBase::isThrottled( $this->getUser() )
+               ) {
+                       $this->dieUsageMsg( 'actionthrottledtext' );
+               }
+
                // This is the most common case -- a normal upload with no warnings
                // performUpload will return a formatted properly for the API with status
                return $this->performUpload( $warnings );
@@ -198,13 +204,30 @@ class ApiUpload extends ApiBase {
        private function getChunkResult( $warnings ) {
                $result = array();
 
-               $result['result'] = 'Continue';
                if ( $warnings && count( $warnings ) > 0 ) {
                        $result['warnings'] = $warnings;
                }
+
                $request = $this->getMain()->getRequest();
                $chunkPath = $request->getFileTempname( 'chunk' );
                $chunkSize = $request->getUpload( 'chunk' )->getSize();
+               $totalSoFar = $this->mParams['offset'] + $chunkSize;
+               $minChunkSize = $this->getConfig()->get( 'MinUploadChunkSize' );
+
+               // Sanity check sizing
+               if ( $totalSoFar > $this->mParams['filesize'] ) {
+                       $this->dieUsage(
+                               'Offset plus current chunk is greater than claimed file size', 'invalid-chunk'
+                       );
+               }
+
+               // Enforce minimum chunk size
+               if ( $totalSoFar != $this->mParams['filesize'] && $chunkSize < $minChunkSize ) {
+                       $this->dieUsage(
+                               "Minimum chunk size is $minChunkSize bytes for non-final chunks", 'chunk-too-small'
+                       );
+               }
+
                if ( $this->mParams['offset'] == 0 ) {
                        try {
                                $filekey = $this->performStash();
@@ -216,6 +239,18 @@ class ApiUpload extends ApiBase {
                        }
                } else {
                        $filekey = $this->mParams['filekey'];
+
+                       // Don't allow further uploads to an already-completed session
+                       $progress = UploadBase::getSessionStatus( $this->getUser(), $filekey );
+                       if ( !$progress ) {
+                               // Probably can't get here, but check anyway just in case
+                               $this->dieUsage( 'No chunked upload session with this key', 'stashfailed' );
+                       } elseif ( $progress['result'] !== 'Continue' || $progress['stage'] !== 'uploading' ) {
+                               $this->dieUsage(
+                                       'Chunked upload is already completed, check status for details', 'stashfailed'
+                               );
+                       }
+
                        $status = $this->mUpload->addChunk(
                                $chunkPath, $chunkSize, $this->mParams['offset'] );
                        if ( !$status->isGood() ) {
@@ -224,18 +259,12 @@ class ApiUpload extends ApiBase {
                                );
 
                                $this->dieUsage( $status->getWikiText(), 'stashfailed', 0, $extradata );
-
-                               return array();
                        }
                }
 
                // Check we added the last chunk:
-               if ( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
+               if ( $totalSoFar == $this->mParams['filesize'] ) {
                        if ( $this->mParams['async'] ) {
-                               $progress = UploadBase::getSessionStatus( $this->getUser(), $filekey );
-                               if ( $progress && $progress['result'] === 'Poll' ) {
-                                       $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
-                               }
                                UploadBase::setSessionStatus(
                                        $this->getUser(),
                                        $filekey,
@@ -255,21 +284,38 @@ class ApiUpload extends ApiBase {
                        } else {
                                $status = $this->mUpload->concatenateChunks();
                                if ( !$status->isGood() ) {
+                                       UploadBase::setSessionStatus(
+                                               $this->getUser(),
+                                               $filekey,
+                                               array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status )
+                                       );
                                        $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-
-                                       return array();
                                }
 
                                // The fully concatenated file has a new filekey. So remove
                                // the old filekey and fetch the new one.
+                               UploadBase::setSessionStatus( $this->getUser(), $filekey, false );
                                $this->mUpload->stash->removeFile( $filekey );
                                $filekey = $this->mUpload->getLocalFile()->getFileKey();
 
                                $result['result'] = 'Success';
                        }
+               } else {
+                       UploadBase::setSessionStatus(
+                               $this->getUser(),
+                               $filekey,
+                               array(
+                                       'result' => 'Continue',
+                                       'stage' => 'uploading',
+                                       'offset' => $totalSoFar,
+                                       'status' => Status::newGood(),
+                               )
+                       );
+                       $result['result'] = 'Continue';
+                       $result['offset'] = $totalSoFar;
                }
+
                $result['filekey'] = $filekey;
-               $result['offset'] = $this->mParams['offset'] + $chunkSize;
 
                return $result;
        }
@@ -379,6 +425,10 @@ class ApiUpload extends ApiBase {
                        // Chunk upload
                        $this->mUpload = new UploadFromChunks();
                        if ( isset( $this->mParams['filekey'] ) ) {
+                               if ( $this->mParams['offset'] === 0 ) {
+                                       $this->dieUsage( 'Cannot supply a filekey when offset is 0', 'badparams' );
+                               }
+
                                // handle new chunk
                                $this->mUpload->continueChunks(
                                        $this->mParams['filename'],
@@ -386,6 +436,10 @@ class ApiUpload extends ApiBase {
                                        $request->getUpload( 'chunk' )
                                );
                        } else {
+                               if ( $this->mParams['offset'] !== 0 ) {
+                                       $this->dieUsage( 'Must supply a filekey when offset is non-zero', 'badparams' );
+                               }
+
                                // handle first chunk
                                $this->mUpload->initialize(
                                        $this->mParams['filename'],
@@ -782,13 +836,19 @@ class ApiUpload extends ApiBase {
                        'url' => null,
                        'filekey' => null,
                        'sessionkey' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_DEPRECATED => true,
                        ),
                        'stash' => false,
 
-                       'filesize' => null,
-                       'offset' => null,
+                       'filesize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_MIN => 0,
+                               ApiBase::PARAM_MAX => UploadBase::getMaxUploadSize(),
+                       ),
+                       'offset' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                               ApiBase::PARAM_MIN => 0,
+                       ),
                        'chunk' => array(
                                ApiBase::PARAM_TYPE => 'upload',
                        ),
index 7bdf29a..278dc6f 100644 (file)
@@ -8,6 +8,7 @@
                        "Hiba Alshawi"
                ]
        },
+       "apihelp-main-param-action": "أي فعل للعمل.",
        "apihelp-main-param-format": "صيغة الخرج.",
        "apihelp-block-description": "منع مستخدم.",
        "apihelp-block-param-reason": "السبب للمنع.",
        "apihelp-delete-description": "حذف صفحة.",
        "apihelp-delete-param-unwatch": "أزل الصفحة من قائمة مراقبتك.",
        "apihelp-edit-description": "إنشاء وتعديل الصفحات.",
+       "apihelp-edit-param-text": "محتوى الصفحة",
+       "apihelp-edit-param-notminor": "تعديل غير طفيف.",
+       "apihelp-edit-param-bot": "علم على هذا التعديل كبوت.",
        "apihelp-edit-param-watch": "أضف الصفحة إلى لائحة مراقبة المستعمل الحالي",
+       "apihelp-edit-example-edit": "عدل صفحة.",
        "apihelp-emailuser-description": "مراسلة المستخدم",
+       "apihelp-feedrecentchanges-param-tagfilter": "فلتر بالوسم.",
+       "apihelp-filerevert-param-comment": "تعليق الرفع.",
+       "apihelp-help-example-recursive": "كل المساعدة في صفحة واحدة.",
+       "apihelp-import-param-summary": "تعليق الاستيراد.",
+       "apihelp-login-param-name": "اسم المستخدم.",
+       "apihelp-login-param-password": "كلمة السر",
+       "apihelp-login-example-login": "تسجيل الدخول",
+       "apihelp-move-param-reason": "السبب لإعادة التسمية.",
+       "apihelp-move-param-ignorewarnings": "تجاهل أي تحذيرات.",
+       "apihelp-opensearch-param-namespace": "النطاقات للبحث.",
        "apihelp-patrol-example-rcid": "ابحث عن تغيير جديد",
+       "apihelp-patrol-example-revid": "راجع مراجعة.",
+       "apihelp-protect-description": "غير مستوى الحماية لصفحة.",
+       "apihelp-protect-example-protect": "حماية صفحة.",
+       "apihelp-query+allpages-param-filterredir": "أي الصفحات للعرض.",
+       "apihelp-query+allrevisions-description": "اعرض كل المراجعات.",
        "apihelp-query+imageinfo-paramvalue-prop-userid": "إضافة هوية المستخدم الذي قام بتحميل كل إصدار ملف.",
        "apihelp-query+prefixsearch-param-offset": "عدد النتائج المراد تخطيها."
 }
index 4aacd1a..837e3f9 100644 (file)
@@ -5,7 +5,8 @@
                        "Macofe",
                        "Xavier Dengra",
                        "F3RaN",
-                       "Eduardo Martinez"
+                       "Eduardo Martinez",
+                       "Fitoschido"
                ]
        },
        "apihelp-main-param-format": "El format de la sortida.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtra segons etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostra només els canvis de les pàgines enllaçades a aquesta pàgina.",
        "apihelp-feedrecentchanges-example-simple": "Mostra els canvis recents.",
+       "apihelp-help-description": "Mostra l’ajuda dels mòduls especificats.",
        "apihelp-help-example-recursive": "Tota l'ajuda en una sola pàgina.",
        "apihelp-import-param-rootpage": "Importa com a subpàgina d'aquesta pàgina.",
        "apihelp-login-param-name": "Nom d'usuari.",
        "apihelp-login-param-password": "Contrasenya.",
        "apihelp-login-example-login": "Inicia sessió.",
+       "apihelp-options-example-reset": "Reinicialitza totes les preferències.",
        "apihelp-protect-param-cascade": "Activa la protecció en cascada (és a dir, protegeix les plantilles i imatges utilitzades en aquesta pàgina). S'ignora si cap dels nivells de protecció suporta la protecció en cascada.",
        "apihelp-query+pageswithprop-example-generator": "Obtenir informació addicional sobre les 10 primeres pàgines utilitzant <code>__NOTOC__</code>.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Afegeix el títol de la pàgina.",
index 8a5ee52..1c3a1de 100644 (file)
@@ -21,7 +21,7 @@
        "apihelp-main-param-servedby": "Zahrnout do odpovědi název hostitele, který požadavek obsloužil.",
        "apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.",
        "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu). Hodnota musí přesně odpovídat jednomu z původů v hlavičce <code>Origin</code>, takže musí být nastavena na něco jako <kbd>https://en.wikipedia.org</kbd> nebo <kbd>https://meta.wikimedia.org</kbd>. Pokud parametr neodpovídá hlavičce <code>Origin</code>, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce <code>Origin</code> a tento původ je na bílé listině, bude nastavena hlavička <code>Access-Control-Allow-Origin</code>.",
-       "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Seznam kódů lze načíst z <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd>, nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
+       "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Pomocí <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> se <kbd>siprop=languages</kbd> získáte seznam jazykových kódů nebo zadejte „<kbd>user</kbd>“ pro použití předvoleného jazyka aktuálního uživatele či „<kbd>content</kbd>“ pro použití jazyka obsahu této wiki.",
        "apihelp-block-description": "Zablokovat uživatele.",
        "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
        "apihelp-block-param-reason": "Důvod bloku.",
        "apihelp-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s <var>$1id</var>.",
        "apihelp-watch-example-watch": "Sledovat stránku <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.",
-       "apihelp-format-example-generic": "Výsledek dotazu vypsat ve formátu $1.",
+       "apihelp-format-example-generic": "Výsledek dotazu vrátit ve formátu $1.",
        "apihelp-dbg-description": "Vypisuje data ve formátu funkce <code>var_export()</code> z PHP.",
        "apihelp-dbgfm-description": "Vypisuje data ve formátu funkce <code>var_export()</code> z PHP (v čitelné HTML podobě).",
        "apihelp-json-description": "Vypisuje data ve formátu JSON.",
        "apihelp-none-description": "Nevypisuje nic.",
        "apihelp-php-description": "Vypisuje data v serializačním formátu PHP.",
        "apihelp-phpfm-description": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).",
-       "apihelp-rawfm-description": "Vypisuje data s ladicími prvky ve formátu JSON (v čitelné HTML podobě).",
+       "apihelp-rawfm-description": "Data včetně ladicích prvků vypisuje ve formátu JSON (v čitelné HTML podobě).",
        "apihelp-txt-description": "Vypisuje data ve formátu funkce <code>print_r()</code> z PHP.",
        "apihelp-txtfm-description": "Vypisuje data ve formátu funkce <code>print_r()</code> z PHP (v čitelné HTML podobě).",
        "apihelp-xml-description": "Vypisuje data ve formátu XML.",
        "apihelp-yaml-description": "Vypisuje data ve formátu YAML.",
        "apihelp-yamlfm-description": "Vypisuje data ve formátu YAML (v čitelné HTML podobě).",
        "api-format-title": "Odpověď z MediaWiki API",
-       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:Special:MyLanguage/API:Main page|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
+       "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
        "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
        "api-help-title": "Nápověda k MediaWiki API",
        "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API",
        "api-help-datatypes": "Některé typy parametrů v API potřebují bližší vysvětlení:\n;boolean\n:Booleovské parametry fungují jako zaškrtávací políčka v HTML: pokud je parametr uveden, bez ohledu na hodnotu, je považován za pravdivý. Pro nepravdivou hodnotu parametr zcela vynechte.\n;časová značka\n:Časové značky lze uvádět v několika formátech. Doporučuje se datum a čas podle ISO 8601. Všechny časy jsou v UTC a obsažené časové pásmo je ignorováno.\n:* Datum a čas podle ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (interpunkce a <kbd>Z</kbd> jsou nepovinné)\n:* Datum a čas podle ISO 8601 s (ignorovaným) zlomkem sekundy, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (pomlčky, dvojtečky a <kbd>Z</kbd> jsou nepovinné)\n:* Formát MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Obecný číselný formát, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (nepovinné časové pásmo <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd> nebo <kbd>-<var>##</var></kbd> se ignoruje)\n:* Formát EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formát podle RFC 2822 (časové pásmo lze vynechat), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formát podle RFC 850 (časové pásmo lze vynechat), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formát podle céčkové funkce ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Sekundy od 1970-01-01T00:00:00Z jako celé číslo o 1–13 číslicích (s výjimkou <kbd>0</kbd>)\n:* Řetězec <kbd>now</kbd>",
        "api-help-param-type-integer": "Typ: {{PLURAL:$1|1=celé číslo|2=seznam celých čísel}}",
        "api-help-param-type-boolean": "Typ: boolean ([[Special:ApiHelp/main#main/datatypes|podrobnosti]])",
-       "api-help-param-list": "{{PLURAL:$1|1=Jedna hodnota|2=Hodnoty (oddělené <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Jedna z následujících hodnot|2=Hodnoty (oddělené <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Musí být prázdné|Může být prázdné nebo $2}}",
        "api-help-param-limit": "Není dovoleno více než $1.",
        "api-help-param-limit2": "Není dovoleno více než $1 ($2 pro boty).",
index f254f1b..35f296c 100644 (file)
@@ -13,7 +13,8 @@
                        "Andreasburmeister",
                        "Anomie",
                        "Duder",
-                       "Ljonka"
+                       "Ljonka",
+                       "FriedhelmW"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokumentation]]\n* [[mw:API:FAQ/de|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von <nowiki>{{REVISIONID}}</nowiki> und ähnlichen Variablen verwendet wird.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Der expandierte Wikitext.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Die maximale Zeit, nach der der Ergebnis-Cache ungültig wird.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Der XML-Parserbaum der Eingabe.",
        "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.",
        "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).",
        "apihelp-feedrecentchanges-param-hideliu": "Änderungen von registrierten Benutzern ausblenden.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Kontrollierte Änderungen ausblenden.",
        "apihelp-feedrecentchanges-param-hidemyself": "Änderungen des aktuellen Benutzers ausblenden.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Änderungen der Kategorie-Zugehörigkeit verstecken.",
        "apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.",
        "apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Zeige Änderungen an Seiten die von der ausgewählten Seite verlinkt sind.",
        "apihelp-query+allimages-description": "Alle Bilder nacheinander auflisten.",
        "apihelp-query+allimages-param-sort": "Eigenschaft, nach der sortiert werden soll.",
        "apihelp-query+allimages-param-dir": "Aufzählungsrichtung.",
+       "apihelp-query+allimages-param-minsize": "Beschränkt auf Bilder mit mindestens dieser Anzahl an Bytes.",
+       "apihelp-query+allimages-param-maxsize": "Beschränkt auf Bilder mit höchstens dieser Anzahl an Bytes.",
        "apihelp-query+allimages-param-sha1": "SHA1-Hash des Bildes. Überschreibt $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "SHA1-Hash des Bildes (Basis 36; verwendet in MediaWiki).",
        "apihelp-query+allimages-param-limit": "Wie viele Gesamtbilder zurückgegeben werden sollen.",
        "apihelp-query+allimages-example-recent": "Zeigt eine Liste von kürzlich hochgeladenen Dateien ähnlich zu [[Special:NewFiles]].",
        "apihelp-query+alllinks-example-unique": "Einheitlich verlinkte Titel auflisten",
+       "apihelp-query+allmessages-description": "Gibt Nachrichten von dieser Website zurück.",
        "apihelp-query+allpages-description": "Listet alle Seiten in einem Namensraum nacheinander auf.",
        "apihelp-query+allpages-param-from": "Seitentitel, bei dem die Auflistung beginnen soll.",
        "apihelp-query+allpages-param-to": "Seitentitel, bei dem die Auflistung enden soll.",
        "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
        "apihelp-query+imageinfo-param-urlheight": "Ähnlich wie $1urlwidth.",
        "apihelp-query+info-description": "Ruft Basisinformationen über die Seite ab.",
+       "apihelp-query+info-paramvalue-prop-watchers": "Die Anzahl der Beobachter, falls erlaubt.",
        "apihelp-query+info-param-testactions": "Überprüft, ob der aktuelle Benutzer gewisse Aktionen auf der Seite ausführen kann.",
        "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Ergänzt das Präfix des Interwikis.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ergänzt den Titel des Interwikis.",
+       "apihelp-query+iwlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
+       "apihelp-query+langbacklinks-example-simple": "Ruft Seiten ab, die auf [[:fr:Test]] verlinken.",
+       "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
        "apihelp-userrights-param-user": "Benutzername.",
        "apihelp-userrights-param-userid": "Benutzerkennung.",
        "apihelp-watch-example-watch": "Die Seite <kbd>Main Page</kbd> beobachten.",
+       "apihelp-watch-example-unwatch": "Die Seite <kbd>Main Page</kbd> nicht beobachten.",
        "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format ausgeben.",
        "apihelp-dbg-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben.",
        "apihelp-dbgfm-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-none-description": "Nichts ausgeben.",
        "apihelp-php-description": "Daten im serialisierten PHP-Format ausgeben.",
        "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-rawfm-description": "Daten mit den Fehlerbehebungselementen im JSON-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-rawfm-description": "Daten, einschließlich Fehlerbehebungselementen, im JSON-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-txt-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben.",
        "apihelp-txtfm-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-xml-description": "Daten im XML-Format ausgeben.",
        "apihelp-yamlfm-description": "Daten im YAML-Format ausgeben (schöngedruckt in HTML).",
        "api-format-title": "MediaWiki-API-Ergebnis",
        "api-format-prettyprint-header": "Dies ist die HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege <kbd>format=$2</kbd> fest.\n\nSiehe die [[mw:API|vollständige Dokumentation]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
-       "api-orm-param-props": "Felder an die Anfrage.",
-       "api-orm-param-limit": "Maximale Anzahl zurückgegebender Zeilen.",
        "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
        "api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.",
        "api-pageset-param-revids": "Eine Liste der Versionskennungen, an denen gearbeitet werden soll.",
        "api-help-param-deprecated": "Veraltet.",
        "api-help-param-required": "Dieser Parameter ist erforderlich.",
        "api-help-datatypes-header": "Datentypen",
+       "api-help-param-type-limit": "Typ: Ganzzahl oder <kbd>max</kbd>",
+       "api-help-param-type-integer": "Typ: {{PLURAL:$1|1=Ganzzahl|2=Liste von Ganzzahlen}}",
        "api-help-param-list": "{{PLURAL:$1|1=Einer der folgenden Werte|2=Werte (mit <kbd>{{!}}</kbd> trennen)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Muss leer sein|Kann leer sein oder $2}}",
        "api-help-param-limit": "Nicht mehr als $1 erlaubt.",
        "api-help-param-default": "Standard: $1",
        "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(leer)</span>",
        "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "Aus Kompatibilitätsgründen wird der in der Weboberfläche verwendete Token ebenfalls akzeptiert.",
+       "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Manual:$wgMiserMode|Miser-Modus]].",
+       "api-help-param-continue": "Falls weitere Ergebnisse verfügbar sind, dies zum Fortfahren verwenden.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(keine Beschreibung)</span>",
        "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:",
        "api-help-permissions": "{{PLURAL:$1|Berechtigung|Berechtigungen}}:",
index 90d7fa7..450d83a 100644 (file)
        "apihelp-feedrecentchanges-param-hideliu": "Hide changes made by registered users.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Hide patrolled changes.",
        "apihelp-feedrecentchanges-param-hidemyself": "Hide changes made by the current user.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Hide category membership changes.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.",
        "apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.",
        "apihelp-query+revisions+base-param-section": "Only retrieve the content of this section number.",
        "apihelp-query+revisions+base-param-diffto": "Revision ID to diff each revision to. Use <kbd>prev</kbd>, <kbd>next</kbd> and <kbd>cur</kbd> for the previous, next and current revision respectively.",
        "apihelp-query+revisions+base-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides <var>$1diffto</var>. If <var>$1section</var> is set, only that section will be diffed against this text.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Perform a pre-save transform on the text before diffing it. Only valid when used with <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Serialization format used for <var>$1difftotext</var> and expected for output of content.",
 
        "apihelp-query+search-description": "Perform a full text search.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Returns user groups and the associated permissions.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Returns libraries installed on the wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Returns extensions installed on the wiki.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Returns list of file extensions allowed to be uploaded.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Returns list of file extensions (file types) allowed to be uploaded.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Returns wiki rights (license) information if available.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Returns information on available restriction (protection) types.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Returns a list of languages MediaWiki supports (optionally localised by using <var>$1inlanguagecode</var>).",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Adds timestamp of when the user was last notified about the edit.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Adds log information where appropriate.",
        "apihelp-query+watchlist-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Which types of changes to show:\n;edit:Regular page edits.\n;external:External changes.\n;new:Page creations.\n;log:Log entries.",
+       "apihelp-query+watchlist-param-type": "Which types of changes to show:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Regular page edits.",
+       "apihelp-query+watchlist-paramvalue-type-external": "External changes.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Page creations.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Log entries.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Category membership changes.",
        "apihelp-query+watchlist-param-owner": "Used along with $1token to access a different user's watchlist.",
        "apihelp-query+watchlist-param-token": "A security token (available in the user's [[Special:Preferences#mw-prefsection-watchlist|preferences]]) to allow access to another user's watchlist.",
        "apihelp-query+watchlist-example-simple": "List the top revision for recently changed pages on the current user's watchlist.",
        "apihelp-php-description": "Output data in serialized PHP format.",
        "apihelp-php-param-formatversion": "Output formatting:\n;1:Backwards-compatible format (XML-style booleans, <samp>*</samp> keys for content nodes, etc.).\n;2:Experimental modern format. Details may change!\n;latest:Use the latest format (currently <kbd>2</kbd>), may change without warning.",
        "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).",
-       "apihelp-rawfm-description": "Output data with the debugging elements in JSON format (pretty-print in HTML).",
+       "apihelp-rawfm-description": "Output data, including debugging elements, in JSON format (pretty-print in HTML).",
        "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
        "apihelp-txtfm-description": "Output data in PHP's <code>print_r()</code> format (pretty-print in HTML).",
        "apihelp-xml-description": "Output data in XML format.",
        "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
        "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
 
-       "api-orm-param-props": "Fields to query.",
-       "api-orm-param-limit": "Max amount of rows to return.",
-
        "api-pageset-param-titles": "A list of titles to work on.",
        "api-pageset-param-pageids": "A list of page IDs to work on.",
        "api-pageset-param-revids": "A list of revision IDs to work on.",
index c662823..ff80444 100644 (file)
        "apihelp-feedrecentchanges-param-hideliu": "Ocultar los cambios realizados por usuarios registrados.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar los cambios verificados.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ocultar los cambios realizados por el usuario actual.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ocultar los cambios de pertenencia a categorías.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiquetas.",
        "apihelp-feedrecentchanges-param-target": "Mostrar solo los cambios en las páginas enlazadas en esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar los cambios en páginas enlazadas con la página seleccionada.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Devuelve los grupos de usuarios y los permisos asociados.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Devuelve las bibliotecas instaladas en el wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Devuelve las extensiones instaladas en el wiki.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Devuelve una lista de extensiones de archivo permitidas para cargadarse.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Devuelve una lista de extensiones de archivo permitidas para subirse.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devuelve información de permisos (licencia) del wiki, si está disponible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devuelve información sobre tipos de restricciones (protección) disponible.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devuelve una lista de los idiomas que admite MediaWiki (opcionalmente localizada mediante el uso de <var>$1inlanguagecode</var>).",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Añade la longitud vieja y la nueva de la página.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Añade fecha y hora de cuando el usuario fue notificado por última vez acerca de la edición.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Añade información del registro cuando corresponda.",
-       "apihelp-query+watchlist-param-type": "Qué tipos de cambios mostrar:\n;edit:ediciones comunes a páginas.\n;external:cambios externos.\n;new:creaciones de páginas.\n;log:entradas del registro.",
+       "apihelp-query+watchlist-param-type": "Qué tipos de cambios mostrar:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Ediciones comunes a páginas",
+       "apihelp-query+watchlist-paramvalue-type-external": "Cambios externos.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Creaciones de páginas.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entradas del registro.",
        "apihelp-query+watchlistraw-param-prop": "Qué propiedades adicionales se obtendrán:",
        "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
        "apihelp-query+watchlistraw-param-fromtitle": "Título (con el prefijo de espacio de nombres) desde el que se empezará a enumerar.",
index 92efbfe..4e7662c 100644 (file)
        "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par des utilisateurs enregistrés.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Masquer les modifications contrôlées.",
        "apihelp-feedrecentchanges-param-hidemyself": "Masquer les modifications faites par l'utilisateur actuel.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Masquer les changements de la catégorie d'appartenance.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrer par balise.",
        "apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Renvoie les groupes utilisateur et les droits associés.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Renvoie les bibliothèques installées sur le wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Renvoie les extensions installées sur le wiki.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Renvoie la liste des extensions de fichier autorisées au téléchargement.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Renvoie la liste des extensions de fichier (types de fichier) autorisées au téléchargement.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Renvoie l’information sur les types de restriction disponibles (protection).",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Renvoie une liste des langues que supporte MédiaWiki (éventuellement localisé en utilisant <var>$1inlanguagecode</var>).",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Ajoute l’information de trace le cas échéant.",
        "apihelp-query+watchlist-param-show": "Afficher uniquement les éléments qui correspondent à ces critères. Par exemple, pour voir uniquement les modifications mineures faites par des utilisateurs connectés, mettre $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Quels types de modification afficher :\n;edit:Modifications ordinaires de page.\n;external:Modifications externes.\n;new:Créations de page.\n;log:Entrées du journal.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Créations de pages.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entrées du journal.",
        "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
        "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.",
        "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel",
        "apihelp-php-description": "Extraire les données au format sérialisé de PHP.",
        "apihelp-php-param-formatversion": "Mise en forme de la sortie :\n;1:Format rétro-compatible (bool&ens de style XML, clés <samp>*</samp> pour les nœuds de contenu, etc.).\n;2:Format moderne expérimental. Des détails peuvent changer !\n;latest:Utilise le dernier format (actuellement <kbd>2</kbd>), peut changer sans avertissement.",
        "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
-       "apihelp-rawfm-description": "Extraire les données avec les éléments de débogage au format JSON (affiché proprement en HTML).",
+       "apihelp-rawfm-description": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).",
        "apihelp-txt-description": "Extraire les données au format de <code>print_r()</code> de PHP.",
        "apihelp-txtfm-description": "Extraire les données au format de <code>print_r()</code> de PHP (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
        "api-format-title": "Résultat de l’API de MediaWiki",
        "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
-       "api-orm-param-props": "Champs à rechercher.",
-       "api-orm-param-limit": "Nombre maximal de lignes à renvoyer.",
        "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.",
        "api-pageset-param-pageids": "Une liste des IDs de page sur lesquelles travailler.",
        "api-pageset-param-revids": "Une liste des IDs de révision sur lesquelles travailler.",
index 96ab8ca..074593f 100644 (file)
        "apihelp-feedrecentchanges-param-hideliu": "Ocultar os cambios realizados por usuarios rexistrados.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar os cambios patrullados.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ocultar os cambios realizados polo usuario actual.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Agochar os cambios de pertenza á categoría.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostrar só os cambios nas páxinas ligadas a esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar os cambios nas páxinas ligadas coa páxina seleccionada.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Devolve os grupos de usuarios e os permisos que teñen asociados.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Devolve as bibliotecas de funcións software instaladas na wiki.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Devolve as extensións instaladas na wiki.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Devolve a lista de extenxións de ficheiro permitidas para subir ficheiros.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Devolve a lista de extenxións de ficheiro (tipos de ficheiro) permitidas para subir ficheiros.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Devolve a información dos dereitos (licenza) da wiki se está dispoñible.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Devolve información dos tipos de restricións (protección) dispoñibles.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Devolve unha lista dos idiomas que soporta Mediawiki (opcionalmente pode localizarse usando <var>$1inlanguagecode</var>).",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Engade o selo de tempo da última vez en que o usuario foi avisado da modificación.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Engade información do rexistro cando sexa axeitado.",
        "apihelp-query+watchlist-param-show": "Só mostrar elementos que cumpran esos criterios. Por exemplo, para ver só edicións menores feitas por usuarios conectados, activar $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:\n;edit:Modificacións normais de páxina.\n;external:Modificacións externas.\n;new:Creación de páxinas.\n;log:Entradas no rexistro.",
+       "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:",
        "apihelp-query+watchlist-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.",
        "apihelp-query+watchlist-param-token": "Identificador de seguridade (dispoñible nas [[Special:Preferences#mw-prefsection-watchlist|preferencias]] de usuario) para permitir o acceso a outros á súa páxina de vixiancia.",
        "apihelp-query+watchlist-example-simple": "Listar a última revisión das páxinas recentemente modificadas da lista de vixiancia do usuario actual.",
        "apihelp-php-description": "Datos de saída en formato serializado de PHP.",
        "apihelp-php-param-formatversion": "Formato de saída:\n;1:Formato compatible con versións anteriores(booleanos estilo XML,claves <samp>*</samp> para nodos, etc.).\n;2:Formato moderno experimental. Os detalles poden cambiar!\n;latest:Usa o último formato (actualmente kbd>2</kbd>), pode cambiar sen aviso previo.",
        "apihelp-phpfm-description": "Datos de saída en formato serializado de PHP(impresión en HTML).",
-       "apihelp-rawfm-description": "Datos de saída cos elementos de depuración en formato JSON(impresión en HTML).",
+       "apihelp-rawfm-description": "Datos de saída, incluíndo os elementos de depuración, en formato JSON (impresión en HTML).",
        "apihelp-txt-description": "Datos de saída en formato PHP <code>print_r()</code>.",
        "apihelp-txtfm-description": "Datos de saída en formato <code>print_r()</code> de PHP(impresión en HTML).",
        "apihelp-xml-description": "Datos de saída en formato XML.",
        "api-format-title": "Resultado de API de MediaWiki",
        "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro <var>format</var> para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe <kbd>format=$2</kbd>.\n\n\nRevise a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.",
        "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.",
-       "api-orm-param-props": "Campos a consultar.",
-       "api-orm-param-limit": "Número máximo de filas a mostrar.",
        "api-pageset-param-titles": "Lista de títulos nos que traballar.",
        "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.",
        "api-pageset-param-revids": "Unha lista de IDs de modificacións sobre as que traballar.",
index d0ff9f5..37243af 100644 (file)
        "apihelp-feedrecentchanges-param-hideliu": "הסתרת שינויים שנעשו על ידי משתמשים רשומים.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "הסתרת שינויים שנבדקו.",
        "apihelp-feedrecentchanges-param-hidemyself": "הסתרת שינוים שנעשו על ידי המשתמש הנוכחי.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "להסתיר שינויים בחברות בקטגוריה.",
        "apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תגית.",
        "apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים לדף זה בלבד.",
        "apihelp-feedrecentchanges-param-showlinkedto": "להציג את השינויים בדפים שמקושרים לדף שנבחר במקום זה.",
        "apihelp-query+revisions+base-param-section": "לאחזר רק את התוכן של הפִסקה עם המספר הזה.",
        "apihelp-query+revisions+base-param-diffto": "מזהה הגרסה שאליו תושווה כל גרסה. יש להשתמש ב־<kbd>prev</kbd>‏, <kbd>next</kbd> ו־<kbd>cur</kbd> עבור הגרסה הקודמת, הבא והנוכחית, בהתאמה.",
        "apihelp-query+revisions+base-param-difftotext": "הטקסט שאליו תושווה כל גרסה. מבצע השוואה רק של מספר מוגבל של גרסאות. דורס את <var>$1diffto</var>. אם מוגדר <var>$1section</var>, רק הפסקה הזאת תושווה אל מול הטקסט הזה.",
+       "apihelp-query+revisions+base-param-difftotextpst": "ביצוע התמרה לפני שמירה על הטקסט לפני הרצת השוואה. תקף רק כשמשמש עם <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "תסדיר ההסדרה שמשמש את <var>$1difftotext</var> וצפוי לפלט של תוכן.",
        "apihelp-query+search-description": "ביצוע חיפוש בכל הטקסט.",
        "apihelp-query+search-param-search": "חיפוש שמות דפים או תוכן שמתאים לערך הזה. אפשר להשתמש בחיפוש מחרוזת כדי לקרוא לאפשרויות חיפוש מתקדמות, בהתאם למה שממומש בשרת החיפוש של הוויקי.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "החזרת קבוצות משתמשים וההרשאות המשויכות.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "החזרת הספריות המותקנות בוויקי.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "החזרת ההרחבות המותקנות בוויקי.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "החזרת רשימת סיומות קבצים שאפשר להעלות.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "החזרת רשימת סיומות קבצים (סוגי קבצים) שאפשר להעלות.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "החזרת הזכויות (הרישיון) של הוויקי, אם זמין.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "החזרת מידע על ההגבלות (ההגנות) הזמינות.",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "החזרת השפות שמדיה־ויקי תומכת בהן (זה יכול להיות מותאם מקומים עם <var>$1inlanguagecode</var>).",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "הוספת חותם־זמן של ההודעה האחרונה למשתמש על העריכה.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "הוספת מידע מהיומן איפה שמתאים.",
        "apihelp-query+watchlist-param-show": "הצגה רק של פריטים שמתאימים לאמות המידה האלו. למשל, כדי לראות רק עריכות משניות שעשו משתמשים שנכנסו לחשבון, יש להגדיר $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "אולי סוגי שינויים להציג:\n;edit:עריכות דף רגילות.\n;external:שינויים חיצוניים.\n;new:יצירות דף.\n;log:עיולי יומן.",
+       "apihelp-query+watchlist-param-type": "אולי סוגי שינויים להציג:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "עריכות דף רגילות.",
+       "apihelp-query+watchlist-paramvalue-type-external": "שינויים חיצוניים.",
+       "apihelp-query+watchlist-paramvalue-type-new": "יצירות דף.",
+       "apihelp-query+watchlist-paramvalue-type-log": "עיולי יומן.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "שינויים בהשתייכות לקטגוריה.",
        "apihelp-query+watchlist-param-owner": "משמש יחד עם $1token לגישה לרשימת מעקב של משתמש אחר.",
        "apihelp-query+watchlist-param-token": "אסימון אבטחה (זמין ב־[[Special:Preferences#mw-prefsection-watchlist|העדפות]]) שמאפשר לגשת לרשימת מעקב של משתמש אחר.",
        "apihelp-query+watchlist-example-simple": "לרשום את הגרסה האחרונה עבור דפים שהשתנו לאחרונה ברשימת המעקב של המשתמש הנוכחי.",
        "apihelp-php-description": "לפלוט נתונים בתסדיר PHP מוסדר.",
        "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-phpfm-description": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
-       "apihelp-rawfm-description": "לפלוט את הנתונים עם אלמנטים לניפוי שגיאות בתסדיר JSON (עם הדפסה יפה ב־HTML).",
+       "apihelp-rawfm-description": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).",
        "apihelp-txt-description": "לפלוט נתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP.",
        "apihelp-txtfm-description": "לפלוט את הנתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-description": "לפלוט נתונים בתסדיר XML.",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
-       "api-orm-param-props": "באילו שדות לעשות שאילתה.",
-       "api-orm-param-limit": "מספר מרבי של שורות להחזיר.",
        "api-pageset-param-titles": "רשימת כותרות.",
        "api-pageset-param-pageids": "רשימת מזהי דף לעבוד עליהם.",
        "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
diff --git a/includes/api/i18n/id.json b/includes/api/i18n/id.json
new file mode 100644 (file)
index 0000000..223e585
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "WongKentir"
+               ]
+       },
+       "apihelp-createaccount-param-name": "Nama pengguna"
+}
index 25f9002..c1123d2 100644 (file)
        "apihelp-block-description": "Blocca  un utente.",
        "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare.",
        "apihelp-block-param-reason": "Motivo del blocco.",
-       "apihelp-block-param-nocreate": "Evitare la creazione di account.",
+       "apihelp-block-param-nocreate": "Impedisci creazione di utenze.",
        "apihelp-block-param-hidename": "Nascondi il nome utente dal registro dei blocchi (Richiede i permessi di <code>hideuser</code>).",
        "apihelp-block-param-reblock": "Se l'utente è già bloccato, sovrascrivere il blocco esistente.",
        "apihelp-block-param-watchuser": "Segui la pagina utente e le pagine di discussione utente dell'utente o dell'indirizzo IP.",
-       "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP <kbd>192.0.2.5</kbd> per tre giorni con motivazione <kbd>Primo avvertimento</kbd>.",
+       "apihelp-block-example-ip-simple": "Blocca l'indirizzo IP <kbd>192.0.2.5</kbd> per tre giorni con motivazione <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Blocca l'utente <kbd>Vandal</kbd> a tempo indeterminato con motivazione <kbd>Vandalism</kbd>, e impediscigli la creazione di nuovi account e l'invio di e-mail.",
        "apihelp-checktoken-description": "Verifica la validità di un token da <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Tipo di token in corso di test.",
@@ -35,7 +35,7 @@
        "apihelp-checktoken-example-simple": "Verifica la validità di un token <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-description": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
        "apihelp-clearhasmsg-example-1": "Cancella il flag <code>hasmsg</code> per l'utente corrente.",
-       "apihelp-compare-description": "Trova la differenza tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".",
+       "apihelp-compare-description": "Ottieni le differenze tra 2 pagine.\n\nUn numero di revisione, il titolo di una pagina, o un ID di pagina deve essere indicato sia per il \"da\" che per lo \"a\".",
        "apihelp-compare-param-fromtitle": "Primo titolo da confrontare.",
        "apihelp-compare-param-fromid": "Primo ID di pagina da confrontare.",
        "apihelp-compare-param-fromrev": "Prima revisione da confrontare.",
@@ -44,7 +44,7 @@
        "apihelp-compare-param-torev": "Seconda revisione da confrontare.",
        "apihelp-compare-example-1": "Crea un diff tra revisione 1 e revisione 2.",
        "apihelp-createaccount-description": "Crea un nuovo account utente.",
-       "apihelp-createaccount-param-name": "Nome Utente",
+       "apihelp-createaccount-param-name": "Nome utente.",
        "apihelp-createaccount-param-password": "Password (verrà ignorata se è impostato <var>$1mailpassword</var>).",
        "apihelp-createaccount-param-domain": "Dominio per l'autenticazione esterna (opzionale).",
        "apihelp-createaccount-param-email": "Indirizzo Email dell'utente (opzionale).",
@@ -58,8 +58,8 @@
        "apihelp-delete-param-title": "Titolo della pagina che si desidera eliminare. Non può essere usato insieme con <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID di pagina della pagina da cancellare. Non può essere usato insieme con <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motivo della cancellazione. Se non indicato, verrà usata una motivazione generata automaticamente.",
-       "apihelp-delete-param-watch": "Aggiungi la pagina agli Osservati Speciali dell'utente corrente.",
-       "apihelp-delete-param-unwatch": "Rimuovi la pagina dagli Osservati Speciali dell'utente corrente.",
+       "apihelp-delete-param-watch": "Aggiunge la pagina agli osservati speciali dell'utente attuale.",
+       "apihelp-delete-param-unwatch": "Rimuove la pagina dagli osservati speciali dell'utente attuale.",
        "apihelp-delete-example-simple": "Cancella <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Cancella la <kbd>Main Page</kbd> con motivazione <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Questo modulo è stato disabilitato.",
@@ -75,8 +75,9 @@
        "apihelp-edit-param-bot": "Segna questa modifica come bot.",
        "apihelp-edit-param-createonly": "Non modificare la pagina se già esiste.",
        "apihelp-edit-param-nocreate": "Genera un errore se la pagina non esiste.",
-       "apihelp-edit-param-watch": "Aggiungi la pagina agli Osservati Speciali dell'utente corrente.",
-       "apihelp-edit-param-unwatch": "Rimuovi la pagina dagli Osservati Speciali dell'utente corrente.",
+       "apihelp-edit-param-watch": "Aggiunge la pagina agli osservati speciali dell'utente attuale.",
+       "apihelp-edit-param-unwatch": "Rimuove la pagina dagli osservati speciali dell'utente attuale.",
+       "apihelp-edit-param-redirect": "Risolvi automaticamente redirect.",
        "apihelp-edit-example-edit": "Modifica una pagina.",
        "apihelp-emailuser-description": "Manda un'e-mail ad un utente.",
        "apihelp-emailuser-param-target": "Utente a cui inviare l'e-mail.",
        "apihelp-feedrecentchanges-param-hidebots": "Nascondi le modifiche apportate da bot.",
        "apihelp-feedrecentchanges-param-hideanons": "Nascondi le modifiche fatte da utenti anonimi.",
        "apihelp-feedrecentchanges-param-hideliu": "Nascondi le modifiche apportate dagli utenti registrati.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Nasconde le modifiche effettuate dall'utente attuale.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.",
        "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.",
        "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.",
        "apihelp-login-param-name": "Nome utente.",
        "apihelp-login-param-password": "Password.",
+       "apihelp-login-param-domain": "Dominio (opzionale).",
        "apihelp-move-description": "Sposta una pagina.",
+       "apihelp-move-param-watch": "Aggiunge la pagina e il redirect agli osservati speciali dell'utente attuale.",
        "apihelp-move-param-ignorewarnings": "Ignora i messaggi di avvertimento del sistema.",
+       "apihelp-opensearch-example-te": "Trova le pagine che iniziano con <kbd>Te</kbd>.",
        "apihelp-options-example-reset": "Reimposta tutte le preferenze.",
+       "apihelp-protect-example-protect": "Proteggi una pagina.",
+       "apihelp-query-param-export": "Esporta la versione attuale di tutte le pagine ottenute o generate.",
+       "apihelp-query+allcategories-param-dir": "Direzione dell'ordinamento.",
+       "apihelp-query+allcategories-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+allfileusages-paramvalue-prop-title": "Aggiunge il titolo del file.",
+       "apihelp-query+allfileusages-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+allfileusages-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allimages-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+alllinks-paramvalue-prop-title": "Aggiunge il titolo del collegamento.",
+       "apihelp-query+alllinks-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+alllinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allpages-param-filterredir": "Quali pagine elencare.",
+       "apihelp-query+allpages-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allredirects-paramvalue-prop-title": "Aggiunge il titolo del redirect.",
+       "apihelp-query+allredirects-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+allredirects-param-dir": "La direzione in cui elencare.",
        "apihelp-query+allrevisions-description": "Elenco di tutte le versioni.",
        "apihelp-query+allrevisions-param-user": "Elenca solo le versioni di questo utente.",
        "apihelp-query+allrevisions-param-excludeuser": "Non elencare le versioni di questo utente.",
        "apihelp-query+allrevisions-param-namespace": "Elenca solo le pagine in questo namespace.",
        "apihelp-query+allrevisions-example-user": "Elenca gli ultimi 50 contributi dell'utente <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Elenca solo le prime 50 versioni nel namespace principale.",
+       "apihelp-query+alltransclusions-paramvalue-prop-title": "Aggiunge il titolo dell'inclusione.",
+       "apihelp-query+alltransclusions-param-limit": "Quanti elementi totali restituire.",
+       "apihelp-query+alltransclusions-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+allusers-param-dir": "Direzione dell'ordinamento.",
+       "apihelp-query+backlinks-description": "Trova tutte le pagine che puntano a quella specificata.",
+       "apihelp-query+backlinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+backlinks-param-redirect": "Se la pagina collegata è un redirect, trova tutte le pagine che puntano al redirect. Il limite massimo è dimezzato.",
+       "apihelp-query+blocks-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+blocks-paramvalue-prop-userid": "Aggiunge l'ID utente dell'utente bloccato.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "Aggiunge l'ID utente dell'utente che ha effettuato il blocco.",
        "apihelp-query+blocks-example-simple": "Elenca i blocchi.",
+       "apihelp-query+categories-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+categorymembers-param-namespace": "Includi solo le pagine in questi namespace. Nota che può essere usato <kbd>$1type=subcat</kbd> o <kbd>$1type=file</kbd> anziché <kbd>$1namespace=14</kbd> o <kbd>6</kbd>.",
+       "apihelp-query+duplicatefiles-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+embeddedin-description": "Trova tutte le pagine che incorporano (transclusione) il titolo specificato.",
+       "apihelp-query+embeddedin-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+filearchive-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+filearchive-example-simple": "Mostra un elenco di tutti i file cancellati.",
+       "apihelp-query+fileusage-description": "Trova tutte le pagine che utilizzano il file specificato.",
+       "apihelp-query+fileusage-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "ID pagina di ogni pagina.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "Titolo di ogni pagina.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Indica se la pagina è un redirect.",
+       "apihelp-query+fileusage-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+fileusage-param-show": "Mostra solo gli elementi che soddisfano questi criteri:\n;redirect:mostra solo i redirect.\n;!redirect:mostra solo i non redirect.",
+       "apihelp-query+fileusage-example-simple": "Ottieni un elenco di pagine che usano [[:File:Example.jpg]].",
+       "apihelp-query+images-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+images-example-simple": "Ottieni un elenco di file usati in [[Main Page]].",
+       "apihelp-query+imageusage-description": "Trova tutte le pagine che utilizzano il titolo dell'immagine specificato.",
+       "apihelp-query+imageusage-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+imageusage-param-redirect": "Se la pagina collegata è un redirect, trova tutte le pagine che puntano al redirect. Il limite massimo è dimezzato.",
+       "apihelp-query+iwbacklinks-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Aggiunge il titolo dell'interwiki.",
+       "apihelp-query+iwbacklinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+iwlinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+langbacklinks-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Aggiunge il titolo del collegamento linguistico.",
+       "apihelp-query+langbacklinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+langlinks-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+links-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+linkshere-description": "Trova tutte le pagine che puntano a quelle specificate.",
+       "apihelp-query+linkshere-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "ID pagina di ogni pagina.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Titolo di ogni pagina.",
+       "apihelp-query+linkshere-paramvalue-prop-redirect": "Indica se la pagina è un redirect.",
+       "apihelp-query+linkshere-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+linkshere-param-show": "Mostra solo gli elementi che soddisfano questi criteri:\n;redirect:mostra solo i redirect.\n;!redirect:mostra solo i non redirect.",
+       "apihelp-query+linkshere-example-simple": "Ottieni un elenco di pagine che puntano a [[Main Page]].",
+       "apihelp-query+logevents-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+logevents-paramvalue-prop-title": "Aggiunge il titolo della pagine per l'evento nel registro.",
+       "apihelp-query+pageswithprop-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+protectedtitles-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "Aggiunge l'ID utente che ha aggiunto la protezione.",
+       "apihelp-query+protectedtitles-paramvalue-prop-level": "Aggiunge il livello di protezione.",
+       "apihelp-query+protectedtitles-example-generator": "Trova collegamenti a titoli protetti nel namespace principale.",
        "apihelp-query+recentchanges-example-simple": "Elenco modifiche recenti.",
+       "apihelp-query+redirects-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "ID pagina di ogni redirect.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Titolo di ogni redirect.",
+       "apihelp-query+redirects-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+redirects-example-simple": "Ottieni un elenco di redirect a [[Main Page]].",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "L'ID della versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "Testo della versione.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Etichette della versione.",
+       "apihelp-query+search-paramvalue-prop-redirecttitle": "Aggiunge il titolo del redirect corrispondente.",
+       "apihelp-query+search-paramvalue-prop-sectiontitle": "Aggiunge il titolo della sezione corrispondente.",
+       "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Restituisce informazioni sui tipi di restrizione (protezione) disponibili.",
+       "apihelp-query+tags-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+templates-param-dir": "La direzione in cui elencare.",
+       "apihelp-query+tokens-example-simple": "Recupera un token csrf (il predefinito).",
+       "apihelp-query+transcludedin-description": "Trova tutte le pagine che incorporano quella specificata.",
+       "apihelp-query+transcludedin-param-prop": "Quali proprietà ottenere:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID pagina di ogni pagina.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "Titolo di ogni pagina.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Indica se la pagina è un redirect.",
+       "apihelp-query+transcludedin-param-namespace": "Includi solo le pagine in questi namespace.",
+       "apihelp-query+transcludedin-param-show": "Mostra solo gli elementi che soddisfano questi criteri:\n;redirect:mostra solo i redirect.\n;!redirect:mostra solo i non redirect.",
+       "apihelp-query+transcludedin-example-simple": "Ottieni un elenco di pagine che includono <kbd>Main Page</kbd>.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Aggiunge il titolo e l'ID namespace della pagina.",
+       "apihelp-query+userinfo-description": "Ottieni informazioni sull'utente attuale.",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etichetta se l'utente attuale è bloccato, da chi e per quale motivo.",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Aggiunge un'etichetta <samp>messages</samp> se l'utente attuale ha messaggi in attesa.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Elenca tutti i gruppi di cui l'utente attuale è automaticamente membro.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Elenca tutti i gruppi di cui l'utente attuale può essere aggiunto o rimosso.",
+       "apihelp-query+userinfo-example-simple": "Ottieni informazioni sull'utente attuale.",
+       "apihelp-query+users-description": "Ottieni informazioni su un elenco di utenti.",
+       "apihelp-query+users-param-users": "Un elenco di utenti di cui ottenere informazioni.",
+       "apihelp-query+watchlist-description": "Ottieni le ultime modifiche alle pagine tra gli osservati speciali dell'utente attuale.",
+       "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.",
+       "apihelp-query+watchlistraw-example-generator": "Recupera le informazioni sulle pagine fra gli osservati speciali dell'utente attuale.",
+       "apihelp-tokens-param-type": "Tipi di token da richiedere.",
+       "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).",
        "apihelp-unblock-description": "Sblocca un utente",
        "apihelp-undelete-param-title": "Titolo della pagina da ripristinare.",
        "apihelp-upload-example-url": "Carica da un URL.",
+       "apihelp-userrights-param-user": "Nome utente.",
+       "apihelp-userrights-param-userid": "ID utente.",
+       "apihelp-watch-description": "Aggiunge o rimuove pagine dagli osservati speciali dell'utente attuale.",
+       "api-pageset-param-titles": "Un elenco di titoli su cui lavorare.",
+       "api-pageset-param-revids": "Un elenco di ID versioni su cui lavorare.",
+       "api-pageset-param-redirects-generator": "Risolvi automaticamente redirect in <var>$1titles</var>, <var>$1pageids</var>, e <var>$1revids</var>, e nelle pagine restituite da <var>$1generator</var>.",
+       "api-pageset-param-converttitles": "Converte i titoli in altre varianti, se necessario. Funziona solo se la lingua del contenuto del wiki supporta la conversione in varianti. Le lingue che supportano la conversione in varianti includono $1",
        "api-help-main-header": "Modulo principale",
        "api-help-license": "Licenza: [[$1|$2]]",
        "api-help-license-unknown": "Licenza: <span class=\"apihelp-unknown\">sconosciuta</span>",
        "api-help-parameters": "{{PLURAL:$1|Parametro|Parametri}}:",
        "api-help-param-deprecated": "Deprecato.",
        "api-help-param-required": "Questo parametro è obbligatorio.",
+       "api-help-param-type-user": "Tipo: {{PLURAL:$1|1=nome utente|2=elenco di nomi utente}}",
        "api-help-param-list": "{{PLURAL:$1|1=Uno dei seguenti valori|2=Valori (separati da <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-multi-max": "Il numero massimo di valori è {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} per i bot).",
        "api-help-param-default": "Predefinito: $1",
        "api-help-param-default-empty": "Predefinito: <span class=\"apihelp-empty\">(vuoto)</span>",
+       "api-help-param-token": "Un token \"$1\" recuperato da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-continue": "Quando più risultati sono disponibili, usa questo per continuare.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(nessuna descrizione)</span>",
        "api-help-examples": "{{PLURAL:$1|Esempio|Esempi}}:",
        "api-credits-header": "Crediti"
index 5f9850b..1a99054 100644 (file)
@@ -11,6 +11,7 @@
                        "Macofe"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api メーリングリスト]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 告知]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R バグの報告とリクエスト]\n</div>\n<strong>状態:</strong> このページに表示されている機能は全て動作するはずですが、この API は未だ活発に開発されており、変更される可能性があります。アップデートの通知を受け取るには、[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce メーリングリスト]に参加してください。\n\n<strong>誤ったリクエスト:</strong> 誤ったリクエストが API に贈られた場合、\"MediaWiki-API-Error\" HTTP ヘッダーが送信され、そのヘッダーの値と送り返されるエラーコードは同じ値にセットされます。より詳しい情報は [[mw:API:Errors_and_warnings|API: Errors and warnings]] を参照してください。",
        "apihelp-main-param-action": "実行する操作です。",
        "apihelp-main-param-format": "出力する形式です。",
        "apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP キャッシュ コントロール ヘッダー に、この秒数を設定します。エラーがキャッシュされることはありません。",
@@ -29,6 +30,7 @@
        "apihelp-block-param-autoblock": "その利用者が最後に使用したIPアドレスと、ブロック後に編集を試みた際のIPアドレスを自動的にブロックします。",
        "apihelp-block-param-noemail": "Wikiを通して電子メールを送信することを禁止します。(<code>blockemail</code> 権限が必要です)",
        "apihelp-block-param-hidename": "ブロック記録から利用者名を秘匿します。(<code>hideuser</code> 権限が必要です)",
+       "apihelp-block-param-allowusertalk": "自身のトークページの編集を許可する (<var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var> に依存)。",
        "apihelp-block-param-reblock": "その利用者がすでにブロックされている場合、ブロックを上書きします。",
        "apihelp-block-param-watchuser": "その利用者またはIPアドレスの利用者ページとトークページをウォッチします。",
        "apihelp-block-example-ip-simple": "IPアドレス <kbd>192.0.2.5</kbd> を <kbd>First strike<kbd> という理由で3日ブロックする",
@@ -37,6 +39,8 @@
        "apihelp-checktoken-param-type": "調べるトークンの種類。",
        "apihelp-checktoken-param-token": "調べるトークン。",
        "apihelp-checktoken-example-simple": "<kbd>csrf</kbd> トークンの妥当性を調べる。",
+       "apihelp-clearhasmsg-description": "現在の利用者の <code>hasmsg</code> フラグを消去します。",
+       "apihelp-clearhasmsg-example-1": "現在の利用者の <code>hasmsg</code> フラグを消去する。",
        "apihelp-compare-description": "2つの版間の差分を取得します。\n\n\"from\" と \"to\" の両方の版番号、ページ名、もしくはページIDを渡す必要があります。",
        "apihelp-compare-param-fromtitle": "比較する1つ目のページ名。",
        "apihelp-compare-param-fromid": "比較する1つ目のページID。",
        "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
        "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
        "apihelp-createaccount-param-realname": "利用者の本名 (省略可能)。",
-       "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、ランダムなパスワードがその利用者に電子メールで送られます。",
+       "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、無作為なパスワードがその利用者に電子メールで送られます。",
        "apihelp-createaccount-param-reason": "ログに記録されるアカウント作成の理由 (任意)。",
+       "apihelp-createaccount-param-language": "利用者の言語コードの既定値 (省略可能, 既定ではコンテンツ言語)。",
        "apihelp-createaccount-example-pass": "利用者 <kbd>testuser</kbd> をパスワード <kbd>test123</kbd> として作成する。",
-       "apihelp-createaccount-example-mail": "利用者 <kbd>testmailuser</kbd>を作成し、ランダムに生成されたパスワードをメールで送る",
+       "apihelp-createaccount-example-mail": "利用者 <kbd>testmailuser</kbd>を作成し、無作為に生成されたパスワードをメールで送る。",
        "apihelp-delete-description": "ページを削除します。",
        "apihelp-delete-param-title": "削除するページ名です。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-delete-param-pageid": "削除するページIDです。<var>$1title</var> とは同時に使用できません。",
@@ -88,7 +93,7 @@
        "apihelp-edit-param-appendtext": "このテキストをページの末尾に追加する。$1textを上書きします。\n\n新しい節を追加するにはこのパラメータではなく $1section=newを使用してください。",
        "apihelp-edit-param-undo": "この版を取り消します。$1text, $1prependtext および $1appendtext をオーバーライドします。",
        "apihelp-edit-param-undoafter": "$1undo からこの版までのすべての版を取り消します。設定しない場合、ひとつの版のみ取り消されます。",
-       "apihelp-edit-param-redirect": "自動的にリダイレクトを解決します。",
+       "apihelp-edit-param-redirect": "自動的に転送を解決します。",
        "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
        "apihelp-edit-example-edit": "ページを編集",
        "apihelp-edit-example-prepend": "<kbd>_&#95;NOTOC_&#95;</kbd> をページの先頭に挿入する。",
        "apihelp-paraminfo-param-querymodules": "クエリモジュール名のリスト (<var>prop</var>, <var>meta</var> or <var>list</var> パラメータの値)。<kbd>$1querymodules=foo</kbd> の代わりに <kbd>$1modules=query+foo</kbd> を使用してください。",
        "apihelp-paraminfo-example-1": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
        "apihelp-parse-param-summary": "構文解析のための要約",
+       "apihelp-parse-param-redirects": "もし <var>$1page</var> や <var>$1pageid</var> に転送ページが指定された場合、それを解決する。",
        "apihelp-parse-param-prop": "どの情報を取得するか:",
        "apihelp-parse-paramvalue-prop-text": "ウィキテキストの解析されたテキストを提供します。",
        "apihelp-parse-paramvalue-prop-langlinks": "解析されたウィキテキストにおける言語リンクを提供します。",
        "apihelp-query+allcategories-example-size": "カテゴリを、内包するページ数の情報と共に、一覧表示する。",
        "apihelp-query+allcategories-example-generator": "<kbd>List</kbd> で始まるカテゴリページに関する情報を取得する。",
        "apihelp-query+alldeletedrevisions-description": "利用者によって削除された、または名前空間内の削除されたすべての版を一覧表示する。",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "<var>$3user</var> と同時に使用します。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "<var>$3user</var> と同時に使用できません。",
        "apihelp-query+alldeletedrevisions-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+alldeletedrevisions-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+querypage-param-limit": "返す結果の数。",
        "apihelp-query+querypage-example-ancientpages": "[[Special:Ancientpages]] の結果を返す。",
        "apihelp-query+random-param-namespace": "この名前空間にあるページのみを返します。",
+       "apihelp-query+random-param-limit": "返す無作為なページの数を制限する。",
        "apihelp-query+random-param-redirect": "代わりに <kbd>$1filterredir=redirects</kbd> を使用してください。",
        "apihelp-query+random-param-filterredir": "転送ページを絞り込む方法。",
        "apihelp-query+random-example-simple": "標準名前空間から2つのページを無作為に返す。",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "その版の利用者による、構文解析されたコメント。",
        "apihelp-query+revisions+base-paramvalue-prop-content": "その版のテキスト。",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "その版のタグ。",
+       "apihelp-query+revisions+base-param-limit": "返す版の数を制限する。",
        "apihelp-query+search-description": "全文検索を行います。",
        "apihelp-query+search-param-search": "この値を含むページ名または本文を検索します。Wikiの検索バックエンド実装に応じて、あなたは特別な検索機能を呼び出すための文字列を検索することができます。",
        "apihelp-query+search-param-namespace": "この名前空間内のみを検索します。",
        "api-pageset-param-revids": "対象の版IDのリスト。",
        "api-pageset-param-generator": "クエリモジュールを実行することにより対象のページの一覧を取得する。\n\n<strong>注意</strong> Generator パラメーターの名前は \"g\" で始まります。例を参照してください。",
        "api-pageset-param-redirects-generator": "<var>$1titles</var>, <var>$1pageids</var>, および <var>$1revids</var>, および <var>$1generator</var> によって返されたページの転送を自動的に解決する。",
+       "api-pageset-param-redirects-nogenerator": "<var>$1titles</var>, <var>$1pageids</var>, および <var>$1revids</var> の転送を自動的に解決する。",
        "api-help-title": "MediaWiki API ヘルプ",
        "api-help-lead": "このページは自動生成された MediaWiki API の説明文書ページです。\n\n説明文書と例: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "メイン モジュール",
diff --git a/includes/api/i18n/kn.json b/includes/api/i18n/kn.json
new file mode 100644 (file)
index 0000000..705512e
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Kamalaksha"
+               ]
+       },
+       "apihelp-query+watchlist-paramvalue-type-external": "ಬಾಹ್ಯ ಬದಲಾವಣೆಗಳು"
+}
index b39de68..ccd0dc3 100644 (file)
@@ -9,7 +9,8 @@
                        "Alex00728",
                        "Hwangjy9",
                        "Kurousagi",
-                       "Revi"
+                       "Revi",
+                       "Yearning"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류 및 경고]]를 참조하십시오.",
@@ -89,6 +90,7 @@
        "apihelp-query+pageswithprop-param-dir": "정렬 순서",
        "apihelp-query+prefixsearch-param-search": "문자열 검색",
        "apihelp-unblock-description": "사용자를 차단 해제합니다.",
+       "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.",
        "api-help-title": "미디어위키 API 도움말",
        "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "메인 모듈",
index c8f8ac4..d307fa7 100644 (file)
@@ -60,6 +60,7 @@
        "apihelp-delete-param-title": "De Övverschreff vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
        "apihelp-delete-param-pageid": "De Kännong vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
        "apihelp-delete-param-reason": "Der Jrond för et Fottschmiiße. Wann dä nit aanjejovve es, weed ene automattesch usjräschnete Jrond jenumme.",
+       "apihelp-delete-param-tags": "Donn de Makehronge änndere, di för dä Enndraach em Logbohch jesaz wähde sulle.",
        "apihelp-delete-param-watch": "Donn di Sigg en däm aktoälle Metmaacher sing Oppaßleß opnämme.",
        "apihelp-delete-param-watchlist": "Donn di Sigg op däm aktoälle Metmaacher sing Oppaßleß udder nemm se druß fott, donn de Enschtällonge nämme, udder donn de Oppaßleß jaa nit verändere.",
        "apihelp-delete-param-unwatch": "Schmihß di Sigg us däm aktoälle Metmaacher singe Oppaßless erus.",
        "apihelp-query+allredirects-example-unique": "Ongerscheidlijje Sigge opleste.",
        "apihelp-query+allredirects-example-unique-generator": "Hollt alle Zihlsigge un makkehr di (noch) nit doh sin.",
        "apihelp-query+allredirects-example-generator": "Holl de Sigge met de Ömleidonge.",
+       "apihelp-query+allrevisions-description": "Donn alle Väsjohne opleßte.",
+       "apihelp-query+allrevisions-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
+       "apihelp-query+allrevisions-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.",
+       "apihelp-query+allrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.",
+       "apihelp-query+allrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
+       "apihelp-query+allrevisions-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
+       "apihelp-query+allrevisions-param-generatetitles": "Wann als ene  Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
+       "apihelp-query+allrevisions-example-user": "Donn de läzde fuffzisch Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleßte.",
+       "apihelp-query+allrevisions-example-ns-main": "Donn de eezde fuffzisch Väsjohne em Houp-Appachemang opleßte.",
        "apihelp-query+alltransclusions-param-from": "De Övverschreff vun dä ennjeföhschte Sigg, woh de Leß medd aanfange sull.",
        "apihelp-query+alltransclusions-param-to": "De Övverschreff vun dä ennjeföhschte Sigg, woh et Zälle ophühre sull.",
        "apihelp-query+alltransclusions-param-prefix": "Söhk noh alle dä ennjeföhschte Sigge ier Övverschreffte, di met heh däm Täx aanfange.",
        "apihelp-query+recentchanges-param-limit": "Wi vill Änderonge ensjesammp zem aanzeije?",
        "apihelp-query+recentchanges-param-type": "Wat för en Zoot Änneronge aanzeije?",
        "apihelp-query+recentchanges-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Wann als ene  Jenerahtor enjesaz, brängk dat Kännonge vun Väsjohne un kein Övverschreffte. Enndrähsch en de neußte Änderonge der ohne en Väsjohnskännong, alsu de miehste Logbohchenndrähsch, bränge jaa nix.",
        "apihelp-query+recentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}",
        "apihelp-query+redirects-description": "Jiff alle Ömleijdonge noh dä aanjejovve Sigge uß.",
        "apihelp-query+redirects-param-prop": "Wat för en Eijeschaffte holle:",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Makkehronge vun dä Väsjohn.",
        "apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?",
        "apihelp-query+revisions+base-param-section": "Holl blohß der Ennhald vun däm Affschnett met heh dä Nommer.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Donn dä Täx ömsäze wi vör em Affseschere, ih de Ongerscheijde erus jefonge wähde. Jeihd blohß mem Parramehter <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1difftotext</var> zesamme.",
        "apihelp-query+search-description": "Söhk em jannze Täx.",
        "apihelp-query+search-param-search": "Söhk noh alle Övverschreffte vun Sigge udder Ennhallde, woh dä Wäät drop paß. Mer kann heh met besönder Aufjahbe beim Söhke schtälle, jeh nohdämm wadd_em Wikki sing Projramm för et Söhke esu alles kann.",
        "apihelp-query+search-param-namespace": "Söhk blohß en heh dä Appachtemangs.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä di Änderong jemaat hät.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Deiht de kännong vn äm Metmaacher derbei, dä di Änderong jemaat hät.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
-       "apihelp-query+watchlist-param-type": "Wat för en Änderonge aanzeije:\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">edit</code>:Jewöhnlejje Änderonge aan Sigge.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">external</code>:Änderonge vun Ußerhallef.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">new</code>:Neu aanjelahte Sigge.\n;<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">log</code>:Enndrähsch em Logbohch.",
+       "apihelp-query+watchlist-param-type": "Wat för en Änderonge aanzeije:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Jewöhnlejje Ännderonge aan Sigge.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Änderonge vun Ußerhallef.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Neu aanjelaate Sigge.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Enndrähsch em Logbohch",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Änderonge aan de Zohjehüreshkeit zoh Saachjroppe.",
        "apihelp-query+watchlistraw-description": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß holle.",
        "apihelp-query+watchlistraw-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
        "apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.",
        "apihelp-yamlfm-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"YAML Ain't Markup Language\">YAML</i>-Fommahd schöhn met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ußjävve.",
        "api-format-title": "Wat et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ußjohv.",
        "api-format-prettyprint-header-only-html": "Dat heh es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.",
-       "api-orm-param-props": "De Fällder zom Affrohre.",
-       "api-orm-param-limit": "De jrühßte Aanzahl vun Reihje zom zeröckjävve.",
        "api-pageset-param-titles": "En Leß vun Övverschreffte för ze beärbeide.",
        "api-pageset-param-pageids": "En Leß vun Kännonge vun Sigge för ze beärbeide.",
        "api-pageset-param-revids": "En Leß vun Kännonge vun Väsjohne för ze beärbeide.",
index bc072d7..a49c481 100644 (file)
@@ -38,6 +38,7 @@
        "apihelp-feedrecentchanges-param-hideanons": "Ännerunge vun anonyme Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ännerunge vum aktuelle Benotzer verstoppen.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ännerunge vun der Memberschaft a Kategorie verstoppen.",
        "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
        "apihelp-help-example-main": "Hëllef fir den Haaptmodul.",
        "apihelp-help-example-recursive": "All Hëllef op enger Säit",
        "apihelp-query+watchlist-paramvalue-prop-user": "Setzt de Benotzer derbäi deen d'Ännerung gemaach huet.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun der Ännerung derbäi.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Extern Ännerungen.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Ugeluecht Säiten.",
        "apihelp-query+watchlistraw-param-show": "Nëmmen Elementer opzielen déi dëse Critèren entspriechen.",
        "apihelp-query+watchlistraw-example-simple": "Säite vum aktuelle Benotzer senger Iwwerwaachungslëscht opzielen",
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
index 101d918..5ad108b 100644 (file)
@@ -5,7 +5,10 @@
                ]
        },
        "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
+       "apihelp-query+allrevisions-param-namespace": "Rodyti puslapius tik šioje vardų srityje.",
        "apihelp-query+backlinks-example-simple": "Rodyti nuorodas <kbd>Pagrindinis puslapis</kbd>.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Išoriniai keitimai.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
        "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
        "apihelp-stashedit-param-sectiontitle": "Naujo skyriaus pavadinimas.",
        "apihelp-stashedit-param-text": "Puslapio turinys."
index 1b62c5c..acb0b28 100644 (file)
@@ -9,6 +9,23 @@
        "apihelp-main-param-curtimestamp": "निकालात सद्य वेळठश्याचा अंतर्भाव करा.",
        "apihelp-block-description": "सदस्यास प्रतिबंधित करा.",
        "apihelp-block-param-user": "सदस्याचे नाव, अंक-पत्त्ता, किंवा प्रतिबंध करण्यासाठीचा आयपीचा आवाका.",
+       "apihelp-delete-description": "पान वगळा",
+       "apihelp-edit-param-minor": "छोटे संपादन",
+       "apihelp-edit-param-notminor": "छोटे नसलेले संपादन",
+       "apihelp-edit-example-edit": "पान संपादा",
+       "apihelp-login-param-name": "सदस्य नाव.",
+       "apihelp-login-param-password": "परवलीचा शब्द.",
+       "apihelp-login-example-login": "सनोंद-प्रवेश करा.",
+       "apihelp-move-description": "पृष्ठाचे स्थानांतरण करा.",
+       "apihelp-move-param-ignorewarnings": "सर्व सूचनांकडे दुर्लक्ष करा.",
+       "apihelp-options-example-reset": "पसंतीक्रमाची पुनर्स्थापना",
+       "apihelp-patrol-description": "पानावर किंवा आवृत्तीवर पहारा द्या.",
+       "apihelp-patrol-example-rcid": "अलीकडील बदलावर पहारा द्या.",
+       "apihelp-patrol-example-revid": "आवृत्तीवर पहारा द्या.",
+       "apihelp-protect-description": "पानाची सुरक्षापातळी बदला.",
+       "apihelp-protect-example-protect": "पानास सुरक्षित करा.",
+       "apihelp-query-param-list": "कोणती यादी मागवायची.",
+       "apihelp-query-param-meta": "कोणता मेटाडाटा हवा.",
        "apihelp-query+allrevisions-description": "सर्व आवृत्त्यांची यादी",
        "apihelp-query+allrevisions-param-user": "फक्त या सदस्याच्याच आवृत्त्यांची यादी करा",
        "apihelp-query+allrevisions-param-excludeuser": "या सदस्याच्या आवृत्त्यांची यादी करु नका.",
index b340d5e..2eb761d 100644 (file)
@@ -25,7 +25,7 @@
        "apihelp-main-param-curtimestamp": "Huidige tijd aan het antwoord toevoegen.",
        "apihelp-block-description": "Gebruiker blokkeren.",
        "apihelp-block-param-reason": "Reden voor blokkade.",
-       "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen in te loggen.",
+       "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.",
        "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.",
        "apihelp-createaccount-param-name": "Gebruikersnaam.",
        "apihelp-delete-description": "Verwijder een pagina.",
        "apihelp-expandtemplates-param-title": "Paginanaam.",
        "apihelp-feedcontributions-param-year": "Van jaar (en eerder).",
        "apihelp-feedcontributions-param-month": "Van maand (en eerder).",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filteren op label.",
        "apihelp-import-param-namespace": "Importeren in deze naamruimte. Can niet samen gebruikt worden met <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importeren als subpagina van deze pagina. Kan niet samen met <var>$1namespace</var> gebruikt worden.",
        "apihelp-login-param-name": "Gebruikersnaam.",
        "apihelp-login-param-password": "Wachtwoord.",
        "apihelp-login-param-domain": "Domein (optioneel).",
        "apihelp-login-example-login": "Aanmelden",
+       "apihelp-logout-description": "Afmelden en sessiegegevens wissen.",
+       "apihelp-logout-example-logout": "Meldt de huidige gebruiker af.",
+       "apihelp-managetags-param-tag": "Label om aan te maken, te activeren of te deactiveren. Voor het aanmaken van een label, mag het niet bestaan. Voor het verwijderen van een label, moet het bestaan. Voor het activeren van een label, moet het bestaan en mag het niet gebruikt worden door een uitbreiding. Voor het deactiveren van een label, moet het gebruikt worden en handmatig gedefinieerd zijn.",
        "apihelp-move-description": "Pagina hernoemen.",
        "apihelp-move-param-watch": "Pagina en de omleiding toevoegen aan de volglijst van de huidige gebruiker.",
        "apihelp-move-param-unwatch": "Verwijder de pagina en de doorverwijzing van de volglijst van de huidige gebruiker.",
-       "apihelp-move-param-watchlist": "De pagina onvoorwaardelijk toevoegen aan of verwijderen van de volglijst van de huidige gebruiker, gebruik voorkeuren of verander het volgen niet.",
+       "apihelp-move-param-watchlist": "De pagina onvoorwaardelijk toevoegen aan of verwijderen van de volglijst van de huidige gebruiker, gebruik voorkeuren of wijzig het volgen niet.",
        "apihelp-move-param-ignorewarnings": "Eventuele waarschuwingen negeren.",
        "apihelp-move-example-move": "Hernoem <kbd>Badtitle</kbd> naar <kbd>Goodtitle</kbd> zonder een doorverwijzing te laten staan.",
        "apihelp-opensearch-description": "Zoeken in de wiki met het OpenSearchprotocol.",
        "apihelp-opensearch-param-format": "Het uitvoerformaat.",
        "apihelp-opensearch-param-warningsaserror": "Als er waarschuwingen zijn met <kbd>format=json</kbd>, geef dan een API-fout terug in plaats van deze te negeren.",
        "apihelp-opensearch-example-te": "Pagina's vinden die beginnen met <kbd>Te</kbd>.",
-       "apihelp-options-description": "Voorkeuren van de huidige gebruiker wijzigen.\n\nAlleen opties die zijn geregistreerd in core of in een van de geïnstalleerde uitbreidingen, of opties met de toetsen aangeduid met \"userjs-\" (bedoeld om te worden gebruikt door gebruikersscripts), kunnen worden ingesteld.",
+       "apihelp-options-description": "Voorkeuren van de huidige gebruiker wijzigen.\n\nAlleen opties die zijn geregistreerd in core of in een van de geïnstalleerde uitbreidingen, of opties met de toetsen aangeduid met <code>userjs-</code> (bedoeld om te worden gebruikt door gebruikersscripts), kunnen worden ingesteld.",
        "apihelp-options-param-reset": "Zet de voorkeuren terug naar de standaard van de website.",
        "apihelp-options-param-resetkinds": "Lijst van de optiestypes die opnieuw ingesteld worden wanneer de optie <var>$1reset</var> is ingesteld.",
        "apihelp-options-param-change": "Lijst van wijzigingen, opgemaakt als <kbd>naam=waarde</kbd> (bijvoorbeeld <kbd>skin=vector</kbd>). De waarde kan geen sluistekens bevatten. Als er geen waarde wordt opgegeven (zelfs niet een is-gelijk teken), bijvoorbeeld, <kbd>optienaam|otheroption|...</kbd>, wordt de optie ingesteld op de standaardwaarde.",
-       "apihelp-options-param-optionname": "Een naam van een optie die moet worden ingesteld op de waarde gegeven door <var>$1optiewaarde</var>.",
-       "apihelp-options-param-optionvalue": "Een waarde van de optie opgegeven door <var>$1optienaam</var>, kan sluistekens (verticale streepjes) bevatten.",
+       "apihelp-options-param-optionname": "De naam van de optie die moet worden ingesteld op de waarde gegeven door <var>$1optiewaarde</var>.",
+       "apihelp-options-param-optionvalue": "De waarde voor de optie opgegeven door <var>$1optienaam</var>, kan sluistekens (verticale streepjes) bevatten.",
        "apihelp-options-example-reset": "Alle voorkeuren opnieuw instellen.",
-       "apihelp-options-example-change": "Voorkeuren veranderen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
+       "apihelp-options-example-change": "Voorkeuren wijzigen voor <kbd>skin</kbd> en <kbd>hideminor</kbd>.",
        "apihelp-parse-example-page": "Een pagina parseren.",
        "apihelp-parse-example-text": "Wikitext parseren.",
        "apihelp-parse-example-summary": "Een samenvatting parseren.",
        "apihelp-protect-example-protect": "Een pagina beveiligen",
+       "apihelp-query+alldeletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+allmessages-param-enableparser": "Stel in om de parser in te schakelen, zorgt voor het voorverwerken van de wikitekst van een bericht (vervangen van magische woorden, de afhandeling van sjablonen, enzovoort).",
+       "apihelp-query+blocks-paramvalue-prop-flags": "Labelt de blokkade met (automatische blokkade, alleen anoniem, enzovoort).",
+       "apihelp-query+deletedrevisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+deletedrevs-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+logevents-param-type": "Logboekregels alleen voor dit type filteren.",
+       "apihelp-query+logevents-param-tag": "Alleen logboekregels weergeven met dit label.",
+       "apihelp-query+logevents-example-simple": "Recente logboekregels weergeven.",
+       "apihelp-query+recentchanges-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Voegt logboekgegevens toe aan logboekregels (logboek-ID, logboektype, enzovoort).",
+       "apihelp-query+revisions-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+revisions+base-paramvalue-prop-tags": "Labels voor de versie.",
+       "apihelp-query+revisions+base-param-difftotextpst": "\"pre-save\"-transformatie uitvoeren op de tekst alvorens de verschillen te bepalen. Alleen geldig als dit wordt gebruikt met <var>$1difftotext</var>.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Geeft een lijst met bestandsextensies (bestandstypen) die geüpload mogen worden.",
+       "apihelp-query+tags-description": "Wijzigingslabels weergeven.",
+       "apihelp-query+tags-paramvalue-prop-name": "Voegt de naam van het label toe.",
+       "apihelp-query+tags-paramvalue-prop-displayname": "Voegt het systeembericht toe voor het label.",
+       "apihelp-query+tags-paramvalue-prop-description": "Voegt beschrijving van het label toe.",
+       "apihelp-query+tags-paramvalue-prop-defined": "Geeft aan of het label is gedefinieerd.",
+       "apihelp-query+tags-paramvalue-prop-active": "Of het label nog steeds wordt toegepast.",
+       "apihelp-query+usercontribs-param-tag": "Alleen versies weergeven met dit label.",
+       "apihelp-query+watchlist-paramvalue-prop-loginfo": "Voegt logboekgegevens toe waar van toepassing.",
+       "apihelp-query+watchlist-param-type": "Welke typen wijzigingen weer te geven:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Gewone paginabewerkingen.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Externe wijzigingen.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Nieuwe pagina's.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Logboekregels.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Wijzigingen in categorielidmaatschap.",
        "apihelp-stashedit-param-text": "Pagina-inhoud.",
+       "apihelp-json-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
+       "apihelp-php-param-formatversion": "Uitvoeropmaak:\n;1:Achterwaarts compatibele opmaak (XML-stijl booleans, <samp>*</samp>-sleutels voor contentnodes, enzovoort).\n;2:Experimentele moderne opmaak. Details kunnen wijzigen!\n;latest:Gebruik de meest recente opmaak (op het moment <kbd>2</kbd>), kan zonder waarschuwing wijzigen.",
+       "apihelp-rawfm-description": "Uitvoergegevens, inclusief debugelementen, opgemaakt in JSON (nette opmaak in HTML).",
        "api-help-flag-readrights": "Voor deze module zijn leesrechten nodig.",
        "api-help-flag-writerights": "Voor deze module zijn schrijfrechten nodig.",
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
index f3d8fcd..59c008e 100644 (file)
@@ -86,6 +86,7 @@
        "apihelp-feedcontributions-param-toponly": "Pokazuj tylko edycje będące ostatnią zmianą strony.",
        "apihelp-feedcontributions-param-newonly": "Pokazuj tylko edycje tworzące stronę.",
        "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.",
+       "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.",
        "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.",
        "apihelp-feedrecentchanges-param-invert": "Wszystkie przestrzenie nazw oprócz wybranej.",
        "apihelp-feedrecentchanges-param-days": "Dni, do których ograniczone są wyniki.",
index 76d94e2..a0d0502 100644 (file)
        "apihelp-createaccount-param-name": "کارن-نوم.",
        "apihelp-delete-description": "يو مخ ړنگول.",
        "apihelp-edit-description": "مخونه جوړول او سمول.",
+       "apihelp-edit-param-sectiontitle": "د يوې نوې برخې سرليک.",
        "apihelp-edit-param-text": "مخ مېنځپانگه.",
        "apihelp-edit-param-minor": "وړوکی سمون.",
+       "apihelp-edit-param-bot": "دا سمون د روباټ په توگه په نښه کول.",
        "apihelp-edit-example-edit": "يو مخ سمول.",
        "apihelp-emailuser-description": "کارن ته برېښليک لېږل.",
        "apihelp-expandtemplates-param-title": "د مخ سرليک.",
@@ -31,6 +33,7 @@
        "apihelp-query+search-example-simple": "د <kbd>meaning</kbd> پلټل.",
        "apihelp-query+search-example-text": "د <kbd>مانا</kbd> لپاره متنونه پلټل.",
        "apihelp-query+watchlist-paramvalue-prop-title": "د يو مخ سرليک ورگډوي.",
+       "apihelp-stashedit-param-sectiontitle": "د يوې نوې برخې سرليک.",
        "apihelp-tag-param-reason": "د بدلون سبب.",
        "apihelp-unblock-param-reason": "د بنديز ليرې کولو سبب.",
        "apihelp-upload-param-watch": "مخ کتل.",
index 96741ca..b1d27c8 100644 (file)
@@ -5,7 +5,8 @@
                        "Dianakc",
                        "Cainamarques",
                        "Rhcastilhos",
-                       "Macofe"
+                       "Macofe",
+                       "Almondega"
                ]
        },
        "apihelp-main-param-action": "Qual ação executar.",
        "apihelp-query+links-param-limit": "Quantos links retornar.",
        "apihelp-query+linkshere-param-limit": "Quantos retornar.",
        "apihelp-query+prefixsearch-param-limit": "O número máximo a se retornar.",
+       "apihelp-query+search-param-prop": "Que propriedades retornar:",
+       "apihelp-query+search-paramvalue-prop-size": "Adiciona o tamanho da página em bytes.",
+       "apihelp-query+search-paramvalue-prop-wordcount": "Adiciona a contagem de palavras da página.",
+       "apihelp-query+search-paramvalue-prop-timestamp": "Adiciona a marcação de data (timestamp) de quando a página foi editada pela última vez.",
+       "apihelp-query+search-paramvalue-prop-snippet": "Adiciona um fragmento analisado da página.",
+       "apihelp-query+search-paramvalue-prop-titlesnippet": "Adiciona um fragmento analisado do título da página.",
        "apihelp-query+search-param-limit": "Quantas páginas retornar.",
        "apihelp-query+templates-param-limit": "Quantas predefinições retornar.",
        "apihelp-query+transcludedin-param-limit": "Quantos retornar.",
index 9710e16..947c89b 100644 (file)
        "apihelp-feedrecentchanges-param-hideliu": "{{doc-apihelp-param|feedrecentchanges|hideliu}}",
        "apihelp-feedrecentchanges-param-hidepatrolled": "{{doc-apihelp-param|feedrecentchanges|hidepatrolled}}",
        "apihelp-feedrecentchanges-param-hidemyself": "{{doc-apihelp-param|feedrecentchanges|hidemyself}}",
+       "apihelp-feedrecentchanges-param-hidecategorization": "{{doc-apihelp-param|feedrecentchanges|hidecategorization}}",
        "apihelp-feedrecentchanges-param-tagfilter": "{{doc-apihelp-param|feedrecentchanges|tagfilter}}",
        "apihelp-feedrecentchanges-param-target": "{{doc-apihelp-param|feedrecentchanges|target}}",
        "apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}",
        "apihelp-query+revisions+base-param-section": "{{doc-apihelp-param|query+revisions+base|section|description=the \"section\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-diffto": "{{doc-apihelp-param|query+revisions+base|diffto|description=the \"diffto\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-difftotext": "{{doc-apihelp-param|query+revisions+base|difftotext|description=the \"difftotext\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-difftotextpst": "{{doc-apihelp-param|query+revisions+base|difftotextpst|description=the \"difftotextpst\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+revisions+base-param-contentformat": "{{doc-apihelp-param|query+revisions+base|contentformat|description=the \"contentformat\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+search-description": "{{doc-apihelp-description|query+search}}",
        "apihelp-query+search-param-search": "{{doc-apihelp-param|query+search|search}}",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "{{doc-apihelp-paramvalue|query+watchlist|prop|loginfo}}",
        "apihelp-query+watchlist-param-show": "{{doc-apihelp-param|query+watchlist|show}}",
        "apihelp-query+watchlist-param-type": "{{doc-apihelp-param|query+watchlist|type}}",
+       "apihelp-query+watchlist-paramvalue-type-edit": "{{doc-apihelp-paramvalue|query+watchlist|type|edit}}",
+       "apihelp-query+watchlist-paramvalue-type-external": "{{doc-apihelp-paramvalue|query+watchlist|type|external}}",
+       "apihelp-query+watchlist-paramvalue-type-new": "{{doc-apihelp-paramvalue|query+watchlist|type|new}}",
+       "apihelp-query+watchlist-paramvalue-type-log": "{{doc-apihelp-paramvalue|query+watchlist|type|log}}",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "{{doc-apihelp-paramvalue|query+watchlist|type|categorize}}",
        "apihelp-query+watchlist-param-owner": "{{doc-apihelp-param|query+watchlist|owner}}",
        "apihelp-query+watchlist-param-token": "{{doc-apihelp-param|query+watchlist|token}}",
        "apihelp-query+watchlist-example-simple": "{{doc-apihelp-example|query+watchlist}}",
        "api-format-title": "{{technical}}\nPage title when API output is pretty-printed in HTML.",
        "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
        "api-format-prettyprint-header-only-html": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but there is no non-html module.\n\nParameters:\n* $1 - Format name",
-       "api-orm-param-props": "{{doc-apihelp-param|orm|props|description=the \"props\" parameter in subclasses of ApiQueryORM}}",
-       "api-orm-param-limit": "{{doc-apihelp-param|orm|limit|description=the \"limit\" parameter in subclasses of ApiQueryORM}}",
        "api-pageset-param-titles": "{{doc-apihelp-param|pageset|titles|description=the \"titles\" parameter in pageset-using modules}}",
        "api-pageset-param-pageids": "{{doc-apihelp-param|pageset|pageids|description=the \"pageids\" parameter in pageset-using modules}}",
        "api-pageset-param-revids": "{{doc-apihelp-param|pageset|revids|description=the \"revids\" parameter in pageset-using modules}}",
index dfc30a8..134ca2c 100644 (file)
@@ -11,7 +11,8 @@
                        "Ochilov",
                        "Nzeemin",
                        "INS Pirat",
-                       "Macofe"
+                       "Macofe",
+                       "Краснорядцева Елена"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки, и может измениться в любой момент. Подпишитесь на  [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом \"MediaWiki-API-Error\", после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].",
        "apihelp-query+revisions-example-first5-user": "Получить 5 первых версий <kbd>Main Page</kbd> которые созданы пользователями <kbd>MediaWiki default</kbd>.",
        "apihelp-query+revisions+base-param-limit": "Ограничение на количество версий которое будут вовзращено",
        "apihelp-query+search-description": "Выполнить полнотекстовый поиск.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Возвращает список расширений (типы файлов), которые доступны к загрузке",
        "apihelp-query+tags-description": "Список изменерий тегов.",
        "apihelp-query+tags-example-simple": "Лист доступных тегов",
        "apihelp-query+templates-param-namespace": "Показывать шаблоны только из данного списка имен",
        "apihelp-xml-description": "Выходные данные в формате XML.",
        "apihelp-yaml-description": "Выходные данные в формате yaml.",
        "api-format-title": "Результат MediaWiki API",
-       "api-orm-param-props": "Поля для запроса.",
-       "api-orm-param-limit": "Максимальное количество возвращаемых строк.",
        "api-pageset-param-titles": "Список заголовков для работы.",
        "api-pageset-param-pageids": "Список страниц идентификаторов для работы.",
        "api-pageset-param-revids": "Список идентификаторов версий для работы.",
        "api-help-title": "Справка MediaWiki API",
        "api-help-main-header": "Главный модуль",
-       "api-help-flag-deprecated": "ЭÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\83Ñ\81Ñ\82аÑ\80евÑ\88им.",
+       "api-help-flag-deprecated": "ЭÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c Ñ\83Ñ\81Ñ\82аÑ\80ел.",
        "api-help-flag-readrights": "Этот модуль требует прав на чтение.",
        "api-help-flag-writerights": "Этот модуль требует права на запись.",
        "api-help-flag-mustbeposted": "Этот модуль принимает только Post-запросы.",
diff --git a/includes/api/i18n/sd.json b/includes/api/i18n/sd.json
new file mode 100644 (file)
index 0000000..00a16d6
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mehtab ahmed",
+                       "Aursani"
+               ]
+       },
+       "apihelp-query+allrevisions-description": "سمورن مسودن جي فهرست پيش ڪريو.",
+       "apihelp-query+watchlist-param-type": "ڪهڙن قسمن جون تبديليون ڏيکارڻ لاءِ:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "عام صفحي ترميمون.",
+       "apihelp-query+watchlist-paramvalue-type-external": "خارجي تبديليون.",
+       "apihelp-query+watchlist-paramvalue-type-new": "صفحن جون تخليقون.",
+       "apihelp-query+watchlist-paramvalue-type-log": "لاگ داخلائون."
+}
diff --git a/includes/api/i18n/tcy.json b/includes/api/i18n/tcy.json
new file mode 100644 (file)
index 0000000..bdee17e
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Bharathesha Alasandemajalu"
+               ]
+       },
+       "apihelp-query+watchlist-param-type": "ವಾ ನಮೂನೆದ ಬದಲಾವಣೆ ತೊಜವೋಡು",
+       "apihelp-query+watchlist-paramvalue-type-external": "ಪಿದಯೀದ ಬದಲಾವಣೇ",
+       "apihelp-query+watchlist-paramvalue-type-new": "ಪಾಲೆ ಉಂಡುಮಾನ್ಪುನಾ"
+}
index 8678f2a..d727c8a 100644 (file)
@@ -1,8 +1,10 @@
 {
        "@metadata": {
                "authors": [
-                       "Veeven"
+                       "Veeven",
+                       "HAUSANRIK"
                ]
        },
-       "apihelp-feedrecentchanges-example-simple": "ఇటీవలి మార్పులను చూడండి"
+       "apihelp-feedrecentchanges-example-simple": "ఇటీవలి మార్పులను చూడండి",
+       "apihelp-rawfm-description": "బయటకు వచ్చిన సమాచారo, డీబగ్గింగ్ అంశముతొ కలిపి, JSON పద్ధతిలొ (HTMLలో అందంగా-ముద్రించు)"
 }
index 4b61085..997c6ac 100644 (file)
@@ -3,9 +3,12 @@
                "authors": [
                        "Sayginer",
                        "Sadrettin",
-                       "Uğurkent"
+                       "Uğurkent",
+                       "Gorizon"
                ]
        },
+       "apihelp-block-description": "Kullanıcıyı engelle",
+       "apihelp-block-param-reason": "Engelleme sebebi",
        "apihelp-createaccount-param-name": "Kullanıcı adı.",
        "apihelp-createaccount-param-password": "Parola (ignored if <var>$1mailpassword</var> is set).",
        "apihelp-createaccount-param-email": "Kullanıcının e-posta adresi (isteğe bağlı).",
index 08237f3..e195520 100644 (file)
        "api-format-title": "Результат запиту до API MediaWiki",
        "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметру <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
-       "api-orm-param-props": "Поля до запиту.",
-       "api-orm-param-limit": "Яке максимальне число рядків повернути.",
        "api-pageset-param-titles": "Список назв над якими працювати.",
        "api-pageset-param-pageids": "Список ідентифікаторів сторінок над якими працювати.",
        "api-pageset-param-revids": "Список ідентифікаторів версій над якими працювати.",
index 62e3618..b4275b5 100644 (file)
@@ -75,6 +75,7 @@
        "apihelp-delete-param-title": "你所希望删除的页面的标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-delete-param-pageid": "要删除的页面的页面 ID。不能与<var>$1title</var>一起使用。",
        "apihelp-delete-param-reason": "删除原因。如果未设置,将使用一个自动生成的原因。",
+       "apihelp-delete-param-tags": "要在删除日志中应用到实体的更改标签。",
        "apihelp-delete-param-watch": "将该页面加入当前用户的监视列表。",
        "apihelp-delete-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-delete-param-unwatch": "将该页面从当前用户的监视列表删除。",
        "apihelp-feedrecentchanges-param-hideliu": "隐藏注册用户做出的更改。",
        "apihelp-feedrecentchanges-param-hidepatrolled": "隐藏已巡查更改。",
        "apihelp-feedrecentchanges-param-hidemyself": "隐藏当前用户做出的更改。",
+       "apihelp-feedrecentchanges-param-hidecategorization": "隐藏分类成员更改。",
        "apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。",
        "apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。",
        "apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。",
        "apihelp-query+allredirects-example-unique": "列出孤立目标页面。",
        "apihelp-query+allredirects-example-unique-generator": "获取所有目标页面,标记丢失的。",
        "apihelp-query+allredirects-example-generator": "获取包含重定向的页面。",
+       "apihelp-query+allrevisions-description": "列举所有修订。",
+       "apihelp-query+allrevisions-param-start": "枚举的起始时间戳。",
+       "apihelp-query+allrevisions-param-end": "枚举的结束时间戳。",
+       "apihelp-query+allrevisions-param-user": "只列出此用户做出的修订。",
+       "apihelp-query+allrevisions-param-excludeuser": "不要列出此用户做出的修订。",
+       "apihelp-query+allrevisions-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+allrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
+       "apihelp-query+allrevisions-example-user": "列出由用户<kbd>Example</kbd>作出的最近50次贡献。",
+       "apihelp-query+allrevisions-example-ns-main": "列举主名字空间中的前50次修订。",
        "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
        "apihelp-query+alltransclusions-param-from": "要列举的起始嵌入标题。",
        "apihelp-query+alltransclusions-param-to": "要列举的最终嵌入标题。",
        "apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
        "apihelp-query+recentchanges-param-type": "显示的更改类型。",
+       "apihelp-query+recentchanges-param-generaterevisions": "当作为生成器使用时,生成修订ID而不是标题。不带关联修订ID的最近更改记录(例如大多数日志记录)将不会生成任何东西。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表。",
        "apihelp-query+recentchanges-example-generator": "获取有关最近未巡查更改的页面信息。",
        "apihelp-query+redirects-description": "返回至指定页面的所有重定向。",
        "apihelp-query+revisions+base-param-section": "只检索此段落数的内容。",
        "apihelp-query+revisions+base-param-diffto": "要比较修订差异的修订ID。使用<kbd>prev</kbd>、<kbd>next</kbd>和<kbd>cur</kbd>分别用于上个、下个和当前修订。",
        "apihelp-query+revisions+base-param-difftotext": "要比较修订差异的文本。只有修订的有限数字内的差异。覆盖<var>$1diffto</var>。如果<var>$1section</var>被设置,只有那个段落将与此文本之间比较差异",
+       "apihelp-query+revisions+base-param-difftotextpst": "在编辑文本前对其执行预保存转换。只当与<var>$1difftotext</var>一起使用时有效。",
        "apihelp-query+revisions+base-param-contentformat": "序列化用于<var>$1difftotext</var>的格式并预估内容输出。",
        "apihelp-query+search-description": "执行一次全文本搜索。",
        "apihelp-query+search-param-search": "搜索所有匹配此值的页面标题或内容。根据wiki的搜索后端工具,您可以使用搜索字符串以调用特殊搜索功能。",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "返回用户组及其相关权限。",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "返回wiki上安装的库。",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "返回wiki上安装的扩展。",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "返回允许上传的文件扩展名列表。",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "返回允许上传的文件扩展名(文件类型)列表。",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "如果可用,返回wiki的版权信息。",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "返回可用的编辑限制(保护)类型信息。",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "返回MediaWiki支持的语言列表(可选择使用<var>$1inlanguagecode</var>本地化)。",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "添加页面的旧有长度和新长度。",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "添加最近被通知有关编辑的用户的时间戳。",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "在适当位置添加日志信息。",
-       "apihelp-query+watchlist-param-type": "要显示的更改类型:\n;edit:定期页面编辑。\n;external:外部更改。\n;new:页面创建。\n;log:日志记录。",
+       "apihelp-query+watchlist-param-type": "要显示的更改类型:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "普通页面编辑。",
+       "apihelp-query+watchlist-paramvalue-type-external": "外部更改。",
+       "apihelp-query+watchlist-paramvalue-type-new": "页面创建。",
+       "apihelp-query+watchlist-paramvalue-type-log": "日志记录。",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "分类成员组更改。",
        "apihelp-query+watchlist-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlist-example-simple": "在当前用户的监视列表中列出用于最近更改页面的最新修订。",
        "apihelp-query+watchlist-example-props": "在当前用户的监视列表中检索有关用于最近更改页面的最新修订的额外信息。",
        "apihelp-stashedit-param-sectiontitle": "新段落的标题。",
        "apihelp-stashedit-param-text": "页面内容。",
        "apihelp-stashedit-param-contentmodel": "新内容的内容模型。",
+       "apihelp-stashedit-param-baserevid": "基础修订的修订ID。",
        "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。",
        "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。",
        "apihelp-tag-param-revid": "要添加或移除标签的一个或更多的修订ID。",
        "apihelp-php-description": "输出数据为序列化PHP格式。",
        "apihelp-php-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
-       "apihelp-rawfm-description": "è¾\93å\87ºæ\95°æ\8d®ä¸ºJSONæ ¼å¼\8fï¼\8c带调试元素(HTML优质打印效果)。",
+       "apihelp-rawfm-description": "è¾\93å\87ºæ\95°æ\8d®ä¸ºJSONæ ¼å¼\8fï¼\8cå\8c\85å\90«调试元素(HTML优质打印效果)。",
        "apihelp-txt-description": "输出数据为PHP的<code>print_r()</code>格式。",
        "apihelp-txtfm-description": "输出数据为PHP的<code>print_r()</code>格式(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
        "api-format-title": "MediaWiki API 结果",
        "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML表示,设置<kbd>format=$2</kbd>。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。",
        "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
-       "api-orm-param-props": "要查询的字段。",
-       "api-orm-param-limit": "返回的总行数。",
        "api-pageset-param-titles": "要工作的标题列表。",
        "api-pageset-param-pageids": "要工作的页面ID列表。",
        "api-pageset-param-revids": "要工作的修订ID列表。",
index 549ac84..1323c70 100644 (file)
@@ -53,6 +53,7 @@ class BacklinkCache {
         * @see BacklinkCache::partitionResult()
         *
         * Cleared with BacklinkCache::clear()
+        * @var array[]
         */
        protected $partitionCache = array();
 
@@ -62,6 +63,7 @@ class BacklinkCache {
         *
         * Initialized with BacklinkCache::getLinks()
         * Cleared with BacklinkCache::clear()
+        * @var ResultWrapper[]
         */
        protected $fullResultCache = array();
 
@@ -323,8 +325,9 @@ class BacklinkCache {
         * @return int
         */
        public function getNumLinks( $table, $max = INF ) {
-               global $wgMemc, $wgUpdateRowsPerJob;
+               global $wgUpdateRowsPerJob;
 
+               $cache = ObjectCache::getMainWANInstance();
                // 1) try partition cache ...
                if ( isset( $this->partitionCache[$table] ) ) {
                        $entry = reset( $this->partitionCache[$table] );
@@ -340,7 +343,7 @@ class BacklinkCache {
                $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
 
                // 3) ... fallback to memcached ...
-               $count = $wgMemc->get( $memcKey );
+               $count = $cache->get( $memcKey );
                if ( $count ) {
                        return min( $max, $count );
                }
@@ -355,7 +358,7 @@ class BacklinkCache {
                        // Fetch the full title info, since the caller will likely need it next
                        $count = $this->getLinks( $table, false, false, $max )->count();
                        if ( $count < $max ) { // full count
-                               $wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
+                               $cache->set( $memcKey, $count, self::CACHE_EXPIRY );
                        }
                }
 
@@ -372,8 +375,6 @@ class BacklinkCache {
         * @return array
         */
        public function partition( $table, $batchSize ) {
-               global $wgMemc;
-
                // 1) try partition cache ...
                if ( isset( $this->partitionCache[$table][$batchSize] ) ) {
                        wfDebug( __METHOD__ . ": got from partition cache\n" );
@@ -381,6 +382,7 @@ class BacklinkCache {
                        return $this->partitionCache[$table][$batchSize]['batches'];
                }
 
+               $cache = ObjectCache::getMainWANInstance();
                $this->partitionCache[$table][$batchSize] = false;
                $cacheEntry =& $this->partitionCache[$table][$batchSize];
 
@@ -400,7 +402,7 @@ class BacklinkCache {
                );
 
                // 3) ... fallback to memcached ...
-               $memcValue = $wgMemc->get( $memcKey );
+               $memcValue = $cache->get( $memcKey );
                if ( is_array( $memcValue ) ) {
                        $cacheEntry = $memcValue;
                        wfDebug( __METHOD__ . ": got from memcached $memcKey\n" );
@@ -432,11 +434,11 @@ class BacklinkCache {
                }
 
                // Save partitions to memcached
-               $wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
+               $cache->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
 
                // Save backlink count to memcached
                $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
-               $wgMemc->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY );
+               $cache->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY );
 
                wfDebug( __METHOD__ . ": got from database\n" );
 
index 2abcabd..0a45b8e 100644 (file)
@@ -98,7 +98,7 @@ class DependencyWrapper {
         * it will be generated with the callback function (if present), and the newly
         * calculated value will be stored to the cache in a wrapper.
         *
-        * @param BagOStuff $cache A cache object such as $wgMemc
+        * @param BagOStuff $cache A cache object
         * @param string $key The cache key
         * @param int $expiry The expiry timestamp or interval in seconds
         * @param bool|callable $callback The callback for generating the value, or false
index 5632596..360420b 100644 (file)
@@ -235,8 +235,8 @@ abstract class FileCacheBase {
         * @return void
         */
        public function incrMissesRecent( WebRequest $request ) {
-               global $wgMemc;
                if ( mt_rand( 0, self::MISS_FACTOR - 1 ) == 0 ) {
+                       $cache = ObjectCache::getLocalClusterInstance();
                        # Get a large IP range that should include the user  even if that
                        # person's IP address changes
                        $ip = $request->getIP();
@@ -249,17 +249,17 @@ abstract class FileCacheBase {
 
                        # Bail out if a request already came from this range...
                        $key = wfMemcKey( get_class( $this ), 'attempt', $this->mType, $this->mKey, $ip );
-                       if ( $wgMemc->get( $key ) ) {
+                       if ( $cache->get( $key ) ) {
                                return; // possibly the same user
                        }
-                       $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+                       $cache->set( $key, 1, self::MISS_TTL_SEC );
 
                        # Increment the number of cache misses...
                        $key = $this->cacheMissKey();
-                       if ( $wgMemc->get( $key ) === false ) {
-                               $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+                       if ( $cache->get( $key ) === false ) {
+                               $cache->set( $key, 1, self::MISS_TTL_SEC );
                        } else {
-                               $wgMemc->incr( $key );
+                               $cache->incr( $key );
                        }
                }
        }
@@ -269,9 +269,9 @@ abstract class FileCacheBase {
         * @return int
         */
        public function getMissesRecent() {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
-               return self::MISS_FACTOR * $wgMemc->get( $this->cacheMissKey() );
+               return self::MISS_FACTOR * $cache->get( $this->cacheMissKey() );
        }
 
        /**
index 3db84a6..93b4b57 100644 (file)
@@ -88,7 +88,11 @@ class LinkCache {
        }
 
        /**
-        * General accessor to get/set whether SELECT FOR UPDATE should be used
+        * General accessor to get/set whether the master DB should be used
+        *
+        * This used to also set the FOR UPDATE option (locking the rows read
+        * in order to avoid link table inconsistency), which was later removed
+        * for performance on wikis with a high edit rate.
         *
         * @param bool $update
         * @return bool
@@ -200,31 +204,6 @@ class LinkCache {
                $this->mGoodLinks->clear( array( $dbkey ) );
        }
 
-
-       /**
-        * @deprecated since 1.26
-        * @return array
-        */
-       public function getGoodLinks() {
-               wfDeprecated( __METHOD__, '1.26' );
-               $links = array();
-               foreach ( $this->mGoodLinks->getAllKeys() as $key ) {
-                       $info = $this->mGoodLinks->get( $key );
-                       $links[$key] = $info['id'];
-               }
-
-               return $links;
-       }
-
-       /**
-        * @deprecated since 1.26
-        * @return array
-        */
-       public function getBadLinks() {
-               wfDeprecated( __METHOD__, '1.26' );
-               return $this->mBadLinks->getAllKeys();
-       }
-
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
         *
index 63d8c7e..6290eae 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource message blobs storage used by the resource loader.
+ * Resource message blobs storage used by ResourceLoader.
  *
  * 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
@@ -23,8 +23,8 @@
  */
 
 /**
- * This class provides access to the resource message blobs storage used by
- * the ResourceLoader.
+ * This class provides access to the resource message blobs storage used
+ * by ResourceLoader.
  *
  * A message blob is a JSON object containing the interface messages for a
  * certain resource in a certain language. These message blobs are cached
@@ -374,7 +374,6 @@ class MessageBlobStore {
                        return array();
                }
 
-               $config = $resourceLoader->getConfig();
                $retval = array();
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'msg_resource',
@@ -390,13 +389,10 @@ class MessageBlobStore {
                                throw new MWException( __METHOD__ . ' passed an invalid module name' );
                        }
 
-                       // Update the module's blobs if the set of messages changed or if the blob is
-                       // older than the CacheEpoch setting
-                       $keys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
-                       $values = array_values( array_unique( $module->getMessages() ) );
-                       if ( $keys !== $values
-                               || wfTimestamp( TS_MW, $row->mr_timestamp ) <= $config->get( 'CacheEpoch' )
-                       ) {
+                       // Update the module's blob if the list of messages changed
+                       $blobKeys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
+                       $moduleMsgs = array_values( array_unique( $module->getMessages() ) );
+                       if ( $blobKeys !== $moduleMsgs ) {
                                $retval[$row->mr_resource] = $this->updateModule( $row->mr_resource, $module, $lang );
                        } else {
                                $retval[$row->mr_resource] = $row->mr_blob;
index ef70589..ae746e3 100644 (file)
@@ -154,7 +154,7 @@ class MessageCache {
                $this->mExpiry = $expiry;
 
                if ( $wgUseLocalMessageCache ) {
-                       $this->localCache = ObjectCache::newAccelerator( CACHE_NONE );
+                       $this->localCache = ObjectCache::getLocalServerInstance( CACHE_NONE );
                } else {
                        $this->localCache = wfGetCache( CACHE_NONE );
                }
@@ -574,7 +574,7 @@ class MessageCache {
 
                foreach ( $codes as $code ) {
                        $sidebarKey = wfMemcKey( 'sidebar', $code );
-                       $this->wanCache->delete( $sidebarKey, 5 );
+                       $this->wanCache->delete( $sidebarKey );
                }
 
                // Update the message in the message blob store
@@ -675,7 +675,7 @@ class MessageCache {
                                'hash' => $cache['HASH'],
                                'latest' => isset( $cache['LATEST'] ) ? $cache['LATEST'] : 0
                        ),
-                       WANObjectCache::TTL_NONE
+                       WANObjectCache::TTL_INDEFINITE
                );
        }
 
index 9e73ebe..b4086f9 100644 (file)
@@ -47,7 +47,8 @@ class CategoryMembershipChange {
 
        /**
         * @var int
-        * Number of pages this WikiPage is embedded by; set by CategoryMembershipChange::setRecursive()
+        * Number of pages this WikiPage is embedded by
+        * Set by CategoryMembershipChange::checkTemplateLinks()
         */
        private $numTemplateLinks = 0;
 
@@ -239,7 +240,7 @@ class CategoryMembershipChange {
         * @param int $type may be CategoryMembershipChange::CATEGORY_ADDITION
         * or CategoryMembershipChange::CATEGORY_REMOVAL
         * @param array $params
-        * - prefixedUrl: result of Title::->getPrefixedURL()
+        * - prefixedText: result of Title::->getPrefixedText()
         *
         * @return string
         */
index fdc9944..9ac6c32 100644 (file)
@@ -76,6 +76,21 @@ class ChangesList extends ContextSource {
                }
        }
 
+       /**
+        * Format a line
+        *
+        * @since 1.27
+        *
+        * @param RecentChange $rc Passed by reference
+        * @param bool $watched (default false)
+        * @param int $linenumber (default null)
+        *
+        * @return string|bool
+        */
+       public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
+               throw new RuntimeException( 'recentChangesLine should be implemented' );
+       }
+
        /**
         * Sets the list to use a "<li class='watchlist-(namespace)-(page)'>" tag
         * @param bool $value
@@ -305,7 +320,11 @@ class ChangesList extends ContextSource {
         */
        public function insertDiffHist( &$s, &$rc, $unpatrolled ) {
                # Diff link
-               if ( $rc->mAttribs['rc_type'] == RC_NEW || $rc->mAttribs['rc_type'] == RC_LOG ) {
+               if (
+                       $rc->mAttribs['rc_type'] == RC_NEW ||
+                       $rc->mAttribs['rc_type'] == RC_LOG ||
+                       $rc->mAttribs['rc_type'] == RC_CATEGORIZE
+               ) {
                        $diffLink = $this->message['diff'];
                } elseif ( !self::userCan( $rc, Revision::DELETED_TEXT, $this->getUser() ) ) {
                        $diffLink = $this->message['diff'];
@@ -323,17 +342,22 @@ class ChangesList extends ContextSource {
                                $query
                        );
                }
-               $diffhist = $diffLink . $this->message['pipe-separator'];
-               # History link
-               $diffhist .= Linker::linkKnown(
-                       $rc->getTitle(),
-                       $this->message['hist'],
-                       array(),
-                       array(
-                               'curid' => $rc->mAttribs['rc_cur_id'],
-                               'action' => 'history'
-                       )
-               );
+               if ( $rc->mAttribs['rc_type'] == RC_CATEGORIZE ) {
+                       $diffhist = $diffLink . $this->message['pipe-separator'] . $this->message['hist'];
+               } else {
+                       $diffhist = $diffLink . $this->message['pipe-separator'];
+                       # History link
+                       $diffhist .= Linker::linkKnown(
+                               $rc->getTitle(),
+                               $this->message['hist'],
+                               array(),
+                               array(
+                                       'curid' => $rc->mAttribs['rc_cur_id'],
+                                       'action' => 'history'
+                               )
+                       );
+               }
+
                // @todo FIXME: Hard coded ". .". Is there a message for this? Should there be?
                $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() .
                        ' <span class="mw-changeslist-separator">. .</span> ';
@@ -630,4 +654,19 @@ class ChangesList extends ContextSource {
 
                return false;
        }
+
+       /**
+        * Determines whether a revision is linked to this change; this may not be the case
+        * when the categorization wasn't done by an edit but a conditional parser function
+        *
+        * @since 1.27
+        *
+        * @param RecentChange|RCCacheEntry $rcObj
+        * @return bool
+        */
+       protected function isCategorizationWithoutRevision( $rcObj ) {
+               return intval( $rcObj->getAttribute( 'rc_type' ) ) === RC_CATEGORIZE
+                       && intval( $rcObj->getAttribute( 'rc_this_oldid' ) ) === 0;
+       }
+
 }
index 1dcb7ae..0883982 100644 (file)
@@ -83,15 +83,16 @@ class EnhancedChangesList extends ChangesList {
        /**
         * Format a line for enhanced recentchange (aka with javascript and block of lines).
         *
-        * @param RecentChange $baseRC
+        * @param RecentChange $rc
         * @param bool $watched
+        * @param int $linenumber (default null)
         *
         * @return string
         */
-       public function recentChangesLine( &$baseRC, $watched = false ) {
+       public function recentChangesLine( &$rc, $watched = false, $linenumber = null ) {
 
                $date = $this->getLanguage()->userDate(
-                       $baseRC->mAttribs['rc_timestamp'],
+                       $rc->mAttribs['rc_timestamp'],
                        $this->getUser()
                );
 
@@ -106,7 +107,7 @@ class EnhancedChangesList extends ChangesList {
                        $this->lastdate = $date;
                }
 
-               $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $baseRC, $watched );
+               $cacheEntry = $this->cacheEntryFactory->newFromRecentChange( $rc, $watched );
                $this->addCacheEntry( $cacheEntry );
 
                return $ret;
@@ -405,6 +406,8 @@ class EnhancedChangesList extends ChangesList {
 
                if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
                        $data['logEntry'] = $this->insertLogEntry( $rcObj );
+               } elseif ( $this->isCategorizationWithoutRevision( $rcObj ) ) {
+                       $data['comment'] = $this->insertComment( $rcObj );
                } else {
                        # User links
                        $data['userLink'] = $rcObj->userlink;
@@ -497,7 +500,7 @@ class EnhancedChangesList extends ChangesList {
                /** @var $block0 RecentChange */
                $block0 = $block[0];
                $last = $block[count( $block ) - 1];
-               if ( !$allLogs ) {
+               if ( !$allLogs && $rcObj->mAttribs['rc_type'] != RC_CATEGORIZE ) {
                        if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ) {
                                $links['total-changes'] = $nchanges[$n];
                        } elseif ( $isnew ) {
@@ -529,7 +532,7 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # History
-               if ( $allLogs ) {
+               if ( $allLogs || $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE ) {
                        // don't show history link for logs
                } elseif ( $namehidden || !$block0->getTitle()->exists() ) {
                        $links['history'] = $this->message['enhancedrc-history'];
@@ -605,15 +608,9 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # Diff and hist links
-               if ( $type != RC_LOG ) {
+               if ( $type != RC_LOG && $type != RC_CATEGORIZE ) {
                        $query['action'] = 'history';
-                       $data['historyLink'] = ' ' . $this->msg( 'parentheses' )
-                               ->rawParams( $rcObj->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
-                                       $rcObj->getTitle(),
-                                       $this->message['hist'],
-                                       array(),
-                                       $query
-                               ) )->escaped();
+                       $data['historyLink'] = $this->getDiffHistLinks( $rcObj, $query );
                }
                $data['separatorAfterLinks'] = ' <span class="mw-changeslist-separator">. .</span> ';
 
@@ -628,10 +625,15 @@ class EnhancedChangesList extends ChangesList {
 
                if ( $type == RC_LOG ) {
                        $data['logEntry'] = $this->insertLogEntry( $rcObj );
+               } elseif ( $this->isCategorizationWithoutRevision( $rcObj ) ) {
+                       $data['comment'] = $this->insertComment( $rcObj );
                } else {
                        $data['userLink'] = $rcObj->userlink;
                        $data['userTalkLink'] = $rcObj->usertalklink;
                        $data['comment'] = $this->insertComment( $rcObj );
+                       if ( $type == RC_CATEGORIZE ) {
+                               $data['historyLink'] = $this->getDiffHistLinks( $rcObj, $query );
+                       }
                        $data['rollback'] = $this->getRollback( $rcObj );
                }
 
@@ -672,6 +674,33 @@ class EnhancedChangesList extends ChangesList {
                return $line;
        }
 
+       /**
+        * Returns value to be used in 'historyLink' element of $data param in
+        * EnhancedChangesListModifyBlockLineData hook.
+        *
+        * @since 1.27
+        *
+        * @param RCCacheEntry $rc
+        * @param array $query array of key/value pairs to append as a query string
+        * @return string HTML
+        */
+       public function getDiffHistLinks( RCCacheEntry $rc, array $query ) {
+               $pageTitle = $rc->getTitle();
+               if ( $rc->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) {
+                       // For categorizations we must swap the category title with the page title!
+                       $pageTitle = Title::newFromID( $rc->getAttribute( 'rc_cur_id' ) );
+               }
+
+               $retVal = ' ' . $this->msg( 'parentheses' )
+                               ->rawParams( $rc->difflink . $this->message['pipe-separator'] . Linker::linkKnown(
+                                               $pageTitle,
+                                               $this->message['hist'],
+                                               array(),
+                                               $query
+                                       ) )->escaped();
+               return $retVal;
+       }
+
        /**
         * If enhanced RC is in use, this function takes the previously cached
         * RC lines, arranges them, and outputs the HTML
index 4ce564d..31b355d 100644 (file)
@@ -87,7 +87,6 @@ class OldChangesList extends ChangesList {
                // Regular entries
                } else {
                        $unpatrolled = $this->showAsUnpatrolled( $rc );
-
                        $this->insertDiffHist( $html, $rc, $unpatrolled );
                        # M, N, b and ! (minor, new, bot and unpatrolled)
                        $html .= $this->recentChangesFlags(
@@ -113,6 +112,8 @@ class OldChangesList extends ChangesList {
 
                if ( $rc->mAttribs['rc_type'] == RC_LOG ) {
                        $html .= $this->insertLogEntry( $rc );
+               } elseif ( $this->isCategorizationWithoutRevision( $rc ) ) {
+                       $html .= $this->insertComment( $rc );
                } else {
                        # User tool links
                        $this->insertUserRelatedLinks( $html, $rc );
index d9cafbc..9f85aa1 100644 (file)
@@ -28,6 +28,8 @@ class RCCacheEntry extends RecentChange {
        public $userlink;
        public $usertalklink;
        public $watched;
+       public $mAttribs;
+       public $mExtra;
 
        /**
         * @param RecentChange $rc
index c3fe183..f31125d 100644 (file)
@@ -209,6 +209,15 @@ class RCCacheEntryFactory {
                        $diffLink = $diffMessage;
                } elseif ( in_array( $cacheEntry->mAttribs['rc_type'], $logTypes ) ) {
                        $diffLink = $diffMessage;
+               } elseif ( $cacheEntry->getAttribute( 'rc_type' ) == RC_CATEGORIZE ) {
+                       $rcCurId = $cacheEntry->getAttribute( 'rc_cur_id' );
+                       $pageTitle = Title::newFromID( $rcCurId );
+                       if ( $pageTitle === null ) {
+                               wfDebugLog( 'RCCacheEntryFactory', 'Could not get Title for rc_cur_id: ' . $rcCurId );
+                               return $diffMessage;
+                       }
+                       $diffUrl = htmlspecialchars( $pageTitle->getLinkURL( $queryParams ) );
+                       $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
                } else {
                        $diffUrl = htmlspecialchars( $cacheEntry->getTitle()->getLinkURL( $queryParams ) );
                        $diffLink = "<a href=\"$diffUrl\" tabindex=\"$counter\">$diffMessage</a>";
index 3599f50..9025736 100644 (file)
@@ -324,15 +324,21 @@ class RecentChange {
                        $editor = $this->getPerformer();
                        $title = $this->getTitle();
 
-                       if ( Hooks::run( 'AbortEmailNotification', array( $editor, $title, $this ) ) ) {
-                               # @todo FIXME: This would be better as an extension hook
-                               $enotif = new EmailNotification();
-                               $enotif->notifyOnPageChange( $editor, $title,
-                                       $this->mAttribs['rc_timestamp'],
-                                       $this->mAttribs['rc_comment'],
-                                       $this->mAttribs['rc_minor'],
-                                       $this->mAttribs['rc_last_oldid'],
-                                       $this->mExtra['pageStatus'] );
+                       // Never send an RC notification email about categorization changes
+                       if ( $this->mAttribs['rc_type'] != RC_CATEGORIZE ) {
+                               if ( Hooks::run( 'AbortEmailNotification', array( $editor, $title, $this ) ) ) {
+                                       # @todo FIXME: This would be better as an extension hook
+                                       $enotif = new EmailNotification();
+                                       $enotif->notifyOnPageChange(
+                                               $editor,
+                                               $title,
+                                               $this->mAttribs['rc_timestamp'],
+                                               $this->mAttribs['rc_comment'],
+                                               $this->mAttribs['rc_minor'],
+                                               $this->mAttribs['rc_last_oldid'],
+                                               $this->mExtra['pageStatus']
+                                       );
+                               }
                        }
                }
 
index 5c70c99..bbb5c8c 100644 (file)
@@ -1101,7 +1101,7 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'active-tags' ) ),
-                               'lockTSE' => INF,
+                               'lockTSE' => 300,
                                'pcTTL' => 30
                        )
                );
@@ -1147,7 +1147,7 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'valid-tags-db' ) ),
-                               'lockTSE' => INF,
+                               'lockTSE' => 300,
                                'pcTTL' => 30
                        )
                );
@@ -1175,7 +1175,7 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'valid-tags-hook' ) ),
-                               'lockTSE' => INF,
+                               'lockTSE' => 300,
                                'pcTTL' => 30
                        )
                );
@@ -1243,7 +1243,7 @@ class ChangeTags {
                        },
                        array(
                                'checkKeys' => array( wfMemcKey( 'change-tag-statistics' ) ),
-                               'lockTSE' => INF,
+                               'lockTSE' => 300,
                                'pcTTL' => 30
                        )
                );
index 8a88fab..64db0d6 100644 (file)
@@ -79,11 +79,11 @@ class RedisConnectionPool implements LoggerAwareInterface {
 
        /**
         * @param array $options
-        * @throws MWException
+        * @throws Exception
         */
        protected function __construct( array $options ) {
                if ( !class_exists( 'Redis' ) ) {
-                       throw new MWException( __CLASS__ . ' requires a Redis client library. ' .
+                       throw new Exception( __CLASS__ . ' requires a Redis client library. ' .
                                'See https://www.mediawiki.org/wiki/Redis#Setup' );
                }
                if ( isset( $options['logger'] ) ) {
@@ -102,7 +102,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
                } elseif ( $options['serializer'] === 'none' ) {
                        $this->serializer = Redis::SERIALIZER_NONE;
                } else {
-                       throw new MWException( "Invalid serializer specified." );
+                       throw new InvalidArgumentException( "Invalid serializer specified." );
                }
        }
 
@@ -219,7 +219,9 @@ class RedisConnectionPool implements LoggerAwareInterface {
                        // TCP connection
                        $hostPort = IP::splitHostAndPort( $server );
                        if ( !$server || !$hostPort ) {
-                               throw new MWException( __CLASS__ . ": invalid configured server \"$server\"" );
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ": invalid configured server \"$server\""
+                               );
                        }
                        list( $host, $port ) = $hostPort;
                        if ( $port === false ) {
diff --git a/includes/compat/RunningStatCompat.php b/includes/compat/RunningStatCompat.php
new file mode 100644 (file)
index 0000000..ac82f44
--- /dev/null
@@ -0,0 +1,28 @@
+<?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
+ */
+
+/**
+ * Backward-compatibility alias for RunningStat, which was moved out
+ * into an external library and namespaced.
+ *
+ * @deprecated since 1.27 use RunningStat\RunningStat directly
+ */
+class RunningStat extends RunningStat\RunningStat {
+}
index 4195719..5443eeb 100644 (file)
@@ -91,6 +91,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function writesPending() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        public function writesOrCallbacksPending() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
@@ -243,7 +247,7 @@ class DBConnRef implements IDatabase {
        }
 
        public function selectRowCount(
-               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+               $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array()
        ) {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
@@ -513,6 +517,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function isReadOnly() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        /**
         * Clean up the connection when out of scope
         */
index 811a4a7..531086b 100644 (file)
@@ -441,6 +441,14 @@ abstract class DatabaseBase implements IDatabase {
                return $this->mDoneWrites ?: false;
        }
 
+       /**
+        * @return bool Whether there is a transaction open with possible write queries
+        * @since 1.27
+        */
+       public function writesPending() {
+               return $this->mTrxLevel && $this->mTrxDoneWrites;
+       }
+
        /**
         * Returns true if there is a transaction open with possible write
         * queries or transaction pre-commit/idle callbacks waiting on it to finish.
@@ -607,8 +615,7 @@ abstract class DatabaseBase implements IDatabase {
        function __construct( array $params ) {
                global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode;
 
-               $this->mTrxAtomicLevels = new SplStack;
-               $this->srvCache = ObjectCache::newAccelerator( 'hash' );
+               $this->srvCache = ObjectCache::getLocalServerInstance( 'hash' );
 
                $server = $params['host'];
                $user = $params['user'];
@@ -927,8 +934,8 @@ abstract class DatabaseBase implements IDatabase {
 
                $isWriteQuery = $this->isWriteQuery( $sql );
                if ( $isWriteQuery ) {
-                       $reason = $this->getLBInfo( 'readOnlyReason' );
-                       if ( is_string( $reason ) ) {
+                       $reason = $this->getReadOnlyReason();
+                       if ( $reason !== false ) {
                                throw new DBReadOnlyError( $this, "Database is read-only: $reason" );
                        }
                        # Set a flag indicating that writes have been done
@@ -1707,19 +1714,21 @@ abstract class DatabaseBase implements IDatabase {
         *
         * Takes the same arguments as DatabaseBase::select().
         *
-        * @param string $table Table name
+        * @since 1.27 Added $join_conds parameter
+        *
+        * @param array|string $tables Table names
         * @param string $vars Unused
         * @param array|string $conds Filters on the table
         * @param string $fname Function name for profiling
         * @param array $options Options for select
+        * @param array $join_conds Join conditions (since 1.27)
         * @return int Row count
-        * @since 1.24
         */
        public function selectRowCount(
-               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+               $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array()
        ) {
                $rows = 0;
-               $sql = $this->selectSQLText( $table, '1', $conds, $fname, $options );
+               $sql = $this->selectSQLText( $tables, '1', $conds, $fname, $options, $join_conds );
                $res = $this->query( "SELECT COUNT(*) AS rowcount FROM ($sql) tmp_count", $fname );
 
                if ( $res ) {
@@ -3818,16 +3827,20 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @param IDatabase $db1
         * @param IDatabase ...
-        * @return array ('lag': highest lag, 'since': lowest estimate UNIX timestamp)
+        * @return array Map of values:
+        *   - lag: highest lag of any of the DBs
+        *   - since: oldest UNIX timestamp of any of the DB lag estimates
+        *   - pending: whether any of the DBs have uncommitted changes
         * @since 1.27
         */
        public static function getCacheSetOptions( IDatabase $db1 ) {
-               $res = array( 'lag' => 0, 'since' => INF );
+               $res = array( 'lag' => 0, 'since' => INF, 'pending' => false );
                foreach ( func_get_args() as $db ) {
                        /** @var IDatabase $db */
                        $status = $db->getSessionLagStatus();
                        $res['lag'] = max( $res['lag'], $status['lag'] );
                        $res['since'] = min( $res['since'], $status['since'] );
+                       $res['pending'] = $res['pending'] ?: $db->writesPending();
                }
 
                return $res;
@@ -4284,6 +4297,19 @@ abstract class DatabaseBase implements IDatabase {
                // no-op
        }
 
+       public function isReadOnly() {
+               return ( $this->getReadOnlyReason() !== false );
+       }
+
+       /**
+        * @return string|bool Reason this DB is read-only or false if it is not
+        */
+       protected function getReadOnlyReason() {
+               $reason = $this->getLBInfo( 'readOnlyReason' );
+
+               return is_string( $reason ) ? $reason : false;
+       }
+
        /**
         * @since 1.19
         * @return string
index 6453854..78d26ae 100644 (file)
@@ -78,6 +78,10 @@ class DBExpectedError extends DBError {
                return $s;
        }
 
+       function getPageTitle() {
+               return $this->msg( 'databaseerror', 'Database error' );
+       }
+
        /**
         * @return string
         */
@@ -455,5 +459,8 @@ class DBUnexpectedError extends DBError {
 /**
  * @ingroup Database
  */
-class DBReadOnlyError extends DBError {
+class DBReadOnlyError extends DBExpectedError {
+       function getPageTitle() {
+               return $this->msg( 'readonly', 'Database is locked' );
+       }
 }
index 64ae1c6..9c5127f 100644 (file)
@@ -396,8 +396,9 @@ class DatabasePostgres extends Database {
                        $sql = mb_convert_encoding( $sql, 'UTF-8' );
                }
                // Clear previously left over PQresult
-               while ( $res = pg_get_result( $this->mConn ) )
+               while ( $res = pg_get_result( $this->mConn ) ) {
                        pg_free_result( $res );
+               }
                if ( pg_send_query( $this->mConn, $sql ) === false ) {
                        throw new DBUnexpectedError( $this, "Unable to post new query to PostgreSQL\n" );
                }
index 51c4bfe..19eb126 100644 (file)
@@ -159,6 +159,12 @@ interface IDatabase {
         */
        public function lastDoneWrites();
 
+       /**
+        * @return bool Whether there is a transaction open with possible write queries
+        * @since 1.27
+        */
+       public function writesPending();
+
        /**
         * Returns true if there is a transaction open with possible write
         * queries or transaction pre-commit/idle callbacks waiting on it to finish.
@@ -699,16 +705,18 @@ interface IDatabase {
         *
         * Takes the same arguments as IDatabase::select().
         *
-        * @param string $table Table name
+        * @since 1.27 Added $join_conds parameter
+        *
+        * @param array|string $tables Table names
         * @param string $vars Unused
         * @param array|string $conds Filters on the table
         * @param string $fname Function name for profiling
         * @param array $options Options for select
+        * @param array $join_conds Join conditions (since 1.27)
         * @return int Row count
-        * @since 1.24
         */
        public function selectRowCount(
-               $table, $vars = '*', $conds = '', $fname = __METHOD__, $options = array()
+               $tables, $vars = '*', $conds = '', $fname = __METHOD__, $options = array(), $join_conds = array()
        );
 
        /**
@@ -1509,4 +1517,10 @@ interface IDatabase {
         *   restore the initial value
         */
        public function setBigSelects( $value = true );
+
+       /**
+        * @return bool Whether this DB is read-only
+        * @since 1.27
+        */
+       public function isReadOnly();
 }
diff --git a/includes/db/IORMRow.php b/includes/db/IORMRow.php
deleted file mode 100644 (file)
index c66cddf..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?php
-/**
- * Interface for representing objects that are stored in some DB table.
- * This is basically an ORM-like wrapper around rows in database tables that
- * aims to be both simple and very flexible. It is centered around an associative
- * array of fields and various methods to do common interaction with the database.
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * 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
- *
- * @since 1.20
- *
- * @file
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-interface IORMRow {
-       /**
-        * Load the specified fields from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|null $fields
-        * @param bool $override
-        * @param bool $skipLoaded
-        *
-        * @return bool Success indicator
-        */
-       public function loadFields( $fields = null, $override = true, $skipLoaded = false );
-
-       /**
-        * Gets the value of a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        * @param mixed $default
-        *
-        * @throws MWException
-        * @return mixed
-        */
-       public function getField( $name, $default = null );
-
-       /**
-        * Gets the value of a field but first loads it if not done so already.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string $name
-        *
-        * @return mixed
-        */
-       public function loadAndGetField( $name );
-
-       /**
-        * Remove a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        */
-       public function removeField( $name );
-
-       /**
-        * Returns the objects database id.
-        *
-        * @since 1.20
-        *
-        * @return int|null
-        */
-       public function getId();
-
-       /**
-        * Sets the objects database id.
-        *
-        * @since 1.20
-        *
-        * @param int|null $id
-        */
-       public function setId( $id );
-
-       /**
-        * Gets if a certain field is set.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function hasField( $name );
-
-       /**
-        * Gets if the id field is set.
-        *
-        * @since 1.20
-        *
-        * @return bool
-        */
-       public function hasIdField();
-
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param bool $override Override already set fields with the provided values?
-        */
-       public function setFields( array $fields, $override = true );
-
-       /**
-        * Serializes the object to an associative array which
-        * can then easily be converted into JSON or similar.
-        *
-        * @since 1.20
-        *
-        * @param null|array $fields
-        * @param bool $incNullId
-        *
-        * @return array
-        */
-       public function toArray( $fields = null, $incNullId = false );
-
-       /**
-        * Load the default values, via getDefaults.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $override
-        */
-       public function loadDefaults( $override = true );
-
-       /**
-        * Writes the answer to the database, either updating it
-        * when it already exists, or inserting it when it doesn't.
-        *
-        * @since 1.20
-        *
-        * @param string|null $functionName
-        * @deprecated since 1.22
-        *
-        * @return bool Success indicator
-        */
-       public function save( $functionName = null );
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return bool Success indicator
-        */
-       public function remove();
-
-       /**
-        * Return the names and values of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields();
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSetFieldNames();
-
-       /**
-        * Sets the value of a field.
-        * Strings can be provided for other types,
-        * so this method can be called from unserialization handlers.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        * @param mixed $value
-        *
-        * @throws MWException
-        */
-       public function setField( $name, $value );
-
-       /**
-        * Add an amount (can be negative) to the specified field (needs to be numeric).
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool Success indicator
-        */
-       public function addToField( $field, $amount );
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldNames();
-
-       /**
-        * Computes and updates the values of the summary fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|string|null $summaryFields
-        */
-       public function loadSummaryFields( $summaryFields = null );
-
-       /**
-        * Sets the value for the @see $updateSummaries field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $update
-        */
-       public function setUpdateSummaries( $update );
-
-       /**
-        * Sets the value for the @see $inSummaryMode field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $summaryMode
-        */
-       public function setSummaryMode( $summaryMode );
-
-       /**
-        * Returns the table this IORMRow is a row in.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return IORMTable
-        */
-       public function getTable();
-}
diff --git a/includes/db/IORMTable.php b/includes/db/IORMTable.php
deleted file mode 100644 (file)
index b2527f9..0000000
+++ /dev/null
@@ -1,520 +0,0 @@
-<?php
-/**
- * Interface for objects representing a single database table.
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * 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
- *
- * @since 1.20
- *
- * @file
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-interface IORMTable {
-       /**
-        * Returns the name of the database table objects of this type are stored in.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getName();
-
-       /**
-        * Returns the name of a IORMRow implementing class that
-        * represents single rows in this table.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getRowClass();
-
-       /**
-        * Returns an array with the fields and their types this object contains.
-        * This corresponds directly to the fields in the database, without prefix.
-        *
-        * field name => type
-        *
-        * Allowed types:
-        * * id
-        * * str
-        * * int
-        * * float
-        * * bool
-        * * array
-        * * blob
-        *
-        * @todo Get rid of the id field. Every row instance needs to have one so
-        *   this is just causing hassle at various locations by requiring an extra
-        *   check for field name.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields();
-
-       /**
-        * Returns a list of default field values.
-        * field name => field value
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getDefaults();
-
-       /**
-        * Returns a list of the summary fields.
-        * These are fields that cache computed values, such as the amount of linked objects of $type.
-        * This is relevant as one might not want to do actions such as log changes when these get updated.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSummaryFields();
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @see DatabaseBase::select()
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return ORMResult The result set
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
-        */
-       public function select( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return array Array of self
-        */
-       public function selectObjects( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Do the actual select.
-        *
-        * @since 1.20
-        *
-        * @param null|string|array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param null|string $functionName
-        *
-        * @return ResultWrapper
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
-        */
-       public function rawSelect( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as associative arrays.
-        * Provided field names get prefixed.
-        * Returned field names will not have a prefix.
-        *
-        * When $collapse is true:
-        * If one field is selected, each item in the result array will be this field.
-        * If two fields are selected, each item in the result array will have as key
-        * the first field and as value the second field.
-        * If more then two fields are selected, each item will be an associative array.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return array Array of array
-        */
-       public function selectFields( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null );
-
-       /**
-        * Selects the specified fields of the first matching record.
-        * Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return IORMRow|bool False on failure
-        */
-       public function selectRow( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions. Field names do NOT get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return ResultWrapper
-        */
-       public function rawSelectRow( array $fields, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects the specified fields of the first record matching the provided
-        * conditions and returns it as an associative array, or false when nothing matches.
-        * This method makes use of selectFields and expects the same parameters and
-        * returns the same results (if there are any, if there are none, this method returns false).
-        * @see IORMTable::selectFields
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return mixed|array|bool False on failure
-        */
-       public function selectFieldsRow( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null );
-
-       /**
-        * Returns if there is at least one record matching the provided conditions.
-        * Condition field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        *
-        * @return bool
-        */
-       public function has( array $conditions = array() );
-
-       /**
-        * Checks if the table exists
-        *
-        * @since 1.21
-        *
-        * @return bool
-        */
-       public function exists();
-
-       /**
-        * Returns the amount of matching records.
-        * Condition field names get prefixed.
-        *
-        * Note that this can be expensive on large tables.
-        * In such cases you might want to use DatabaseBase::estimateRowCount instead.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param array $options
-        *
-        * @return int
-        */
-       public function count( array $conditions = array(), array $options = array() );
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function delete( array $conditions, $functionName = null );
-
-       /**
-        * Get API parameters for the fields supported by this object.
-        *
-        * @since 1.20
-        *
-        * @param bool $requireParams
-        * @param bool $setDefaults
-        *
-        * @return array
-        */
-       public function getAPIParams( $requireParams = false, $setDefaults = false );
-
-       /**
-        * Returns an array with the fields and their descriptions.
-        *
-        * field name => field description
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldDescriptions();
-
-       /**
-        * Get the database type used for read operations.
-        *
-        * @since 1.20
-        *
-        * @return int DB_ enum
-        */
-       public function getReadDb();
-
-       /**
-        * Set the database type to use for read operations.
-        *
-        * @param int $db
-        *
-        * @since 1.20
-        */
-       public function setReadDb( $db );
-
-       /**
-        * Get the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @since 1.20
-        *
-        * @return string|bool The target wiki, in a form that LBFactory
-        *   understands (or false if the local wiki is used)
-        */
-       public function getTargetWiki();
-
-       /**
-        * Set the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @param string|bool $wiki The target wiki, in a form that LBFactory
-        *   understands (or false if the local wiki shall be used)
-        *
-        * @since 1.20
-        */
-       public function setTargetWiki( $wiki );
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getReadDbConnection();
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getWriteDbConnection();
-
-       /**
-        * Get the database type used for read operations.
-        *
-        * @see wfGetLB
-        *
-        * @since 1.20
-        *
-        * @return LoadBalancer The database load balancer object
-        */
-       public function getLoadBalancer();
-
-       /**
-        * Releases the lease on the given database connection. This is useful mainly
-        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
-        *
-        * @see LoadBalancer::reuseConnection
-        *
-        * @param DatabaseBase $db The database
-        *
-        * @since 1.20
-        */
-       public function releaseConnection( DatabaseBase $db );
-
-       /**
-        * Update the records matching the provided conditions by
-        * setting the fields that are keys in the $values param to
-        * their corresponding values.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        * @param array $conditions
-        *
-        * @return bool Success indicator
-        */
-       public function update( array $values, array $conditions = array() );
-
-       /**
-        * Computes the values of the summary fields of the objects matching the provided conditions.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $summaryFields
-        * @param array $conditions
-        */
-       public function updateSummaryFields( $summaryFields = null, array $conditions = array() );
-
-       /**
-        * Takes in an associative array with field names as keys and
-        * their values as value. The field names are prefixed with the
-        * db field prefix.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        *
-        * @return array
-        */
-       public function getPrefixedValues( array $values );
-
-       /**
-        * Takes in a field or array of fields and returns an
-        * array with their prefixed versions, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        *
-        * @return array
-        */
-       public function getPrefixedFields( array $fields );
-
-       /**
-        * Takes in a field and returns an it's prefixed version, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param string|array $field
-        *
-        * @return string
-        */
-       public function getPrefixedField( $field );
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       public function unprefixFieldNames( array $fieldNames );
-
-       /**
-        * Takes a field name with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string $fieldName
-        *
-        * @return string
-        */
-       public function unprefixFieldName( $fieldName );
-
-       /**
-        * Get an array with fields from a database result,
-        * that can be fed directly to the constructor or
-        * to setFields.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return array
-        */
-       public function getFieldsFromDBResult( stdClass $result );
-
-       /**
-        * Get a new instance of the class from a database result.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newRowFromDBResult( stdClass $result );
-
-       /**
-        * Get a new instance of the class from an array.
-        *
-        * @since 1.20
-        *
-        * @param array $data
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $data, $loadDefaults = false );
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldNames();
-
-       /**
-        * Gets if the object can take a certain field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function canHaveField( $name );
-}
diff --git a/includes/db/ORMIterator.php b/includes/db/ORMIterator.php
deleted file mode 100644 (file)
index e8104b6..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-/**
- * Interface for Iterators containing IORMRows.
- *
- * 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
- *
- * @since 1.20
- *
- * @file
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-interface ORMIterator extends Iterator {
-}
diff --git a/includes/db/ORMResult.php b/includes/db/ORMResult.php
deleted file mode 100644 (file)
index 327d20d..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-/**
- * ORMIterator that takes a ResultWrapper object returned from
- * a select operation returning IORMRow objects (ie IORMTable::select).
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * 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
- *
- * @since 1.20
- *
- * @file ORMResult.php
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMResult implements ORMIterator {
-       /**
-        * @var ResultWrapper
-        */
-       protected $res;
-
-       /**
-        * @var int
-        */
-       protected $key;
-
-       /**
-        * @var IORMRow
-        */
-       protected $current;
-
-       /**
-        * @var IORMTable
-        */
-       protected $table;
-
-       /**
-        * @param IORMTable $table
-        * @param ResultWrapper $res
-        */
-       public function __construct( IORMTable $table, ResultWrapper $res ) {
-               $this->table = $table;
-               $this->res = $res;
-               $this->key = 0;
-               $this->setCurrent( $this->res->current() );
-       }
-
-       /**
-        * @param bool|object $row
-        */
-       protected function setCurrent( $row ) {
-               if ( $row === false ) {
-                       $this->current = false;
-               } else {
-                       $this->current = $this->table->newRowFromDBResult( $row );
-               }
-       }
-
-       /**
-        * @return int
-        */
-       public function count() {
-               return $this->res->numRows();
-       }
-
-       /**
-        * @return bool
-        */
-       public function isEmpty() {
-               return $this->res->numRows() === 0;
-       }
-
-       /**
-        * @return IORMRow
-        */
-       public function current() {
-               return $this->current;
-       }
-
-       /**
-        * @return int
-        */
-       public function key() {
-               return $this->key;
-       }
-
-       public function next() {
-               $row = $this->res->next();
-               $this->setCurrent( $row );
-               $this->key++;
-       }
-
-       public function rewind() {
-               $this->res->rewind();
-               $this->key = 0;
-               $this->setCurrent( $this->res->current() );
-       }
-
-       /**
-        * @return bool
-        */
-       public function valid() {
-               return $this->current !== false;
-       }
-}
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
deleted file mode 100644 (file)
index b0bade3..0000000
+++ /dev/null
@@ -1,593 +0,0 @@
-<?php
-/**
- * Abstract base class for representing objects that are stored in some DB table.
- * This is basically an ORM-like wrapper around rows in database tables that
- * aims to be both simple and very flexible. It is centered around an associative
- * array of fields and various methods to do common interaction with the database.
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * 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
- *
- * @since 1.20
- *
- * @file ORMRow.php
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMRow implements IORMRow {
-       /**
-        * The fields of the object.
-        * field name (w/o prefix) => value
-        *
-        * @since 1.20
-        * @var array
-        */
-       protected $fields = array( 'id' => null );
-
-       /**
-        * 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.22
-        * @since 1.20
-        * @var bool
-        */
-       protected $updateSummaries = true;
-
-       /**
-        * Indicates if the object is in summary mode.
-        * This mode indicates that only summary fields got updated,
-        * which allows for optimizations.
-        *
-        * @deprecated since 1.22
-        * @since 1.20
-        * @var bool
-        */
-       protected $inSummaryMode = false;
-
-       /**
-        * @deprecated since 1.22
-        * @since 1.20
-        * @var ORMTable|null
-        */
-       protected $table;
-
-       /**
-        * Constructor.
-        *
-        * @since 1.20
-        *
-        * @param IORMTable|null $table Deprecated since 1.22
-        * @param array|null $fields
-        * @param bool $loadDefaults Deprecated since 1.22
-        */
-       public function __construct( IORMTable $table = null, $fields = null, $loadDefaults = false ) {
-               $this->table = $table;
-
-               if ( !is_array( $fields ) ) {
-                       $fields = array();
-               }
-
-               if ( $loadDefaults ) {
-                       $fields = array_merge( $this->table->getDefaults(), $fields );
-               }
-
-               $this->setFields( $fields );
-       }
-
-       /**
-        * Load the specified fields from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|null $fields
-        * @param bool $override
-        * @param bool $skipLoaded
-        *
-        * @return bool Success indicator
-        */
-       public function loadFields( $fields = null, $override = true, $skipLoaded = false ) {
-               if ( is_null( $this->getId() ) ) {
-                       return false;
-               }
-
-               if ( is_null( $fields ) ) {
-                       $fields = array_keys( $this->table->getFields() );
-               }
-
-               if ( $skipLoaded ) {
-                       $fields = array_diff( $fields, array_keys( $this->fields ) );
-               }
-
-               if ( !empty( $fields ) ) {
-                       $result = $this->table->rawSelectRow(
-                               $this->table->getPrefixedFields( $fields ),
-                               array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
-                               array( 'LIMIT' => 1 ),
-                               __METHOD__
-                       );
-
-                       if ( $result !== false ) {
-                               $this->setFields( $this->table->getFieldsFromDBResult( $result ), $override );
-
-                               return true;
-                       }
-
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Gets the value of a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name Field name
-        * @param mixed $default Default value to return when none is found
-        * (default: null)
-        *
-        * @throws MWException
-        * @return mixed
-        */
-       public function getField( $name, $default = null ) {
-               if ( $this->hasField( $name ) ) {
-                       return $this->fields[$name];
-               } elseif ( !is_null( $default ) ) {
-                       return $default;
-               } else {
-                       throw new MWException( 'Attempted to get not-set field ' . $name );
-               }
-       }
-
-       /**
-        * Gets the value of a field but first loads it if not done so already.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string $name
-        *
-        * @return mixed
-        */
-       public function loadAndGetField( $name ) {
-               if ( !$this->hasField( $name ) ) {
-                       $this->loadFields( array( $name ) );
-               }
-
-               return $this->getField( $name );
-       }
-
-       /**
-        * Remove a field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        */
-       public function removeField( $name ) {
-               unset( $this->fields[$name] );
-       }
-
-       /**
-        * Returns the objects database id.
-        *
-        * @since 1.20
-        *
-        * @return int|null
-        */
-       public function getId() {
-               return $this->getField( 'id' );
-       }
-
-       /**
-        * Sets the objects database id.
-        *
-        * @since 1.20
-        *
-        * @param int|null $id
-        */
-       public function setId( $id ) {
-               $this->setField( 'id', $id );
-       }
-
-       /**
-        * Gets if a certain field is set.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function hasField( $name ) {
-               return array_key_exists( $name, $this->fields );
-       }
-
-       /**
-        * Gets if the id field is set.
-        *
-        * @since 1.20
-        *
-        * @return bool
-        */
-       public function hasIdField() {
-               return $this->hasField( 'id' ) && !is_null( $this->getField( 'id' ) );
-       }
-
-       /**
-        * Gets the fields => values to write to the table.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return array
-        */
-       protected function getWriteValues() {
-               $values = array();
-
-               foreach ( $this->table->getFields() as $name => $type ) {
-                       if ( array_key_exists( $name, $this->fields ) ) {
-                               $value = $this->fields[$name];
-
-                               // Skip null id fields so that the DBMS can set the default.
-                               if ( $name === 'id' && is_null( $value ) ) {
-                                       continue;
-                               }
-
-                               switch ( $type ) {
-                                       case 'array':
-                                               $value = (array)$value;
-                                       // fall-through!
-                                       case 'blob':
-                                               $value = serialize( $value );
-                                       // fall-through!
-                               }
-
-                               $values[$this->table->getPrefixedField( $name )] = $value;
-                       }
-               }
-
-               return $values;
-       }
-
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param bool $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.
-        *
-        * @since 1.20
-        *
-        * @param null|array $fields
-        * @param bool $incNullId
-        *
-        * @return array
-        */
-       public function toArray( $fields = null, $incNullId = false ) {
-               $data = array();
-               $setFields = array();
-
-               if ( !is_array( $fields ) ) {
-                       $setFields = $this->getSetFieldNames();
-               } else {
-                       foreach ( $fields as $field ) {
-                               if ( $this->hasField( $field ) ) {
-                                       $setFields[] = $field;
-                               }
-                       }
-               }
-
-               foreach ( $setFields as $field ) {
-                       if ( $incNullId || $field != 'id' || $this->hasIdField() ) {
-                               $data[$field] = $this->getField( $field );
-                       }
-               }
-
-               return $data;
-       }
-
-       /**
-        * Load the default values, via getDefaults.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $override
-        */
-       public function loadDefaults( $override = true ) {
-               $this->setFields( $this->table->getDefaults(), $override );
-       }
-
-       /**
-        * Writes the answer to the database, either updating it
-        * when it already exists, or inserting it when it doesn't.
-        *
-        * @since 1.20
-        * @deprecated since 1.22 Use IORMTable->updateRow or ->insertRow
-        *
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function save( $functionName = null ) {
-               if ( $this->hasIdField() ) {
-                       return $this->table->updateRow( $this, $functionName );
-               } else {
-                       return $this->table->insertRow( $this, $functionName );
-               }
-       }
-
-       /**
-        * Updates the object in the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       protected function saveExisting( $functionName = null ) {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $success = $dbw->update(
-                       $this->table->getName(),
-                       $this->getWriteValues(),
-                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               );
-
-               $this->table->releaseConnection( $dbw );
-
-               // DatabaseBase::update does not always return true for success as documented...
-               return $success !== false;
-       }
-
-       /**
-        * Returns the WHERE considtions needed to identify this object so
-        * it can be updated.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       protected function getUpdateConditions() {
-               return array( 'id' => $this->getId() );
-       }
-
-       /**
-        * Inserts the object into the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string|null $functionName
-        * @param array|null $options
-        *
-        * @return bool Success indicator
-        */
-       protected function insert( $functionName = null, array $options = null ) {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $success = $dbw->insert(
-                       $this->table->getName(),
-                       $this->getWriteValues(),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               // DatabaseBase::insert does not always return true for success as documented...
-               $success = $success !== false;
-
-               if ( $success ) {
-                       $this->setField( 'id', $dbw->insertId() );
-               }
-
-               $this->table->releaseConnection( $dbw );
-
-               return $success;
-       }
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22, use IORMTable->removeRow
-        *
-        * @return bool Success indicator
-        */
-       public function remove() {
-               $this->beforeRemove();
-
-               $success = $this->table->removeRow( $this, __METHOD__ );
-
-               if ( $success ) {
-                       $this->onRemoved();
-               }
-
-               return $success;
-       }
-
-       /**
-        * Gets called before an object is removed from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        */
-       protected function beforeRemove() {
-               $this->loadFields( $this->getBeforeRemoveFields(), false, true );
-       }
-
-       /**
-        * Before removal of an object happens, @see beforeRemove gets called.
-        * This method loads the fields of which the names have been returned by
-        * this one (or all fields if null is returned). This allows for loading
-        * info needed after removal to get rid of linked data and the like.
-        *
-        * @since 1.20
-        *
-        * @return array|null
-        */
-       protected function getBeforeRemoveFields() {
-               return array();
-       }
-
-       /**
-        * Gets called after successful removal.
-        * Can be overridden to get rid of linked data.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        */
-       protected function onRemoved() {
-               $this->setField( 'id', null );
-       }
-
-       /**
-        * Return the names and values of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields() {
-               return $this->fields;
-       }
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSetFieldNames() {
-               return array_keys( $this->fields );
-       }
-
-       /**
-        * Sets the value of a field.
-        * Strings can be provided for other types,
-        * so this method can be called from unserialization handlers.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        * @param mixed $value
-        *
-        * @throws MWException
-        */
-       public function setField( $name, $value ) {
-               $this->fields[$name] = $value;
-       }
-
-       /**
-        * Add an amount (can be negative) to the specified field (needs to be numeric).
-        *
-        * @since 1.20
-        * @deprecated since 1.22, use IORMTable->addToField
-        *
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool Success indicator
-        */
-       public function addToField( $field, $amount ) {
-               return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
-       }
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return array
-        */
-       public function getFieldNames() {
-               return array_keys( $this->table->getFields() );
-       }
-
-       /**
-        * Computes and updates the values of the summary fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|string|null $summaryFields
-        */
-       public function loadSummaryFields( $summaryFields = null ) {
-       }
-
-       /**
-        * Sets the value for the @see $updateSummaries field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $update
-        */
-       public function setUpdateSummaries( $update ) {
-               $this->updateSummaries = $update;
-       }
-
-       /**
-        * Sets the value for the @see $inSummaryMode field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $summaryMode
-        */
-       public function setSummaryMode( $summaryMode ) {
-               $this->inSummaryMode = $summaryMode;
-       }
-
-       /**
-        * Returns the table this IORMRow is a row in.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return IORMTable
-        */
-       public function getTable() {
-               return $this->table;
-       }
-}
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
deleted file mode 100644 (file)
index 562a810..0000000
+++ /dev/null
@@ -1,1144 +0,0 @@
-<?php
-/**
- * Abstract base class for representing a single database table.
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * 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
- *
- * @since 1.20
- * Non-abstract since 1.21
- *
- * @file ORMTable.php
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMTable extends DBAccessBase implements IORMTable {
-       /**
-        * Cache for instances, used by the singleton method.
-        *
-        * @since 1.20
-        * @deprecated since 1.21
-        *
-        * @var ORMTable[]
-        */
-       protected static $instanceCache = array();
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $tableName;
-
-       /**
-        * @since 1.21
-        *
-        * @var string[]
-        */
-       protected $fields = array();
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $fieldPrefix = '';
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $rowClass = 'ORMRow';
-
-       /**
-        * @since 1.21
-        *
-        * @var array
-        */
-       protected $defaults = array();
-
-       /**
-        * ID of the database connection to use for read operations.
-        * Can be changed via @see setReadDb.
-        *
-        * @since 1.20
-        *
-        * @var int DB_ enum
-        */
-       protected $readDb = DB_SLAVE;
-
-       /**
-        * Constructor.
-        *
-        * @since 1.21
-        *
-        * @param string $tableName
-        * @param string[] $fields
-        * @param array $defaults
-        * @param string|null $rowClass
-        * @param string $fieldPrefix
-        */
-       public function __construct( $tableName = '', array $fields = array(),
-               array $defaults = array(), $rowClass = null, $fieldPrefix = ''
-       ) {
-               $this->tableName = $tableName;
-               $this->fields = $fields;
-               $this->defaults = $defaults;
-
-               if ( is_string( $rowClass ) ) {
-                       $this->rowClass = $rowClass;
-               }
-
-               $this->fieldPrefix = $fieldPrefix;
-       }
-
-       /**
-        * @see IORMTable::getName
-        *
-        * @since 1.21
-        *
-        * @return string
-        * @throws MWException
-        */
-       public function getName() {
-               if ( $this->tableName === '' ) {
-                       throw new MWException( 'The table name needs to be set' );
-               }
-
-               return $this->tableName;
-       }
-
-       /**
-        * Gets the db field prefix.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, use the $this->fieldPrefix property instead
-        *
-        * @return string
-        */
-       protected function getFieldPrefix() {
-               return $this->fieldPrefix;
-       }
-
-       /**
-        * @see IORMTable::getRowClass
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return $this->rowClass;
-       }
-
-       /**
-        * @see ORMTable::getFields
-        *
-        * @since 1.21
-        *
-        * @return array
-        * @throws MWException
-        */
-       public function getFields() {
-               if ( $this->fields === array() ) {
-                       throw new MWException( 'The table needs to have one or more fields' );
-               }
-
-               return $this->fields;
-       }
-
-       /**
-        * Returns a list of default field values.
-        * field name => field value
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getDefaults() {
-               return $this->defaults;
-       }
-
-       /**
-        * Returns a list of the summary fields.
-        * These are fields that cache computed values, such as the amount of linked objects of $type.
-        * This is relevant as one might not want to do actions such as log changes when these get updated.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getSummaryFields() {
-               return array();
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return ORMResult
-        */
-       public function select( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $res = $this->rawSelect( $fields, $conditions, $options, $functionName );
-
-               return new ORMResult( $this, $res );
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return array Array of row objects
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode).
-        */
-       public function selectObjects( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $result = $this->selectFields( $fields, $conditions, $options, false, $functionName );
-
-               $objects = array();
-
-               foreach ( $result as $record ) {
-                       $objects[] = $this->newRow( $record );
-               }
-
-               return $objects;
-       }
-
-       /**
-        * Do the actual select.
-        *
-        * @since 1.20
-        *
-        * @param null|string|array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param null|string $functionName
-        * @return ResultWrapper
-        * @throws Exception
-        * @throws MWException
-        */
-       public function rawSelect( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               if ( is_null( $fields ) ) {
-                       $fields = array_keys( $this->getFields() );
-               } else {
-                       $fields = (array)$fields;
-               }
-
-               $dbr = $this->getReadDbConnection();
-               $result = $dbr->select(
-                       $this->getName(),
-                       $this->getPrefixedFields( $fields ),
-                       $this->getPrefixedValues( $conditions ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               /* @var Exception $error */
-               $error = null;
-
-               if ( $result === false ) {
-                       // Database connection was in "ignoreErrors" mode. We don't like that.
-                       // So, we emulate the DBQueryError that should have been thrown.
-                       $error = new DBQueryError(
-                               $dbr,
-                               $dbr->lastError(),
-                               $dbr->lastErrno(),
-                               $dbr->lastQuery(),
-                               is_null( $functionName ) ? __METHOD__ : $functionName
-                       );
-               }
-
-               $this->releaseConnection( $dbr );
-
-               if ( $error ) {
-                       // Note: construct the error before releasing the connection,
-                       // but throw it after.
-                       throw $error;
-               }
-
-               return $result;
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions and returns them as associative arrays.
-        * Provided field names get prefixed.
-        * Returned field names will not have a prefix.
-        *
-        * When $collapse is true:
-        * If one field is selected, each item in the result array will be this field.
-        * If two fields are selected, each item in the result array will have as key
-        * the first field and as value the second field.
-        * If more then two fields are selected, each item will be an associative array.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return array Array of array
-        */
-       public function selectFields( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null
-       ) {
-               $objects = array();
-
-               $result = $this->rawSelect( $fields, $conditions, $options, $functionName );
-
-               foreach ( $result as $record ) {
-                       $objects[] = $this->getFieldsFromDBResult( $record );
-               }
-
-               if ( $collapse ) {
-                       if ( count( $fields ) === 1 ) {
-                               $objects = array_map( 'array_shift', $objects );
-                       } elseif ( count( $fields ) === 2 ) {
-                               $o = array();
-
-                               foreach ( $objects as $object ) {
-                                       $o[array_shift( $object )] = array_shift( $object );
-                               }
-
-                               $objects = $o;
-                       }
-               }
-
-               return $objects;
-       }
-
-       /**
-        * Selects the specified fields of the first matching record.
-        * Field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return IORMRow|bool False on failure
-        */
-       public function selectRow( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $options['LIMIT'] = 1;
-
-               $objects = $this->select( $fields, $conditions, $options, $functionName );
-
-               return ( !$objects || $objects->isEmpty() ) ? false : $objects->current();
-       }
-
-       /**
-        * Selects the specified fields of the records matching the provided
-        * conditions. Field names do NOT get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return stdClass
-        */
-       public function rawSelectRow( array $fields, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $dbr = $this->getReadDbConnection();
-
-               $result = $dbr->selectRow(
-                       $this->getName(),
-                       $fields,
-                       $conditions,
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               $this->releaseConnection( $dbr );
-
-               return $result;
-       }
-
-       /**
-        * Selects the specified fields of the first record matching the provided
-        * conditions and returns it as an associative array, or false when nothing matches.
-        * This method makes use of selectFields and expects the same parameters and
-        * returns the same results (if there are any, if there are none, this method returns false).
-        * @see ORMTable::selectFields
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return mixed|array|bool False on failure
-        */
-       public function selectFieldsRow( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null
-       ) {
-               $options['LIMIT'] = 1;
-
-               $objects = $this->selectFields( $fields, $conditions, $options, $collapse, $functionName );
-
-               return empty( $objects ) ? false : $objects[0];
-       }
-
-       /**
-        * Returns if there is at least one record matching the provided conditions.
-        * Condition field names get prefixed.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        *
-        * @return bool
-        */
-       public function has( array $conditions = array() ) {
-               return $this->selectRow( array( 'id' ), $conditions ) !== false;
-       }
-
-       /**
-        * Checks if the table exists
-        *
-        * @since 1.21
-        *
-        * @return bool
-        */
-       public function exists() {
-               $dbr = $this->getReadDbConnection();
-               $exists = $dbr->tableExists( $this->getName() );
-               $this->releaseConnection( $dbr );
-
-               return $exists;
-       }
-
-       /**
-        * Returns the amount of matching records.
-        * Condition field names get prefixed.
-        *
-        * Note that this can be expensive on large tables.
-        * In such cases you might want to use DatabaseBase::estimateRowCount instead.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param array $options
-        *
-        * @return int
-        */
-       public function count( array $conditions = array(), array $options = array() ) {
-               $res = $this->rawSelectRow(
-                       array( 'rowcount' => 'COUNT(*)' ),
-                       $this->getPrefixedValues( $conditions ),
-                       $options,
-                       __METHOD__
-               );
-
-               return $res->rowcount;
-       }
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function delete( array $conditions, $functionName = null ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $result = $dbw->delete(
-                       $this->getName(),
-                       $conditions === array() ? '*' : $this->getPrefixedValues( $conditions ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               ) !== false; // DatabaseBase::delete does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $result;
-       }
-
-       /**
-        * Get API parameters for the fields supported by this object.
-        *
-        * @since 1.20
-        *
-        * @param bool $requireParams
-        * @param bool $setDefaults
-        *
-        * @return array
-        */
-       public function getAPIParams( $requireParams = false, $setDefaults = false ) {
-               $typeMap = array(
-                       'id' => 'integer',
-                       'int' => 'integer',
-                       'float' => 'NULL',
-                       'str' => 'string',
-                       'bool' => 'integer',
-                       'array' => 'string',
-                       'blob' => 'string',
-               );
-
-               $params = array();
-               $defaults = $this->getDefaults();
-
-               foreach ( $this->getFields() as $field => $type ) {
-                       if ( $field == 'id' ) {
-                               continue;
-                       }
-
-                       $hasDefault = array_key_exists( $field, $defaults );
-
-                       $params[$field] = array(
-                               ApiBase::PARAM_TYPE => $typeMap[$type],
-                               ApiBase::PARAM_REQUIRED => $requireParams && !$hasDefault
-                       );
-
-                       if ( $type == 'array' ) {
-                               $params[$field][ApiBase::PARAM_ISMULTI] = true;
-                       }
-
-                       if ( $setDefaults && $hasDefault ) {
-                               $default = is_array( $defaults[$field] )
-                                       ? implode( '|', $defaults[$field] )
-                                       : $defaults[$field];
-                               $params[$field][ApiBase::PARAM_DFLT] = $default;
-                       }
-               }
-
-               return $params;
-       }
-
-       /**
-        * Returns an array with the fields and their descriptions.
-        *
-        * field name => field description
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldDescriptions() {
-               return array();
-       }
-
-       /**
-        * Get the database ID used for read operations.
-        *
-        * @since 1.20
-        *
-        * @return int DB_ enum
-        */
-       public function getReadDb() {
-               return $this->readDb;
-       }
-
-       /**
-        * Set the database ID to use for read operations, use DB_XXX constants or
-        *   an index to the load balancer setup.
-        *
-        * @param int $db
-        *
-        * @since 1.20
-        */
-       public function setReadDb( $db ) {
-               $this->readDb = $db;
-       }
-
-       /**
-        * Get the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @since 1.20
-        *
-        * @return string|bool The target wiki, in a form that LBFactory understands
-        *   (or false if the local wiki is used)
-        */
-       public function getTargetWiki() {
-               return $this->wiki;
-       }
-
-       /**
-        * Set the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @param string|bool $wiki The target wiki, in a form that  LBFactory
-        *   understands (or false if the local wiki shall be used)
-        *
-        * @since 1.20
-        */
-       public function setTargetWiki( $wiki ) {
-               $this->wiki = $wiki;
-       }
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getReadDbConnection() {
-               return $this->getConnection( $this->getReadDb(), array() );
-       }
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getWriteDbConnection() {
-               return $this->getConnection( DB_MASTER, array() );
-       }
-
-       /**
-        * Releases the lease on the given database connection. This is useful mainly
-        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
-        *
-        * @see LoadBalancer::reuseConnection
-        *
-        * @param DatabaseBase $db
-        *
-        * @since 1.20
-        */
-       // @codingStandardsIgnoreStart Suppress "useless method overriding" sniffer warning
-       public function releaseConnection( DatabaseBase $db ) {
-               parent::releaseConnection( $db ); // just make it public
-       }
-       // @codingStandardsIgnoreEnd
-
-       /**
-        * Update the records matching the provided conditions by
-        * setting the fields that are keys in the $values param to
-        * their corresponding values.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        * @param array $conditions
-        *
-        * @return bool Success indicator
-        */
-       public function update( array $values, array $conditions = array() ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $result = $dbw->update(
-                       $this->getName(),
-                       $this->getPrefixedValues( $values ),
-                       $this->getPrefixedValues( $conditions ),
-                       __METHOD__
-               ) !== false; // DatabaseBase::update does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $result;
-       }
-
-       /**
-        * Computes the values of the summary fields of the objects matching the provided conditions.
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $summaryFields
-        * @param array $conditions
-        */
-       public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
-               $slave = $this->getReadDb();
-               $this->setReadDb( DB_MASTER );
-
-               /**
-                * @var IORMRow $item
-                */
-               foreach ( $this->select( null, $conditions ) as $item ) {
-                       $item->loadSummaryFields( $summaryFields );
-                       $item->setSummaryMode( true );
-                       $item->save();
-               }
-
-               $this->setReadDb( $slave );
-       }
-
-       /**
-        * Takes in an associative array with field names as keys and
-        * their values as value. The field names are prefixed with the
-        * db field prefix.
-        *
-        * @since 1.20
-        *
-        * @param array $values
-        *
-        * @return array
-        */
-       public function getPrefixedValues( array $values ) {
-               $prefixedValues = array();
-
-               foreach ( $values as $field => $value ) {
-                       if ( is_integer( $field ) ) {
-                               if ( is_array( $value ) ) {
-                                       $field = $value[0];
-                                       $value = $value[1];
-                               } else {
-                                       $value = explode( ' ', $value, 2 );
-                                       $value[0] = $this->getPrefixedField( $value[0] );
-                                       $prefixedValues[] = implode( ' ', $value );
-                                       continue;
-                               }
-                       }
-
-                       $prefixedValues[$this->getPrefixedField( $field )] = $value;
-               }
-
-               return $prefixedValues;
-       }
-
-       /**
-        * Takes in a field or array of fields and returns an
-        * array with their prefixed versions, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        *
-        * @return array
-        */
-       public function getPrefixedFields( array $fields ) {
-               foreach ( $fields as &$field ) {
-                       $field = $this->getPrefixedField( $field );
-               }
-
-               return $fields;
-       }
-
-       /**
-        * Takes in a field and returns an it's prefixed version, ready for db usage.
-        *
-        * @since 1.20
-        *
-        * @param string|array $field
-        *
-        * @return string
-        */
-       public function getPrefixedField( $field ) {
-               return $this->fieldPrefix . $field;
-       }
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       public function unprefixFieldNames( array $fieldNames ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               return $this->stripFieldPrefix( $fieldNames );
-       }
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       private function stripFieldPrefix( array $fieldNames ) {
-               $start = strlen( $this->fieldPrefix );
-
-               return array_map( function ( $fieldName ) use ( $start ) {
-                       return substr( $fieldName, $start );
-               }, $fieldNames );
-       }
-
-       /**
-        * Takes a field name with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string $fieldName
-        *
-        * @return string
-        */
-       public function unprefixFieldName( $fieldName ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               return substr( $fieldName, strlen( $this->fieldPrefix ) );
-       }
-
-       /**
-        * Get an instance of this class.
-        *
-        * @since 1.20
-        * @deprecated since 1.21
-        *
-        * @return IORMTable
-        */
-       public static function singleton() {
-               $class = get_called_class();
-
-               if ( !array_key_exists( $class, self::$instanceCache ) ) {
-                       self::$instanceCache[$class] = new $class;
-               }
-
-               return self::$instanceCache[$class];
-       }
-
-       /**
-        * Get an array with fields from a database result,
-        * that can be fed directly to the constructor or
-        * to setFields.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        * @throws MWException
-        * @return array
-        */
-       public function getFieldsFromDBResult( stdClass $result ) {
-               $result = (array)$result;
-
-               $rawFields = array_combine(
-                       $this->stripFieldPrefix( 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;
-       }
-
-       /**
-        * @see ORMTable::newRowFromFromDBResult
-        *
-        * @deprecated since 1.20 use newRowFromDBResult instead
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newFromDBResult( stdClass $result ) {
-               return self::newRowFromDBResult( $result );
-       }
-
-       /**
-        * Get a new instance of the class from a database result.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newRowFromDBResult( stdClass $result ) {
-               return $this->newRow( $this->getFieldsFromDBResult( $result ) );
-       }
-
-       /**
-        * @see ORMTable::newRow
-        *
-        * @deprecated since 1.20 use newRow instead
-        * @since 1.20
-        *
-        * @param array $data
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newFromArray( array $data, $loadDefaults = false ) {
-               return static::newRow( $data, $loadDefaults );
-       }
-
-       /**
-        * Get a new instance of the class from an array.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $fields, $loadDefaults = false ) {
-               $class = $this->getRowClass();
-
-               return new $class( $this, $fields, $loadDefaults );
-       }
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFieldNames() {
-               return array_keys( $this->getFields() );
-       }
-
-       /**
-        * Gets if the object can take a certain field.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function canHaveField( $name ) {
-               return array_key_exists( $name, $this->getFields() );
-       }
-
-       /**
-        * Updates the provided row in the database.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row The row to save
-        * @param string|null $functionName
-        *
-        * @return bool 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.22
-        *
-        * @param IORMRow $row
-        * @param string|null $functionName
-        * @param array|null $options
-        *
-        * @return bool 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.22
-        *
-        * @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.22
-        *
-        * @param IORMRow $row
-        * @param string|null $functionName
-        *
-        * @return bool 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.22
-        *
-        * @param array $conditions
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool 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 bad04f9..86f0110 100644 (file)
@@ -29,11 +29,17 @@ abstract class LBFactory {
        /** @var LBFactory */
        private static $instance;
 
+       /** @var string|bool Reason all LBs are read-only or false if not */
+       protected $readOnlyReason = false;
+
        /**
         * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
         * @param array $conf
         */
        public function __construct( array $conf ) {
+               if ( isset( $conf['readOnlyReason'] ) && is_string( $conf['readOnlyReason'] ) ) {
+                       $this->readOnlyReason = $conf['readOnlyReason'];
+               }
        }
 
        /**
@@ -55,8 +61,11 @@ abstract class LBFactory {
 
                if ( is_null( self::$instance ) ) {
                        $class = self::getLBFactoryClass( $wgLBFactoryConf );
-
-                       self::$instance = new $class( $wgLBFactoryConf );
+                       $config = $wgLBFactoryConf;
+                       if ( !isset( $config['readOnlyReason'] ) ) {
+                               $config['readOnlyReason'] = wfConfiguredReadOnlyReason();
+                       }
+                       self::$instance = new $class( $config );
                }
 
                return self::$instance;
@@ -191,7 +200,10 @@ abstract class LBFactory {
         * Commit changes on all master connections
         */
        public function commitMasterChanges() {
+               $start = microtime( true );
                $this->forEachLBCallMethod( 'commitMasterChanges' );
+               $timeMs = 1000 * ( microtime( true ) - $start );
+               RequestContext::getMain()->getStats()->timing( "db.commit-masters", $timeMs );
        }
 
        /**
index 2655659..089dfd3 100644 (file)
@@ -209,19 +209,27 @@ class LBFactoryMulti extends LBFactory {
        public function newMainLB( $wiki = false ) {
                list( $dbName, ) = $this->getDBNameAndPrefix( $wiki );
                $section = $this->getSectionForWiki( $wiki );
-               $groupLoads = array();
                if ( isset( $this->groupLoadsByDB[$dbName] ) ) {
                        $groupLoads = $this->groupLoadsByDB[$dbName];
+               } else {
+                       $groupLoads = array();
                }
 
                if ( isset( $this->groupLoadsBySection[$section] ) ) {
                        $groupLoads = array_merge_recursive( $groupLoads, $this->groupLoadsBySection[$section] );
                }
 
+               $readOnlyReason = $this->readOnlyReason;
+               // Use the LB-specific read-only reason if everything isn't already read-only
+               if ( $readOnlyReason === false && isset( $this->readOnlyBySection[$section] ) ) {
+                       $readOnlyReason = $this->readOnlyBySection[$section];
+               }
+
                return $this->newLoadBalancer(
                        $this->serverTemplate,
                        $this->sectionLoads[$section],
-                       $groupLoads
+                       $groupLoads,
+                       $readOnlyReason
                );
        }
 
@@ -259,7 +267,12 @@ class LBFactoryMulti extends LBFactory {
                        $template = $this->templateOverridesByCluster[$cluster] + $template;
                }
 
-               return $this->newLoadBalancer( $template, $this->externalLoads[$cluster], array() );
+               return $this->newLoadBalancer(
+                       $template,
+                       $this->externalLoads[$cluster],
+                       array(),
+                       $this->readOnlyReason
+               );
        }
 
        /**
@@ -283,16 +296,15 @@ class LBFactoryMulti extends LBFactory {
         * @param array $template
         * @param array $loads
         * @param array $groupLoads
+        * @param string|bool $readOnlyReason
         * @return LoadBalancer
         */
-       private function newLoadBalancer( $template, $loads, $groupLoads ) {
-               $servers = $this->makeServerArray( $template, $loads, $groupLoads );
-               $lb = new LoadBalancer( array(
-                       'servers' => $servers,
-                       'loadMonitor' => $this->loadMonitorClass
+       private function newLoadBalancer( $template, $loads, $groupLoads, $readOnlyReason ) {
+               return new LoadBalancer( array(
+                       'servers' => $this->makeServerArray( $template, $loads, $groupLoads ),
+                       'loadMonitor' => $this->loadMonitorClass,
+                       'readOnlyReason' => $readOnlyReason
                ) );
-
-               return $lb;
        }
 
        /**
index e328727..353c47a 100644 (file)
@@ -89,7 +89,8 @@ class LBFactorySimple extends LBFactory {
 
                return new LoadBalancer( array(
                        'servers' => $servers,
-                       'loadMonitor' => $this->loadMonitorClass
+                       'loadMonitor' => $this->loadMonitorClass,
+                       'readOnlyReason' => $this->readOnlyReason
                ) );
        }
 
@@ -121,7 +122,8 @@ class LBFactorySimple extends LBFactory {
 
                return new LoadBalancer( array(
                        'servers' => $wgExternalServers[$cluster],
-                       'loadMonitor' => $this->loadMonitorClass
+                       'loadMonitor' => $this->loadMonitorClass,
+                       'readOnlyReason' => $this->readOnlyReason
                ) );
        }
 
index 32bce6c..5a6cfa7 100644 (file)
@@ -35,6 +35,7 @@ class LBFactorySingle extends LBFactory {
        public function __construct( array $conf ) {
                parent::__construct( $conf );
 
+               $conf['readOnlyReason'] = $this->readOnlyReason;
                $this->lb = new LoadBalancerSingle( $conf );
        }
 
@@ -93,12 +94,21 @@ class LoadBalancerSingle extends LoadBalancer {
         */
        public function __construct( array $params ) {
                $this->db = $params['connection'];
-               parent::__construct( array( 'servers' => array( array(
-                       'type' => $this->db->getType(),
-                       'host' => $this->db->getServer(),
-                       'dbname' => $this->db->getDBname(),
-                       'load' => 1,
-               ) ) ) );
+
+               parent::__construct( array(
+                       'servers' => array(
+                               array(
+                                       'type' => $this->db->getType(),
+                                       'host' => $this->db->getServer(),
+                                       'dbname' => $this->db->getDBname(),
+                                       'load' => 1,
+                               )
+                       )
+               ) );
+
+               if ( isset( $params['readOnlyReason'] ) ) {
+                       $this->db->setLBInfo( 'readOnlyReason', $params['readOnlyReason'] );
+               }
        }
 
        /**
index fbc8c8c..bc9465b 100644 (file)
@@ -55,9 +55,13 @@ class LoadBalancer {
        /** @var bool|DBMasterPos False if not set */
        private $mWaitForPos;
        /** @var bool Whether the generic reader fell back to a lagged slave */
-       private $mLaggedSlaveMode;
+       private $laggedSlaveMode = false;
+       /** @var bool Whether the generic reader fell back to a lagged slave */
+       private $slavesDownMode = false;
        /** @var string The last DB selection or connection error */
        private $mLastError = 'Unknown error';
+       /** @var string|bool Reason the LB is read-only or false if not */
+       private $readOnlyReason = false;
        /** @var integer Total connections opened */
        private $connsOpened = 0;
 
@@ -68,8 +72,9 @@ class LoadBalancer {
 
        /**
         * @param array $params Array with keys:
-        *   servers           Required. Array of server info structures.
-        *   loadMonitor       Name of a class used to fetch server lag and load.
+        *  - servers : Required. Array of server info structures.
+        *  - loadMonitor : Name of a class used to fetch server lag and load.
+        *  - readOnlyReason : Reason the master DB is read-only if so [optional]
         * @throws MWException
         */
        public function __construct( array $params ) {
@@ -87,10 +92,13 @@ class LoadBalancer {
                        'foreignFree' => array() );
                $this->mLoads = array();
                $this->mWaitForPos = false;
-               $this->mLaggedSlaveMode = false;
                $this->mErrorConnection = false;
                $this->mAllowLagged = false;
 
+               if ( isset( $params['readOnlyReason'] ) && is_string( $params['readOnlyReason'] ) ) {
+                       $this->readOnlyReason = $params['readOnlyReason'];
+               }
+
                if ( isset( $params['loadMonitor'] ) ) {
                        $this->mLoadMonitorClass = $params['loadMonitor'];
                } else {
@@ -154,7 +162,7 @@ class LoadBalancer {
        /**
         * @param array $loads
         * @param bool|string $wiki Wiki to get non-lagged for
-        * @param float $maxLag Restrict the maximum allowed lag to this many seconds
+        * @param int $maxLag Restrict the maximum allowed lag to this many seconds
         * @return bool|int|string
         */
        private function getRandomNonLagged( array $loads, $wiki = false, $maxLag = self::MAX_LAG ) {
@@ -329,7 +337,7 @@ class LoadBalancer {
                                $this->mReadIndex = $i;
                                # Record if the generic reader index is in "lagged slave" mode
                                if ( $laggedSlaveMode ) {
-                                       $this->mLaggedSlaveMode = true;
+                                       $this->laggedSlaveMode = true;
                                }
                        }
                        $serverName = $this->getServerName( $i );
@@ -352,7 +360,7 @@ class LoadBalancer {
                if ( $i > 0 ) {
                        if ( !$this->doWait( $i ) ) {
                                $this->mServers[$i]['slave pos'] = $this->getAnyOpenConnection( $i )->getSlavePos();
-                               $this->mLaggedSlaveMode = true;
+                               $this->laggedSlaveMode = true;
                        }
                }
        }
@@ -548,12 +556,9 @@ class LoadBalancer {
                        $trxProf->recordConnection( $host, $dbname, $masterOnly );
                }
 
-               # Make master connections read only if in lagged slave mode
-               if ( $masterOnly && $this->getServerCount() > 1 && $this->getLaggedSlaveMode() ) {
-                       $conn->setLBInfo( 'readOnlyReason',
-                               'The database has been automatically locked ' .
-                               'while the slave database servers catch up to the master'
-                       );
+               if ( $masterOnly ) {
+                       # Make master-requested DB handles inherit any read-only mode setting
+                       $conn->setLBInfo( 'readOnlyReason', $this->getReadOnlyReason( $wiki ) );
                }
 
                return $conn;
@@ -1142,13 +1147,24 @@ class LoadBalancer {
 
        /**
         * @note This method will trigger a DB connection if not yet done
+        *
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
         * @return bool Whether the generic connection for reads is highly "lagged"
         */
-       public function getLaggedSlaveMode() {
-               # Get a generic reader connection
-               $this->getConnection( DB_SLAVE );
+       public function getLaggedSlaveMode( $wiki = false ) {
+               // No-op if there is only one DB (also avoids recursion)
+               if ( !$this->laggedSlaveMode && $this->getServerCount() > 1 ) {
+                       try {
+                               // See if laggedSlaveMode gets set
+                               $this->getConnection( DB_SLAVE, false, $wiki );
+                       } catch ( DBConnectionError $e ) {
+                               // Avoid expensive re-connect attempts and failures
+                               $this->slavesDownMode = true;
+                               $this->laggedSlaveMode = true;
+                       }
+               }
 
-               return $this->mLaggedSlaveMode;
+               return $this->laggedSlaveMode;
        }
 
        /**
@@ -1157,7 +1173,29 @@ class LoadBalancer {
         * @since 1.27
         */
        public function laggedSlaveUsed() {
-               return $this->mLaggedSlaveMode;
+               return $this->laggedSlaveMode;
+       }
+
+       /**
+        * @note This method may trigger a DB connection if not yet done
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
+        * @return string|bool Reason the master is read-only or false if it is not
+        * @since 1.27
+        */
+       public function getReadOnlyReason( $wiki = false ) {
+               if ( $this->readOnlyReason !== false ) {
+                       return $this->readOnlyReason;
+               } elseif ( $this->getLaggedSlaveMode( $wiki ) ) {
+                       if ( $this->slavesDownMode ) {
+                               return 'The database has been automatically locked ' .
+                                       'until the slave database servers become available';
+                       } else {
+                               return 'The database has been automatically locked ' .
+                                       'while the slave database servers catch up to the master.';
+                       }
+               }
+
+               return false;
        }
 
        /**
index 39ced1b..59d6ef6 100644 (file)
@@ -36,8 +36,8 @@ class LoadMonitorMySQL implements LoadMonitor {
        public function __construct( $parent ) {
                $this->parent = $parent;
 
-               $this->srvCache = ObjectCache::newAccelerator( 'hash' );
-               $this->mainCache = wfGetMainCache();
+               $this->srvCache = ObjectCache::getLocalServerInstance( 'hash' );
+               $this->mainCache = ObjectCache::getLocalClusterInstance();
        }
 
        public function scaleLoads( &$loads, $group = false, $wiki = false ) {
index f1b24e7..92fbb46 100644 (file)
@@ -94,18 +94,22 @@ class LoggerFactory {
         * @return \\Psr\\Log\\LoggerInterface
         */
        public static function getInstance( $channel ) {
-               if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
-                       $message = (
-                               'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
-                               "library</a> to be present. This library is not embedded directly in MediaWiki's " .
-                               "git repository and must be installed separately by the end user.\n\n" .
-                               'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
-                               '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
-                               'the required components.'
-                       );
-                       echo $message;
-                       trigger_error( $message, E_USER_ERROR );
-                       die( 1 );
+               static $hasPSR3Interface = null;
+               if ( $hasPSR3Interface === null ) {
+                       $hasPSR3Interface = interface_exists( '\Psr\Log\LoggerInterface' );
+                       if ( !$hasPSR3Interface ) {
+                               $message = (
+                                       'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
+                                       "library</a> to be present. This library is not embedded directly in MediaWiki's " .
+                                       "git repository and must be installed separately by the end user.\n\n" .
+                                       'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
+                                       '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
+                                       'the required components.'
+                               );
+                               echo $message;
+                               trigger_error( $message, E_USER_ERROR );
+                               die( 1 );
+                       }
                }
 
                return self::getProvider()->getLogger( $channel );
index 8f8ed2e..0194a61 100644 (file)
@@ -94,11 +94,17 @@ class DeferredUpdates {
        /**
         * Do any deferred updates and clear the list
         *
-        * @param string $commit Set to 'commit' to commit after every update to
         * @param string $mode Use "enqueue" to use the job queue when possible [Default: run]
         *   prevent lock contention
+        * @param string $oldMode Unused
         */
-       public static function doUpdates( $commit = '', $mode = 'run' ) {
+       public static function doUpdates( $mode = 'run', $oldMode = '' ) {
+               // B/C for ( $commit, $mode ) args
+               $mode = $oldMode ?: $mode;
+               if ( $mode === 'commit' ) {
+                       $mode = 'run';
+               }
+
                $updates = self::$updates;
 
                while ( count( $updates ) ) {
@@ -121,9 +127,7 @@ class DeferredUpdates {
                        foreach ( $otherUpdates as $update ) {
                                try {
                                        $update->doUpdate();
-                                       if ( $commit === 'commit' ) {
-                                               wfGetLBFactory()->commitMasterChanges();
-                                       }
+                                       wfGetLBFactory()->commitMasterChanges();
                                } catch ( Exception $e ) {
                                        // We don't want exceptions thrown during deferred updates to
                                        // be reported to the user since the output is already sent.
index d784840..4a7b991 100644 (file)
@@ -108,7 +108,7 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate
                        'wiki' => $this->mDb->getWikiID(),
                        'job'  => new JobSpecification(
                                'deleteLinks',
-                               array( 'pageId' => $this->page->getId() ),
+                               array( 'pageId' => $this->pageId ),
                                array( 'removeDuplicates' => true ),
                                $this->page->getTitle()
                        )
index d996870..9a24b96 100644 (file)
@@ -61,6 +61,12 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        /** @var bool Whether to queue jobs for recursive updates */
        public $mRecursive;
 
+       /** @var bool Whether this job was triggered by a recursive update job */
+       private $mTriggeredRecursive;
+
+       /** @var Revision Revision for which this update has been triggered */
+       private $mRevision;
+
        /**
         * @var null|array Added links if calculated.
         */
@@ -71,6 +77,11 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
         */
        private $linkDeletions = null;
 
+       /**
+        * @var User|null
+        */
+       private $user;
+
        /**
         * Constructor
         *
@@ -79,25 +90,16 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
         * @param bool $recursive Queue jobs for recursive updates?
         * @throws MWException
         */
-       function __construct( $title, $parserOutput, $recursive = true ) {
+       function __construct( Title $title, ParserOutput $parserOutput, $recursive = true ) {
                parent::__construct( false ); // no implicit transaction
 
-               if ( !( $title instanceof Title ) ) {
-                       throw new MWException( "The calling convention to LinksUpdate::LinksUpdate() has changed. " .
-                               "Please see Article::editUpdates() for an invocation example.\n" );
-               }
-
-               if ( !( $parserOutput instanceof ParserOutput ) ) {
-                       throw new MWException( "The calling convention to LinksUpdate::__construct() has changed. " .
-                               "Please see WikiPage::doEditUpdates() for an invocation example.\n" );
-               }
-
                $this->mTitle = $title;
                $this->mId = $title->getArticleID();
 
                if ( !$this->mId ) {
-                       throw new MWException( "The Title object did not provide an article " .
-                               "ID. Perhaps the page doesn't exist?" );
+                       throw new InvalidArgumentException(
+                               "The Title object yields no ID. Perhaps the page doesn't exist?"
+                       );
                }
 
                $this->mParserOutput = $parserOutput;
@@ -147,6 +149,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        }
 
        protected function doIncrementalUpdate() {
+               global $wgRCWatchCategoryMembership;
 
                # Page links
                $existing = $this->getExistingLinks();
@@ -199,6 +202,14 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                $this->invalidateCategories( $categoryUpdates );
                $this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
 
+               # Category membership changes
+               if (
+                       $wgRCWatchCategoryMembership &&
+                       !$this->mTriggeredRecursive && ( $categoryInserts || $categoryDeletes )
+               ) {
+                       $this->triggerCategoryChanges( $categoryInserts, $categoryDeletes );
+               }
+
                # Page properties
                $existing = $this->getExistingProperties();
 
@@ -222,6 +233,24 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
 
        }
 
+       private function triggerCategoryChanges( $categoryInserts, $categoryDeletes ) {
+               $catMembChange = new CategoryMembershipChange( $this->mTitle, $this->mRevision );
+
+               if ( $this->mRecursive ) {
+                       $catMembChange->checkTemplateLinks();
+               }
+
+               foreach ( $categoryInserts as $categoryName => $value ) {
+                       $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
+                       $catMembChange->triggerCategoryAddedNotification( $categoryTitle );
+               }
+
+               foreach ( $categoryDeletes as $categoryName => $value ) {
+                       $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
+                       $catMembChange->triggerCategoryRemovedNotification( $categoryTitle );
+               }
+       }
+
        /**
         * Queue recursive jobs for this page
         *
@@ -243,7 +272,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                // Which ever runs first generally no-ops the other one.
                $jobs = array();
                foreach ( $bc->getCascadeProtectedLinks() as $title ) {
-                       $jobs[] = new RefreshLinksJob( $title, array( 'prioritize' => true ) );
+                       $jobs[] = RefreshLinksJob::newPrioritized( $title, array() );
                }
                JobQueueGroup::singleton()->push( $jobs );
        }
@@ -863,6 +892,44 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                return $this->mImages;
        }
 
+       /**
+        * Set this object as being triggered by a recursive LinksUpdate
+        *
+        * @since 1.27
+        */
+       public function setTriggeredRecursive() {
+               $this->mTriggeredRecursive = true;
+       }
+
+       /**
+        * Set the revision corresponding to this LinksUpdate
+        *
+        * @since 1.27
+        *
+        * @param Revision $revision
+        */
+       public function setRevision( Revision $revision ) {
+               $this->mRevision = $revision;
+       }
+
+       /**
+        * Set the User who triggered this LinksUpdate
+        *
+        * @since 1.27
+        * @param User $user
+        */
+       public function setTriggeringUser( User $user ) {
+               $this->user = $user;
+       }
+
+       /**
+        * @since 1.27
+        * @return null|User
+        */
+       public function getTriggeringUser() {
+               return $this->user;
+       }
+
        /**
         * Invalidate any necessary link lists related to page property changes
         * @param array $changed
@@ -936,11 +1003,24 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        }
 
        public function getAsJobSpecification() {
+               if ( $this->user ) {
+                       $userInfo = array(
+                               'userId' => $this->user->getId(),
+                               'userName' => $this->user->getName(),
+                       );
+               } else {
+                       $userInfo = false;
+               }
                return array(
                        'wiki' => $this->mDb->getWikiID(),
                        'job'  => new JobSpecification(
-                               'refreshLinks',
-                               array( 'prioritize' => true ),
+                               'refreshLinksPrioritized',
+                               array(
+                                       // Reuse the parser cache if it was saved
+                                       'rootJobTimestamp' => $this->mParserOutput->getCacheTime(),
+                                       'useRecursiveLinksUpdate' => $this->mRecursive,
+                                       'triggeringUser' => $userInfo,
+                               ),
                                array( 'removeDuplicates' => true ),
                                $this->getTitle()
                        )
index d135a80..73de755 100644 (file)
@@ -207,8 +207,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param int $delta Delta (positive or negative)
         */
        protected function adjustPending( $type, $delta ) {
-               global $wgMemc;
-
+               $cache = ObjectCache::getMainStashInstance();
                if ( $delta < 0 ) { // decrement
                        $key = $this->getTypeCacheKey( $type, '-' );
                } else { // increment
@@ -216,11 +215,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
                }
 
                $magnitude = abs( $delta );
-               if ( !$wgMemc->incr( $key, $magnitude ) ) { // not there?
-                       if ( !$wgMemc->add( $key, $magnitude ) ) { // race?
-                               $wgMemc->incr( $key, $magnitude );
-                       }
-               }
+               $cache->incrWithInit( $key, 0, $magnitude, $magnitude );
        }
 
        /**
@@ -228,15 +223,16 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @return array Positive and negative deltas for each type
         */
        protected function getPendingDeltas() {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
                $pending = array();
                foreach ( array( 'ss_total_edits',
                        'ss_good_articles', 'ss_total_pages', 'ss_users', 'ss_images' ) as $type
                ) {
                        // Get pending increments and pending decrements
-                       $pending[$type]['+'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '+' ) );
-                       $pending[$type]['-'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '-' ) );
+                       $flg = BagOStuff::READ_LATEST;
+                       $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $type, '+' ), $flg );
+                       $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $type, '-' ), $flg );
                }
 
                return $pending;
@@ -247,12 +243,12 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param array $pd Result of getPendingDeltas(), used for DB update
         */
        protected function removePendingDeltas( array $pd ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
                foreach ( $pd as $type => $deltas ) {
                        foreach ( $deltas as $sign => $magnitude ) {
                                // Lower the pending counter now that we applied these changes
-                               $wgMemc->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
+                               $cache->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
                        }
                }
        }
index e148f56..0e4161c 100644 (file)
  * Handles purging appropriate Squid URLs given a title (or titles)
  * @ingroup Cache
  */
-class SquidUpdate {
-       /**
-        * Collection of URLs to purge.
-        * @var array
-        */
-       protected $urlArr;
+class SquidUpdate implements DeferrableUpdate {
+       /** @var string[] Collection of URLs to purge */
+       protected $urls = array();
 
        /**
         * @param array $urlArr Collection of URLs to purge
-        * @param bool|int $maxTitles Maximum number of unique URLs to purge
         */
-       public function __construct( $urlArr = array(), $maxTitles = false ) {
-               global $wgMaxSquidPurgeTitles;
-               if ( $maxTitles === false ) {
-                       $maxTitles = $wgMaxSquidPurgeTitles;
-               }
-
+       public function __construct( array $urlArr ) {
                // Remove duplicate URLs from list
-               $urlArr = array_unique( $urlArr );
-               if ( count( $urlArr ) > $maxTitles ) {
-                       // Truncate to desired maximum URL count
-                       $urlArr = array_slice( $urlArr, 0, $maxTitles );
-               }
-               $this->urlArr = $urlArr;
+               $this->urls = array_unique( $urlArr );
        }
 
        /**
@@ -59,14 +45,9 @@ class SquidUpdate {
         * @return SquidUpdate
         */
        public static function newFromTitles( $titles, $urlArr = array() ) {
-               global $wgMaxSquidPurgeTitles;
-               $i = 0;
                /** @var Title $title */
                foreach ( $titles as $title ) {
                        $urlArr[] = $title->getInternalURL();
-                       if ( $i++ > $wgMaxSquidPurgeTitles ) {
-                               break;
-                       }
                }
 
                return new SquidUpdate( $urlArr );
@@ -75,6 +56,7 @@ class SquidUpdate {
        /**
         * @param Title $title
         * @return SquidUpdate
+        * @deprecated 1.27
         */
        public static function newSimplePurge( Title $title ) {
                $urlArr = $title->getSquidURLs();
@@ -86,7 +68,7 @@ class SquidUpdate {
         * Purges the list of URLs passed to the constructor.
         */
        public function doUpdate() {
-               self::purge( $this->urlArr );
+               self::purge( $this->urls );
        }
 
        /**
@@ -97,7 +79,7 @@ class SquidUpdate {
         *
         * @param array $urlArr List of full URLs to purge
         */
-       public static function purge( $urlArr ) {
+       public static function purge( array $urlArr ) {
                global $wgSquidServers, $wgHTCPRouting;
 
                if ( !$urlArr ) {
@@ -110,31 +92,33 @@ class SquidUpdate {
                        self::HTCPPurge( $urlArr );
                }
 
-               // Remove duplicate URLs
-               $urlArr = array_unique( $urlArr );
-               // Maximum number of parallel connections per squid
-               $maxSocketsPerSquid = 8;
-               // Number of requests to send per socket
-               // 400 seems to be a good tradeoff, opening a socket takes a while
-               $urlsPerSocket = 400;
-               $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
-               if ( $socketsPerSquid > $maxSocketsPerSquid ) {
-                       $socketsPerSquid = $maxSocketsPerSquid;
-               }
+               if ( $wgSquidServers ) {
+                       // Remove duplicate URLs
+                       $urlArr = array_unique( $urlArr );
+                       // Maximum number of parallel connections per squid
+                       $maxSocketsPerSquid = 8;
+                       // Number of requests to send per socket
+                       // 400 seems to be a good tradeoff, opening a socket takes a while
+                       $urlsPerSocket = 400;
+                       $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
+                       if ( $socketsPerSquid > $maxSocketsPerSquid ) {
+                               $socketsPerSquid = $maxSocketsPerSquid;
+                       }
 
-               $pool = new SquidPurgeClientPool;
-               $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerSquid ) );
-               foreach ( $wgSquidServers as $server ) {
-                       foreach ( $chunks as $chunk ) {
-                               $client = new SquidPurgeClient( $server );
-                               foreach ( $chunk as $url ) {
-                                       $client->queuePurge( $url );
+                       $pool = new SquidPurgeClientPool;
+                       $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerSquid ) );
+                       foreach ( $wgSquidServers as $server ) {
+                               foreach ( $chunks as $chunk ) {
+                                       $client = new SquidPurgeClient( $server );
+                                       foreach ( $chunk as $url ) {
+                                               $client->queuePurge( $url );
+                                       }
+                                       $pool->addClient( $client );
                                }
-                               $pool->addClient( $client );
                        }
-               }
-               $pool->run();
 
+                       $pool->run();
+               }
        }
 
        /**
@@ -143,7 +127,7 @@ class SquidUpdate {
         * @throws MWException
         * @param array $urlArr Collection of URLs to purge
         */
-       public static function HTCPPurge( $urlArr ) {
+       protected static function HTCPPurge( $urlArr ) {
                global $wgHTCPRouting, $wgHTCPMulticastTTL;
 
                // HTCP CLR operation
index d327433..14810da 100644 (file)
@@ -420,7 +420,7 @@ class DiffEngine {
                        }
 
                        $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $chunk ) / $nchunks );
-                       // @codingStandardsIgnoreFile Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
+                       // @codingStandardsIgnoreStart Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                        for ( ; $x < $x1; $x++ ) {
                                // @codingStandardsIgnoreEnd
                                $line = $flip ? $this->yv[$x] : $this->xv[$x];
@@ -444,7 +444,7 @@ class DiffEngine {
                                        if ( $y > $this->seq[$k - 1] ) {
                                                assert( '$y < $this->seq[$k]' );
                                                // Optimization: this is a common case:
-                                               //      next match is just replacing previous match.
+                                               // next match is just replacing previous match.
                                                $this->in_seq[$this->seq[$k]] = false;
                                                $this->seq[$k] = $y;
                                                $this->in_seq[$y] = 1;
index 6544078..ae610fa 100644 (file)
@@ -680,7 +680,6 @@ class DifferenceEngine extends ContextSource {
         * @return mixed (string/false)
         */
        public function getDiffBody() {
-               global $wgMemc;
                $this->mCacheHit = true;
                // Check if the diff should be hidden from this user
                if ( !$this->loadRevisionData() ) {
@@ -702,12 +701,13 @@ class DifferenceEngine extends ContextSource {
                }
                // Cacheable?
                $key = false;
+               $cache = ObjectCache::getMainWANInstance();
                if ( $this->mOldid && $this->mNewid ) {
                        $key = $this->getDiffBodyCacheKey();
 
                        // Try cache
                        if ( !$this->mRefreshCache ) {
-                               $difftext = $wgMemc->get( $key );
+                               $difftext = $cache->get( $key );
                                if ( $difftext ) {
                                        wfIncrStats( 'diff_cache.hit' );
                                        $difftext = $this->localiseLineNumbers( $difftext );
@@ -731,7 +731,7 @@ class DifferenceEngine extends ContextSource {
                        wfIncrStats( 'diff_cache.uncacheable' );
                } elseif ( $key !== false && $difftext !== false ) {
                        wfIncrStats( 'diff_cache.miss' );
-                       $wgMemc->set( $key, $difftext, 7 * 86400 );
+                       $cache->set( $key, $difftext, 7 * 86400 );
                } else {
                        wfIncrStats( 'diff_cache.uncacheable' );
                }
index 3631a34..6366c74 100644 (file)
@@ -44,7 +44,7 @@ class ErrorPageError extends MWException {
                // 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 ) {
-                       $enMsg = clone( $msg );
+                       $enMsg = clone $msg;
                } else {
                        $enMsg = wfMessage( $msg, $params );
                }
index 4e50070..5734902 100644 (file)
@@ -380,10 +380,12 @@ TXT;
                                $text .= "{$pad}#{$level} [internal function]: ";
                        }
 
-                       if ( isset( $frame['class'] ) ) {
+                       if ( isset( $frame['class'] ) && isset( $frame['type'] ) && isset( $frame['function'] ) ) {
                                $text .= $frame['class'] . $frame['type'] . $frame['function'];
-                       } else {
+                       } elseif ( isset( $frame['function'] ) ) {
                                $text .= $frame['function'];
+                       } else {
+                               $text .= 'NO_FUNCTION_GIVEN';
                        }
 
                        if ( isset( $frame['args'] ) ) {
index cd82ab1..8d76e96 100644 (file)
@@ -375,11 +375,6 @@ abstract class FileBackend {
                if ( empty( $opts['force'] ) ) { // sanity
                        unset( $opts['nonLocking'] );
                }
-               foreach ( $ops as &$op ) {
-                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
-                               $op['headers']['Content-Disposition'] = $op['disposition'];
-                       }
-               }
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doOperationsInternal( $ops, $opts );
@@ -611,9 +606,6 @@ abstract class FileBackend {
                }
                foreach ( $ops as &$op ) {
                        $op['overwrite'] = true; // avoids RTTs in key/value stores
-                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
-                               $op['headers']['Content-Disposition'] = $op['disposition'];
-                       }
                }
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
index b6ddbad..c043106 100644 (file)
@@ -166,6 +166,7 @@ class FileBackendGroup {
                                ? FileJournal::factory( $config['fileJournal'], $name )
                                : FileJournal::factory( array( 'class' => 'NullFileJournal' ), $name );
                        $config['wanCache'] = ObjectCache::getMainWANInstance();
+                       $config['mimeCallback'] = array( $this, 'guessMimeInternal' );
 
                        $this->backends[$name]['instance'] = new $class( $config );
                }
@@ -203,4 +204,27 @@ class FileBackendGroup {
 
                return null;
        }
+
+       /**
+        * @param string $storagePath
+        * @param string|null $content
+        * @param string|null $fsPath
+        * @return string
+        * @since 1.27
+        */
+       public function guessMimeInternal( $storagePath, $content, $fsPath ) {
+               $magic = MimeMagic::singleton();
+               // Trust the extension of the storage path (caller must validate)
+               $ext = FileBackend::extensionFromPath( $storagePath );
+               $type = $magic->guessTypesForExtension( $ext );
+               // For files without a valid extension (or one at all), inspect the contents
+               if ( !$type && $fsPath ) {
+                       $type = $magic->guessMimeType( $fsPath, false );
+               } elseif ( !$type && strlen( $content ) ) {
+                       $tmpFile = TempFSFile::factory( 'mime_' );
+                       file_put_contents( $tmpFile->getPath(), $content );
+                       $type = $magic->guessMimeType( $tmpFile->getPath(), false );
+               }
+               return $type ?: 'unknown/unknown';
+       }
 }
index 9433964..1432bb9 100644 (file)
@@ -58,7 +58,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * @see FileBackend::__construct()
         * Additional $config params include:
-        *   - wanCache     : WANOBjectCache object to use for persistent caching.
+        *   - wanCache     : WANObjectCache object to use for persistent caching.
         *   - mimeCallback : Callback that takes (storage path, content, file system path) and
         *                    returns the MIME type of the file or 'unknown/unknown'. The file
         *                    system path parameter should be used if the content one is null.
@@ -69,10 +69,7 @@ abstract class FileBackendStore extends FileBackend {
                parent::__construct( $config );
                $this->mimeCallback = isset( $config['mimeCallback'] )
                        ? $config['mimeCallback']
-                       : function ( $storagePath, $content, $fsPath ) {
-                               // @todo handle the case of extension-less files using the contents
-                               return StreamFile::contentTypeFromPath( $storagePath ) ?: 'unknown/unknown';
-                       };
+                       : null;
                $this->memCache = WANObjectCache::newEmpty(); // disabled by default
                $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
                $this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE );
@@ -1066,7 +1063,7 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
-               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+               $ops = array_map( array( $this, 'sanitizeOpHeaders' ), $ops );
 
                // Build up a list of FileOps...
                $performOps = $this->getOperationsInternal( $ops );
@@ -1133,7 +1130,7 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
-               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+               $ops = array_map( array( $this, 'sanitizeOpHeaders' ), $ops );
 
                // Clear any file cache entries
                $this->clearCache();
@@ -1230,7 +1227,9 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * Strip long HTTP headers from a file operation.
+        * Normalize and filter HTTP headers from a file operation
+        *
+        * This normalizes and strips long HTTP headers from a file operation.
         * Most headers are just numbers, but some are allowed to be long.
         * This function is useful for cleaning up headers and avoiding backend
         * specific errors, especially in the middle of batch file operations.
@@ -1238,18 +1237,21 @@ abstract class FileBackendStore extends FileBackend {
         * @param array $op Same format as doOperation()
         * @return array
         */
-       protected function stripInvalidHeadersFromOp( array $op ) {
-               static $longs = array( 'Content-Disposition' );
+       protected function sanitizeOpHeaders( array $op ) {
+               static $longs = array( 'content-disposition' );
+
                if ( isset( $op['headers'] ) ) { // op sets HTTP headers
+                       $newHeaders = array();
                        foreach ( $op['headers'] as $name => $value ) {
+                               $name = strtolower( $name );
                                $maxHVLen = in_array( $name, $longs ) ? INF : 255;
                                if ( strlen( $name ) > 255 || strlen( $value ) > $maxHVLen ) {
                                        trigger_error( "Header '$name: $value' is too long." );
-                                       unset( $op['headers'][$name] );
-                               } elseif ( !strlen( $value ) ) {
-                                       $op['headers'][$name] = ''; // null/false => ""
+                               } else {
+                                       $newHeaders[$name] = strlen( $value ) ? $value : ''; // null/false => ""
                                }
                        }
+                       $op['headers'] = $newHeaders;
                }
 
                return $op;
@@ -1752,7 +1754,7 @@ abstract class FileBackendStore extends FileBackend {
                                $pathNames[$this->fileCacheKey( $path )] = $path;
                        }
                }
-               // Get all cache entries for these container cache keys...
+               // Get all cache entries for these file cache keys...
                $values = $this->memCache->getMulti( array_keys( $pathNames ) );
                foreach ( $values as $cacheKey => $val ) {
                        $path = $pathNames[$cacheKey];
@@ -1823,7 +1825,18 @@ abstract class FileBackendStore extends FileBackend {
         * @return string MIME type
         */
        protected function getContentType( $storagePath, $content, $fsPath ) {
-               return call_user_func_array( $this->mimeCallback, func_get_args() );
+               if ( $this->mimeCallback ) {
+                       return call_user_func_array( $this->mimeCallback, func_get_args() );
+               }
+
+               $mime = null;
+               if ( $fsPath !== null && function_exists( 'finfo_file' ) ) {
+                       $finfo = finfo_open( FILEINFO_MIME_TYPE );
+                       $mime = finfo_file( $finfo, $fsPath );
+                       finfo_close( $finfo );
+               }
+
+               return is_string( $mime ) ? $mime : 'unknown/unknown';
        }
 }
 
index 408194f..8097549 100644 (file)
@@ -136,10 +136,11 @@ class SwiftFileBackend extends FileBackendStore {
                // Cache auth token information to avoid RTTs
                if ( !empty( $config['cacheAuthInfo'] ) ) {
                        if ( PHP_SAPI === 'cli' ) {
-                               $this->srvCache = wfGetMainCache(); // preferrably memcached
+                               // Preferrably memcached
+                               $this->srvCache = ObjectCache::getLocalClusterInstance();
                        } else {
-                               // look for APC, XCache, WinCache, ect...
-                               $this->srvCache = ObjectCache::newAccelerator( CACHE_NONE );
+                               // Look for APC, XCache, WinCache, ect...
+                               $this->srvCache = ObjectCache::getLocalServerInstance( CACHE_NONE );
                        }
                } else {
                        $this->srvCache = new EmptyBagOStuff();
@@ -261,7 +262,9 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
-               $contentType = $this->getContentType( $params['dst'], $params['content'], null );
+               $contentType = isset( $params['headers']['content-type'] )
+                       ? $params['headers']['content-type']
+                       : $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = array( array(
                        'method' => 'PUT',
@@ -317,7 +320,9 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
                $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
-               $contentType = $this->getContentType( $params['dst'], null, $params['src'] );
+               $contentType = isset( $params['headers']['content-type'] )
+                       ? $params['headers']['content-type']
+                       : $this->getContentType( $params['dst'], null, $params['src'] );
 
                $handle = fopen( $params['src'], 'rb' );
                if ( $handle === false ) { // source doesn't exist?
index 9d4f009..42ebb46 100644 (file)
@@ -95,12 +95,7 @@ abstract class DBLockManager extends QuorumLockManager {
                        if ( count( $bucket ) > 1 ) { // multiple peers
                                // Tracks peers that couldn't be queried recently to avoid lengthy
                                // connection timeouts. This is useless if each bucket has one peer.
-                               try {
-                                       $this->statusCache = ObjectCache::newAccelerator();
-                               } catch ( Exception $e ) {
-                                       trigger_error( __CLASS__ .
-                                               " using multiple DB peers without apc, xcache, or wincache." );
-                               }
+                               $this->statusCache = ObjectCache::getLocalServerInstance();
                                break;
                        }
                }
index 4ffbf4a..f898bb6 100644 (file)
@@ -55,11 +55,11 @@ class ForeignAPIRepo extends FileRepo {
        );
 
        protected $fileFactory = array( 'ForeignAPIFile', 'newFromTitle' );
-       /** @var int Check back with Commons after a day (24*60*60) */
-       protected $apiThumbCacheExpiry = 86400;
+       /** @var int Check back with Commons after this expiry */
+       protected $apiThumbCacheExpiry = 86400; // 1 day (24*3600)
 
-       /** @var int Redownload thumbnail files after a month (86400*30) */
-       protected $fileCacheExpiry = 2592000;
+       /** @var int Redownload thumbnail files after this expiry */
+       protected $fileCacheExpiry = 2592000; // 1 month (30*24*3600)
 
        /** @var array */
        protected $mFileExists = array();
@@ -329,7 +329,7 @@ class ForeignAPIRepo extends FileRepo {
         * @return bool|string
         */
        function getThumbUrlFromCache( $name, $width, $height, $params = "" ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainWANInstance();
                // We can't check the local cache using FileRepo functions because
                // we override fileExistsBatch(). We have to use the FileBackend directly.
                $backend = $this->getBackend(); // convenience
@@ -342,7 +342,7 @@ class ForeignAPIRepo extends FileRepo {
                $sizekey = "$width:$height:$params";
 
                /* Get the array of urls that we already know */
-               $knownThumbUrls = $wgMemc->get( $key );
+               $knownThumbUrls = $cache->get( $key );
                if ( !$knownThumbUrls ) {
                        /* No knownThumbUrls for this file */
                        $knownThumbUrls = array();
@@ -388,7 +388,7 @@ class ForeignAPIRepo extends FileRepo {
                        if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
                                /* Use our current and already downloaded thumbnail */
                                $knownThumbUrls[$sizekey] = $localUrl;
-                               $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+                               $cache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
 
                                return $localUrl;
                        }
@@ -410,7 +410,7 @@ class ForeignAPIRepo extends FileRepo {
                        return $foreignUrl;
                }
                $knownThumbUrls[$sizekey] = $localUrl;
-               $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+               $cache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
                wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
 
                return $localUrl;
@@ -552,19 +552,16 @@ class ForeignAPIRepo extends FileRepo {
                }
 
                if ( !isset( $this->mQueryCache[$url] ) ) {
-                       global $wgMemc;
-
-                       $key = $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) );
-                       $data = $wgMemc->get( $key );
-
-                       if ( !$data ) {
-                               $data = self::httpGet( $url );
-
-                               if ( !$data ) {
-                                       return null;
+                       $data = ObjectCache::getMainWANInstance()->getWithSetCallback(
+                               $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) ),
+                               $cacheTTL,
+                               function () use ( $url ) {
+                                       return ForeignAPIRepo::httpGet( $url );
                                }
+                       );
 
-                               $wgMemc->set( $key, $data, $cacheTTL );
+                       if ( !$data ) {
+                               return null;
                        }
 
                        if ( count( $this->mQueryCache ) > 100 ) {
index 588ae6b..ee11df9 100644 (file)
@@ -1137,6 +1137,7 @@ abstract class File implements IDBAccessObject {
                if ( !$thumb ) { // bad params?
                        $thumb = false;
                } elseif ( $thumb->isError() ) { // transform error
+                       /** @var $thumb MediaTransformError */
                        $this->lastError = $thumb->toText();
                        // Ignore errors if requested
                        if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
@@ -1907,7 +1908,7 @@ abstract class File implements IDBAccessObject {
         * @param string $reason
         * @param bool $suppress Hide content from sysops?
         * @param User|null $user
-        * @return bool Boolean on success, false on some kind of failure
+        * @return FileRepoStatus
         * STUB
         * Overridden by LocalFile
         */
@@ -2019,15 +2020,19 @@ abstract class File implements IDBAccessObject {
         * @return string
         */
        function getDescriptionText( $lang = false ) {
-               global $wgMemc, $wgLang;
+               global $wgLang;
+
                if ( !$this->repo || !$this->repo->fetchDescription ) {
                        return false;
                }
-               if ( !$lang ) {
-                       $lang = $wgLang;
-               }
+
+               $lang = $lang ?: $wgLang;
+
                $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
                if ( $renderUrl ) {
+                       $cache = ObjectCache::getMainWANInstance();
+
+                       $key = null;
                        if ( $this->repo->descriptionCacheExpiry > 0 ) {
                                wfDebug( "Attempting to get the description from cache..." );
                                $key = $this->repo->getLocalCacheKey(
@@ -2036,7 +2041,7 @@ abstract class File implements IDBAccessObject {
                                        $lang->getCode(),
                                        $this->getName()
                                );
-                               $obj = $wgMemc->get( $key );
+                               $obj = $cache->get( $key );
                                if ( $obj ) {
                                        wfDebug( "success!\n" );
 
@@ -2046,8 +2051,8 @@ abstract class File implements IDBAccessObject {
                        }
                        wfDebug( "Fetching shared description from $renderUrl\n" );
                        $res = Http::get( $renderUrl, array(), __METHOD__ );
-                       if ( $res && $this->repo->descriptionCacheExpiry > 0 ) {
-                               $wgMemc->set( $key, $res, $this->repo->descriptionCacheExpiry );
+                       if ( $res && $key ) {
+                               $cache->set( $key, $res, $this->repo->descriptionCacheExpiry );
                        }
 
                        return $res;
index 3c78290..cad806d 100644 (file)
@@ -334,22 +334,20 @@ class ForeignAPIFile extends File {
        }
 
        function purgeDescriptionPage() {
-               global $wgMemc, $wgContLang;
+               global $wgContLang;
 
                $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
                $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
 
-               $wgMemc->delete( $key );
+               ObjectCache::getMainWANInstance()->delete( $key );
        }
 
        /**
         * @param array $options
         */
        function purgeThumbnails( $options = array() ) {
-               global $wgMemc;
-
                $key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() );
-               $wgMemc->delete( $key );
+               ObjectCache::getMainWANInstance()->delete( $key );
 
                $files = $this->getThumbnails();
                // Give media handler a chance to filter the purge list
index 0934f6a..181c7b8 100644 (file)
@@ -46,12 +46,13 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        array( 'class' => 'gallery mw-gallery-' . $this->mMode ), $this->mAttribs );
 
                $modules = $this->getModules();
-               $modules[] = 'mediawiki.page.gallery.styles';
 
                if ( $this->mParser ) {
                        $this->mParser->getOutput()->addModules( $modules );
+                       $this->mParser->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
                } else {
                        $this->getOutput()->addModules( $modules );
+                       $this->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
                }
                $output = Xml::openElement( 'ul', $attribs );
                if ( $this->mCaption ) {
index 19b45be..2d05704 100644 (file)
@@ -40,9 +40,9 @@ class HTMLRadioField extends HTMLFormField {
 
        function getInputOOUI( $value ) {
                $options = array();
-               foreach ( $this->getOptions() as $label => $value ) {
+               foreach ( $this->getOptions() as $label => $data ) {
                        $options[] = array(
-                               'data' => $value,
+                               'data' => $data,
                                'label' => $this->mOptionsLabelsNotFromMessage ? new OOUI\HtmlSnippet( $label ) : $label,
                        );
                }
index 064bd6d..ba0e38f 100644 (file)
@@ -164,7 +164,6 @@ abstract class Installer {
                'wgRightsIcon',
                'wgRightsText',
                'wgRightsUrl',
-               'wgMainCacheType',
                'wgEnableEmail',
                'wgEnableUserEmail',
                'wgEnotifUserTalk',
@@ -691,17 +690,6 @@ abstract class Installer {
                return Status::newGood();
        }
 
-       /**
-        * Exports all wg* variables stored by the installer into global scope.
-        */
-       public function exportVars() {
-               foreach ( $this->settings as $name => $value ) {
-                       if ( substr( $name, 0, 2 ) == 'wg' ) {
-                               $GLOBALS[$name] = $value;
-                       }
-               }
-       }
-
        /**
         * Environment check for DB types.
         * @return bool
index 5a2dd1a..b742074 100644 (file)
@@ -62,8 +62,8 @@ class LocalSettingsGenerator {
                                'wgLanguageCode', 'wgEnableEmail', 'wgEnableUserEmail', 'wgDiff3',
                                'wgEnotifUserTalk', 'wgEnotifWatchlist', 'wgEmailAuthentication',
                                'wgDBtype', 'wgSecretKey', 'wgRightsUrl', 'wgSitename', 'wgRightsIcon',
-                               'wgRightsText', 'wgMainCacheType', 'wgEnableUploads',
-                               'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
+                               'wgRightsText', '_MainCacheType', 'wgEnableUploads',
+                               '_MemCachedServers', 'wgDBserver', 'wgDBuser',
                                'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
                                'wgMetaNamespace', 'wgLogo',
                        ),
@@ -287,15 +287,15 @@ class LocalSettingsGenerator {
                $serverSetting = "";
                if ( array_key_exists( 'wgServer', $this->values ) && $this->values['wgServer'] !== null ) {
                        $serverSetting = "\n## The protocol and server name to use in fully-qualified URLs\n";
-                       $serverSetting .= "\$wgServer = \"{$this->values['wgServer']}\";\n";
+                       $serverSetting .= "\$wgServer = \"{$this->values['wgServer']}\";";
                }
 
-               switch ( $this->values['wgMainCacheType'] ) {
+               switch ( $this->values['_MainCacheType'] ) {
                        case 'anything':
                        case 'db':
                        case 'memcached':
                        case 'accel':
-                               $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType'] );
+                               $cacheType = 'CACHE_' . strtoupper( $this->values['_MainCacheType'] );
                                break;
                        case 'none':
                        default:
@@ -334,7 +334,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 \$wgScriptPath = \"{$this->values['wgScriptPath']}\";
 ${serverSetting}
 
-## The relative URL path to the logo.  Make sure you change this from the default,
+## The URL path to static resources (images, scripts, etc.)
+\$wgResourceBasePath = \$wgScriptPath;
+
+## The URL path to the logo.  Make sure you change this from the default,
 ## or else you'll overwrite your logo when you upgrade!
 \$wgLogo = \"{$this->values['wgLogo']}\";
 
index 67a4def..e8433f2 100644 (file)
@@ -159,7 +159,6 @@ class WebInstaller extends Installer {
                        $this->settings = $session['settings'] + $this->settings;
                }
 
-               $this->exportVars();
                $this->setupLanguage();
 
                if ( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
@@ -387,15 +386,19 @@ class WebInstaller extends Installer {
        }
 
        /**
-        * Show an error message in a box. Parameters are like wfMessage().
-        * @param string $msg
+        * Show an error message in a box. Parameters are like wfMessage(), or
+        * alternatively, pass a Message object in.
+        * @param string|Message $msg
         */
        public function showError( $msg /*...*/ ) {
-               $args = func_get_args();
-               array_shift( $args );
-               $args = array_map( 'htmlspecialchars', $args );
-               $msg = wfMessage( $msg, $args )->useDatabase( false )->plain();
-               $this->output->addHTML( $this->getErrorBox( $msg ) );
+               if ( !( $msg instanceof Message ) ) {
+                       $args = func_get_args();
+                       array_shift( $args );
+                       $args = array_map( 'htmlspecialchars', $args );
+                       $msg = wfMessage( $msg, $args );
+               }
+               $text = $msg->useDatabase( false )->plain();
+               $this->output->addHTML( $this->getErrorBox( $text ) );
        }
 
        /**
index 0d11463..0fcda7d 100644 (file)
@@ -830,6 +830,8 @@ class WebInstallerName extends WebInstallerPage {
         * @return bool
         */
        public function submit() {
+               global $wgPasswordPolicy;
+
                $retVal = true;
                $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
                        '_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
@@ -906,14 +908,21 @@ class WebInstallerName extends WebInstallerPage {
                $pwd = $this->getVar( '_AdminPassword' );
                $user = User::newFromName( $cname );
                if ( $user ) {
-                       $status = $user->checkPasswordValidity( $pwd, 'create' );
-                       $valid = $status->isGood() ? true : $status->getMessage()->escaped();
+                       $upp = new UserPasswordPolicy(
+                               $wgPasswordPolicy['policies'],
+                               $wgPasswordPolicy['checks']
+                       );
+                       $status = $upp->checkUserPasswordForGroups(
+                               $user,
+                               $pwd,
+                               array( 'bureaucrat', 'sysop' )  // per Installer::createSysop()
+                       );
+                       $valid = $status->isGood() ? true : $status->getMessage();
                } else {
                        $valid = 'config-admin-name-invalid';
                }
                if ( strval( $pwd ) === '' ) {
-                       # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
-                       # This message is more specific and helpful.
+                       // Provide a more specific and helpful message if password field is left blank
                        $msg = 'config-admin-password-blank';
                } elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
                        $msg = 'config-admin-password-mismatch';
@@ -921,7 +930,7 @@ class WebInstallerName extends WebInstallerPage {
                        $msg = $valid;
                }
                if ( $msg !== false ) {
-                       call_user_func_array( array( $this->parent, 'showError' ), (array)$msg );
+                       call_user_func( array( $this->parent, 'showError' ), $msg );
                        $this->setVar( '_AdminPassword', '' );
                        $this->setVar( '_AdminPasswordConfirm', '' );
                        $retVal = false;
@@ -1131,7 +1140,7 @@ class WebInstallerOptions extends WebInstallerPage {
                $caches[] = 'memcached';
 
                // We'll hide/show this on demand when the value changes, see config.js.
-               $cacheval = $this->getVar( 'wgMainCacheType' );
+               $cacheval = $this->getVar( '_MainCacheType' );
                if ( !$cacheval ) {
                        // We need to set a default here; but don't hardcode it
                        // or we lose it every time we reload the page for validation
@@ -1147,7 +1156,7 @@ class WebInstallerOptions extends WebInstallerPage {
                        // For grep: The following messages are used as the item labels:
                        // config-cache-none, config-cache-accel, config-cache-memcached
                        $this->parent->getRadioSet( array(
-                               'var' => 'wgMainCacheType',
+                               'var' => '_MainCacheType',
                                'label' => 'config-cache-options',
                                'itemLabelPrefix' => 'config-cache-',
                                'values' => $caches,
@@ -1285,7 +1294,7 @@ class WebInstallerOptions extends WebInstallerPage {
                $this->parent->setVarsFromRequest( array( '_RightsProfile', '_LicenseCode',
                        'wgEnableEmail', 'wgPasswordSender', 'wgEnableUploads', 'wgLogo',
                        'wgEnableUserEmail', 'wgEnotifUserTalk', 'wgEnotifWatchlist',
-                       'wgEmailAuthentication', 'wgMainCacheType', '_MemCachedServers',
+                       'wgEmailAuthentication', '_MainCacheType', '_MemCachedServers',
                        'wgUseInstantCommons', 'wgDefaultSkin' ) );
 
                $retVal = true;
@@ -1351,7 +1360,7 @@ class WebInstallerOptions extends WebInstallerPage {
                }
                $this->parent->setVar( '_Extensions', $extsToInstall );
 
-               if ( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
+               if ( $this->getVar( '_MainCacheType' ) == 'memcached' ) {
                        $memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
                        if ( !$memcServers ) {
                                $this->parent->showError( 'config-memcache-needservers' );
index 13755e3..2fadfce 100644 (file)
@@ -59,6 +59,7 @@
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-prefix": "بادئة جدول قاعدة البيانات:",
+       "config-db-charset": "مجموعة محارف قاعدة البيانات",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-db-schema": "سكيما لميدياويكي",
        "config-type-mysql": "MySQL (أو متوافق)",
@@ -74,6 +75,7 @@
        "config-mysql-engine": "محرك التخزين",
        "config-mysql-innodb": "إنو دي بي",
        "config-mysql-myisam": "ماي إسام",
+       "config-mysql-charset": "مجموعة محارف قاعدة البيانات",
        "config-mysql-binary": "ثنائي",
        "config-mysql-utf8": "يو تي إف-8",
        "config-site-name": "اسم الويكي:",
        "config-email-sender": "يرجع عنوان البريد الإلكتروني:",
        "config-upload-settings": "الصور وتحميل الملفات",
        "config-upload-enable": "تمكين تحميل الملفات",
+       "config-upload-deleted": "المجلد للملفات المحذوفة:",
        "config-logo": "مسار الشعار:",
        "config-cc-again": "اختر مجددًا",
        "config-advanced-settings": "ضبط متقدم",
        "config-install-user-alreadyexists": "المستخدم \"$1\" موجود بالفعل",
        "config-install-user-create-failed": "إنشاء مستخدم \"$1\" فشل:$2",
        "config-install-tables": "إنشاء الجداول",
+       "config-install-stats": "بدء الإحصاءات",
        "config-install-keys": "توليد المفاتيح السرية",
        "config-install-mainpage": "إنشاء صفحة رئيسية بالمحتوى الافتراضي",
        "config-help": "مساعدة",
index 852982f..21a4fa3 100644 (file)
        "config-outdated-sqlite": "'''Avisu:''' tien SQLite $1, que ye inferior a la versión mínima necesaria $2. SQLite nun tará disponible.",
        "config-no-fts3": "'''Avisu:''' SQLite ta compiláu ensin el [//sqlite.org/fts3.html módulu FTS3]; les funciones de gueta nun tarán disponibles nesti sistema.",
        "config-register-globals-error": "<strong>Error: la opción de PHP <code>[http://php.net/register_globals register_globals]</code> ta activada.\nTien de desactivase pa siguir cola instalación.</strong>\nVisita [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] p'alcontrar ayuda tocante a cómo facelo.",
+       "config-magic-quotes-gpc": "<strong>Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] ta activáu!</strong>\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-magic-quotes-runtime": "<strong>Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] ta activáu!</strong>\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-magic-quotes-sybase": "<strong>Fatal: ¡[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] ta activáu!</strong>\nEsta opción causa la imprevisible corrupción de la entrada de datos.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-mbstring": "<strong>Fatal: ¡[@http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] ta activáu!</strong>\nEsta opción causa errores y pué corromper los datos de mou imprevisible.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.",
+       "config-safe-mode": "<strong>Atención:</strong> el [http://www.php.net/features.safe-mode mou seguru] de PHP ta activáu.\nPuede causar problemes, especialmente si uses la carga de ficheros ya l'encontu pa <code>math</code>.",
+       "config-xml-bad": "Falta'l módulu XML de PHP.\nMediaWiki rique funciones d'esti módulu y nun va funcionar con esta configuración.\nSeique precises instalar el paquete RPM llamáu php-xml.",
+       "config-pcre-old": "<strong>Fatal:</strong> Ríquese PCRE $1 o posterior.\nEl binariu de PHP ta enllazáu con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].",
        "config-diff3-bad": "Nun s'alcontró GNU diff3.",
        "config-git": "Alcontróse'l software de control de versiones Git: <code>$1</code>.",
        "config-git-bad": "Nun s'alcontró el software de control de versiones Git.",
index 95e2ec4..06e38d5 100644 (file)
        "config-db-install-account": "Імя карыстальніка для ўсталяваньня",
        "config-db-username": "Імя карыстальніка базы зьвестак:",
        "config-db-password": "Пароль базы зьвестак:",
-       "config-db-password-empty": "Калі ласка, увядзіце пароль для новага карыстальніка базы зьвестак: $1.\nМагчыма стварыць карыстальніка без паролю, але гэта небясьпечна.",
-       "config-db-username-empty": "Вы мусіце ўвесьці значэньне парамэтру «{{int:config-db-username}}»",
        "config-db-install-username": "Увядзіце імя карыстальніка, якое будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не назва рахунку MediaWiki; гэта імя карыстальніка Вашай базы зьвестак.",
        "config-db-install-password": "Увядзіце пароль, які будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не пароль рахунку MediaWiki; гэта пароль Вашай базы зьвестак.",
        "config-db-install-help": "Увядзіце імя карыстальніка і пароль, якія будуць выкарыстаныя для далучэньня да базы зьвестак падчас працэсу ўсталяваньня.",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
        "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
        "mainpagetext": "'''MediaWiki пасьпяхова ўсталяваная.'''",
-       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]"
+       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца з спамам у вашай вікі]"
 }
index ee33109..369a23b 100644 (file)
        "config-missing-db-name": "Heu d'introduir un valor per a «{{int:config-db-name}}».",
        "config-missing-db-host": "Heu d'introduir un valor per a «{{int:config-db-host}}».",
        "config-missing-db-server-oracle": "Heu d’introduir un valor per a «{{int:config-db-host-oracle}}».",
+       "config-invalid-db-name": "El nom de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
+       "config-invalid-db-prefix": "El prefix de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-connection-error": "$1.\n\nComproveu el servidor central, el nom d'usuari i la contrasenya i torneu-ho a provar.",
+       "config-invalid-schema": "L’esquema «$1» no és vàlid per al MediaWiki.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-db-sys-create-oracle": "L'instal·lador només accepta emprar un compte SYSDBA per a la creació d'un nou compte.",
        "config-db-sys-user-exists-oracle": "El compte d’usuari «$1» ja existeix. SYSDBA només es pot fer servir per crear comptes nous.",
        "config-postgres-old": "Cal el PostgreSQL $1 o posterior. Teniu el $2.",
        "config-mssql-old": "Cal utilitzar el Microsoft SQL Server $1 o posterior. Teniu la versió $2.",
+       "config-sqlite-name-help": "Trieu un nom per identificar el wiki.\nNo feu servir espais ni guionets.\nAquest nom s’utilitzarà per a denominar el fitxer de les dades de l’SQLite.",
        "config-sqlite-mkdir-error": "S'ha produït un error en crear el directori de dades «$1».\nComproveu la ubicació i torneu-ho a provar.",
        "config-sqlite-dir-unwritable": "No s'ha pogut escriure al directori «$1».\nCanvieu els seus permisos per tal que el servidor web pugui escriure-hi i torneu-ho a provar.",
        "config-sqlite-connection-error": "$1. \n\nComproveu el directori de dades i el nom de la base de dades a continuació i torneu-ho a provar.",
        "config-sqlite-readonly": "El fitxer <code>$1</code> no es pot escriure.",
        "config-sqlite-cant-create-db": "No s'ha pogut crear el fitxer de base de dades <code>$1</code>.",
+       "config-can-upgrade": "Hi ha taules del MediaWiki en aquesta base de dades.\nPer actualitzar-les al MediaWiki $1, feu clic a <strong>Continua</strong>.",
        "config-upgrade-done-no-regenerate": "S'ha completat l'actualització.\n\nJa podeu [$1 començar a utilitzar el wiki].",
        "config-regenerate": "Torna a generar el LocalSettings.php →",
        "config-show-table-status": "La consulta <code>SHOW TABLE STATUS</code> ha fallat!",
        "config-skins-missing": "No s'ha trobat cap tema; MediaWiki utilitzarà el tema per defecte fins que hi instal·leu alguns adequats.",
        "config-skins-must-enable-some": "Heu de triar com a mínim un tema per habilitar.",
        "config-skins-must-enable-default": "Cal habilitar el tema triat per defecte.",
+       "config-install-begin": "En fer clic a «{{int:config-continue}}» s’iniciarà la instal·lació del MediaWiki. Si encara voleu fer canvis, feu clic a «{{int:config-back}}».",
        "config-install-step-done": "fet",
        "config-install-step-failed": "ha fallat",
        "config-install-extensions": "S'estan incloent les extensions",
index abcb333..9ddbfa4 100644 (file)
        "config-db-install-account": "Uživatelský účet pro instalaci",
        "config-db-username": "Databázové uživatelské jméno:",
        "config-db-password": "Databázové heslo:",
-       "config-db-password-empty": "Zadejte heslo pro nového databázového uživatele: $1.\nPřestože může jít zakládat nové uživatele i bez hesel, není to bezpečné.",
-       "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“.",
        "config-db-install-username": "Zadejte uživatelské jméno, které se použije pro připojení k databázi v průběhu instalace.\nToto není jméno uživatelského účtu MediaWiki; toto je uživatelské jméno k vaší databázi.",
        "config-db-install-password": "Zadejte heslo, které se použije pro připojení k databázi v průběhu instalace.\nToto není heslo uživatelského účtu MediaWiki; toto je heslo k vaší databázi.",
        "config-db-install-help": "Zadejte uživatelské jméno a heslo, které se použijí pro připojení k databázi v průběhu instalace.",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
        "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
-       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]"
+       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
 }
index 802c819..3a9bb82 100644 (file)
@@ -5,7 +5,8 @@
                        "Christian List",
                        "Tjernobyl",
                        "Thomsen",
-                       "MGA73"
+                       "MGA73",
+                       "Mads Haupt"
                ]
        },
        "config-desc": "Installationsprogrammet til MediaWiki",
        "config-localsettings-key": "Opgraderingsnøgle:",
        "config-localsettings-badkey": "Den nøgle du indtastede er forkert.",
        "config-upgrade-key-missing": "En eksisterende installation af MediaWiki er blevet fundet.\nFor at opgradere denne installation skal du tilføje følgende linje i bunden af din <code>LocalSettings.php</code>:\n\n$1",
+       "config-your-language": "Dit sprog:",
+       "config-your-language-help": "Vælg et sprog som du vil bruge under installationen.",
+       "config-wiki-language": "Wiki-sprog:",
+       "config-back": "← Tilbage",
+       "config-continue": "Fortsæt →",
        "config-page-language": "Sprog",
        "config-page-welcome": "Velkommen til MediaWiki!",
        "config-page-dbconnect": "Forbind til database",
@@ -27,6 +33,7 @@
        "config-page-complete": "Færdig!",
        "config-page-restart": "Genstarte installation",
        "config-page-readme": "Læs mig",
+       "config-page-releasenotes": "Udgivelsesnoter",
        "config-page-copying": "Kopiering",
        "config-page-upgradedoc": "Opgraderer",
        "config-page-existingwiki": "Eksisterende wiki",
@@ -42,6 +49,7 @@
        "config-header-sqlite": "SQLite-indstillinger",
        "config-header-oracle": "Oracle-indstillinger",
        "config-invalid-db-type": "Ugyldig databasetype",
+       "config-email-usertalk": "Aktiver notifikationer for brugerdiskussionsside",
        "mainpagetext": "'''MediaWiki er nu installeret.'''",
        "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]"
 }
index 7c68382..c23a268 100644 (file)
        "config-db-install-account": "Benutzerkonto für die Installation",
        "config-db-username": "Name des Datenbankbenutzers:",
        "config-db-password": "Passwort des Datenbankbenutzers:",
-       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1.\nObwohl es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies nicht sicher.",
-       "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
        "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
        "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
        "config-db-install-help": "Benutzername und Passwort, die während des Installationsvorgangs, für die Verbindung mit der Datenbank, genutzt werden sollen, sind nun anzugeben.",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
        "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
        "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]"
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
 }
index 8109c2e..d58e92f 100644 (file)
        "config-desc": "Το πρόγραμμα εγκατάστασης για το MediaWiki",
        "config-title": "Εγκατάσταση MediaWiki $1",
        "config-information": "Πληροφορίες",
+       "config-localsettings-upgrade": "Ένα  αρχείο <code>LocalSettings.php</code> έχει εντοπιστεί.\nΓια να αναβαθμίσετε αυτή την εγκατάσταση, παρακαλούμε να εισάγετε την τιμή των <code>$wgUpgradeKey</code> στο παρακάτω πλαίσιο.\nΘα το βρείτε στο <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Ένα αρχείο <code>LocalSettings.php</code> έχει εντοπιστεί.\nΓια να αναβαθμίσετε αυτή την εγκατάσταση, εκτελέστε το <code>update.php</code> αντ' αυτού.",
        "config-localsettings-key": "Κλειδί αναβάθμισης:",
        "config-localsettings-badkey": "Το κλειδί που δώσατε είναι εσφαλμένο.",
        "config-upgrade-key-missing": "Έχει εντοπιστεί μια υπάρχουσα εγκατάσταση του MediaWiki.\nΓια να αναβαθμίσετε αυτήν την εγκατάσταση, παρακαλούμε να βάλετε την ακόλουθη γραμμή στο κάτω μέρος του <code>LocalSettings.php</code> σας:\n\n$1",
+       "config-localsettings-incomplete": "Το υπάρχον <code>LocalSettings.php</code> φαίνεται να είναι ελλιπές.\nΤο $1 μεταβλητή δεν έχει οριστεί.\nΠαρακαλούμε να αλλάξετε  το <code>LocalSettings.php</code> έτσι ώστε αυτή η μεταβλητή έχει οριστεί, και κάντε κλικ στο \"{{int:Config-continue}}\".",
        "config-session-error": "Σφάλμα κατά την εκκίνηση συνεδρίας: $1",
+       "config-session-expired": "Τα δεδομένα συνόδου φαίνεται να έχουν λήξει.\nΣυνεδρίες έχουν ρυθμιστεί για μια διάρκεια ζωής $1.\nΜπορείτε να αυξήσετε αυτό βάζοντας  <code>session.gc_maxlifetime</code> στο php.ini.\nΚάντε επανεκκίνηση της διαδικασίας εγκατάστασης.",
        "config-your-language": "Η γλώσσα σας:",
        "config-your-language-help": "Επιλέξτε μία γλώσσα για τη διαδικασία της εγκατάστασης.",
        "config-wiki-language": "Γλώσσα του wiki:",
        "config-env-hhvm": "Το HHVM $1 είναι εγκατεστημένο.",
        "config-unicode-using-intl": "Χρησιμοποιώντας την [http://pecl.php.net/intl επέκταση intl PECL] για κανονικοποίηση Unicode.",
        "config-unicode-pure-php-warning": "<strong>Προειδοποίηση:</strong> Η [http://pecl.php.net/intl επέκταση intl PECL] δεν είναι διαθέσιμη για να χειριστεί την κανονικοποίηση Unicode, επιστρέφουμε στην αργή αμιγώς PHP εφαρμογή.\nΕάν λειτουργείτε έναν ιστότοπο υψηλής επισκεψιμότητας, θα πρέπει να ρίξετε μια ματιά στην [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations κανονικοποίηση Unicode].",
+       "config-memory-bad": "<strong>Προειδοποίηση:</strong> η <code>memory_limit</code> της PHP είναι $1.\nΑυτό είναι πιθανώς πολύ χαμηλό.\n\nΗ εγκατάσταση ενδέχεται να αποτύχει!",
        "config-xcache": "[http://xcache.lighttpd.net/ Το XCache] είναι εγκατεστημένο",
        "config-apc": "Το [http://www.php.net/apc APC] είναι εγκατεστημένο",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp Το WinCache] είναι εγκατεστημένο",
        "config-diff3-bad": "Το GNU diff3 δεν βρέθηκε.",
+       "config-git": "Βρέθηκε η Git έκδοση λογισμικού ελέγχου: <code>$1</code>.",
+       "config-git-bad": "Η Git έκδοση του λογισμικού ελέγχου δε βρέθηκε.",
+       "config-using-server": "Χρησιμοποιώντας το όνομα του διακομιστή \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Χρησιμοποιώντας την διεύθυνση URL του διακομιστή \"<nowiki>$1$2</nowiki>\".",
+       "config-brokenlibxml": "Το σύστημά σας έχει ένα συνδυασμό εκδόσεων της PHP και libxml2 που είναι προβληματικές και μπορεί να προκαλέσει κρυμμένα στοιχεία διαφθοράς στο MediaWiki και άλλες εφαρμογές web.\nΑναβαθμίστε σε libxml2 2.7.3 ή μεταγενέστερο ([https://bugs.php.net/bug.php?id=45996 bug κατατεθεί με την PHP]).\nΗ εγκατάσταση ματαιώθηκε.",
        "config-db-type": "Τύπος βάσης δεδομένων:",
        "config-db-host": "Φιλοξενία βάσης δεδομένων:",
        "config-db-host-oracle": "Βάση δεδομένων TNS:",
@@ -61,6 +71,7 @@
        "config-db-install-account": "Λογαριασμός χρήστη για την εγκατάσταση",
        "config-db-username": "Όνομα χρήστη βάσης δεδομένων:",
        "config-db-password": "Κωδικός πρόσβασης βάσης δεδομένων:",
+       "config-db-account-lock": "Χρησιμοποιήστε το ίδιο όνομα χρήστη και κωδικό πρόσβασης στη διάρκεια της κανονικής λειτουργίας",
        "config-db-wiki-account": "Λογαριασμός χρήστη για κανονική λειτουργία",
        "config-db-prefix": "Πρόθεμα πίνακα βάσης δεδομένων:",
        "config-db-charset": "Σύνολο χαρακτήρων βάσης δεδομένων",
        "config-admin-password": "Κωδικός πρόσβασης:",
        "config-admin-password-confirm": "Επανάληψη κωδικού πρόσβασης:",
        "config-admin-name-blank": "Εισαγάγετε όνομα χρήστη διαχειριστή.",
+       "config-admin-name-invalid": "Το συγκεκριμένο όνομα χρήστη  \"<nowiki>$1</nowiki>\" δεν είναι έγκυρο. Δώστε ένα διαφορετικό όνομα χρήστη.",
+       "config-admin-password-blank": "Εισάγετε έναν κωδικό για τον λογαριασμό του διαχειριστή.",
        "config-admin-password-mismatch": "Οι δύο κωδικοί πρόσβασης που εισηγάγατε δεν ταιριάζουν.",
        "config-admin-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "config-admin-error-bademail": "Έχετε εισαγάγει μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου.",
index 1eb8e03..ac3178f 100644 (file)
        "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
        "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
        "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
-       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 9f6f22c..bbab9a1 100644 (file)
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [//www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "mainpagetext": "<strong>MediaWiki se ha instalado con éxito.</strong>",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende cómo combatir el spam en tu wiki]"
 }
index 9b5a322..09cfe6a 100644 (file)
@@ -6,7 +6,8 @@
                        "ערן",
                        "아라",
                        "Inkbug",
-                       "Yona b"
+                       "Yona b",
+                       "Rotemliss"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "config-db-install-account": "חשבון משתמש להתקנה",
        "config-db-username": "שם המשתמש במסד הנתונים:",
        "config-db-password": "הססמה במסד הנתונים:",
-       "config-db-password-empty": "נא להזין ססמה למשתמש מסד הנתונים החדש: $1.\nאף־על־פי שאפשר ליצור חשבונות ללא ססמה, זה לא מאובטח.",
-       "config-db-username-empty": "יש להזין ערך עבור \"{{int:config-db-username}}\".",
        "config-db-install-username": "יש להכניס שם משתמש שישמש לחיבור למסד נתונים במהלך ההתקנה.\nזהו לא שם משתמש לחשבון במדיה־ויקי; זהו שם משתמש בשרת מסד נתונים.",
        "config-db-install-password": "יש להקליד ססמה שתשמש אותך לצורך חיבור למסד נתונים במהלך ההתקנה.\nזוהי לא ססמה של חשבון במדיה־ויקי; זוהי ססמה לשרת מסד נתונים.",
        "config-db-install-help": "יש להקליד את שם המשתמש ואת הססמה להתחברות למסד הנתונים במהלך ההתקנה.",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
-       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]"
+       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index c430d60..16c7b3f 100644 (file)
@@ -9,7 +9,9 @@
                        "C5st4wr6ch",
                        "Seb35",
                        "Arifin.wijaya",
-                       "Ilham151096"
+                       "Ilham151096",
+                       "Bennylin",
+                       "WongKentir"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
        "config-db-install-account": "Akun pengguna untuk instalasi",
        "config-db-username": "Nama pengguna basis data:",
        "config-db-password": "Kata sandi basis data:",
-       "config-db-password-empty": "Silakan masukkan sandi untuk pengguna basis data baru: $1.\nMeskipun dimungkinkan untuk membuat pengguna tanpa sandi, hal itu tidak aman.",
-       "config-db-username-empty": "Anda harus memasukkan nilai untuk \"{{int:config-db-username}}\".",
        "config-db-install-username": "Masukkan nama pengguna yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan nama pengguna akun MediaWiki, melainkan nama pengguna untuk basis data Anda.",
        "config-db-install-password": "Masukkan sandi yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan sandi untuk akun MediaWiki, melainkan sandi untuk basis data Anda.",
        "config-db-install-help": "Masukkan nama pengguna dan sandi yang akan digunakan untuk terhubung ke basis data pada saat proses instalasi.",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki mendukung sistem basis data berikut:\n\n$1\n\nJika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] adalah target utama MediaWiki dan memiliki dukungan terbaik. MediaWiki juga berjalan dengan [{{int:version-db-mariadb-url}} MariaDB] dan [{{int:version-db-percona-url}} Server Percona], yang kompatibel dengan MySQL. ([http://www.php.net/manual/en/mysql.installation.php Cara mengompilasi PHP dengan dukungan MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL. Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi. ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL])",
        "config-memcache-badport": "Nomor porta Memcached harus antara $1 dan $2.",
        "config-extensions": "Ekstensi",
        "config-extensions-help": "Ekstensi yang tercantum di atas terdeteksi di direktori <code>./extensions</code>.\n\nEkstensi tersebut mungkin memerlukan konfigurasi tambahan, tetapi Anda dapat mengaktifkannya sekarang.",
+       "config-skins": "Tampilan",
+       "config-skins-use-as-default": "Gunakan tampilan ini secara baku",
        "config-install-alreadydone": "'''Peringatan:''' Anda tampaknya telah menginstal MediaWiki dan mencoba untuk menginstalnya lagi.\nLanjutkan ke halaman berikutnya.",
        "config-install-begin": "Dengan menekan \"{{int:config-continue}}\", Anda akan memulai instalasi MediaWiki.\nJika Anda masih ingin membuat perubahan, tekan \"{{int:config-back}}\".",
        "config-install-step-done": "selesai",
index 96c9fd3..a8cd93e 100644 (file)
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
        "config-extension-link": "Sapevi che il tuo wiki supporta le  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].",
        "mainpagetext": "'''Installazione di MediaWiki completata correttamente.'''",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
 }
index 6020bdc..8a11b09 100644 (file)
        "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
        "config-extension-link": "あなたのウィキは[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拡張機能]をサポートしていることをご存知ですか?\n\n[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category カテゴリ別で拡張機能を見る]か[//www.mediawiki.org/wiki/Extension_Matrix 拡張機能のマトリックス]で拡張機能すべてのリストをご覧になれます。",
        "mainpagetext": "<strong>MediaWiki のインストールに成功しました。</strong>",
-       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]"
+       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 0c11be0..fd7dd5c 100644 (file)
        "config-nofile": "De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?",
        "config-extension-link": "Häs De jewoß, dat et Wiki [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [//www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.",
        "mainpagetext": "'''MehdijaWikki es jäz enschtalleht.'''",
-       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Aßjahbe vum MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
+       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Ußjahbe vum MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">languages/classes/LanguageKsh.php</code> vör udder henger dä Reihj met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">No need add neuter wikis having names ending in -wiki.</code>“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: <code>'{{SITENAME}}' => 'f',</code>\n* för „dat {{SITENAME}}“ heijs et:\n*: <code>'{{SITENAME}}' => 'n',</code>\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
 }
index 9bbb635..f3ee821 100644 (file)
@@ -53,6 +53,7 @@
        "config-profile-wiki": "Wîkiya vekirî",
        "config-email-settings": "Eyarên e-nameyê",
        "config-email-usertalk": "Agahdariyên rûpela gotûbêjê ya bikarhêner gengaz bike",
+       "config-email-sender": "Vegere navnîşana e-nameyêː",
        "config-upload-settings": "Barkirina wêne û dosyeyan",
        "config-upload-enable": "Barkirina dosyeyan gengaz bike",
        "config-logo": "URL'ya logoyêː",
index 41f4adf..6b732a9 100644 (file)
@@ -3,22 +3,33 @@
                "authors": [
                        "Eitvys200",
                        "Mantak111",
-                       "Zygimantus"
+                       "Zygimantus",
+                       "Hugo.arg"
                ]
        },
        "config-desc": "MediaWiki diegimas",
        "config-title": "MediaWiki $1 diegimas",
        "config-information": "Informacija",
+       "config-localsettings-upgrade": "Aptiktas failas <code>LocalSettings.php</code>. Norėdami patobulinti šią instaliaciją, prašome įvesti reikšmę <code>$wgUpgradeKey</code> į dėžutę žemiau. Jūs rasite ją <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Aptiktas failas <code>LocalSettings.php</code>. Tam kad patobulinti šią instaliaciją, prašome paleisti <code>update.php</code>.",
        "config-localsettings-key": "Naujinimo raktas:",
        "config-localsettings-badkey": "Raktas, kurį pateikėte, yra neteisingas.",
+       "config-upgrade-key-missing": "Aptikta esama MediaWiki instaliacija. Tam kad atnaujinti šią instaliaciją, prašome įrašyti šią eilutę <code>LocalSettings.php</code> failo pabaigoje:\n\n$1",
+       "config-localsettings-incomplete": "Esamas failas <code>LocalSettings.php</code> yra nepilnas. Nenustatytas kintamasis $1.\nPrašome pakeisti failą <code>LocalSettings.php</code> tai, kad kintamasis būtų nustatytas ir spauskite „{{int:Config-continue}}“.",
+       "config-localsettings-connection-error": "Buvo susidurta su klaida, kai jungtasi prie duomenų bazės naudojantis nustatymais iš <code>LocalSettings.php</code>. Prašome pataisyti šiuos nustatymus ir bandyti dar kartą.\n\n$1",
        "config-session-error": "Klaida pradedant seansą: $1",
+       "config-session-expired": "Jūsų sesija pasibaigė.\nSesijos yra nustatytos trukmei - $1.\nGalite ją padidinti nustatydami <code>session.gc_maxlifetime</code> php.ini faile.\nPaleiskite iš naujo instaliaciją.",
+       "config-no-session": "Jūsų sesijos duomenys prarasti!\nPatikrinkite savo php.ini failą ir įsitikinkite, kad <code>session.save_path</code> yra nustatytas tinkamai direktorijai.",
        "config-your-language": "Jūsų kalba:",
+       "config-your-language-help": "Pasirinkite kalbą, kurią naudosite instaliuodami.",
        "config-wiki-language": "Viki kalba:",
+       "config-wiki-language-help": "Pasirinkite kalbą, kuria viki bus parašyta.",
        "config-back": "← Atgal",
        "config-continue": "Toliau →",
        "config-page-language": "Kalba",
        "config-page-welcome": "Sveiki atvykę į MediaWiki!",
        "config-page-dbconnect": "Prisijungti prie duomenų bazės",
+       "config-page-upgrade": "Atnaujinti esamą instaliaciją",
        "config-page-dbsettings": "Duomenų bazės nustatymai",
        "config-page-name": "Vardas",
        "config-page-options": "Parinktys",
        "config-page-copying": "Kopijuojama",
        "config-page-upgradedoc": "Atnaujinama",
        "config-page-existingwiki": "Esamas viki",
+       "config-help-restart": "Ar norite ištrinti visus išsaugotus duomenis, kuriuos jūs įvedėte ir iš naujo paleisti diegimo procesą?",
        "config-restart": "Taip, paleiskite jį iš naujo",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki namų tinklalapis]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Vartotojo gidas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratoriaus gidas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ DUK]\n----\n* <doclink href=Readme>Skaityk mane</doclink>\n* <doclink href=ReleaseNotes>Leidimo pastabos</doclink>\n* <doclink href=Copying>Kopijavimas</doclink>\n* <doclink href=UpgradeDoc>Atnaujinimas</doclink>",
+       "config-env-good": "Aplinka buvo patikrinta.\nJūs galite įdiegti MediaWiki.",
+       "config-env-bad": "Aplinka buvo patikrinta.\nJūs negalite įdiegti MediaWiki.",
        "config-env-php": "PHP $1 yra įdiegtas.",
+       "config-env-hhvm": "HHVM $1 yra įdiegtas.",
+       "config-outdated-sqlite": "<strong>Įspėjimas:</strong> jūs turite SQLite $1, kuri yra mažesnė nei minimali reikalinga versija $2. SQLite nebus prieinama.",
+       "config-memory-raised": "PHP <code>memory_limit</code> yra $1, padidintas iki $2.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] yra įdiegtas",
+       "config-apc": "[http://www.php.net/apc APC] yra įdiegtas",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] yra įdiegtas",
        "config-diff3-bad": "GNU diff3 nerastas.",
+       "config-using-uri": "Naudojamas serverio URL „<nowiki>$1$2</nowiki>“.",
        "config-db-type": "Duomenų bazės tipas:",
        "config-db-host": "Duomenų bazės serveris:",
+       "config-db-host-oracle": "Duomenų bazės TNS:",
+       "config-db-wiki-settings": "Identifikuoti šią viki",
        "config-db-name": "Duomenų bazės pavadinimas:",
        "config-db-name-oracle": "Duomenų bazės schema:",
        "config-db-install-account": "Vartotojo paskyra diegimui",
        "config-db-username": "Duomenų bazės vartotojo vardas:",
        "config-db-password": "Duomenų bazės slaptažodis:",
+       "config-db-wiki-account": "Vartotojo paskyra normaliai operacijai",
+       "config-db-prefix": "Duomenų bazės lentelės priešdėlis:",
+       "config-db-charset": "Duomenų bazės simbolių rinkinys",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-mysql-old": "MySQL $1 ar vėlesnė yra reikalinga. Jūs turite $2.",
        "config-db-port": "Duomenų bazės prievadas:",
        "config-db-schema": "MediaWiki schema:",
+       "config-pg-test-error": "Negalima prisijungti prie duomenų bazės <strong>$1</strong>: $2",
+       "config-sqlite-dir": "SQLite duomenų katalogas:",
+       "config-oracle-def-ts": "Numatytoji lentelių sritis:",
+       "config-oracle-temp-ts": "Laikina lentelių sritis:",
+       "config-type-mysql": "MySQL (arba suderinama)",
        "config-type-mssql": "Microsoft SQL serveris",
        "config-header-mysql": "MySQL nustatymai",
        "config-header-postgres": "PostgreSQL nustatymai",
        "config-header-sqlite": "SQLite nustatymai",
        "config-header-oracle": "Oracle nustatymai",
+       "config-header-mssql": "„Microsoft“ SQL serverio nustatymai",
        "config-invalid-db-type": "Neteisingas duomenų bazės tipas",
+       "config-missing-db-host": "Privalote įvesti „{{int:config-db-host}}“ reikšmę.",
+       "config-missing-db-server-oracle": "Privalote įvesti „{{int:config-db-host-oracle}}“ reikšmę.",
+       "config-postgres-old": "PostgreSQL $1 ar vėlesnė yra reikalinga. Jūs turite $2.",
+       "config-regenerate": "Pergeneruoti LocalSettings.php →",
+       "config-db-web-account-same": "Naudoti tą pačią paskyrą kaip ir įdiegimui",
+       "config-db-web-create": "Sukurti paskyrą, jeigu jos nėra",
+       "config-mysql-engine": "Saugojimo variklis:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Duomenų bazės simbolių rinkinys:",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Autentifikavimo tipas:",
+       "config-mssql-sqlauth": "SQL Serverio autentifikavimas",
        "config-mssql-windowsauth": "Windows autentifikavimas",
        "config-site-name": "Viki pavadinimas:",
        "config-site-name-blank": "Įveskite svetainės pavadinimą.",
        "config-project-namespace": "Projekto vardų sritis:",
        "config-ns-generic": "Projektas",
        "config-ns-site-name": "Toks pat kaip viki pavadinimas: $1",
+       "config-ns-other": "Kita (nurodyti)",
        "config-ns-other-default": "ManoViki",
        "config-admin-box": "Administratoriaus paskyra",
        "config-admin-name": "Jūsų naudotojo vardas:",
        "config-admin-password-blank": "Įvesti administratoriaus paskyros slaptažodį.",
        "config-admin-password-mismatch": "Įvesti slaptažodžiai nesutampa.",
        "config-admin-email": "El. pašto adresas:",
+       "config-admin-error-bademail": "Įvedėte neteisingą el. pašto adresą.",
        "config-optional-continue": "Paklausti daugiau klausimų.",
        "config-optional-skip": "Man jau nuobodu, tiesiog įdiekite viki.",
        "config-profile": "Vartotojo teisių paskyra:",
        "config-profile-wiki": "Atidaryti viki",
+       "config-profile-no-anon": "Reikalingas paskyros sukūrimas",
        "config-profile-private": "Privati viki",
+       "config-license": "Autorinės teisės ir licencija:",
        "config-license-pd": "Viešas domenas",
        "config-email-settings": "El. pašto nustatymai",
+       "config-email-watchlist": "Įjungti stebimų pranešimą",
+       "config-email-auth": "Įjungti el. pašto autentifikavimą",
+       "config-upload-settings": "Vaizdų ir failų įkėlimai",
        "config-upload-enable": "Įgalinti failų įkėlimus",
+       "config-upload-deleted": "Katalogas ištrintiems failams:",
        "config-logo": "Logotipo URL:",
        "config-cc-again": "Pasirinkti dar kartą...",
+       "config-advanced-settings": "Išplėstinė konfigūracija",
+       "config-cache-options": "Nustatymai objektų podėliavimui:",
+       "config-memcached-servers": "„Memcached“ serveriai:",
        "config-extensions": "Plėtiniai",
+       "config-skins": "Išvaizda",
+       "config-skins-use-as-default": "Naudoti šią išvaizdą pagal nutylėjimą",
        "config-install-step-done": "atlikta",
        "config-install-step-failed": "nepavyko",
+       "config-install-extensions": "Įskaitant plėtinius",
+       "config-install-database": "Tvarkoma duomenų bazė",
        "config-install-schema": "Kuriama schema",
+       "config-install-pg-schema-not-exist": "PostgreSQL schemos nėra.",
+       "config-install-user": "Kuriama naudotojų duomenų bazė",
+       "config-install-user-alreadyexists": "Naudotojas „$1“ jau yra",
+       "config-install-user-create-failed": "Nepavyko sukurti naudotojo „$1“: $2",
        "config-install-tables": "Kuriamos lentelės",
        "config-install-stats": "Inicijuojamos statistikos",
        "config-install-keys": "Generuojami slapti raktai",
        "config-install-done": "'''Sveikiname!'''\nJūs sėkmingai įdiegėte MediaWiki.\n\nĮdiegimo programa sukūrė <code>LocalSettings.php</code> failą.\nJame yra visos jūsų konfigūracijos.\n\nJums reikės atsisiųsti ir įdėti jį į savo wiki įdiegimo bazę (pačiame kataloge, kaip index.php). Atsisiuntimas turėtų prasidėti automatiškai.\n\nJei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:\n\n$3\n\n'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.\n\nKai baigsite, jūs galėsite '''[$2 įeiti į savo viki]'''.",
        "config-download-localsettings": "Atsisiųsti <code>LocalSettings.php</code>",
        "config-help": "pagalba",
+       "config-help-tooltip": "spustelėkite išplėtimui",
+       "config-nofile": "Failas \"$1\" nerastas. Ar jis buvo ištrintas?",
        "mainpagetext": "'''MediaWiki sėkmingai įdiegta.'''",
        "mainpagedocfooter": "Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].\n\n== Pradžiai ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]"
 }
index 78683ad..312f3ff 100644 (file)
@@ -20,7 +20,7 @@
        "config-page-upgrade": "सध्याच्या उभारणीची(इन्स्टॉलेशन) दर्जोन्नती करा",
        "config-page-name": "नाव",
        "config-page-options": "पर्याय",
-       "config-page-install": "à¤\89भारा(इन्स्टॉल)",
+       "config-page-install": "सà¥\8dथापित à¤\95रा(इन्स्टॉल)",
        "config-page-complete": "पूर्ण!",
        "config-page-readme": "हे वाचा",
        "config-page-releasenotes": "विमोचन टिप्पण्या",
index 1fd98ff..b7b11c3 100644 (file)
@@ -14,7 +14,8 @@
                        "Seb35",
                        "Mar(c)",
                        "Sjoerddebruin",
-                       "Esketti"
+                       "Esketti",
+                       "JaapDeKleine"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
@@ -72,7 +73,7 @@
        "config-magic-quotes-sybase": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.",
        "config-safe-mode": "'''Waarschuwing:'''\n'''PHP's [http://www.php.net/features.safe-mode veilige modus] is actief.'''\nDit kan problemen veroorzaken, vooral bij het uploaden van bestanden en ondersteuning van <code>math</code>.",
-       "config-xml-bad": "PHP-XML-module ontbreekt.\nMediaWiki is vereist functies in deze module en zal niet werken in deze configuratie.\nMoet u de php-xml-RPM pakket.",
+       "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki vereist functies in deze module en werkt niet in deze configuratie.\nMogelijk moet u het RPM-pakket php-xml installeren.",
        "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].",
        "config-pcre-no-utf8": "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.",
        "config-memory-raised": "PHP's <code>memory_limit</code> is $1 en is verhoogd tot $2.",
        "config-db-install-account": "Gebruiker voor installatie",
        "config-db-username": "Gebruikersnaam voor database:",
        "config-db-password": "Wachtwoord voor database:",
-       "config-db-password-empty": "Voer een wachtwoord in voor de nieuwe databasegebruiker: $1.\nHoewel het wellicht mogelijk is gebruikers aan te maken zonder wachtwoord, is dit niet veilig.",
-       "config-db-username-empty": "U moet een waarde invoeren voor \"{{int:config-db-username}}\".",
        "config-db-install-username": "Voer de gebruikersnaam in die gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet de gebruikersnaam van de MediaWikigebruiker. Dit is de gebruikersnaam voor de database.",
        "config-db-install-password": "Voer het wachtwoord in dat gebruikt moet worden om te verbinden met de database tijdens het installatieproces. Dit is niet het wachtwoord van de MediaWikigebruiker. Dit is het wachtwoord voor de database.",
        "config-db-install-help": "Voer de gebruikersnaam en het wachtwoord in die worden gebruikt voor de databaseverbinding tijdens het installatieproces.",
        "config-db-account-lock": "Dezelfde gebruiker en wachwoord gebruiken na de installatie",
-       "config-db-wiki-account": "Gebruiker voor na de installatie",
+       "config-db-wiki-account": "Gebruikersaccount voor na de installatie",
        "config-db-wiki-help": "Voer de gebruikersnaam en het wachtwoord in die gebruikt worden om verbinding te maken met de database na de installatie.\nAls de gebruiker niet bestaat en de gebruiker die tijdens de installatie gebruikt wordt voldoende rechten heeft, wordt deze gebruiker aangemaakt met de minimaal benodigde rechten voor het laten werken van de wiki.",
        "config-db-prefix": "Databasetabelvoorvoegsel:",
        "config-db-prefix-help": "Als u een database moet gebruiken voor meerdere wiki's, of voor MediaWiki en een andere toepassing, dan kunt u ervoor kiezen om een voorvoegsel toe te voegen aan de tabelnamen om conflicten te voorkomen.\nGebruik geen spaties.\n\nDit veld wordt meestal leeg gelaten.",
        "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",
+       "config-db-web-account": "Databaseaccount voor webtoegang",
        "config-db-web-help": "Selecteer de gebruikersnaam en het wachtwoord die de webserver gebruikt om verbinding te maken met de databaseserver na de installatie.",
-       "config-db-web-account-same": "Dezelfde gebruiker gebruiken als voor de installatie",
+       "config-db-web-account-same": "Dezelfde account gebruiken als voor de installatie",
        "config-db-web-create": "Maak de gebruiker aan als deze nog niet bestaat",
        "config-db-web-no-create-privs": "De gebruiker die u hebt opgegeven voor de installatie heeft niet voldoende rechten om een gebruiker aan te maken.\nDe gebruiker die u hier opgeeft moet al bestaan.",
        "config-mysql-engine": "Opslagmethode:",
        "config-optional-skip": "Laat maar zitten, installeer gewoon de wiki.",
        "config-profile": "Gebruikersrechtenprofiel:",
        "config-profile-wiki": "Open wiki",
-       "config-profile-no-anon": "Gebruiker aanmaken verplicht",
+       "config-profile-no-anon": "Account aanmaken verplicht",
        "config-profile-fishbowl": "Alleen voor geautoriseerde bewerkers",
        "config-profile-private": "Privéwiki",
        "config-profile-help": "Wiki's werken het beste als ze door zoveel mogelijk gebruikers worden bewerkt.\nIn MediaWiki is het eenvoudig om de recente wijzigingen te controleren en eventuele foutieve of kwaadwillende bewerkingen terug te draaien.\n\nDaarnaast vinden velen MediaWiki goed inzetbaar in vele andere rollen, en soms is het niet handig om helemaal \"op de wikimanier\" te werken.\nDaarom biedt dit installatieprogramma u de volgende keuzes voor de basisinstelling van gebruikersvrijheden:\n\nHet profiel '''{{int:config-profile-wiki}}''' staat iedereen toe te bewerken, zonder zelfs aan te melden.\nEen wiki met '''{{int:config-profile-no-anon}}\" biedt extra verantwoordelijkheid, maar kan afschrikken toevallige gebruikers afschrikken.\n\nHet scenario '''{{int:config-profile-fishbowl}}''' laat gebruikers waarvoor dat is ingesteld bewerkt, maar andere gebruikers kunnen alleen pagina's bekijken, inclusief de bewerkingsgeschiedenis.\nIn een '''{{int:config-profile-private}}''' kunnen alleen goedgekeurde gebruikers pagina's bekijken en bewerken.\n\nMeer complexe instellingen voor gebruikersrechten zijn te maken na de installatie; hierover is meer te lezen in de [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights handleiding].",
        "config-insecure-keys": "'''Waarschuwing:''' De {{PLURAL:$2|sleutel die is aangemaakt|sleutels die zijn aangemaakt}} ($1) tijdens de installatie {{PLURAL:$2|is|zijn}} niet volledig veilig. Overweeg deze handmatig te wijzigen.",
        "config-install-updates": "Voorkomen dat updates onnodig worden uitgevoerd",
        "config-install-updates-failed": "<strong>Fout:</strong> het toevoegen van updatesleutels aan tabellen is mislukt met de volgende fout: $1",
-       "config-install-sysop": "Gebruiker voor beheerder aanmaken",
+       "config-install-sysop": "Account voor beheerder aanmaken",
        "config-install-subscribe-fail": "Het is niet mogelijk te abonneren op mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL is niet geïnstalleerd en <code>allow_url_fopen</code> is niet beschikbaar.",
        "config-install-mainpage": "Hoofdpagina aanmaken met standaard inhoud",
index 6a1d4a4..051fe92 100644 (file)
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions/pl rozszerzenia]?\n\nMożesz przejrzeć [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.",
        "mainpagetext": "'''Instalacja MediaWiki powiodła się.'''",
-       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]"
+       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika], aby uzyskać informacje o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam \nDowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index 948b6dd..e41c1f7 100644 (file)
@@ -17,7 +17,8 @@
                        "Fasouzafreitas",
                        "TheEduGobi",
                        "Dianakc",
-                       "Walesson"
+                       "Walesson",
+                       "Almondega"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-oracle-def-ts": "Espaço de tabela padrão:",
        "config-oracle-temp-ts": "Tablespace temporário:",
        "config-type-mysql": "MySQL (ou compatível)",
+       "config-type-postgres": "PostgreSQL",
+       "config-type-sqlite": "SQLite",
+       "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "O MediaWiki suporta os sistemas de banco de dados a seguir:\n\n$1\n\nSe você não vê o sistema de banco de dados que você está tentando usar listados abaixo, siga as instruções relacionadas acima, para ativar o suporte.",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] é um sistema de banco de dados leve que é muito bem suportado. ([http://www.php.net/manual/en/pdo.installation.php como compilar o PHP com suporte a SQLite], usa DOP)",
        "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.",
        "config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
        "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
+       "config-sqlite-fts3-downgrade": "O PHP não tem suporte FTS3; revertendo o esquema das tabelas para versão anterior",
        "config-regenerate": "Regenerar arquivo LocalSettings.php →",
        "config-show-table-status": "Consulta <code>SHOW TABLE STATUS</code> falhou!",
        "config-unknown-collation": "<strong>Aviso:</strong> O banco de dados está usando agrupamento não reconhecido.",
        "config-cache-help": "A cache de objetos é usada para melhorar o desempenho do MediaWiki. Armazena dados usados com frequência.\nSites de tamanho médio ou grande são altamente encorajados a ativar esta funcionalidade e os sites pequenos também terão alguns benefícios em fazê-lo.",
        "config-extensions": "Extensões",
        "config-install-step-done": "feito",
+       "config-install-step-failed": "falhou",
        "config-install-extensions": "Incluindo extensões",
        "config-install-database": "Criando base de dados",
        "config-install-schema": "Criando esquema",
+       "config-install-pg-schema-not-exist": "O esquema ''(schema)'' PostgreSQL não existe.",
        "config-install-pg-commit": "Enviando alterações",
        "config-install-user": "Criando usuário de banco de dados",
        "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
index 8b82db0..bf8da76 100644 (file)
@@ -65,5 +65,5 @@
        "config-help": "ajute",
        "config-help-tooltip": "cazze pe spannere",
        "mainpagetext": "'''MediaUicchi ha state 'nstallete.'''",
-       "mainpagedocfooter": "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste pe le configuraziune]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]"
+       "mainpagedocfooter": "Vè 'ndruche [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer uicchi.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenghe de le 'mbostaziune pa configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaUicchi]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 'Mbare accume combattere condre a 'u rummate sus 'a uicchi toje]"
 }
index c7c1b3d..e8e2cf6 100644 (file)
@@ -4,7 +4,8 @@
                        "AmaryllisGardener",
                        "John Reid",
                        "Seb35",
-                       "Macofe"
+                       "Macofe",
+                       "Aursani"
                ]
        },
        "config-desc": "The installer fer MediaWiki",
index 02e9797..6b3b8f2 100644 (file)
@@ -1,8 +1,31 @@
 {
        "@metadata": {
                "authors": [
-                       "Sindhu"
+                       "Sindhu",
+                       "Aursani"
                ]
        },
-       "config-xml-bad": "PHP جو XML ماڊيول کٽل آهي. ميڊيا وڪيءَ کي هن فنڪشن ۾ ماڊيول گھربل آهن ۽ ترتيب يا ڪنفيگيوريشن ۾ ڪم نه ڪندي. \nتوهان کي گھرجي ته php-xml RPM پيڪيج انسٽال ڪريو."
+       "config-information": "معلومات",
+       "config-localsettings-badkey": "توهان جي ڏنل ڪنجي غيردرست آهي.",
+       "config-your-language": "توهان جي ٻولي:",
+       "config-wiki-language": "وڪِي ٻولي:",
+       "config-back": "پوئتي ←",
+       "config-continue": "اڳتي →",
+       "config-page-language": "ٻولي",
+       "config-page-welcome": "ذريعات‌وڪي تي ڀلي ڪري آيا!",
+       "config-page-dbconnect": "اعداد خاني سان جُڙو",
+       "config-page-upgrade": "هاڻوڪي تنصيبڪاريءَ کي سڌاريو",
+       "config-page-dbsettings": "اعدادخاني جون سيٽڱس",
+       "config-page-name": "نالو",
+       "config-page-options": "آپشنس",
+       "config-page-install": "تنصيبيو",
+       "config-page-complete": "پُورو!",
+       "config-page-restart": "تنصيبڪاري وري کان شروع ڪريو",
+       "config-page-readme": "مون کي پڙهو",
+       "config-page-copying": "پرت ڪندي",
+       "config-page-existingwiki": "موجوده وڪِي",
+       "config-restart": "ها، وري کان شروع ڪريو",
+       "config-env-php": "PHP $1 تنصيب ٿي چڪو",
+       "config-env-hhvm": "HHVM $1 تنصيب ٿي چڪو.",
+       "config-xml-bad": "PHP جو XML ماڊيول کٽل آهي. ذريعات‌وڪيءَ کي ان ماڊيول ۾  فنڪشنس گھربل آهن ۽ اها موجوده ترتيب يا ڪنفيگيوريشن ۾ ڪم نہ ڪندي. \nتوهان کي گھرجي تہ php-xml RPM پيڪيج تنصيب ڪريو."
 }
index e877280..f3cc63e 100644 (file)
@@ -70,5 +70,5 @@
        "config-help": "הילף",
        "config-nofile": "מ'האט נישט געקענט טרעפן די טעקע \"$1\". צי האט מען זי אויסגעמעקט?",
        "mainpagetext": "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
-       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]"
+       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam לערנט וויאזוי צו באקעמפן בפעם אויף אייער וויקי]"
 }
index 414b6e9..5e7ab06 100644 (file)
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
        "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拓展]?\n您可浏览[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 拓展分类]。",
        "mainpagetext": "'''已成功安装MediaWiki。'''",
-       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]"
+       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
 }
index 3e23391..2d13c7e 100644 (file)
@@ -64,12 +64,17 @@ abstract class Job implements IJobSpecification {
         */
        public static function factory( $command, Title $title, $params = array() ) {
                global $wgJobClasses;
+
                if ( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
 
-                       return new $class( $title, $params );
+                       $job = new $class( $title, $params );
+                       $job->command = $command;
+
+                       return $job;
                }
-               throw new MWException( "Invalid job command `{$command}`" );
+
+               throw new InvalidArgumentException( "Invalid job command '{$command}'" );
        }
 
        /**
index 7907614..ed2d0fa 100644 (file)
@@ -33,7 +33,7 @@ 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 */
+       /** @var WANObjectCache */
        protected $cache;
 
        /** @var bool|string Name of an external DB cluster. False if not set */
@@ -48,13 +48,10 @@ class JobQueueDB extends JobQueue {
         * @param array $params
         */
        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;
+               $this->cache = ObjectCache::getMainWANInstance();
        }
 
        protected function supportedOrders() {
@@ -144,15 +141,13 @@ class JobQueueDB extends JobQueue {
         * @throws MWException
         */
        protected function doGetAbandonedCount() {
-               global $wgMemc;
-
                if ( $this->claimTTL <= 0 ) {
                        return 0; // no acknowledgements
                }
 
                $key = $this->getCacheKey( 'abandonedcount' );
 
-               $count = $wgMemc->get( $key );
+               $count = $this->cache->get( $key );
                if ( is_int( $count ) ) {
                        return $count;
                }
@@ -170,7 +165,8 @@ class JobQueueDB extends JobQueue {
                } catch ( DBError $e ) {
                        $this->throwDBException( $e );
                }
-               $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
+
+               $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
 
                return $count;
        }
index 5bd1cc9..4609d2d 100644 (file)
@@ -286,18 +286,17 @@ class JobQueueGroup {
         * @since 1.23
         */
        public function queuesHaveJobs( $type = self::TYPE_ANY ) {
-               global $wgMemc;
-
                $key = wfMemcKey( 'jobqueue', 'queueshavejobs', $type );
+               $cache = ObjectCache::getLocalClusterInstance();
 
-               $value = $wgMemc->get( $key );
+               $value = $cache->get( $key );
                if ( $value === false ) {
                        $queues = $this->getQueuesWithJobs();
                        if ( $type == self::TYPE_DEFAULT ) {
                                $queues = array_intersect( $queues, $this->getDefaultQueueTypes() );
                        }
                        $value = count( $queues ) ? 'true' : 'false';
-                       $wgMemc->add( $key, $value, 15 );
+                       $cache->add( $key, $value, 15 );
                }
 
                return ( $value === 'true' );
@@ -382,19 +381,24 @@ class JobQueueGroup {
         * @return mixed
         */
        private function getCachedConfigVar( $name ) {
-               global $wgConf, $wgMemc;
+               global $wgConf;
 
                if ( $this->wiki === wfWikiID() ) {
                        return $GLOBALS[$name]; // common case
                } else {
+                       $cache = ObjectCache::getLocalClusterInstance();
                        list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
                        $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
-                       $value = $wgMemc->get( $key ); // ('v' => ...) or false
+                       $value = $cache->get( $key ); // ('v' => ...) or false
                        if ( is_array( $value ) ) {
                                return $value['v'];
                        } else {
                                $value = $wgConf->getConfig( $this->wiki, $name );
-                               $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
+                               $cache->set(
+                                       $key,
+                                       array( 'v' => $value ),
+                                       $cache::TTL_DAY + mt_rand( 0, $cache::TTL_DAY )
+                               );
 
                                return $value;
                        }
index 29c8068..deb5aa5 100644 (file)
@@ -218,14 +218,15 @@ class JobQueueRedis extends JobQueue {
                                        $failed += count( $itemBatch );
                                }
                        }
-                       if ( $failed > 0 ) {
-                               wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
-
-                               throw new RedisException( "Could not insert {$failed} {$this->type} job(s)." );
-                       }
                        JobQueue::incrStats( 'inserts', $this->type, count( $items ) );
+                       JobQueue::incrStats( 'inserts_actual', $this->type, $pushed );
                        JobQueue::incrStats( 'dupe_inserts', $this->type,
                                count( $items ) - $failed - $pushed );
+                       if ( $failed > 0 ) {
+                               $err = "Could not insert {$failed} {$this->type} job(s).";
+                               wfDebugLog( 'JobQueueRedis', $err );
+                               throw new RedisException( $err );
+                       }
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
@@ -301,7 +302,7 @@ LUA;
                                        break; // no jobs; nothing to do
                                }
 
-                               JobQueue::incrStats( 'job-pop', $this->type );
+                               JobQueue::incrStats( 'pops', $this->type );
                                $item = $this->unserialize( $blob );
                                if ( $item === false ) {
                                        wfDebugLog( 'JobQueueRedis', "Could not unserialize {$this->type} job." );
@@ -393,7 +394,7 @@ LUA;
                                return false;
                        }
 
-                       JobQueue::incrStats( 'job-ack', $this->type );
+                       JobQueue::incrStats( 'acks', $this->type );
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
index c11d5a7..af836bc 100644 (file)
@@ -61,7 +61,6 @@ large amounts of time polling empty queues, aggregators exists to keep track
 of which queues are ready.
 
 The following queue aggregator classes are available:
-* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
 * JobQueueAggregatorRedis (uses a redis server to track ready queues)
 
 Some aggregators cache data for a few minutes while others may be always up to date.
index ef9fec0..6b1a1e3 100644 (file)
@@ -103,6 +103,7 @@ class HTMLCacheUpdateJob extends Job {
                // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
                foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
                        $dbw->commit( __METHOD__, 'flush' );
+                       wfWaitForSlaves();
 
                        $dbw->update( 'page',
                                array( 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
index 4ba1d4c..26f4520 100644 (file)
@@ -41,10 +41,6 @@ class RefreshLinksJob extends Job {
 
        function __construct( Title $title, array $params ) {
                parent::__construct( 'refreshLinks', $title, $params );
-               // A separate type is used just for cascade-protected backlinks
-               if ( !empty( $this->params['prioritize'] ) ) {
-                       $this->command .= 'Prioritized';
-               }
                // Base backlink update jobs and per-title update jobs can be de-duplicated.
                // If template A changes twice before any jobs run, a clean queue will have:
                //              (A base, A base)
@@ -64,6 +60,30 @@ class RefreshLinksJob extends Job {
                        && ( !isset( $params['pages'] ) || count( $params['pages'] ) == 1 );
        }
 
+       /**
+        * @param Title $title
+        * @param array $params
+        * @return RefreshLinksJob
+        */
+       public static function newPrioritized( Title $title, array $params ) {
+               $job = new self( $title, $params );
+               $job->command = 'refreshLinksPrioritized';
+
+               return $job;
+       }
+
+       /**
+        * @param Title $title
+        * @param array $params
+        * @return RefreshLinksJob
+        */
+       public static function newDynamic( Title $title, array $params ) {
+               $job = new self( $title, $params );
+               $job->command = 'refreshLinksDynamic';
+
+               return $job;
+       }
+
        function run() {
                global $wgUpdateRowsPerJob;
 
@@ -83,6 +103,7 @@ class RefreshLinksJob extends Job {
                        } else {
                                $extraParams['masterPos'] = false;
                        }
+                       $extraParams['triggeredRecursive'] = true;
                        // Convert this into no more than $wgUpdateRowsPerJob RefreshLinks per-title
                        // jobs and possibly a recursive RefreshLinks job for the rest of the backlinks
                        $jobs = BacklinkJobUtils::partitionBacklinkJob(
@@ -110,12 +131,7 @@ class RefreshLinksJob extends Job {
         * @param Title $title
         * @return bool
         */
-       protected function runForTitle( Title $title = null ) {
-               if ( is_null( $title ) ) {
-                       $this->setLastError( "refreshLinks: Invalid title" );
-                       return false;
-               }
-
+       protected function runForTitle( Title $title ) {
                // Wait for the DB of the current/next slave DB handle to catch up to the master.
                // This way, we get the correct page_latest for templates or files that just changed
                // milliseconds ago, having triggered this job to begin with.
@@ -196,7 +212,26 @@ class RefreshLinksJob extends Job {
                        }
                }
 
-               $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
+               $updates = $content->getSecondaryDataUpdates(
+                       $title, null, !empty( $this->params['useRecursiveLinksUpdate'] ), $parserOutput );
+               foreach ( $updates as $key => $update ) {
+                       if ( $update instanceof LinksUpdate ) {
+                               if ( isset( $this->params['triggeredRecursive'] ) ) {
+                                       $update->setTriggeredRecursive();
+                               }
+                               if ( isset( $this->params['triggeringUser'] ) && $this->params['triggeringUser'] ) {
+                                       $userInfo = $this->params['triggeringUser'];
+                                       if ( $userInfo['userId'] ) {
+                                               $user = User::newFromId( $userInfo['userId'] );
+                                       } else {
+                                               // Anonymous, use the username
+                                               $user = User::newFromName( $userInfo['userName'], false );
+                                       }
+                                       $update->setTriggeringUser( $user );
+                               }
+                       }
+               }
+
                DataUpdate::runUpdates( $updates );
 
                InfoAction::invalidateCache( $title );
index 49d05d4..216d9b7 100644 (file)
@@ -119,7 +119,6 @@ class IEUrlExtension {
 
                if ( !preg_match( '/^[a-zA-Z0-9_-]+$/', $extension ) ) {
                        // Non-alphanumeric extension, unlikely to be registered.
-                       //
                        // The regex above is known to match all registered file extensions
                        // in a default Windows XP installation. It's important to allow
                        // extensions with ampersands and percent signs, since that reduces
index a0230be..a49eb01 100644 (file)
@@ -39,11 +39,11 @@ class MapCacheLRU {
 
        /**
         * @param int $maxKeys Maximum number of entries allowed (min 1).
-        * @throws Exception When $maxCacheKeys is not an int or =< 0.
+        * @throws Exception When $maxCacheKeys is not an int or not above zero.
         */
        public function __construct( $maxKeys ) {
                Assert::parameterType( 'integer', $maxKeys, '$maxKeys' );
-               Assert::parameter( $maxKeys >= 1, '$maxKeys', 'must be >= 1' );
+               Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' );
 
                $this->maxCacheKeys = $maxKeys;
        }
@@ -59,7 +59,7 @@ class MapCacheLRU {
         */
        public function set( $key, $value ) {
                if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
+                       $this->ping( $key );
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
                        $evictKey = key( $this->cache );
@@ -87,12 +87,11 @@ class MapCacheLRU {
         * @return mixed
         */
        public function get( $key ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-                       return $this->cache[$key];
-               } else {
+               if ( !array_key_exists( $key, $this->cache ) ) {
                        return null;
                }
+               $this->ping( $key );
+               return $this->cache[$key];
        }
 
        /**
index 0b9aa7c..6191612 100644 (file)
@@ -35,13 +35,6 @@ class ObjectFactory {
         * an 'args' key that provides arguments to pass to the
         * constructor/callable.
         *
-        * Object construction using a specification having both 'class' and
-        * 'args' members will call the constructor of the class using
-        * ReflectionClass::newInstanceArgs. The use of ReflectionClass carries
-        * a performance penalty and should not be used to create large numbers of
-        * objects. If this is needed, consider introducing a factory method that
-        * can be called via call_user_func_array() instead.
-        *
         * Values in the arguments collection which are Closure instances will be
         * expanded by invoking them with no arguments before passing the
         * resulting value on to the constructor/callable. This can be used to
@@ -77,8 +70,7 @@ class ObjectFactory {
                        if ( !$args ) {
                                $obj = new $clazz();
                        } else {
-                               $ref = new ReflectionClass( $clazz );
-                               $obj = $ref->newInstanceArgs( $args );
+                               $obj = static::constructClassInstance( $clazz, $args );
                        }
                } elseif ( isset( $spec['factory'] ) ) {
                        $obj = call_user_func_array( $spec['factory'], $args );
@@ -117,4 +109,86 @@ class ObjectFactory {
                        }
                }, $list );
        }
+
+       /**
+        * Construct an instance of the given class using the given arguments.
+        *
+        * PHP's `call_user_func_array()` doesn't work with object construction so
+        * we have to use other measures. Starting with PHP 5.6.0 we could use the
+        * "splat" operator (`...`) to unpack the array into an argument list.
+        * Sadly there is no way to conditionally include a syntax construct like
+        * a new operator in a way that allows older versions of PHP to still
+        * parse the file. Instead, we will try a loop unrolling technique that
+        * works for 0-10 arguments. If we are passed 11 or more arguments we will
+        * take the performance penalty of using
+        * `ReflectionClass::newInstanceArgs()` to construct the desired object.
+        *
+        * @param string $clazz Class name
+        * @param array $args Constructor arguments
+        * @return mixed Constructed instance
+        */
+       public static function constructClassInstance( $clazz, $args ) {
+               // TODO: when PHP min version supported is >=5.6.0 replace this
+               // function body with `return new $clazz( ... $args );`.
+               $obj = null;
+               switch ( count( $args ) ) {
+                       case 0:
+                               $obj = new $clazz();
+                               break;
+                       case 1:
+                               $obj = new $clazz( $args[0] );
+                               break;
+                       case 2:
+                               $obj = new $clazz( $args[0], $args[1] );
+                               break;
+                       case 3:
+                               $obj = new $clazz( $args[0], $args[1], $args[2] );
+                               break;
+                       case 4:
+                               $obj = new $clazz( $args[0], $args[1], $args[2], $args[3] );
+                               break;
+                       case 5:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4]
+                               );
+                               break;
+                       case 6:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5]
+                               );
+                               break;
+                       case 7:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6]
+                               );
+                               break;
+                       case 8:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7]
+                               );
+                               break;
+                       case 9:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7], $args[8]
+                               );
+                               break;
+                       case 10:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7], $args[8], $args[9]
+                               );
+                               break;
+                       default:
+                               // Fall back to using ReflectionClass and curse the developer
+                               // who decided that 11+ args was a reasonable method
+                               // signature.
+                               $ref = new ReflectionClass( $clazz );
+                               $obj = $ref->newInstanceArgs( $args );
+               }
+               return $obj;
+       }
 }
index b55ff9d..eec31ce 100644 (file)
@@ -55,7 +55,7 @@ class ProcessCacheLRU {
         */
        public function set( $key, $prop, $value ) {
                if ( isset( $this->cache[$key] ) ) {
-                       $this->ping( $key ); // push to top
+                       $this->ping( $key );
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
                        $evictKey = key( $this->cache );
@@ -94,13 +94,11 @@ class ProcessCacheLRU {
         * @return mixed
         */
        public function get( $key, $prop ) {
-               if ( isset( $this->cache[$key][$prop] ) ) {
-                       // push to top
-                       $this->ping( $key );
-                       return $this->cache[$key][$prop];
-               } else {
+               if ( !isset( $this->cache[$key][$prop] ) ) {
                        return null;
                }
+               $this->ping( $key );
+               return $this->cache[$key][$prop];
        }
 
        /**
@@ -130,7 +128,7 @@ class ProcessCacheLRU {
         */
        public function resize( $maxKeys ) {
                Assert::parameterType( 'integer', $maxKeys, '$maxKeys' );
-               Assert::parameter( $maxKeys >= 1, '$maxKeys', 'must be >= 1' );
+               Assert::parameter( $maxKeys > 0, '$maxKeys', 'must be above zero' );
 
                $this->maxCacheKeys = $maxKeys;
                while ( count( $this->cache ) > $this->maxCacheKeys ) {
diff --git a/includes/libs/RunningStat.php b/includes/libs/RunningStat.php
deleted file mode 100644 (file)
index 8bd4656..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-/**
- * Compute running mean, variance, and extrema of a stream of numbers.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Profiler
- */
-
-// Needed due to PHP non-bug <https://bugs.php.net/bug.php?id=49828>.
-define( 'NEGATIVE_INF', -INF );
-
-/**
- * Represents a running summary of a stream of numbers.
- *
- * RunningStat instances are accumulator-like objects that provide a set of
- * continuously-updated summary statistics for a stream of numbers, without
- * requiring that each value be stored. The measures it provides are the
- * arithmetic mean, variance, standard deviation, and extrema (min and max);
- * together they describe the central tendency and statistical dispersion of a
- * set of values.
- *
- * One RunningStat instance can be merged into another; the resultant
- * RunningStat has the state it would have had if it had accumulated each
- * individual point. This allows data to be summarized in parallel and in
- * stages without loss of fidelity.
- *
- * Based on a C++ implementation by John D. Cook:
- *  <http://www.johndcook.com/standard_deviation.html>
- *  <http://www.johndcook.com/skewness_kurtosis.html>
- *
- * The in-line documentation for this class incorporates content from the
- * English Wikipedia articles "Variance", "Algorithms for calculating
- * variance", and "Standard deviation".
- *
- * @since 1.23
- */
-class RunningStat implements Countable {
-
-       /** @var int Number of samples. **/
-       public $n = 0;
-
-       /** @var float The first moment (or mean, or expected value). **/
-       public $m1 = 0.0;
-
-       /** @var float The second central moment (or variance). **/
-       public $m2 = 0.0;
-
-       /** @var float The least value in the set. **/
-       public $min = INF;
-
-       /** @var float The greatest value in the set. **/
-       public $max = NEGATIVE_INF;
-
-       /**
-        * Count the number of accumulated values.
-        * @return int Number of values
-        */
-       public function count() {
-               return $this->n;
-       }
-
-       /**
-        * Add a number to the data set.
-        * @param int|float $x Value to add
-        */
-       public function push( $x ) {
-               $x = (float) $x;
-
-               $this->min = min( $this->min, $x );
-               $this->max = max( $this->max, $x );
-
-               $n1 = $this->n;
-               $this->n += 1;
-               $delta = $x - $this->m1;
-               $delta_n = $delta / $this->n;
-               $this->m1 += $delta_n;
-               $this->m2 += $delta * $delta_n * $n1;
-       }
-
-       /**
-        * Get the mean, or expected value.
-        *
-        * The arithmetic mean is the sum of all measurements divided by the number
-        * of observations in the data set.
-        *
-        * @return float Mean
-        */
-       public function getMean() {
-               return $this->m1;
-       }
-
-       /**
-        * Get the estimated variance.
-        *
-        * Variance measures how far a set of numbers is spread out. A small
-        * variance indicates that the data points tend to be very close to the
-        * mean (and hence to each other), while a high variance indicates that the
-        * data points are very spread out from the mean and from each other.
-        *
-        * @return float Estimated variance
-        */
-       public function getVariance() {
-               if ( $this->n === 0 ) {
-                       // The variance of the empty set is undefined.
-                       return NAN;
-               } elseif ( $this->n === 1 ) {
-                       return 0.0;
-               } else {
-                       return $this->m2 / ( $this->n - 1.0 );
-               }
-       }
-
-       /**
-        * Get the estimated standard deviation.
-        *
-        * The standard deviation of a statistical population is the square root of
-        * its variance. It shows how much variation from the mean exists. In
-        * addition to expressing the variability of a population, the standard
-        * deviation is commonly used to measure confidence in statistical conclusions.
-        *
-        * @return float Estimated standard deviation
-        */
-       public function getStdDev() {
-               return sqrt( $this->getVariance() );
-       }
-
-       /**
-        * Merge another RunningStat instance into this instance.
-        *
-        * This instance then has the state it would have had if all the data had
-        * been accumulated by it alone.
-        *
-        * @param RunningStat RunningStat instance to merge into this one
-        */
-       public function merge( RunningStat $other ) {
-               // If the other RunningStat is empty, there's nothing to do.
-               if ( $other->n === 0 ) {
-                       return;
-               }
-
-               // If this RunningStat is empty, copy values from other RunningStat.
-               if ( $this->n === 0 ) {
-                       $this->n = $other->n;
-                       $this->m1 = $other->m1;
-                       $this->m2 = $other->m2;
-                       $this->min = $other->min;
-                       $this->max = $other->max;
-                       return;
-               }
-
-               $n = $this->n + $other->n;
-               $delta = $other->m1 - $this->m1;
-               $delta2 = $delta * $delta;
-
-               $this->m1 = ( ( $this->n * $this->m1 ) + ( $other->n * $other->m1 ) ) / $n;
-               $this->m2 = $this->m2 + $other->m2 + ( $delta2 * $this->n * $other->n / $n );
-               $this->min = min( $this->min, $other->min );
-               $this->max = max( $this->max, $other->max );
-               $this->n = $n;
-       }
-}
index 5ed67c7..d2cd0e4 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use RunningStat\RunningStat;
+
 /**
  * Convenience class for working with XHProf
  * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
@@ -254,7 +256,7 @@ class Xhprof {
                                        }
 
                                        for ( $i = 0; $i < $stats['ct']; $i++ ) {
-                                               $this->inclusive[$child][$stat]->push(
+                                               $this->inclusive[$child][$stat]->addObservation(
                                                        $value / $stats['ct']
                                                );
                                        }
diff --git a/includes/libs/composer/ComposerInstalled.php b/includes/libs/composer/ComposerInstalled.php
new file mode 100644 (file)
index 0000000..5f87b54
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Reads an installed.json file and provides accessors to get what is
+ * installed
+ *
+ * @since 1.27
+ */
+class ComposerInstalled {
+
+       /**
+        * @param string $location
+        */
+       public function __construct( $location ) {
+               $this->contents = json_decode( file_get_contents( $location ), true );
+       }
+
+       /**
+        * Dependencies currently installed according to installed.json
+        *
+        * @return array
+        */
+       public function getInstalledDependencies() {
+               $deps = array();
+               foreach ( $this->contents as $installed ) {
+                       $deps[$installed['name']] = array(
+                               'version' => ComposerJson::normalizeVersion( $installed['version'] ),
+                               'type' => $installed['type'],
+                               'licenses' => isset( $installed['license'] ) ? $installed['license'] : array(),
+                               'authors' => isset( $installed['authors'] ) ? $installed['authors'] : array(),
+                               'description' => isset( $installed['description'] ) ? $installed['description']: '',
+                       );
+               }
+
+               ksort( $deps );
+               return $deps;
+       }
+}
index 522c5d7..b5419b7 100644 (file)
@@ -40,7 +40,7 @@ class APCBagOStuff extends BagOStuff {
                return $val;
        }
 
-       public function set( $key, $value, $exptime = 0 ) {
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                apc_store( $key . self::KEY_SUFFIX, $value, $exptime );
 
                return true;
index 8cbd48a..703c195 100644 (file)
@@ -42,12 +42,16 @@ use Psr\Log\NullLogger;
  *
  * @ingroup Cache
  */
-abstract class BagOStuff implements LoggerAwareInterface {
+abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        /** @var array[] Lock tracking */
        protected $locks = array();
+
        /** @var integer */
        protected $lastError = self::ERR_NONE;
 
+       /** @var string */
+       protected $keyspace = 'local';
+
        /** @var LoggerInterface */
        protected $logger;
 
@@ -63,6 +67,8 @@ abstract class BagOStuff implements LoggerAwareInterface {
        /** Bitfield constants for get()/getMulti() */
        const READ_LATEST = 1; // use latest data for replicated stores
        const READ_VERIFIED = 2; // promise that caller can tell when keys are stale
+       /** Bitfield constants for set()/merge() */
+       const WRITE_SYNC = 1; // synchronously write to all locations for replicated stores
 
        public function __construct( array $params = array() ) {
                if ( isset( $params['logger'] ) ) {
@@ -70,6 +76,10 @@ abstract class BagOStuff implements LoggerAwareInterface {
                } else {
                        $this->setLogger( new NullLogger() );
                }
+
+               if ( isset( $params['keyspace'] ) ) {
+                       $this->keyspace = $params['keyspace'];
+               }
        }
 
        /**
@@ -144,12 +154,13 @@ abstract class BagOStuff implements LoggerAwareInterface {
        abstract protected function doGet( $key, $flags = 0 );
 
        /**
-        * @note: This method is only needed if cas() is not is used for merge()
+        * @note: This method is only needed if merge() uses mergeViaCas()
         *
         * @param string $key
         * @param mixed $casToken
         * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional]
         * @return mixed Returns false on failure and if the item does not exist
+        * @throws Exception
         */
        protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                throw new Exception( __METHOD__ . ' not implemented.' );
@@ -161,9 +172,10 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @param string $key
         * @param mixed $value
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         */
-       abstract public function set( $key, $value, $exptime = 0 );
+       abstract public function set( $key, $value, $exptime = 0, $flags = 0 );
 
        /**
         * Delete an item
@@ -183,15 +195,16 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         * @throws InvalidArgumentException
         */
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !is_callable( $callback ) ) {
                        throw new InvalidArgumentException( "Got invalid callback." );
                }
 
-               return $this->mergeViaLock( $key, $callback, $exptime, $attempts );
+               return $this->mergeViaLock( $key, $callback, $exptime, $attempts, $flags );
        }
 
        /**
@@ -207,7 +220,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
                do {
                        $this->clearLastError();
                        $casToken = null; // passed by reference
-                       $currentValue = $this->getWithToken( $key, $casToken, BagOStuff::READ_LATEST );
+                       $currentValue = $this->getWithToken( $key, $casToken, self::READ_LATEST );
                        if ( $this->getLastError() ) {
                                return false; // don't spam retries (retry only on races)
                        }
@@ -254,15 +267,16 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @param callable $callback Callback method to be executed
         * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
         * @param int $attempts The amount of times to attempt a merge in case of failure
+        * @param int $flags Bitfield of BagOStuff::WRITE_* constants
         * @return bool Success
         */
-       protected function mergeViaLock( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       protected function mergeViaLock( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !$this->lock( $key, 6 ) ) {
                        return false;
                }
 
                $this->clearLastError();
-               $currentValue = $this->get( $key, BagOStuff::READ_LATEST );
+               $currentValue = $this->get( $key, self::READ_LATEST );
                if ( $this->getLastError() ) {
                        $success = false;
                } else {
@@ -271,7 +285,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
                        if ( $value === false ) {
                                $success = true; // do nothing
                        } else {
-                               $success = $this->set( $key, $value, $exptime ); // set the new value
+                               $success = $this->set( $key, $value, $exptime, $flags ); // set the new value
                        }
                }
 
@@ -305,7 +319,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
                        }
                }
 
-               $expiry = min( $expiry ?: INF, 86400 );
+               $expiry = min( $expiry ?: INF, self::TTL_DAY );
 
                $this->clearLastError();
                $timestamp = microtime( true ); // starting UNIX timestamp
@@ -314,7 +328,8 @@ abstract class BagOStuff implements LoggerAwareInterface {
                } elseif ( $this->getLastError() || $timeout <= 0 ) {
                        $locked = false; // network partition or non-blocking
                } else {
-                       $uRTT = ceil( 1e6 * ( microtime( true ) - $timestamp ) ); // estimate RTT (us)
+                       // Estimate the RTT (us); use 1ms minimum for sanity
+                       $uRTT = max( 1e3, ceil( 1e6 * ( microtime( true ) - $timestamp ) ) );
                        $sleep = 2 * $uRTT; // rough time to do get()+set()
 
                        $attempts = 0; // failed attempts
@@ -374,7 +389,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @since 1.26
         */
        final public function getScopedLock( $key, $timeout = 6, $expiry = 30, $rclass = '' ) {
-               $expiry = min( $expiry ?: INF, 86400 );
+               $expiry = min( $expiry ?: INF, self::TTL_DAY );
 
                if ( !$this->lock( $key, $timeout, $expiry, $rclass ) ) {
                        return null;
@@ -567,7 +582,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @return int
         */
        protected function convertExpiry( $exptime ) {
-               if ( ( $exptime != 0 ) && ( $exptime < 86400 * 3650 /* 10 years */ ) ) {
+               if ( $exptime != 0 && $exptime < ( 10 * self::TTL_YEAR ) ) {
                        return time() + $exptime;
                } else {
                        return $exptime;
@@ -582,7 +597,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @return int
         */
        protected function convertToRelative( $exptime ) {
-               if ( $exptime >= 86400 * 3650 /* 10 years */ ) {
+               if ( $exptime >= ( 10 * self::TTL_YEAR ) ) {
                        $exptime -= time();
                        if ( $exptime <= 0 ) {
                                $exptime = 1;
@@ -602,4 +617,43 @@ abstract class BagOStuff implements LoggerAwareInterface {
        protected function isInteger( $value ) {
                return ( is_int( $value ) || ctype_digit( $value ) );
        }
+
+       /**
+        * Construct a cache key.
+        *
+        * @since 1.27
+        * @param string $keyspace
+        * @param array $args
+        * @return string
+        */
+       public function makeKeyInternal( $keyspace, $args ) {
+               $key = $keyspace;
+               foreach ( $args as $arg ) {
+                       $arg = str_replace( ':', '%3A', $arg );
+                       $key = $key . ':' . $arg;
+               }
+               return strtr( $key, ' ', '_' );
+       }
+
+       /**
+        * Make a global cache key.
+        *
+        * @since 1.27
+        * @param string ... Key component (variadic)
+        * @return string
+        */
+       public function makeGlobalKey() {
+               return $this->makeKeyInternal( 'global', func_get_args() );
+       }
+
+       /**
+        * Make a cache key, scoped to this instance's keyspace.
+        *
+        * @since 1.27
+        * @param string ... Key component (variadic)
+        * @return string
+        */
+       public function makeKey() {
+               return $this->makeKeyInternal( $this->keyspace, func_get_args() );
+       }
 }
index bef0456..4321b25 100644 (file)
@@ -31,7 +31,7 @@ class EmptyBagOStuff extends BagOStuff {
                return false;
        }
 
-       public function set( $key, $value, $exp = 0 ) {
+       public function set( $key, $value, $exp = 0, $flags = 0 ) {
                return true;
        }
 
@@ -39,7 +39,7 @@ class EmptyBagOStuff extends BagOStuff {
                return true;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                return true; // faster
        }
 }
index d4044e9..c1ee065 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Object caching using PHP arrays.
+ * Per-process memory cache for storing items.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * @file
  * @ingroup Cache
  */
+use Wikimedia\Assert\Assert;
 
 /**
- * This is a test of the interface, mainly. It stores things in an associative
- * array, which is not going to persist between program runs.
+ * Simple store for keeping values in an associative array for the current process.
+ *
+ * Data will not persist and is not shared with other processes.
  *
  * @ingroup Cache
  */
 class HashBagOStuff extends BagOStuff {
-       /** @var array */
-       protected $bag;
+       /** @var mixed[] */
+       protected $bag = array();
+       /** @var integer Max entries allowed */
+       protected $maxCacheKeys;
+
+       const KEY_VAL = 0;
+       const KEY_EXP = 1;
 
+       /**
+        * @param array $params Additional parameters include:
+        *   - maxKeys : only allow this many keys (using oldest-first eviction)
+        */
        function __construct( $params = array() ) {
                parent::__construct( $params );
-               $this->bag = array();
+
+               $this->maxCacheKeys = isset( $params['maxKeys'] ) ? $params['maxKeys'] : INF;
+               Assert::parameter( $this->maxCacheKeys > 0, 'maxKeys', 'must be above zero' );
        }
 
        protected function expire( $key ) {
-               $et = $this->bag[$key][1];
-
-               if ( ( $et == 0 ) || ( $et > time() ) ) {
+               $et = $this->bag[$key][self::KEY_EXP];
+               if ( $et == self::TTL_INDEFINITE || $et > time() ) {
                        return false;
                }
 
@@ -57,17 +69,33 @@ class HashBagOStuff extends BagOStuff {
                        return false;
                }
 
-               return $this->bag[$key][0];
+               return $this->bag[$key][self::KEY_VAL];
        }
 
-       public function set( $key, $value, $exptime = 0 ) {
-               $this->bag[$key] = array( $value, $this->convertExpiry( $exptime ) );
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               // Refresh key position for maxCacheKeys eviction
+               unset( $this->bag[$key] );
+               $this->bag[$key] = array(
+                       self::KEY_VAL => $value,
+                       self::KEY_EXP => $this->convertExpiry( $exptime )
+               );
+
+               if ( count( $this->bag ) > $this->maxCacheKeys ) {
+                       reset( $this->bag );
+                       $evictKey = key( $this->bag );
+                       unset( $this->bag[$evictKey] );
+               }
+
                return true;
        }
 
-       function delete( $key ) {
+       public function delete( $key ) {
                unset( $this->bag[$key] );
 
                return true;
        }
+
+       public function clear() {
+               $this->bag = array();
+       }
 }
diff --git a/includes/libs/objectcache/IExpiringStore.php b/includes/libs/objectcache/IExpiringStore.php
new file mode 100644 (file)
index 0000000..fa465c7
--- /dev/null
@@ -0,0 +1,42 @@
+<?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 Cache
+ * @author 2015 Timo Tijhof
+ */
+
+/**
+ * Generic base class for storage interfaces.
+ *
+ * Provides convenient TTL constants.
+ *
+ * @ingroup Cache
+ * @since 1.27
+ */
+interface IExpiringStore {
+
+       // Constants for TTL values, in seconds
+       const TTL_MINUTE = 60;
+       const TTL_HOUR = 3600;
+       const TTL_DAY = 86400; // 24 * 3600
+       const TTL_WEEK = 604800; // 7 * 24 * 3600
+       const TTL_MONTH = 2592000; // 30 * 24 * 3600
+       const TTL_YEAR = 31536000; // 365 * 24 * 3600
+
+       const TTL_INDEFINITE = 0;
+}
diff --git a/includes/libs/objectcache/MemcachedBagOStuff.php b/includes/libs/objectcache/MemcachedBagOStuff.php
new file mode 100644 (file)
index 0000000..162a531
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+/**
+ * Base class for memcached clients.
+ *
+ * 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 Cache
+ */
+
+/**
+ * Base class for memcached clients.
+ *
+ * @ingroup Cache
+ */
+class MemcachedBagOStuff extends BagOStuff {
+       /** @var MWMemcached|Memcached */
+       protected $client;
+
+       /**
+        * Fill in some defaults for missing keys in $params.
+        *
+        * @param array $params
+        * @return array
+        */
+       protected function applyDefaultParams( $params ) {
+               if ( !isset( $params['compress_threshold'] ) ) {
+                       $params['compress_threshold'] = 1500;
+               }
+               if ( !isset( $params['connect_timeout'] ) ) {
+                       $params['connect_timeout'] = 0.5;
+               }
+               return $params;
+       }
+
+       protected function doGet( $key, $flags = 0 ) {
+               $casToken = null;
+
+               return $this->getWithToken( $key, $casToken, $flags );
+       }
+
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+               return $this->client->get( $this->validateKeyEncoding( $key ), $casToken );
+       }
+
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               return $this->client->set( $this->validateKeyEncoding( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
+               return $this->client->cas( $casToken, $this->validateKeyEncoding( $key ),
+                       $value, $this->fixExpiry( $exptime ) );
+       }
+
+       public function delete( $key ) {
+               return $this->client->delete( $this->validateKeyEncoding( $key ) );
+       }
+
+       public function add( $key, $value, $exptime = 0 ) {
+               return $this->client->add( $this->validateKeyEncoding( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               if ( !is_callable( $callback ) ) {
+                       throw new Exception( "Got invalid callback." );
+               }
+
+               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+       }
+
+       /**
+        * Get the underlying client object. This is provided for debugging
+        * purposes.
+        * @return BagOStuff
+        */
+       public function getClient() {
+               return $this->client;
+       }
+
+       /**
+        * Construct a cache key.
+        *
+        * @since 1.27
+        * @param string $keyspace
+        * @param array $args
+        * @return string
+        */
+       public function makeKeyInternal( $keyspace, $args ) {
+               // Memcached keys have a maximum length of 255 characters. From that,
+               // subtract the number of characters we need for the keyspace and for
+               // the separator character needed for each argument. To handle some
+               // custom prefixes used by thing like WANObjectCache, limit to 205.
+               $charsLeft = 205 - strlen( $keyspace ) - count( $args );
+
+               $args = array_map(
+                       function ( $arg ) use ( &$charsLeft ) {
+                               $arg = strtr( $arg, ' ', '_' );
+
+                               // Make sure %, #, and non-ASCII chars are escaped
+                               $arg = preg_replace_callback(
+                                       '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/',
+                                       function ( $m ) {
+                                               return rawurlencode( $m[0] );
+                                       },
+                                       $arg
+                               );
+
+                               // 33 = 32 characters for the MD5 + 1 for the '#' prefix.
+                               if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) {
+                                       $arg = '#' . md5( $arg );
+                               }
+
+                               $charsLeft -= strlen( $arg );
+                               return $arg;
+                       },
+                       $args
+               );
+
+               if ( $charsLeft < 0 ) {
+                       return $keyspace . ':##' . md5( implode( ':', $args ) );
+               }
+
+               return $keyspace . ':' . implode( ':', $args );
+       }
+
+       /**
+        * Ensure that a key is safe to use (contains no control characters and no
+        * characters above the ASCII range.)
+        *
+        * @param string $key
+        * @return string
+        * @throws Exception
+        */
+       public function validateKeyEncoding( $key ) {
+               if ( preg_match( '/[^\x21-\x7e]+/', $key ) ) {
+                       throw new Exception( "Key contains invalid characters: $key" );
+               }
+               return $key;
+       }
+
+       /**
+        * TTLs higher than 30 days will be detected as absolute TTLs
+        * (UNIX timestamps), and will result in the cache entry being
+        * discarded immediately because the expiry is in the past.
+        * Clamp expires >30d at 30d, unless they're >=1e9 in which
+        * case they are likely to really be absolute (1e9 = 2011-09-09)
+        * @param int $expiry
+        * @return int
+        */
+       function fixExpiry( $expiry ) {
+               if ( $expiry > 2592000 && $expiry < 1000000000 ) {
+                       $expiry = 2592000;
+               }
+               return (int)$expiry;
+       }
+
+       /**
+        * Send a debug message to the log
+        * @param string $text
+        */
+       protected function debugLog( $text ) {
+               $this->logger->debug( $text );
+       }
+
+       public function modifySimpleRelayEvent( array $event ) {
+               if ( array_key_exists( 'val', $event ) ) {
+                       $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
+               }
+
+               return $event;
+       }
+}
diff --git a/includes/libs/objectcache/MemcachedClient.php b/includes/libs/objectcache/MemcachedClient.php
new file mode 100644 (file)
index 0000000..5010b89
--- /dev/null
@@ -0,0 +1,1276 @@
+<?php
+// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
+/**
+ * Memcached client for PHP.
+ *
+ * +---------------------------------------------------------------------------+
+ * | memcached client, PHP                                                     |
+ * +---------------------------------------------------------------------------+
+ * | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net>                 |
+ * | All rights reserved.                                                      |
+ * |                                                                           |
+ * | Redistribution and use in source and binary forms, with or without        |
+ * | modification, are permitted provided that the following conditions        |
+ * | are met:                                                                  |
+ * |                                                                           |
+ * | 1. Redistributions of source code must retain the above copyright         |
+ * |    notice, this list of conditions and the following disclaimer.          |
+ * | 2. 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 BY THE AUTHOR ``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 THE AUTHOR 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.         |
+ * +---------------------------------------------------------------------------+
+ * | Author: Ryan T. Dean <rtdean@cytherianage.net>                            |
+ * | Heavily influenced by the Perl memcached client by Brad Fitzpatrick.      |
+ * |   Permission granted by Brad Fitzpatrick for relicense of ported Perl     |
+ * |   client logic under 2-clause BSD license.                                |
+ * +---------------------------------------------------------------------------+
+ *
+ * @file
+ * $TCAnet$
+ */
+
+/**
+ * This is the PHP client for memcached - a distributed memory cache daemon.
+ * More information is available at http://www.danga.com/memcached/
+ *
+ * Usage example:
+ *
+ * require_once 'memcached.php';
+ *
+ * $mc = new MWMemcached(array(
+ *              'servers' => array('127.0.0.1:10000',
+ *                                 array('192.0.0.1:10010', 2),
+ *                                 '127.0.0.1:10020'),
+ *              'debug'   => false,
+ *              'compress_threshold' => 10240,
+ *              'persistent' => true));
+ *
+ * $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
+ */
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+// {{{ requirements
+// }}}
+
+// {{{ class MWMemcached
+/**
+ * memcached client class implemented using (p)fsockopen()
+ *
+ * @author  Ryan T. Dean <rtdean@cytherianage.net>
+ * @ingroup Cache
+ */
+class MWMemcached {
+       // {{{ properties
+       // {{{ public
+
+       // {{{ constants
+       // {{{ flags
+
+       /**
+        * Flag: indicates data is serialized
+        */
+       const SERIALIZED = 1;
+
+       /**
+        * Flag: indicates data is compressed
+        */
+       const COMPRESSED = 2;
+
+       /**
+        * Flag: indicates data is an integer
+        */
+       const INTVAL = 4;
+
+       // }}}
+
+       /**
+        * Minimum savings to store data compressed
+        */
+       const COMPRESSION_SAVINGS = 0.20;
+
+       // }}}
+
+       /**
+        * Command statistics
+        *
+        * @var array
+        * @access public
+        */
+       public $stats;
+
+       // }}}
+       // {{{ private
+
+       /**
+        * Cached Sockets that are connected
+        *
+        * @var array
+        * @access private
+        */
+       public $_cache_sock;
+
+       /**
+        * Current debug status; 0 - none to 9 - profiling
+        *
+        * @var bool
+        * @access private
+        */
+       public $_debug;
+
+       /**
+        * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
+        *
+        * @var array
+        * @access private
+        */
+       public $_host_dead;
+
+       /**
+        * Is compression available?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_have_zlib;
+
+       /**
+        * Do we want to use compression?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_compress_enable;
+
+       /**
+        * At how many bytes should we compress?
+        *
+        * @var int
+        * @access private
+        */
+       public $_compress_threshold;
+
+       /**
+        * Are we using persistent links?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_persistent;
+
+       /**
+        * If only using one server; contains ip:port to connect to
+        *
+        * @var string
+        * @access private
+        */
+       public $_single_sock;
+
+       /**
+        * Array containing ip:port or array(ip:port, weight)
+        *
+        * @var array
+        * @access private
+        */
+       public $_servers;
+
+       /**
+        * Our bit buckets
+        *
+        * @var array
+        * @access private
+        */
+       public $_buckets;
+
+       /**
+        * Total # of bit buckets we have
+        *
+        * @var int
+        * @access private
+        */
+       public $_bucketcount;
+
+       /**
+        * # of total servers we have
+        *
+        * @var int
+        * @access private
+        */
+       public $_active;
+
+       /**
+        * Stream timeout in seconds. Applies for example to fread()
+        *
+        * @var int
+        * @access private
+        */
+       public $_timeout_seconds;
+
+       /**
+        * Stream timeout in microseconds
+        *
+        * @var int
+        * @access private
+        */
+       public $_timeout_microseconds;
+
+       /**
+        * Connect timeout in seconds
+        */
+       public $_connect_timeout;
+
+       /**
+        * Number of connection attempts for each server
+        */
+       public $_connect_attempts;
+
+       /**
+        * @var LoggerInterface
+        */
+       private $_logger;
+
+       // }}}
+       // }}}
+       // {{{ methods
+       // {{{ public functions
+       // {{{ memcached()
+
+       /**
+        * Memcache initializer
+        *
+        * @param array $args Associative array of settings
+        *
+        * @return mixed
+        */
+       public function __construct( $args ) {
+               $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
+               $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
+               $this->stats = array();
+               $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
+               $this->_persistent = isset( $args['persistent'] ) ? $args['persistent'] : false;
+               $this->_compress_enable = true;
+               $this->_have_zlib = function_exists( 'gzcompress' );
+
+               $this->_cache_sock = array();
+               $this->_host_dead = array();
+
+               $this->_timeout_seconds = 0;
+               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
+
+               $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
+               $this->_connect_attempts = 2;
+
+               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
+       }
+
+       // }}}
+       // {{{ add()
+
+       /**
+        * Adds a key/value to the memcache server if one isn't already set with
+        * that key
+        *
+        * @param string $key Key to set with data
+        * @param mixed $val Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of expiration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool
+        */
+       public function add( $key, $val, $exp = 0 ) {
+               return $this->_set( 'add', $key, $val, $exp );
+       }
+
+       // }}}
+       // {{{ decr()
+
+       /**
+        * Decrease a value stored on the memcache server
+        *
+        * @param string $key Key to decrease
+        * @param int $amt (optional) amount to decrease
+        *
+        * @return mixed False on failure, value on success
+        */
+       public function decr( $key, $amt = 1 ) {
+               return $this->_incrdecr( 'decr', $key, $amt );
+       }
+
+       // }}}
+       // {{{ delete()
+
+       /**
+        * Deletes a key from the server, optionally after $time
+        *
+        * @param string $key Key to delete
+        * @param int $time (optional) how long to wait before deleting
+        *
+        * @return bool True on success, false on failure
+        */
+       public function delete( $key, $time = 0 ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+
+               if ( isset( $this->stats['delete'] ) ) {
+                       $this->stats['delete']++;
+               } else {
+                       $this->stats['delete'] = 1;
+               }
+               $cmd = "delete $key $time\r\n";
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return false;
+               }
+               $res = $this->_fgets( $sock );
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
+               }
+
+               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
+                       return true;
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string $key
+        * @param int $timeout
+        * @return bool
+        */
+       public function lock( $key, $timeout = 0 ) {
+               /* stub */
+               return true;
+       }
+
+       /**
+        * @param string $key
+        * @return bool
+        */
+       public function unlock( $key ) {
+               /* stub */
+               return true;
+       }
+
+       // }}}
+       // {{{ disconnect_all()
+
+       /**
+        * Disconnects all connected sockets
+        */
+       public function disconnect_all() {
+               foreach ( $this->_cache_sock as $sock ) {
+                       fclose( $sock );
+               }
+
+               $this->_cache_sock = array();
+       }
+
+       // }}}
+       // {{{ enable_compress()
+
+       /**
+        * Enable / Disable compression
+        *
+        * @param bool $enable True to enable, false to disable
+        */
+       public function enable_compress( $enable ) {
+               $this->_compress_enable = $enable;
+       }
+
+       // }}}
+       // {{{ forget_dead_hosts()
+
+       /**
+        * Forget about all of the dead hosts
+        */
+       public function forget_dead_hosts() {
+               $this->_host_dead = array();
+       }
+
+       // }}}
+       // {{{ get()
+
+       /**
+        * Retrieves the value associated with the key from the memcache server
+        *
+        * @param array|string $key key to retrieve
+        * @param float $casToken [optional]
+        *
+        * @return mixed
+        */
+       public function get( $key, &$casToken = null ) {
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( "get($key)\n" );
+               }
+
+               if ( !is_array( $key ) && strval( $key ) === '' ) {
+                       $this->_debugprint( "Skipping key which equals to an empty string" );
+                       return false;
+               }
+
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+               if ( isset( $this->stats['get'] ) ) {
+                       $this->stats['get']++;
+               } else {
+                       $this->stats['get'] = 1;
+               }
+
+               $cmd = "gets $key\r\n";
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return false;
+               }
+
+               $val = array();
+               $this->_load_items( $sock, $val, $casToken );
+
+               if ( $this->_debug ) {
+                       foreach ( $val as $k => $v ) {
+                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
+                       }
+               }
+
+               $value = false;
+               if ( isset( $val[$key] ) ) {
+                       $value = $val[$key];
+               }
+               return $value;
+       }
+
+       // }}}
+       // {{{ get_multi()
+
+       /**
+        * Get multiple keys from the server(s)
+        *
+        * @param array $keys Keys to retrieve
+        *
+        * @return array
+        */
+       public function get_multi( $keys ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               if ( isset( $this->stats['get_multi'] ) ) {
+                       $this->stats['get_multi']++;
+               } else {
+                       $this->stats['get_multi'] = 1;
+               }
+               $sock_keys = array();
+               $socks = array();
+               foreach ( $keys as $key ) {
+                       $sock = $this->get_sock( $key );
+                       if ( !is_resource( $sock ) ) {
+                               continue;
+                       }
+                       $key = is_array( $key ) ? $key[1] : $key;
+                       if ( !isset( $sock_keys[$sock] ) ) {
+                               $sock_keys[intval( $sock )] = array();
+                               $socks[] = $sock;
+                       }
+                       $sock_keys[intval( $sock )][] = $key;
+               }
+
+               $gather = array();
+               // Send out the requests
+               foreach ( $socks as $sock ) {
+                       $cmd = 'gets';
+                       foreach ( $sock_keys[intval( $sock )] as $key ) {
+                               $cmd .= ' ' . $key;
+                       }
+                       $cmd .= "\r\n";
+
+                       if ( $this->_fwrite( $sock, $cmd ) ) {
+                               $gather[] = $sock;
+                       }
+               }
+
+               // Parse responses
+               $val = array();
+               foreach ( $gather as $sock ) {
+                       $this->_load_items( $sock, $val, $casToken );
+               }
+
+               if ( $this->_debug ) {
+                       foreach ( $val as $k => $v ) {
+                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
+                       }
+               }
+
+               return $val;
+       }
+
+       // }}}
+       // {{{ incr()
+
+       /**
+        * Increments $key (optionally) by $amt
+        *
+        * @param string $key Key to increment
+        * @param int $amt (optional) amount to increment
+        *
+        * @return int|null Null if the key does not exist yet (this does NOT
+        * create new mappings if the key does not exist). If the key does
+        * exist, this returns the new value for that key.
+        */
+       public function incr( $key, $amt = 1 ) {
+               return $this->_incrdecr( 'incr', $key, $amt );
+       }
+
+       // }}}
+       // {{{ replace()
+
+       /**
+        * Overwrites an existing value for key; only works if key is already set
+        *
+        * @param string $key Key to set value as
+        * @param mixed $value Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool
+        */
+       public function replace( $key, $value, $exp = 0 ) {
+               return $this->_set( 'replace', $key, $value, $exp );
+       }
+
+       // }}}
+       // {{{ run_command()
+
+       /**
+        * Passes through $cmd to the memcache server connected by $sock; returns
+        * output as an array (null array if no output)
+        *
+        * @param Resource $sock Socket to send command on
+        * @param string $cmd Command to run
+        *
+        * @return array Output array
+        */
+       public function run_command( $sock, $cmd ) {
+               if ( !is_resource( $sock ) ) {
+                       return array();
+               }
+
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return array();
+               }
+
+               $ret = array();
+               while ( true ) {
+                       $res = $this->_fgets( $sock );
+                       $ret[] = $res;
+                       if ( preg_match( '/^END/', $res ) ) {
+                               break;
+                       }
+                       if ( strlen( $res ) == 0 ) {
+                               break;
+                       }
+               }
+               return $ret;
+       }
+
+       // }}}
+       // {{{ set()
+
+       /**
+        * Unconditionally sets a key to a given value in the memcache.  Returns true
+        * if set successfully.
+        *
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool True on success
+        */
+       public function set( $key, $value, $exp = 0 ) {
+               return $this->_set( 'set', $key, $value, $exp );
+       }
+
+       // }}}
+       // {{{ cas()
+
+       /**
+        * Sets a key to a given value in the memcache if the current value still corresponds
+        * to a known, given value.  Returns true if set successfully.
+        *
+        * @param float $casToken Current known value
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool True on success
+        */
+       public function cas( $casToken, $key, $value, $exp = 0 ) {
+               return $this->_set( 'cas', $key, $value, $exp, $casToken );
+       }
+
+       // }}}
+       // {{{ set_compress_threshold()
+
+       /**
+        * Sets the compression threshold
+        *
+        * @param int $thresh Threshold to compress if larger than
+        */
+       public function set_compress_threshold( $thresh ) {
+               $this->_compress_threshold = $thresh;
+       }
+
+       // }}}
+       // {{{ set_debug()
+
+       /**
+        * Sets the debug flag
+        *
+        * @param bool $dbg True for debugging, false otherwise
+        *
+        * @see MWMemcached::__construct
+        */
+       public function set_debug( $dbg ) {
+               $this->_debug = $dbg;
+       }
+
+       // }}}
+       // {{{ set_servers()
+
+       /**
+        * Sets the server list to distribute key gets and puts between
+        *
+        * @param array $list Array of servers to connect to
+        *
+        * @see MWMemcached::__construct()
+        */
+       public function set_servers( $list ) {
+               $this->_servers = $list;
+               $this->_active = count( $list );
+               $this->_buckets = null;
+               $this->_bucketcount = 0;
+
+               $this->_single_sock = null;
+               if ( $this->_active == 1 ) {
+                       $this->_single_sock = $this->_servers[0];
+               }
+       }
+
+       /**
+        * Sets the timeout for new connections
+        *
+        * @param int $seconds Number of seconds
+        * @param int $microseconds Number of microseconds
+        */
+       public function set_timeout( $seconds, $microseconds ) {
+               $this->_timeout_seconds = $seconds;
+               $this->_timeout_microseconds = $microseconds;
+       }
+
+       // }}}
+       // }}}
+       // {{{ private methods
+       // {{{ _close_sock()
+
+       /**
+        * Close the specified socket
+        *
+        * @param string $sock Socket to close
+        *
+        * @access private
+        */
+       function _close_sock( $sock ) {
+               $host = array_search( $sock, $this->_cache_sock );
+               fclose( $this->_cache_sock[$host] );
+               unset( $this->_cache_sock[$host] );
+       }
+
+       // }}}
+       // {{{ _connect_sock()
+
+       /**
+        * Connects $sock to $host, timing out after $timeout
+        *
+        * @param int $sock Socket to connect
+        * @param string $host Host:IP to connect to
+        *
+        * @return bool
+        * @access private
+        */
+       function _connect_sock( &$sock, $host ) {
+               list( $ip, $port ) = preg_split( '/:(?=\d)/', $host );
+               $sock = false;
+               $timeout = $this->_connect_timeout;
+               $errno = $errstr = null;
+               for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
+                       MediaWiki\suppressWarnings();
+                       if ( $this->_persistent == 1 ) {
+                               $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
+                       } else {
+                               $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
+                       }
+                       MediaWiki\restoreWarnings();
+               }
+               if ( !$sock ) {
+                       $this->_error_log( "Error connecting to $host: $errstr\n" );
+                       $this->_dead_host( $host );
+                       return false;
+               }
+
+               // Initialise timeout
+               stream_set_timeout( $sock, $this->_timeout_seconds, $this->_timeout_microseconds );
+
+               // If the connection was persistent, flush the read buffer in case there
+               // was a previous incomplete request on this connection
+               if ( $this->_persistent ) {
+                       $this->_flush_read_buffer( $sock );
+               }
+               return true;
+       }
+
+       // }}}
+       // {{{ _dead_sock()
+
+       /**
+        * Marks a host as dead until 30-40 seconds in the future
+        *
+        * @param string $sock Socket to mark as dead
+        *
+        * @access private
+        */
+       function _dead_sock( $sock ) {
+               $host = array_search( $sock, $this->_cache_sock );
+               $this->_dead_host( $host );
+       }
+
+       /**
+        * @param string $host
+        */
+       function _dead_host( $host ) {
+               $parts = explode( ':', $host );
+               $ip = $parts[0];
+               $this->_host_dead[$ip] = time() + 30 + intval( rand( 0, 10 ) );
+               $this->_host_dead[$host] = $this->_host_dead[$ip];
+               unset( $this->_cache_sock[$host] );
+       }
+
+       // }}}
+       // {{{ get_sock()
+
+       /**
+        * get_sock
+        *
+        * @param string $key Key to retrieve value for;
+        *
+        * @return Resource|bool Resource on success, false on failure
+        * @access private
+        */
+       function get_sock( $key ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               if ( $this->_single_sock !== null ) {
+                       return $this->sock_to_host( $this->_single_sock );
+               }
+
+               $hv = is_array( $key ) ? intval( $key[0] ) : $this->_hashfunc( $key );
+               if ( $this->_buckets === null ) {
+                       $bu = array();
+                       foreach ( $this->_servers as $v ) {
+                               if ( is_array( $v ) ) {
+                                       for ( $i = 0; $i < $v[1]; $i++ ) {
+                                               $bu[] = $v[0];
+                                       }
+                               } else {
+                                       $bu[] = $v;
+                               }
+                       }
+                       $this->_buckets = $bu;
+                       $this->_bucketcount = count( $bu );
+               }
+
+               $realkey = is_array( $key ) ? $key[1] : $key;
+               for ( $tries = 0; $tries < 20; $tries++ ) {
+                       $host = $this->_buckets[$hv % $this->_bucketcount];
+                       $sock = $this->sock_to_host( $host );
+                       if ( is_resource( $sock ) ) {
+                               return $sock;
+                       }
+                       $hv = $this->_hashfunc( $hv . $realkey );
+               }
+
+               return false;
+       }
+
+       // }}}
+       // {{{ _hashfunc()
+
+       /**
+        * Creates a hash integer based on the $key
+        *
+        * @param string $key Key to hash
+        *
+        * @return int Hash value
+        * @access private
+        */
+       function _hashfunc( $key ) {
+               # Hash function must be in [0,0x7ffffff]
+               # We take the first 31 bits of the MD5 hash, which unlike the hash
+               # function used in a previous version of this client, works
+               return hexdec( substr( md5( $key ), 0, 8 ) ) & 0x7fffffff;
+       }
+
+       // }}}
+       // {{{ _incrdecr()
+
+       /**
+        * Perform increment/decriment on $key
+        *
+        * @param string $cmd Command to perform
+        * @param string|array $key Key to perform it on
+        * @param int $amt Amount to adjust
+        *
+        * @return int New value of $key
+        * @access private
+        */
+       function _incrdecr( $cmd, $key, $amt = 1 ) {
+               if ( !$this->_active ) {
+                       return null;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return null;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+               if ( isset( $this->stats[$cmd] ) ) {
+                       $this->stats[$cmd]++;
+               } else {
+                       $this->stats[$cmd] = 1;
+               }
+               if ( !$this->_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
+                       return null;
+               }
+
+               $line = $this->_fgets( $sock );
+               $match = array();
+               if ( !preg_match( '/^(\d+)/', $line, $match ) ) {
+                       return null;
+               }
+               return $match[1];
+       }
+
+       // }}}
+       // {{{ _load_items()
+
+       /**
+        * Load items into $ret from $sock
+        *
+        * @param Resource $sock Socket to read from
+        * @param array $ret returned values
+        * @param float $casToken [optional]
+        * @return bool True for success, false for failure
+        *
+        * @access private
+        */
+       function _load_items( $sock, &$ret, &$casToken = null ) {
+               $results = array();
+
+               while ( 1 ) {
+                       $decl = $this->_fgets( $sock );
+
+                       if ( $decl === false ) {
+                               /*
+                                * If nothing can be read, something is wrong because we know exactly when
+                                * to stop reading (right after "END") and we return right after that.
+                                */
+                               return false;
+                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
+                               /*
+                                * Read all data returned. This can be either one or multiple values.
+                                * Save all that data (in an array) to be processed later: we'll first
+                                * want to continue reading until "END" before doing anything else,
+                                * to make sure that we don't leave our client in a state where it's
+                                * output is not yet fully read.
+                                */
+                               $results[] = array(
+                                       $match[1], // rkey
+                                       $match[2], // flags
+                                       $match[3], // len
+                                       $match[4], // casToken
+                                       $this->_fread( $sock, $match[3] + 2 ), // data
+                               );
+                       } elseif ( $decl == "END" ) {
+                               if ( count( $results ) == 0 ) {
+                                       return false;
+                               }
+
+                               /**
+                                * All data has been read, time to process the data and build
+                                * meaningful return values.
+                                */
+                               foreach ( $results as $vars ) {
+                                       list( $rkey, $flags, $len, $casToken, $data ) = $vars;
+
+                                       if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
+                                               $this->_handle_error( $sock,
+                                                       'line ending missing from data block from $1' );
+                                               return false;
+                                       }
+                                       $data = substr( $data, 0, -2 );
+                                       $ret[$rkey] = $data;
+
+                                       if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
+                                               $ret[$rkey] = gzuncompress( $ret[$rkey] );
+                                       }
+
+                                       /*
+                                        * This unserialize is the exact reason that we only want to
+                                        * process data after having read until "END" (instead of doing
+                                        * this right away): "unserialize" can trigger outside code:
+                                        * in the event that $ret[$rkey] is a serialized object,
+                                        * unserializing it will trigger __wakeup() if present. If that
+                                        * function attempted to read from memcached (while we did not
+                                        * yet read "END"), these 2 calls would collide.
+                                        */
+                                       if ( $flags & self::SERIALIZED ) {
+                                               $ret[$rkey] = unserialize( $ret[$rkey] );
+                                       } elseif ( $flags & self::INTVAL ) {
+                                               $ret[$rkey] = intval( $ret[$rkey] );
+                                       }
+                               }
+
+                               return true;
+                       } else {
+                               $this->_handle_error( $sock, 'Error parsing response from $1' );
+                               return false;
+                       }
+               }
+       }
+
+       // }}}
+       // {{{ _set()
+
+       /**
+        * Performs the requested storage operation to the memcache server
+        *
+        * @param string $cmd Command to perform
+        * @param string $key Key to act on
+        * @param mixed $val What we need to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        * @param float $casToken [optional]
+        *
+        * @return bool
+        * @access private
+        */
+       function _set( $cmd, $key, $val, $exp, $casToken = null ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               if ( isset( $this->stats[$cmd] ) ) {
+                       $this->stats[$cmd]++;
+               } else {
+                       $this->stats[$cmd] = 1;
+               }
+
+               $flags = 0;
+
+               if ( is_int( $val ) ) {
+                       $flags |= self::INTVAL;
+               } elseif ( !is_scalar( $val ) ) {
+                       $val = serialize( $val );
+                       $flags |= self::SERIALIZED;
+                       if ( $this->_debug ) {
+                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
+                       }
+               }
+
+               $len = strlen( $val );
+
+               if ( $this->_have_zlib && $this->_compress_enable
+                       && $this->_compress_threshold && $len >= $this->_compress_threshold
+               ) {
+                       $c_val = gzcompress( $val, 9 );
+                       $c_len = strlen( $c_val );
+
+                       if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
+                               if ( $this->_debug ) {
+                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
+                               }
+                               $val = $c_val;
+                               $len = $c_len;
+                               $flags |= self::COMPRESSED;
+                       }
+               }
+
+               $command = "$cmd $key $flags $exp $len";
+               if ( $casToken ) {
+                       $command .= " $casToken";
+               }
+
+               if ( !$this->_fwrite( $sock, "$command\r\n$val\r\n" ) ) {
+                       return false;
+               }
+
+               $line = $this->_fgets( $sock );
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
+               }
+               if ( $line == "STORED" ) {
+                       return true;
+               }
+               return false;
+       }
+
+       // }}}
+       // {{{ sock_to_host()
+
+       /**
+        * Returns the socket for the host
+        *
+        * @param string $host Host:IP to get socket for
+        *
+        * @return Resource|bool IO Stream or false
+        * @access private
+        */
+       function sock_to_host( $host ) {
+               if ( isset( $this->_cache_sock[$host] ) ) {
+                       return $this->_cache_sock[$host];
+               }
+
+               $sock = null;
+               $now = time();
+               list( $ip, /* $port */) = explode( ':', $host );
+               if ( isset( $this->_host_dead[$host] ) && $this->_host_dead[$host] > $now ||
+                       isset( $this->_host_dead[$ip] ) && $this->_host_dead[$ip] > $now
+               ) {
+                       return null;
+               }
+
+               if ( !$this->_connect_sock( $sock, $host ) ) {
+                       return null;
+               }
+
+               // Do not buffer writes
+               stream_set_write_buffer( $sock, 0 );
+
+               $this->_cache_sock[$host] = $sock;
+
+               return $this->_cache_sock[$host];
+       }
+
+       /**
+        * @param string $text
+        */
+       function _debugprint( $text ) {
+               $this->_logger->debug( $text );
+       }
+
+       /**
+        * @param string $text
+        */
+       function _error_log( $text ) {
+               $this->_logger->error( "Memcached error: $text" );
+       }
+
+       /**
+        * Write to a stream. If there is an error, mark the socket dead.
+        *
+        * @param Resource $sock The socket
+        * @param string $buf The string to write
+        * @return bool True on success, false on failure
+        */
+       function _fwrite( $sock, $buf ) {
+               $bytesWritten = 0;
+               $bufSize = strlen( $buf );
+               while ( $bytesWritten < $bufSize ) {
+                       $result = fwrite( $sock, $buf );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout writing to $1' );
+                               return false;
+                       }
+                       // Contrary to the documentation, fwrite() returns zero on error in PHP 5.3.
+                       if ( $result === false || $result === 0 ) {
+                               $this->_handle_error( $sock, 'error writing to $1' );
+                               return false;
+                       }
+                       $bytesWritten += $result;
+               }
+
+               return true;
+       }
+
+       /**
+        * Handle an I/O error. Mark the socket dead and log an error.
+        *
+        * @param Resource $sock
+        * @param string $msg
+        */
+       function _handle_error( $sock, $msg ) {
+               $peer = stream_socket_get_name( $sock, true /** remote **/ );
+               if ( strval( $peer ) === '' ) {
+                       $peer = array_search( $sock, $this->_cache_sock );
+                       if ( $peer === false ) {
+                               $peer = '[unknown host]';
+                       }
+               }
+               $msg = str_replace( '$1', $peer, $msg );
+               $this->_error_log( "$msg\n" );
+               $this->_dead_sock( $sock );
+       }
+
+       /**
+        * Read the specified number of bytes from a stream. If there is an error,
+        * mark the socket dead.
+        *
+        * @param Resource $sock The socket
+        * @param int $len The number of bytes to read
+        * @return string|bool The string on success, false on failure.
+        */
+       function _fread( $sock, $len ) {
+               $buf = '';
+               while ( $len > 0 ) {
+                       $result = fread( $sock, $len );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout reading from $1' );
+                               return false;
+                       }
+                       if ( $result === false ) {
+                               $this->_handle_error( $sock, 'error reading buffer from $1' );
+                               return false;
+                       }
+                       if ( $result === '' ) {
+                               // This will happen if the remote end of the socket is shut down
+                               $this->_handle_error( $sock, 'unexpected end of file reading from $1' );
+                               return false;
+                       }
+                       $len -= strlen( $result );
+                       $buf .= $result;
+               }
+               return $buf;
+       }
+
+       /**
+        * Read a line from a stream. If there is an error, mark the socket dead.
+        * The \r\n line ending is stripped from the response.
+        *
+        * @param Resource $sock The socket
+        * @return string|bool The string on success, false on failure
+        */
+       function _fgets( $sock ) {
+               $result = fgets( $sock );
+               // fgets() may return a partial line if there is a select timeout after
+               // a successful recv(), so we have to check for a timeout even if we
+               // got a string response.
+               $data = stream_get_meta_data( $sock );
+               if ( $data['timed_out'] ) {
+                       $this->_handle_error( $sock, 'timeout reading line from $1' );
+                       return false;
+               }
+               if ( $result === false ) {
+                       $this->_handle_error( $sock, 'error reading line from $1' );
+                       return false;
+               }
+               if ( substr( $result, -2 ) === "\r\n" ) {
+                       $result = substr( $result, 0, -2 );
+               } elseif ( substr( $result, -1 ) === "\n" ) {
+                       $result = substr( $result, 0, -1 );
+               } else {
+                       $this->_handle_error( $sock, 'line ending missing in response from $1' );
+                       return false;
+               }
+               return $result;
+       }
+
+       /**
+        * Flush the read buffer of a stream
+        * @param Resource $f
+        */
+       function _flush_read_buffer( $f ) {
+               if ( !is_resource( $f ) ) {
+                       return;
+               }
+               $r = array( $f );
+               $w = null;
+               $e = null;
+               $n = stream_select( $r, $w, $e, 0, 0 );
+               while ( $n == 1 && !feof( $f ) ) {
+                       fread( $f, 1024 );
+                       $r = array( $f );
+                       $w = null;
+                       $e = null;
+                       $n = stream_select( $r, $w, $e, 0, 0 );
+               }
+       }
+
+       // }}}
+       // }}}
+       // }}}
+}
+
+// }}}
+
+class MemCachedClientforWiki extends MWMemcached {
+}
diff --git a/includes/libs/objectcache/MemcachedPhpBagOStuff.php b/includes/libs/objectcache/MemcachedPhpBagOStuff.php
new file mode 100644 (file)
index 0000000..1bb38fa
--- /dev/null
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Object caching using memcached.
+ *
+ * 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 Cache
+ */
+
+/**
+ * A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
+ *
+ * @ingroup Cache
+ */
+class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
+       /**
+        * Available parameters are:
+        *   - servers:             The list of IP:port combinations holding the memcached servers.
+        *   - debug:               Whether to set the debug flag in the underlying client.
+        *   - persistent:          Whether to use a persistent connection
+        *   - compress_threshold:  The minimum size an object must be before it is compressed
+        *   - timeout:             The read timeout in microseconds
+        *   - connect_timeout:     The connect timeout in seconds
+        *
+        * @param array $params
+        */
+       function __construct( $params ) {
+               parent::__construct( $params );
+               $params = $this->applyDefaultParams( $params );
+
+               $this->client = new MWMemcached( $params );
+               $this->client->set_servers( $params['servers'] );
+               $this->client->set_debug( $params['debug'] );
+       }
+
+       public function setDebug( $debug ) {
+               $this->client->set_debug( $debug );
+       }
+
+       public function getMulti( array $keys, $flags = 0 ) {
+               foreach ( $keys as $key ) {
+                       $this->validateKeyEncoding( $key );
+               }
+
+               return $this->client->get_multi( $keys );
+       }
+
+       public function incr( $key, $value = 1 ) {
+               $this->validateKeyEncoding( $key );
+
+               return $this->client->incr( $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               $this->validateKeyEncoding( $key );
+
+               return $this->client->decr( $key, $value );
+       }
+}
diff --git a/includes/libs/objectcache/MultiWriteBagOStuff.php b/includes/libs/objectcache/MultiWriteBagOStuff.php
new file mode 100644 (file)
index 0000000..73bdabd
--- /dev/null
@@ -0,0 +1,235 @@
+<?php
+/**
+ * Wrapper for object caching in different caches.
+ *
+ * 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 Cache
+ */
+
+/**
+ * A cache class that replicates all writes to multiple child caches. Reads
+ * are implemented by reading from the caches in the order they are given in
+ * the configuration until a cache gives a positive result.
+ *
+ * @ingroup Cache
+ */
+class MultiWriteBagOStuff extends BagOStuff {
+       /** @var BagOStuff[] */
+       protected $caches;
+       /** @var bool Use async secondary writes */
+       protected $asyncWrites = false;
+       /** @var callback|null */
+       protected $asyncHandler;
+
+       /** Idiom for "write to all backends" */
+       const ALL = INF;
+
+       const UPGRADE_TTL = 3600; // TTL when a key is copied to a higher cache tier
+
+       /**
+        * $params include:
+        *   - caches: A numbered array of either ObjectFactory::getObjectFromSpec
+        *      arrays yeilding BagOStuff objects or direct BagOStuff objects.
+        *      If using the former, the 'args' field *must* be set.
+        *      The first cache is the primary one, being the first to
+        *      be read in the fallback chain. Writes happen to all stores
+        *      in the order they are defined. However, lock()/unlock() calls
+        *      only use the primary store.
+        *   - replication: Either 'sync' or 'async'. This controls whether writes
+        *      to secondary stores are deferred when possible. Async writes
+        *      require setting 'asyncCallback'. HHVM register_postsend_function() function.
+        *      Async writes can increase the chance of some race conditions
+        *      or cause keys to expire seconds later than expected. It is
+        *      safe to use for modules when cached values: are immutable,
+        *      invalidation uses logical TTLs, invalidation uses etag/timestamp
+        *      validation against the DB, or merge() is used to handle races.
+        *   - asyncHandler: callable that takes a callback and runs it after the
+        *      current web request ends. In CLI mode, it should run it immediately.
+        * @param array $params
+        * @throws InvalidArgumentException
+        */
+       public function __construct( $params ) {
+               parent::__construct( $params );
+
+               if ( empty( $params['caches'] ) || !is_array( $params['caches'] ) ) {
+                       throw new InvalidArgumentException(
+                               __METHOD__ . ': "caches" parameter must be an array of caches'
+                       );
+               }
+
+               $this->caches = array();
+               foreach ( $params['caches'] as $cacheInfo ) {
+                       if ( $cacheInfo instanceof BagOStuff ) {
+                               $this->caches[] = $cacheInfo;
+                       } else {
+                               if ( !isset( $cacheInfo['args'] ) ) {
+                                       // B/C for when $cacheInfo was for ObjectCache::newFromParams().
+                                       // Callers intenting this to be for ObjectFactory::getObjectFromSpec
+                                       // should have set "args" per the docs above. Doings so avoids extra
+                                       // (likely harmless) params (factory/class/calls) ending up in "args".
+                                       $cacheInfo['args'] = array( $cacheInfo );
+                               }
+                               $this->caches[] = ObjectFactory::getObjectFromSpec( $cacheInfo );
+                       }
+               }
+
+               $this->asyncHandler = isset( $params['asyncHandler'] )
+                       ? $params['asyncHandler']
+                       : null;
+               $this->asyncWrites = (
+                       isset( $params['replication'] ) &&
+                       $params['replication'] === 'async' &&
+                       is_callable( $this->asyncHandler )
+               );
+       }
+
+       public function setDebug( $debug ) {
+               foreach ( $this->caches as $cache ) {
+                       $cache->setDebug( $debug );
+               }
+       }
+
+       protected function doGet( $key, $flags = 0 ) {
+               if ( ( $flags & self::READ_LATEST ) == self::READ_LATEST ) {
+                       // If the latest write was a delete(), we do NOT want to fallback
+                       // to the other tiers and possibly see the old value. Also, this
+                       // is used by mergeViaLock(), which only needs to hit the primary.
+                       return $this->caches[0]->get( $key, $flags );
+               }
+
+               $misses = 0; // number backends checked
+               $value = false;
+               foreach ( $this->caches as $cache ) {
+                       $value = $cache->get( $key, $flags );
+                       if ( $value !== false ) {
+                               break;
+                       }
+                       ++$misses;
+               }
+
+               if ( $value !== false
+                       && $misses > 0
+                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
+               ) {
+                       $this->doWrite( $misses, $this->asyncWrites, 'set', $key, $value, self::UPGRADE_TTL );
+               }
+
+               return $value;
+       }
+
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               $asyncWrites = ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC )
+                       ? false
+                       : $this->asyncWrites;
+
+               return $this->doWrite( self::ALL, $asyncWrites, 'set', $key, $value, $exptime );
+       }
+
+       public function delete( $key ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'delete', $key );
+       }
+
+       public function add( $key, $value, $exptime = 0 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'add', $key, $value, $exptime );
+       }
+
+       public function incr( $key, $value = 1 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'incr', $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'decr', $key, $value );
+       }
+
+       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
+               // Only need to lock the first cache; also avoids deadlocks
+               return $this->caches[0]->lock( $key, $timeout, $expiry, $rclass );
+       }
+
+       public function unlock( $key ) {
+               // Only the first cache is locked
+               return $this->caches[0]->unlock( $key );
+       }
+
+       public function getLastError() {
+               return $this->caches[0]->getLastError();
+       }
+
+       public function clearLastError() {
+               $this->caches[0]->clearLastError();
+       }
+
+       /**
+        * Apply a write method to the first $count backing caches
+        *
+        * @param integer $count
+        * @param bool $asyncWrites
+        * @param string $method
+        * @param mixed ...
+        * @return bool
+        */
+       protected function doWrite( $count, $asyncWrites, $method /*, ... */ ) {
+               $ret = true;
+               $args = array_slice( func_get_args(), 3 );
+
+               foreach ( $this->caches as $i => $cache ) {
+                       if ( $i >= $count ) {
+                               break; // ignore the lower tiers
+                       }
+
+                       if ( $i == 0 || !$asyncWrites ) {
+                               // First store or in sync mode: write now and get result
+                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
+                                       $ret = false;
+                               }
+                       } else {
+                               // Secondary write in async mode: do not block this HTTP request
+                               $logger = $this->logger;
+                               call_user_func(
+                                       $this->asyncHandler,
+                                       function () use ( $cache, $method, $args, $logger ) {
+                                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
+                                                       $logger->warning( "Async $method op failed" );
+                                               }
+                                       }
+                               );
+                       }
+               }
+
+               return $ret;
+       }
+
+       /**
+        * Delete objects expiring before a certain date.
+        *
+        * Succeed if any of the child caches succeed.
+        * @param string $date
+        * @param bool|callable $progressCallback
+        * @return bool
+        */
+       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
+               $ret = false;
+               foreach ( $this->caches as $cache ) {
+                       if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
+                               $ret = true;
+                       }
+               }
+
+               return $ret;
+       }
+}
index 9812047..40ac1bb 100644 (file)
@@ -39,9 +39,9 @@ class ReplicatedBagOStuff extends BagOStuff {
 
        /**
         * Constructor. Parameters are:
-        *   - writeFactory : ObjectFactory::getObjectFromSpec parameters yeilding BagOStuff.
+        *   - writeFactory : ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
         *                    This object will be used for writes (e.g. the master DB).
-        *   - readFactory  : ObjectFactory::getObjectFromSpec parameters yeilding BagOStuff.
+        *   - readFactory  : ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
         *                    This object will be used for reads (e.g. a slave DB).
         *
         * @param array $params
@@ -84,8 +84,8 @@ class ReplicatedBagOStuff extends BagOStuff {
                        : $this->readStore->getMulti( $keys, $flags );
        }
 
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->writeStore->set( $key, $value, $exptime );
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               return $this->writeStore->set( $key, $value, $exptime, $flags );
        }
 
        public function delete( $key ) {
@@ -112,8 +112,8 @@ class ReplicatedBagOStuff extends BagOStuff {
                return $this->writeStore->unlock( $key );
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               return $this->writeStore->merge( $key, $callback, $exptime, $attempts );
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               return $this->writeStore->merge( $key, $callback, $exptime, $attempts, $flags );
        }
 
        public function getLastError() {
index 71c8a93..7e3fa4f 100644 (file)
  * @author Aaron Schulz
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
  * Multi-datacenter aware caching interface
  *
@@ -60,7 +64,7 @@
  * @ingroup Cache
  * @since 1.26
  */
-class WANObjectCache {
+class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /** @var BagOStuff The local datacenter cache */
        protected $cache;
        /** @var HashBagOStuff Script instance PHP cache */
@@ -69,30 +73,28 @@ class WANObjectCache {
        protected $pool;
        /** @var EventRelayer Bus that handles purge broadcasts */
        protected $relayer;
+       /** @var LoggerInterface */
+       protected $logger;
 
        /** @var int ERR_* constant for the "last error" registry */
        protected $lastRelayError = self::ERR_NONE;
 
        /** Max time expected to pass between delete() and DB commit finishing */
        const MAX_COMMIT_DELAY = 3;
-       /** Max replication lag before applying TTL_LAGGED to set() */
-       const MAX_REPLICA_LAG = 5;
-       /** Max time since snapshot transaction start to avoid no-op of set() */
-       const MAX_SNAPSHOT_LAG = 5;
+       /** Max replication+snapshot lag before applying TTL_LAGGED or disallowing set() */
+       const MAX_READ_LAG = 7;
        /** Seconds to tombstone keys on delete() */
-       const HOLDOFF_TTL = 14; // MAX_COMMIT_DELAY + MAX_REPLICA_LAG + MAX_SNAPSHOT_LAG + 1
+       const HOLDOFF_TTL = 11; // MAX_COMMIT_DELAY + MAX_READ_LAG + 1
 
        /** Seconds to keep dependency purge keys around */
-       const CHECK_KEY_TTL = 31536000; // 1 year
+       const CHECK_KEY_TTL = self::TTL_YEAR;
        /** Seconds to keep lock keys around */
-       const LOCK_TTL = 5;
+       const LOCK_TTL = 10;
        /** Default remaining TTL at which to consider pre-emptive regeneration */
        const LOW_TTL = 30;
        /** Default time-since-expiry on a miss that makes a key "hot" */
        const LOCK_TSE = 1;
 
-       /** Idiom for set()/getWithSetCallback() TTL being "forever" */
-       const TTL_NONE = 0;
        /** Idiom for getWithSetCallback() callbacks to avoid calling set() */
        const TTL_UNCACHEABLE = -1;
        /** Idiom for getWithSetCallback() callbacks to 'lockTSE' logic */
@@ -100,6 +102,9 @@ class WANObjectCache {
        /** Max TTL to store keys when a data sourced is lagged */
        const TTL_LAGGED = 30;
 
+       /** Tiny negative float to use when CTL comes up >= 0 due to clock skew */
+       const TINY_NEGATIVE = -0.000001;
+
        /** Cache format version number */
        const VERSION = 1;
 
@@ -107,6 +112,10 @@ class WANObjectCache {
        const FLD_VALUE = 1;
        const FLD_TTL = 2;
        const FLD_TIME = 3;
+       const FLD_FLAGS = 4;
+
+       /** @var integer Treat this value as expired-on-arrival */
+       const FLG_STALE = 1;
 
        const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
@@ -120,17 +129,25 @@ class WANObjectCache {
 
        const PURGE_VAL_PREFIX = 'PURGED:';
 
+       const MAX_PC_KEYS = 1000; // max keys to keep in process cache
+
        /**
         * @param array $params
         *   - cache   : BagOStuff object
         *   - pool    : pool name
         *   - relayer : EventRelayer object
+        *   - logger  : LoggerInterface object
         */
        public function __construct( array $params ) {
                $this->cache = $params['cache'];
                $this->pool = $params['pool'];
                $this->relayer = $params['relayer'];
-               $this->procCache = new HashBagOStuff();
+               $this->procCache = new HashBagOStuff( array( 'maxKeys' => self::MAX_PC_KEYS ) );
+               $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
        }
 
        /**
@@ -149,11 +166,11 @@ class WANObjectCache {
        /**
         * Fetch the value of a key from cache
         *
-        * If passed in, $curTTL is set to the remaining TTL (current time left):
-        *   - a) INF; if the key exists, has no TTL, and is not expired by $checkKeys
-        *   - b) float (>=0); if the key exists, has a TTL, and is not expired by $checkKeys
-        *   - c) float (<0); if the key is tombstoned or existing but expired by $checkKeys
-        *   - d) null; if the key does not exist and is not tombstoned
+        * If supplied, $curTTL is set to the remaining TTL (current time left):
+        *   - a) INF; if $key exists, has no TTL, and is not expired by $checkKeys
+        *   - b) float (>=0); if $key exists, has a TTL, and is not expired by $checkKeys
+        *   - c) float (<0); if $key is tombstoned, stale, or existing but expired by $checkKeys
+        *   - d) null; if $key does not exist and is not tombstoned
         *
         * If a key is tombstoned, $curTTL will reflect the time since delete().
         *
@@ -283,13 +300,14 @@ class WANObjectCache {
         *     $setOpts = Database::getCacheSetOptions( $dbr );
         *     // Fetch the row from the DB
         *     $row = $dbr->selectRow( ... );
-        *     $key = wfMemcKey( 'building', $buildingId );
-        *     $cache->set( $key, $row, 86400, $setOpts );
+        *     $key = $cache->makeKey( 'building', $buildingId );
+        *     $cache->set( $key, $row, $cache::TTL_DAY, $setOpts );
         * @endcode
         *
         * @param string $key Cache key
         * @param mixed $value
-        * @param integer $ttl Seconds to live [0=forever]
+        * @param integer $ttl Seconds to live. Special values are:
+        *   - WANObjectCache::TTL_INDEFINITE: Cache forever
         * @param array $opts Options map:
         *   - lag     : Seconds of slave lag. Typically, this is either the slave lag
         *               before the data was read or, if applicable, the slave lag before
@@ -299,10 +317,13 @@ class WANObjectCache {
         *               the current time the data was read or (if applicable) the time when
         *               the snapshot-isolated transaction the data was read from started.
         *               Default: 0 seconds
-        *   - lockTSE : if excessive possible snapshot lag is detected,
-        *               then stash the value into a temporary location
-        *               with this TTL. This is only useful if the reads
-        *               use getWithSetCallback() with "lockTSE" set.
+        *   - pending : Whether this data is possibly from an uncommitted write transaction.
+        *               Generally, other threads should not see values from the future and
+        *               they certainly should not see ones that ended up getting rolled back.
+        *               Default: false
+        *   - lockTSE : if excessive replication/snapshot lag is detected, then store the value
+        *               with this TTL and flag it as stale. This is only useful if the reads for
+        *               this key use getWithSetCallback() with "lockTSE" set.
         *               Default: WANObjectCache::TSE_NONE
         * @return bool Success
         */
@@ -311,21 +332,39 @@ class WANObjectCache {
                $age = isset( $opts['since'] ) ? max( 0, microtime( true ) - $opts['since'] ) : 0;
                $lag = isset( $opts['lag'] ) ? $opts['lag'] : 0;
 
-               if ( $lag > self::MAX_REPLICA_LAG ) {
-                       // Too much lag detected; lower TTL so it converges faster
-                       $ttl = $ttl ? min( $ttl, self::TTL_LAGGED ) : self::TTL_LAGGED;
+               // Do not cache potentially uncommitted data as it might get rolled back
+               if ( !empty( $opts['pending'] ) ) {
+                       $this->logger->info( "Rejected set() for $key due to pending writes." );
+
+                       return true; // no-op the write for being unsafe
                }
 
-               if ( $age > self::MAX_SNAPSHOT_LAG ) {
+               $wrapExtra = array(); // additional wrapped value fields
+               // Check if there's a risk of writing stale data after the purge tombstone expired
+               if ( ( $lag + $age ) > self::MAX_READ_LAG ) {
+                       // Case A: read lag with "lockTSE"; save but record value as stale
                        if ( $lockTSE >= 0 ) {
-                               $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
-                               $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
-                       }
+                               $ttl = max( 1, (int)$lockTSE ); // set() expects seconds
+                               $wrapExtra[self::FLD_FLAGS] = self::FLG_STALE; // mark as stale
+                       // Case B: any long-running transaction; ignore this set()
+                       } elseif ( $age > self::MAX_READ_LAG ) {
+                               $this->logger->warning( "Rejected set() for $key due to snapshot lag." );
+
+                               return true; // no-op the write for being unsafe
+                       // Case C: high replication lag; lower TTL instead of ignoring all set()s
+                       } elseif ( $lag > self::MAX_READ_LAG ) {
+                               $ttl = $ttl ? min( $ttl, self::TTL_LAGGED ) : self::TTL_LAGGED;
+                               $this->logger->warning( "Lowered set() TTL for $key due to replication lag." );
+                       // Case D: medium length request with medium replication lag; ignore this set()
+                       } else {
+                               $this->logger->warning( "Rejected set() for $key due to high read lag." );
 
-                       return true; // no-op the write for being unsafe
+                               return true; // no-op the write for being unsafe
+                       }
                }
 
-               $wrapped = $this->wrap( $value, $ttl );
+               // Wrap that value with time/TTL/version metadata
+               $wrapped = $this->wrap( $value, $ttl ) + $wrapExtra;
 
                $func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
                        return ( is_string( $cWrapped ) )
@@ -372,7 +411,7 @@ class WANObjectCache {
         *     ... <execute some stuff> ...
         *     // Update the row in the DB
         *     $dbw->update( ... );
-        *     $key = wfMemcKey( 'homes', $homeId );
+        *     $key = $cache->makeKey( 'homes', $homeId );
         *     // Purge the corresponding cache entry just before committing
         *     $dbw->onTransactionPreCommitOrIdle( function() use ( $cache, $key ) {
         *         $cache->delete( $key );
@@ -381,13 +420,16 @@ class WANObjectCache {
         *     $dbw->commit(); // end of request
         * @endcode
         *
-        * If called twice on the same key, then the last hold-off TTL takes
-        * precedence. For idempotence, the $ttl should not vary for different
-        * delete() calls on the same key. Also note that lowering $ttl reduces
-        * the effective range of the 'lockTSE' parameter to getWithSetCallback().
+        * The $ttl parameter can be used when purging values that have not actually changed
+        * recently. For example, a cleanup script to purge cache entries does not really need
+        * a hold-off period, so it can use the value 1. Likewise for user-requested purge.
+        * Note that $ttl limits the effective range of 'lockTSE' for getWithSetCallback().
+        *
+        * If called twice on the same key, then the last hold-off TTL takes precedence. For
+        * idempotence, the $ttl should not vary for different delete() calls on the same key.
         *
         * @param string $key Cache key
-        * @param integer $ttl How long to block writes to the key [seconds]
+        * @param integer $ttl Tombstone TTL; Default: WANObjectCache::HOLDOFF_TTL
         * @return bool True if the item was purged or not found, false on failure
         */
        final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
@@ -536,9 +578,9 @@ class WANObjectCache {
         * @code
         *     $catInfo = $cache->getWithSetCallback(
         *         // Key to store the cached value under
-        *         wfMemcKey( 'cat-attributes', $catId ),
-        *         // Time-to-live (seconds)
-        *         60,
+        *         $cache->makeKey( 'cat-attributes', $catId ),
+        *         // Time-to-live (in seconds)
+        *         $cache::TTL_MINUTE,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
         *             $dbr = wfGetDB( DB_SLAVE );
@@ -554,9 +596,9 @@ class WANObjectCache {
         * @code
         *     $catConfig = $cache->getWithSetCallback(
         *         // Key to store the cached value under
-        *         wfMemcKey( 'site-cat-config' ),
-        *         // Time-to-live (seconds)
-        *         86400,
+        *         $cache->makeKey( 'site-cat-config' ),
+        *         // Time-to-live (in seconds)
+        *         $cache::TTL_DAY,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
         *             $dbr = wfGetDB( DB_SLAVE );
@@ -567,7 +609,7 @@ class WANObjectCache {
         *         },
         *         array(
         *             // Calling touchCheckKey() on this key invalidates the cache
-        *             'checkKeys' => array( wfMemcKey( 'site-cat-config' ) ),
+        *             'checkKeys' => array( $cache->makeKey( 'site-cat-config' ) ),
         *             // Try to only let one datacenter thread manage cache updates at a time
         *             'lockTSE' => 30
         *         )
@@ -578,9 +620,9 @@ class WANObjectCache {
         * @code
         *     $catState = $cache->getWithSetCallback(
         *         // Key to store the cached value under
-        *         wfMemcKey( 'cat-state', $cat->getId() ),
+        *         $cache->makeKey( 'cat-state', $cat->getId() ),
         *         // Time-to-live (seconds)
-        *         900,
+        *         $cache::TTL_HOUR,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
         *             // Determine new value from the DB
@@ -594,9 +636,9 @@ class WANObjectCache {
         *              // The "check" keys that represent things the value depends on;
         *              // Calling touchCheckKey() on any of them invalidates the cache
         *             'checkKeys' => array(
-        *                 wfMemcKey( 'sustenance-bowls', $cat->getRoomId() ),
-        *                 wfMemcKey( 'people-present', $cat->getHouseId() ),
-        *                 wfMemcKey( 'cat-laws', $cat->getCityId() ),
+        *                 $cache->makeKey( 'sustenance-bowls', $cat->getRoomId() ),
+        *                 $cache->makeKey( 'people-present', $cat->getHouseId() ),
+        *                 $cache->makeKey( 'cat-laws', $cat->getCityId() ),
         *             )
         *         )
         *     );
@@ -606,8 +648,8 @@ class WANObjectCache {
         * @code
         *     $lastCatActions = $cache->getWithSetCallback(
         *         // Key to store the cached value under
-        *         wfMemcKey( 'cat-last-actions', 100 ),
-        *         // Time-to-live (seconds)
+        *         $cache->makeKey( 'cat-last-actions', 100 ),
+        *         // Time-to-live (in seconds)
         *         10,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
@@ -633,7 +675,7 @@ class WANObjectCache {
         *
         * @param string $key Cache key
         * @param integer $ttl Seconds to live for key updates. Special values are:
-        *   - WANObjectCache::TTL_NONE : Cache forever
+        *   - WANObjectCache::TTL_INDEFINITE: Cache forever
         *   - WANObjectCache::TTL_UNCACHEABLE: Do not cache at all
         * @param callable $callback Value generation function
         * @param array $opts Options map:
@@ -656,26 +698,9 @@ class WANObjectCache {
         *      since the callback should use slave DBs and they may be lagged or have snapshot
         *      isolation anyway, this should not typically matter.
         *      Default: WANObjectCache::TTL_UNCACHEABLE.
-        * @param array $oldOpts Unused (mentioned only to avoid PHPDoc warnings)
         * @return mixed Value to use for the key
         */
-       final public function getWithSetCallback(
-               $key, $ttl, $callback, array $opts = array(), $oldOpts = array()
-       ) {
-               // Back-compat with 1.26: Swap $ttl and $callback
-               if ( is_int( $callback ) ) {
-                       $temp = $ttl;
-                       $ttl = $callback;
-                       $callback = $temp;
-               }
-               // Back-compat with 1.26: $checkKeys as separate parameter
-               if ( $oldOpts || ( is_array( $opts ) && isset( $opts[0] ) ) ) {
-                       $checkKeys = $opts;
-                       $opts = $oldOpts;
-               } else {
-                       $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : array();
-               }
-
+       final public function getWithSetCallback( $key, $ttl, $callback, array $opts = array() ) {
                $pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
 
                // Try the process cache if enabled
@@ -683,7 +708,7 @@ class WANObjectCache {
 
                if ( $value === false ) {
                        // Fetch the value over the network
-                       $value = $this->doGetWithSetCallback( $key, $ttl, $callback, $checkKeys, $opts );
+                       $value = $this->doGetWithSetCallback( $key, $ttl, $callback, $opts );
                        // Update the process cache if enabled
                        if ( $pcTTL >= 0 && $value !== false ) {
                                $this->procCache->set( $key, $value, $pcTTL );
@@ -701,15 +726,13 @@ class WANObjectCache {
         * @param string $key
         * @param integer $ttl
         * @param callback $callback
-        * @param array $checkKeys
         * @param array $opts
         * @return mixed
         */
-       protected function doGetWithSetCallback(
-               $key, $ttl, $callback, array $checkKeys, array $opts
-       ) {
+       protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts ) {
                $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
                $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
+               $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : array();
 
                // Get the current key value
                $curTTL = null;
@@ -778,6 +801,26 @@ class WANObjectCache {
                return $value;
        }
 
+       /**
+        * @see BagOStuff::makeKey()
+        * @param string ... Key component
+        * @return string
+        * @since 1.27
+        */
+       public function makeKey() {
+               return call_user_func_array( array( $this->cache, __FUNCTION__ ), func_get_args() );
+       }
+
+       /**
+        * @see BagOStuff::makeGlobalKey()
+        * @param string ... Key component
+        * @return string
+        * @since 1.27
+        */
+       public function makeGlobalKey() {
+               return call_user_func_array( array( $this->cache, __FUNCTION__ ), func_get_args() );
+       }
+
        /**
         * Get the "last error" registered; clearLastError() should be called manually
         * @return int ERR_* constant for the "last error" registry
@@ -888,7 +931,7 @@ class WANObjectCache {
         *
         * @param mixed $value
         * @param integer $ttl [0=forever]
-        * @return string
+        * @return array
         */
        protected function wrap( $value, $ttl ) {
                return array(
@@ -911,7 +954,7 @@ class WANObjectCache {
                $purgeTimestamp = self::parsePurgeValue( $wrapped );
                if ( is_float( $purgeTimestamp ) ) {
                        // Purged values should always have a negative current $ttl
-                       $curTTL = min( -0.000001, $purgeTimestamp - $now );
+                       $curTTL = min( $purgeTimestamp - $now, self::TINY_NEGATIVE );
                        return array( false, $curTTL );
                }
 
@@ -922,7 +965,12 @@ class WANObjectCache {
                        return array( false, null );
                }
 
-               if ( $wrapped[self::FLD_TTL] > 0 ) {
+               $flags = isset( $wrapped[self::FLD_FLAGS] ) ? $wrapped[self::FLD_FLAGS] : 0;
+               if ( ( $flags & self::FLG_STALE ) == self::FLG_STALE ) {
+                       // Treat as expired, with the cache time as the expiration
+                       $age = $now - $wrapped[self::FLD_TIME];
+                       $curTTL = min( -$age, self::TINY_NEGATIVE );
+               } elseif ( $wrapped[self::FLD_TTL] > 0 ) {
                        // Get the approximate time left on the key
                        $age = $now - $wrapped[self::FLD_TIME];
                        $curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
index 592565f..8b01610 100644 (file)
@@ -46,7 +46,7 @@ class WinCacheBagOStuff extends BagOStuff {
                return $val;
        }
 
-       public function set( $key, $value, $expire = 0 ) {
+       public function set( $key, $value, $expire = 0, $flags = 0 ) {
                $result = wincache_ucache_set( $key, serialize( $value ), $expire );
 
                /* wincache_ucache_set returns an empty array on success if $value
@@ -64,7 +64,7 @@ class WinCacheBagOStuff extends BagOStuff {
                return true;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !is_callable( $callback ) ) {
                        throw new Exception( "Got invalid callback." );
                }
index dc34f55..47c2906 100644 (file)
@@ -44,7 +44,7 @@ class XCacheBagOStuff extends BagOStuff {
                return $val;
        }
 
-       public function set( $key, $value, $expire = 0 ) {
+       public function set( $key, $value, $expire = 0, $flags = 0 ) {
                if ( !$this->isInteger( $value ) ) {
                        $value = serialize( $value );
                }
index 692e5a6..faf40b3 100644 (file)
@@ -161,6 +161,8 @@ class BitmapHandler extends TransformationalImageHandler {
                        ( $params['comment'] !== ''
                                ? array( '-set', 'comment', $this->escapeMagickProperty( $params['comment'] ) )
                                : array() ),
+                       // T108616: Avoid exposure of local file path
+                       array( '+set', 'Thumb::URI' ),
                        array( '-depth', 8 ),
                        $sharpen,
                        array( '-rotate', "-$rotation" ),
index b422bfa..5cc05f2 100644 (file)
@@ -289,7 +289,7 @@ class DjVuHandler extends ImageHandler {
         * @param bool $gettext DOCUMENT (Default: false)
         * @return bool|SimpleXMLElement
         */
-       function getMetaTree( $image, $gettext = false ) {
+       public function getMetaTree( $image, $gettext = false ) {
                if ( $gettext && isset( $image->djvuTextTree ) ) {
                        return $image->djvuTextTree;
                }
@@ -309,7 +309,7 @@ class DjVuHandler extends ImageHandler {
                        // Set to false rather than null to avoid further attempts
                        $image->dejaMetaTree = false;
                        $image->djvuTextTree = false;
-                       $tree = new SimpleXMLElement( $metadata );
+                       $tree = new SimpleXMLElement( $metadata, LIBXML_PARSEHUGE );
                        if ( $tree->getName() == 'mw-djvu' ) {
                                /** @var SimpleXMLElement $b */
                                foreach ( $tree->children() as $b ) {
@@ -375,56 +375,52 @@ class DjVuHandler extends ImageHandler {
                return !empty( $metadata ) && $metadata != serialize( array() );
        }
 
-       function pageCount( $image ) {
-               global $wgMemc;
+       function pageCount( File $image ) {
+               $info = $this->getDimensionInfo( $image );
 
-               $key = wfMemcKey( 'file-djvu', 'pageCount', $image->getSha1() );
+               return $info ? $info['pageCount'] : false;
+       }
 
-               $count = $wgMemc->get( $key );
-               if ( $count === false ) {
-                       $tree = $this->getMetaTree( $image );
-                       if ( !$tree ) {
-                               return false;
-                       }
-                       $count = count( $tree->xpath( '//OBJECT' ) );
-                       $wgMemc->set( $key, $count );
+       function getPageDimensions( File $image, $page ) {
+               $index = $page - 1; // MW starts pages at 1
+
+               $info = $this->getDimensionInfo( $image );
+               if ( $info && isset( $info['dimensionsByPage'][$index] ) ) {
+                       return $info['dimensionsByPage'][$index];
                }
 
-               return $count;
+               return false;
        }
 
-       function getPageDimensions( $image, $page ) {
-               global $wgMemc;
-
-               $key = wfMemcKey( 'file-djvu', 'dimensions', $image->getSha1() );
-
-               $dimsByPage = $wgMemc->get( $key );
-               if ( !is_array( $dimsByPage ) ) {
-                       $tree = $this->getMetaTree( $image );
-                       if ( !$tree ) {
-                               return false;
-                       }
+       protected function getDimensionInfo( File $file ) {
+               $that = $this;
 
-                       $dimsByPage = array();
-                       $count = count( $tree->xpath( '//OBJECT' ) );
-                       for ( $i = 0; $i < $count; ++$i ) {
-                               $o = $tree->BODY[0]->OBJECT[$i];
-                               if ( $o ) {
-                                       $dimsByPage[$i] = array(
-                                               'width' => (int)$o['width'],
-                                               'height' => (int)$o['height']
-                                       );
-                               } else {
-                                       $dimsByPage[$i] = false;
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       wfMemcKey( 'file-djvu', 'dimensions', $file->getSha1() ),
+                       WANObjectCache::TTL_INDEFINITE,
+                       function () use ( $that, $file ) {
+                               $tree = $that->getMetaTree( $file );
+                               if ( !$tree ) {
+                                       return false;
                                }
-                       }
-
-                       $wgMemc->set( $key, $dimsByPage );
-               }
 
-               $index = $page - 1; // MW starts pages at 1
+                               $dimsByPage = array();
+                               $count = count( $tree->xpath( '//OBJECT' ) );
+                               for ( $i = 0; $i < $count; ++$i ) {
+                                       $o = $tree->BODY[0]->OBJECT[$i];
+                                       if ( $o ) {
+                                               $dimsByPage[$i] = array(
+                                                       'width' => (int)$o['width'],
+                                                       'height' => (int)$o['height']
+                                               );
+                                       } else {
+                                               $dimsByPage[$i] = false;
+                                       }
+                               }
 
-               return isset( $dimsByPage[$index] ) ? $dimsByPage[$index] : false;
+                               return array( 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage );
+                       }
+               );
        }
 
        /**
@@ -432,7 +428,7 @@ class DjVuHandler extends ImageHandler {
         * @param int $page Page number to get information for
         * @return bool|string Page text or false when no text found.
         */
-       function getPageText( $image, $page ) {
+       function getPageText( File $image, $page ) {
                $tree = $this->getMetaTree( $image, true );
                if ( !$tree ) {
                        return false;
index a1cb01c..25f4806 100644 (file)
@@ -1,6 +1,4 @@
 <?php
-// @codingStandardsIgnoreFile
-// PHPCS can't handle the level of nesting in this file
 /**
  * Formatting of image metadata values into human readable form.
  *
@@ -1573,7 +1571,7 @@ class FormatMetadata extends ContextSource {
         * @since 1.23
         */
        public function fetchExtendedMetadata( File $file ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainWANInstance();
 
                // If revision deleted, exit immediately
                if ( $file->isDeleted( File::DELETED_FILE ) ) {
@@ -1587,7 +1585,7 @@ class FormatMetadata extends ContextSource {
                        $file->getSha1()
                );
 
-               $cachedValue = $wgMemc->get( $cacheKey );
+               $cachedValue = $cache->get( $cacheKey );
                if (
                        $cachedValue
                        && Hooks::run( 'ValidateExtendedMetadataCache', array( $cachedValue['timestamp'], $file ) )
@@ -1607,7 +1605,7 @@ class FormatMetadata extends ContextSource {
                        // computation on a cache hit.
                        $this->sanitizeArrayForAPI( $extendedMetadata );
                        $valueToCache = array( 'data' => $extendedMetadata, 'timestamp' => wfTimestampNow() );
-                       $wgMemc->set( $cacheKey, $valueToCache, $maxCacheTime );
+                       $cache->set( $cacheKey, $valueToCache, $maxCacheTime );
                }
 
                return $extendedMetadata;
index 015eb5a..bad1468 100644 (file)
@@ -373,7 +373,7 @@ abstract class MediaHandler {
         * @param File $file
         * @return bool
         */
-       function pageCount( $file ) {
+       function pageCount( File $file ) {
                return false;
        }
 
@@ -434,7 +434,7 @@ abstract class MediaHandler {
         * @param int $page What page to get dimensions of
         * @return array|bool
         */
-       function getPageDimensions( $image, $page ) {
+       function getPageDimensions( File $image, $page ) {
                $gis = $this->getImageSize( $image, $image->getLocalRefPath() );
                if ( $gis ) {
                        return array(
@@ -454,7 +454,7 @@ abstract class MediaHandler {
         * @return bool|string Page text or false when no text found or if
         *   unsupported.
         */
-       function getPageText( $image, $page ) {
+       function getPageText( File $image, $page ) {
                return false;
        }
 
index 15753a9..f72df19 100644 (file)
@@ -505,30 +505,31 @@ abstract class TransformationalImageHandler extends ImageHandler {
         * Retrieve the version of the installed ImageMagick
         * You can use PHPs version_compare() to use this value
         * Value is cached for one hour.
-        * @return string Representing the IM version.
+        * @return string|bool Representing the IM version; false on error
         */
        protected function getMagickVersion() {
-               global $wgMemc;
-
-               $cache = $wgMemc->get( "imagemagick-version" );
-               if ( !$cache ) {
-                       global $wgImageMagickConvertCommand;
-                       $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
-                       wfDebug( __METHOD__ . ": Running convert -version\n" );
-                       $retval = '';
-                       $return = wfShellExec( $cmd, $retval );
-                       $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
-                       if ( $x != 1 ) {
-                               wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
-
-                               return null;
+               $cache = ObjectCache::getLocalServerInstance( CACHE_NONE );
+               return $cache->getWithSetCallback(
+                       'imagemagick-version',
+                       $cache::TTL_HOUR,
+                       function () {
+                               global $wgImageMagickConvertCommand;
+
+                               $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
+                               wfDebug( __METHOD__ . ": Running convert -version\n" );
+                               $retval = '';
+                               $return = wfShellExec( $cmd, $retval );
+                               $x = preg_match(
+                                       '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches
+                               );
+                               if ( $x != 1 ) {
+                                       wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+                                       return false;
+                               }
+
+                               return $matches[1];
                        }
-                       $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
-
-                       return $matches[1];
-               }
-
-               return $cache;
+               );
        }
 
        /**
index 840b9d8..999be92 100644 (file)
@@ -76,7 +76,7 @@ application/x-bzip2   [ARCHIVE]
 application/x-tar      [ARCHIVE]
 application/x-stuffit  [ARCHIVE]
 application/x-opc+zip  [ARCHIVE]
-
+application/x-7z-compressed [ARCHIVE]
 
 text/javascript application/x-javascript application/x-ecmascript text/ecmascript      [EXECUTABLE]
 application/x-bash     [EXECUTABLE]
index 210610a..3b9899f 100644 (file)
@@ -20,6 +20,7 @@ application/vnd.wap.wbxml wbxml
 application/vnd.wap.wmlc wmlc
 application/vnd.wap.wmlscriptc wmlsc
 application/voicexml+xml vxml
+application/x-7z-compressed 7z
 application/x-bcpio bcpio
 application/x-bzip bz
 application/x-bzip2 bz2
diff --git a/includes/objectcache/MemcachedBagOStuff.php b/includes/objectcache/MemcachedBagOStuff.php
deleted file mode 100644 (file)
index 412f017..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-<?php
-/**
- * Base class for memcached clients.
- *
- * 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 Cache
- */
-
-/**
- * Base class for memcached clients.
- *
- * @ingroup Cache
- */
-class MemcachedBagOStuff extends BagOStuff {
-       protected $client;
-
-       /**
-        * Fill in the defaults for any parameters missing from $params, using the
-        * backwards-compatible global variables
-        * @param array $params
-        * @return array
-        */
-       protected function applyDefaultParams( $params ) {
-               if ( !isset( $params['servers'] ) ) {
-                       $params['servers'] = $GLOBALS['wgMemCachedServers'];
-               }
-               if ( !isset( $params['debug'] ) ) {
-                       $params['debug'] = $GLOBALS['wgMemCachedDebug'];
-               }
-               if ( !isset( $params['persistent'] ) ) {
-                       $params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
-               }
-               if ( !isset( $params['compress_threshold'] ) ) {
-                       $params['compress_threshold'] = 1500;
-               }
-               if ( !isset( $params['timeout'] ) ) {
-                       $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
-               }
-               if ( !isset( $params['connect_timeout'] ) ) {
-                       $params['connect_timeout'] = 0.5;
-               }
-               return $params;
-       }
-
-       protected function doGet( $key, $flags = 0 ) {
-               $casToken = null;
-
-               return $this->getWithToken( $key, $casToken, $flags );
-       }
-
-       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
-               return $this->client->get( $this->encodeKey( $key ), $casToken );
-       }
-
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->client->set( $this->encodeKey( $key ), $value,
-                       $this->fixExpiry( $exptime ) );
-       }
-
-       /**
-        * @param mixed $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
-               return $this->client->cas( $casToken, $this->encodeKey( $key ),
-                       $value, $this->fixExpiry( $exptime ) );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function delete( $key ) {
-               return $this->client->delete( $this->encodeKey( $key ) );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @param int $exptime (default 0)
-        * @return mixed
-        */
-       public function add( $key, $value, $exptime = 0 ) {
-               return $this->client->add( $this->encodeKey( $key ), $value,
-                       $this->fixExpiry( $exptime ) );
-       }
-
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               if ( !is_callable( $callback ) ) {
-                       throw new Exception( "Got invalid callback." );
-               }
-
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
-       }
-
-       /**
-        * Get the underlying client object. This is provided for debugging
-        * purposes.
-        * @return BagOStuff
-        */
-       public function getClient() {
-               return $this->client;
-       }
-
-       /**
-        * Encode a key for use on the wire inside the memcached protocol.
-        *
-        * We encode spaces and line breaks to avoid protocol errors. We encode
-        * the other control characters for compatibility with libmemcached
-        * verify_key. We leave other punctuation alone, to maximise backwards
-        * compatibility.
-        * @param string $key
-        * @return string
-        */
-       public function encodeKey( $key ) {
-               return preg_replace_callback( '/[\x00-\x20\x25\x7f]+/',
-                       array( $this, 'encodeKeyCallback' ), $key );
-       }
-
-       /**
-        * @param array $m
-        * @return string
-        */
-       protected function encodeKeyCallback( $m ) {
-               return rawurlencode( $m[0] );
-       }
-
-       /**
-        * TTLs higher than 30 days will be detected as absolute TTLs
-        * (UNIX timestamps), and will result in the cache entry being
-        * discarded immediately because the expiry is in the past.
-        * Clamp expires >30d at 30d, unless they're >=1e9 in which
-        * case they are likely to really be absolute (1e9 = 2011-09-09)
-        * @param int $expiry
-        * @return int
-        */
-       function fixExpiry( $expiry ) {
-               if ( $expiry > 2592000 && $expiry < 1000000000 ) {
-                       $expiry = 2592000;
-               }
-               return (int)$expiry;
-       }
-
-       /**
-        * Decode a key encoded with encodeKey(). This is provided as a convenience
-        * function for debugging.
-        *
-        * @param string $key
-        *
-        * @return string
-        */
-       public function decodeKey( $key ) {
-               // matches %00-%20, %25, %7F (=decoded alternatives for those encoded in encodeKey)
-               return preg_replace_callback( '/%([0-1][0-9]|20|25|7F)/i', function ( $match ) {
-                       return urldecode( $match[0] );
-               }, $key );
-       }
-
-       /**
-        * Send a debug message to the log
-        * @param string $text
-        */
-       protected function debugLog( $text ) {
-               $this->logger->debug( $text );
-       }
-
-       public function modifySimpleRelayEvent( array $event ) {
-               if ( array_key_exists( 'val', $event ) ) {
-                       $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
-               }
-
-               return $event;
-       }
-}
diff --git a/includes/objectcache/MemcachedClient.php b/includes/objectcache/MemcachedClient.php
deleted file mode 100644 (file)
index 5010b89..0000000
+++ /dev/null
@@ -1,1276 +0,0 @@
-<?php
-// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
-/**
- * Memcached client for PHP.
- *
- * +---------------------------------------------------------------------------+
- * | memcached client, PHP                                                     |
- * +---------------------------------------------------------------------------+
- * | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net>                 |
- * | All rights reserved.                                                      |
- * |                                                                           |
- * | Redistribution and use in source and binary forms, with or without        |
- * | modification, are permitted provided that the following conditions        |
- * | are met:                                                                  |
- * |                                                                           |
- * | 1. Redistributions of source code must retain the above copyright         |
- * |    notice, this list of conditions and the following disclaimer.          |
- * | 2. 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 BY THE AUTHOR ``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 THE AUTHOR 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.         |
- * +---------------------------------------------------------------------------+
- * | Author: Ryan T. Dean <rtdean@cytherianage.net>                            |
- * | Heavily influenced by the Perl memcached client by Brad Fitzpatrick.      |
- * |   Permission granted by Brad Fitzpatrick for relicense of ported Perl     |
- * |   client logic under 2-clause BSD license.                                |
- * +---------------------------------------------------------------------------+
- *
- * @file
- * $TCAnet$
- */
-
-/**
- * This is the PHP client for memcached - a distributed memory cache daemon.
- * More information is available at http://www.danga.com/memcached/
- *
- * Usage example:
- *
- * require_once 'memcached.php';
- *
- * $mc = new MWMemcached(array(
- *              'servers' => array('127.0.0.1:10000',
- *                                 array('192.0.0.1:10010', 2),
- *                                 '127.0.0.1:10020'),
- *              'debug'   => false,
- *              'compress_threshold' => 10240,
- *              'persistent' => true));
- *
- * $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
- */
-
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
-
-// {{{ requirements
-// }}}
-
-// {{{ class MWMemcached
-/**
- * memcached client class implemented using (p)fsockopen()
- *
- * @author  Ryan T. Dean <rtdean@cytherianage.net>
- * @ingroup Cache
- */
-class MWMemcached {
-       // {{{ properties
-       // {{{ public
-
-       // {{{ constants
-       // {{{ flags
-
-       /**
-        * Flag: indicates data is serialized
-        */
-       const SERIALIZED = 1;
-
-       /**
-        * Flag: indicates data is compressed
-        */
-       const COMPRESSED = 2;
-
-       /**
-        * Flag: indicates data is an integer
-        */
-       const INTVAL = 4;
-
-       // }}}
-
-       /**
-        * Minimum savings to store data compressed
-        */
-       const COMPRESSION_SAVINGS = 0.20;
-
-       // }}}
-
-       /**
-        * Command statistics
-        *
-        * @var array
-        * @access public
-        */
-       public $stats;
-
-       // }}}
-       // {{{ private
-
-       /**
-        * Cached Sockets that are connected
-        *
-        * @var array
-        * @access private
-        */
-       public $_cache_sock;
-
-       /**
-        * Current debug status; 0 - none to 9 - profiling
-        *
-        * @var bool
-        * @access private
-        */
-       public $_debug;
-
-       /**
-        * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
-        *
-        * @var array
-        * @access private
-        */
-       public $_host_dead;
-
-       /**
-        * Is compression available?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_have_zlib;
-
-       /**
-        * Do we want to use compression?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_compress_enable;
-
-       /**
-        * At how many bytes should we compress?
-        *
-        * @var int
-        * @access private
-        */
-       public $_compress_threshold;
-
-       /**
-        * Are we using persistent links?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_persistent;
-
-       /**
-        * If only using one server; contains ip:port to connect to
-        *
-        * @var string
-        * @access private
-        */
-       public $_single_sock;
-
-       /**
-        * Array containing ip:port or array(ip:port, weight)
-        *
-        * @var array
-        * @access private
-        */
-       public $_servers;
-
-       /**
-        * Our bit buckets
-        *
-        * @var array
-        * @access private
-        */
-       public $_buckets;
-
-       /**
-        * Total # of bit buckets we have
-        *
-        * @var int
-        * @access private
-        */
-       public $_bucketcount;
-
-       /**
-        * # of total servers we have
-        *
-        * @var int
-        * @access private
-        */
-       public $_active;
-
-       /**
-        * Stream timeout in seconds. Applies for example to fread()
-        *
-        * @var int
-        * @access private
-        */
-       public $_timeout_seconds;
-
-       /**
-        * Stream timeout in microseconds
-        *
-        * @var int
-        * @access private
-        */
-       public $_timeout_microseconds;
-
-       /**
-        * Connect timeout in seconds
-        */
-       public $_connect_timeout;
-
-       /**
-        * Number of connection attempts for each server
-        */
-       public $_connect_attempts;
-
-       /**
-        * @var LoggerInterface
-        */
-       private $_logger;
-
-       // }}}
-       // }}}
-       // {{{ methods
-       // {{{ public functions
-       // {{{ memcached()
-
-       /**
-        * Memcache initializer
-        *
-        * @param array $args Associative array of settings
-        *
-        * @return mixed
-        */
-       public function __construct( $args ) {
-               $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
-               $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
-               $this->stats = array();
-               $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
-               $this->_persistent = isset( $args['persistent'] ) ? $args['persistent'] : false;
-               $this->_compress_enable = true;
-               $this->_have_zlib = function_exists( 'gzcompress' );
-
-               $this->_cache_sock = array();
-               $this->_host_dead = array();
-
-               $this->_timeout_seconds = 0;
-               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
-
-               $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
-               $this->_connect_attempts = 2;
-
-               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
-       }
-
-       // }}}
-       // {{{ add()
-
-       /**
-        * Adds a key/value to the memcache server if one isn't already set with
-        * that key
-        *
-        * @param string $key Key to set with data
-        * @param mixed $val Value to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of expiration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool
-        */
-       public function add( $key, $val, $exp = 0 ) {
-               return $this->_set( 'add', $key, $val, $exp );
-       }
-
-       // }}}
-       // {{{ decr()
-
-       /**
-        * Decrease a value stored on the memcache server
-        *
-        * @param string $key Key to decrease
-        * @param int $amt (optional) amount to decrease
-        *
-        * @return mixed False on failure, value on success
-        */
-       public function decr( $key, $amt = 1 ) {
-               return $this->_incrdecr( 'decr', $key, $amt );
-       }
-
-       // }}}
-       // {{{ delete()
-
-       /**
-        * Deletes a key from the server, optionally after $time
-        *
-        * @param string $key Key to delete
-        * @param int $time (optional) how long to wait before deleting
-        *
-        * @return bool True on success, false on failure
-        */
-       public function delete( $key, $time = 0 ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-
-               if ( isset( $this->stats['delete'] ) ) {
-                       $this->stats['delete']++;
-               } else {
-                       $this->stats['delete'] = 1;
-               }
-               $cmd = "delete $key $time\r\n";
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return false;
-               }
-               $res = $this->_fgets( $sock );
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
-               }
-
-               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
-                       return true;
-               }
-
-               return false;
-       }
-
-       /**
-        * @param string $key
-        * @param int $timeout
-        * @return bool
-        */
-       public function lock( $key, $timeout = 0 ) {
-               /* stub */
-               return true;
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function unlock( $key ) {
-               /* stub */
-               return true;
-       }
-
-       // }}}
-       // {{{ disconnect_all()
-
-       /**
-        * Disconnects all connected sockets
-        */
-       public function disconnect_all() {
-               foreach ( $this->_cache_sock as $sock ) {
-                       fclose( $sock );
-               }
-
-               $this->_cache_sock = array();
-       }
-
-       // }}}
-       // {{{ enable_compress()
-
-       /**
-        * Enable / Disable compression
-        *
-        * @param bool $enable True to enable, false to disable
-        */
-       public function enable_compress( $enable ) {
-               $this->_compress_enable = $enable;
-       }
-
-       // }}}
-       // {{{ forget_dead_hosts()
-
-       /**
-        * Forget about all of the dead hosts
-        */
-       public function forget_dead_hosts() {
-               $this->_host_dead = array();
-       }
-
-       // }}}
-       // {{{ get()
-
-       /**
-        * Retrieves the value associated with the key from the memcache server
-        *
-        * @param array|string $key key to retrieve
-        * @param float $casToken [optional]
-        *
-        * @return mixed
-        */
-       public function get( $key, &$casToken = null ) {
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( "get($key)\n" );
-               }
-
-               if ( !is_array( $key ) && strval( $key ) === '' ) {
-                       $this->_debugprint( "Skipping key which equals to an empty string" );
-                       return false;
-               }
-
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-               if ( isset( $this->stats['get'] ) ) {
-                       $this->stats['get']++;
-               } else {
-                       $this->stats['get'] = 1;
-               }
-
-               $cmd = "gets $key\r\n";
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return false;
-               }
-
-               $val = array();
-               $this->_load_items( $sock, $val, $casToken );
-
-               if ( $this->_debug ) {
-                       foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
-                       }
-               }
-
-               $value = false;
-               if ( isset( $val[$key] ) ) {
-                       $value = $val[$key];
-               }
-               return $value;
-       }
-
-       // }}}
-       // {{{ get_multi()
-
-       /**
-        * Get multiple keys from the server(s)
-        *
-        * @param array $keys Keys to retrieve
-        *
-        * @return array
-        */
-       public function get_multi( $keys ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               if ( isset( $this->stats['get_multi'] ) ) {
-                       $this->stats['get_multi']++;
-               } else {
-                       $this->stats['get_multi'] = 1;
-               }
-               $sock_keys = array();
-               $socks = array();
-               foreach ( $keys as $key ) {
-                       $sock = $this->get_sock( $key );
-                       if ( !is_resource( $sock ) ) {
-                               continue;
-                       }
-                       $key = is_array( $key ) ? $key[1] : $key;
-                       if ( !isset( $sock_keys[$sock] ) ) {
-                               $sock_keys[intval( $sock )] = array();
-                               $socks[] = $sock;
-                       }
-                       $sock_keys[intval( $sock )][] = $key;
-               }
-
-               $gather = array();
-               // Send out the requests
-               foreach ( $socks as $sock ) {
-                       $cmd = 'gets';
-                       foreach ( $sock_keys[intval( $sock )] as $key ) {
-                               $cmd .= ' ' . $key;
-                       }
-                       $cmd .= "\r\n";
-
-                       if ( $this->_fwrite( $sock, $cmd ) ) {
-                               $gather[] = $sock;
-                       }
-               }
-
-               // Parse responses
-               $val = array();
-               foreach ( $gather as $sock ) {
-                       $this->_load_items( $sock, $val, $casToken );
-               }
-
-               if ( $this->_debug ) {
-                       foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
-                       }
-               }
-
-               return $val;
-       }
-
-       // }}}
-       // {{{ incr()
-
-       /**
-        * Increments $key (optionally) by $amt
-        *
-        * @param string $key Key to increment
-        * @param int $amt (optional) amount to increment
-        *
-        * @return int|null Null if the key does not exist yet (this does NOT
-        * create new mappings if the key does not exist). If the key does
-        * exist, this returns the new value for that key.
-        */
-       public function incr( $key, $amt = 1 ) {
-               return $this->_incrdecr( 'incr', $key, $amt );
-       }
-
-       // }}}
-       // {{{ replace()
-
-       /**
-        * Overwrites an existing value for key; only works if key is already set
-        *
-        * @param string $key Key to set value as
-        * @param mixed $value Value to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool
-        */
-       public function replace( $key, $value, $exp = 0 ) {
-               return $this->_set( 'replace', $key, $value, $exp );
-       }
-
-       // }}}
-       // {{{ run_command()
-
-       /**
-        * Passes through $cmd to the memcache server connected by $sock; returns
-        * output as an array (null array if no output)
-        *
-        * @param Resource $sock Socket to send command on
-        * @param string $cmd Command to run
-        *
-        * @return array Output array
-        */
-       public function run_command( $sock, $cmd ) {
-               if ( !is_resource( $sock ) ) {
-                       return array();
-               }
-
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return array();
-               }
-
-               $ret = array();
-               while ( true ) {
-                       $res = $this->_fgets( $sock );
-                       $ret[] = $res;
-                       if ( preg_match( '/^END/', $res ) ) {
-                               break;
-                       }
-                       if ( strlen( $res ) == 0 ) {
-                               break;
-                       }
-               }
-               return $ret;
-       }
-
-       // }}}
-       // {{{ set()
-
-       /**
-        * Unconditionally sets a key to a given value in the memcache.  Returns true
-        * if set successfully.
-        *
-        * @param string $key Key to set value as
-        * @param mixed $value Value to set
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool True on success
-        */
-       public function set( $key, $value, $exp = 0 ) {
-               return $this->_set( 'set', $key, $value, $exp );
-       }
-
-       // }}}
-       // {{{ cas()
-
-       /**
-        * Sets a key to a given value in the memcache if the current value still corresponds
-        * to a known, given value.  Returns true if set successfully.
-        *
-        * @param float $casToken Current known value
-        * @param string $key Key to set value as
-        * @param mixed $value Value to set
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool True on success
-        */
-       public function cas( $casToken, $key, $value, $exp = 0 ) {
-               return $this->_set( 'cas', $key, $value, $exp, $casToken );
-       }
-
-       // }}}
-       // {{{ set_compress_threshold()
-
-       /**
-        * Sets the compression threshold
-        *
-        * @param int $thresh Threshold to compress if larger than
-        */
-       public function set_compress_threshold( $thresh ) {
-               $this->_compress_threshold = $thresh;
-       }
-
-       // }}}
-       // {{{ set_debug()
-
-       /**
-        * Sets the debug flag
-        *
-        * @param bool $dbg True for debugging, false otherwise
-        *
-        * @see MWMemcached::__construct
-        */
-       public function set_debug( $dbg ) {
-               $this->_debug = $dbg;
-       }
-
-       // }}}
-       // {{{ set_servers()
-
-       /**
-        * Sets the server list to distribute key gets and puts between
-        *
-        * @param array $list Array of servers to connect to
-        *
-        * @see MWMemcached::__construct()
-        */
-       public function set_servers( $list ) {
-               $this->_servers = $list;
-               $this->_active = count( $list );
-               $this->_buckets = null;
-               $this->_bucketcount = 0;
-
-               $this->_single_sock = null;
-               if ( $this->_active == 1 ) {
-                       $this->_single_sock = $this->_servers[0];
-               }
-       }
-
-       /**
-        * Sets the timeout for new connections
-        *
-        * @param int $seconds Number of seconds
-        * @param int $microseconds Number of microseconds
-        */
-       public function set_timeout( $seconds, $microseconds ) {
-               $this->_timeout_seconds = $seconds;
-               $this->_timeout_microseconds = $microseconds;
-       }
-
-       // }}}
-       // }}}
-       // {{{ private methods
-       // {{{ _close_sock()
-
-       /**
-        * Close the specified socket
-        *
-        * @param string $sock Socket to close
-        *
-        * @access private
-        */
-       function _close_sock( $sock ) {
-               $host = array_search( $sock, $this->_cache_sock );
-               fclose( $this->_cache_sock[$host] );
-               unset( $this->_cache_sock[$host] );
-       }
-
-       // }}}
-       // {{{ _connect_sock()
-
-       /**
-        * Connects $sock to $host, timing out after $timeout
-        *
-        * @param int $sock Socket to connect
-        * @param string $host Host:IP to connect to
-        *
-        * @return bool
-        * @access private
-        */
-       function _connect_sock( &$sock, $host ) {
-               list( $ip, $port ) = preg_split( '/:(?=\d)/', $host );
-               $sock = false;
-               $timeout = $this->_connect_timeout;
-               $errno = $errstr = null;
-               for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
-                       MediaWiki\suppressWarnings();
-                       if ( $this->_persistent == 1 ) {
-                               $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
-                       } else {
-                               $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
-                       }
-                       MediaWiki\restoreWarnings();
-               }
-               if ( !$sock ) {
-                       $this->_error_log( "Error connecting to $host: $errstr\n" );
-                       $this->_dead_host( $host );
-                       return false;
-               }
-
-               // Initialise timeout
-               stream_set_timeout( $sock, $this->_timeout_seconds, $this->_timeout_microseconds );
-
-               // If the connection was persistent, flush the read buffer in case there
-               // was a previous incomplete request on this connection
-               if ( $this->_persistent ) {
-                       $this->_flush_read_buffer( $sock );
-               }
-               return true;
-       }
-
-       // }}}
-       // {{{ _dead_sock()
-
-       /**
-        * Marks a host as dead until 30-40 seconds in the future
-        *
-        * @param string $sock Socket to mark as dead
-        *
-        * @access private
-        */
-       function _dead_sock( $sock ) {
-               $host = array_search( $sock, $this->_cache_sock );
-               $this->_dead_host( $host );
-       }
-
-       /**
-        * @param string $host
-        */
-       function _dead_host( $host ) {
-               $parts = explode( ':', $host );
-               $ip = $parts[0];
-               $this->_host_dead[$ip] = time() + 30 + intval( rand( 0, 10 ) );
-               $this->_host_dead[$host] = $this->_host_dead[$ip];
-               unset( $this->_cache_sock[$host] );
-       }
-
-       // }}}
-       // {{{ get_sock()
-
-       /**
-        * get_sock
-        *
-        * @param string $key Key to retrieve value for;
-        *
-        * @return Resource|bool Resource on success, false on failure
-        * @access private
-        */
-       function get_sock( $key ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               if ( $this->_single_sock !== null ) {
-                       return $this->sock_to_host( $this->_single_sock );
-               }
-
-               $hv = is_array( $key ) ? intval( $key[0] ) : $this->_hashfunc( $key );
-               if ( $this->_buckets === null ) {
-                       $bu = array();
-                       foreach ( $this->_servers as $v ) {
-                               if ( is_array( $v ) ) {
-                                       for ( $i = 0; $i < $v[1]; $i++ ) {
-                                               $bu[] = $v[0];
-                                       }
-                               } else {
-                                       $bu[] = $v;
-                               }
-                       }
-                       $this->_buckets = $bu;
-                       $this->_bucketcount = count( $bu );
-               }
-
-               $realkey = is_array( $key ) ? $key[1] : $key;
-               for ( $tries = 0; $tries < 20; $tries++ ) {
-                       $host = $this->_buckets[$hv % $this->_bucketcount];
-                       $sock = $this->sock_to_host( $host );
-                       if ( is_resource( $sock ) ) {
-                               return $sock;
-                       }
-                       $hv = $this->_hashfunc( $hv . $realkey );
-               }
-
-               return false;
-       }
-
-       // }}}
-       // {{{ _hashfunc()
-
-       /**
-        * Creates a hash integer based on the $key
-        *
-        * @param string $key Key to hash
-        *
-        * @return int Hash value
-        * @access private
-        */
-       function _hashfunc( $key ) {
-               # Hash function must be in [0,0x7ffffff]
-               # We take the first 31 bits of the MD5 hash, which unlike the hash
-               # function used in a previous version of this client, works
-               return hexdec( substr( md5( $key ), 0, 8 ) ) & 0x7fffffff;
-       }
-
-       // }}}
-       // {{{ _incrdecr()
-
-       /**
-        * Perform increment/decriment on $key
-        *
-        * @param string $cmd Command to perform
-        * @param string|array $key Key to perform it on
-        * @param int $amt Amount to adjust
-        *
-        * @return int New value of $key
-        * @access private
-        */
-       function _incrdecr( $cmd, $key, $amt = 1 ) {
-               if ( !$this->_active ) {
-                       return null;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return null;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-               if ( isset( $this->stats[$cmd] ) ) {
-                       $this->stats[$cmd]++;
-               } else {
-                       $this->stats[$cmd] = 1;
-               }
-               if ( !$this->_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
-                       return null;
-               }
-
-               $line = $this->_fgets( $sock );
-               $match = array();
-               if ( !preg_match( '/^(\d+)/', $line, $match ) ) {
-                       return null;
-               }
-               return $match[1];
-       }
-
-       // }}}
-       // {{{ _load_items()
-
-       /**
-        * Load items into $ret from $sock
-        *
-        * @param Resource $sock Socket to read from
-        * @param array $ret returned values
-        * @param float $casToken [optional]
-        * @return bool True for success, false for failure
-        *
-        * @access private
-        */
-       function _load_items( $sock, &$ret, &$casToken = null ) {
-               $results = array();
-
-               while ( 1 ) {
-                       $decl = $this->_fgets( $sock );
-
-                       if ( $decl === false ) {
-                               /*
-                                * If nothing can be read, something is wrong because we know exactly when
-                                * to stop reading (right after "END") and we return right after that.
-                                */
-                               return false;
-                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
-                               /*
-                                * Read all data returned. This can be either one or multiple values.
-                                * Save all that data (in an array) to be processed later: we'll first
-                                * want to continue reading until "END" before doing anything else,
-                                * to make sure that we don't leave our client in a state where it's
-                                * output is not yet fully read.
-                                */
-                               $results[] = array(
-                                       $match[1], // rkey
-                                       $match[2], // flags
-                                       $match[3], // len
-                                       $match[4], // casToken
-                                       $this->_fread( $sock, $match[3] + 2 ), // data
-                               );
-                       } elseif ( $decl == "END" ) {
-                               if ( count( $results ) == 0 ) {
-                                       return false;
-                               }
-
-                               /**
-                                * All data has been read, time to process the data and build
-                                * meaningful return values.
-                                */
-                               foreach ( $results as $vars ) {
-                                       list( $rkey, $flags, $len, $casToken, $data ) = $vars;
-
-                                       if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
-                                               $this->_handle_error( $sock,
-                                                       'line ending missing from data block from $1' );
-                                               return false;
-                                       }
-                                       $data = substr( $data, 0, -2 );
-                                       $ret[$rkey] = $data;
-
-                                       if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
-                                               $ret[$rkey] = gzuncompress( $ret[$rkey] );
-                                       }
-
-                                       /*
-                                        * This unserialize is the exact reason that we only want to
-                                        * process data after having read until "END" (instead of doing
-                                        * this right away): "unserialize" can trigger outside code:
-                                        * in the event that $ret[$rkey] is a serialized object,
-                                        * unserializing it will trigger __wakeup() if present. If that
-                                        * function attempted to read from memcached (while we did not
-                                        * yet read "END"), these 2 calls would collide.
-                                        */
-                                       if ( $flags & self::SERIALIZED ) {
-                                               $ret[$rkey] = unserialize( $ret[$rkey] );
-                                       } elseif ( $flags & self::INTVAL ) {
-                                               $ret[$rkey] = intval( $ret[$rkey] );
-                                       }
-                               }
-
-                               return true;
-                       } else {
-                               $this->_handle_error( $sock, 'Error parsing response from $1' );
-                               return false;
-                       }
-               }
-       }
-
-       // }}}
-       // {{{ _set()
-
-       /**
-        * Performs the requested storage operation to the memcache server
-        *
-        * @param string $cmd Command to perform
-        * @param string $key Key to act on
-        * @param mixed $val What we need to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        * @param float $casToken [optional]
-        *
-        * @return bool
-        * @access private
-        */
-       function _set( $cmd, $key, $val, $exp, $casToken = null ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               if ( isset( $this->stats[$cmd] ) ) {
-                       $this->stats[$cmd]++;
-               } else {
-                       $this->stats[$cmd] = 1;
-               }
-
-               $flags = 0;
-
-               if ( is_int( $val ) ) {
-                       $flags |= self::INTVAL;
-               } elseif ( !is_scalar( $val ) ) {
-                       $val = serialize( $val );
-                       $flags |= self::SERIALIZED;
-                       if ( $this->_debug ) {
-                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
-                       }
-               }
-
-               $len = strlen( $val );
-
-               if ( $this->_have_zlib && $this->_compress_enable
-                       && $this->_compress_threshold && $len >= $this->_compress_threshold
-               ) {
-                       $c_val = gzcompress( $val, 9 );
-                       $c_len = strlen( $c_val );
-
-                       if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
-                               if ( $this->_debug ) {
-                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
-                               }
-                               $val = $c_val;
-                               $len = $c_len;
-                               $flags |= self::COMPRESSED;
-                       }
-               }
-
-               $command = "$cmd $key $flags $exp $len";
-               if ( $casToken ) {
-                       $command .= " $casToken";
-               }
-
-               if ( !$this->_fwrite( $sock, "$command\r\n$val\r\n" ) ) {
-                       return false;
-               }
-
-               $line = $this->_fgets( $sock );
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
-               }
-               if ( $line == "STORED" ) {
-                       return true;
-               }
-               return false;
-       }
-
-       // }}}
-       // {{{ sock_to_host()
-
-       /**
-        * Returns the socket for the host
-        *
-        * @param string $host Host:IP to get socket for
-        *
-        * @return Resource|bool IO Stream or false
-        * @access private
-        */
-       function sock_to_host( $host ) {
-               if ( isset( $this->_cache_sock[$host] ) ) {
-                       return $this->_cache_sock[$host];
-               }
-
-               $sock = null;
-               $now = time();
-               list( $ip, /* $port */) = explode( ':', $host );
-               if ( isset( $this->_host_dead[$host] ) && $this->_host_dead[$host] > $now ||
-                       isset( $this->_host_dead[$ip] ) && $this->_host_dead[$ip] > $now
-               ) {
-                       return null;
-               }
-
-               if ( !$this->_connect_sock( $sock, $host ) ) {
-                       return null;
-               }
-
-               // Do not buffer writes
-               stream_set_write_buffer( $sock, 0 );
-
-               $this->_cache_sock[$host] = $sock;
-
-               return $this->_cache_sock[$host];
-       }
-
-       /**
-        * @param string $text
-        */
-       function _debugprint( $text ) {
-               $this->_logger->debug( $text );
-       }
-
-       /**
-        * @param string $text
-        */
-       function _error_log( $text ) {
-               $this->_logger->error( "Memcached error: $text" );
-       }
-
-       /**
-        * Write to a stream. If there is an error, mark the socket dead.
-        *
-        * @param Resource $sock The socket
-        * @param string $buf The string to write
-        * @return bool True on success, false on failure
-        */
-       function _fwrite( $sock, $buf ) {
-               $bytesWritten = 0;
-               $bufSize = strlen( $buf );
-               while ( $bytesWritten < $bufSize ) {
-                       $result = fwrite( $sock, $buf );
-                       $data = stream_get_meta_data( $sock );
-                       if ( $data['timed_out'] ) {
-                               $this->_handle_error( $sock, 'timeout writing to $1' );
-                               return false;
-                       }
-                       // Contrary to the documentation, fwrite() returns zero on error in PHP 5.3.
-                       if ( $result === false || $result === 0 ) {
-                               $this->_handle_error( $sock, 'error writing to $1' );
-                               return false;
-                       }
-                       $bytesWritten += $result;
-               }
-
-               return true;
-       }
-
-       /**
-        * Handle an I/O error. Mark the socket dead and log an error.
-        *
-        * @param Resource $sock
-        * @param string $msg
-        */
-       function _handle_error( $sock, $msg ) {
-               $peer = stream_socket_get_name( $sock, true /** remote **/ );
-               if ( strval( $peer ) === '' ) {
-                       $peer = array_search( $sock, $this->_cache_sock );
-                       if ( $peer === false ) {
-                               $peer = '[unknown host]';
-                       }
-               }
-               $msg = str_replace( '$1', $peer, $msg );
-               $this->_error_log( "$msg\n" );
-               $this->_dead_sock( $sock );
-       }
-
-       /**
-        * Read the specified number of bytes from a stream. If there is an error,
-        * mark the socket dead.
-        *
-        * @param Resource $sock The socket
-        * @param int $len The number of bytes to read
-        * @return string|bool The string on success, false on failure.
-        */
-       function _fread( $sock, $len ) {
-               $buf = '';
-               while ( $len > 0 ) {
-                       $result = fread( $sock, $len );
-                       $data = stream_get_meta_data( $sock );
-                       if ( $data['timed_out'] ) {
-                               $this->_handle_error( $sock, 'timeout reading from $1' );
-                               return false;
-                       }
-                       if ( $result === false ) {
-                               $this->_handle_error( $sock, 'error reading buffer from $1' );
-                               return false;
-                       }
-                       if ( $result === '' ) {
-                               // This will happen if the remote end of the socket is shut down
-                               $this->_handle_error( $sock, 'unexpected end of file reading from $1' );
-                               return false;
-                       }
-                       $len -= strlen( $result );
-                       $buf .= $result;
-               }
-               return $buf;
-       }
-
-       /**
-        * Read a line from a stream. If there is an error, mark the socket dead.
-        * The \r\n line ending is stripped from the response.
-        *
-        * @param Resource $sock The socket
-        * @return string|bool The string on success, false on failure
-        */
-       function _fgets( $sock ) {
-               $result = fgets( $sock );
-               // fgets() may return a partial line if there is a select timeout after
-               // a successful recv(), so we have to check for a timeout even if we
-               // got a string response.
-               $data = stream_get_meta_data( $sock );
-               if ( $data['timed_out'] ) {
-                       $this->_handle_error( $sock, 'timeout reading line from $1' );
-                       return false;
-               }
-               if ( $result === false ) {
-                       $this->_handle_error( $sock, 'error reading line from $1' );
-                       return false;
-               }
-               if ( substr( $result, -2 ) === "\r\n" ) {
-                       $result = substr( $result, 0, -2 );
-               } elseif ( substr( $result, -1 ) === "\n" ) {
-                       $result = substr( $result, 0, -1 );
-               } else {
-                       $this->_handle_error( $sock, 'line ending missing in response from $1' );
-                       return false;
-               }
-               return $result;
-       }
-
-       /**
-        * Flush the read buffer of a stream
-        * @param Resource $f
-        */
-       function _flush_read_buffer( $f ) {
-               if ( !is_resource( $f ) ) {
-                       return;
-               }
-               $r = array( $f );
-               $w = null;
-               $e = null;
-               $n = stream_select( $r, $w, $e, 0, 0 );
-               while ( $n == 1 && !feof( $f ) ) {
-                       fread( $f, 1024 );
-                       $r = array( $f );
-                       $w = null;
-                       $e = null;
-                       $n = stream_select( $r, $w, $e, 0, 0 );
-               }
-       }
-
-       // }}}
-       // }}}
-       // }}}
-}
-
-// }}}
-
-class MemCachedClientforWiki extends MWMemcached {
-}
index a7b48a2..b7d1eaf 100644 (file)
@@ -100,13 +100,17 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                                break;
                        case 'igbinary':
                                if ( !Memcached::HAVE_IGBINARY ) {
-                                       throw new MWException( __CLASS__ . ': the igbinary extension is not available ' .
-                                               'but igbinary serialization was requested.' );
+                                       throw new InvalidArgumentException(
+                                               __CLASS__ . ': the igbinary extension is not available ' .
+                                               'but igbinary serialization was requested.'
+                                       );
                                }
                                $this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY );
                                break;
                        default:
-                               throw new MWException( __CLASS__ . ': invalid value for serializer parameter' );
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ': invalid value for serializer parameter'
+                               );
                }
                $servers = array();
                foreach ( $params['servers'] as $host ) {
@@ -117,38 +121,21 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                $this->debugLog( "get($key)" );
-               $result = $this->client->get( $this->encodeKey( $key ), null, $casToken );
+               $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken );
                $result = $this->checkResult( $key, $result );
                return $result;
        }
 
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                $this->debugLog( "set($key)" );
                return $this->checkResult( $key, parent::set( $key, $value, $exptime ) );
        }
 
-       /**
-        * @param float $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                $this->debugLog( "cas($key)" );
                return $this->checkResult( $key, parent::cas( $casToken, $key, $value, $exptime ) );
        }
 
-       /**
-        * @param string $key
-        * @return bool
-        */
        public function delete( $key ) {
                $this->debugLog( "delete($key)" );
                $result = parent::delete( $key );
@@ -160,33 +147,17 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                }
        }
 
-       /**
-        * @param string $key
-        * @param int $value
-        * @param int $exptime
-        * @return mixed
-        */
        public function add( $key, $value, $exptime = 0 ) {
                $this->debugLog( "add($key)" );
                return $this->checkResult( $key, parent::add( $key, $value, $exptime ) );
        }
 
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
        public function incr( $key, $value = 1 ) {
                $this->debugLog( "incr($key)" );
                $result = $this->client->increment( $key, $value );
                return $this->checkResult( $key, $result );
        }
 
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
        public function decr( $key, $value = 1 ) {
                $this->debugLog( "decr($key)" );
                $result = $this->client->decrement( $key, $value );
@@ -235,14 +206,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        public function getMulti( array $keys, $flags = 0 ) {
                $this->debugLog( 'getMulti(' . implode( ', ', $keys ) . ')' );
-               $callback = array( $this, 'encodeKey' );
-               $encodedResult = $this->client->getMulti( array_map( $callback, $keys ) );
-               $encodedResult = $encodedResult ?: array(); // must be an array
-               $result = array();
-               foreach ( $encodedResult as $key => $value ) {
-                       $key = $this->decodeKey( $key );
-                       $result[$key] = $value;
+               foreach ( $keys as $key ) {
+                       $this->validateKeyEncoding( $key );
                }
+               $result = $this->client->getMulti( $keys ) ?: array();
                return $this->checkResult( false, $result );
        }
 
@@ -252,14 +219,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return bool
         */
        public function setMulti( array $data, $exptime = 0 ) {
-               foreach ( $data as $key => $value ) {
-                       $encKey = $this->encodeKey( $key );
-                       if ( $encKey !== $key ) {
-                               $data[$encKey] = $value;
-                               unset( $data[$key] );
-                       }
-               }
                $this->debugLog( 'setMulti(' . implode( ', ', array_keys( $data ) ) . ')' );
+               foreach ( array_keys( $data ) as $key ) {
+                       $this->validateKeyEncoding( $key );
+               }
                $result = $this->client->setMulti( $data, $this->fixExpiry( $exptime ) );
                return $this->checkResult( false, $result );
        }
diff --git a/includes/objectcache/MemcachedPhpBagOStuff.php b/includes/objectcache/MemcachedPhpBagOStuff.php
deleted file mode 100644 (file)
index 6f0ba58..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * Object caching using memcached.
- *
- * 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 Cache
- */
-
-/**
- * A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
- *
- * @ingroup Cache
- */
-class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
-
-       /**
-        * Constructor.
-        *
-        * Available parameters are:
-        *   - servers:             The list of IP:port combinations holding the memcached servers.
-        *   - debug:               Whether to set the debug flag in the underlying client.
-        *   - persistent:          Whether to use a persistent connection
-        *   - compress_threshold:  The minimum size an object must be before it is compressed
-        *   - timeout:             The read timeout in microseconds
-        *   - connect_timeout:     The connect timeout in seconds
-        *
-        * @param array $params
-        */
-       function __construct( $params ) {
-               parent::__construct( $params );
-               $params = $this->applyDefaultParams( $params );
-
-               $this->client = new MemCachedClientforWiki( $params );
-               $this->client->set_servers( $params['servers'] );
-               $this->client->set_debug( $params['debug'] );
-       }
-
-       /**
-        * @param bool $debug
-        */
-       public function setDebug( $debug ) {
-               $this->client->set_debug( $debug );
-       }
-
-       public function getMulti( array $keys, $flags = 0 ) {
-               $callback = array( $this, 'encodeKey' );
-               $encodedResult = $this->client->get_multi( array_map( $callback, $keys ) );
-               $result = array();
-               foreach ( $encodedResult as $key => $value ) {
-                       $key = $this->decodeKey( $key );
-                       $result[$key] = $value;
-               }
-               return $result;
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
-       public function incr( $key, $value = 1 ) {
-               return $this->client->incr( $this->encodeKey( $key ), $value );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
-       public function decr( $key, $value = 1 ) {
-               return $this->client->decr( $this->encodeKey( $key ), $value );
-       }
-}
diff --git a/includes/objectcache/MultiWriteBagOStuff.php b/includes/objectcache/MultiWriteBagOStuff.php
deleted file mode 100644 (file)
index c05ecb6..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-/**
- * Wrapper for object caching in different caches.
- *
- * 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 Cache
- */
-
-/**
- * A cache class that replicates all writes to multiple child caches. Reads
- * are implemented by reading from the caches in the order they are given in
- * the configuration until a cache gives a positive result.
- *
- * @ingroup Cache
- */
-class MultiWriteBagOStuff extends BagOStuff {
-       /** @var BagOStuff[] */
-       protected $caches;
-       /** @var bool Use async secondary writes */
-       protected $asyncWrites = false;
-
-       /** Idiom for "write to all backends" */
-       const ALL = INF;
-
-       const UPGRADE_TTL = 3600; // TTL when a key is copied to a higher cache tier
-
-       /**
-        * $params include:
-        *   - caches:      This should have a numbered array of cache parameter
-        *                  structures, in the style required by $wgObjectCaches. See
-        *                  the documentation of $wgObjectCaches for more detail.
-        *                  BagOStuff objects can also be used as values.
-        *                  The first cache is the primary one, being the first to
-        *                  be read in the fallback chain. Writes happen to all stores
-        *                  in the order they are defined. However, lock()/unlock() calls
-        *                  only use the primary store.
-        *   - replication: Either 'sync' or 'async'. This controls whether writes to
-        *                  secondary stores are deferred when possible. Async writes
-        *                  require the HHVM register_postsend_function() function.
-        *                  Async writes can increase the chance of some race conditions
-        *                  or cause keys to expire seconds later than expected. It is
-        *                  safe to use for modules when cached values: are immutable,
-        *                  invalidation uses logical TTLs, invalidation uses etag/timestamp
-        *                  validation against the DB, or merge() is used to handle races.
-        *
-        * @param array $params
-        * @throws InvalidArgumentException
-        */
-       public function __construct( $params ) {
-               parent::__construct( $params );
-
-               if ( empty( $params['caches'] ) || !is_array( $params['caches'] ) ) {
-                       throw new InvalidArgumentException(
-                               __METHOD__ . ': "caches" parameter must be an array of caches'
-                       );
-               }
-
-               $this->caches = array();
-               foreach ( $params['caches'] as $cacheInfo ) {
-                       $this->caches[] = ( $cacheInfo instanceof BagOStuff )
-                               ? $cacheInfo
-                               : ObjectCache::newFromParams( $cacheInfo );
-               }
-
-               $this->asyncWrites = isset( $params['replication'] ) && $params['replication'] === 'async';
-       }
-
-       /**
-        * @param bool $debug
-        */
-       public function setDebug( $debug ) {
-               $this->doWrite( self::ALL, 'setDebug', $debug );
-       }
-
-       protected function doGet( $key, $flags = 0 ) {
-               $misses = 0; // number backends checked
-               $value = false;
-               foreach ( $this->caches as $cache ) {
-                       $value = $cache->get( $key, $flags );
-                       if ( $value !== false ) {
-                               break;
-                       }
-                       ++$misses;
-               }
-
-               if ( $value !== false
-                       && $misses > 0
-                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
-               ) {
-                       $this->doWrite( $misses, 'set', $key, $value, self::UPGRADE_TTL );
-               }
-
-               return $value;
-       }
-
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( self::ALL, 'set', $key, $value, $exptime );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function delete( $key ) {
-               return $this->doWrite( self::ALL, 'delete', $key );
-       }
-
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function add( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( self::ALL, 'add', $key, $value, $exptime );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return bool|null
-        */
-       public function incr( $key, $value = 1 ) {
-               return $this->doWrite( self::ALL, 'incr', $key, $value );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return bool
-        */
-       public function decr( $key, $value = 1 ) {
-               return $this->doWrite( self::ALL, 'decr', $key, $value );
-       }
-
-       /**
-        * @param string $key
-        * @param int $timeout
-        * @param int $expiry
-        * @param string $rclass
-        * @return bool
-        */
-       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
-               // Lock only the first cache, to avoid deadlocks
-               return $this->caches[0]->lock( $key, $timeout, $expiry, $rclass );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function unlock( $key ) {
-               return $this->caches[0]->unlock( $key );
-       }
-
-       /**
-        * @param string $key
-        * @param callable $callback Callback method to be executed
-        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
-        * @param int $attempts The amount of times to attempt a merge in case of failure
-        * @return bool Success
-        */
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
-               return $this->doWrite( self::ALL, 'merge', $key, $callback, $exptime );
-       }
-
-       public function getLastError() {
-               return $this->caches[0]->getLastError();
-       }
-
-       public function clearLastError() {
-               $this->caches[0]->clearLastError();
-       }
-
-       /**
-        * Apply a write method to the first $count backing caches
-        *
-        * @param integer $count
-        * @param string $method
-        * @param mixed ...
-        * @return bool
-        */
-       protected function doWrite( $count, $method /*, ... */ ) {
-               $ret = true;
-               $args = array_slice( func_get_args(), 2 );
-
-               foreach ( $this->caches as $i => $cache ) {
-                       if ( $i >= $count ) {
-                               break; // ignore the lower tiers
-                       }
-
-                       if ( $i == 0 || !$this->asyncWrites ) {
-                               // First store or in sync mode: write now and get result
-                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
-                                       $ret = false;
-                               }
-                       } else {
-                               // Secondary write in async mode: do not block this HTTP request
-                               $logger = $this->logger;
-                               DeferredUpdates::addCallableUpdate(
-                                       function () use ( $cache, $method, $args, $logger ) {
-                                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
-                                                       $logger->warning( "Async $method op failed" );
-                                               }
-                                       }
-                               );
-                       }
-               }
-
-               return $ret;
-       }
-
-       /**
-        * Delete objects expiring before a certain date.
-        *
-        * Succeed if any of the child caches succeed.
-        * @param string $date
-        * @param bool|callable $progressCallback
-        * @return bool
-        */
-       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
-               $ret = false;
-               foreach ( $this->caches as $cache ) {
-                       if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
-                               $ret = true;
-                       }
-               }
-
-               return $ret;
-       }
-}
index ea0fb44..b4aecee 100644 (file)
@@ -42,32 +42,37 @@ use MediaWiki\Logger\LoggerFactory;
  *
  * Primary entry points:
  *
- * - ObjectCache::newAccelerator( $fallbackType )
- *   Purpose: Cache for very hot keys.
- *   Stored only on the individual web server.
- *   Not associated with other servers.
- *
- * - ObjectCache::getMainClusterInstance()
- *   Purpose: Memory storage for per-cluster coordination and tracking.
- *   Stored centrally within the local data-center.
- *   Not replicated to other DCs.
- *   Also known as $wgMemc. Configured by $wgMainCacheType.
- *
  * - ObjectCache::getMainWANInstance()
- *   Purpose: Cache.
+ *   Purpose: Memory cache.
  *   Stored in the local data-center's main cache (uses different cache keys).
  *   Delete events are broadcasted to other DCs. See WANObjectCache for details.
  *
+ * - ObjectCache::getLocalServerInstance( $fallbackType )
+ *   Purpose: Memory cache for very hot keys.
+ *   Stored only on the individual web server (often EmptyBagOStuff in CLI mode).
+ *   Not replicated to the other servers.
+ *
+ * - ObjectCache::getLocalClusterInstance()
+ *   Purpose: Memory storage for per-cluster coordination and tracking.
+ *   A typical use case would be a rate limit counter or cache regeneration mutex.
+ *   Stored centrally within the local data-center. Not replicated to other DCs.
+ *   Configured by $wgMainCacheType.
+ *
  * - ObjectCache::getMainStashInstance()
- *   Purpose: Ephemeral storage.
- *   Stored centrally within the local data-center.
- *   Changes are replicated to other DCs (eventually consistent).
+ *   Purpose: Ephemeral global storage.
+ *   Stored centrally within the primary data-center.
+ *   Changes are applied there first and replicated to other DCs (best-effort).
  *   To retrieve the latest value (e.g. not from a slave), use BagOStuff:READ_LATEST.
  *   This store may be subject to LRU style evictions.
  *
- * - wfGetCache( $cacheType )
+ * - ObjectCache::getInstance( $cacheType )
+ *   Purpose: Special cases (like tiered memory/disk caches).
  *   Get a specific cache type by key in $wgObjectCaches.
  *
+ * All the above cache instances (BagOStuff and WANObjectCache) have their makeKey()
+ * method scoped to the *current* wiki ID. Use makeGlobalKey() to avoid this scoping
+ * when using keys that need to be shared amongst wikis.
+ *
  * @ingroup Cache
  */
 class ObjectCache {
@@ -123,6 +128,26 @@ class ObjectCache {
                return self::newFromParams( $wgObjectCaches[$id] );
        }
 
+       /**
+        * Get the default keyspace for this wiki.
+        *
+        * This is either the value of the `CachePrefix` configuration variable,
+        * or (if the former is unset) the `DBname` configuration variable, with
+        * `DBprefix` (if defined).
+        *
+        * @return string
+        */
+       public static function getDefaultKeyspace() {
+               global $wgCachePrefix;
+
+               $keyspace = $wgCachePrefix;
+               if ( is_string( $keyspace ) && $keyspace !== '' ) {
+                       return $keyspace;
+               }
+
+               return wfWikiID();
+       }
+
        /**
         * Create a new cache object from parameters.
         *
@@ -138,14 +163,36 @@ class ObjectCache {
                if ( isset( $params['loggroup'] ) ) {
                        $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
                } else {
-                       // For backwards-compatability with custom parameters, lets not
-                       // have all logging suddenly disappear
                        $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
                }
+               if ( !isset( $params['keyspace'] ) ) {
+                       $params['keyspace'] = self::getDefaultKeyspace();
+               }
                if ( isset( $params['factory'] ) ) {
                        return call_user_func( $params['factory'], $params );
                } elseif ( isset( $params['class'] ) ) {
                        $class = $params['class'];
+                       // Automatically set the 'async' update handler
+                       if ( $class === 'MultiWriteBagOStuff' ) {
+                               $params['asyncHandler'] = isset( $params['asyncHandler'] )
+                                       ? $params['asyncHandler']
+                                       : 'DeferredUpdates::addCallableUpdate';
+                       }
+                       // Do b/c logic for MemcachedBagOStuff
+                       if ( is_subclass_of( $class, 'MemcachedBagOStuff' ) ) {
+                               if ( !isset( $params['servers'] ) ) {
+                                       $params['servers'] = $GLOBALS['wgMemCachedServers'];
+                               }
+                               if ( !isset( $params['debug'] ) ) {
+                                       $params['debug'] = $GLOBALS['wgMemCachedDebug'];
+                               }
+                               if ( !isset( $params['persistent'] ) ) {
+                                       $params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
+                               }
+                               if ( !isset( $params['timeout'] ) ) {
+                                       $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
+                               }
+                       }
                        return new $class( $params );
                } else {
                        throw new MWException( "The definition of cache type \""
@@ -185,26 +232,17 @@ class ObjectCache {
         * A fallback cache can be specified if none is found.
         *
         *     // Direct calls
-        *     ObjectCache::newAccelerator( $fallbackType );
+        *     ObjectCache::getLocalServerInstance( $fallbackType );
         *
         *     // From $wgObjectCaches via newFromParams()
-        *     ObjectCache::newAccelerator( array( 'fallback' => $fallbackType ) );
+        *     ObjectCache::getLocalServerInstance( array( 'fallback' => $fallbackType ) );
         *
-        * @param array $params [optional] Array key 'fallback' for $fallback.
-        * @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
+        * @param int|string|array $fallback Fallback cache or parameter map with 'fallback'
         * @return BagOStuff
         * @throws MWException
+        * @since 1.27
         */
-       public static function newAccelerator( $params = array(), $fallback = null ) {
-               if ( $fallback === null ) {
-                       // The is_array check here is needed because in PHP 5.3:
-                       // $a = 'hash'; isset( $params['fallback'] ); yields true
-                       if ( is_array( $params ) && isset( $params['fallback'] ) ) {
-                               $fallback = $params['fallback'];
-                       } elseif ( !is_array( $params ) ) {
-                               $fallback = $params;
-                       }
-               }
+       public static function getLocalServerInstance( $fallback = CACHE_NONE ) {
                if ( function_exists( 'apc_fetch' ) ) {
                        $id = 'apc';
                } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
@@ -212,27 +250,34 @@ class ObjectCache {
                } elseif ( function_exists( 'wincache_ucache_get' ) ) {
                        $id = 'wincache';
                } else {
-                       if ( $fallback === null ) {
-                               throw new MWException( 'CACHE_ACCEL requested but no suitable object ' .
-                                       'cache is present. You may want to install APC.' );
+                       if ( is_array( $fallback ) ) {
+                               $id = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE;
+                       } else {
+                               $id = $fallback;
                        }
-                       $id = $fallback;
                }
-               return self::newFromId( $id );
+
+               return self::getInstance( $id );
        }
 
        /**
-        * Factory function that creates a memcached client object.
-        *
-        * This always uses the PHP client, since the PECL client has a different
-        * hashing scheme and a different interpretation of the flags bitfield, so
-        * switching between the two clients randomly would be disastrous.
-        *
-        * @param array $params
-        * @return MemcachedPhpBagOStuff
+        * @param array $params [optional] Array key 'fallback' for $fallback.
+        * @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
+        * @return BagOStuff
+        * @deprecated 1.27
         */
-       public static function newMemcached( $params ) {
-               return new MemcachedPhpBagOStuff( $params );
+       public static function newAccelerator( $params = array(), $fallback = null ) {
+               if ( $fallback === null ) {
+                       // The is_array check here is needed because in PHP 5.3:
+                       // $a = 'hash'; isset( $params['fallback'] ); yields true
+                       if ( is_array( $params ) && isset( $params['fallback'] ) ) {
+                               $fallback = $params['fallback'];
+                       } elseif ( !is_array( $params ) ) {
+                               $fallback = $params;
+                       }
+               }
+
+               return self::getLocalServerInstance( $fallback );
        }
 
        /**
@@ -255,6 +300,11 @@ class ObjectCache {
                $class = $params['relayerConfig']['class'];
                $params['relayer'] = new $class( $params['relayerConfig'] );
                $params['cache'] = self::newFromId( $params['cacheId'] );
+               if ( isset( $params['loggroup'] ) ) {
+                       $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
+               } else {
+                       $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
+               }
                $class = $params['class'];
 
                return new $class( $params );
@@ -266,10 +316,10 @@ class ObjectCache {
         * @since 1.27
         * @return BagOStuff
         */
-       public static function getMainClusterInstance() {
-               $config = RequestContext::getMain()->getConfig();
-               $id = $config->get( 'MainCacheType' );
-               return self::getInstance( $id );
+       public static function getLocalClusterInstance() {
+               global $wgMainCacheType;
+
+               return self::getInstance( $wgMainCacheType );
        }
 
        /**
index 2a5d695..cc85074 100644 (file)
@@ -47,7 +47,7 @@ class ObjectCacheSessionHandler {
 
                // It's necessary to register a shutdown function to call session_write_close(),
                // because by the time the request shutdown function for the session module is
-               // called, $wgMemc has already been destroyed. Shutdown functions registered
+               // called, the BagOStuff has already been destroyed. Shutdown functions registered
                // this way are called before object destruction.
                register_shutdown_function( array( __CLASS__, 'handleShutdown' ) );
        }
index e6b3f9e..2c12fdf 100644 (file)
@@ -102,7 +102,7 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
-       public function set( $key, $value, $expiry = 0 ) {
+       public function set( $key, $value, $expiry = 0, $flags = 0 ) {
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
index c2e5bd7..a6f2d37 100644 (file)
 class SqlBagOStuff extends BagOStuff {
        /** @var LoadBalancer */
        protected $lb;
-
        /** @var array */
        protected $serverInfos;
-
        /** @var array */
        protected $serverNames;
-
        /** @var int */
        protected $numServers;
-
-       /** @var array */
-       protected $conns;
-
        /** @var int */
        protected $lastExpireAll = 0;
-
        /** @var int */
        protected $purgePeriod = 100;
-
        /** @var int */
        protected $shards = 1;
-
        /** @var string */
        protected $tableName = 'objectcache';
-
        /** @var bool */
        protected $slaveOnly = false;
+       /** @var int */
+       protected $syncTimeout = 3;
 
+       /** @var array */
+       protected $conns;
        /** @var array UNIX timestamps */
        protected $connFailureTimes = array();
-
        /** @var array Exceptions */
        protected $connFailureErrors = array();
 
@@ -92,6 +84,7 @@ class SqlBagOStuff extends BagOStuff {
         *                  garbage collection logic of expired items. This only
         *                  makes sense if the primary DB is used and only if get()
         *                  calls will be used. This is used by ReplicatedBagOStuff.
+        *   - syncTimeout: Max seconds to wait for slaves to catch up for WRITE_SYNC.
         *
         * @param array $params
         */
@@ -120,6 +113,9 @@ class SqlBagOStuff extends BagOStuff {
                if ( isset( $params['shards'] ) ) {
                        $this->shards = intval( $params['shards'] );
                }
+               if ( isset( $params['syncTimeout'] ) ) {
+                       $this->syncTimeout = $params['syncTimeout'];
+               }
                $this->slaveOnly = !empty( $params['slaveOnly'] );
        }
 
@@ -289,11 +285,6 @@ class SqlBagOStuff extends BagOStuff {
                return $values;
        }
 
-       /**
-        * @param array $data
-        * @param int $expiry
-        * @return bool
-        */
        public function setMulti( array $data, $expiry = 0 ) {
                $keysByTable = array();
                foreach ( $data as $key => $value ) {
@@ -353,23 +344,15 @@ class SqlBagOStuff extends BagOStuff {
                return $result;
        }
 
-       /**
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->setMulti( array( $key => $value ), $exptime );
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               $ok = $this->setMulti( array( $key => $value ), $exptime );
+               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+                       $ok = $ok && $this->waitForSlaves();
+               }
+
+               return $ok;
        }
 
-       /**
-        * @param mixed $casToken
-        * @param string $key
-        * @param mixed $value
-        * @param int $exptime
-        * @return bool
-        */
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
@@ -410,10 +393,6 @@ class SqlBagOStuff extends BagOStuff {
                return (bool)$db->affectedRows();
        }
 
-       /**
-        * @param string $key
-        * @return bool
-        */
        public function delete( $key ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
@@ -430,11 +409,6 @@ class SqlBagOStuff extends BagOStuff {
                return true;
        }
 
-       /**
-        * @param string $key
-        * @param int $step
-        * @return int|null
-        */
        public function incr( $key, $step = 1 ) {
                list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
                try {
@@ -479,12 +453,17 @@ class SqlBagOStuff extends BagOStuff {
                return $newValue;
        }
 
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10 ) {
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
                if ( !is_callable( $callback ) ) {
                        throw new Exception( "Got invalid callback." );
                }
 
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+               $ok = $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+                       $ok = $ok && $this->waitForSlaves();
+               }
+
+               return $ok;
        }
 
        /**
@@ -756,4 +735,14 @@ class SqlBagOStuff extends BagOStuff {
                        }
                }
        }
+
+       protected function waitForSlaves() {
+               if ( !$this->serverInfos ) {
+                       // Main LB is used; wait for any slaves to catch up
+                       return wfWaitForSlaves( null, false, false, $this->syncTimeout );
+               } else {
+                       // Custom DB server list; probably doesn't use replication
+                       return true;
+               }
+       }
 }
index 4fdaea1..5d6435e 100644 (file)
@@ -1075,7 +1075,6 @@ class Article implements Page {
 
                $outputPage = $this->getContext()->getOutput();
                $user = $this->getContext()->getUser();
-               $cache = wfGetMainCache();
                $rc = false;
 
                if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
@@ -1100,7 +1099,8 @@ class Article implements Page {
                }
 
                // Check for cached results
-               $key = wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() );
+               $key = wfMemcKey( 'unpatrollable-page', $this->getTitle()->getArticleID() );
+               $cache = ObjectCache::getMainWANInstance();
                if ( $cache->get( $key ) ) {
                        return false;
                }
@@ -2088,15 +2088,15 @@ class Article implements Page {
        /**
         * @param string $reason
         * @param bool $suppress
-        * @param int $id
-        * @param bool $commit
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
         * @param string $error
         * @return bool
         */
-       public function doDeleteArticle( $reason, $suppress = false, $id = 0,
-               $commit = true, &$error = ''
+       public function doDeleteArticle(
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = ''
        ) {
-               return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
+               return $this->mPage->doDeleteArticle( $reason, $suppress, $u1, $u2, $error );
        }
 
        /**
index 7957e65..3638aed 100644 (file)
@@ -1533,7 +1533,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        function __construct( $imagePage ) {
                parent::__construct( $imagePage->getContext() );
                $this->mImagePage = $imagePage;
-               $this->mTitle = clone ( $imagePage->getTitle() );
+               $this->mTitle = clone $imagePage->getTitle();
                $this->mTitle->setFragment( '#filehistory' );
                $this->mImg = null;
                $this->mHist = array();
index d656bad..e71c0ec 100644 (file)
@@ -1092,7 +1092,9 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get a ParserOutput for the given ParserOptions and revision ID.
-        * The parser cache will be used if possible.
+        *
+        * The parser cache will be used if possible. Cache misses that result
+        * in parser runs are debounced with PoolCounter.
         *
         * @since 1.19
         * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
@@ -1163,7 +1165,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $title->invalidateCache();
                        if ( $wgUseSquid ) {
                                // Send purge now that page_touched update was committed above
-                               $update = SquidUpdate::newSimplePurge( $title );
+                               $update = new SquidUpdate( $title->getSquidURLs() );
                                $update->doUpdate();
                        }
                } );
@@ -2182,6 +2184,10 @@ class WikiPage implements Page, IDBAccessObject {
                        $updates = $content->getSecondaryDataUpdates(
                                $this->getTitle(), null, $recursive, $editInfo->output );
                        foreach ( $updates as $update ) {
+                               if ( $update instanceof LinksUpdate ) {
+                                       $update->setRevision( $revision );
+                                       $update->setTriggeringUser( $user );
+                               }
                                DeferredUpdates::addUpdate( $update );
                        }
                }
@@ -2733,16 +2739,16 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $reason Delete reason for deletion log
         * @param bool $suppress Suppress all revisions and log the deletion in
         *        the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
+        * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
         * @return bool True if successful
         */
        public function doDeleteArticle(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null
        ) {
-               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
+               $status = $this->doDeleteArticleReal( $reason, $suppress, $u1, $u2, $error, $user );
                return $status->isGood();
        }
 
@@ -2755,16 +2761,16 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $reason Delete reason for deletion log
         * @param bool $suppress Suppress all revisions and log the deletion in
         *   the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
+        * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
         * @return Status Status object; if successful, $status->value is the log_id of the
         *   deletion log entry. If the page couldn't be deleted because it wasn't
         *   found, $status is a non-fatal 'cannotdelete' error
         */
        public function doDeleteArticleReal(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null
        ) {
                global $wgUser, $wgContentHandlerUseDB;
 
@@ -2780,7 +2786,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                $user = is_null( $user ) ? $wgUser : $user;
                if ( !Hooks::run( 'ArticleDelete',
-                       array( &$this, &$user, &$reason, &$error, &$status )
+                       array( &$this, &$user, &$reason, &$error, &$status, $suppress )
                ) ) {
                        if ( $status->isOK() ) {
                                // Hook aborted but didn't set a fatal status
@@ -2790,25 +2796,28 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-
-               if ( $id == 0 ) {
-                       $this->loadPageData( self::READ_LATEST );
-                       $id = $this->getID();
-                       // T98706: lock the page from various other updates but avoid using
-                       // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
-                       // the revisions queries (which also JOIN on user). Only lock the page
-                       // row and CAS check on page_latest to see if the trx snapshot matches.
-                       $lockedLatest = $this->lock();
-                       if ( $id == 0 || $this->getLatest() != $lockedLatest ) {
-                               // Page not there or trx snapshot is stale
-                               $dbw->rollback( __METHOD__ );
-                               $status->error( 'cannotdelete',
-                                       wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                               return $status;
-                       }
+               $dbw->startAtomic( __METHOD__ );
+
+               $this->loadPageData( self::READ_LATEST );
+               $id = $this->getID();
+               // T98706: lock the page from various other updates but avoid using
+               // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
+               // the revisions queries (which also JOIN on user). Only lock the page
+               // row and CAS check on page_latest to see if the trx snapshot matches.
+               $lockedLatest = $this->lock();
+               if ( $id == 0 || $this->getLatest() != $lockedLatest ) {
+                       $dbw->endAtomic( __METHOD__ );
+                       // Page not there or trx snapshot is stale
+                       $status->error( 'cannotdelete',
+                               wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
                }
 
+               // At this point we are now comitted to returning an OK
+               // status unless some DB query error or other exception comes up.
+               // This way callers don't have to call rollback() if $status is bad
+               // unless they actually try to catch exceptions (which is rare).
+
                // we need to remember the old content so we can use it to generate all deletion updates.
                $content = $this->getContent( Revision::RAW );
 
@@ -2861,24 +2870,20 @@ class WikiPage implements Page, IDBAccessObject {
                        $row['ar_content_format'] = 'rev_content_format';
                }
 
-               $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
+               // Copy all the page revisions into the archive table
+               $dbw->insertSelect(
+                       'archive',
+                       array( 'page', 'revision' ),
                        $row,
                        array(
                                'page_id' => $id,
                                'page_id = rev_page'
-                       ), __METHOD__
+                       ),
+                       __METHOD__
                );
 
                // Now that it's safely backed up, delete it
                $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
-               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
-
-               if ( !$ok ) {
-                       $dbw->rollback( __METHOD__ );
-                       $status->error( 'cannotdelete',
-                               wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                       return $status;
-               }
 
                if ( !$dbw->cascadingDeletes() ) {
                        $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
@@ -2901,19 +2906,19 @@ class WikiPage implements Page, IDBAccessObject {
                        $logEntry->publish( $logid );
                } );
 
-               if ( $commit ) {
-                       $dbw->commit( __METHOD__ );
-               }
-
-               // Show log excerpt on 404 pages rather than just a link
-               $key = wfMemcKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) );
-               ObjectCache::getMainStashInstance()->set( $key, 1, 86400 );
+               $dbw->endAtomic( __METHOD__ );
 
                $this->doDeleteUpdates( $id, $content );
 
                Hooks::run( 'ArticleDeleteComplete',
                        array( &$this, &$user, $reason, $id, $content, $logEntry ) );
                $status->value = $logid;
+
+               // Show log excerpt on 404 pages rather than just a link
+               $cache = ObjectCache::getMainStashInstance();
+               $key = wfMemcKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) );
+               $cache->set( $key, 1, $cache::TTL_DAY );
+
                return $status;
        }
 
@@ -3395,22 +3400,44 @@ class WikiPage implements Page, IDBAccessObject {
                                }
 
                                if ( count( $added ) ) {
-                                       $insertRows = array();
-                                       foreach ( $added as $cat ) {
-                                               $insertRows[] = array(
-                                                       'cat_title'   => $cat,
-                                                       'cat_pages'   => 1,
-                                                       'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
-                                                       'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
-                                               );
-                                       }
-                                       $dbw->upsert(
+                                       $existingAdded = $dbw->selectFieldValues(
                                                'category',
-                                               $insertRows,
-                                               array( 'cat_title' ),
-                                               $addFields,
-                                               $method
+                                               'cat_title',
+                                               array( 'cat_title' => $added ),
+                                               __METHOD__
                                        );
+
+                                       // For category rows that already exist, do a plain
+                                       // UPDATE instead of INSERT...ON DUPLICATE KEY UPDATE
+                                       // to avoid creating gaps in the cat_id sequence.
+                                       if ( count( $existingAdded ) ) {
+                                               $dbw->update(
+                                                       'category',
+                                                       $addFields,
+                                                       array( 'cat_title' => $existingAdded ),
+                                                       __METHOD__
+                                               );
+                                       }
+
+                                       $missingAdded = array_diff( $added, $existingAdded );
+                                       if ( count( $missingAdded ) ) {
+                                               $insertRows = array();
+                                               foreach ( $missingAdded as $cat ) {
+                                                       $insertRows[] = array(
+                                                               'cat_title'   => $cat,
+                                                               'cat_pages'   => 1,
+                                                               'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+                                                               'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
+                                                       );
+                                               }
+                                               $dbw->upsert(
+                                                       'category',
+                                                       $insertRows,
+                                                       array( 'cat_title' ),
+                                                       $addFields,
+                                                       $method
+                                               );
+                                       }
                                }
 
                                if ( count( $deleted ) ) {
@@ -3452,26 +3479,34 @@ class WikiPage implements Page, IDBAccessObject {
                        return;
                }
 
+               $params = array(
+                       'isOpportunistic' => true,
+                       'rootJobTimestamp' => $parserOutput->getCacheTime()
+               );
+
                if ( $this->mTitle->areRestrictionsCascading() ) {
                        // If the page is cascade protecting, the links should really be up-to-date
-                       $params = array( 'prioritize' => true );
+                       JobQueueGroup::singleton()->lazyPush(
+                               RefreshLinksJob::newPrioritized( $this->mTitle, $params )
+                       );
                } elseif ( $parserOutput->hasDynamicContent() ) {
-                       // Assume the output contains time/random based magic words
-                       $params = array();
-               } else {
-                       // If the inclusions are deterministic, the edit-triggered link jobs are enough
-                       return;
-               }
-
-               // Check if the last link refresh was before page_touched
-               if ( $this->getLinksTimestamp() < $this->getTouched() ) {
-                       $params['isOpportunistic'] = true;
-                       $params['rootJobTimestamp'] = $parserOutput->getCacheTime();
-
-                       JobQueueGroup::singleton()->lazyPush( EnqueueJob::newFromLocalJobs(
-                               new JobSpecification( 'refreshLinks', $params,
-                                       array( 'removeDuplicates' => true ), $this->mTitle )
-                       ) );
+                       // Assume the output contains "dynamic" time/random based magic words.
+                       // Only update pages that expired due to dynamic content and NOT due to edits
+                       // to referenced templates/files. When the cache expires due to dynamic content,
+                       // page_touched is unchanged. We want to avoid triggering redundant jobs due to
+                       // views of pages that were just purged via HTMLCacheUpdateJob. In that case, the
+                       // template/file edit already triggered recursive RefreshLinksJob jobs.
+                       if ( $this->getLinksTimestamp() > $this->getTouched() ) {
+                               // If a page is uncacheable, do not keep spamming a job for it.
+                               // Although it would be de-duplicated, it would still waste I/O.
+                               $cache = ObjectCache::getLocalClusterInstance();
+                               $key = $cache->makeKey( 'dynamic-linksupdate', 'last', $this->getId() );
+                               if ( $cache->add( $key, time(), 60 ) ) {
+                                       JobQueueGroup::singleton()->lazyPush(
+                                               RefreshLinksJob::newDynamic( $this->mTitle, $params )
+                                       );
+                               }
+                       }
                }
        }
 
@@ -3540,7 +3575,7 @@ class WikiPage implements Page, IDBAccessObject {
         *
         * @param Content|null $content Optional Content object for determining the
         *   necessary updates.
-        * @return array An array of DataUpdates objects
+        * @return DataUpdate[]
         */
        public function getDeletionUpdates( Content $content = null ) {
                if ( !$content ) {
index 7acfe38..2451390 100644 (file)
@@ -93,11 +93,6 @@ class CacheTime {
                if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
                        $this->mCacheExpiry = $seconds;
                }
-
-               // hack: set old-style marker for uncacheable entries.
-               if ( $this->mCacheExpiry !== null && $this->mCacheExpiry <= 0 ) {
-                       $this->mCacheTime = -1;
-               }
        }
 
        /**
index ef295ab..edb9ff1 100644 (file)
@@ -124,18 +124,23 @@ class DateFormatter {
         *              Defaults to the site content language
         * @return DateFormatter
         */
-       public static function &getInstance( $lang = null ) {
-               global $wgMemc, $wgContLang;
-               static $dateFormatter = false;
+       public static function getInstance( $lang = null ) {
+               global $wgContLang, $wgMainCacheType;
+
                $lang = $lang ? wfGetLangObj( $lang ) : $wgContLang;
-               $key = wfMemcKey( 'dateformatter', $lang->getCode() );
+               $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
+
+               static $dateFormatter = false;
                if ( !$dateFormatter ) {
-                       $dateFormatter = $wgMemc->get( $key );
-                       if ( !$dateFormatter ) {
-                               $dateFormatter = new DateFormatter( $lang );
-                               $wgMemc->set( $key, $dateFormatter, 3600 );
-                       }
+                       $dateFormatter = $cache->getWithSetCallback(
+                               $cache->makeKey( 'dateformatter', $lang->getCode() ),
+                               $cache::TTL_HOUR,
+                               function () use ( $lang ) {
+                                       return new DateFormatter( $lang );
+                               }
+                       );
                }
+
                return $dateFormatter;
        }
 
index 3a2bb17..746e15b 100644 (file)
@@ -51,6 +51,24 @@ class MWTidy {
                return $driver->tidy( $text );
        }
 
+       /**
+        * Get CSS modules needed if HTML from the current driver is to be displayed.
+        *
+        * This is just a migration tool to allow some changes expected as part of
+        * Tidy replacement (T89331) to be exposed on the client side via user
+        * scripts, without actually replacing tidy. See T49673.
+        *
+        * @return array
+        */
+       public static function getModuleStyles() {
+               $driver = self::singleton();
+               if ( $driver && $driver instanceof MediaWiki\Tidy\RaggettBase ) {
+                       return array( 'mediawiki.raggett' );
+               } else {
+                       return array();
+               }
+       }
+
        /**
         * Check HTML for errors, used if $wgValidateAllHtml = true.
         *
index efad151..cfbf0b4 100644 (file)
@@ -1340,6 +1340,7 @@ class Parser {
 
                if ( MWTidy::isEnabled() && $this->mOptions->getTidy() ) {
                        $text = MWTidy::tidy( $text );
+                       $this->mOutput->addModuleStyles( MWTidy::getModuleStyles() );
                } else {
                        # attempt to sanitize at least some nesting problems
                        # (bug #2702 and quite a few others)
@@ -5763,7 +5764,6 @@ class Parser {
                        throw new MWException( __METHOD__ .
                                " can only be called when actually parsing something" );
                }
-               $this->mOutput->setCacheTime( -1 ); // old style, for compatibility
                $this->mOutput->updateCacheExpiry( 0 ); // new style, for consistency
        }
 
index 3745238..e4c287a 100644 (file)
@@ -44,7 +44,7 @@ class ParserOutput extends CacheTime {
        public $mIndicators = array();
 
        /**
-        * @var string $mTitleText Title text of the chosen language variant
+        * @var string $mTitleText Title text of the chosen language variant, as HTML.
         */
        public $mTitleText;
 
@@ -108,19 +108,17 @@ class ParserOutput extends CacheTime {
        public $mHeadItems = array();
 
        /**
-        * @var array $mModules Modules to be loaded by the resource loader
+        * @var array $mModules Modules to be loaded by ResourceLoader
         */
        public $mModules = array();
 
        /**
-        * @var array $mModuleScripts Modules of which only the JS will be loaded by
-        *  the resource loader.
+        * @var array $mModuleScripts Modules of which only the JS will be loaded by ResourceLoader.
         */
        public $mModuleScripts = array();
 
        /**
-        * @var array $mModuleStyles Modules of which only the CSSS will be loaded by
-        *  the resource loader.
+        * @var array $mModuleStyles Modules of which only the CSSS will be loaded by ResourceLoader.
         */
        public $mModuleStyles = array();
 
@@ -700,9 +698,13 @@ class ParserOutput extends CacheTime {
 
        /**
         * Override the title to be used for display
-        * -- this is assumed to have been validated
+        *
+        * @note this is assumed to have been validated
         * (check equal normalisation, etc.)
         *
+        * @note this is expected to be safe HTML,
+        * ready to be served to the client.
+        *
         * @param string $text Desired title text
         */
        public function setDisplayTitle( $text ) {
@@ -711,9 +713,12 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Get the title to be used for display
+        * Get the title to be used for display.
+        *
+        * As per the contract of setDisplayTitle(), this is safe HTML,
+        * ready to be served to the client.
         *
-        * @return string
+        * @return string HTML
         */
        public function getDisplayTitle() {
                $t = $this->getTitleText();
index b32593c..df5d499 100644 (file)
  * @ingroup Parser
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * @ingroup Parser
  */
-interface Preprocessor {
+abstract class Preprocessor {
+
+       const CACHE_VERSION = 1;
+
        /**
-        * Create a new preprocessor object based on an initialised Parser object
+        * @var array Brace matching rules.
+        */
+       protected $rules = array(
+               '{' => array(
+                       'end' => '}',
+                       'names' => array(
+                               2 => 'template',
+                               3 => 'tplarg',
+                       ),
+                       'min' => 2,
+                       'max' => 3,
+               ),
+               '[' => array(
+                       'end' => ']',
+                       'names' => array( 2 => null ),
+                       'min' => 2,
+                       'max' => 2,
+               )
+       );
+
+       /**
+        * Store a document tree in the cache.
         *
-        * @param Parser $parser
+        * @param string $text
+        * @param int $flags
         */
-       public function __construct( $parser );
+       protected function cacheSetTree( $text, $flags, $tree ) {
+               $config = RequestContext::getMain()->getConfig();
+
+               $length = strlen( $text );
+               $threshold = $config->get( 'PreprocessorCacheThreshold' );
+               if ( $threshold === false || $length < $threshold || $length > 1e6 ) {
+                       return false;
+               }
+
+               $key = wfMemcKey(
+                       // TODO: Once we require PHP 5.5, use static::class instead of
+                       // get_called_class() or get_class( $this ).
+                       defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : get_called_class(),
+                       md5( $text ), $flags );
+               $value = sprintf( "%08d", static::CACHE_VERSION ) . $tree;
+
+               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
+               $cache->set( $key, $value, 86400 );
+
+               LoggerFactory::getInstance( 'Preprocessor' )
+                       ->info( "Cached preprocessor output (key: $key)" );
+       }
+
+       /**
+        * Attempt to load a precomputed document tree for some given wikitext
+        * from the cache.
+        *
+        * @param string $text
+        * @param int $flags
+        * @return PPNode_Hash_Tree|bool
+        */
+       protected function cacheGetTree( $text, $flags ) {
+               $config = RequestContext::getMain()->getConfig();
+
+               $length = strlen( $text );
+               $threshold = $config->get( 'PreprocessorCacheThreshold' );
+               if ( $threshold === false || $length < $threshold || $length > 1e6 ) {
+                       return false;
+               }
+
+               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
+
+               $key = wfMemcKey(
+                       // TODO: Once we require PHP 5.5, use static::class instead of
+                       // get_called_class() or get_class( $this ).
+                       defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : get_called_class(),
+                       md5( $text ), $flags );
+
+               $value = $cache->get( $key );
+               if ( !$value ) {
+                       return false;
+               }
+
+               $version = intval( substr( $value, 0, 8 ) );
+               if ( $version !== static::CACHE_VERSION ) {
+                       return false;
+               }
+
+               LoggerFactory::getInstance( 'Preprocessor' )
+                       ->info( "Loaded preprocessor output from cache (key: $key)" );
+
+               return substr( $value, 8 );
+       }
 
        /**
         * Create a new top-level frame for expansion of a page
         *
         * @return PPFrame
         */
-       public function newFrame();
+       abstract public function newFrame();
 
        /**
         * Create a new custom frame for programmatic use of parameter replacement
@@ -47,7 +136,7 @@ interface Preprocessor {
         *
         * @return PPFrame
         */
-       public function newCustomFrame( $args );
+       abstract public function newCustomFrame( $args );
 
        /**
         * Create a new custom node for programmatic use of parameter replacement
@@ -55,7 +144,7 @@ interface Preprocessor {
         *
         * @param array $values
         */
-       public function newPartNodeArray( $values );
+       abstract public function newPartNodeArray( $values );
 
        /**
         * Preprocess text to a PPNode
@@ -65,7 +154,7 @@ interface Preprocessor {
         *
         * @return PPNode
         */
-       public function preprocessToObj( $text, $flags = 0 );
+       abstract public function preprocessToObj( $text, $flags = 0 );
 }
 
 /**
index c329689..4ca3a87 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Parser
  */
 // @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
-class Preprocessor_DOM implements Preprocessor {
+class Preprocessor_DOM extends Preprocessor {
        // @codingStandardsIgnoreEnd
 
        /**
@@ -35,7 +35,7 @@ class Preprocessor_DOM implements Preprocessor {
 
        public $memoryLimit;
 
-       const CACHE_VERSION = 1;
+       const CACHE_PREFIX = 'preprocess-xml';
 
        public function __construct( $parser ) {
                $this->parser = $parser;
@@ -148,30 +148,11 @@ class Preprocessor_DOM implements Preprocessor {
         * @return PPNode_DOM
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               global $wgMemc, $wgPreprocessorCacheThreshold;
-
-               $xml = false;
-               $cacheable = ( $wgPreprocessorCacheThreshold !== false
-                       && strlen( $text ) > $wgPreprocessorCacheThreshold );
-               if ( $cacheable ) {
-                       $cacheKey = wfMemcKey( 'preprocess-xml', md5( $text ), $flags );
-                       $cacheValue = $wgMemc->get( $cacheKey );
-                       if ( $cacheValue ) {
-                               $version = substr( $cacheValue, 0, 8 );
-                               if ( intval( $version ) == self::CACHE_VERSION ) {
-                                       $xml = substr( $cacheValue, 8 );
-                                       // From the cache
-                                       wfDebugLog( "Preprocessor", "Loaded preprocessor XML from memcached (key $cacheKey)" );
-                               }
-                       }
-                       if ( $xml === false ) {
-                               $xml = $this->preprocessToXml( $text, $flags );
-                               $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
-                               $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                               wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
-                       }
-               } else {
+
+               $xml = $this->cacheGetTree( $text, $flags );
+               if ( $xml === false ) {
                        $xml = $this->preprocessToXml( $text, $flags );
+                       $this->cacheSetTree( $text, $flags, $xml );
                }
 
                // Fail if the number of elements exceeds acceptable limits
@@ -179,8 +160,7 @@ class Preprocessor_DOM implements Preprocessor {
                $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
                $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
                if ( $this->parser->mGeneratedPPNodeCount > $max ) {
-                       if ( $cacheable ) {
-                       }
+                       // if ( $cacheable ) { ... }
                        throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
                }
 
@@ -199,8 +179,7 @@ class Preprocessor_DOM implements Preprocessor {
                        $obj = new PPNode_DOM( $dom->documentElement );
                }
 
-               if ( $cacheable ) {
-               }
+               // if ( $cacheable ) { ... }
 
                if ( !$result ) {
                        throw new MWException( __METHOD__ . ' generated invalid XML' );
@@ -214,24 +193,6 @@ class Preprocessor_DOM implements Preprocessor {
         * @return string
         */
        public function preprocessToXml( $text, $flags = 0 ) {
-               $rules = array(
-                       '{' => array(
-                               'end' => '}',
-                               'names' => array(
-                                       2 => 'template',
-                                       3 => 'tplarg',
-                               ),
-                               'min' => 2,
-                               'max' => 3,
-                       ),
-                       '[' => array(
-                               'end' => ']',
-                               'names' => array( 2 => null ),
-                               'min' => 2,
-                               'max' => 2,
-                       )
-               );
-
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -349,9 +310,9 @@ class Preprocessor_DOM implements Preprocessor {
                                                }
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
-                                       } elseif ( isset( $rules[$curChar] ) ) {
+                                       } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
-                                               $rule = $rules[$curChar];
+                                               $rule = $this->rules[$curChar];
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -648,7 +609,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
-                               $rule = $rules[$piece->open];
+                               $rule = $this->rules[$piece->open];
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -717,7 +678,7 @@ class Preprocessor_DOM implements Preprocessor {
                                        $piece->parts = array( new PPDPart );
                                        $piece->count -= $matchingCount;
                                        # do we still qualify for any callback with remaining count?
-                                       $min = $rules[$piece->open]['min'];
+                                       $min = $this->rules[$piece->open]['min'];
                                        if ( $piece->count >= $min ) {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
index 49fa8a1..4f12414 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Parser
  */
 // @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
-class Preprocessor_Hash implements Preprocessor {
+class Preprocessor_Hash extends Preprocessor {
        // @codingStandardsIgnoreEnd
 
        /**
@@ -36,7 +36,7 @@ class Preprocessor_Hash implements Preprocessor {
         */
        public $parser;
 
-       const CACHE_VERSION = 1;
+       const CACHE_PREFIX = 'preprocess-hash';
 
        public function __construct( $parser ) {
                $this->parser = $parser;
@@ -88,6 +88,7 @@ class Preprocessor_Hash implements Preprocessor {
                return $node;
        }
 
+
        /**
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
@@ -112,45 +113,11 @@ class Preprocessor_Hash implements Preprocessor {
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               // Check cache.
-               global $wgMemc, $wgPreprocessorCacheThreshold;
-
-               $cacheable = $wgPreprocessorCacheThreshold !== false
-                       && strlen( $text ) > $wgPreprocessorCacheThreshold;
-
-               if ( $cacheable ) {
-                       $cacheKey = wfMemcKey( 'preprocess-hash', md5( $text ), $flags );
-                       $cacheValue = $wgMemc->get( $cacheKey );
-                       if ( $cacheValue ) {
-                               $version = substr( $cacheValue, 0, 8 );
-                               if ( intval( $version ) == self::CACHE_VERSION ) {
-                                       $hash = unserialize( substr( $cacheValue, 8 ) );
-                                       // From the cache
-                                       wfDebugLog( "Preprocessor",
-                                               "Loaded preprocessor hash from memcached (key $cacheKey)" );
-                                       return $hash;
-                               }
-                       }
+               $tree = $this->cacheGetTree( $text, $flags );
+               if ( $tree !== false ) {
+                       return unserialize( $tree );
                }
 
-               $rules = array(
-                       '{' => array(
-                               'end' => '}',
-                               'names' => array(
-                                       2 => 'template',
-                                       3 => 'tplarg',
-                               ),
-                               'min' => 2,
-                               'max' => 3,
-                       ),
-                       '[' => array(
-                               'end' => ']',
-                               'names' => array( 2 => null ),
-                               'min' => 2,
-                               'max' => 2,
-                       )
-               );
-
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -267,9 +234,9 @@ class Preprocessor_Hash implements Preprocessor {
                                                }
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
-                                       } elseif ( isset( $rules[$curChar] ) ) {
+                                       } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
-                                               $rule = $rules[$curChar];
+                                               $rule = $this->rules[$curChar];
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -572,7 +539,7 @@ class Preprocessor_Hash implements Preprocessor {
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
-                               $rule = $rules[$piece->open];
+                               $rule = $this->rules[$piece->open];
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -629,13 +596,11 @@ class Preprocessor_Hash implements Preprocessor {
                                                                $lastNode = $node;
                                                        }
                                                        if ( !$node ) {
-                                                               if ( $cacheable ) {
-                                                               }
+                                                               // if ( $cacheable ) { ... }
                                                                throw new MWException( __METHOD__ . ': eqpos not found' );
                                                        }
                                                        if ( $node->name !== 'equals' ) {
-                                                               if ( $cacheable ) {
-                                                               }
+                                                               // if ( $cacheable ) { ... }
                                                                throw new MWException( __METHOD__ . ': eqpos is not equals' );
                                                        }
                                                        $equalsNode = $node;
@@ -685,7 +650,7 @@ class Preprocessor_Hash implements Preprocessor {
                                        $piece->parts = array( new PPDPart_Hash );
                                        $piece->count -= $matchingCount;
                                        # do we still qualify for any callback with remaining count?
-                                       $min = $rules[$piece->open]['min'];
+                                       $min = $this->rules[$piece->open]['min'];
                                        if ( $piece->count >= $min ) {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
@@ -732,15 +697,7 @@ class Preprocessor_Hash implements Preprocessor {
                $rootNode->lastChild = $stack->rootAccum->lastNode;
 
                // Cache
-               if ( $cacheable ) {
-                       $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );
-
-                       // T111289: Cache values should not exceed 1 Mb, but they do.
-                       if ( strlen( $cacheValue ) <= 1e6 ) {
-                               $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                               wfDebugLog( "Preprocessor", "Saved preprocessor Hash to memcached (key $cacheKey)" );
-                       }
-               }
+               $this->cacheSetTree( $text, $flags, serialize( $rootNode ) );
 
                return $rootNode;
        }
index d601467..3c60ea9 100644 (file)
@@ -147,6 +147,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        $logger->info( '{time} {title}', array(
                                'time' => number_format( $time, 2 ),
                                'title' => $this->page->getTitle()->getPrefixedDBkey(),
+                               'trigger' => 'view',
                        ) );
                }
 
index 9fd5a36..4d643bf 100644 (file)
@@ -192,8 +192,8 @@ abstract class Profiler {
                $outputs = array();
                foreach ( $this->params['output'] as $outputType ) {
                        // The class may be specified as either the full class name (for
-                       // example, 'ProfilerOutputUdp') or (for backward compatibility)
-                       // the trailing portion of the class name (for example, 'udp').
+                       // example, 'ProfilerOutputStats') or (for backward compatibility)
+                       // the trailing portion of the class name (for example, 'stats').
                        $outputClass = strpos( $outputType, 'ProfilerOutput' ) === false
                                ? 'ProfilerOutput' . ucfirst( $outputType )
                                : $outputType;
index 46d6119..2c9d108 100644 (file)
@@ -201,10 +201,10 @@ class TransactionProfiler implements LoggerAwareInterface {
                }
                // Report slow queries...
                if ( !$isWrite && $elapsed > $this->expect['readQueryTime'] ) {
-                       $this->reportExpectationViolated( 'readQueryTime', $query );
+                       $this->reportExpectationViolated( 'readQueryTime', $query, $elapsed );
                }
                if ( $isWrite && $elapsed > $this->expect['writeQueryTime'] ) {
-                       $this->reportExpectationViolated( 'writeQueryTime', $query );
+                       $this->reportExpectationViolated( 'writeQueryTime', $query, $elapsed );
                }
 
                if ( !$this->dbTrxHoldingLocks ) {
@@ -259,8 +259,11 @@ class TransactionProfiler implements LoggerAwareInterface {
 
                // Warn if too much time was spend writing...
                if ( $writeTime > $this->expect['writeQueryTime'] ) {
-                       $this->reportExpectationViolated( 'writeQueryTime',
-                               "[transaction $id writes to {$server} ({$db})]" );
+                       $this->reportExpectationViolated(
+                               'writeQueryTime',
+                               "[transaction $id writes to {$server} ({$db})]",
+                               $writeTime
+                       );
                        $slow = true;
                }
                // Fill in the last non-query period...
@@ -296,14 +299,15 @@ class TransactionProfiler implements LoggerAwareInterface {
        /**
         * @param string $expect
         * @param string $query
+        * @param string|float|int $actual [optional]
         */
-       protected function reportExpectationViolated( $expect, $query ) {
-               global $wgRequest;
-
+       protected function reportExpectationViolated( $expect, $query, $actual = null ) {
                $n = $this->expect[$expect];
                $by = $this->expectBy[$expect];
+               $actual = ( $actual !== null ) ? " (actual: $actual)" : "";
+
                $this->logger->info(
-                       "[{$wgRequest->getMethod()}] Expectation ($expect <= $n) by $by not met:\n$query\n" .
+                       "Expectation ($expect <= $n) by $by not met$actual:\n$query\n" .
                        wfBacktrace( true )
                );
        }
diff --git a/includes/profiler/output/ProfilerOutputUdp.php b/includes/profiler/output/ProfilerOutputUdp.php
deleted file mode 100644 (file)
index a562677..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * Profiler sending messages over UDP.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Profiler
- */
-
-/**
- * ProfilerSimpleUDP class, that sends out messages for 'udpprofile' daemon
- * (see https://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
- *
- * @ingroup Profiler
- * @since 1.25
- */
-class ProfilerOutputUdp extends ProfilerOutput {
-       /** @var int port to send profiling data to */
-       private $port = 3811;
-
-       /** @var string host to send profiling data to */
-       private $host = '127.0.0.1';
-
-       /** @var string format string for profiling data */
-       private $format = "%s - %d %f %f %f %f %s\n";
-
-       public function __construct( Profiler $collector, array $params ) {
-               parent::__construct( $collector, $params );
-               global $wgUDPProfilerPort, $wgUDPProfilerHost, $wgUDPProfilerFormatString;
-
-               // Initialize port, host, and format from config, back-compat if available
-               if ( isset( $this->params['udpport'] ) ) {
-                       $this->port = $this->params['udpport'];
-               } elseif ( $wgUDPProfilerPort ) {
-                       $this->port = $wgUDPProfilerPort;
-               }
-
-               if ( isset( $this->params['udphost'] ) ) {
-                       $this->host = $this->params['udphost'];
-               } elseif ( $wgUDPProfilerHost ) {
-                       $this->host = $wgUDPProfilerHost;
-               }
-
-               if ( isset( $this->params['udpformat'] ) ) {
-                       $this->format = $this->params['udpformat'];
-               } elseif ( $wgUDPProfilerFormatString ) {
-                       $this->format = $wgUDPProfilerFormatString;
-               }
-       }
-
-       public function canUse() {
-               # Sockets are not enabled
-               return function_exists( 'socket_create' );
-       }
-
-       public function log( array $stats ) {
-               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-               $plength = 0;
-               $packet = "";
-               foreach ( $stats as $pfdata ) {
-                       $pfline = sprintf( $this->format,
-                               $this->collector->getProfileID(),
-                               $pfdata['calls'],
-                               $pfdata['cpu'] / 1000, // ms => sec
-                               0.0, // sum of CPU^2 for each invocation (unused)
-                               $pfdata['real'] / 1000, // ms => sec
-                               0.0, // sum of real^2 for each invocation (unused)
-                               $pfdata['name'],
-                               $pfdata['memory']
-                       );
-                       $length = strlen( $pfline );
-                       if ( $length + $plength > 1400 ) {
-                               socket_sendto( $sock, $packet, $plength, 0, $this->host, $this->port );
-                               $packet = "";
-                               $plength = 0;
-                       }
-                       $packet .= $pfline;
-                       $plength += $length;
-               }
-               socket_sendto( $sock, $packet, $plength, 0x100, $this->host, $this->port );
-       }
-}
index 59b9249..732b4a0 100644 (file)
@@ -86,7 +86,7 @@ class ExtensionRegistry {
                // we don't want to fail here if $wgObjectCaches is not configured
                // properly for APC setup
                try {
-                       $this->cache = ObjectCache::newAccelerator();
+                       $this->cache = ObjectCache::getLocalServerInstance();
                } catch ( MWException $e ) {
                        $this->cache = new EmptyBagOStuff();
                }
index 5967537..1db9ce5 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Derivative context for resource loader modules.
+ * Derivative context for ResourceLoader modules.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1221a2d..d9416e4 100644 (file)
@@ -197,9 +197,9 @@ class ResourceLoader implements LoggerAwareInterface {
                }
 
                $stats = RequestContext::getMain()->getStats();
-               $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
+               $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
 
-               $key = wfGlobalCacheKey(
+               $key = $cache->makeGlobalKey(
                        'resourceloader',
                        'filter',
                        $filter,
@@ -322,11 +322,11 @@ class ResourceLoader implements LoggerAwareInterface {
                // Allow multiple modules to be registered in one call
                $registrations = is_array( $name ) ? $name : array( $name => $info );
                foreach ( $registrations as $name => $info ) {
-                       // Disallow duplicate registrations
+                       // Warn on duplicate registrations
                        if ( isset( $this->moduleInfos[$name] ) ) {
                                // A module has already been registered by this name
-                               throw new MWException(
-                                       'ResourceLoader duplicate registration error. ' .
+                               $this->logger->warning(
+                                       'ResourceLoader duplicate registration warning. ' .
                                        'Another module has already been registered as ' . $name
                                );
                        }
@@ -708,8 +708,11 @@ class ResourceLoader implements LoggerAwareInterface {
 
                // Capture any PHP warnings from the output buffer and append them to the
                // error list if we're in debug mode.
-               if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
-                       $this->errors[] = $warnings;
+               if ( $context->getDebug() ) {
+                       $warnings = ob_get_contents();
+                       if ( strlen( $warnings ) ) {
+                               $this->errors[] = $warnings;
+                       }
                }
 
                // Save response to file cache unless there are errors
@@ -799,11 +802,6 @@ class ResourceLoader implements LoggerAwareInterface {
                        $exp = min( $maxage, $smaxage );
                        header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) );
                }
-
-               // Send the current time expressed as fractional seconds since epoch,
-               // with microsecond precision. This helps distinguish hits from misses
-               // in edge caches.
-               header( 'MediaWiki-Timestamp: ' . microtime( true ) );
        }
 
        /**
@@ -877,8 +875,11 @@ class ResourceLoader implements LoggerAwareInterface {
                        $response = $fileCache->fetchText();
                        // Capture any PHP warnings from the output buffer and append them to the
                        // response in a comment if we're in debug mode.
-                       if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
-                               $response = self::makeComment( $warnings ) . $response;
+                       if ( $context->getDebug() ) {
+                               $warnings = ob_get_contents();
+                               if ( strlen( $warnings ) ) {
+                                       $response = self::makeComment( $warnings ) . $response;
+                               }
                        }
                        // Remove the output buffer and output the response
                        ob_end_clean();
index 2e1752a..6c4cdfe 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Context for resource loader modules.
+ * Context for ResourceLoader modules.
  *
  * 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
@@ -158,8 +158,16 @@ class ResourceLoaderContext {
         */
        public function getLanguage() {
                if ( $this->language === null ) {
-                       // Must be a valid language code after this point (bug 62849)
-                       $this->language = RequestContext::sanitizeLangCode( $this->getRequest()->getVal( 'lang' ) );
+                       // Must be a valid language code after this point (T64849)
+                       // Only support uselang values that follow built-in conventions (T102058)
+                       $lang = $this->getRequest()->getVal( 'lang', '' );
+                       // Stricter version of RequestContext::sanitizeLangCode()
+                       if ( !Language::isValidBuiltInCode( $lang ) ) {
+                               wfDebug( "Invalid user language code\n" );
+                               global $wgLanguageCode;
+                               $lang = $wgLanguageCode;
+                       }
+                       $this->language = $lang;
                }
                return $this->language;
        }
index f811231..2a6af71 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for the edit toolbar.
+ * ResourceLoader module for the edit toolbar.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -37,7 +37,7 @@ class ResourceLoaderEditToolbarModule extends ResourceLoaderFileModule {
                $vars = parent::getLessVars( $context );
                $language = Language::factory( $context->getLanguage() );
                foreach ( $language->getImageFiles() as $key => $value ) {
-                       $vars[ $key ] = CSSMin::serializeStringValue( $value );
+                       $vars[$key] = CSSMin::serializeStringValue( $value );
                }
                return $vars;
        }
index bc17821..1421b10 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module based on local JavaScript/CSS files.
+ * ResourceLoader module based on local JavaScript/CSS files.
  *
  * 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
@@ -73,15 +73,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected $debugScripts = array();
 
-       /**
-        * @var array List of paths to JavaScript files to include in the startup module
-        * @par Usage:
-        * @code
-        * array( [file-path], [file-path], ... )
-        * @endcode
-        */
-       protected $loaderScripts = array();
-
        /**
         * @var array List of paths to CSS files to always include
         * @par Usage:
@@ -195,8 +186,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         ),
         *         // Scripts to include in debug contexts
         *         'debugScripts' => [file path string or array of file path strings],
-        *         // Scripts to include in the startup module
-        *         'loaderScripts' => [file path string or array of file path strings],
         *         // Modules which must be loaded before this module
         *         'dependencies' => [module name string or array of module name strings],
         *         'templates' => array(
@@ -239,7 +228,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                // Lists of file paths
                                case 'scripts':
                                case 'debugScripts':
-                               case 'loaderScripts':
                                case 'styles':
                                        $this->{$member} = (array)$option;
                                        break;
@@ -279,7 +267,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        break;
                                // Single strings
                                case 'position':
-                                       $this->isPositionDefined = true;
                                case 'group':
                                case 'skipFunction':
                                        $this->{$member} = (string)$option;
@@ -391,18 +378,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->debugRaw;
        }
 
-       /**
-        * Get loader script.
-        *
-        * @return string|bool JavaScript code to be added to startup module
-        */
-       public function getLoaderScript() {
-               if ( count( $this->loaderScripts ) === 0 ) {
-                       return false;
-               }
-               return $this->readScriptFiles( $this->loaderScripts );
-       }
-
        /**
         * Get all styles for a given context.
         *
@@ -552,8 +527,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $this->templates,
                        $context->getDebug() ? $this->debugScripts : array(),
                        $this->getLanguageScripts( $context->getLanguage() ),
-                       self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
-                       $this->loaderScripts
+                       self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' )
                );
                if ( $this->skipFunction ) {
                        $files[] = $this->skipFunction;
@@ -593,7 +567,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        // - position (only used by OutputPage)
                        'scripts',
                        'debugScripts',
-                       'loaderScripts',
                        'styles',
                        'languageScripts',
                        'skinScripts',
@@ -962,7 +935,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                static $cache;
 
                if ( !$cache ) {
-                       $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
+                       $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                }
 
                // Construct a cache key from the LESS file name and a hash digest
@@ -970,7 +943,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $vars = $this->getLessVars( $context );
                ksort( $vars );
                $varsHash = hash( 'md4', serialize( $vars ) );
-               $cacheKey = wfGlobalCacheKey( 'LESS', $fileName, $varsHash );
+               $cacheKey = $cache->makeGlobalKey( 'LESS', $fileName, $varsHash );
                $cachedCompile = $cache->get( $cacheKey );
 
                // If we got a cached value, we have to validate it by getting a
index 8de87f2..8fd94f7 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for generated and embedded images.
+ * ResourceLoader module for generated and embedded images.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@
  */
 
 /**
- * Resource loader module for generated and embedded images.
+ * ResourceLoader module for generated and embedded images.
  *
  * @since 1.25
  */
@@ -184,7 +184,6 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                        break;
 
                                case 'position':
-                                       $this->isPositionDefined = true;
                                case 'prefix':
                                case 'selectorWithoutVariant':
                                case 'selectorWithVariant':
@@ -456,9 +455,4 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $this->loadFromDefinition();
                return $this->position;
        }
-
-       public function isPositionDefault() {
-               $this->loadFromDefinition();
-               return parent::isPositionDefault();
-       }
 }
index 27c74d7..83db567 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for populating language specific data.
+ * ResourceLoader module for populating language specific data.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 081c728..3c6e1fa 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for providing language names.
+ * ResourceLoader module for providing language names.
  *
  * By default these names will be autonyms however other extensions may
  * provided language names in the context language (e.g. cldr extension)
index c50e8b2..63ba5c1 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Abstraction for resource loader modules.
+ * Abstraction for ResourceLoader modules.
  *
  * 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
@@ -23,7 +23,7 @@
  */
 
 /**
- * Abstraction for resource loader modules, with name registration and maxage functionality.
+ * Abstraction for ResourceLoader modules, with name registration and maxage functionality.
  */
 abstract class ResourceLoaderModule {
        # Type of resource
@@ -67,10 +67,6 @@ abstract class ResourceLoaderModule {
        // In-object cache for module content
        protected $contents = array();
 
-       // Whether the position returned by getPosition() is defined in the module configuration
-       // and not a default value
-       protected $isPositionDefined = false;
-
        /**
         * @var Config
         */
@@ -291,19 +287,6 @@ abstract class ResourceLoaderModule {
                return 'bottom';
        }
 
-       /**
-        * Whether the position returned by getPosition() is a default value or comes from the module
-        * definition. This method is meant to be short-lived, and is only useful until classes added
-        * via addModuleStyles with a default value define an explicit position. See getModuleStyles()
-        * in OutputPage for the related migration warning.
-        *
-        * @return bool
-        * @since  1.26
-        */
-       public function isPositionDefault() {
-               return !$this->isPositionDefined;
-       }
-
        /**
         * Whether this module's JS expects to work without the client-side ResourceLoader module.
         * Returning true from this function will prevent mw.loader.state() call from being
@@ -315,25 +298,12 @@ abstract class ResourceLoaderModule {
                return false;
        }
 
-       /**
-        * Get the loader JS for this module, if set.
-        *
-        * @return mixed JavaScript loader code as a string or boolean false if no custom loader set
-        */
-       public function getLoaderScript() {
-               // Stub, override expected
-               return false;
-       }
-
        /**
         * Get a list of modules this module depends on.
         *
         * Dependency information is taken into account when loading a module
         * on the client side.
         *
-        * To add dependencies dynamically on the client side, use a custom
-        * loader script, see getLoaderScript()
-        *
         * Note: It is expected that $context will be made non-optional in the near
         * future.
         *
@@ -874,14 +844,13 @@ abstract class ResourceLoaderModule {
        protected function validateScriptFile( $fileName, $contents ) {
                if ( $this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) {
                        // Try for cache hit
-                       // Use CACHE_ANYTHING since parsing JS is much slower than a DB query
-                       $key = wfMemcKey(
+                       $cache = ObjectCache::getLocalClusterInstance();
+                       $key = $cache->makeKey(
                                'resourceloader',
                                'jsparse',
                                self::$parseCacheVersion,
                                md5( $contents )
                        );
-                       $cache = wfGetCache( CACHE_ANYTHING );
                        $cacheEntry = $cache->get( $key );
                        if ( is_string( $cacheEntry ) ) {
                                return $cacheEntry;
index 380b7a5..eba6815 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for site customizations.
+ * ResourceLoader module for site customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 911d953..e1df6d9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for skin stylesheets.
+ * ResourceLoader module for skin stylesheets.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8170cb1..862f629 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for populating special characters data for some
+ * ResourceLoader module for populating special characters data for some
  * editing extensions to use.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -22,7 +22,7 @@
  */
 
 /**
- * Resource loader module for populating special characters data for some
+ * ResourceLoader module for populating special characters data for some
  * editing extensions to use.
  */
 class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule {
index 4a672f2..e900200 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Module for resource loader initialization.
+ * Module for ResourceLoader initialization.
  *
  * 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
@@ -163,13 +163,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         *  - array 'dependencies'
         *  - string|null 'group'
         *  - string 'source'
-        *  - string|false 'loader'
         */
        public static function compileUnresolvedDependencies( array &$registryData ) {
                foreach ( $registryData as $name => &$data ) {
-                       if ( $data['loader'] !== false ) {
-                               continue;
-                       }
                        $dependencies = $data['dependencies'];
                        foreach ( $data['dependencies'] as $dependency ) {
                                $implicitDependencies = self::getImplicitDependencies( $registryData, $dependency );
@@ -230,7 +226,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                'dependencies' => $module->getDependencies( $context ),
                                'group' => $module->getGroup(),
                                'source' => $module->getSource(),
-                               'loader' => $module->getLoaderScript(),
                                'skip' => $skipFunction,
                        );
                }
@@ -240,22 +235,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
 
-               // Concatenate module loader scripts and figure out the different call
-               // signatures for mw.loader.register
+               // Figure out the different call signatures for mw.loader.register
                $registrations = array();
                foreach ( $registryData as $name => $data ) {
-                       if ( $data['loader'] !== false ) {
-                               $out .= ResourceLoader::makeCustomLoaderScript(
-                                       $name,
-                                       $data['version'],
-                                       $data['dependencies'],
-                                       $data['group'],
-                                       $data['source'],
-                                       $data['loader']
-                               );
-                               continue;
-                       }
-
                        // Call mw.loader.register(name, version, dependencies, group, source, skip)
                        $registrations[] = array(
                                $name,
index 65d770e..6705336 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user preference customizations.
+ * ResourceLoader module for user preference customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index eba61ed..abcf9c6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for default user preferences.
+ * ResourceLoader module for default user preferences.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 417cfce..dd4dd5c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user customizations.
+ * ResourceLoader module for user customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a097844..d45e281 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user customizations.
+ * ResourceLoader module for user customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0847109..94f1e68 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user preference customizations.
+ * ResourceLoader module for user preference customizations.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 28f1b9a..d37aa55 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user tokens.
+ * ResourceLoader module for user tokens.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0023de2..52eb2d8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Abstraction for resource loader modules which pull from wiki pages.
+ * Abstraction for ResourceLoader modules that pull from wiki pages.
  *
  * 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
@@ -23,7 +23,7 @@
  */
 
 /**
- * Abstraction for resource loader modules which pull from wiki pages
+ * Abstraction for ResourceLoader modules which pull from wiki pages
  *
  * This can only be used for wiki pages in the MediaWiki and User namespaces,
  * because of its dependence on the functionality of Title::isCssJsSubpage.
@@ -72,8 +72,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                foreach ( $options as $member => $option ) {
                        switch ( $member ) {
                                case 'position':
-                                       $this->isPositionDefined = true;
-                                       // Don't break since we need the member set as well
                                case 'styles':
                                case 'scripts':
                                case 'group':
@@ -214,7 +212,8 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        if ( $this->getFlip( $context ) ) {
                                $style = CSSJanus::transform( $style, true, false );
                        }
-                       $style = CSSMin::remap( $style, false, $this->getConfig()->get( 'ScriptPath' ), true );
+                       $style = MemoizedCallable::call( 'CSSMin::remap',
+                               array( $style, false, $this->getConfig()->get( 'ScriptPath' ), true ) );
                        if ( !isset( $styles[$media] ) ) {
                                $styles[$media] = array();
                        }
index 7aac3b8..7ffb427 100644 (file)
@@ -73,6 +73,25 @@ abstract class RevDelList extends RevisionListBase {
                return $target;
        }
 
+       /**
+        * Indicate whether any item in this list is suppressed
+        * @since 1.25
+        * @return bool
+        */
+       public function areAnySuppressed() {
+               $bit = $this->getSuppressBit();
+
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+               for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
+                       $item = $this->current();
+                       if ( $item->getBits() & $bit ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
        /**
         * Set the visibility for the revisions in this list. Logging and
         * transactions are done here.
index 6178756..8fb04e4 100644 (file)
  * @ingroup Search
  */
 class SearchResultSet {
+
+       /**
+        * Types of interwiki results
+        */
+       /**
+        * Results that are displayed only together with existing main wiki results
+        * @var int
+        */
+       const SECONDARY_RESULTS = 0;
+       /**
+        * Results that can displayed even if no existing main wiki results exist
+        * @var int
+        */
+       const INLINE_RESULTS = 1;
+
        protected $containedSyntax = false;
 
        public function __construct( $containedSyntax = false ) {
@@ -116,7 +131,7 @@ class SearchResultSet {
         *
         * @return SearchResultSet
         */
-       function getInterwikiResults() {
+       function getInterwikiResults( $type = self::SECONDARY_RESULTS ) {
                return null;
        }
 
@@ -125,8 +140,8 @@ class SearchResultSet {
         *
         * @return bool
         */
-       function hasInterwikiResults() {
-               return $this->getInterwikiResults() != null;
+       function hasInterwikiResults( $type = self::SECONDARY_RESULTS ) {
+               return false;
        }
 
        /**
index 4e6201c..08e4885 100644 (file)
@@ -180,7 +180,7 @@ abstract class Skin extends ContextSource {
         * @return array Array of modules with helper keys for easy overriding
         */
        public function getDefaultModules() {
-               global $wgUseAjax, $wgAjaxWatch, $wgEnableAPI, $wgEnableWriteAPI;
+               global $wgUseAjax, $wgEnableAPI, $wgEnableWriteAPI;
 
                $out = $this->getOutput();
                $user = $out->getUser();
@@ -201,7 +201,7 @@ abstract class Skin extends ContextSource {
 
                // Add various resources if required
                if ( $wgUseAjax && $wgEnableAPI ) {
-                       if ( $wgEnableWriteAPI && $wgAjaxWatch && $user->isLoggedIn()
+                       if ( $wgEnableWriteAPI && $user->isLoggedIn()
                                && $user->isAllowedAll( 'writeapi', 'viewmywatchlist', 'editmywatchlist' )
                                && $this->getRelevantTitle()->canExist()
                        ) {
@@ -1225,29 +1225,31 @@ abstract class Skin extends ContextSource {
        function buildSidebar() {
                global $wgEnableSidebarCache, $wgSidebarCacheExpiry;
 
-               $cache = ObjectCache::getMainWANInstance();
-               $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() );
+               $that = $this;
+               $callback = function () use ( $that ) {
+                       $bar = array();
+                       $that->addToSidebar( $bar, 'sidebar' );
+                       Hooks::run( 'SkinBuildSidebar', array( $that, &$bar ) );
 
-               if ( $wgEnableSidebarCache ) {
-                       $cachedsidebar = $cache->get( $key );
-                       if ( $cachedsidebar ) {
-                               Hooks::run( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) );
-
-                               return $cachedsidebar;
-                       }
-               }
+                       return $bar;
+               };
 
-               $bar = array();
-               $this->addToSidebar( $bar, 'sidebar' );
-
-               Hooks::run( 'SkinBuildSidebar', array( $this, &$bar ) );
                if ( $wgEnableSidebarCache ) {
-                       $cache->set( $key, $bar, $wgSidebarCacheExpiry );
+                       $cache = ObjectCache::getMainWANInstance();
+                       $sidebar = $cache->getWithSetCallback(
+                               $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ),
+                               $wgSidebarCacheExpiry,
+                               $callback,
+                               array( 'lockTSE' => 30 )
+                       );
+               } else {
+                       $sidebar = $callback();
                }
 
-               Hooks::run( 'SidebarBeforeOutput', array( $this, &$bar ) );
+               // Apply post-processing to the cached value
+               Hooks::run( 'SidebarBeforeOutput', array( $this, &$sidebar ) );
 
-               return $bar;
+               return $sidebar;
        }
 
        /**
@@ -1259,7 +1261,7 @@ abstract class Skin extends ContextSource {
         * @param array $bar
         * @param string $message
         */
-       function addToSidebar( &$bar, $message ) {
+       public function addToSidebar( &$bar, $message ) {
                $this->addToSidebarPlain( $bar, wfMessage( $message )->inContentLanguage()->plain() );
        }
 
index ccdf3fa..74842aa 100644 (file)
@@ -136,6 +136,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return FormOptions
         */
        public function getDefaultOptions() {
+               $config = $this->getConfig();
                $opts = new FormOptions();
 
                $opts->add( 'hideminor', false );
@@ -145,6 +146,10 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts->add( 'hidepatrolled', false );
                $opts->add( 'hidemyself', false );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $opts->add( 'hidecategorization', false );
+               }
+
                $opts->add( 'namespace', '', FormOptions::INTNULL );
                $opts->add( 'invert', false );
                $opts->add( 'associated', false );
@@ -249,6 +254,11 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
                        }
                }
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' )
+                       && $opts['hidecategorization'] === true
+               ) {
+                       $conds[] = 'rc_type != ' . $dbr->addQuotes( RC_CATEGORIZE );
+               }
 
                // Namespace filtering
                if ( $opts['namespace'] !== '' ) {
index c4a67c0..0c1a941 100644 (file)
@@ -100,7 +100,6 @@ class SpecialAllPages extends IncludableSpecialPage {
         */
        function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
                $t = $this->getPageTitle();
-
                $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
                $out .= Xml::openElement(
                        'form',
@@ -148,7 +147,6 @@ class SpecialAllPages extends IncludableSpecialPage {
                $out .= Xml::closeElement( 'fieldset' );
                $out .= Xml::closeElement( 'form' );
                $out .= Xml::closeElement( 'div' );
-
                return $out;
        }
 
@@ -216,7 +214,9 @@ class SpecialAllPages extends IncludableSpecialPage {
                        );
 
                        if ( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'ul', array( 'class' => 'mw-allpages-chunk' ) );
+                               $out = Html::openElement( 'div', array( 'class' => 'mw-allpages-body' ) );
+                               $out .= Html::openElement( 'ul', array( 'class' => 'mw-allpages-chunk' ) );
+
                                while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                        $t = Title::newFromRow( $s );
                                        if ( $t ) {
@@ -230,7 +230,8 @@ class SpecialAllPages extends IncludableSpecialPage {
                                        }
                                        $n++;
                                }
-                               $out .= Xml::closeElement( 'ul' );
+                               $out .= Html::closeElement( 'ul' );
+                               $out .= Html::closeElement( 'div' );
                        } else {
                                $out = '';
                        }
@@ -270,14 +271,10 @@ class SpecialAllPages extends IncludableSpecialPage {
                        return;
                }
 
+               $navLinks = array();
                $self = $this->getPageTitle();
 
-               $topLinks = array(
-                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
-               );
-               $bottomLinks = array();
-
-               # Do we put a previous link ?
+               // Generate a "previous page" link if needed
                if ( $prevTitle ) {
                        $query = array( 'from' => $prevTitle->getText() );
 
@@ -289,16 +286,16 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $prevLink = Linker::linkKnown(
+                       $navLinks[] = Linker::linkKnown(
                                $self,
                                $this->msg( 'prevpage', $prevTitle->getText() )->escaped(),
                                array(),
                                $query
                        );
-                       $topLinks[] = $prevLink;
-                       $bottomLinks[] = $prevLink;
+
                }
 
+               // Generate a "next page" link if needed
                if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
                        # $s is the first link of the next chunk
                        $t = Title::makeTitle( $namespace, $s->page_title );
@@ -312,36 +309,28 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $nextLink = Linker::linkKnown(
+                       $navLinks[] = Linker::linkKnown(
                                $self,
                                $this->msg( 'nextpage', $t->getText() )->escaped(),
                                array(),
                                $query
                        );
-                       $topLinks[] = $nextLink;
-                       $bottomLinks[] = $nextLink;
                }
 
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                       '<tr>
-                                               <td>' .
-                       $nsForm .
-                       '</td>
-                                               <td class="mw-allpages-nav">' .
-                       $this->getLanguage()->pipeList( $topLinks ) .
-                       '</td></tr></table>';
-
-               $output->addHTML( $out2 . $out );
-
-               if ( count( $bottomLinks ) ) {
-                       $output->addHTML(
-                               Html::element( 'hr' ) .
-                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                               $this->getLanguage()->pipeList( $bottomLinks )
-                                       )
+               $topOut = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
+
+               if ( count( $navLinks ) ) {
+                       // Add pagination links
+                       $pagination = Html::rawElement( 'div',
+                               array( 'class' => 'mw-allpages-nav' ),
+                               $this->getLanguage()->pipeList( $navLinks )
                        );
+
+                       $topOut .= $pagination;
+                       $out .= Html::element( 'hr' ) . $pagination; // Footer
                }
+
+               $output->addHTML( $topOut . $out );
        }
 
        /**
index cd6cc76..e125d94 100644 (file)
@@ -361,6 +361,8 @@ class SpecialBlock extends FormSpecialPage {
        protected function postText() {
                $links = array();
 
+               $this->getOutput()->addModuleStyles( 'mediawiki.special' );
+
                # Link to the user's contributions, if applicable
                if ( $this->target instanceof User ) {
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->target->getName() );
index 9672580..f0a5aa6 100644 (file)
@@ -107,7 +107,8 @@ class SpecialContributions extends IncludableSpecialPage {
                        )->inContentLanguage() );
                }
 
-               if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+               $ns = $request->getVal( 'namespace', null );
+               if ( $ns !== null && $ns !== '' ) {
                        $this->opts['namespace'] = intval( $ns );
                } else {
                        $this->opts['namespace'] = '';
index 44352a7..6f8e786 100644 (file)
@@ -413,7 +413,8 @@ class DeletedContributionsPage extends SpecialPage {
                $target = $userObj->getName();
                $out->addSubtitle( $this->getSubTitle( $userObj ) );
 
-               if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+               $ns = $request->getVal( 'namespace', null );
+               if ( $ns !== null && $ns !== '' ) {
                        $options['namespace'] = intval( $ns );
                } else {
                        $options['namespace'] = '';
index b7582e6..06eb276 100644 (file)
@@ -114,7 +114,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        }
 
                        $config = $this->getConfig();
-                       if ( ( $config->get( 'UseTidy' ) && $options->getTidy() ) || $config->get( 'AlwaysUseTidy' ) ) {
+                       if ( $config->get( 'UseTidy' ) && $options->getTidy() ) {
                                $tmp = MWTidy::tidy( $tmp );
                        }
 
index 4c0c75f..8c9a76b 100644 (file)
@@ -151,6 +151,7 @@ class FileDuplicateSearchPage extends QueryPage {
                        if ( $img ) {
                                $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
                                if ( $thumb ) {
+                                       $out->addModuleStyles( 'mediawiki.special' );
                                        $out->addHTML( '<div id="mw-fileduplicatesearch-icon">' .
                                                $thumb->toHtml( array( 'desc-link' => false ) ) . '<br />' .
                                                $this->msg( 'fileduplicatesearch-info' )->numParams(
index 6756f27..177c19b 100644 (file)
@@ -197,4 +197,8 @@ class SpecialPageLanguage extends FormSpecialPage {
                LogEventsList::showLogExtract( $out2, 'pagelang', $title );
                return $out1 . $out2;
        }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index d92010a..fbe5ab3 100644 (file)
@@ -36,9 +36,6 @@ class SpecialPrefixindex extends SpecialAllPages {
 
        protected $hideRedirects = false;
 
-       // number of columns in output table
-       protected $columns = 3;
-
        // Inherit $maxPerPage
 
        function __construct() {
@@ -66,7 +63,6 @@ class SpecialPrefixindex extends SpecialAllPages {
                $namespace = (int)$ns; // if no namespace given, use 0 (NS_MAIN).
                $this->hideRedirects = $request->getBool( 'hideredirects', $this->hideRedirects );
                $this->stripPrefix = $request->getBool( 'stripprefix', $this->stripPrefix );
-               $this->columns = $request->getInt( 'columns', $this->columns );
 
                $namespaces = $wgContLang->getNamespaces();
                $out->setPageTitle(
@@ -205,11 +201,12 @@ class SpecialPrefixindex extends SpecialAllPages {
                                )
                        );
 
-                       # ## @todo FIXME: Side link to previous
+                       // @todo FIXME: Side link to previous
 
                        $n = 0;
                        if ( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'table', array( 'class' => 'mw-prefixindex-list-table' ) );
+                               $out = Html::openElement( 'div', array( 'class' => 'mw-prefixindex-body' ) );
+                               $out .= Html::openElement( 'ul', array( 'class' => 'mw-prefixindex-list' ) );
 
                                $prefixLength = strlen( $prefix );
                                while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
@@ -230,75 +227,67 @@ class SpecialPrefixindex extends SpecialAllPages {
                                        } else {
                                                $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
                                        }
-                                       if ( $n % $this->columns == 0 ) {
-                                               $out .= '<tr>';
-                                       }
-                                       $out .= "<td>$link</td>";
+
+                                       $out .= "<li> $link </li>\n";
                                        $n++;
-                                       if ( $n % $this->columns == 0 ) {
-                                               $out .= '</tr>';
-                                       }
-                               }
 
-                               if ( $n % $this->columns != 0 ) {
-                                       $out .= '</tr>';
                                }
-
-                               $out .= Xml::closeElement( 'table' );
+                               $out .= Html::closeElement( 'ul' );
+                               $out .= Html::closeElement( 'div' );
                        } else {
                                $out = '';
                        }
                }
 
-               $footer = '';
-               if ( $this->including() ) {
-                       $out2 = '';
-               } else {
-                       $nsForm = $this->namespacePrefixForm( $namespace, $prefix );
-                       $self = $this->getPageTitle();
-                       $out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
-                               '<tr>
-                                       <td>' .
-                               $nsForm .
-                               '</td>
-                               <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
-
-                       if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
-                               $query = array(
-                                       'from' => $s->page_title,
-                                       'prefix' => $prefix,
-                                       'hideredirects' => $this->hideRedirects,
-                                       'stripprefix' => $this->stripPrefix,
-                                       'columns' => $this->columns,
-                               );
+               $output = $this->getOutput();
 
-                               if ( $namespace || $prefix == '' ) {
-                                       // Keep the namespace even if it's 0 for empty prefixes.
-                                       // This tells us we're not just a holdover from old links.
-                                       $query['namespace'] = $namespace;
-                               }
+               if ( $this->including() ) {
+                       // We don't show the nav-links and the form when included into other
+                       // pages so let's just finish here.
+                       $output->addHTML( $out );
+                       return;
+               }
 
-                               $nextLink = Linker::linkKnown(
-                                       $self,
-                                       $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
-                                       array(),
-                                       $query
-                               );
+               $topOut = $this->namespacePrefixForm( $namespace, $prefix );
 
-                               $out2 .= $nextLink;
+               if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                       $query = array(
+                               'from' => $s->page_title,
+                               'prefix' => $prefix,
+                               'hideredirects' => $this->hideRedirects,
+                               'stripprefix' => $this->stripPrefix,
+                       );
 
-                               $footer = "\n" . Html::element( 'hr' ) .
-                                       Html::rawElement(
-                                               'div',
-                                               array( 'class' => 'mw-prefixindex-nav' ),
-                                               $nextLink
-                                       );
+                       if ( $namespace || $prefix == '' ) {
+                               // Keep the namespace even if it's 0 for empty prefixes.
+                               // This tells us we're not just a holdover from old links.
+                               $query['namespace'] = $namespace;
                        }
-                       $out2 .= "</td></tr>" .
-                               Xml::closeElement( 'table' );
+
+                       $nextLink = Linker::linkKnown(
+                               $this->getPageTitle(),
+                               $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
+                               array(),
+                               $query
+                       );
+
+                       // Link shown at the top of the page below the form
+                       $topOut .= Html::rawElement( 'div',
+                               array( 'class' => 'mw-prefixindex-nav' ),
+                               $nextLink
+                       );
+
+                       // Link shown at the footer
+                       $out .= "\n" . Html::element( 'hr' ) .
+                               Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-prefixindex-nav' ),
+                                       $nextLink
+                               );
+
                }
 
-               $this->getOutput()->addHTML( $out2 . $out . $footer );
+               $output->addHTML( $topOut . $out );
        }
 
        protected function getGroupName() {
index 96d512c..da84a9e 100644 (file)
@@ -72,6 +72,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        public function getDefaultOptions() {
                $opts = parent::getDefaultOptions();
                $user = $this->getUser();
+               $config = $this->getConfig();
 
                $opts->add( 'days', $user->getIntOption( 'rcdays' ) );
                $opts->add( 'limit', $user->getIntOption( 'rclimit' ) );
@@ -84,6 +85,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $opts->add( 'hidepatrolled', $user->getBoolOption( 'hidepatrolled' ) );
                $opts->add( 'hidemyself', false );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $opts->add( 'hidecategorization', $user->getBoolOption( 'hidecategorization' ) );
+               }
+
                $opts->add( 'categories', '' );
                $opts->add( 'categories_any', false );
                $opts->add( 'tagfilter', '' );
@@ -138,6 +143,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        if ( 'hidemyself' === $bit ) {
                                $opts['hidemyself'] = true;
                        }
+                       if ( 'hidecategorization' === $bit ) {
+                               $opts['hidecategorization'] = true;
+                       }
 
                        if ( is_numeric( $bit ) ) {
                                $opts['limit'] = $bit;
@@ -677,6 +685,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $lang = $this->getLanguage();
                $user = $this->getUser();
+               $config = $this->getConfig();
                if ( $options['from'] ) {
                        $note .= $this->msg( 'rcnotefrom' )
                                ->numParams( $options['limit'] )
@@ -690,12 +699,12 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
 
                # Sort data for display and make sure it's unique after we've added user data.
-               $linkLimits = $this->getConfig()->get( 'RCLinkLimits' );
+               $linkLimits = $config->get( 'RCLinkLimits' );
                $linkLimits[] = $options['limit'];
                sort( $linkLimits );
                $linkLimits = array_unique( $linkLimits );
 
-               $linkDays = $this->getConfig()->get( 'RCLinkDays' );
+               $linkDays = $config->get( 'RCLinkDays' );
                $linkDays[] = $options['days'];
                sort( $linkDays );
                $linkDays = array_unique( $linkDays );
@@ -726,6 +735,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        'hidemyself' => 'rcshowhidemine'
                );
 
+               if ( $config->get( 'RCWatchCategoryMembership' ) ) {
+                       $filters['hidecategorization'] = 'rcshowhidecategorization';
+               }
+
                $showhide = array( 'show', 'hide' );
 
                foreach ( $this->getCustomFilters() as $key => $params ) {
@@ -741,7 +754,8 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                        // The following messages are used here:
                        // rcshowhideminor-show, rcshowhideminor-hide, rcshowhidebots-show, rcshowhidebots-hide,
                        // rcshowhideanons-show, rcshowhideanons-hide, rcshowhideliu-show, rcshowhideliu-hide,
-                       // rcshowhidepatr-show, rcshowhidepatr-hide, rcshowhidemine-show, rcshowhidemine-hide.
+                       // rcshowhidepatr-show, rcshowhidepatr-hide, rcshowhidemine-show, rcshowhidemine-hide,
+                       // rcshowhidecategorization-show, rcshowhidecategorization-hide.
                        $linkMessage = $this->msg( $msg . '-' . $showhide[1 - $options[$key]] );
                        // Extensions can define additional filters, but don't need to define the corresponding
                        // messages. If they don't exist, just fall back to 'show' and 'hide'.
index 72d21eb..553e2b1 100644 (file)
@@ -269,13 +269,27 @@ class SpecialRedirect extends FormSpecialPage {
         */
        protected function getSubpagesForPrefixSearch() {
                return array(
-                       "file",
-                       "page",
-                       "revision",
-                       "user",
+                       'file',
+                       'page',
+                       'revision',
+                       'user',
                );
        }
 
+       /**
+        * @return bool
+        */
+       public function requiresWrite() {
+               return false;
+       }
+
+       /**
+        * @return bool
+        */
+       public function requiresUnblock() {
+               return false;
+       }
+
        protected function getGroupName() {
                return 'redirects';
        }
index 7c27ac4..65cb8e5 100644 (file)
@@ -170,11 +170,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->typeLabels = self::$UILabels[$this->typeName];
                $list = $this->getList();
                $list->reset();
-               $bitfield = $list->current()->getBits();
                $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
                $canViewSuppressedOnly = $this->getUser()->isAllowed( 'viewsuppressed' ) &&
                        !$this->getUser()->isAllowed( 'suppressrevision' );
-               $pageIsSuppressed = $bitfield & Revision::DELETED_RESTRICTED;
+               $pageIsSuppressed = $list->areAnySuppressed();
                $this->mIsAllowed = $this->mIsAllowed && !( $canViewSuppressedOnly && $pageIsSuppressed );
 
                $this->otherReason = $request->getVal( 'wpReason' );
@@ -408,6 +407,8 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
                // Show form if the user can submit
                if ( $this->mIsAllowed ) {
+                       $out->addModuleStyles( 'mediawiki.special' );
+
                        $form = Xml::openElement( 'form', array( 'method' => 'post',
                                        'action' => $this->getPageTitle()->getLocalURL( array( 'action' => 'submit' ) ),
                                        'id' => 'mw-revdel-form-revisions' ) ) .
index 286a745..4217553 100644 (file)
@@ -86,6 +86,13 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                        ob_flush();
                        flush();
                        // Once the client receives this response, it can disconnect
+                       set_error_handler( function ( $errno, $errstr ) {
+                               if ( strpos( $errstr, 'Cannot modify header information' ) !== false ) {
+                                       return true; // bug T115413
+                               }
+                               // Delegate unhandled errors to the default handlers
+                               return false;
+                       } );
                }
 
                // Do all of the specified tasks...
index fc7eeb1..2f47add 100644 (file)
@@ -73,6 +73,12 @@ class SpecialSearch extends SpecialPage {
         */
        protected $runSuggestion = true;
 
+       /**
+        * Names of the wikis, in format: Interwiki prefix -> caption
+        * @var array
+        */
+       protected $customCaptions;
+
        const NAMESPACES_CURRENT = 'sense';
 
        public function __construct() {
@@ -93,6 +99,7 @@ class SpecialSearch extends SpecialPage {
                        'mediawiki.special', 'mediawiki.special.search', 'mediawiki.ui', 'mediawiki.ui.button',
                        'mediawiki.ui.input',
                ) );
+               $this->addHelpLink( 'Help:Searching' );
 
                // Strip underscores from title parameter; most of the time we'll want
                // text form here. But don't strip underscores from actual text params!
@@ -371,25 +378,48 @@ class SpecialSearch extends SpecialPage {
                        if ( $numTextMatches > 0 ) {
                                $out->addHTML( $this->showMatches( $textMatches ) );
                        }
-                       // show interwiki results if any
-                       if ( $textMatches->hasInterwikiResults() ) {
-                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
-                       }
 
-                       $textMatches->free();
+                       // show secondary interwiki results if any
+                       if ( $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
+                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(
+                                               SearchResultSet::SECONDARY_RESULTS ), $term ) );
+                       }
                }
+
+               $hasOtherResults = $textMatches &&
+                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+
                if ( $num === 0 ) {
                        if ( $textStatus ) {
                                $out->addHTML( '<div class="error">' .
                                        $textStatus->getMessage( 'search-error' ) . '</div>' );
                        } else {
-                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
-                                       array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
                                $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
+                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
+                                       array( $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
+                                                       wfEscapeWikiText( $term )
+                                       ) );
+                       }
+               }
+
+               if ( $hasOtherResults ) {
+                       foreach ( $textMatches->getInterwikiResults( SearchResultSet::INLINE_RESULTS )
+                                               as $interwiki => $interwikiResult ) {
+                               if ( $interwikiResult instanceof Status || $interwikiResult->numRows() == 0 ) {
+                                       // ignore bad interwikis for now
+                                       continue;
+                               }
+                               // TODO: wiki header
+                               $out->addHTML( $this->showMatches( $interwikiResult, $interwiki ) );
                        }
                }
 
+               if ( $textMatches ) {
+                       $textMatches->free();
+               }
+
                $out->addHTML( '<div class="visualClear"></div>' );
+
                if ( $prevnext ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
@@ -400,6 +430,18 @@ class SpecialSearch extends SpecialPage {
 
        }
 
+       /**
+        * Produce wiki header for interwiki results
+        * @param string $interwiki Interwiki name
+        * @param SearchResultSet $interwikiResult The result set
+        * @return string
+        */
+       protected function interwikiHeader( $interwiki, $interwikiResult ) {
+               // TODO: we need to figure out how to name wikis correctly
+               $wikiMsg = $this->msg( 'search-interwiki-results-' . $interwiki )->parse();
+               return "<p class=\"mw-search-interwiki-header\">\n$wikiMsg</p>";
+       }
+
        /**
         * Decide if the suggested query should be run, and it's results returned
         * instead of the provided $textMatches
@@ -636,17 +678,23 @@ class SpecialSearch extends SpecialPage {
         * Show whole set of results
         *
         * @param SearchResultSet $matches
+        * @param string $interwiki Interwiki name
         *
         * @return string
         */
-       protected function showMatches( &$matches ) {
+       protected function showMatches( &$matches, $interwiki = null ) {
                global $wgContLang;
 
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
-
-               $out = "<ul class='mw-search-results'>\n";
+               $out = '';
                $result = $matches->next();
                $pos = $this->offset;
+
+               if ( $result && $interwiki ) {
+                       $out .= $this->interwikiHeader( $interwiki, $result );
+               }
+
+               $out .= "<ul class='mw-search-results'>\n";
                while ( $result ) {
                        $out .= $this->showHit( $result, $terms, ++$pos );
                        $result = $matches->next();
@@ -683,14 +731,16 @@ class SpecialSearch extends SpecialPage {
                }
 
                $link_t = clone $title;
+               $query = array();
 
                Hooks::run( 'ShowSearchHitTitle',
-                       array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
+                       array( &$link_t, &$titleSnippet, $result, $terms, $this, &$query ) );
 
                $link = Linker::linkKnown(
                        $link_t,
                        $titleSnippet,
-                       array( 'data-serp-pos' => $position ) // HTML attributes
+                       array( 'data-serp-pos' => $position ), // HTML attributes
+                       $query
                );
 
                // If page content is not readable, just return the title.
@@ -818,6 +868,23 @@ class SpecialSearch extends SpecialPage {
                return $html;
        }
 
+       /**
+        * Extract custom captions from search-interwiki-custom message
+        */
+       protected function getCustomCaptions() {
+               if ( is_null( $this->customCaptions ) ) {
+                       $this->customCaptions = array();
+                       // format per line <iwprefix>:<caption>
+                       $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
+                       foreach ( $customLines as $line ) {
+                               $parts = explode( ":", $line, 2 );
+                               if ( count( $parts ) == 2 ) { // validate line
+                                       $this->customCaptions[$parts[0]] = $parts[1];
+                               }
+                       }
+               }
+       }
+
        /**
         * Show results from other wikis
         *
@@ -834,15 +901,7 @@ class SpecialSearch extends SpecialPage {
                $out .= "<ul class='mw-search-iwresults'>\n";
 
                // work out custom project captions
-               $customCaptions = array();
-               // format per line <iwprefix>:<caption>
-               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
-               foreach ( $customLines as $line ) {
-                       $parts = explode( ":", $line, 2 );
-                       if ( count( $parts ) == 2 ) { // validate line
-                               $customCaptions[$parts[0]] = $parts[1];
-                       }
-               }
+               $this->getCustomCaptions();
 
                if ( !is_array( $matches ) ) {
                        $matches = array( $matches );
@@ -852,7 +911,7 @@ class SpecialSearch extends SpecialPage {
                        $prev = null;
                        $result = $set->next();
                        while ( $result ) {
-                               $out .= $this->showInterwikiHit( $result, $prev, $query, $customCaptions );
+                               $out .= $this->showInterwikiHit( $result, $prev, $query );
                                $prev = $result->getInterwikiPrefix();
                                $result = $set->next();
                        }
@@ -873,11 +932,10 @@ class SpecialSearch extends SpecialPage {
         * @param SearchResult $result
         * @param string $lastInterwiki
         * @param string $query
-        * @param array $customCaptions Interwiki prefix -> caption
         *
         * @return string
         */
-       protected function showInterwikiHit( $result, $lastInterwiki, $query, $customCaptions ) {
+       protected function showInterwikiHit( $result, $lastInterwiki, $query ) {
 
                if ( $result->isBrokenTitle() ) {
                        return '';
@@ -914,9 +972,9 @@ class SpecialSearch extends SpecialPage {
                $out = "";
                // display project name
                if ( is_null( $lastInterwiki ) || $lastInterwiki != $title->getInterwiki() ) {
-                       if ( array_key_exists( $title->getInterwiki(), $customCaptions ) ) {
+                       if ( array_key_exists( $title->getInterwiki(), $this->customCaptions ) ) {
                                // captions from 'search-interwiki-custom'
-                               $caption = $customCaptions[$title->getInterwiki()];
+                               $caption = $this->customCaptions[$title->getInterwiki()];
                        } else {
                                // default is to show the hostname of the other wiki which might suck
                                // if there are many wikis on one hostname
index 8de6f8b..e06bae0 100644 (file)
@@ -36,8 +36,6 @@ class SpecialStatistics extends SpecialPage {
        }
 
        public function execute( $par ) {
-               global $wgMemc;
-
                $miserMode = $this->getConfig()->get( 'MiserMode' );
 
                $this->setHeaders();
@@ -51,17 +49,6 @@ class SpecialStatistics extends SpecialPage {
                $this->activeUsers = SiteStats::activeUsers();
                $this->hook = '';
 
-               # Set active user count
-               if ( !$miserMode ) {
-                       $key = wfMemcKey( 'sitestats', 'activeusers-updated' );
-                       // Re-calculate the count if the last tally is old...
-                       if ( !$wgMemc->get( $key ) ) {
-                               $dbw = wfGetDB( DB_MASTER );
-                               SiteStatsUpdate::cacheUpdate( $dbw );
-                               $wgMemc->set( $key, '1', 24 * 3600 ); // don't update for 1 day
-                       }
-               }
-
                $text = Xml::openElement( 'table', array( 'class' => 'wikitable mw-statistics-table' ) );
 
                # Statistic - pages
index 00ee327..447c3ef 100644 (file)
@@ -587,7 +587,7 @@ class PageArchive {
                $restored = 0;
 
                foreach ( $result as $row ) {
-                       // Check for key dupes due to shitty archive integrity.
+                       // Check for key dupes due to needed archive integrity.
                        if ( $row->ar_rev_id ) {
                                $exists = $dbw->selectField( 'revision', '1',
                                        array( 'rev_id' => $row->ar_rev_id ), __METHOD__ );
index ad44076..6692bb6 100644 (file)
@@ -475,6 +475,14 @@ class SpecialUpload extends SpecialPage {
                        }
                }
 
+               // This is as late as we can throttle, after expected issues have been handled
+               if ( UploadBase::isThrottled( $this->getUser() ) ) {
+                       $this->showRecoverableUploadError(
+                               $this->msg( 'actionthrottledtext' )->escaped()
+                       );
+                       return;
+               }
+
                // Get the page text if this is not a reupload
                if ( !$this->mForReUpload ) {
                        $pageText = self::getInitialPageText( $this->mComment, $this->mLicense,
@@ -819,6 +827,7 @@ class UploadForm extends HTMLForm {
 
                # Add a link to edit MediaWik:Licenses
                if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+                       $this->getOutput()->addModuleStyles( 'mediawiki.special' );
                        $licensesLink = Linker::linkKnown(
                                $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
                                $this->msg( 'licenses-edit' )->escaped(),
index 0da598b..c569b0d 100644 (file)
@@ -485,7 +485,7 @@ class LoginForm extends SpecialPage {
         * @return Status
         */
        public function addNewAccountInternal() {
-               global $wgAuth, $wgMemc, $wgAccountCreationThrottle, $wgEmailConfirmToEdit;
+               global $wgAuth, $wgAccountCreationThrottle, $wgEmailConfirmToEdit;
 
                // If the user passes an invalid domain, something is fishy
                if ( !$wgAuth->validDomain( $this->mDomain ) ) {
@@ -565,8 +565,9 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'noname' );
                }
 
+               $cache = ObjectCache::getLocalClusterInstance();
                # Make sure the user does not exist already
-               $lock = $wgMemc->getScopedLock( wfGlobalCacheKey( 'account', md5( $this->mUsername ) ) );
+               $lock = $cache->getScopedLock( wfGlobalCacheKey( 'account', md5( $this->mUsername ) ) );
                if ( !$lock ) {
                        return Status::newFatal( 'usernameinprogress' );
                } elseif ( $u->idForName( User::READ_LOCKING ) ) {
@@ -633,14 +634,14 @@ class LoginForm extends SpecialPage {
                } else {
                        if ( ( $wgAccountCreationThrottle && $currentUser->isPingLimitable() ) ) {
                                $key = wfMemcKey( 'acctcreate', 'ip', $ip );
-                               $value = $wgMemc->get( $key );
+                               $value = $cache->get( $key );
                                if ( !$value ) {
-                                       $wgMemc->set( $key, 0, 86400 );
+                                       $cache->set( $key, 0, $cache::TTL_DAY );
                                }
                                if ( $value >= $wgAccountCreationThrottle ) {
                                        return Status::newFatal( 'acct_creation_throttle_hit', $wgAccountCreationThrottle );
                                }
-                               $wgMemc->incr( $key );
+                               $cache->incr( $key );
                        }
                }
 
@@ -783,8 +784,10 @@ class LoginForm extends SpecialPage {
                // Give general extensions, such as a captcha, a chance to abort logins
                $abort = self::ABORTED;
                if ( !Hooks::run( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$msg ) ) ) {
+                       if ( !in_array( $abort, array_keys( self::$statusCodes ), true ) ) {
+                               throw new Exception( 'Invalid status code returned from AbortLogin hook: ' . $abort );
+                       }
                        $this->mAbortLoginErrorMsg = $msg;
-
                        return $abort;
                }
 
@@ -867,7 +870,7 @@ class LoginForm extends SpecialPage {
         * @return bool|int The integer hit count or True if it is already at the limit
         */
        public static function incLoginThrottle( $username ) {
-               global $wgPasswordAttemptThrottle, $wgMemc, $wgRequest;
+               global $wgPasswordAttemptThrottle, $wgRequest;
                $username = trim( $username ); // sanity
 
                $throttleCount = 0;
@@ -876,11 +879,12 @@ class LoginForm extends SpecialPage {
                        $count = $wgPasswordAttemptThrottle['count'];
                        $period = $wgPasswordAttemptThrottle['seconds'];
 
-                       $throttleCount = $wgMemc->get( $throttleKey );
+                       $cache = ObjectCache::getLocalClusterInstance();
+                       $throttleCount = $cache->get( $throttleKey );
                        if ( !$throttleCount ) {
-                               $wgMemc->add( $throttleKey, 1, $period ); // start counter
+                               $cache->add( $throttleKey, 1, $period ); // start counter
                        } elseif ( $throttleCount < $count ) {
-                               $wgMemc->incr( $throttleKey );
+                               $cache->incr( $throttleKey );
                        } elseif ( $throttleCount >= $count ) {
                                return true;
                        }
@@ -895,11 +899,11 @@ class LoginForm extends SpecialPage {
         * @return void
         */
        public static function clearLoginThrottle( $username ) {
-               global $wgMemc, $wgRequest;
+               global $wgRequest;
                $username = trim( $username ); // sanity
 
                $throttleKey = wfMemcKey( 'password-throttle', $wgRequest->getIP(), md5( $username ) );
-               $wgMemc->delete( $throttleKey );
+               ObjectCache::getLocalClusterInstance()->delete( $throttleKey );
        }
 
        /**
@@ -958,9 +962,9 @@ class LoginForm extends SpecialPage {
        }
 
        function processLogin() {
-               global $wgMemc, $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle,
-                       $wgInvalidPasswordReset;
+               global $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle, $wgInvalidPasswordReset;
 
+               $cache = ObjectCache::getLocalClusterInstance();
                $authRes = $this->authenticateUserData();
                switch ( $authRes ) {
                        case self::SUCCESS:
@@ -982,7 +986,7 @@ class LoginForm extends SpecialPage {
                                // Reset the throttle
                                $request = $this->getRequest();
                                $key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
-                               $wgMemc->delete( $key );
+                               $cache->delete( $key );
 
                                if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
                                        /* Replace the language object to provide user interface in
@@ -1385,11 +1389,6 @@ class LoginForm extends SpecialPage {
                ) );
 
                if ( $this->mType == 'signup' ) {
-                       // XXX hack pending RL or JS parse() support for complex content messages
-                       // https://phabricator.wikimedia.org/T27349
-                       $out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
-                               $this->msg( 'createacct-imgcaptcha-help' )->parse() );
-
                        // Additional styles and scripts for signup form
                        $out->addModules( array(
                                'mediawiki.special.userlogin.signup.js'
index 1ed392f..a6fe1b5 100644 (file)
@@ -31,6 +31,10 @@ class UserrightsPage extends SpecialPage {
        # either a GET parameter or a subpage-style parameter, so have a member
        # variable for it.
        protected $mTarget;
+       /*
+        * @var null|User $mFetchedUser The user object of the target username or null.
+        */
+       protected $mFetchedUser = null;
        protected $isself = false;
 
        public function __construct() {
@@ -75,6 +79,8 @@ class UserrightsPage extends SpecialPage {
                // any groups, it's a bit silly to give them the user search prompt.
 
                $user = $this->getUser();
+               $request = $this->getRequest();
+               $out = $this->getOutput();
 
                /*
                 * If the user is blocked and they only have "partial" access
@@ -85,8 +91,6 @@ class UserrightsPage extends SpecialPage {
                        throw new UserBlockedError( $user->getBlock() );
                }
 
-               $request = $this->getRequest();
-
                if ( $par !== null ) {
                        $this->mTarget = $par;
                } else {
@@ -110,13 +114,17 @@ class UserrightsPage extends SpecialPage {
                        $this->isself = true;
                }
 
+               $fetchedStatus = $this->fetchUser( $this->mTarget );
+               if ( $fetchedStatus->isOk() ) {
+                       $this->mFetchedUser = $fetchedStatus->value;
+               }
+
                if ( !$this->userCanChangeRights( $user, true ) ) {
                        if ( $this->isself && $request->getCheck( 'success' ) ) {
                                // bug 48609: if the user just removed its own rights, this would
                                // leads it in a "permissions error" page. In that case, show a
                                // message that it can't anymore use this page instead of an error
                                $this->setHeaders();
-                               $out = $this->getOutput();
                                $out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
                                $out->returnToMain();
 
@@ -128,12 +136,19 @@ class UserrightsPage extends SpecialPage {
                        throw new PermissionsError( null, array( array( $msg ) ) );
                }
 
+               // show a successbox, if the user rights was saved successfully
+               if ( $request->getCheck( 'success' ) && $this->mFetchedUser !== null ) {
+                       $out->wrapWikiMsg(
+                               "<div class=\"successbox\">\n$1\n</div>",
+                               array( 'savedrights', $this->mFetchedUser->getName() )
+                       );
+               }
+
                $this->checkReadOnly();
 
                $this->setHeaders();
                $this->outputHeader();
 
-               $out = $this->getOutput();
                $out->addModuleStyles( 'mediawiki.special' );
                $this->addHelpLink( 'Help:Assigning permissions' );
 
@@ -149,14 +164,13 @@ class UserrightsPage extends SpecialPage {
                        $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
                ) {
                        // save settings
-                       $status = $this->fetchUser( $this->mTarget );
-                       if ( !$status->isOK() ) {
-                               $this->getOutput()->addWikiText( $status->getWikiText() );
+                       if ( !$fetchedStatus->isOK() ) {
+                               $this->getOutput()->addWikiText( $fetchedStatus->getWikiText() );
 
                                return;
                        }
 
-                       $targetUser = $status->value;
+                       $targetUser = $this->mFetchedUser;
                        if ( $targetUser instanceof User ) { // UserRightsProxy doesn't have this method (bug 61252)
                                $targetUser->clearInstanceCache(); // bug 38989
                        }
index 38baf5b..7e0f0b2 100644 (file)
@@ -518,16 +518,12 @@ class SpecialVersion extends SpecialPage {
         */
        protected function getExternalLibraries() {
                global $IP;
-               $path = "$IP/composer.lock";
+               $path = "$IP/vendor/composer/installed.json";
                if ( !file_exists( $path ) ) {
-                       // Maybe they're using mediawiki/vendor?
-                       $path = "$IP/vendor/composer.lock";
-                       if ( !file_exists( $path ) ) {
-                               return '';
-                       }
+                       return '';
                }
 
-               $lock = new ComposerLock( $path );
+               $installed = new ComposerInstalled( $path );
                $out = Html::element(
                        'h2',
                        array( 'id' => 'mw-version-libraries' ),
@@ -545,7 +541,7 @@ class SpecialVersion extends SpecialPage {
                        . Html::element( 'th', array(), $this->msg( 'version-libraries-authors' )->text() )
                        . Html::closeElement( 'tr' );
 
-               foreach ( $lock->getInstalledDependencies() as $name => $info ) {
+               foreach ( $installed->getInstalledDependencies() as $name => $info ) {
                        if ( strpos( $info['type'], 'mediawiki-' ) === 0 ) {
                                // Skip any extensions or skins since they'll be listed
                                // in their proper section
index 20f5776..962e0c3 100644 (file)
@@ -111,6 +111,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $opts->add( 'hidepatrolled', $user->getBoolOption( 'watchlisthidepatrolled' ) );
                $opts->add( 'hidemyself', $user->getBoolOption( 'watchlisthideown' ) );
 
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
+                       $opts->add( 'hidecategorization', $user->getBoolOption( 'watchlisthidecategorization' ) );
+               }
+
                $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
 
                return $opts;
@@ -425,6 +429,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        'hidemyself' => 'rcshowhidemine',
                        'hidepatrolled' => 'rcshowhidepatr'
                );
+
+               if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
+                       $filters['hidecategorization'] = 'rcshowhidecategorization';
+               }
+
                foreach ( $this->getCustomFilters() as $key => $params ) {
                        $filters[$key] = $params['msg'];
                }
index 3f549d0..4759023 100644 (file)
@@ -51,6 +51,11 @@ class RaggettWrapper {
                // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
                $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
 
+               // Preserve empty li elements (T49673) by abusing Tidy's datafld hack
+               // The whitespace class is as in TY_(InitMap)
+               $wrappedtext = preg_replace( "!<li>([ \r\n\t\f]*)</li>!",
+                       '<li datafld="" class="mw-empty-li">\1</li>', $wrappedtext );
+
                // Wrap the whole thing in a doctype and body for Tidy.
                $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' .
                        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>' .
@@ -79,6 +84,9 @@ class RaggettWrapper {
                // Revert <html-{link,meta}> back to <{link,meta}>
                $text = preg_replace( '!<html-(link|meta)([^>]*?)(/{0,1}>)!', '<$1$2$3', $text );
 
+               // Remove datafld
+               $text = str_replace( '<li datafld=""', '<li', $text );
+
                // Restore the contents of placeholder tokens
                $text = $this->mTokens->replace( $text );
 
index 6b2e877..0fb208e 100644 (file)
@@ -255,7 +255,8 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                        $m = array();
                        if ( preg_match( $prefixRegexp, $dbkey, $m ) ) {
                                $p = $m[1];
-                               if ( ( $ns = $this->language->getNsIndex( $p ) ) !== false ) {
+                               $ns = $this->language->getNsIndex( $p );
+                               if ( $ns !== false ) {
                                        # Ordinary namespace
                                        $dbkey = $m[2];
                                        $parts['namespace'] = $ns;
index 8514187..17fcab8 100644 (file)
@@ -125,6 +125,16 @@ abstract class UploadBase {
                return true;
        }
 
+       /**
+        * Returns true if the user has surpassed the upload rate limit, false otherwise.
+        *
+        * @param User $user
+        * @return bool
+        */
+       public static function isThrottled( $user ) {
+               return $user->pingLimiter( 'upload' );
+       }
+
        // Upload handlers. Should probably just be a global.
        private static $uploadHandlers = array( 'Stash', 'File', 'Url' );
 
@@ -1763,7 +1773,7 @@ abstract class UploadBase {
                        // We're not using the normalized form of the extension.
                        // Normal form is lowercase, using most common of alternate
                        // extensions (eg 'jpg' rather than 'JPEG').
-                       //
+
                        // Check for another file using the normalized form...
                        $nt_lc = Title::makeTitle( NS_FILE, "{$partname}.{$normalizedExtension}" );
                        $file_lc = wfLocalFile( $nt_lc );
@@ -1958,7 +1968,7 @@ abstract class UploadBase {
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
-                       $cache->set( $key, $value, 86400 );
+                       $cache->set( $key, $value, $cache::TTL_DAY );
                }
        }
 }
index b9a1bbf..e241383 100644 (file)
@@ -54,6 +54,7 @@
 class UploadStash {
        // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
        const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/';
+       const MAX_US_PROPS_SIZE = 65535;
 
        /**
         * repository that this uses to store temp files
@@ -221,7 +222,6 @@ class UploadStash {
                // If no key was supplied, make one.  a mysql insertid would be totally
                // reasonable here, except that for historical reasons, the key is this
                // random thing instead.  At least it's not guessable.
-               //
                // Some things that when combined will make a suitably unique key.
                // see: http://www.jwz.org/doc/mid.html
                list( $usec, $sec ) = explode( ' ', microtime() );
@@ -278,13 +278,22 @@ class UploadStash {
                wfDebug( __METHOD__ . " inserting $stashPath under $key\n" );
                $dbw = $this->repo->getMasterDb();
 
+               $serializedFileProps = serialize( $fileProps );
+               if ( strlen( $serializedFileProps ) > self::MAX_US_PROPS_SIZE ) {
+                       // Database is going to truncate this and make the field invalid.
+                       // Prioritize important metadata over file handler metadata.
+                       // File handler should be prepared to regenerate invalid metadata if needed.
+                       $fileProps['metadata'] = false;
+                       $serializedFileProps = serialize( $fileProps );
+               }
+
                $this->fileMetadata[$key] = array(
                        'us_id' => $dbw->nextSequenceValue( 'uploadstash_us_id_seq' ),
                        'us_user' => $this->userId,
                        'us_key' => $key,
                        'us_orig_path' => $path,
                        'us_path' => $stashPath, // virtual URL
-                       'us_props' => $dbw->encodeBlob( serialize( $fileProps ) ),
+                       'us_props' => $dbw->encodeBlob( $serializedFileProps ),
                        'us_size' => $fileProps['size'],
                        'us_sha1' => $fileProps['sha1'],
                        'us_mime' => $fileProps['mime'],
index c866919..12f6285 100644 (file)
@@ -31,7 +31,7 @@ class FileContentsHasher {
         * Constructor.
         */
        public function __construct() {
-               $this->cache = ObjectCache::newAccelerator( 'hash' );
+               $this->cache = ObjectCache::getLocalServerInstance( 'hash' );
        }
 
        /**
index 740df92..2dfc902 100644 (file)
@@ -176,7 +176,7 @@ class MWCryptHKDF {
                $context[] = gethostname();
 
                // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
-               $cache = ObjectCache::newAccelerator( $wgMainCacheType );
+               $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
 
                if ( is_null( self::$singleton ) ) {
                        self::$singleton = new self( $secret, $wgHKDFAlgorithm, $cache, $context );
index 53c77c2..10606c1 100644 (file)
@@ -97,7 +97,8 @@ class MWCryptRand {
                                        }
                                }
                                // The absolute filename itself will differ from install to install so don't leave it out
-                               if ( ( $path = realpath( $file ) ) !== false ) {
+                               $path = realpath( $file );
+                               if ( $path !== false ) {
                                        $state .= $path;
                                } else {
                                        $state .= $file;
index 04c8e19..26eebcd 100644 (file)
@@ -282,11 +282,7 @@ class UIDGenerator {
                // Counter values would not survive accross script instances in CLI mode.
                $cache = null;
                if ( ( $flags & self::QUICK_VOLATILE ) && PHP_SAPI !== 'cli' ) {
-                       try {
-                               $cache = ObjectCache::newAccelerator();
-                       } catch ( Exception $e ) {
-                               // not supported
-                       }
+                       $cache = ObjectCache::getLocalServerInstance();
                }
                if ( $cache ) {
                        $counter = $cache->incr( $bucket, $count );
index a0d7703..b91596b 100644 (file)
@@ -7,5 +7,5 @@ Florian Schmidt <florian.schmidt.welzow@t-online.de>
 James D. Forrester <jforrester@wikimedia.org>
 Roan Kattouw <roan@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
-Timo Tijhof <timo@wikimedia.org>
+Timo Tijhof <krinklemail@gmail.com>
 Trevor Parscal <trevor@wikimedia.org>
index 50ed513..c7871c1 100644 (file)
@@ -207,10 +207,7 @@ class Language {
         * @return Language
         */
        protected static function newFromCode( $code ) {
-               // Protect against path traversal below
-               if ( !Language::isValidCode( $code )
-                       || strcspn( $code, ":/\\\000" ) !== strlen( $code )
-               ) {
+               if ( !Language::isValidCode( $code ) ) {
                        throw new MWException( "Invalid language code \"$code\"" );
                }
 
@@ -224,7 +221,6 @@ class Language {
 
                // Check if there is a language class for the code
                $class = self::classFromCode( $code );
-               self::preloadLanguageClass( $class );
                if ( class_exists( $class ) ) {
                        $lang = new $class;
                        return $lang;
@@ -238,9 +234,8 @@ class Language {
                        }
 
                        $class = self::classFromCode( $fallbackCode );
-                       self::preloadLanguageClass( $class );
                        if ( class_exists( $class ) ) {
-                               $lang = Language::newFromCode( $fallbackCode );
+                               $lang = new $class;
                                $lang->setCode( $code );
                                return $lang;
                        }
@@ -341,17 +336,16 @@ class Language {
         */
        public static function isValidCode( $code ) {
                static $cache = array();
-               if ( isset( $cache[$code] ) ) {
-                       return $cache[$code];
+               if ( !isset( $cache[$code] ) ) {
+                       // People think language codes are html safe, so enforce it.
+                       // Ideally we should only allow a-zA-Z0-9-
+                       // but, .+ and other chars are often used for {{int:}} hacks
+                       // see bugs 37564, 37587, 36938
+                       $cache[$code] =
+                               // Protect against path traversal
+                               strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
+                               && !preg_match( MediaWikiTitleCodec::getTitleInvalidRegex(), $code );
                }
-               // People think language codes are html safe, so enforce it.
-               // Ideally we should only allow a-zA-Z0-9-
-               // but, .+ and other chars are often used for {{int:}} hacks
-               // see bugs 37564, 37587, 36938
-               $cache[$code] =
-                       strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
-                       && !preg_match( MediaWikiTitleCodec::getTitleInvalidRegex(), $code );
-
                return $cache[$code];
        }
 
@@ -411,35 +405,6 @@ class Language {
                return false;
        }
 
-       /**
-        * @param string $code
-        * @return string Name of the language class
-        */
-       public static function classFromCode( $code ) {
-               if ( $code == 'en' ) {
-                       return 'Language';
-               } else {
-                       return 'Language' . str_replace( '-', '_', ucfirst( $code ) );
-               }
-       }
-
-       /**
-        * Includes language class files
-        *
-        * @param string $class Name of the language class
-        */
-       public static function preloadLanguageClass( $class ) {
-               global $IP;
-
-               if ( $class === 'Language' ) {
-                       return;
-               }
-
-               if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
-                       include_once "$IP/languages/classes/$class.php";
-               }
-       }
-
        /**
         * Get the LocalisationCache instance
         *
@@ -3691,8 +3656,9 @@ class Language {
                                # We got the first byte only of a multibyte char; remove it.
                                $string = substr( $string, 0, -1 );
                        } elseif ( $char >= 0x80 &&
+                               // Use the /s modifier (PCRE_DOTALL) so (.*) also matches newlines
                                preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
-                                       '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m )
+                                       '[\xf0-\xf7][\x80-\xbf]{1,2})$/s', $string, $m )
                        ) {
                                # We chopped in the middle of a character; remove it
                                $string = $m[1];
@@ -4406,22 +4372,6 @@ class Language {
                $this->mParentLanguage = false;
        }
 
-       /**
-        * Get the name of a file for a certain language code
-        * @param string $prefix Prepend this to the filename
-        * @param string $code Language code
-        * @param string $suffix Append this to the filename
-        * @throws MWException
-        * @return string $prefix . $mangledCode . $suffix
-        */
-       public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
-               if ( !self::isValidBuiltInCode( $code ) ) {
-                       throw new MWException( "Invalid language code \"$code\"" );
-               }
-
-               return $prefix . str_replace( '-', '_', ucfirst( $code ) ) . $suffix;
-       }
-
        /**
         * Get the language code from a file name. Inverse of getFileName()
         * @param string $filename $prefix . $languageCode . $suffix
@@ -4439,6 +4389,34 @@ class Language {
                return str_replace( '_', '-', strtolower( $m[1] ) );
        }
 
+       /**
+        * @param string $code
+        * @return string Name of the language class
+        */
+       public static function classFromCode( $code ) {
+               if ( $code == 'en' ) {
+                       return 'Language';
+               } else {
+                       return 'Language' . str_replace( '-', '_', ucfirst( $code ) );
+               }
+       }
+
+       /**
+        * Get the name of a file for a certain language code
+        * @param string $prefix Prepend this to the filename
+        * @param string $code Language code
+        * @param string $suffix Append this to the filename
+        * @throws MWException
+        * @return string $prefix . $mangledCode . $suffix
+        */
+       public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
+               if ( !self::isValidBuiltInCode( $code ) ) {
+                       throw new MWException( "Invalid language code \"$code\"" );
+               }
+
+               return $prefix . str_replace( '-', '_', ucfirst( $code ) ) . $suffix;
+       }
+
        /**
         * @param string $code
         * @return string
@@ -4465,15 +4443,6 @@ class Language {
                return "$IP/languages/i18n/$code.json";
        }
 
-       /**
-        * @param string $code
-        * @return string
-        */
-       public static function getClassFileName( $code ) {
-               global $IP;
-               return self::getFileName( "$IP/languages/classes/Language", $code, '.php' );
-       }
-
        /**
         * Get the first fallback for a given language.
         *
index b7767eb..7cedcc5 100644 (file)
@@ -68,10 +68,10 @@ class LanguageHy extends Language {
                                case 'accusative': # Հայցական հոլով
                                        # stub
                                        break;
-                               case 'instrumental':  #
+                               case 'instrumental':
                                        # stub
                                        break;
-                               case 'prepositional': #
+                               case 'prepositional':
                                        # stub
                                        break;
                        }
index 98d138d..3520298 100644 (file)
@@ -50,7 +50,6 @@ class LanguageWa extends Language {
                $datePreference = $this->dateFormat( $format );
 
                # ISO (YYYY-mm-dd) format
-               #
                # we also output this format for YMD (eg: 2001 January 15)
                if ( $datePreference == 'ISO 8601' ) {
                        $d = substr( $ts, 0, 4 ) . '-' . substr( $ts, 4, 2 ) . '-' . substr( $ts, 6, 2 );
@@ -64,7 +63,6 @@ class LanguageWa extends Language {
                }
 
                # Walloon format
-               #
                # we output this in all other cases
                $m = substr( $ts, 4, 2 );
                $n = substr( $ts, 6, 2 );
index 12a0a2f..2499aee 100644 (file)
        "upload-dialog-button-done": "Gedoen",
        "upload-dialog-button-save": "Stoor",
        "upload-dialog-button-upload": "Oplaai",
-       "upload-process-error": "'n Fout het voorgekom",
-       "upload-process-warning": "'n Waarskuwing is uitgereik",
        "upload-form-label-select-file": "Kies lêer",
        "upload-form-label-infoform-title": "Details",
        "upload-form-label-infoform-name": "Naam",
        "creditspage": "Outeursblad",
        "nocredits": "Geen outeursinligting is vir hierdie bladsy nie beskikbaar nie.",
        "spamprotectiontitle": "Spamfilter",
-       "spamprotectiontext": "Die bladsy wat u wou stoor was geblok deur die gemorspos-filter.\nHierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons swartlys veroorsaak.",
+       "spamprotectiontext": "Die bladsy wat u wou stoor is deur die gemorspos-filter geblokkeer. Dit is waarskynlik deur 'n eksterne skakel op ons swartlys veroorsaak.",
        "spamprotectionmatch": "Die volgende teks is wat ons gemorspos-filter geaktiveer het: $1",
        "spambot_username": "MediaWiki opruiming van spam",
        "spam_reverting": "Besig met terugrol na die laaste weergawe wat nie skakels na $1 bevat nie",
index 77d5e69..2dcf85b 100644 (file)
        "summary-preview": "Parapamja e përmbledhjes:",
        "subject-preview": "Parapâmja e temës/kryetitullit:",
        "blockedtitle": "Përdoruesi âsht i bllokuem",
-       "blockedtext": "'''Llogaria juej apo adresa IP âsht bllokue.'''\n\nBllokim âsht bâ prej $1.\nArsyeja e dhânë âsht ''$2''.\n\n* Fillimi i bllokimit: $8\n* Përfundimi i bllokimit: $6\n* I bllokuemi i synuem: $7\n\nMundeni me kontaktue $1 ose ndonji [[{{MediaWiki:Grouppage-sysop}}|administrator]] për me diskutue bllokimin.\nNuk mundeni me shfrytëzue funksionin 'dërgo email këtij përdoruesi' përveç nëse keni specifikue adresë emaili në [[Special:Preferences|parapëlqimet e llogarisë]] dhe nuk jeni bllokue.\nAdresa juej aktuale e IP âsht $3, dhe ID e bllokimit âsht #$5.\nJu lutemi përfshini këto shenime në të gjitha shkresat që i bâni.",
+       "blockedtext": "<strong>Llogaria e juaj apo adresa IP është bllokuar.</strong>\n\nBllokimi është bërë prej $1.\nArsyeja e dhënë është <em>$2</em>.\n\n\n* Fillimi i bllokimit: $8\n* Përfundimi i bllokimit: $6\n* I bllokuaru i synuar: $7\n\nJu mund të kontaktoni $1 ose ndonjë [[{{MediaWiki:Grouppage-sysop}}|administrator]] për ta diskutuar bllokimin.\nNuk mund ta shfrytëzoni funksionin 'dërgo email këtij përdoruesi' përveç nëse keni specifikuar adresë emaili në [[Special:Preferences|parapëlqimet e llogarisë]] dhe nuk jeni bllokuar.\nAdresa e juaj aktuale e IP është $3, dhe ID e bllokimit është #$5.\nJu lutemi përfshini këto shënime në të gjitha shkresat që i bëni.",
        "autoblockedtext": "Adresa juej e IPs âsht bllokue automatikisht meqenëse âsht përdorë prej nji përdoruesi tjetër, i cili âsht bllokue prej $1.\nArsyeja e dhânë âsht kjo:\n\n:''$2''\n\n* Fillimi i bllokimit: $8\n* Përfundimi i bllokimit: $6\n* I bllokuemi i synuem: $7\n\nMundeni me kontaktue $1 ose ndonji [[{{MediaWiki:Grouppage-sysop}}|administrator]] për me diskutue bllokimin.\n\nNuk mundeni me shfrytëzue funksionin 'dërgo email këtij përdoruesi' përveç nëse keni specifikue adresë emaili në [[Special:Preferences|parapëlqimet e llogarisë]] dhe nuk jeni bllokue.\n\nAdresa juej aktuale e IP âsht $3, dhe ID e bllokimit âsht #$5.\nJu lutemi përfshini këto shenime në të gjitha shkresat që i bâni.",
        "blockednoreason": "nuk âsht dhânë arsye",
        "whitelistedittext": "Duheni me u $1 për me redaktue artikuj.",
        "accmailtext": "Nji fjalëkalim i krijuem rastësisht për [[User talk:$1|$1]] u dërgue në $2.\n\nFjalëkalimi për këtë llogari mundet me u ndryshue në faqen ''[[Special:ChangePassword|ndrysho fjalëkalimin]]'' mbas kyçjes.",
        "newarticle": "(I ri)",
        "newarticletext": "Ke ndjekë nji vegëz për te nji faqe që nuk ekziston.\nMe krijue kët faqe, shkruej në kutinë ma poshtë (shih [$1 faqen e ndihmës] për ma shum udhzime).\nNëse ke hy këtu gabimisht, klikoje sustën '''mbrapa''' në shfletues.",
-       "anontalkpagetext": "----''Kjo âsht faqe diskutimi e nji përdoruesi anonim, i cili nuk ka krijue llogari, apo nuk e përdor atê.\nPrandej përdoret adresa numerike IP e tij për me identifikue.\nAdresa IP mundet me u shfrytëzue prej disa përdoruesve.\nNëse jeni përdorues anonim dhe keni përshtypjen se po ju drejtohen komente jorelevante, ju lutemi [[Special:UserLogin/signup|krijoni nji llogari]] apo [[Special:UserLogin|kyçuni]] për me iu shmângë ngatërrimit me përdorues tjerë anonim.''",
+       "anontalkpagetext": "<em>Kjo është faqe diskutimi e një përdoruesi anonim, i cili nuk ka krijuar llogari, apo nuk e përdor atë.</em>\nPrandaj ne do të përdorim adresën numerike të IP së tij për ta identifikuar.\nAdresa IP mund të shfrytëzohet prej disa përdoruesve.\nNëse jeni përdorues anonim dhe keni përshtypjen se po ju drejtohen komente jorelevante, ju lutemi [[Special:UserLogin/signup|krijoni një llogari]] apo [[Special:UserLogin|identifikohuni]] për të ju shmangur ngatërrimev me përdorues të tjerë anonim.",
        "noarticletext": "Momentalisht nuk ka tekst në këtë faqe.\nJu mundeni [[Special:Search/{{PAGENAME}}|me kërkue këtë titull]] në faqe tjera,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} me kërkue në regjistrat tematikisht të afërm],\napo [{{fullurl:{{FULLPAGENAME}}|action=edit}} me redaktue këtë faqe]</span>.",
        "userpage-userdoesnotexist": "Llogaria e përdoruesit \"<nowiki>$1</nowiki>\" nuk âsht regjistrue.\nJu lutemi kontrolloni nëse doni me krijue/redaktue këtë faqe.",
        "clearyourcache": "'''Shenim - Mbas ruejtjes, ka mundësi që duheni me shmângë memorizimin në cache për me i pâ ndryshimet.'''\n'''Mozilla / Firefox / Safari:''' mbani ''Shift'' tue klikue në ''Reload'', ose trusni ''Ctrl-F5'' ose ''Ctrl-R'' (''Command-R'' në Mac);\n'''Konqueror: '''klikoni ''Reload'' ose trusni ''F5'';\n'''Opera:''' fshini cachein në ''Tools → Preferences'';\n'''Internet Explorer:''' mbani ''Ctrl'' tue klikue në ''Refresh,'' ose trusni ''Ctrl-F5''.",
        "usercssyoucanpreview": "'''Këshillë:''' Përdorni butonin 'Trego parapâmjen' për me testue CSS para se me i regjistrue ndryshimet.",
        "userjsyoucanpreview": "'''Këshillë:''' Përdorni butonin 'Trego parapâmjen' për me testue JS para se me i regjistrue ndryshimet.",
        "usercsspreview": "'''Vini re, jeni tue pâ veç parapâmjen e CSSit tuej.'''\n'''Ende nuk e keni ruejtë!'''",
-       "userjspreview": "'''Vini re, jeni tue testue/pâ veç parapâmjen e JavaScriptit tuej.'''\n'''Ende nuk e keni ruejtë!'''",
+       "userjspreview": "<strong>Vini re, jeni duke testuar/parë vetëm parapamjen e JavaScriptit tuaj.\nEnde nuk e keni ruajtur!</strong>",
        "userinvalidcssjstitle": "'''Kujdes:''' Nuk ka pâmje me emën \"$1\".\nVini re që faqet .css dhe .js përdorin vetëm titull me germa të vogla, psh. {{ns:user}}:Foo/vector.css për dallim prej {{ns:user}}:Foo/Vector.css.",
        "updated": "(E ndryshueme)",
        "note": "'''Shenim:'''",
index 355987d..9f50058 100644 (file)
@@ -62,6 +62,7 @@
        "tog-hideminor": "أخف التعديلات الطفيفة في أحدث التغييرات",
        "tog-hidepatrolled": "أخف التعديلات المراجعة في أحدث التغييرات",
        "tog-newpageshidepatrolled": "أخف الصفحات المعاينة من قائمة الصفحات الجديدة",
+       "tog-hidecategorization": "أخف تصنيف الصفحات",
        "tog-extendwatchlist": "مدد قائمة المراقبة لتعرض كل التغييرات، وليس أحدثها فقط",
        "tog-usenewrc": "طي التغييرات حسب الصفحة في أحدث التغييرات وقائمة المراقبة",
        "tog-numberheadings": "ترقيم العناوين تلقائيا",
@@ -91,6 +92,7 @@
        "tog-watchlisthideliu": "أخف تعديلات المستخدمين المسجلين في قائمة المراقبة",
        "tog-watchlisthideanons": "أخف تعديلات المستخدمين المجهولين في قائمة المراقبة",
        "tog-watchlisthidepatrolled": " أخف التعديلات المراجعة في قائمة المراقبة",
+       "tog-watchlisthidecategorization": "أخف تصنيف الصفحات",
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
        "createaccountreason": "السبب:",
        "createacct-reason": "السبب",
        "createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
-       "createacct-captcha": "تحقق أمني",
-       "createacct-imgcaptcha-ph": "أدخل النص الذي تراه في الأعلى",
        "createacct-submit": "افتح الحساب",
        "createacct-another-submit": "أنشئ حسابا",
-       "createacct-benefit-heading": "موقع {{SITENAME}} أنشأه أشخاص مثلك.",
+       "createacct-benefit-heading": "{{SITENAME}} موقع يساهم فيه أشخاص مثلك.",
        "createacct-benefit-body1": "{{PLURAL:$1|تحريرا|تحريرات}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحة}}",
        "createacct-benefit-body3": "آخر {{PLURAL:$1|مساهم|مساهمين}}",
        "passwordreset-emailerror-capture": "تم توليد رسالة بريد إلكتروني لتصفير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1",
        "changeemail": "تغيير أو إزالة عنوان البريد الإلكتروني",
        "changeemail-header": "تغيير عنوان البريد الإلكتروني للحساب",
+       "changeemail-passwordrequired": "تحتاج إلى إدخال كلمة السر الخاصة بك لتأكيد هذا التغيير.",
        "changeemail-no-info": "يجب تسجيل الدخول للوصول إلى هذه الصفحة مباشرة.",
        "changeemail-oldemail": "عنوان البريد الإلكتروني الحالي:",
        "changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
        "changeemail-password": "كلمة سر {{SITENAME}} الخاصة بك:",
        "changeemail-submit": "غيّر البريد الإلكتروني",
        "changeemail-throttled": "أنت قمت بمحاولات تسجيل دخول كثيرة.\nمن فضلك انتظر $1 قبل المحاولة ثانية.",
+       "changeemail-nochange": "رجاءً أدخل كلمة سر جديد مختلفة.",
        "resettokens": "غير المفاتيح",
        "resettokens-text": " يمكن تغيير المفاتيح من الاطلاع على البيانات الخصوصية المتعلقة بحسابك.\nغير المفاتيح إذا أطلعت عليها أحدهم عن طريف الخطأ أو إذا كان حسابك قد اخترق.",
        "resettokens-no-tokens": "ما من مفاتيح للتغيير.",
        "content-model-css": "CSS",
        "content-json-empty-object": "غرض فارغ",
        "content-json-empty-array": "مصفوفة فارغة",
+       "duplicate-args-warning": "<strong>تنبيه:</strong> المدخل \"$3\" ل[[:$1]] المستعمل في [[:$2]] مكرر. آخر قيمة مكرر منه هي المعتمدة.",
        "duplicate-args-category": "صفحات تستعمل قالبا ببيانات مكررة",
        "duplicate-args-category-desc": "تحوي هذه الصفحة استدعاءات قالب تستخدم متغيرات مزدوجة مثل <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> أو <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.\n\nينبغي أن تكون أقل من {{PLURAL:$2||استدعاء واحد|استدعاءين|$2 استدعاءات|$2 استدعاء}}، يوجد الآن {{PLURAL:$1|استدعاء واحد|استدعاءان|$2 استدعاءات|$2 استدعاء}}.",
        "search-category": "(التصنيف $1)",
        "search-file-match": "(يطابق محتوى الملف)",
        "search-suggest": "أتقصد: $1",
-       "search-rewritten": "عرض النتائج ل$1. ابحث بدلا من ذلك عن $2.",
+       "search-rewritten": "نتائج البحث المشابه $1 معروضة. يمكنك بدل ذلك البحث عن $2.",
        "search-interwiki-caption": "المشاريع الشقيقة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
        "recentchangeslinked-summary": "هذه قائمة بالتغييرات التي تمت حديثا للصفحات الموصولة من صفحة معينة (أو إلى الأعضاء ضمن تصنيف معين).\nالصفحات في [[Special:Watchlist|قائمة مراقبتك]] '''مغلظة'''",
        "recentchangeslinked-page": "اسم الصفحة:",
        "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضا عن ذلك",
+       "recentchanges-page-added-to-category": "[[:$1]] أضيفت إلى التصنيف",
        "upload": "ارفع ملفا",
        "uploadbtn": "ارفع الملف",
        "reuploaddesc": "إلغاء الرفع والرجوع إلى استمارة الرفع",
        "upload-dialog-button-done": "تم",
        "upload-dialog-button-save": "احفظ",
        "upload-dialog-button-upload": "رفع",
-       "upload-process-error": "حدث خطأ",
-       "upload-process-warning": "حدث تنبيه",
        "upload-form-label-select-file": "اختر ملفا",
        "upload-form-label-infoform-title": "التفاصيل",
        "upload-form-label-infoform-name": "الاسم",
        "logentry-newusers-byemail": "ُ{{GENDER:$2|أنشأ|أنشأت}} $1 حساب المستخدم $3 وأُرسلت كلمة السر بالبريد الإلكتروني",
        "logentry-newusers-autocreate": "أنشئ حساب {{GENDER:$2|المستخدم|المستخدمة}} $1 تلقائيًا",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|نقل}} إعدادات الحماية من $4 إلى $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|رفع|رفعت}} $1 الحماية عن $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|حمى|حمت}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|حمى|حمت}} $3 $4 [مضمنة]",
        "logentry-protect-modify": "{{GENDER:$2|غير|غيرت}} $1 مستوى الحماية ل$3 $4",
index e2ee451..e66358a 100644 (file)
@@ -26,6 +26,7 @@
        "tog-hideminor": "সাম্প্ৰতিক সাল-সলনিত অগুৰুত্বপূৰ্ণ সম্পাদনা নেদেখুৱাব",
        "tog-hidepatrolled": "সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব",
        "tog-newpageshidepatrolled": "নতুন পৃষ্ঠা তালিকাত তহলদাৰী পৃষ্ঠাসমূহ নেদেখুৱাব",
+       "tog-hidecategorization": "পৃষ্ঠাবোৰৰ শ্ৰেণীকৰণ লুকুৱাওক",
        "tog-extendwatchlist": "কেৱল সাম্প্ৰতিকেই নহয, লক্ষ্য-তালিকাৰ সকলো সাল-সলনি বহলাই দেখুৱাওক",
        "tog-usenewrc": "পৃষ্ঠাৰ পৰিৱৰ্তনসমূহ শেহতীয়া সালসলনি আৰু লক্ষ্যতালিকাত ভাগ কৰক",
        "tog-numberheadings": "শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক",
@@ -55,6 +56,7 @@
        "tog-watchlisthideliu": "প্ৰবেশ কৰা সদস্যৰ সম্পাদনাসমূহ আঁতৰাই অনুসৰণ-তালিকা দেখুৱাওক",
        "tog-watchlisthideanons": "বেনামী সদস্যৰ সম্পাদনাসমূহ আঁতৰাই অনুসৰণ-তালিকা দেখুৱাওক",
        "tog-watchlisthidepatrolled": "পৰীক্ষিত সম্পাদনাসমূহ লক্ষ্য-তালিকাৰ পৰা লুকুৱাই ৰাখক",
+       "tog-watchlisthidecategorization": "পৃষ্ঠাবোৰৰ শ্ৰেণীকৰণ লুকুৱাওক",
        "tog-ccmeonemails": "মই অন্য সদস্যলৈ পঠোৱা ই-মেইলৰ প্ৰতিলিপি এটা মোলৈও পঠাব",
        "tog-diffonly": "পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব",
        "tog-showhiddencats": "নিহিত শ্ৰেণীসমূহ দেখুৱাওক",
        "createaccountreason": "কাৰণ:",
        "createacct-reason": "কাৰণ",
        "createacct-reason-ph": "আপুনি কিয় আন এটা একাউণ্ট সৃষ্টি কৰিছে",
-       "createacct-captcha": "সুৰক্ষা পৰীক্ষা",
-       "createacct-imgcaptcha-ph": "ওপৰত দেখা পোৱা পাঠ্য লিখক",
        "createacct-submit": "আপোনাৰ একাউণ্ট সৃষ্টি কৰক",
        "createacct-another-submit": "একাউণ্ট সৃষ্টি কৰক",
        "createacct-benefit-heading": "আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে",
        "showingresultsinrange": "তলত #<strong>$2</strong>ৰ পৰা #<strong>$3</strong> পৰিসৰৰ ভিতৰত {{PLURAL:$1|<strong>1</strong>টা ফলাফল|<strong>$1</strong>টা লৈকে ফলাফল}} দেখুওৱা হৈছে।",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-ৰ <strong>$1</strong>টো ফলাফল|<strong>$3</strong>-ৰ <strong>$1 - $2</strong>টো ফলাফল}}",
        "search-nonefound": "এই অনুসন্ধানৰ কোনো ফলাফল নাই ।",
+       "search-nonefound-thiswiki": "এই ছাইটত এই সন্ধানৰ লগত মিলা কোনো ফলাফল নাই।",
        "powersearch-legend": "শক্তিশালী সন্ধান",
        "powersearch-ns": "নামস্থানবোৰত সন্ধান:",
        "powersearch-togglelabel": "পৰীক্ষা কৰক:",
        "rcshowhidemine": "মোৰ সম্পাদনা $1",
        "rcshowhidemine-show": "দেখুৱাওক",
        "rcshowhidemine-hide": "লুকুৱাওক",
+       "rcshowhidecategorization-show": "দেখুৱাওক",
+       "rcshowhidecategorization-hide": "লুকুৱাওক",
        "rclinks": "যোৱা $2 দিনত হোৱা $1 টা সাল-সলনি চাওক ।<br />$3",
        "diff": "পাৰ্থক্য",
        "hist": "ইতিবৃত্ত",
        "upload-dialog-button-done": "কৰা হ’ল",
        "upload-dialog-button-save": "সাঁচি থওক",
        "upload-dialog-button-upload": "আপল'ড",
-       "upload-process-error": "এটা ত্ৰুটি পোৱা গৈছে",
-       "upload-process-warning": "এটা সতৰ্কবাণী পোৱা গৈছে",
        "upload-form-label-select-file": "ফাইল নিৰ্বাচন কৰক",
        "upload-form-label-infoform-title": "বিস্তাৰিত",
        "upload-form-label-infoform-name": "নাম",
index b2dc32c..9374954 100644 (file)
@@ -18,6 +18,7 @@
        "tog-hideminor": "Anubrir les ediciones menores nos cambeos recientes",
        "tog-hidepatrolled": "Anubrir les ediciones vixilaes nos cambeos recientes",
        "tog-newpageshidepatrolled": "Anubrir les páxines vixilaes na llista de páxines nueves",
+       "tog-hidecategorization": "Tapecer la categorización de páxines",
        "tog-extendwatchlist": "Espander la llista de siguimientu p'amosar tolos cambeos, non solo los más recientes",
        "tog-usenewrc": "Agrupar los cambeos por páxina nos cambeos recientes y na llista de siguimientu",
        "tog-numberheadings": "Autonumberar los encabezaos",
@@ -47,6 +48,7 @@
        "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de siguimientu",
        "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de siguimientu",
        "tog-watchlisthidepatrolled": "Anubrir les ediciones patrullaes na llista de siguimientu",
+       "tog-watchlisthidecategorization": "Tapecer la categorización de páxines",
        "tog-ccmeonemails": "Mandame copies de los correos qu'unvio a otros usuarios",
        "tog-diffonly": "Nun amosar el conteníu de la páxina embaxo de les diferencies",
        "tog-showhiddencats": "Amosar categoríes anubríes",
        "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Por qué quier crear otra cuenta",
-       "createacct-captcha": "Comprobación de seguridá",
-       "createacct-imgcaptcha-ph": "Escriba'l testu qu'apaez arriba",
        "createacct-submit": "Crear la cuenta",
        "createacct-another-submit": "Crear una cuenta",
        "createacct-benefit-heading": "{{SITENAME}} failu xente como vusté.",
        "permissionserrors": "Fallu de permisos",
        "permissionserrorstext": "Nun tien permisu pa facer eso {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
        "permissionserrorstext-withaction": "Nun tien permisu pa $2 {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
+       "contentmodelediterror": "Nun ye posible editar esta revisión porque'l so modelu de conteníu ye <code>$1</code>, mentanto que'l modelu de conteníu actual de la páxina ye <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Avisu: Tas volviendo a crear una páxina que se desanició anteriormente.'''\n\nHabríes considerar si ye afechisco siguir editando esta páxina.\nEquí tienes el rexistru de desanicios y tresllaos d'esta páxina:",
        "moveddeleted-notice": "Esta páxina se desanició.\nComo referencia, embaxo s'ufre'l rexistru de desanicios y tresllaos de la páxina.",
        "moveddeleted-notice-recent": "Esta páxina desanicióse apocayá (dientro de les postreres 24 hores).\nLos rexistros de desaniciu y treslláu de la páxina amuésense de siguío como referencia.",
        "showingresultsinrange": "Más abaxo s'{{PLURAL:$1|amuesa|amuesen}} fasta {{PLURAL:$1|<strong>1</strong> resultáu|<strong>$1</strong> resultaos}} nel rangu ente #<strong>$2</strong> y #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultáu <strong>$1</strong> de <strong>$3</strong>|Resultaos <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Nun hebo resultaos que casaren cola consulta.",
+       "search-nonefound-thiswiki": "Nun hebo resultaos que casaran cola consulta nesti sitiu.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Buscar nos espacios de nome:",
        "powersearch-togglelabel": "Comprobar:",
        "prefs-help-recentchangescount": "Incluye los cambios recientes, los historiales de páxines y los rexistros.",
        "prefs-help-watchlist-token2": "Esta ye la clave secreta pa la canal de noticies web de la so llista de vixilancia.\nCualquiera que la sepa podrá lleer la so llista de vixilancia; nun la comparta.\n[[Special:ResetTokens|Calque equí si necesita reaniciala]].",
        "savedprefs": "Les tos preferencies quedaron grabaes.",
+       "savedrights": "Guardáronse los permisos d'{{GENDER:$1|usuariu|usuaria}} de $1.",
        "timezonelegend": "Estaya horaria:",
        "localtime": "Hora llocal:",
        "timezoneuseserverdefault": "Usar la predeterminada de la wiki ($1)",
        "rcshowhidemine": "$1 les mios ediciones",
        "rcshowhidemine-show": "Amosar",
        "rcshowhidemine-hide": "Anubrir",
+       "rcshowhidecategorization": "$1 la categorización de páxina",
+       "rcshowhidecategorization-show": "Amosar",
+       "rcshowhidecategorization-hide": "Tapecer",
        "rclinks": "Amosar los caberos $1 cambeos de los caberos $2 díes <br />$3",
        "diff": "dif",
        "hist": "hist",
        "upload-dialog-button-done": "Fecho",
        "upload-dialog-button-save": "Guardar",
        "upload-dialog-button-upload": "Xubir",
-       "upload-process-error": "Hebo un error",
-       "upload-process-warning": "Hebo un avisu",
        "upload-form-label-select-file": "Seleiciona un ficheru",
        "upload-form-label-infoform-title": "Detalles",
        "upload-form-label-infoform-name": "Nome",
        "svg-long-error": "Ficheru SVG inválidu: $1",
        "show-big-image": "Ficheru orixinal",
        "show-big-image-preview": "Tamañu d'esta previsualización: $1.",
+       "show-big-image-preview-differ": "Tamañu de la vista previa $3 d'esti ficheru $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Otra resolución|Otres resoluciones}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "animáu",
index 0c1c30f..72f5377 100644 (file)
        "createaccountreason": "نَدَن‌لیک:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
-       "createacct-captcha": "امنیت یوخلاماسی",
-       "createacct-imgcaptcha-ph": "اۆستده‌کی گؤردوگونوز یازینی یازین",
        "createacct-submit": "حسابینیزی یارادین",
        "createacct-another-submit": "بیر باشقا حساب یارات",
        "createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.",
        "passwordreset-emailsent-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
        "passwordreset-emailerror-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما {{GENDER:$2ایستیفاده‌چی}}‌یه گؤندرمگی باشاریلی اولمادی: $1",
        "changeemail": "ایمیل آدرسینی دَییشدیر",
-       "changeemail-text": "ایمیل آدرسینیزی دَییشمک اوچون بو فورمو دولدورون. بو دَییشیگی دوغرولاماق اوچون رمزینیزی وئرمه‌لیسینیز.",
+       "changeemail-header": "حساب ایمیل آدرسینی دَییشدیر",
        "changeemail-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
        "changeemail-oldemail": "ایندیکی ایمیل آدرس:",
        "changeemail-newemail": "یئنی ایمیل آدرسی:",
        "upload-dialog-button-done": "اولدو",
        "upload-dialog-button-save": "ذخیره ائت",
        "upload-dialog-button-upload": "یوکله",
-       "upload-process-error": "بیر یالنیشلیق اولدو",
-       "upload-process-warning": "بیر خطا باش وئردی",
        "upload-form-label-select-file": "فایل سئچ",
        "upload-form-label-infoform-title": "جوزئیات",
        "upload-form-label-infoform-name": "آد",
        "spam_reverting": "$1-ه باغلانتیسی اولمایان سون نوسخه‌یه قایتاریلیر",
        "spam_blanking": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، بوشادیلیر",
        "spam_deleting": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، سیلینیر",
-       "simpleantispam-label": "ضید هرز یازما بررسلیغی.\nبو قیسمتی'''دولدورمایین'''!",
+       "simpleantispam-label": "ضد اِسپم یوخلاماسی.\nبورانی <strong>دولدورمایین</strong>!",
        "pageinfo-title": "«$1» اوچون بیلگیلر",
        "pageinfo-not-current": "تأسفله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.",
        "pageinfo-header-basic": "اساس معلومات‌لار",
index 684923a..6368e8f 100644 (file)
@@ -22,6 +22,7 @@
        "tog-hideminor": "Хаваць дробныя праўкі ў сьпісе апошніх зьменаў",
        "tog-hidepatrolled": "Хаваць патруляваныя праўкі ў сьпісе апошніх зьменаў",
        "tog-newpageshidepatrolled": "Хаваць патруляваныя старонкі ў сьпісе новых старонак",
+       "tog-hidecategorization": "Схаваць катэгарызацыю старонак",
        "tog-extendwatchlist": "Пашырыць сьпіс назіраньня, каб ён паказваў усе зьмены, а ня толькі апошнія",
        "tog-usenewrc": "Групаваць зьмены па старонках у апошніх зьменах і сьпісе назіраньня",
        "tog-numberheadings": "Аўтаматычная нумарацыя загалоўкаў",
@@ -51,6 +52,7 @@
        "tog-watchlisthideliu": "Хаваць праўкі зарэгістраваных удзельнікаў у сьпісе назіраньня",
        "tog-watchlisthideanons": "Хаваць праўкі ананімаў у сьпісе назіраньня",
        "tog-watchlisthidepatrolled": "Хаваць патруляваныя праўкі ў сьпісе назіраньня",
+       "tog-watchlisthidecategorization": "Хаваць катэгарызацыю старонак",
        "tog-ccmeonemails": "Адпраўляць мне копіі лістоў, якія я дасылаю іншым удзельнікам",
        "tog-diffonly": "Не паказваць зьмест старонкі пад параўнаньнем зьменаў",
        "tog-showhiddencats": "Паказваць схаваныя катэгорыі",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Зь якой мэтай вы ствараеце іншы рахунак",
-       "createacct-captcha": "Праверка бясьпекі",
-       "createacct-imgcaptcha-ph": "Увядзіце тэкст, што бачыце вышэй",
        "createacct-submit": "Стварыць рахунак",
        "createacct-another-submit": "Стварыць рахунак",
        "createacct-benefit-heading": "{{SITENAME}} створаная людзьмі, такімі як вы.",
        "permissionserrors": "Памылка дазволу",
        "permissionserrorstext": "Вы ня маеце дазволу на гэтае дзеяньне з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "permissionserrorstext-withaction": "Вы ня маеце дазволу на $2 з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
+       "contentmodelediterror": "Вы ня можаце рэдагаваць гэтую вэрсію, бо яе мадэль зьместу — <code>$1</code>, а цяперашняя мадэль зьместу старонкі — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Увага: Вы ствараеце старонку, якая раней была выдаленая.'''\n\nУпэўніцеся, што стварэньне гэтай старонкі неабходнае.\nНіжэй пададзеныя журналы выдаленьняў і пераносаў гэтай старонкі:",
        "moveddeleted-notice": "Гэта старонка была выдаленая. Журналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй.",
        "moveddeleted-notice-recent": "Выбачайце, гэтая старонка была нядаўна выдаленая (цягам апошніх 24 гадзінаў).\nЖурналы выдаленьняў і пераносаў для гэтай старонкі пададзеныя ніжэй для даведкі.",
        "showingresultsinrange": "Ніжэй паказаныя да {{PLURAL:$1|<strong>$1</strong> выніку ў|<strong>$1</strong> вынікаў у}} дыяпазоне ад <strong>$2</strong> да <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|1=Вынік <strong>$1</strong> з <strong>$3</strong>|Вынікі <strong>$1—$2</strong> з <strong>$3</strong>}}",
        "search-nonefound": "Супадзеньняў па запыце ня знойдзена.",
+       "search-nonefound-thiswiki": "Супадзеньняў па запыце ня знойдзена на гэтым сайце.",
        "powersearch-legend": "Удасканалены пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
        "powersearch-togglelabel": "Пазначыць:",
        "prefs-help-recentchangescount": "Гэта датычыцца апошніх зьменах, гісторый старонак і журналаў.",
        "prefs-help-watchlist-token2": "Гэта сакрэтны ключ да стужкі вашага сьпісу назіраньня.\nКожны, хто ведае яго, можа набыць доступ да вашага сьпісу назіраньня, таму не дзяліцеся ім.\n[[Special:ResetTokens|Пстрыкніце тут, калі вам трэба скінуць яго]].",
        "savedprefs": "Вашыя налады былі захаваныя.",
+       "savedrights": "Правы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 былі захаваныя.",
        "timezonelegend": "Часавы пояс:",
        "localtime": "Мясцовы час:",
        "timezoneuseserverdefault": "Выкарыстоўваць стандартныя налады {{GRAMMAR:родны|{{SITENAME}}}} ($1)",
        "rcshowhidemine": "$1 мае праўкі",
        "rcshowhidemine-show": "Паказаць",
        "rcshowhidemine-hide": "Схаваць",
+       "rcshowhidecategorization": "$1 катэгарызацыю старонак",
+       "rcshowhidecategorization-show": "Паказаць",
+       "rcshowhidecategorization-hide": "Схаваць",
        "rclinks": "Паказаць апошнія $1 зьменаў за мінулыя $2 дзён<br />$3",
        "diff": "розьн",
        "hist": "гіст",
        "upload-options": "Налады загрузкі",
        "watchthisupload": "Назіраць за гэтым файлам",
        "filewasdeleted": "Файл з такой назвай загружаўся, але быў выдалены.\nВам трэба праверыць $1 перад новай загрузкай.",
+       "filename-thumb-name": "Гэта выглядае як назва мініятуры. Калі ласка, не загружайце мініятуры назад у тую ж вікі. Калі вам неабходны гэты файл, выпраўце назву на больш зразумелую, каб яна ня ўтрымлівала прэфікс мініятуры.",
        "filename-bad-prefix": "Назва файла, які Вы загружаеце, пачынаецца з '''«$1»'''. Падобныя бессэнсоўныя назвы звычайна ствараюцца аўтаматычна лічбавымі фотаапаратамі. Калі ласка, абярыце больш зразумелую назву для Вашага файла.",
        "upload-success-subj": "Загрузка пасьпяхова скончылася",
        "upload-success-msg": "Вашая загрузка з [$2] была пасьпяховая. Яна даступная тут: [[:{{ns:file}}:$1]]",
        "upload-dialog-button-done": "Зроблена",
        "upload-dialog-button-save": "Захаваць",
        "upload-dialog-button-upload": "Загрузіць",
-       "upload-process-error": "Адбылася памылка",
-       "upload-process-warning": "Зьявілася папярэджаньне",
        "upload-form-label-select-file": "Абраць файл",
        "upload-form-label-infoform-title": "Падрабязнасьці",
        "upload-form-label-infoform-name": "Назва",
        "upload-form-label-infoform-description": "Апісаньне",
        "upload-form-label-usage-title": "Выкарыстаньне",
        "upload-form-label-usage-filename": "Назва файлу",
+       "foreign-structured-upload-form-label-own-work": "Гэта мая ўласная праца",
+       "foreign-structured-upload-form-label-infoform-categories": "Катэгорыі",
+       "foreign-structured-upload-form-label-infoform-date": "Дата",
+       "foreign-structured-upload-form-label-own-work-message-local": "Я пацьвярджаю, што загружаю гэты файл згодна з правіламі і ліцэнзійнай палітыкай {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Калі вы ня можаце загрузіць файл у адпаведнасьці з правіламі {{GRAMMAR:родны|{{SITENAME}}}}, калі ласка, закрыйце гэтае акно і паспрабуйце іншы мэтад.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Вы таксама можаце паспрабаваць [[Special:Upload|старонку загрузкі па змоўчаньні]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Я разумею, што загружаю гэты файл у агульнае сховішча. Я пацьвярджаю, што раблю гэта ў адпаведнасьці з умовамі выкарыстаньня і ліцэнзійнай палітыкай.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Калі вы ня можаце загрузіць гэты файл паводле правілаў агульнага сховішча, калі ласка, закрыйце гэты дыялёг і паспрабуйце іншы мэтад.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Вы можаце паспрабаваць скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі гэты файл можна туды загрузіць згодна з правіламі.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Я пацьвярджаю, што зьяўляюся ўласьнікам аўтарскіх правоў на гэты файл, і згодны незваротна перадаць гэты файл ў Вікісховішча на ўмовах ліцэнзіі [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], а таксама згодны з [https://wikimediafoundation.org/wiki/Terms_of_Use умовамі выкарыстаньня].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Калі вы не зьяўляецеся ўласьнікам аўтарскіх правоў на гэты файл, або вы жадаеце распаўсюджваць яго пад іншай ліцэнзіяй, можаце скарыстацца [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстарам загрузкі ў Вікісховішча].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Вы таксама можаце скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі правілы сайту дазваляюць загрузку такога файлу.",
        "backend-fail-stream": "Немагчыма накіраваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файла $1.",
        "backend-fail-notexists": "Файл $1 не існуе.",
        "tooltip-minoredit": "Пазначыць гэтую зьмену як дробную",
        "tooltip-save": "Захаваць Вашы зьмены",
        "tooltip-preview": "Праглядзець Вашы зьмены. Калі ласка, выкарыстоўвайце гэтую магчымасьць перад тым, як захаваць старонку!",
-       "tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце.",
+       "tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце",
        "tooltip-compareselectedversions": "Пабачыць розьніцу паміж дзьвюма абранымі вэрсіямі гэтай старонкі.",
        "tooltip-watch": "Дадаць гэтую старонку ў Ваш сьпіс назіраньня",
        "tooltip-watchlistedit-normal-submit": "Выдаліць пазначаныя старонкі",
        "svg-long-error": "Няслушны SVG-файл: $1",
        "show-big-image": "Арыгінальны файл",
        "show-big-image-preview": "Памер прагляду: $1.",
+       "show-big-image-preview-differ": "Памер гэтага $3-прагляду для $2-файлу: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Іншае разрозьненьне|Іншыя разрозьненьні}}: $1.",
        "show-big-image-size": "$1 × $2 піксэлаў",
        "file-info-gif-looped": "паўтараецца",
        "tags-edit-failure": "Гэтыя зьмены ня могуць быць дастасаваныя:\n$1",
        "tags-edit-nooldid-title": "Няслушная мэтавая вэрсія",
        "tags-edit-nooldid-text": "Вы або не пазначылі мэтавую вэрсію для выкананьня гэтай функцыі, або пазначаная вэрсія не існуе.",
+       "tags-edit-none-selected": "Калі ласка, абярыце прынамсі адну метку для дадаваньня ці выдаленьня.",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
        "htmlform-cloner-create": "Дадаць больш",
        "htmlform-cloner-delete": "Выдаліць",
        "htmlform-cloner-required": "Патрабуецца як мінімум яшчэ адно значэньне.",
+       "htmlform-title-badnamespace": "[[:$1]] знаходзіцца не ў прасторы назваў «{{ns:$2}}».",
        "htmlform-user-not-exists": "<strong>$1</strong> не існуе.",
        "htmlform-user-not-valid": "<strong>$1</strong> — некарэктнае імя карыстальніка.",
        "sqlite-has-fts": "$1 з падтрымкай поўнатэкстнага пошуку",
index 3b2366e..7f4ed54 100644 (file)
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Защо създавате друга сметка",
-       "createacct-captcha": "Проверка за сигурност",
-       "createacct-imgcaptcha-ph": "Въведете текста, който виждате по-горе",
        "createacct-submit": "Създаване на сметката",
        "createacct-another-submit": "Създаване на друга сметка",
        "createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
index b43070d..0f7a605 100644 (file)
@@ -12,6 +12,7 @@
        "tog-hideminor": "کمین تغیرات شه آخیرین تغیراتانی لڑلیستا چیهر داته بئینت",
        "tog-hidepatrolled": "گشت وارته گین ایڈ\tیٹان شه آخیرین ایڈ\tیٹانی لڑلیستا چیهر داته بئینت",
        "tog-newpageshidepatrolled": "گشت وارته ئین تاکدیمان شه نی نوکین تاکدیمانی لڑ لیستا زیان بیئنت",
+       "tog-hidecategorization": "تاکدیمانئ دسته بندی ێی چیهر داتین",
        "tog-extendwatchlist": "پراخ کورتین واچلیستی لڑلیست په موچین تغیراتان،نه فقط آخرینان",
        "tog-usenewrc": "گروپ بندی تغیراتانئ بی اساسئ تاکدیمانئ اخیر ئین تغیران و واچلیستئ لڑ لیستا",
        "tog-numberheadings": "ئنوانانئ اتوماتیکین شماره گذاری",
@@ -41,6 +42,7 @@
        "tog-watchlisthideliu": "لوگین بوته ئین کار زوروکانی ایڈیٹ شه نی واچلیست چیهر بیئنت",
        "tog-watchlisthideanons": "نا دروستي ئین کار زوروکانی ایڈیٹ شه نی واچلیست چیهر بیئنت",
        "tog-watchlisthidepatrolled": "گشت وارته ئین ایڈیٹ شه واچلیستی تا چیهر بیئنت",
+       "tog-watchlisthidecategorization": "تاکدیمانئ دسته بندی ێی چیهر داتین",
        "tog-ccmeonemails": "په من یک کاپی شه آ ایمیلان که من په دیگران دیم ئه دهین ، دیم داته بیئت",
        "tog-diffonly": "جهلگی تاکدیمی محتوا تفاوت نشان داته مه بئینت",
        "tog-showhiddencats": "چیهرین تهرئانه نشان دهی",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "پچی شما لوٹیت که دیگرین کار زوروکین حساب جوڑ کنیت؟",
-       "createacct-captcha": "امنیتئ چیک کورتین",
-       "createacct-imgcaptcha-ph": "په بُرزه گین اکسا کی گیندیت متنی داخل کنیت",
        "createacct-submit": "وتئ کار زوروکین حسابا جوڑ کنیت",
        "createacct-another-submit": "دیگرین کار زوروکین حسابئ جوڑ کورتین",
        "createacct-benefit-heading": "ای {{SITENAME}} چو شمیا همیرنگین مردمانی واسطه ئا جوڑ بوته",
        "anonpreviewwarning": "<em>شما لوگین نه بوته ئیت. ذخیره کورتین باعث ئه بیئت که شمی آی پی ادرس بی ای تاکدیمی تاریخچه ئی تا ثبت بیئت.</em>",
        "missingcommenttext": "مهربانی بکنیت جهلگا توضیح دهیت.",
        "summary-preview": "دیم دیست ئی خلاصه:",
-       "subject-preview": "Ù\85Ù\88ضÙ\88 Ø¦Û\8c Ø¯Û\8cÙ\85 Ø¯Û\8cست/ئÙ\86Ù\88اÙ\86:",
+       "subject-preview": "Ù\85Ù\88زÙ\88Û\8cÛ\8c Ø¯Û\8cÙ\85 Ø¯Û\8cست:",
        "previewerrortext": "وختیکه شوما په وتي تغیراني نشان داتینا کوشش ئه کورتێت، یک خطاي مانجینا آت.",
        "blockedtitle": "کار زوروک بسته بوته",
        "blockedtext": "<strong>شمئ کارزورکین حساب یا آی پي ادرس بسته بوته.</strong>\n\nای بسته بوتین شه $1 ئی نیمگاه بوته.\nای نفر وتي دلیلا، ایرنگ گوشته: <em>$2</em>\n\n* بلاک یا بستین ئی شروع: $8\n* پاچ بوتین یا بلاک ئی الاسي: $6\n* هدفین بلاک بوته ئین کارزوروک: $7\n\nشوما توانێت که گۆ $1 یا گۆ [[{{MediaWiki:Grouppage-sysop}}|یک دیگرێن مدیري]] تماس بگیرێت و بئ ائ باره ئا هبر دهیت.\nتوجه کنیت که شما نه توانتیت شه  «ایمیل په ای کارزوروکا» استفاده بکنیت مگه ايکه یک معتبریندایمیل ادرسئ به وتي [[Special:Preferences|کارزوروکین حسابئ]] تا ثبت کورته به ئیت و هم  باید ای قابلیتئ امکان شه شوما گیپته مه بيت.\nشمئ انونین آی پي ادرس $3 و شمئ بلاک بوتینئ شماره $5 اینت.\nمهرباني بکنیت موچین مالوماتانا به وتئ درخواست ئانی تا ذکر بکنیت.",
+       "autoblockedtext": "شمی آی‌پی ادرس یسته بوته، په خاتیریکه ای  آی‌پی ادرس شه یک دیگرین کار زوروکئ نیمگاه استفاده بوته که آ شه $1 ئی نیمگاه بلاک بوته.\nدیم بوته ئین دلیل ایرنگ اینت:\n\n:''$2''\n\n* بلاک یا بستین ئی شروع: $8\n* پاچ بوتین یا بلاک ئی الاسي: $6\n* هدفین بلاک بوته ئین کارزوروک: $7\n\nشوما توانێت که گۆ $1 یا گۆ [[{{MediaWiki:Grouppage-sysop}}|یک دیگرێن مدیري]] تماس بگیرێت و بئ ائ باره ئا حبر دهیت.\nتوجه کنیت که شما نه توانتیت شه  «ایمیل په ای کارزوروکا» استفاده بکنیت مگه ايکه یک معتبرین ایمیل ادرسئ به وتي [[Special:Preferences|کارزوروکین حسابئ]] تا ثبت کورته به ئیت و هم  باید ای قابلیتئ امکان شه شوما گیپته مه بيت.\nشمئ انونین آی پي ادرس $3 و شمئ بلاک بوتینئ شماره $5 اینت.\nمهرباني بکنیت موچین مالوماتانا به وتئ درخواست ئانی تا ذکر بکنیت.",
        "blockednoreason": "دلیلی مشخص نه بوته",
        "whitelistedittext": "په مقاله ئانی ایڈیٹ ئا باید $1.",
+       "confirmedittext": "باید شما،دیم شه تاکدیماني دستکاری کورتینا، وتي ایمیل آدرسا مشخص و تائید بکنیت. مهرباني بکنیت شه [[Special:Preferences|کار زوروکئ تنظماتاني]] نیمگاه ای کارا بکنیت.",
        "nosuchsectiontitle": "ایرنگی بخشئ ودئ نه بوت",
+       "nosuchsectiontext": "شما کوشش کورته ایت که به ای تاکدیمی تا یک بخشیا دستکاری بکنیت که موجود نه اینت.\nمومکن اینت به همي وختا که شما تاکدیما سیل ئه کورتیت ای بخش جابجا یک پاک بوته.",
        "loginreqtitle": "لوگین بوتین ضروری اینت",
        "loginreqlink": "داخل بوتین",
        "loginreqpagetext": "په دیگه تاکدیمانئ دیستینا باید  $1.",
        "editundo": "خنثی‌ کورتین",
        "diff-empty": "(بدون تفاوت)",
        "diff-multi-sameuser": "(ای کار زوروکئ {{PLURAL:$1|یک میانی نخسه|$1 میانی نخسه}}ِ نمایش داته بوته)",
+       "diff-multi-otherusers": "({{PLURAL:$1|۱ میانین نخسه|$1 میانین نخسه}} دستکاری بوتگ شه {{PLURAL:$2|۱ کارزوروک|$2 کارزوروک}}ئ نیمگاه  نشان داته نه بوته)",
+       "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} میانین دستکاری بوته ئین نخسه گیشتیر شه {{PLURAL:$2|یک|$2}} کارزورکئ نیمگاه نشان داته نه بوته)",
        "searchresults": "گشتین ئی  نتیجه",
        "searchresults-title": "گشتینئ نتایج په «$1»",
        "titlematches": "مقاله ئی ئنوانئ یکی کورتین",
        "searchprofile-everything-tooltip": "گشتین په موچین محتوا ئان (شاملئ گپ ئی تاکدیمان)",
        "searchprofile-advanced-tooltip": "گشتین بی فضای نام دلخواه",
        "search-result-size": "$1 ({{PLURAL:$2|یک کلیمه|$2 کلیمه}})",
+       "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک گۆنڈ تهر|$2 گۆنڈ تهر}}، {{PLURAL:$3|یک فایل|$3 فایل}})",
        "search-redirect": "($1 یي گردینتین)",
        "search-section": "(بخش $1)",
        "search-category": "(تهر  $1)",
        "search-file-match": "(فایلی محتوایی یکرنگی)",
        "search-suggest": "آیا شمی منظور ایش ات: $1",
+       "search-rewritten": "$1 ئی نتیجه ئانی نمایش. گشتین په $2 جاها.",
        "search-interwiki-caption": "گوارین پروژه ئان",
        "search-interwiki-default": "نتایج شه $1 :",
        "search-interwiki-more": "(گیشتیر)",
        "recentchangescount": "پیش پرزین نشان داته بوته ئین ایڈیٹ ئانی اندازه گ:",
        "prefs-help-recentchangescount": "ای شامیل ئه بیت شه آخیرئین تغیران،که تاکدیمانی تاریخچه و خالیگاه انت.",
        "savedprefs": "شمی تنظیمات ذخیره بوتنت.",
+       "savedrights": "{{GENDER:$1|$1}}ئ کارزوروکین دسترسی ساتیته بوته انت.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "محلی ئن وخت:",
        "timezoneuseserverdefault": "استفاده شه  پیش‌فرض ئین ویکی ($1)",
        "rcshowhidemine": "$1 نی ایڈیٹان",
        "rcshowhidemine-show": "نشان داتین",
        "rcshowhidemine-hide": "چیهر داتین",
+       "rcshowhidecategorization": "$1 تاکدیمئ تهربندی",
+       "rcshowhidecategorization-show": "نشان داتین",
+       "rcshowhidecategorization-hide": "چیهر داتین",
        "rclinks": "نشان داتین $1 آخیر ئین تغییر بئ $2 اخیرین روچا<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "upload-dialog-button-done": "اجراء",
        "upload-dialog-button-save": "ساتیتێن",
        "upload-dialog-button-upload": "بُرز کورتین",
-       "upload-process-error": "یک خطای رخ دات",
-       "upload-process-warning": "یک اخطاری رخ دات",
        "upload-form-label-select-file": "فایلئ نشاني کورتین",
        "upload-form-label-infoform-title": "پاک کورتین (شه بین بورتین)",
        "upload-form-label-infoform-name": "نام",
        "trackingcategories-msg": "ردیابئ تهر",
        "trackingcategories-name": "پیامی نام",
        "trackingcategories-desc": "تهرئ کنجایش ئی معیاران",
+       "hidden-category-category-desc": "تهر به وتي تاکدیمئ  محتوای تا شمل شه <code><nowiki>__HIDDENCAT__</nowiki></code> اینت، که به اتوماتیکین رقما شه تهرِ لینکاني بکسئ نشان‌داتینا به تاکدیماني تا دیمگیری ئه کنت.",
        "trackingcategories-nodesc": "هیچ توضیحی موجود نه اینت.",
        "trackingcategories-disabled": "تهر غیر پئال بوته",
        "mailnologin": "ادرسئ شه دیم دهۆک ئا موجود نه اینت",
        "deletepage": "تاکدیمی پاک کورتین",
        "confirm": "تأیید کورتین",
        "excontent": "تاکدیمی محتوا ایش ات: «$1»",
-       "excontentauthor": "تاکدیمی محتوا ایش ات: «$1» (و تانا مشارکت کنۆک «[[Special:Contributions/$2|$2]]» ات)",
+       "excontentauthor": "تاکدیمی محتوا ایش ات: «$1» (و تاناین مشارکت کنۆک «[[Special:Contributions/$2|$2]]» ([[User talk:$2|گپ]]) ات)",
        "exbeforeblank": "تاکدیمی محتوا دیم شه خالی کورتینا ایش ات: «$1»",
        "delete-confirm": "پاک کورتین «$1»",
        "delete-legend": "پاک کورتین",
        "tooltip-n-help": "جای په ودی کورتین ئا",
        "tooltip-t-whatlinkshere": "موچین تاکدیمانی لڑ لیست که گۆ ای دیما لینک وارته انت",
        "tooltip-t-recentchangeslinked": "تاکدیمانئ آخیرین تغیران که ای دیم گۆ آوان لینک داریت",
+       "tooltip-feed-rss": "آراس‌اس ئی خبرنامه په ای تاکدیما",
        "tooltip-feed-atom": "اتم ئی حبرنامه په ای دیما",
        "tooltip-t-contributions": "ای کار زوروکئ شراکتانی لڑ لیست",
        "tooltip-t-emailuser": "په ای کار زوروکا ایمیل ئی دیم داتین",
        "tooltip-save": "وتئ تغیرانا ذخیره بکنیت",
        "tooltip-preview": "شمی تغیرانی دیم دیست، مهربانی بکنیت دیما شه تاکدیمی ذخیره کورتینا شه ای کیلی ئا استفاده بکنیت.",
        "tooltip-diff": "شمی تغیرانی نمایش که شما بئ متن ئی تا داته ایت.",
+       "tooltip-compareselectedversions": "ای تاکدمئ دو انتخاب بوته ئین نخسه ئاني فرقاني دیستین",
+       "tooltip-watch": "ای دیما به وتي واچلیست یا پدگیری لیستئ تا اڈڈ بکنیت",
        "tooltip-watchlistedit-normal-submit": "ئنوانانی پاک کورتین",
        "tooltip-watchlistedit-raw-submit": "واچلیست ئی اپڈیٹ",
        "tooltip-recreate": "پداجۆڑ کورتین تاکدیمی نه دیستین ایشیرا که ای تاکدیم دیما پاک بوته",
        "patrol-log-page": "گشتئ سیاه چال",
        "patrol-log-header": "ای سیاهه شه گشت وارته ئین ایڈیٹ ئان است.",
        "log-show-hide-patrol": "$1 گشت جنوکین سیاهه",
+       "log-show-hide-tag": "$1 خالیجای ٹاپه",
        "deletedrevision": "$1 قدیمی پاک بوته ئین نخسه ئی است",
        "filedeleteerror-short": "خطا بئ فایلی پاک کورتین: $1",
        "filedeleteerror-long": "بی پدا  پاک کورتین ئی وختا خطا رخ دات:\n\n$1",
        "exif-gpslatitude-s": "جوگراپیایی جنوبی گ\tۆور",
        "exif-gpslongitude-e": "جوگراپیایی روچ درات ئی تچکی",
        "exif-gpslongitude-w": "جوگراپیایی روچ کپت ئی تچکی",
-       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|میتر|میتر}} بُرزتیر شه دریابی روگا",
-       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|میتر|میتر}} جهلتیر شه دریابی روگا",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|میتر}} بُرزتیر شه دریابی روگا",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|میتر}} جهلتیر شه دریابی روگا",
        "exif-gpsstatus-a": "بی اندازه گیری هالا",
        "exif-gpsstatus-v": "اندازه گ ئی موقایسه گیری",
        "exif-gpsmeasuremode-2": "دو بوئدین اندازه گیری",
        "version-libraries": "نصب بوته ئین کتابخانه",
        "version-libraries-library": "کتابجاه",
        "version-libraries-version": "نخسه",
+       "version-libraries-license": "اجازه نامه",
+       "version-libraries-description": "توضیحان",
+       "version-libraries-authors": "نویسوکان",
        "redirect-legend": "گردینتین په یک پایل یا تاکدیمئ",
        "redirect-submit": "برا",
        "redirect-lookup": "گشتین:",
        "tags-deactivate-reason": "دلیل:",
        "tags-deactivate-not-allowed": "«$1» ئی تگی غیر په هال کورتین ممکن نه اینت.",
        "tags-deactivate-submit": "غیرپئال کورتین",
+       "tags-edit-title": "ٹاپه ئی ایڈ\tیٹ کورتین",
+       "tags-edit-manage-link": "ٹاپه ئاني مدیریت کورتین",
+       "tags-edit-revision-selected": "{{PLURAL:$1|انتخاب بووته ئین نخسه|انتخابین نخسه ئان}} شه [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|انتخاب بوته ئین خالیجا}}:",
        "tags-edit-existing-tags": "موجودین ٹاپه ئان:",
        "tags-edit-existing-tags-none": "\"هیچگوجام\"",
        "tags-edit-new-tags": "نوکین ٹاپه:",
        "revdelete-uname-unhid": "کار زوروکئ ناما سر درا کورت",
        "revdelete-restricted": "مدیر ئانه محدود کورت",
        "revdelete-unrestricted": "مدیرئانی محدودیت ئا پروشت",
+       "logentry-block-reblock": "$1 بلاک ئی {{GENDER:$2|تنظیماتانه}} په {{GENDER:$4|$3}} ئانه به انبلاک گو بلاکئ وختي الاسیا $5 $6 تغییر دات.",
+       "logentry-suppress-block": "$1 {{GENDER:$2|بسته بوت}} {{GENDER:$4|$3}} گو انبلاک کورتینئ وختا به $5 $6",
+       "logentry-suppress-reblock": "$1 بلاک ئی {{GENDER:$2|تنظیماتانه}} په {{GENDER:$4|$3}} ئانه به انبلاک گو بلاکئ وختي الاسیا $5 $6 تغییر دات.",
+       "logentry-import-interwiki": "$1 $3 ئانه شه دیگه ویکیێ {{GENDER:$2|لَڈڈینت}}",
        "logentry-merge-merge": "$1  $3  را بئ  $4 {{GENDER:$2| ادغام کورت}} (نخسه تا  $5)",
        "logentry-move-move": "$1، $3 ئی تاکدیما بئ $4 {{GENDER:$2|جابجا کورت}}",
+       "logentry-move-move-noredirect": "$1  $3 ئی تاکدیما بغیر شه ایشی که گوجام تغیرمسیرئ بجا بیللیت  به $4 {{GENDER:$2|جابجا کورت}}",
        "logentry-newusers-newusers": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-create": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-create2": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-byemail": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}} و چیهرگال یا پاسورد گو ایمیلا دیم داته بوت",
        "logentry-newusers-autocreate": "$1 ئی حساب بئ اتوماتیکین رکما {{GENDER:$2|جۆڑ بوت}}",
+       "logentry-protect-move_prot": "$1 قُلپئ تنظیمانا شه $4 به $3 {{GENDER:$2|جابجا کورت}}",
+       "logentry-protect-unprotect": "$1 $3 ئا شه قُپا {{GENDER:$2|دَر کورت}}",
+       "logentry-protect-protect": "$1 $3 ئا {{GENDER:$2|قُلپ کورت}} $4",
+       "logentry-protect-protect-cascade": "$1 $3 $4 {{GENDER:$2|قُلپ کورت}} [آبشاری]",
+       "logentry-protect-modify": "$1 $3 ئ قُلپئ اندازه گا به {{GENDER:$2|تغییر دات}} $4",
+       "logentry-protect-modify-cascade": "$1 $3 $4 ئ قُلپئ اندازه گا په {{GENDER:$2|تغییر دات}}[آپشاری]",
        "logentry-rights-rights": "$1 ، $3 ئی عضویتا شه $4 ئی گروپا بئ $5 {{GENDER:$2|تغییر دات}}",
        "logentry-rights-rights-legacy": "$1 عضویتئ گروپا بئ $3 ئا {{GENDER:$2|تغییر دات}}",
        "logentry-rights-autopromote": "$1 بئ اوتوماتیکین رکما وتر شه $4 بئ $5 {{GENDER:$2|ارتقاء دات}}",
        "logentry-upload-revert": "$1 {{GENDER:$2|بُرز کورت}} $3 ئا",
        "log-name-managetags": "تگ ئی تاریخچه ئی مدیریت",
        "logentry-managetags-create": "$1 تگ «$4» ئا {{GENDER:$2|ج\tۆڑ کورت}}",
+       "log-name-tag": "خالیجای ٹاپه",
        "rightsnone": "(هیچ)",
        "revdelete-summary": "ایڈیتی خاصه",
        "feedback-back": "بیئرگشت",
index d4a8520..96cc12c 100644 (file)
@@ -33,6 +33,7 @@
        "tog-hideminor": "অনুল্লেখ্য সম্পাদনাগুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
        "tog-hidepatrolled": "পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
        "tog-newpageshidepatrolled": "পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো",
+       "tog-hidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকান",
        "tog-extendwatchlist": "শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন",
        "tog-usenewrc": "সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলো একত্রে প্রদর্শন",
        "tog-numberheadings": "শিরোনামগুলোকে স্বয়ংক্রিয়ভাবে ক্রমিক নম্বর দাও",
@@ -62,6 +63,7 @@
        "tog-watchlisthideliu": "নজরতালিকাতে অ্যাকাউন্টে লগ-ইন করা ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক",
        "tog-watchlisthideanons": "নজরতালিকাতে বেনামী ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক",
        "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনা গুলো নজরতালিকায় আড়াল করো",
+       "tog-watchlisthidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকান",
        "tog-ccmeonemails": "অন্য ব্যবহারকারীর কাছে আমার পাঠানো ইমেইলের একটি অনুলিপি আমাকে পাঠানো হোক",
        "tog-diffonly": "পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক",
        "tog-showhiddencats": "লুকায়িত বিষয়শ্রেণীসমূহ দেখাও",
        "viewsource": "উৎস দেখুন",
        "viewsource-title": "$1 এর উৎস দেখুন",
        "actionthrottled": "কাজের গতি ধীরকরণ",
-       "actionthrottledtext": "স্প্যাম-রোধী সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদনা করার সীমা বেঁধে দেওয়া হয়েছে। আপনি সেই সীমা অতিক্রম করেছেন। অনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
+       "actionthrottledtext": "স্প্যাম-রোধী সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদনা করার সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
        "protectedpagetext": "সম্পাদনা অথবা স্থানান্তর এড়াতে এ পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে।",
        "viewsourcetext": "এ পাতাটি আপনি দেখতে এবং উৎসের অনুলিপি নিতে পারবেন।",
        "viewyourtext": "আপনি এই পাতায় <strong>আপনার সম্পাদনা</strong>দেখতে এবং অনুলিপি করতে পারেন।",
        "createaccountreason": "কারণ:",
        "createacct-reason": "কারণ",
        "createacct-reason-ph": "কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন",
-       "createacct-captcha": "নিরাপত্তা পরীক্ষা",
-       "createacct-imgcaptcha-ph": "উপরে যে লেখা দেখতে পাচ্ছেন তা লিখুন",
        "createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
        "createacct-another-submit": "অ্যাকাউন্ট তৈরি করুন",
        "createacct-benefit-heading": "{{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি।",
        "passwordreset-emailtext-ip": "কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার\nপাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailtext-user": "ব্যবহারকারী $1 {{SITENAME}} ($4) সাইটের জন্য আপনার পাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailelement": "ব্যবহারকারী নাম: \n$1\n\nঅস্থায়ী পাসওয়ার্ড: \n$2",
-       "passwordreset-emailsent": "পাসà¦\93য়ারà§\8dড à¦¬à¦¦à¦²à§\87র à¦\8fà¦\95à¦\9fি à¦\87-মà§\87à¦\87ল à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¯à¦¼à§\87à¦\9bে।",
+       "passwordreset-emailsent": "যদি à¦\86পনার à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9fà§\87র à¦\9cনà§\8dয à¦\8fà¦\9fি à¦\8fà¦\95à¦\9fি à¦¨à¦¿à¦¬à¦¨à§\8dধিত à¦\87মà§\87ল à¦ à¦¿à¦\95ানা à¦¹à¦¯à¦¼, à¦¤à¦¾à¦¹à¦²à§\87 à¦\8fà¦\95à¦\9fি à¦ªà¦¾à¦¸à¦\93য়ারà§\8dড à¦¬à¦¦à¦²à§\87র à¦\87মà§\87à¦\87ল à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¬ে।",
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
-       "changeemail": "ই-মেইল ঠিকানা পরিবর্তন",
-       "changeemail-header": "অ্যাকাউন্ট ই-মেইল ঠিকানা পরিবর্তন",
+       "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
+       "changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
+       "changeemail-passwordrequired": "এই পরিবর্তন নিশ্চিত করতে আপনাকে আপনার পাসওয়ার্ড লিখতে হবে।",
        "changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।",
        "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
        "changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
        "sig_tip": "সময় ও তারিখসহ আপনার স্বাক্ষর",
        "hr_tip": "অনুভূমিক রেখা (সংযতভাবে ব্যবহার করুন)",
        "summary": "সারাংশ:",
-       "subject": "বিষয়/শিরোনাম:",
+       "subject": "বিষয়:",
        "minoredit": "এটি একটি অনুল্লেখ্য সম্পাদনা",
        "watchthis": "এই পাতাটি নজরে রাখুন",
        "savearticle": "সংরক্ষণ",
        "missingsummary": "'''খেয়াল করুন''':  আপনি কিন্তু সম্পাদনার সারাংশ দেননি। আবার যদি \"সংরক্ষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
        "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
-       "missingcommentheader": "'''খেয়াল করুন:''' আপনি এই মন্তব্যের জন্য কোন বিষয়/শিরোনাম দেননি। সংরক্ষণ বোতামে ক্লিক করলে, আপনার এই সম্পাদনা কোন বিষয়/শিরোনাম ছাড়াই সংরক্ষিত হবে।",
+       "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোন বিষয় প্রদান করেননি।আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
        "summary-preview": "সারাংশ প্রাকদর্শন:",
-       "subject-preview": "বিষয়/শিরোনাম প্রাকদর্শন:",
+       "subject-preview": "বিষয় প্রাকদর্শন:",
        "previewerrortext": "আপনার পরিবর্তনগুলি প্রাকদর্শন করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে।",
        "blockedtitle": "ব্যবহারকারীকে বাধা দেয়া হয়েছে",
        "blockedtext": "আপনার ব্যবহারকারী নাম বা আইপি ঠিকানার ঊপর নিষেধাজ্ঞা আরোপিত হয়েছে।\n\n$1 নিষেধাজ্ঞা আরোপ করেছেন। নিষেধের কারণ হিসেবে বলা হয়েছে:''$2''।\n\n* নিষেধাজ্ঞা শুরুর সময়:$8\n* নিষেধাজ্ঞা উঠিয়ে নেয়ার সময়: $6\n* যার উপর নিষেধাজ্ঞা আরোপ করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই নিষেধাজ্ঞা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি '(ব্যবহারকারীকে) ইমেইল করুন' ফিচারটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ই-মেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং ফিচারটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি ফিচারটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা $3, এবং আপনার নিষেধাজ্ঞা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "permissionserrorstext-withaction": "আপনার $2 করার অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}}:",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
+       "moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ ও স্থানান্তর লগ দেয়া হয়েছে।",
        "log-fulllog": "সম্পূর্ণ লগ দেখাও",
        "edit-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "mergehistory-go": "একত্রীকরণযোগ্য সম্পাদনাগুলি দেখানো হোক",
        "mergehistory-submit": "সংশোধনগুলি একত্র করা হোক",
        "mergehistory-empty": "কোন সংশোধন একত্র করা যাবে না.",
-       "mergehistory-done": "$1 গুলোর মধ্যে $3 {{PLURAL:$3| টি সংশোধন |টি সংশোধনগুলো}} সফলভাবে [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
+       "mergehistory-done": "$1-এর $3{{PLURAL:$3|টি সংশোধন}} [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
        "mergehistory-fail": "ইতিহাস একত্র করা গেল না। অনুগ্রহ করে পাতাটি ও সময়ের প্যারামিটারগুলি আবার পরীক্ষা করে দেখুন।",
        "mergehistory-fail-toobig": "ইতিহাস থেকে আগের পাতাগুলো একীকরণ সম্ভব নয়, কারণ এর ফলে সর্বোচ্চ $1 টি {{PLURAL:$1|সংস্করণ}} স্থানান্তরের সীমানা অতিক্রম করবে।",
        "mergehistory-no-source": "$1 বলে কোন উৎস পাতার অস্তিত্ব নেই।",
        "showingresultsinrange": "#<strong>$2</strong> থেকে #<strong>$3</strong> পরিসীমার মধ্যে {{PLURAL:$1|<strong>১টি</strong> ফলাফল|<strong>$1টি</strong> ফলাফল}} নিচে দেখানো হচ্ছে।",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-এর মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>-এর মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
        "search-nonefound": "খোঁজকৃত পাতার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
+       "search-nonefound-thiswiki": "খোঁজ করার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
        "powersearch-legend": "উন্নত অনুসন্ধান",
        "powersearch-ns": "নামস্থানে অনুসন্ধান করো:",
        "powersearch-togglelabel": "পরীক্ষা:",
        "prefs-watchlist-token": "নজরতালিকা টোকেন:",
        "prefs-misc": "বিবিধ",
        "prefs-resetpass": "পাসওয়ার্ড পরিবর্তন",
-       "prefs-changeemail": "ই-মেইল পরিবর্তন",
+       "prefs-changeemail": "ইমেইল ঠিকানা পরিবর্তন বা বাতিল",
        "prefs-setemail": "একটি ই-মেইল ঠিকানা নির্ধারণ করুন",
        "prefs-email": "ই-মেইল অপশন",
        "prefs-rendering": "অবয়ব",
        "rows": "সারি:",
        "columns": "কলাম:",
        "searchresultshead": "অনুসন্ধান",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">অসম্পূর্ণ নিবন্ধের সংযোগগুলির</a> বিশেষ ফরম্যাটিঙের সীমা (বাইটে):",
+       "stub-threshold": "অসম্পূর্ণ লিঙ্ক বিন্যাসের জন্য প্রান্তিক মাপ ($1):",
        "stub-threshold-sample-link": "নমুনা",
        "stub-threshold-disabled": "নিস্ক্রিয়",
        "recentchangesdays": "সাম্প্রতিক পরিবর্তনে দিনসমূহ দেখানোর জন্য:",
        "prefs-help-recentchangescount": "এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।",
        "prefs-help-watchlist-token2": "এটি আপনার নজরতালিকার ওয়েব ফিডের গোপন চাবি। যে কেউ যিনি এটা জানেন তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনরায় সেট করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "savedprefs": "আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।",
+       "savedrights": "{{GENDER:$1|$1}}-এর ব্যবহারকারী অধিকার সংরক্ষিত হয়েছে।",
        "timezonelegend": "সময়স্থান:",
        "localtime": "স্থানীয় সময়:",
        "timezoneuseserverdefault": "উইকির পূর্বনির্ধারিত সময় ব্যবহার করো ($1)",
        "rcshowhidemine": "আমার সম্পাদনাগুলো $1",
        "rcshowhidemine-show": "দেখাও",
        "rcshowhidemine-hide": "আড়াল করো",
+       "rcshowhidecategorization": "পাতা শ্রেণীবদ্ধকরণ $1",
+       "rcshowhidecategorization-show": "দেখাও",
+       "rcshowhidecategorization-hide": "আড়াল করো",
        "rclinks": "'''প্রদর্শনের ধরন'''<br />\n* বিগত ($2) দিনের শেষ ($1)টি পরিবর্তন দেখাও\n* $3",
        "diff": "পরিবর্তন",
        "hist": "ইতিহাস",
        "recentchanges-page-added-to-category-bundled": "বিষয়শ্রেণীতে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} যোগ করা হয়েছে",
        "recentchanges-page-removed-from-category": "বিষয়শ্রেণী থেকে [[:$1]] সরানো হয়েছে",
        "recentchanges-page-removed-from-category-bundled": "বিষয়শ্রেণী থেকে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} সরানো হয়েছে",
+       "autochange-username": "মিডিয়াউইকি স্বয়ংক্রিয় পরিবর্তন",
        "upload": "আপলোড",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
        "uploaded-script-svg": "আপলোডকৃত SVG ফাইলে স্ক্রিপ্টযোগ্য উপাদান \"$1\" পাওয়া গেছে।",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
+       "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"$1\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "uploadvirus": "এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1",
        "upload-dialog-button-done": "সম্পন্ন",
        "upload-dialog-button-save": "সংরক্ষণ",
        "upload-dialog-button-upload": "আপলোড",
-       "upload-process-error": "একটি ত্রুটি দেখা দিয়েছে",
-       "upload-process-warning": "একটি সতর্কবার্তা দেখা দিয়েছে",
        "upload-form-label-select-file": "ফাইল নির্বাচন করুন",
        "upload-form-label-infoform-title": "বিস্তারিত",
        "upload-form-label-infoform-name": "নাম",
        "upload-form-label-infoform-description": "বিবরণ",
        "upload-form-label-usage-title": "ব্যবহার",
        "upload-form-label-usage-filename": "ফাইলের নাম",
+       "foreign-structured-upload-form-label-own-work": "এটি আমার নিজের কাজ",
+       "foreign-structured-upload-form-label-infoform-categories": "বিষয়শ্রেণীসমূহ",
+       "foreign-structured-upload-form-label-infoform-date": "তারিখ",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "এছাড়াও আপনি [[Special:Upload|ডিফল্ট আপলোডের পাতা]] চেষ্টা করতে পারেন।",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "backend-fail-backup": "\"$1\" ফাইলের ব্যাকআপ তৈরী সম্ভব নয়।",
        "backend-fail-notexists": "\"$1\" নামের কোনো ফাইল নেই।",
        "deletepage": "পাতাটি মুছে ফেলা হোক",
        "confirm": "নিশ্চিত করুন",
        "excontent": "বিষয়বস্তু ছিল: '$1'",
-       "excontentauthor": "বিষয়বস্তু ছিল: \"$1\" (এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "বিষয়বস্তু ছিল: \"$1\", এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|আলাপ]])",
        "exbeforeblank": "মুছে ফেলার আগে বিষয়বস্তু ছিল: '$1'",
        "delete-confirm": "\"$1\" অপসারণ",
        "delete-legend": "অপসারণ",
        "cant-move-to-user-page": "আপনার কোনো পাতা ব্যবহারকারী পাতার স্থানান্তরের অনুমতি নেই (ব্যবহারকারী উপপাতা ব্যতিত)।",
        "cant-move-category-page": "আপনার বিষয়শ্রেণী পাতা স্থানান্তরের অনুমতি নেই।",
        "cant-move-to-category-page": "আপনার পাতাটিকে বিষয়শ্রেণী পাতায় স্থানান্তরের অনুমতি নেই।",
-       "newtitle": "à¦\8fà¦\87 à¦¨à¦¤à§\81ন à¦¶à¦¿à¦°à§\8bনামà§\87",
+       "newtitle": "নতà§\81ন à¦¶à¦¿à¦°à§\8bনাম:",
        "move-watch": "এই পাতাটি নজরে রাখুন",
        "movepagebtn": "পাতা স্থানান্তর করুন",
        "pagemovedsub": "সরিয়ে নেওয়া হয়েছে",
        "svg-long-error": "অবৈধ SVG ফাইল: $1",
        "show-big-image": "মূল ফাইল",
        "show-big-image-preview": "এই প্রাকদর্শনের আকার: $1।",
+       "show-big-image-preview-differ": "এই $2 ফাইলের জন্য এই $3 প্রাকদর্শনের আকার: $1।",
        "show-big-image-other": "অন্যান্য {{PLURAL:$2|আকার|আকারসমূহ}}: $1।",
        "show-big-image-size": "$1 × $2 পিক্সেল",
        "file-info-gif-looped": "লুপকৃত",
        "version-poweredby-others": "অন্যান্য",
        "version-poweredby-translators": "translatewiki.net অনুবাদকগণ",
        "version-credits-summary": "[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।",
-       "version-license-info": "মিডিয়াউইকি একটি ফ্রি সফটওয়্যার, আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। \n\nসকলের উপকারের লক্ষ্যে এটি বিতরণ করা হয়ে থাকে, কিন্তু এক্ষেত্রে কোনো ওয়ারেন্টি দেয়া হয় না, এমনকি বিশেষ কোনো কার্যক্ষেত্রে ব্যবহারের জন্যও তথাকথিত ওয়ারেন্টি দেয়া হয় না। বিস্তারিত জানতে দেখুন গনু জেনারেল পাবলিক লাইসেন্স। \n\nএই সফটওয়্যারের সাথে [{{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-license-info": "মিডিয়াউইকি একটি ফ্রি সফটওয়্যার; আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। \n\nসকলের উপকারের লক্ষ্যে এটি বিতরণ করা হয়ে থাকে, কিন্তু এক্ষেত্রে কোনো ওয়ারেন্টি দেয়া হয় না, এমনকি বিশেষ কোনো কার্যক্ষেত্রে ব্যবহারের জন্যও তথাকথিত ওয়ারেন্টি দেয়া হয় না। বিস্তারিত জানতে দেখুন গনু জেনারেল পাবলিক লাইসেন্স। \n\nএই সফটওয়্যারের সাথে [{{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": "পণ্য",
        "version-software-version": "সংস্করণ",
        "tags-create-reason": "কারণ:",
        "tags-create-submit": "তৈরি করুন",
        "tags-create-no-name": "আপনাকে একটি ট্যাগের নাম অবশ্যই উল্লেখ করতে হবে।",
+       "tags-create-already-exists": "\"$1\" ট্যাগ ইতিমধ্যেই বিদ্যমান।",
        "tags-delete-title": "ট্যাগ অপসারণ",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
+       "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-reason": "কারণ:",
        "tags-activate-submit": "চালু",
index 64e2111..ad4463b 100644 (file)
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjerenje",
        "redirectto": "Preusmjerenje na:",
-       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena $2, $1",
+       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
        "viewsource": "Prikaži izvor",
        "viewsource-title": "Prikaz izvora stranice $1",
        "actionthrottled": "Akcija je usporena",
-       "actionthrottledtext": "Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.",
+       "actionthrottledtext": "U cilju borbe protiv zloupotrebe, ograničeno vam je da u kratkom vremenskom periodu previše puta vršite ovu radnju, a upravo ste prešli to ograničenje.\nPokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana da bi se spriječile izmjene.",
        "viewsourcetext": "Možete vidjeti i kopirati izvorni kôd ove stranice.",
-       "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
+       "viewyourtext": "Možete vidjeti i kopirati izvor '''vaših izmjena''' na ovoj stranici.",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.",
        "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
        "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan korisnički račun?",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Napravite svoj korisnički račun",
-       "createacct-another-submit": "Napravi još jedan korisnički račun",
+       "createacct-another-submit": "Napravi korisnički račun",
        "createacct-benefit-heading": "{{SITENAME}} je napravljena od strane ljudi kao što ste Vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
        "passwordreset-emailtext-ip": "Neko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik Vaših detalja računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše početne šifre, a ne želite je promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
-       "passwordreset-emailsent": "Podsjetnik na lozinku poslan je na Vašu e-mail adresu.",
+       "passwordreset-emailsent": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre će vam biti poslan na vašu adresu e-pošte.",
        "passwordreset-emailsent-capture": "Poslan je podsjetnik preko e-pošte (prikazano ispod).",
        "passwordreset-emailerror-capture": "E-poruka za resetiranje lozinke, prikazano ispod, poslana je, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1",
-       "changeemail": "Promjena e-adrese",
-       "changeemail-header": "Promijeni e-mail adresu korisničkog računa",
+       "changeemail": "Promjena ili uklanjanje e-adrese",
+       "changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
        "changeemail-no-info": "Morate biti prijavljeni za direktan pristup ovoj stranici.",
        "changeemail-oldemail": "Trenutna adresa e-pošte:",
        "changeemail-newemail": "Nova adresa e-pošte:",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
-       "subject": "Tema/naslov:",
+       "subject": "Tema:",
        "minoredit": "Ovo je manja izmjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "missingsummary": "'''Napomena:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj, Vaša izmjena će biti sačuvana bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu/naslov za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pregled sažetka:",
-       "subject-preview": "Pregled tema/naslova:",
+       "subject-preview": "Pregled teme:",
        "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "'''Vaše korisničko ime ili IP-adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je sljedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati sa $1 ili nekim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorom]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP-adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke pri zahtjevu za deblokadu.",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
        "mergehistory-submit": "Spoji revizije",
        "mergehistory-empty": "Nema revizija za spajanje.",
-       "mergehistory-done": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice $1 uspješno spojeno u [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene|izmjena}} stranice $1 uspješno je spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
        "mergehistory-fail-toobig": "Ne može se izvršiti spajanje historije jer će se više premjestiti više od ograničenja od $1 {{PLURAL:$1|revizije|revizija}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "prefs-watchlist-token": "Žeton praćenih članaka:",
        "prefs-misc": "Ostala podešavanja",
        "prefs-resetpass": "Promijeni šifru",
-       "prefs-changeemail": "Promijeni adresu e-pošte",
+       "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
        "prefs-email": "Opcije e-pošte",
        "prefs-rendering": "Izgled",
        "rows": "Redova:",
        "columns": "Kolona:",
        "searchresultshead": "Pretraga",
-       "stub-threshold": "Formatiranje <a href=\"#\" class=\"stub\">linkova stranica u začetku</a> (bajtova):",
+       "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
+       "stub-threshold-sample-link": "primjer",
        "stub-threshold-disabled": "Isključeno",
        "recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
        "recentchangesdays-max": "Najviše $1 {{PLURAL:$1|dan|dana}}",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzornici",
+       "group-suppress": "Skrivači",
        "group-all": "(sve)",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica}}",
        "group-autoconfirmed-member": "Potvrđeni korisnik",
        "group-bot-member": "bot",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorica}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
-       "group-suppress-member": "Nadzornik",
+       "group-suppress-member": "{{GENDER:$1|skrivač|skrivačica}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzornici",
+       "grouppage-suppress": "{{ns:project}}:Skrivač",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
        "right-createpage": "Pravljenje stranica (neuključujući stranice za razgovor)",
        "rcshowhidemine": "$1 moje izmjene",
        "rcshowhidemine-show": "Prikaži",
        "rcshowhidemine-hide": "Sakrij",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Sakrij",
        "rclinks": "Prikaži posljednjih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl",
        "hist": "hist",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
-       "rc_categories": "Ograniči na kategorije (razdvojene sa \"|\")",
-       "rc_categories_any": "Sve",
+       "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
+       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene",
        "newsectionsummary": "/* $1 */ novi odjeljak",
        "rc-enhanced-expand": "Pokaži detalje",
        "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
        "upload-http-error": "Desila se HTTP greška: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljenih datoteka nisu dostupne sa ove domene.",
+       "upload-dialog-title": "Postavi datoteku",
+       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-done": "Gotovo",
+       "upload-dialog-button-save": "Sačuvaj",
+       "upload-dialog-button-upload": "Postavi",
+       "upload-form-label-select-file": "Izaberi datoteku",
+       "upload-form-label-infoform-title": "Detalji",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korištenje",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "Ovo je moje djelo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava za ovu datoteku i slažem se da ću je neopozivo postaviti na Wikimedia Commons pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], te se slažem s [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjetima korištenja].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku ili je želite postaviti pod drugom licencom, imajte na umu da možete koristiti [https://commons.wikimedia.org/wiki/Special:UploadWizard čarobnjak za postavljanje datoteka na Commonsu].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na projektu {{SITENAME}}]] ako politika stranice dozvoljava postavljanje ove datoteke.",
        "backend-fail-stream": "Ne mogu emitirati datoteku $1.",
        "backend-fail-backup": "Ne može sigurnosno kopirati datoteku $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "nopagetext": "Ciljna stranica koju ste naveli ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|novija 1|novije $1}}",
        "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
-       "suppress": "Nazdor",
+       "suppress": "Sakrij",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "booksources-text": "Ispod se nalazi spisak vanjskih linkova na ostale stranice koje prodaju nove ili korištene knjige kao i stranice koje mogu da imaju važnije podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
-       "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
+       "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Zapisnici",
        "all-logs-page": "Svi javni zapisnici",
        "alllogstext": "Zajednički prikaz svih dostupnih zapisnika sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]\nda biste slali e-poštu drugim korisnicima.",
-       "emailuser": "Pošalji e-poštu",
+       "emailuser": "Pošalji e-poruku",
        "emailuser-title-target": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Pošalji e-mail korisniku",
        "emailpagetext": "Možete korisiti obrazac ispod za slanje poruke e-poštom {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku}}.\nAdresa e-pošte koju ste unijeli u [[Special:Preferences|svojim korisničkim postavkama]] će biti prikazana kao adresa pošiljaoca, tako da će primaoc poruke moći da Vam odgovori.",
        "emailccsubject": "Kopiraj Vašu poruku za $1: $2",
        "emailsent": "Poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"{{int:emailuser}}\" sa {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja",
        "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovdje.",
+       "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].",
        "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.",
        "removewatch": "Ukloni sa spiska praćenja",
        "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena iz [[Special:Watchlist|vašeg spiska praćenih članaka]].",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
        "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
        "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
-       "newtitle": "Novi naslov",
+       "newtitle": "Novi naslov:",
        "move-watch": "Prati ovu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "pagemovedsub": "Premještanje uspjelo",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
-       "lastmodifiedatby": "Ovu stranicu posljednji je put promijenio $3 u $2, $1",
+       "lastmodifiedatby": "Ovu stranicu posljednji je put {{GENDER:$4|izmijenio|izmijenila}} $3 dana $1 u $2.",
        "othercontribs": "Bazirano na radu od strane korisnika $1.",
        "others": "ostali",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|korisnik|korisnika}} $1",
        "svg-long-error": "Nevaljana SVG datoteka: $1",
        "show-big-image": "Izvorna datoteka",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
+       "show-big-image-preview-differ": "Veličina ovog $3 pregleda za ovu $2 datoteku: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
        "file-info-gif-looped": "stalno iznova",
        "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4",
-       "logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|promijenio|promijenila}} je vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|potisnuo|potisnula}} je stranicu $3",
        "logentry-suppress-revision": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-suppress-event-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
-       "revdelete-content-hid": "skriveni sadržaj",
+       "revdelete-content-hid": "sadržaj je sakriven",
        "revdelete-summary-hid": "sažetak izmjene je sakriven",
        "revdelete-uname-hid": "sažetak izmjene je sakriven",
        "revdelete-content-unhid": "sadržaj je otkriven",
        "logentry-merge-merge": "$1 {{GENDER:$2|spojio|spojila}} je $3 u $4 (sve do izmjene $5)",
        "logentry-move-move": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 bez ostavljanja preusmjerenja",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjerenja",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|označio|označila}} je izmjenu $4 stranice $3 pregledanom",
        "logentry-patrol-patrol-auto": "$1 automatski je {{GENDER:$2|označio|označila}} verziju $4 stranice $3 pregledanom",
index 2b99a6b..5bb73f2 100644 (file)
                        "Xavier Dengra",
                        "Pginer",
                        "Eduardo Martinez",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "KRLS"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "tog-hideminor": "Amaga les edicions menors en la pàgina de canvis recents",
        "tog-hidepatrolled": "Amaga edicions patrullades als canvis recents",
        "tog-newpageshidepatrolled": "Amaga pàgines patrullades de la llista de pàgines noves",
+       "tog-hidecategorization": "Amaga la categorització de les pàgines",
        "tog-extendwatchlist": "Desplega la llista de seguiment per a mostrar tots els canvis afectats, no només els més recents",
        "tog-usenewrc": "Agrupa els canvis per pàgina en canvis recents i llista de seguiment",
        "tog-numberheadings": "Enumera automàticament els encapçalaments",
@@ -87,6 +89,7 @@
        "tog-watchlisthideliu": "Amaga a la llista les edicions d'usuaris registrats",
        "tog-watchlisthideanons": "Amaga a la llista les edicions d'usuaris anònims",
        "tog-watchlisthidepatrolled": "Amaga edicions patrullades de la llista de seguiment",
+       "tog-watchlisthidecategorization": "Amaga la categorització de les pàgines",
        "tog-ccmeonemails": "Envia’m còpies dels missatges que enviï als altres usuaris",
        "tog-diffonly": "Amaga el contingut de la pàgina davall de la taula de diferències",
        "tog-showhiddencats": "Mostra les categories ocultes",
        "title-invalid-too-long": "El títol de la pàgina sol·licitada és massa llarg. No ha d’excedir $1 {{PLURAL:$1|byte|bytes}} en codificació UTF-8.",
        "title-invalid-leading-colon": "El títol de la pàgina sol·licitada conté dos punts a l’inici.",
        "perfcached": "Les dades següents es troben a la memòria cau i podrien no estar al dia. Hi ha un màxim {{PLURAL:$1|d'un resultat|de $1 resultats}} disponibles a la memòria cau.",
-       "perfcachedts": "Les dades següents es troben a la memòria cau i es van actualitzar per darrera vegada el $1. Hi ha un màxim {{PLURAL:$4|d'un resultat|de $4 resultats}} disponibles a la memòria cau.",
+       "perfcachedts": "Les dades següents es troben a la memòria cau i la darrera actualització és en data: $1. Hi ha un màxim {{PLURAL:$4|d'un resultat|de $4 resultats}} disponibles a la memòria cau.",
        "querypage-no-updates": "S'ha inhabilitat l'actualització d'aquesta pàgina. Les dades que hi contenen podrien no estar al dia.",
        "viewsource": "Mostra el codi",
        "viewsource-title": "Mostra la font per a $1",
        "actionthrottled": "Acció limitada",
-       "actionthrottledtext": "Com a mesura per a prevenir la propaganda indiscriminada (spam), no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d'ací uns minuts.",
+       "actionthrottledtext": "Com a mesura per prevenir l’abús, no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d’ací a uns minuts.",
        "protectedpagetext": "S'ha protegit la pàgina per evitar-hi modificacions.",
        "viewsourcetext": "Podeu veure i copiar el codi font d’aquesta pàgina.",
        "viewyourtext": "Vostè pot veure i copiar la font de <strong>les teves modificacions</strong> d'aquesta pàgina.",
        "userlogin-helplink2": "Ajuda amb el registre",
        "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
        "userlogin-createanother": "Crea un altre compte",
-       "createacct-emailrequired": "Adreça de correu electrònic",
-       "createacct-emailoptional": "Adreça de correu electrònic (opcional)",
+       "createacct-emailrequired": "Adreça electrònica",
+       "createacct-emailoptional": "Adreça electrònica (opcional)",
        "createacct-email-ph": "Introduïu la vostra adreça de correu electrònic",
        "createacct-another-email-ph": "Introduïu una adreça de correu electrònic",
        "createaccountmail": "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
        "createaccountreason": "Motiu:",
        "createacct-reason": "Motiu",
        "createacct-reason-ph": "Per què creeu un altre compte",
-       "createacct-captcha": "Control de seguretat",
-       "createacct-imgcaptcha-ph": "Introduïu el text que apareix a dalt",
        "createacct-submit": "Crea el meu compte",
        "createacct-another-submit": "Crea un compte",
        "createacct-benefit-heading": "{{SITENAME}} és feta per gent com tu.",
        "passwordremindertitle": "Nova contrasenya temporal per al projecte {{SITENAME}}",
        "passwordremindertext": "Algú (vós mateix segurament, des de l'adreça l'IP $1) ha soŀlicitat que us enviéssim una nova contrasenya per a iniciar la sessió al projecte {{SITENAME}} ($4).\nLa nova contrasenya temporal per a l'usuari «$2» és ara «$3». Si aquesta fou la vostra intenció, ara hauríeu d'iniciar la sessió i canviar-la. Tingueu present que és temporal i caducarà d'aquí {{PLURAL:$5|un dia|$5 dies}}.\n\nSi algú altre hagués fet aquesta soŀlicitud o si ja haguéssiu recordat la vostra contrasenya i\nno volguéssiu canviar-la, ignoreu aquest missatge i continueu utilitzant\nla vostra antiga contrasenya.",
        "noemail": "No hi ha cap adreça electrònica registrada de l'usuari «$1».",
-       "noemailcreate": "Has d'indicar una adreça de correu electrònic vàlida",
+       "noemailcreate": "Heu d’indicar una adreça electrònica vàlida.",
        "passwordsent": "S'ha enviat una nova contrasenya a l'adreça electrònica registrada per «$1».\nInicieu una sessió després que la rebeu.",
        "blocked-mailpassword": "S'ha blocat la vostra adreça IP. 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'enviï 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.",
        "passwordreset-domain": "Domini",
        "passwordreset-capture": "Veure el missatge de correu electrònic?",
        "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-email": "Adreça electrònica:",
        "passwordreset-emailtitle": "Detalls del compte a {{SITENAME}}",
        "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:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHaurí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 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:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHaurí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: \n$1\n\nContrasenya temporal: \n$2",
-       "passwordreset-emailsent": "S'ha enviat un correu de reinicialització de contrasenya.",
+       "passwordreset-emailsent": "Si aquesta és una adreça electrònica registrada amb el vostre compte, s’hi enviarà un missatge de restabliment 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 renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
-       "changeemail": "Canvi de correu electrònic",
-       "changeemail-header": "Canvi de l'adreça de correu electrònic del compte",
+       "changeemail": "Canvia o elimina l’adreça electrònica",
+       "changeemail-header": "Empleneu aquest formulari per canviar la vostra adreça electrònica. Si voleu eliminar qualssevol associacions d’adreces electròniques del vostre compte, deixeu en blanc el camp i envieu el formulari.",
+       "changeemail-passwordrequired": "Cal que introduïu la vostra contrasenya per confirmar el canvi.",
        "changeemail-no-info": "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
-       "changeemail-oldemail": "Adreça de correu electrònic actual:",
+       "changeemail-oldemail": "Adreça electrònica actual:",
        "changeemail-newemail": "Adreça electrònica nova:",
        "changeemail-none": "(cap)",
        "changeemail-password": "La vostra contrasenya a {{SITENAME}}:",
        "changeemail-submit": "Canvia de correu electrònic",
        "changeemail-throttled": "Heu realitzat massa intents d'inici de sessió.\nEspereu $1 abans de tornar-ho a provar.",
+       "changeemail-nochange": "Introduïu una adreça electrònica distinta.",
        "resettokens": "Reinicia els testimonis",
        "resettokens-text": "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.\n\nHo hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
        "resettokens-no-tokens": "No hi ha testimonis per reiniciar.",
        "sig_tip": "La vostra signatura amb marca horària",
        "hr_tip": "Línia horitzontal (feu-la servir amb moderació)",
        "summary": "Resum:",
-       "subject": "Tema/capçalera:",
+       "subject": "Assumpte:",
        "minoredit": "Aquesta és una modificació menor",
        "watchthis": "Vigila aquesta pàgina",
        "savearticle": "Desa la pàgina",
        "missingsummary": "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.",
        "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «{{int:savearticle}}» una vegada més, la redirecció es crearà de totes maneres.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
-       "missingcommentheader": "'''Recordatori:''' No heu proporcionat un assumpte/encapçalament per al comentari. Si cliqueu de nou al botó \"{{int:savearticle}}\", la vostra contribució se desarà sense cap.",
+       "missingcommentheader": "<strong>Recordatori:</strong> no heu proporcionat un assumpte/encapçalament per al comentari.\nSi feu clic de nou al botó «{{int:savearticle}}», la vostra contribució es desarà sense cap.",
        "summary-preview": "Previsualització del resum:",
-       "subject-preview": "Previsualització de tema/capçalera:",
+       "subject-preview": "Previsualització de l’assumpte:",
        "previewerrortext": "S'ha produït un error quan es provava de previsualitzar els canvis.",
        "blockedtitle": "L'usuari està blocat",
        "blockedtext": "'''S'ha procedit al blocatge del vostre compte d'usuari o la vostra adreça IP.'''\n\nEl blocatge l'ha dut a terme l'usuari $1.\nEl motiu donat és ''$2''.\n\n* Inici del blocatge: $8\n* Final del blocatge: $6\n* Compte blocat: $7\n\nPodeu contactar amb $1 o un dels [[{{MediaWiki:Grouppage-sysop}}|administradors]] per a discutir-ho.\n\nTingueu en compte que no podeu fer servir el formulari d'enviament de missatges de correu electrònic a cap usuari, a menys que tingueu una adreça de correu vàlida registrada a les vostres [[Special:Preferences|preferències d'usuari]] i no ho tingueu tampoc blocat.\n\nLa vostra adreça IP actual és $3, i el número d'identificació del blocatge és #$5.\nSi us plau, incloeu aquestes dades en totes les consultes que feu.",
        "permissionserrorstext-withaction": "No teniu permís per a $2, {{PLURAL:$1|pel motiu següent|pels motius següents}}:",
        "recreate-moveddeleted-warn": "'''Avís: esteu creant una pàgina que s'ha suprimit prèviament.'''\n\nHauríeu de considerar si és realment necessari continuar editant aquesta pàgina.\nA continuació s'ofereix el registre de supressions i de reanomenaments de la pàgina:",
        "moveddeleted-notice": "S'ha suprimit aquesta pàgina.\nA continuació us mostrem com a referència el registre d'esborraments i reanomenaments de la pàgina.",
+       "moveddeleted-notice-recent": "S’ha suprimit aquesta pàgina recentment (en les últimes 24 hores).\nA continuació us mostrem com a referència el registre de supressions i reanomenaments de la pàgina.",
        "log-fulllog": "Veure tot el registre",
        "edit-hook-aborted": "Modificació avortada pel hook.\nNo s'ha donat cap explicació.",
        "edit-gone-missing": "No s'ha pogut actualitzar la pàgina.\nSembla haver estat esborrada.",
        "mergehistory-go": "Mostra les edicions que es poden fusionar",
        "mergehistory-submit": "Fusiona les revisions",
        "mergehistory-empty": "No pot fusionar-se cap revisió.",
-       "mergehistory-done": "$3 {{PLURAL:$3|revisió|revisions}} de $1 s'han fusionat amb èxit a [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|S’ha|S’han}} fusionat correctament $3 {{PLURAL:$3|revisió|revisions}} de $1 a [[:$2]].",
        "mergehistory-fail": "No s'ha pogut realitzar la fusió de l'historial, comproveu la pàgina i els paràmetres horaris.",
        "mergehistory-fail-toobig": "No s'ha pogut realitzar la fusió de l'historial perquè es mourien més del limit de $1 {{PLURAL:$1|revisió|revisions}}.",
        "mergehistory-no-source": "La pàgina d'origen $1 no existeix.",
        "search-category": "(categoria $1)",
        "search-file-match": "(coincideix amb el contingut del fitxer)",
        "search-suggest": "Volíeu dir: $1",
+       "search-rewritten": "S’hi mostren els resultats de $1. Cerqueu «$2» en comptes d’aquest.",
        "search-interwiki-caption": "Projectes germans",
        "search-interwiki-default": "Resultats de $1:",
        "search-interwiki-more": "(més)",
        "prefs-watchlist-token": "Testimoni de llista de seguiment:",
        "prefs-misc": "Altres preferències",
        "prefs-resetpass": "Canvia la contrasenya",
-       "prefs-changeemail": "Canvia de correu electrònic",
+       "prefs-changeemail": "Canvia o elimina l’adreça electrònica",
        "prefs-setemail": "Indiqueu una adreça de correu electrònic",
        "prefs-email": "Opcions de correu electrònic",
        "prefs-rendering": "Aparença",
        "timezoneregion-europe": "Europa",
        "timezoneregion-indian": "Oceà Índic",
        "timezoneregion-pacific": "Oceà Pacífic",
-       "allowemail": "Permet que altres usuaris puguin enviar-me correus electrònics",
+       "allowemail": "Permet que altres usuaris puguin enviar-me missatges per correu electrònic",
        "prefs-searchoptions": "Cerca",
        "prefs-namespaces": "Espais de noms",
        "default": "per defecte",
        "rcshowhidemine": "$1 edicions pròpies",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Amaga",
+       "rcshowhidecategorization": "$1 la categorització de la pàgina",
+       "rcshowhidecategorization-show": "Mostra",
+       "rcshowhidecategorization-hide": "Amaga",
        "rclinks": "Mostra els darrers $1 canvis en els darrers $2 dies<br />$3",
        "diff": "dif",
        "hist": "hist",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més afegides a la categoria",
        "recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més tretes de la categoria",
+       "autochange-username": "Canvi automàtic del MediaWiki",
        "upload": "Carregueu un fitxer",
        "uploadbtn": "Carrega un fitxer",
        "reuploaddesc": "Torna al formulari per apujar.",
        "php-uploaddisabledtext": "La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.",
        "uploadscripted": "Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.",
        "upload-scripted-pi-callback": "No es poden carregar arxius que continguin instruccions de processament de pàgines d'estil XML",
+       "uploaded-script-svg": "S’ha trobat l’element programable «$1» al fitxer SVG carregat.",
+       "uploaded-hostile-svg": "S’ha trobat codi CSS no segur a l’element d’estil del fitxer SVG carregat.",
+       "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’events <code>$1=\"$2\"</code> als fitxers SVG.",
+       "uploaded-href-attribute-svg": "No es permeten els atributs d’«href» <code>&lt;$1 $2=\"$3\"&gt;</code> amb objectius no locals (p. ex., http:// i javascript:) als fitxers SVG.",
+       "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb un objectiu no segur <code>&lt;$1 $2=\"$3\"&gt;</code> al fitxer SVG carregat.",
        "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "uploadvirus": "El fitxer conté un virus! Detalls: $1",
        "upload-dialog-button-done": "Fet",
        "upload-dialog-button-save": "Desa",
        "upload-dialog-button-upload": "Carrega",
-       "upload-process-error": "S’ha produït un error",
-       "upload-process-warning": "S'ha produït un avís",
        "upload-form-label-select-file": "Seleccioneu fitxer",
        "upload-form-label-infoform-title": "Detalls",
        "upload-form-label-infoform-name": "Nom",
        "upload-form-label-infoform-description": "Descripció",
        "upload-form-label-usage-title": "Ús",
        "upload-form-label-usage-filename": "Nom del fitxer",
+       "foreign-structured-upload-form-label-own-work": "Això és el meu propi treball",
+       "foreign-structured-upload-form-label-infoform-categories": "Categories",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
        "backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
        "backend-fail-backup": "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
        "backend-fail-notexists": "El fitxer $1 no existeix.",
        "booksources-text": "A sota hi ha una llista d'enllaços d'altres llocs que venen llibres nous i de segona mà, i també podrien tenir més informació dels llibres que esteu cercant:",
        "booksources-invalid-isbn": "El codi ISBN donat no és vàlid. Comproveu si l'heu copiat correctament.",
        "specialloguserlabel": "Realitzador:",
-       "speciallogtitlelabel": "L'objectiu (títol o usuari):",
+       "speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
        "log": "Registres",
        "all-logs-page": "Tots els registres públics",
        "alllogstext": "Presentació combinada de tots els registres disponibles de {{SITENAME}}.\nPodeu reduir l'extensió seleccionant el tipus de registre, el nom d'usuari realitzador (distingeix entre majúscules i minúscules), o la pàgina objectiu (també en distingeix).",
        "cant-move-to-user-page": "No teniu permís per a moure una pàgina a una pàgina d'usuari (independentment de poder fer-ho cap a una subpàgina d'usuari).",
        "cant-move-category-page": "No teniu permisos per a moure pàgines de categoria.",
        "cant-move-to-category-page": "No teniu permisos per a moure una pàgina a una pàgina de categoria.",
-       "newtitle": "A títol nou",
+       "newtitle": "Títol nou:",
        "move-watch": "Vigila aquesta pàgina",
        "movepagebtn": "Reanomena la pàgina",
        "pagemovedsub": "Reanomenament amb èxit",
        "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-block-block": "$1 {{GENDER:$2|ha estat blocat|ha estat blocada}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|va desblocar}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|va importar}} $3 a través de càrrega de fitxer",
        "logentry-import-interwiki": "$1 {{GENDER:$2|va importar}} $3 d'un altre wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|ha fusionat}} $3 en $4 (revisions fins a $5)",
index 00281c2..4ee4f0c 100644 (file)
        "category_header": "АгӀонаш категоречохь «$1»",
        "subcategories": "Бухаркатегореш",
        "category-media-header": "Файлаш оцу категори чохь «$1»",
-       "category-empty": "''ХӀара категори хӀинца йаьсса ю.''",
+       "category-empty": "''ХӀара категори хӀинца яьсса ю.''",
        "hidden-categories": "{{PLURAL:$1|1=Къайлаха категори|Къайлаха йолу категореш}}",
        "hidden-category-category": "Къайлаха йолу категореш",
        "category-subcat-count": "{{PLURAL:$2|ХӀокху категори чохь ю хӀокхуьнан бухара категори.|ХӀокху категори чохь ю $1 {{PLURAL:$1|бухара категори|бухара категореш}} $2 массо нах.}}",
        "databaseerror-query": "Дехар: $1",
        "databaseerror-function": "Функци: $1",
        "databaseerror-error": "ГӀалат: $1",
-       "laggedslavemode": "Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.",
+       "laggedslavemode": "Тергам бе: агӀон чохь керла яьхнарш ца хила мега.",
        "readonly": "Блоктоьхна дӀайаздар хаамийн бухе",
        "enterlockreason": "Билгалде блоктохаран бахьана а, и чекх йолу хан а.",
        "readonlytext": "АгӀонаш тӀетохар а, кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
        "translateinterface": "ХӀокху хааман гоч тӀетоха я хийца дехар до лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "АгӀо хийцам ца байта ларйина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
        "namespaceprotected": "ХӀан бакъо яц анна цӀерш чохь тадарш да «$1».",
-       "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
-       "customjsprotected": "Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
-       "mycustomcssprotected": "Хьан бакъо яц хӀара CSS агӀо тая.",
+       "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо таян, иза кхечу декъашхочун гӀирс болу дера.",
+       "customjsprotected": "Хьан бакъо яц хӀара JavaScript-агӀо таян, иза кхечу декъашхочун гӀирс болу дера.",
+       "mycustomcssprotected": "Хьан бакъо яц хӀара CSS агӀо таян.",
        "mycustomjsprotected": "Хьан бакъо яц JavaScript агӀо тая.",
        "myprivateinfoprotected": "Хьайн долара хаамна хийцам ба хьа йиш яц",
        "mypreferencesprotected": "Хьай гӀирс нисбан хьа бакъо яц.",
        "createacct-yourpasswordagain": "Бакъе пароль",
        "createacct-yourpasswordagain-ph": "Кхин цкъа язъе пароль",
        "remembermypassword": "Даглаца сан дӀаяздар хӀокху компьютеран тӀехь (цхьан $1 {{PLURAL:$1|дийнахь}})",
-       "userlogin-remembermypassword": "Ð\94агаÑ\85Ñ\8c Ð»Ð°Ñ\82Ñ\82 Ð²Ðµ/е Ñ\81о",
+       "userlogin-remembermypassword": "СиÑ\81Ñ\82емин Ñ\87оÑ\85Ñ\8c Ó\80ойла",
        "userlogin-signwithsecure": "Ларийна цхьаьнакхетар",
        "yourdomainname": "Хьан машан меттиг:",
        "password-change-forbidden": "Хьан йиш яц хӀокху вики чохь пароль хийца.",
        "createaccountreason": "Бахьана:",
        "createacct-reason": "Бахьана",
        "createacct-reason-ph": "Стен кхуллуш ду ахьа керла декъашхочун дӀаяздар",
-       "createacct-captcha": "Кхерамзалла хьажар",
-       "createacct-imgcaptcha-ph": "ДӀаязде хьайна лакхахь гуш долу йоза",
        "createacct-submit": "Кхолла декъашхочун дӀаяздар",
        "createacct-another-submit": "Кхолла декъашхочун кхин дӀаяздар",
        "createacct-benefit-heading": "{{SITENAME}} кхолийна хьо санначу наха.",
        "explainconflict": "Ахьа хӀара агӀо тоечу хенахь, цхьам хийцамаш бина.\nЛакхарчу таяран корехь хьона гуш ду хӏинца агӏона чохь долу йоза.\nЛахарчу корехь ахь бина хийцам бу.\nХьой бина хийцам лахарчу корера лакхарчу коре баккха.\nКнопкан «{{int:savearticle}}» тӏетаӏича лакхара корера йоза дӏаязлурду.",
        "yourtext": "Хьан йоза",
        "storedversion": "Ӏалашйина верси",
-       "editingold": "'''ДӀахьедар. Ахьа таеш ю хӀокху агӀона шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀехьа хьалхо бина хийцамаш дӀабяра бу.",
+       "editingold": "'''ДӀахьедар. Ахь таеш ю хӀокху агӀонан шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀаьхьа, хьалхо бина хийцамаш дӀабевра бу.",
        "yourdiff": "Башхаллаш",
        "copyrightwarning": "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцуш санна оцу лицензи хьолехь.\nНагахь хьо лууш вацахь хьайн йозанаш маьрша даржа а кхечаьрга хийцам байта, мадаха уьш кху чу.<br />\nИштта чӀагӀо йой ахьа, айхьа далош долучуьнна хьо куьг да ву аьлла, я хьаэцна цхьан\nхьостера, хийцам ба а дӀаса даржада а чулацам болуш.<br />\n'''МА-КХИССА БАКЪО ЙОЦУ ГӀИРСАШ КХУ ЧУ, КУЬЙГАЛХОЧУЬННА БАКЪО ЛАРЪЕШ ЙОЛУ!'''",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
        "protectedpagewarning": "'''ДӀахьедар. ХӀара агӀо ларйина ю хийцам цабайта, иза хийца я нисъян а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьххьара бина болу хийцамна тептар чура:",
        "semiprotectedpagewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
-       "cascadeprotectedwarning": "<strong>ДӀахьедар:</strong> ХӀара агӀо таян бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча {{PLURAL:$1|1=и агӀо латийна кхечу агӀонашца|и агӀо латийна кхечу агӀонашца}} хӀоттделлачу ларйиначух:",
+       "cascadeprotectedwarning": "<strong>ДӀахьедар:</strong> ХӀара агӀо таян бакъо йолуш беккъа [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча {{PLURAL:$1|1=хӀара агӀо кхечу агӀонашца латийна ю|хӀара агӀо кхечу агӀонашца латийна ю}} ларъяш ю:",
        "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:",
        "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
        "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
        "permissionserrors": "ТӀекхачаре бакъона гӀалат",
        "permissionserrorstext": "Хьан бакъо яц кхочуш хилийта хийцам оцу {{PLURAL:$1|1=шолгlа бахьанца|шолгlа бахьанашца}}:",
        "permissionserrorstext-withaction": "Хьан бакъо яц хlумда «'''$2'''» оцу {{PLURAL:$1|1=шолгlа бахьанца|шолгlа бахьанашца}}:",
+       "contentmodelediterror": "Хьуна хӀара верси таян цало, цуна чохь <code>$1</code> модель хилар бахьнехь, ткъа агӀонан чура карара модель — <code>$2</code> ю.",
        "recreate-moveddeleted-warn": "'''Тидам бе. Ахьа кхуллуш ю, хьалхо дӀаяьккхина йолу агӀо.'''\n\nХьажа, билгалла оьши хьуна хӀара агӀо юха кхолла.\nЛахахь далина ду дӀаяхарш тӀяхь долу тептарш а хӀокх агӀона цӀе хийцарш а.",
        "moveddeleted-notice": "ХӀара агӀо дӀаяьккхина яра.\nЛахахьа гойту хӀара дӀаккхарш а, цӀе хийцарш а.",
        "log-fulllog": "Хьажа деригге тептаре",
        "prefs-help-recentchangescount": "Гойту керла нисдарш, агӀонийн истори, тептарш.",
        "prefs-help-watchlist-token2": "Иза хьан тергаме могӀан къайла догӀа ду.\nМуьлха и хуучунна йиш ю хьан тергаме могӀам беша, цундела ма хаийта иза кхечаьрга. [[Special:ResetTokens|ТӀетаӀа йе кхуза и хьайга кхосса лууш делахь]].",
        "savedprefs": "Хьан гӀирс Ӏалашбина.",
+       "savedrights": "{{GENDER:$1|$1}} декъашхочун бакъонаш Ӏалашйина.",
        "timezonelegend": "Сахьтан аса:",
        "localtime": "Меттигера хан:",
        "timezoneuseserverdefault": "Серверан ($1) гӀирс лелабе",
        "double-redirect-fixed-move": "[[$1]] агӀонан цӀе хийцина.\nХӀинца иза авто-карлаяьккхина а [[$2]] агӀона тӀехьажийна.",
        "double-redirect-fixed-maintenance": "Шалха дӀасахьажинарг нисъяр [[$1]] → [[$2]].",
        "double-redirect-fixer": "ДӀасахьажинарш нисерг",
-       "brokenredirects": "ДIадаьхна долу дIасахьажораш",
+       "brokenredirects": "ДӀаяьхна йолу дIасахьажоргаш",
        "brokenredirectstext": "Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:",
        "brokenredirects-edit": "нисъе",
        "brokenredirects-delete": "дӀаяккха",
        "wantedfiletext-nocat": "Лахара йоцу файлаш лело гӀерта. Оцу могӀам юкъа ца хууш файлаш кхета там бу, кхечу проекташ чохь йолу. Ишта ца хууш юкъа нийса елачарна тӀехула <del>сиз</del> хира ду.",
        "wantedtemplates": "Оьшуш йолу кепаш",
        "mostlinked": "Дуккха хьажоргаш тӀе тоьхна йолу агӀонаш",
-       "mostlinkedcategories": "Дуккха тӀе хьажораш йолу категореш",
+       "mostlinkedcategories": "Ð\94Ñ\83ккÑ\85а Ñ\82Ó\80е Ñ\85Ñ\8cажоÑ\80гаÑ\88 Ð¹Ð¾Ð»Ñ\83 ÐºÐ°Ñ\82егоÑ\80еÑ\88",
        "mostlinkedtemplates": "Массарел дуккха а лелайо агӀонаш",
        "mostcategories": "Дуккха категореш тӀе тоьхна йолу агӀонаш",
        "mostimages": "Массарел дуккха лелайо файлаш",
        "noautoblockblock": "ша блоктухарг дӏаяйина",
        "createaccountblock": "цамагдо керла дӀаяздарш кхоллар",
        "emailblock": "цамаго кехаташ кхехӀита",
-       "blocklist-nousertalk": "Ñ\88ин Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fн Ð»Ñ\83Ñ\88 Ð´Ð°ц",
+       "blocklist-nousertalk": "Ñ\88ен Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fлÑ\83Ñ\88 Ñ\8fц",
        "ipblocklist-empty": "Блоктохаран могӀам баьсса бу.",
        "ipblocklist-no-results": "И адрес блоктоьхна дац.",
        "blocklink": "блоктоха",
        "block-log-flags-nocreate": "цамагдо керла дӏаяздарш кхоллар",
        "block-log-flags-noautoblock": "ша блоктухарг дӏаяйина",
        "block-log-flags-noemail": "цамаго кехаташ кхехӀита",
-       "block-log-flags-nousertalk": "Ñ\88ин Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fн Ð»Ñ\83Ñ\88 Ð´Ð°ц",
+       "block-log-flags-nousertalk": "Ñ\88ен Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fлÑ\83Ñ\88 Ñ\8fц",
        "block-log-flags-angry-autoblock": "латина шуьйра автоблоктохар",
        "block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
        "range_block_disabled": "Куьйгалхошна диапазонашна блоктоха цамага до.",
        "imageinvalidfilename": "Файлан цӀе гӀалате ю",
        "fix-double-redirects": "Хьалхара цӀе йолу дӀасахьажорг нисъян",
        "move-leave-redirect": "Ӏадйита дӀасахьажораг",
-       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо ларйина ю; цӀе хийца я нисъян а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
+       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо ларйина ю; цӀе хийца я нисъян а бакъо йолуш куьйгалхой бен бац.\nЛахахь тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
        "semiprotectedpagemovewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
        "move-over-sharedrepo": "== Файл йолуш ю ==\nВикигулам чохь йолуш ю [[:$1]]. ХӀокху файлан цӀе хийцича Викигулам чуьраниг дӀакъовлу.",
        "export": "АгӀонаш араяхар",
        "tooltip-ca-nstab-main": "Яззамна чулацам",
        "tooltip-ca-nstab-user": "ХӀора декъашхочун долахь йолу агӀо ю",
        "tooltip-ca-nstab-media": "Медиа-файл",
-       "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара тая луш яц",
+       "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара таялуш яц",
        "tooltip-ca-nstab-project": "Кхолламан дакъа",
        "tooltip-ca-nstab-image": "Файлан агӀо",
        "tooltip-ca-nstab-mediawiki": "Хааман агlо MediaWiki",
        "specialpages": "Леррина агӀонаш",
        "specialpages-note-top": "Легенда",
        "specialpages-note": "* Гуттарлера белха агlонаш.\n* <strong class=\"mw-specialpagerestricted\">Кlеззиг таронаш йолу леррина агlонаш.</strong>",
-       "specialpages-group-maintenance": "Ð\96амlаÑ\88 Ð³lиÑ\80Ñ\81а Ñ\85Ñ\8cаÑ\88Ñ\82аÑ\88 ÐºÑ\85оÑ\87Ñ\83Ñ\88даÑ\80",
+       "specialpages-group-maintenance": "ТеÑ\85никийн Ñ\85Ñ\8cаÑ\88Ñ\82аÑ\88 ÐºÑ\85оÑ\87Ñ\83Ñ\88даÑ\80ан Ñ\85аамаÑ\88",
        "specialpages-group-other": "Кхин белхан агӀонаш",
        "specialpages-group-login": "Системин чугӀо / дӀаяздар кхолла",
-       "specialpages-group-changes": "Керла нисдарш а тéптарш",
-       "specialpages-group-media": "Ð\96амlаÑ\88 Ð¾Ñ\86Ñ\83 Ð¼ÐµÐ´Ð¸Ð°-гlиÑ\80Ñ\81аÑ\88ан Ð° Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ш",
-       "specialpages-group-users": "Декъашхой а бакъонаш",
+       "specialpages-group-changes": "Керла нисдарш а, тéптарш а",
+       "specialpages-group-media": "Ð\9cедиа-гÓ\80иÑ\80Ñ\81ийн Ð°, Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ийн Ð° Ñ\85аамаш",
+       "specialpages-group-users": "Декъашхой а, бакъонаш а",
        "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
        "specialpages-group-pagetools": "ГӀирсаш агӀонашна",
index 3972e39..ccf161b 100644 (file)
        "createaccountreason": "هۆکار:",
        "createacct-reason": "ھۆکار",
        "createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی",
-       "createacct-captcha": "تاوتوێی ئاسایشی",
-       "createacct-imgcaptcha-ph": "دەقەکەی لە ژێرەوە دەیبینی بینووسە",
        "createacct-submit": "ھەژمارەکەت دروست بکە",
        "createacct-another-submit": "ھەژمارێکی تر دروست بکە",
        "createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.",
        "revdelete-uname-unhid": "ناوی بەکارهێنەری نیشان درا",
        "revdelete-restricted": "ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران",
        "revdelete-unrestricted": "ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران",
+       "logentry-block-block": "$1 {{GENDER:$4|$3}}ی بۆ ماوەی $5 {{GENDER:$2|بەربەست کرد}} $6",
        "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 کە پێشتر ڕەوانەکەر بوو",
index 29d0707..1dc61ea 100644 (file)
@@ -5,7 +5,8 @@
                        "Alessandro",
                        "Don Alessandro",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Исмаил Садуев"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
        "mytalk": "Музакере",
        "anontalk": "Бу IP-нинъ музакереси",
        "navigation": "Сайтта ёл тапув",
-       "and": "&#32;ве",
+       "and": "&#32;а",
        "qbfind": "Тап",
        "qbbrowse": "Бакъып чыкъ",
        "qbedit": "Денъиштир",
        "createaccountreason": "Себеп:",
        "createacct-reason": "Себеп",
        "createacct-reason-ph": "Башкъа бир эсап язысы неден себеп яратасынъыз",
-       "createacct-captcha": "Телюкесизлик контроли",
-       "createacct-imgcaptcha-ph": "Юкъарыда корьген метнинъизни язынъыз",
        "createacct-submit": "Эсап язынъызны яратынъыз",
        "createacct-another-submit": "Башкъа бир эсап язысы яратынъыз",
        "createacct-benefit-heading": "{{SITENAME}} сизинъ киби адамлар тарафындан языла.",
        "move-page-legend": "Саифенинъ адыны денъиштирюв",
        "movepagetext": "Ашагъыдаки форма къулланылып саифенинъ ады денъиштирилир. Бунынънен берабер денъиштирмелер журналы да янъы адгъа авуштырылыр.\nЭски ады янъы адына ёнетме олур. Эски серлевагъа ёнетип тургъан саифелерни автоматик оларакъ янъартып оласынъыз. Бу арекетни автоматик япмагъа истемесенъиз, бутюн [[Special:DoubleRedirects|чифт]] ве [[Special:BrokenRedirects|йыртыкъ]] ёнетме саифелерини озюнъиз тешкермеге меджбур олурсынъыз. Багълантылар эндиден берли догъру чалышмасындан эмин олмалысынъыз.\n\nЯнъы адда бир саифе энди бар олса, ад денъиштирилюви <strong>япылмайджакъ</strong>, анджакъ бар олгъан саифе ёнетме я да бош олса ад денъиштирилюви мумкюн оладжакъ. Бу демек ки, саифенинъ адыны янълыштан денъиштирген олсанъыз деминки адыны кери къайтарып оласынъыз, амма бар олгъан саифени тесадюфен ёкъ этамайсынъыз.\n\n<strong>ТЕНБИ!</strong>\nАд денъиштирилюви популяр саифелер ичюн буюк ве бекленмеген денъишмелерге себеп ола билир. Лютфен, денъиштирме япмаздан эвель ола биледжеклерни козь огюне алынъыз.",
        "movepagetalktext": "Къошулгъан музакере саифесининъ де (бар олса)\nады автоматик тарзда денъиштириледжек. '''Мустесналар:'''\n\n* Айны бу адда бош олмагъан бир музакере саифеси энди бар;\n* Ашагъыдаки бошлукъкъа ишарет къоймадынъыз.\n\nБойле алларда, керек олса, саифелерни къолнен ташымагъа я да бирлештирмеге меджбур олурсынъыз.",
-       "movearticle": "Эски ад",
        "movecategorypage-warning": "<strong>Ихтар:</strong> Бир категория саифесининъ адыны денъиштирмек узьресинъиз. Лютфен, ялынъыз категория саифесининъ кочюриледжегини ве эски категорияда ер алгъан саифелернинъ янъы категориягъа авотматик оларакъ <em>авуштырылмайджагъыны</em> унутманъыз.",
        "movenologintext": "Саифенинъ адыны денъиштирип олмакъ ичюн [[Special:UserLogin|отурым ачынъыз]].",
        "movenotallowed": "Саифелер адларыны денъиштирмеге изининъиз ёкъ.",
index bf21f22..845338e 100644 (file)
@@ -34,6 +34,7 @@
        "tog-hideminor": "Skrýt malé editace v posledních změnách",
        "tog-hidepatrolled": "Skrýt patrolované editace v posledních změnách",
        "tog-newpageshidepatrolled": "Skrýt patrolované stránky v seznamu nových stránek",
+       "tog-hidecategorization": "Skrýt kategorizaci stránek",
        "tog-extendwatchlist": "Na seznamu sledovaných stránek zobrazovat všechny změny, ne jen tu poslední",
        "tog-usenewrc": "V posledních změnách a sledovaných stránkách seskupovat změny podle stránek",
        "tog-numberheadings": "Automaticky číslovat nadpisy",
@@ -63,6 +64,7 @@
        "tog-watchlisthideliu": "Na seznamu sledovaných stránek skrýt editace přihlášených uživatelů",
        "tog-watchlisthideanons": "Na seznamu sledovaných stránek skrýt editace nepřihlášených uživatelů",
        "tog-watchlisthidepatrolled": "Skrýt patrolované editace ve sledovaných stránkách",
+       "tog-watchlisthidecategorization": "Skrýt kategorizaci stránek",
        "tog-ccmeonemails": "Zasílat mi kopie e-mailů, které pošlu jiným uživatelům",
        "tog-diffonly": "Nezobrazovat obsah stránky pod rozdílem verzí",
        "tog-showhiddencats": "Zobrazit skryté kategorie",
        "createaccountreason": "Důvod:",
        "createacct-reason": "Důvod",
        "createacct-reason-ph": "Proč si vytváříte další účet",
-       "createacct-captcha": "Bezpečnostní kontrola",
-       "createacct-imgcaptcha-ph": "Opište výše zobrazený text",
        "createacct-submit": "Vytvořit účet",
        "createacct-another-submit": "Vytvořit účet",
        "createacct-benefit-heading": "{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.",
        "permissionserrors": "Chyba povolení",
        "permissionserrorstext": "Nemáte povoleno toto provést z {{PLURAL:$1|následujícího důvodu|následujících důvodů|následujících důvodů}}:",
        "permissionserrorstext-withaction": "Z {{PLURAL:$1|následujícího důvodu|následujících důvodů}} nemáte oprávnění $2:",
+       "contentmodelediterror": "Tuto revizi nemůžete editovat, protože model jejího obsahu je <code>$1</code>, zatímco aktuální model obsahu této stránky je <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Upozornění: Pokoušíte se znovuzaložit stránku, která byla v minulosti smazána.'''\n\nZvažte, zda je vhodné v editaci této stránky pokračovat.\nNíže vidíte soupis přesunů a smazání této stránky:",
        "moveddeleted-notice": "Tato stránka byla smazána.\nPodrobnosti si můžete prohlédnout v níže zobrazeném seznamu provedených přesunů a smazání této stránky.",
        "moveddeleted-notice-recent": "Omlouváme se, ale tato stránka byla nedávno (v posledních 24 hodinách) smazána. Pro úplnost je níže zobrazen soupis přesunů a smazání této stránky.",
        "prefs-help-recentchangescount": "Týká se posledních změn, historie stránek a protokolovacích záznamů.",
        "prefs-help-watchlist-token2": "Toto je tajný klíč k webovému kanálu vašich sledovaných stránek. Kdokoli, kdo bude tento klíč znát, bude moci váš seznam sledovaných stránek číst, takže ho nešiřte.\n[[Special:ResetTokens|Kliknutím sem ho můžete reinicializovat.]]",
        "savedprefs": "Nastavení byla uložena.",
+       "savedrights": "Práva {{GENDER:$1|uživatele|uživatelky}} $1 byla uložena.",
        "timezonelegend": "Časové pásmo:",
        "localtime": "Místní čas:",
        "timezoneuseserverdefault": "Použít časové pásmo wiki ($1)",
        "rcshowhidemine": "$1 moje editace",
        "rcshowhidemine-show": "Zobrazit",
        "rcshowhidemine-hide": "Skrýt",
+       "rcshowhidecategorization": "$1 kategorizaci stránek",
+       "rcshowhidecategorization-show": "Zobrazit",
+       "rcshowhidecategorization-hide": "Skrýt",
        "rclinks": "Ukázat $1 posledních změn během posledních $2 dnů<br />\n$3",
        "diff": "rozdíl",
        "hist": "historie",
        "recentchanges-page-added-to-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další zařazeny|$2 další zařazeny|$2 dalších zařazeno}} do kategorie",
        "recentchanges-page-removed-from-category": "Stránka [[:$1]] vyřazena z kategorie",
        "recentchanges-page-removed-from-category-bundled": "Stránka [[:$1]] a {{PLURAL:$2|jedna další vyřazeny|$2 další vyřazeny|$2 dalších vyřazeno}} z kategorie",
+       "autochange-username": "Automatická změna MediaWiki",
        "upload": "Načíst soubor",
        "uploadbtn": "Načíst soubor",
        "reuploaddesc": "Zrušit načítání a vrátit se do formuláře.",
        "upload-dialog-button-done": "Hotovo",
        "upload-dialog-button-save": "Uložit",
        "upload-dialog-button-upload": "Načíst",
-       "upload-process-error": "Došlo k chybě",
-       "upload-process-warning": "Objevilo se upozornění",
        "upload-form-label-select-file": "Výběr souboru",
        "upload-form-label-infoform-title": "Podrobnosti",
        "upload-form-label-infoform-name": "Název",
        "upload-form-label-infoform-description": "Popis",
        "upload-form-label-usage-title": "Použití",
        "upload-form-label-usage-filename": "Jméno souboru",
+       "foreign-structured-upload-form-label-own-work": "Je to mé vlastní dílo",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorie",
        "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potvrzuji, že tento soubor načítám v souladu s podmínkami užití a licenčními pravidly na {{grammar:6sg|{{SITENAME}}}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Pokud nemůžete tento soubor načíst v souladu s pravidly {{grammar:2sg|{{SITENAME}}}}, zavřete prosím tento dialog a zkuste jiný způsob.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Také můžete zkusit [[Special:Upload|standardní stránku pro načítání souborů]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Chápu, že soubor načítám na sdílené úložiště. Potvrzuji, že tak činím v souladu s tamními podmínkami užití a licenčními pravidly.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Pokud nemůžete tento soubor načíst v souladu s pravidly sdíleného úložiště, zavřete prosím tento dialog a zkuste jiný způsob.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Také můžete zkusit [[Special:Upload|stránku pro načítání souborů na {{grammar:6sg|{{SITENAME}}}}]], pokud tam lze soubor podle tamních pravidel načíst.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrzuji, že jsem držitelem autorských práv k tomuto souboru a neodvolatelně souhlasím s jeho zveřejněním na Wikimedia Commons pod licencí [https://creativecommons.org/licenses/by-sa/4.0/deed.cs Creative Commons Uveďte původ – Zachovejte licenci 4.0] a souhlasím s [https://wikimediafoundation.org/wiki/Terms_of_Use/cs Podmínkami užití].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Pokud nejste držiteli autorských práv k tomuto souboru nebo si ho přejete zveřejnit pod jinou licencí, zvažte použití [https://commons.wikimedia.org/wiki/Special:UploadWizard Průvodce načítáním souborů na Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Také můžete zkusit [[Special:Upload|stránku pro načítání souborů na {{grammar:6sg|{{SITENAME}}}}]], pokud tamní pravidla načtení tohoto souboru dovolují.",
        "backend-fail-stream": "Soubor $1 nelze streamovat.",
        "backend-fail-backup": "Soubor $1 nelze zazálohovat.",
        "backend-fail-notexists": "Soubor $1 neexistuje.",
        "svg-long-error": "Neplatný soubor SVG: $1",
        "show-big-image": "Původní soubor",
        "show-big-image-preview": "Velikost tohoto náhledu: $1.",
+       "show-big-image-preview-differ": "Velikost tohoto $3 náhledu tohoto $2 souboru: $1.",
        "show-big-image-other": "{{PLURAL:$2|Jiné|Jiná}} rozlišení: $1.",
        "show-big-image-size": "$1 × $2 pixelů",
        "file-info-gif-looped": "ve smyčce",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
        "mw-widgets-titleinput-description-redirect": "přesměrování na $1",
-       "api-error-blacklisted": "Zvolte jiný, popisný název."
+       "api-error-blacklisted": "Zvolte prosím jiný, popisný název."
 }
index 8e935b7..2224b7c 100644 (file)
        "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-newusers-create": "польꙃєватєльско мѣсто ⁖ $1 ⁖ {{GENDER:$2|сътворѥно}} ѥстъ",
        "logentry-upload-upload": "$1 {{GENDER:$2|положишє}} $3",
        "revdelete-summary": "мѣнꙑ опьсаниѥ",
index 447c18c..f8d3a0a 100644 (file)
        "changed": "улăштарнă",
        "deletepage": "Кăларса парахнă статьясем",
        "confirm": "Çирĕплетни",
-       "excontent": "ăшлăхĕ: «$1»",
-       "excontentauthor": "ăшлăхĕ: «$1» ([[Special:Contributions/$2|$2]] пĕччен кăна улшăнусем кĕртнĕ)",
+       "excontent": "ăшĕнче пулнă: \"$1\"",
+       "excontentauthor": "ăшĕнче пулнă: \"$1\", пĕртен пĕр хушакан пулнă \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "actioncomplete": "Турăмăр",
        "deletedtext": "«$1» кăларса парахрăмăр.\nЮлашки кăларса пăрахнă статьясен списокне курмашкăн кунта пăхăр: $2.",
        "dellogpage": "Кăларса пăрахнисем",
index 01a6847..cc335b9 100644 (file)
@@ -51,7 +51,9 @@
                        "Knud Winckelmann",
                        "Macofe",
                        "Jyllanj",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Poullindholm",
+                       "Mads Haupt"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
@@ -82,7 +84,7 @@
        "tog-uselivepreview": "Benyt løbende forhåndsvisning",
        "tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
        "tog-watchlisthideown": "Skjul egne ændringer i overvågningslisten",
-       "tog-watchlisthidebots": "Skjul ændringer fra bots i overvågningslisten",
+       "tog-watchlisthidebots": "Skjul ændringer fra botter i overvågningslisten",
        "tog-watchlisthideminor": "Skjul mindre ændringer i overvågningslisten",
        "tog-watchlisthideliu": "Skjul indloggede brugeres redigeringer i overvågningslisten",
        "tog-watchlisthideanons": "Skjul anonyme brugeres redigeringer i overvågningslisten",
        "viewsource": "Vis kildetekst",
        "viewsource-title": "Se kildekoden til $1",
        "actionthrottled": "Begrænsning af handling",
-       "actionthrottledtext": "For at modvirke spam, er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Du kan forsøge igen om et par minutter.",
+       "actionthrottledtext": "For at modvirke spam er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Du kan forsøge igen om et par minutter.",
        "protectedpagetext": "Denne side er blevet beskyttet, for at forhindre redigering eller andre handlinger.",
        "viewsourcetext": "Du kan se og kopiere kildekoden til siden:",
        "viewyourtext": "Du kan se og kopiere kildekoden for <strong>dine redigeringer</strong> til denne side.",
        "createaccountreason": "Begrundelse:",
        "createacct-reason": "Årsag",
        "createacct-reason-ph": "Hvorfor du vil oprette endnu en konto",
-       "createacct-captcha": "Sikkerhedskontrol",
-       "createacct-imgcaptcha-ph": "Indtast venligst ovenstående tekst",
        "createacct-submit": "Opret din konto",
        "createacct-another-submit": "Opret konto",
        "createacct-benefit-heading": "{{SITENAME}} laves af mennesker som dig.",
        "passwordreset-emailtext-ip": "Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "passwordreset-emailtext-user": "Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "passwordreset-emailelement": "Brugernavn: \n$1\n\nMidlertidig adgangskode: \n$2",
-       "passwordreset-emailsent": "Hvis dettte er en registreret e-mail-adresse til din konto, så vil en nulstilling af adgangskoden e-mail blive sendt.",
+       "passwordreset-emailsent": "Hvis dettte er en registreret e-mail-adresse til din konto, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
        "passwordreset-emailsent-capture": "En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.",
        "passwordreset-emailerror-capture": "En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1",
        "changeemail": "Ændr eller fjern e-mailadresse",
-       "changeemail-header": "Udfyld denne formular for at ændre din e-mail-adresse. Hvis du gerne vil  fjerne den forbindelsen af e-mail-adresse fra din konto, så lad den nye e-mailadresse være blank, når du sender formularen.",
+       "changeemail-header": "Udfyld denne formular for at ændre din e-mailadresse. Hvis du gerne vil fjerne forbindelsen af en e-mailadresse fra din konto, så lad den nye e-mailadresse være blank, når du sender formularen.",
        "changeemail-passwordrequired": "Du er nødt til at indtaste din adgangskode for at bekræfte denne ændring.",
        "changeemail-no-info": "Du skal være logget på for at komme direkte til denne side.",
        "changeemail-oldemail": "Nuværende e-mailadresse:",
        "prefs-watchlist-token": "Overvågningslistenøgle:",
        "prefs-misc": "Forskelligt",
        "prefs-resetpass": "Skift adgangskode",
-       "prefs-changeemail": "Ændre e-mailadresse",
+       "prefs-changeemail": "Skift eller fjern e-mailadresse",
        "prefs-setemail": "Angiv en e-mailadresse",
        "prefs-email": "Indstillinger for e-mail",
        "prefs-rendering": "Udseende",
        "rcshowhidemine": "$1 egne bidrag",
        "rcshowhidemine-show": "Vis",
        "rcshowhidemine-hide": "Skjul",
+       "rcshowhidecategorization-show": "Vis",
+       "rcshowhidecategorization-hide": "Skjul",
        "rclinks": "Vis seneste $1 ændringer i de sidste $2 dage<br />$3",
        "diff": "forskel",
        "hist": "historik",
        "upload-too-many-redirects": "URL'en indeholdt for mange omdirigeringer",
        "upload-http-error": "Der opstod en HTTP-fejl: $1",
        "upload-copy-upload-invalid-domain": "Uploads af kopier er ikke tilgængelig fra dette domæne.",
+       "upload-dialog-title": "Læg en fil op",
+       "upload-dialog-button-cancel": "Annuller",
+       "upload-dialog-button-done": "Færdig",
+       "upload-dialog-button-save": "Gem",
+       "upload-dialog-button-upload": "Læg op",
+       "upload-form-label-select-file": "Vælg filer",
+       "upload-form-label-infoform-name": "Navn",
+       "upload-form-label-infoform-description": "Beskrivelse",
+       "upload-form-label-usage-filename": "Filnavn",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorier",
+       "foreign-structured-upload-form-label-infoform-date": "Dato",
+       "foreign-structured-upload-form-label-own-work-message-local": "Jeg bekræfter at jeg uploader filen i overenstemmelse med betingelser for brug og licenseringspoltikken på {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Hvis du ikke kan uploade filen under politikerne på {{SITENAME}}, skal du lukke dialogboksen og prøve en anden metode.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Du kan også vælge at prøve [[Special:Upload|den almindelige uploadside]].",
        "backend-fail-stream": "Kunne ikke streame filen $1.",
        "backend-fail-backup": "Kunne ikke lave sikkerhedskopi af filen $1.",
        "backend-fail-notexists": "Filen $1 findes ikke.",
        "spam_reverting": "Sidste version uden henvisning til $1 gendannet.",
        "spam_blanking": "Alle versioner, som indeholdt henvisninger til $1, er renset.",
        "spam_deleting": "Alle versioner indeholder henvisninger til $1, sletter",
-       "simpleantispam-label": "Anti-spam tjek.\nUdfyld <strong>ikke</strong> dette!",
+       "simpleantispam-label": "Anti-spamkontrol.\nUdfyld <strong>ikke</strong> dette!",
        "pageinfo-title": "Information om \"$1\"",
        "pageinfo-not-current": "Beklager, det er umuligt at give denne information for gamle udgaver.",
        "pageinfo-header-basic": "Grundlæggende oplysninger",
index dbf1979..99fc15b 100644 (file)
@@ -89,6 +89,7 @@
        "tog-hideminor": "Kleine Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
+       "tog-hidecategorization": "Kategorisierungen von Seiten ausblenden",
        "tog-extendwatchlist": "In der Beobachtungsliste alle und nicht nur die aktuellsten Änderungen anzeigen",
        "tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
        "tog-numberheadings": "Überschriften automatisch nummerieren",
        "tog-watchlisthideliu": "Bearbeitungen angemeldeter Benutzer in der Beobachtungsliste ausblenden",
        "tog-watchlisthideanons": "Bearbeitungen anonymer Benutzer (IP-Adressen) in der Beobachtungsliste ausblenden",
        "tog-watchlisthidepatrolled": "Kontrollierte Änderungen in der Beobachtungsliste ausblenden",
+       "tog-watchlisthidecategorization": "Kategorisierungen von Seiten ausblenden",
        "tog-ccmeonemails": "Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende",
        "tog-diffonly": "Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen",
        "tog-showhiddencats": "Versteckte Kategorien anzeigen",
        "createaccountreason": "Grund:",
        "createacct-reason": "Begründung",
        "createacct-reason-ph": "Warum erstellst du ein anderes Benutzerkonto?",
-       "createacct-captcha": "Sicherheitsprüfung",
-       "createacct-imgcaptcha-ph": "Gib den Text ein, den du oben siehst.",
        "createacct-submit": "Benutzerkonto erstellen",
        "createacct-another-submit": "Benutzerkonto erstellen",
        "createacct-benefit-heading": "{{SITENAME}} wird von Menschen wie dir geschaffen.",
        "permissionserrors": "Berechtigungsfehler",
        "permissionserrorstext": "Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
+       "contentmodelediterror": "Du kannst diese Version nicht bearbeiten, da dieses Inhaltsmodell <code>$1</code> und das aktuelle Inhaltsmodell der Seite <code>$2</code> ist.",
        "recreate-moveddeleted-warn": "'''Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.'''\n\nBitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.\nZu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
        "moveddeleted-notice": "Diese Seite wurde gelöscht. Zur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
        "moveddeleted-notice-recent": "Leider wurde diese Seite kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information wird das Lösch- und Verschiebungs-Logbuch für die Seite unten angezeigt.",
        "showingresultsinrange": "Unten {{PLURAL:$1|wird <strong>ein</strong> Ergebnis|werden bis zu <strong>$1</strong> Ergebnisse}} im Bereich <strong>$2</strong> bis <strong>$3</strong> angezeigt.",
        "search-showingresults": "{{PLURAL:$4|Ergebnis <strong>$1</strong> von <strong>$3</strong>|Ergebnisse <strong>$1 bis $2</strong> von <strong>$3</strong>}}",
        "search-nonefound": "Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.",
+       "search-nonefound-thiswiki": "Es gibt auf dieser Website keine der Suchanfrage entsprechenden Ergebnisse.",
        "powersearch-legend": "Erweiterte Suche",
        "powersearch-ns": "Suche in Namensräumen:",
        "powersearch-togglelabel": "Wähle aus:",
        "prefs-help-recentchangescount": "Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.",
        "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|kannst du ihn zurücksetzen]].",
        "savedprefs": "Deine Einstellungen wurden gespeichert.",
+       "savedrights": "Die Benutzerrechte von {{GENDER:$1|$1}} wurden gespeichert.",
        "timezonelegend": "Zeitzone:",
        "localtime": "Ortszeit:",
        "timezoneuseserverdefault": "Standardzeit dieses Wikis nutzen ($1)",
        "rcshowhidemine": "Eigene Beiträge $1",
        "rcshowhidemine-show": "anzeigen",
        "rcshowhidemine-hide": "ausblenden",
+       "rcshowhidecategorization": "Seitenkategorisierungen $1",
+       "rcshowhidecategorization-show": "anzeigen",
+       "rcshowhidecategorization-hide": "ausblenden",
        "rclinks": "Zeige die letzten $1 Änderungen der letzten $2 Tage.<br />$3",
        "diff": "Unterschied",
        "hist": "Versionen",
        "upload-dialog-button-done": "Schließen",
        "upload-dialog-button-save": "Speichern",
        "upload-dialog-button-upload": "Hochladen",
-       "upload-process-error": "Es ist ein Fehler aufgetreten",
-       "upload-process-warning": "Es ist eine Warnung aufgetreten",
        "upload-form-label-select-file": "Datei auswählen",
        "upload-form-label-infoform-title": "Einzelheiten",
        "upload-form-label-infoform-name": "Name",
        "revdelete-restricted": "Einschränkungen gelten auch für Administratoren",
        "revdelete-unrestricted": "Einschränkungen für Administratoren aufgehoben",
        "logentry-block-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} für eine Dauer von $5 $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|hat}} die Sperre von {{GENDER:$4|$3}} aufgehoben",
+       "logentry-block-unblock": "$1 {{GENDER:$2|hob}} die Sperre von {{GENDER:$4|$3}} auf",
        "logentry-block-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
index 2fc71a2..bc2d65a 100644 (file)
        "createaccountreason": "Sebeb:",
        "createacct-reason": "Sebeb",
        "createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
-       "createacct-captcha": "Qontrolê asayişi",
-       "createacct-imgcaptcha-ph": "Nuşteyo ke cor aseno ey cı ke",
        "createacct-submit": "Hesabê xo vıraze",
        "createacct-another-submit": "Zewbi hesab vıraz",
        "createacct-benefit-heading": "{{SITENAME}} meş de merduman şi",
        "tooltip-ca-nstab-main": "Perra muhtevay bıvin",
        "tooltip-ca-nstab-user": "Pela karberi bıvêne",
        "tooltip-ca-nstab-media": "Pela medya bıvêne",
-       "tooltip-ca-nstab-special": "Na yew pela xasa, şıma nêşenê sero vurnayış bıkerê",
+       "tooltip-ca-nstab-special": "Na pelaya xas a, şıma nêşenê sero vurnayış bıkerê",
        "tooltip-ca-nstab-project": "Pela procey bıvêne",
        "tooltip-ca-nstab-image": "Pera dosyayer bıvin",
        "tooltip-ca-nstab-mediawiki": "Mesacê sistemi bıvêne",
index ef3c1e3..41bea49 100644 (file)
@@ -50,6 +50,7 @@
        "tog-hideminor": "Απόκρυψη μικροεπεξεργασιών στις πρόσφατες αλλαγές",
        "tog-hidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών στις πρόσφατες αλλαγές",
        "tog-newpageshidepatrolled": "Απόκρυψη ελεγμένων σελίδων από τον κατάλογο νέων σελίδων",
+       "tog-hidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "tog-extendwatchlist": "Επέκταση της λίστας παρακολούθησης ώστε να δείχνει όλες τις αλλαγές, όχι μόνο τις πιο πρόσφατες",
        "tog-usenewrc": "Ομαδοποίηση αλλαγών ανά σελίδα στις πρόσφατες αλλαγές και στη λίστα παρακολούθησης",
        "tog-numberheadings": "Αυτόματη αρίθμηση επικεφαλίδων",
@@ -79,6 +80,7 @@
        "tog-watchlisthideliu": "Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης",
        "tog-watchlisthideanons": "Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης",
        "tog-watchlisthidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών από τη λίστα παρακολούθησης",
+       "tog-watchlisthidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "tog-ccmeonemails": "Να μου αποστέλλονται αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες",
        "tog-diffonly": "Να μην εμφανίζεται περιεχόμενο σελίδων κάτω από τις διαφορές των εκδόσεων",
        "tog-showhiddencats": "Εμφάνιση κρυμμένων κατηγοριών",
        "nstab-help": "Σελίδα βοήθειας",
        "nstab-category": "Κατηγορία",
        "mainpage-nstab": "Αρχική σελίδα",
-       "nosuchaction": "Δεν υπάρχει τέτοια ενέργεια.",
+       "nosuchaction": "Δεν υπάρχει τέτοια ενέργεια",
        "nosuchactiontext": "Η ενέργεια που καθορίστηκε από την διεύθυνση URL δεν είναι έγκυρη.\nΕνδέχεται να πληκτρολογήσατε λανθασμένα την διεύθυνση URL ή να ακολουθήσατε έναν μη έγκυρο σύνδεσμο.\nΜπορεί επίσης να είναι σημάδι κάποιου σφάλματος του λογισμικού που χρησιμοποιεί ο ιστότοπος {{SITENAME}}.",
        "nosuchspecialpage": "Δεν υπάρχει τέτοια ειδική σελίδα",
        "nospecialpagetext": "<strong>Ζητήσατε μια μη έγκυρη ειδική σελίδα.</strong>\n\nΈνας κατάλογος έγκυρων ειδικών σελίδων μπορεί να βρεθεί στη σελίδα [[Special:SpecialPages|{{int:specialpages}}]].",
        "mycustomjsprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα JavaScript.",
        "myprivateinfoprotected": "Δεν έχετε άδεια για να επεξεργαστείτε τα προσωπικά σας στοιχεία.",
        "mypreferencesprotected": "Δεν έχετε άδεια για να επεξεργαστείτε τις προτιμήσεις σας.",
-       "ns-specialprotected": "ΣελίδεÏ\82 Ï\83Ï\84ον Ï\84ομέα {{ns:special}} Î´ÎµÎ½ Î³Î¯Î½ÎµÏ\84αι Î½Î± ÎµÏ\80εξεÏ\81γαÏ\83Ï\84οÏ\8dν.",
+       "ns-specialprotected": "Î\97 ÎµÏ\80εξεÏ\81γαÏ\83ία Ï\83ελίδÏ\89ν Ï\83Ï\84ον Ï\84ομέα {{ns:special}} Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î´Ï\85ναÏ\84ή.",
        "titleprotected": "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].\nΟ λόγος που δίνεται είναι «$2».",
        "filereadonlyerror": "Δεν είναι δυνατή η τροποποίηση του αρχείου «$1» επειδή το αποθετήριο αρχείων «$2» είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.\n\nΟ διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: «$3».",
        "invalidtitle-knownnamespace": "Μη έγκυρος τίτλος με χώρο ονομάτων «$2» και κείμενο «$3»",
        "invalidtitle-unknownnamespace": "Μη έγκυρος τίτλος με άγνωστο αριθμό χώρου ονομάτων $1 και κείμενο «$2»",
-       "exception-nologin": "Δεν έχετε συνδεθεί.",
+       "exception-nologin": "Δεν έχετε συνδεθεί",
        "exception-nologin-text": "Παρακαλούμε να συνδεθείτε για να μπορείτε να αποκτήσετε πρόσβαση σε αυτήν τη σελίδα ή την ενέργεια.",
        "exception-nologin-text-manual": "Παρακαλούμε $1 για να μπορείτε να έχετε πρόσβαση σε αυτή τη σελίδα ή ενέργεια.",
        "virus-badscanner": "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
        "userloginnocreate": "Είσοδος",
        "logout": "Έξοδος",
        "userlogout": "Έξοδος",
-       "notloggedin": "Δεν έχετε συνδεθεί.",
+       "notloggedin": "Δεν έχετε συνδεθεί",
        "userlogin-noaccount": "Δεν έχετε λογαριασμό;",
        "userlogin-joinproject": "Συνδεθείτε σε {{SITENAME}}",
        "nologin": "Δεν έχετε λογαριασμό; $1.",
        "userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
        "userlogin-helplink2": "Βοήθεια για τη σύνδεση",
        "userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
-       "userlogin-createanother": "Δημιουργήσετε έναν άλλο λογαριασμό",
+       "userlogin-createanother": "Δημιουργήστε άλλο λογαριασμό",
        "createacct-emailrequired": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createacct-emailoptional": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)",
        "createacct-email-ph": "Εισάγετε το email σας",
        "createaccountreason": "Αιτία:",
        "createacct-reason": "Λόγος",
        "createacct-reason-ph": "Γιατί δημιουργείτε έναν άλλο λογαριασμό",
-       "createacct-captcha": "Έλεγχος ασφαλείας",
-       "createacct-imgcaptcha-ph": "Εισαγωγή του κειμένου που βλέπετε παραπάνω",
        "createacct-submit": "Δημιουργία λογαριασμού χρήστη",
        "createacct-another-submit": "Δημιουργήσετε έναν άλλο λογαριασμό",
        "createacct-benefit-heading": "{{SITENAME}} έχει γίνει από ανθρώπους όπως εσύ.",
        "throttled-mailpassword": "Ένα email επαναφοράς κωδικού έχει ήδη αποσταλεί, μέσα {{PLURAL:$1|στην τελευταία ώρα|στις τελευταίες $1 ώρες}}.\nΓια την αποφυγή κατάχρησης, μόνο ένα email επαναφοράς κωδικού θα στέλνεται ανά {{PLURAL:$1|ώρα|$1 ώρες}}.",
        "mailerror": "Σφάλμα στην αποστολή του μηνύματος: $1",
        "acct_creation_throttle_hit": "Επισκέπτες αυτού του wiki με την διεύθυνση IP σας έχουν ήδη δημιουργήσει {{PLURAL:$1|ένα λογαριασμό|$1 λογαριασμούς}}, κατά την τελευταία μία ημέρα, που είναι και ο μέγιστος επιτρεπόμενος αριθμός.\nΩς αποτέλεσμα, επισκέπτες αυτού του wiki με αυτήν την διεύθυνση IP δεν μπορούν αυτή την στιγμή να δημιουργήσουν περισσότερους λογαριασμούς.",
-       "emailauthenticated": "Î\97 Î·Î»ÎµÎºÏ\84Ï\81ονική Ï\83αÏ\82 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η ÎµÏ\80ιβεβαιÏ\8eθηκε Ï\83Ï\84ιÏ\82 $2, Ï\83Ï\84ιÏ\82 $3.",
+       "emailauthenticated": "Î\97 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83ή Ï\83αÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 ÎµÏ\80ιβεβαιÏ\8eθηκε Ï\83Ï\84ιÏ\82 $2 ÎºÎ±Î¹ Ï\8eÏ\81α $3.",
        "emailnotauthenticated": "Η ηλεκτρονική σας διεύθυνση δεν έχει επαληθευτεί ακόμα.\nΚανένα μήνυμα ηλεκτρονικού ταχυδρομείου δεν θα σταλεί για τις ακόλουθες λειτουργίες.",
        "noemailprefs": "Δεν έχει ορισθεί ηλεκτρονική διεύθυνση, οι λειτουργίες που ακολουθούν δεν θα είναι δυνατόν να ολοκληρωθούν.",
        "emailconfirmlink": "Επαληθεύστε την ηλεκτρονική σας διεύθυνση",
        "pt-login": "Σύνδεση",
        "pt-login-button": "Σύνδεση",
        "pt-createaccount": "Δημιουργία λογαριασμού",
-       "pt-userlogout": "Αποσύνδεση;",
+       "pt-userlogout": "Αποσύνδεση",
        "php-mail-error-unknown": "Άγνωστο σφάλμα στη συνάρτηση mail() της PHP.",
        "user-mail-no-addy": "Προσπαθήσατε να στείλετε e-mail χωρίς μια διεύθυνση e-mail.",
        "user-mail-no-body": "Προσπάθησε να στείλει e-mail με ένα κενό ή αδικαιολόγητα σύντομο σώμα.",
        "resetpass-submit-cancel": "Ακύρωση",
        "resetpass-wrong-oldpass": "Λάθος προσωρινός ή κανονικός κωδικός.\nΜπορεί να έχετε ήδη αλλάξει επιτυχώς τον κωδικό σας ή να έχετε ζητήσει έναν νέο προσωρινό κωδικό.",
        "resetpass-recycled": "Παρακαλούμε επαναφέρετε τον κωδικό πρόσβασής σας σε κάτι διαφορετικό από τον τρέχοντα κωδικό πρόσβασης.",
-       "resetpass-temp-emailed": "Έχετε συνδεθεί με ένα προσωρινό κωδικό μέσω ηλεκτρονικού ταχυδρομείου.\nΓια να ολοκληρώσετε τη σύνδεση, πρέπει να ορίσετε ένα νέο κωδικό εδώ:",
+       "resetpass-temp-emailed": "Έχετε συνδεθεί με έναν προσωρινό κωδικό μέσω ηλεκτρονικού ταχυδρομείου.\nΓια να ολοκληρώσετε τη σύνδεση, πρέπει να ορίσετε έναν νέο κωδικό εδώ:",
        "resetpass-temp-password": "Προσωρινός κωδικός:",
        "resetpass-abort-generic": "Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.",
-       "resetpass-expired": "Τον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹. Î\9fÏ\81ίÏ\83Ï\84ε Î­Î½Î± νέο κωδικό πρόσβασης για να συνδεθείτε.",
-       "resetpass-expired-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹ ÎºÎ±Î¹ Ï\80Ï\81έÏ\80ει Î½Î± Î³Î¯Î½ÎµÎ¹ ÎµÏ\80αναÏ\86οÏ\81ά Ï\84οÏ\85. Î Î±Ï\81ακαλοÏ\8dμε Î³Ï\81άÏ\88Ï\84ε Î­Î½Î± Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î® ÎºÎ¬Î½Ï\84ε ÎºÎ»Î¹Îº Ï\83Ï\84ο \"{{int:resetpass-submit-cancel}}\" για τον επαναφέρετε αργότερα.",
-       "resetpass-validity-soft": "Τον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1 \nΠαÏ\81ακαλÏ\8e ÎµÏ\80ιλέξÏ\84ε Î­Î½Î± Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α, Î® ÎºÎ¬Î½Ï\84ε ÎºÎ»Î¹Îº Ï\83Ï\84ο ÎºÎ¿Ï\85μÏ\80ί \"{{int:resetpass-submit-cancel}}\" Î³Î¹Î± Î½Î± Ï\84ο επαναφέρετε αργότερα.",
-       "passwordreset": "Î\9aÏ\89δικÏ\8cÏ\82 ÎµÏ\80αναÏ\86οÏ\81άÏ\82",
+       "resetpass-expired": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹. Î\9fÏ\81ίÏ\83Ï\84ε Î­Î½Î±Î½ νέο κωδικό πρόσβασης για να συνδεθείτε.",
+       "resetpass-expired-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹ ÎºÎ±Î¹ Ï\80Ï\81έÏ\80ει Î½Î± Î³Î¯Î½ÎµÎ¹ ÎµÏ\80αναÏ\86οÏ\81ά Ï\84οÏ\85. Î\95Ï\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:resetpass-submit-cancel}}» για τον επαναφέρετε αργότερα.",
+       "resetpass-validity-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1\n\nÎ\95Ï\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:resetpass-submit-cancel}}» Î³Î¹Î± Î½Î± Ï\84ον επαναφέρετε αργότερα.",
+       "passwordreset": "Î\95Ï\80αναÏ\86οÏ\81ά ÎºÏ\89δικοÏ\8d",
        "passwordreset-text-one": "Συμπληρώστε την παρακάτω φόρμα για να επαναφέρετε τον κωδικό πρόσβασής σας.",
        "passwordreset-text-many": "{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να λάβετε προσωρινό κωδικό πρόσβαση μέσω ηλεκτρονικού ταχυδρομείου.}}",
        "passwordreset-disabled": "Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki",
        "passwordreset-emailsent-capture": "Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.",
        "passwordreset-emailerror-capture": "Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1",
        "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
-       "changeemail-header": "Αλλαγή λογαριασμού ηλεκτρονικού ταχυδρομείου",
+       "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
+       "changeemail-passwordrequired": "Θα χρειαστεί να εισάγετε τον κωδικό σας για να επιβεβαιώσετε την αλλαγή αυτή.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "changeemail-oldemail": "Τρέχουσα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "changeemail-newemail": "Νέα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
+       "changeemail-newemail-help": "Αυτό το πεδίο θα πρέπει να μείνει κενό αν θέλετε να καταργήσετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν η διεύθυνση ηλεκτρονικού ταχυδρομείου καταργηθεί, δεν θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασης σε περίπτωση που τον ξεχάσετε και δεν θα λαμβάνετε μηνύματα ηλεκτρονικού ταχυδρομείου από αυτό το wiki.",
        "changeemail-none": "(κανένα)",
        "changeemail-password": "Ο κωδικός πρόσβασής σας στο εγχείρημα {{SITENAME}}:",
        "changeemail-submit": "Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-throttled": "Κάνατε πάρα πολλές απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
+       "changeemail-nochange": "Παρακαλώ εισάγετε μια διαφορετική νέα διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "resettokens": "Επαναφορά των κλειδιών",
        "resettokens-text": "Μπορείτε να επαναφέρετε τα κλειδιά, τα οποία επιτρέπουν την πρόσβαση σε ορισμένα ιδιωτικά δεδομένα που συνδέονται με τον λογαριασμό σας εδώ.\n\nΠρέπει να το κάνετε εάν κατά λάθος τα μοιραστήκατε με κάποιον ή αν ο λογαριασμός σας έχει παραβιαστεί.",
        "resettokens-no-tokens": "Δεν υπάρχουν κλειδιά για επαναφορά.",
        "sig_tip": "Η υπογραφή σας με ώρα και ημερομηνία",
        "hr_tip": "Οριζόντια γραμμή (να χρησιμοποιείται με φειδώ)",
        "summary": "Σύνοψη:",
-       "subject": "Θέμα/επικεφαλίδα:",
+       "subject": "Θέμα:",
        "minoredit": "Αυτή είναι μια μικροαλλαγή",
        "watchthis": "Παρακολούθηση αυτής της σελίδας",
        "savearticle": "Αποθήκευση σελίδας",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
        "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
        "missingcommenttext": "Παρακαλώ εισάγετε ένα σχόλιο παρακάτω.",
-       "missingcommentheader": "'''Υπενθύμιση:''' Δεν έχετε γράψει ένα θέμα/επικεφαλίδα για αυτό το σχόλιο.\nΑν κάνετε πάλι κλικ στο κουμπί \"{{int:savearticle}}\", η επεξεργασία σας θα αποθηκευτεί χωρίς θέμα ή επικεφαλίδα.",
+       "missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
        "summary-preview": "Προεπισκόπηση σύνοψης:",
-       "subject-preview": "Προεπισκόπηση θέματος/επικεφαλίδας:",
+       "subject-preview": "Προεπισκόπηση θέματος:",
        "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
        "blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
        "rcshowhidemine": "$1 των επεξεργασιών μου",
        "rcshowhidemine-show": "Εμφάνιση",
        "rcshowhidemine-hide": "Απόκρυψη",
+       "rcshowhidecategorization": "$1 κατηγοριοποίησης σελίδας",
+       "rcshowhidecategorization-show": "Εμφάνιση",
+       "rcshowhidecategorization-hide": "Απόκρυψη",
        "rclinks": "Εμφάνιση των τελευταίων $1 αλλαγών στο διάστημα των τελευταίων $2 ημερών<br />$3",
        "diff": "διαφορά",
        "hist": "ιστορικό",
        "recentchanges-page-added-to-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} προστέθηκαν στην κατηγορία",
        "recentchanges-page-removed-from-category": "Η σελίδα [[:$1]] αφαιρέθηκε από την κατηγορία",
        "recentchanges-page-removed-from-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} αφαιρέθηκαν από την κατηγορία",
+       "autochange-username": "Αυτόματη αλλαγή MediaWiki",
        "upload": "Ανέβασμα αρχείου",
        "uploadbtn": "Ανέβασμα αρχείου",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
        "upload-dialog-button-done": "Ολοκληρώθηκε",
        "upload-dialog-button-save": "Αποθήκευση",
        "upload-dialog-button-upload": "Ανέβασμα",
-       "upload-process-error": "Ένα σφάλμα συνέβη",
-       "upload-process-warning": "Προέκυψε μία προειδοποίηση",
        "upload-form-label-select-file": "Επιλογή αρχείου",
        "upload-form-label-infoform-title": "Λεπτομέρειες",
        "upload-form-label-infoform-name": "Όνομα",
        "changecontentmodel-model-label": "Νέο μοντέλο περιεχομένου",
        "changecontentmodel-reason-label": "Αιτία:",
        "changecontentmodel-success-title": "Το περιεχόμενο πρότυπο άλλαξε",
+       "changecontentmodel-success-text": "Ο τύπος περιεχομένου του [[:$1]] έχει αλλάξει.",
+       "changecontentmodel-nodirectediting": "Το μοντέλο περιεχομένου $1 δεν υποστηρίζει την άμεση επεξεργασία",
+       "log-name-contentmodel": "Αρχείο καταγραφής αλλαγών μοντέλου περιεχομένου",
+       "log-description-contentmodel": "Συμβάντα που σχετίζονται με τα μοντέλα περιεχομένου μιας σελίδας",
        "logentry-contentmodel-change": "{{GENDER:$2|Ο|Η}} $1 άλλαξε το πρότυπο περιεχομένου της σελίδας $3 από «$4» σε «$5»",
        "logentry-contentmodel-change-revertlink": "αναστροφή",
        "logentry-contentmodel-change-revert": "αναστροφή",
        "movepagetext-noredirectfixer": "Χρησιμοποιώντας τη φόρμα που ακολουθεί μπορείτε να μετονομάσετε σελίδες και να μεταφέρετε όλο το ιστορικό τους στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει μια σελίδα ανακατεύθυνσης στο νέο τίτλο.\nΜπορείτε να ενημερώσετε τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο αυτόματα.\nΑν επιλέξετε να μην γίνει, θα πρέπει να ελέγξετε τις  [[Special:DoubleRedirects|διπλές]] και τις [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίστε υπεύθυνος να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να οδηγούν προς τις κατευθύνσεις που πρέπει.\n\nΛάβετε υπόψη σας ότι η σελίδα '''δεν''' θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα κάτω από το νέο τίτλο, εκτός αν η σελίδα αυτή είναι κενή ή είναι ανακατεύθυνση χωρίς ιστορικό επεξεργασίας.\nΑυτό σημαίνει ότι, στην περίπτωση που έχετε κάνει λάθος, μπορείτε να μετονομάσετε μια σελίδα ξαναδίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n'''ΠΡΟΣΟΧΗ!'''\nΗ μετονομασία σελίδας είναι μια αιφνίδια και δραστική αλλαγή όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε, πριν το αποφασίσετε, να εξετάσετε προσεκτικά τις πιθανές επιπτώσεις αυτής της ενέργειας.",
        "movepagetalktext": "Αν τσεκάρετε αυτό το κουτί, η σχετιζόμενη σελίδα συζήτησης θα μετακινηθεί αυτόματα στο νέο τίτλο, εκτός αν υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή.\n\nΣε αυτή την περίπτωση, θα πρέπει να μετακινήσετε ή να συγχωνεύσετε τη σελίδα με το χέρι αν είναι επιθυμητό.",
        "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
-       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πάτε να μετακινήσετε μια σελίδα κατηγορίας. Παρακαλούμε να σημειωθεί ότι μόνο η σελίδα θα μετακινηθεί και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα επανακατηγοριοποιηθούν στη νέα κατηγορία.",
+       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πρόκειται να μετακινήσετε μια σελίδα κατηγορίας. Έχετε υπόψη ότι θα μετακινηθεί μόνο η σελίδα και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα μεταφερθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "movenotallowed": "Δεν έχετε άδεια να μετακινείτε σελίδες.",
        "movenotallowedfile": "Δεν έχετε άδεια να μετακινείτε αρχεία.",
index 3845370..c97b08e 100644 (file)
@@ -7,6 +7,7 @@
        "tog-hideminor": "Hide minor edits from recent changes",
        "tog-hidepatrolled": "Hide patrolled edits from recent changes",
        "tog-newpageshidepatrolled": "Hide patrolled pages from new page list",
+       "tog-hidecategorization": "Hide categorization of pages",
        "tog-extendwatchlist": "Expand watchlist to show all changes, not just the most recent",
        "tog-usenewrc": "Group changes by page in recent changes and watchlist",
        "tog-numberheadings": "Auto-number headings",
@@ -36,6 +37,7 @@
        "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
        "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
        "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
+       "tog-watchlisthidecategorization": "Hide categorization of pages",
        "tog-ccmeonemails": "Send me copies of emails I send to other users",
        "tog-diffonly": "Do not show page content below diffs",
        "tog-showhiddencats": "Show hidden categories",
        "createaccountreason": "Reason:",
        "createacct-reason": "Reason",
        "createacct-reason-ph": "Why you are creating another account",
-       "createacct-captcha": "Security check",
        "createacct-imgcaptcha-help": "",
-       "createacct-imgcaptcha-ph": "Enter the text you see above",
        "createacct-submit": "Create your account",
        "createacct-another-submit": "Create account",
        "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
        "permissionserrors": "Permission error",
        "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
        "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
+       "contentmodelediterror": "You cannot edit this revision because its content model is <code>$1</code>, and the current content model of the page is <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
        "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
        "moveddeleted-notice-recent": "Sorry, this page was recently deleted (within the last 24 hours).\nThe deletion and move log for the page are provided below for reference.",
        "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "There were no results matching the query.",
+       "search-nonefound-thiswiki": "There were no results matching the query in this site.",
        "powersearch-legend": "Advanced search",
        "powersearch-ns": "Search in namespaces:",
        "powersearch-togglelabel": "Check:",
        "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
        "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
        "savedprefs": "Your preferences have been saved.",
+       "savedrights": "The user rights of {{GENDER:$1|$1}} have been saved.",
        "timezonelegend": "Time zone:",
        "localtime": "Local time:",
        "timezoneuseserverdefault": "Use wiki default ($1)",
        "rcshowhidemine": "$1 my edits",
        "rcshowhidemine-show": "Show",
        "rcshowhidemine-hide": "Hide",
+       "rcshowhidecategorization": "$1 page categorization",
+       "rcshowhidecategorization-show": "Show",
+       "rcshowhidecategorization-hide": "Hide",
        "rclinks": "Show last $1 changes in last $2 days<br />$3",
        "diff": "diff",
        "hist": "hist",
        "spam_blanking": "All revisions contained links to $1, blanking",
        "spam_deleting": "All revisions contained links to $1, deleting",
        "simpleantispam-label": "Anti-spam check.\nDo <strong>not</strong> fill this in!",
+       "autochange-username": "MediaWiki automatic change",
        "pageinfo-header": "-",
        "pageinfo-title": "Information for \"$1\"",
        "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
index d9362f9..3943862 100644 (file)
        "createaccountreason": "Kialo:",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
-       "createacct-captcha": "Sekureca kontrolo",
-       "createacct-imgcaptcha-ph": "Entajpu la supran tekston",
        "createacct-submit": "Krei konton",
        "createacct-another-submit": "Krei alian konton",
        "createacct-benefit-heading": "{{SITENAME}} estas kreata de homoj kiel vi.",
        "updated": "(Ŝanĝo registrita)",
        "note": "'''Noto:'''",
        "previewnote": "'''Memoru, ke ĉi tio estas nur antaŭrigardo.''' \nViaj ŝanĝoj ne ankoraŭ estas konservitaj!",
-       "continue-editing": "Iru al redakta spaco",
+       "continue-editing": "Iri al redakta spaco",
        "previewconflict": "La jena antaŭrigardo montras la tekston el la supra tekstujo,\nkiel ĝi aperos se vi elektos konservi la paĝon.",
        "session_fail_preview": "'''Ni ne povas procezi vian redakton pro perdo de seancaj datenoj.\nBonvolu reprovi.\nSe ankoraŭ ne funkcios, provu [[Special:UserLogout|elsaluti]] kaj reensaluti.'''",
        "session_fail_preview_html": "'''Bedaŭrinde, ni ne povas trakti vian redakton pro manko de seancaj datenoj.'''\n\n''Ĉar {{SITENAME}} ebligas krudan HTML-kodon, ĉi tiu antaŭrigardo estas kaŝita kiel prevento kontraŭ Ĝavaskriptaj atakoj.''\n\n'''Se ĉi tiu estas taŭga provo por redakti, bonvolu reprovi.'''\nSe ankoraŭ ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj reensaluti.",
index e71cd2f..2fce30d 100644 (file)
                        "JasterTDC",
                        "Laurenslimb",
                        "Tusca",
-                       "Tadol"
+                       "Tadol",
+                       "Nelson6e65"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-hideminor": "Ocultar las ediciones menores de los cambios recientes",
        "tog-hidepatrolled": "Ocultar las ediciones verificadas de los cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar las páginas verificadas de la lista de páginas nuevas",
+       "tog-hidecategorization": "Ocultar la categorización de páginas",
        "tog-extendwatchlist": "Mostrar todos los cambios en la lista de seguimiento, no solo los más recientes",
        "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
        "tog-oldsig": "Firma actual:",
        "tog-fancysig": "Tratar la firma como wikitexto (sin un enlace automático)",
        "tog-uselivepreview": "Usar previsualización dinámica",
-       "tog-forceeditsummary": "Avisarme cuando grabe la página sin escribir un resumen de edición",
+       "tog-forceeditsummary": "Avisarme cuando deje en blanco el resumen de la edición",
        "tog-watchlisthideown": "Ocultar mis ediciones de la lista de seguimiento",
        "tog-watchlisthidebots": "Ocultar las ediciones de bots de la lista de seguimiento",
        "tog-watchlisthideminor": "Ocultar las ediciones menores de la lista de seguimiento",
        "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados de la lista de seguimiento",
        "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos de la lista de seguimiento",
        "tog-watchlisthidepatrolled": "Ocultar las ediciones verificadas de la lista de seguimiento",
+       "tog-watchlisthidecategorization": "Ocultar la categorización de páginas",
        "tog-ccmeonemails": "Recibir copias de los correos electrónicos que envíe a otros usuarios",
        "tog-diffonly": "No mostrar el contenido de la página debajo de la lista de diferencias",
        "tog-showhiddencats": "Mostrar categorías ocultas",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por qué estás creando otra cuenta",
-       "createacct-captcha": "Comprobación de seguridad",
-       "createacct-imgcaptcha-ph": "Escribe el texto de arriba",
        "createacct-submit": "Crea tu cuenta",
        "createacct-another-submit": "Crear cuenta",
        "createacct-benefit-heading": "Personas como tú son las que construyen {{SITENAME}}.",
        "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} entre el n.º <strong>$2</strong> y el n.º <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "No hay resultados que cumplan los criterios de búsqueda.",
+       "search-nonefound-thiswiki": "No hay resultados que cumplan los criterios de búsqueda en este sitio.",
        "powersearch-legend": "Búsqueda avanzada",
        "powersearch-ns": "Buscar en los espacios de nombres:",
        "powersearch-togglelabel": "Seleccionar:",
        "prefs-help-recentchangescount": "Esto incluye cambios recientes, historiales de páginas y registros.",
        "prefs-help-watchlist-token2": "Esta es la clave secreta del canal de suscripción de tu lista de seguimiento.\nCualquier persona que la conozca podría leer tu lista, así que no la compartas.\n[[Special:ResetTokens|Pulsa aquí si necesitas restablecerla]].",
        "savedprefs": "Se han guardado tus preferencias.",
+       "savedrights": "Se han guardado los permisos de {{GENDER:$1|$1}}.",
        "timezonelegend": "Huso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar la hora del servidor ($1)",
        "rcshowhidemine": "$1 mis ediciones",
        "rcshowhidemine-show": "Mostrar",
        "rcshowhidemine-hide": "Ocultar",
+       "rcshowhidecategorization": "$1 categorización de página",
+       "rcshowhidecategorization-show": "Mostrar",
+       "rcshowhidecategorization-hide": "Ocultar",
        "rclinks": "Ver los últimos $1 cambios en los últimos $2 días.<br />$3",
        "diff": "dif",
        "hist": "hist",
        "upload-dialog-button-done": "Hecho",
        "upload-dialog-button-save": "Guardar",
        "upload-dialog-button-upload": "Subir",
-       "upload-process-error": "Ha ocurrido un error",
-       "upload-process-warning": "Ha ocurrido una advertencia",
        "upload-form-label-select-file": "Seleccionar archivo",
        "upload-form-label-infoform-title": "Detalles",
        "upload-form-label-infoform-name": "Nombre",
        "svg-long-error": "Archivo SVG no válido: $1",
        "show-big-image": "Archivo original",
        "show-big-image-preview": "Tamaño de esta previsualización: $1.",
+       "show-big-image-preview-differ": "Tamaño de esta previsualización $3 del archivo $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Otra resolución|Otras resoluciones}}: $1.",
        "show-big-image-size": "$1 × $2 píxeles",
        "file-info-gif-looped": "bucleado",
index 8216c8a..ba42a7f 100644 (file)
@@ -33,6 +33,7 @@
        "tog-hideminor": "Peida pisiparandused viimastes muudatustes",
        "tog-hidepatrolled": "Peida kontrollitud redaktsioonid viimastes muudatustes",
        "tog-newpageshidepatrolled": "Peida uute lehtede loendis kontrollitud leheküljed",
+       "tog-hidecategorization": "Peida lehekülgede kategoriseerimine",
        "tog-extendwatchlist": "Laienda jälgimisloendit, et näha kõiki muudatusi, mitte vaid kõige värskemaid",
        "tog-usenewrc": "Rühmita viimased muudatused ja muudatused jälgimisloendis lehekülje järgi",
        "tog-numberheadings": "Pealkirjade automaatnummerdus",
@@ -62,6 +63,7 @@
        "tog-watchlisthideliu": "Peida sisselogitud kasutajate muudatused jälgimisloendist",
        "tog-watchlisthideanons": "Peida anonüümsete kasutajate muudatused jälgimisloendist",
        "tog-watchlisthidepatrolled": "Peida kontrollitud muudatused jälgimisloendist",
+       "tog-watchlisthidecategorization": "Peida lehekülgede kategoriseerimine",
        "tog-ccmeonemails": "Saada mulle koopiad minu läkitatud e-kirjadest",
        "tog-diffonly": "Ära näita erinevuste vaate all lehe sisu",
        "tog-showhiddencats": "Näita peidetud kategooriaid",
        "createaccountreason": "Põhjus:",
        "createacct-reason": "Põhjus",
        "createacct-reason-ph": "Miks lood teist kontot?",
-       "createacct-captcha": "Turvakontroll",
-       "createacct-imgcaptcha-ph": "Sisesta ülalnähtav tekst",
        "createacct-submit": "Loo konto",
        "createacct-another-submit": "Loo konto",
        "createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
        "permissionserrors": "Loatõrge",
        "permissionserrorstext": "Sul pole õigust seda teha {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
        "permissionserrorstext-withaction": "Sul pole lubatud {{lcfirst:$2}} {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
+       "contentmodelediterror": "Sa ei saa seda redaktsiooni redigeerida, sest selle sisumudel on <code>$1</code> ning lehekülje praegune sisumudel on <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Hoiatus: Lood uuesti lehekülge, mis on varem kustutatud.'''\n\nKaalu, kas lehekülje uuesti loomine on kohane.\nLehekülje eelnevad kustutamised ja teisaldamised:",
        "moveddeleted-notice": "See lehekülg on kustutatud.\nAllpool on esitatud lehekülje kustutamis- ja teisaldamislogi.",
        "moveddeleted-notice-recent": "Kahjuks on see lehekülg hiljuti kustutatud (viimase 24 tunni jooksul).\nAllpool on ära toodud selle lehekülje sissekanded teisaldamis- ja kustutamislogis.",
        "showingresultsinrange": "Allpool näidatakse {{PLURAL:$1|<strong>üht</strong>|<strong>$1</strong>}} tulemust vahemikus <strong>$2</strong>–<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|<strong>$1</strong>. tulemus <strong>$3</strong>-st|Tulemused <strong>$1–$2</strong> <strong>$3</strong>-st}}",
        "search-nonefound": "Päringule ei leitud vasteid.",
+       "search-nonefound-thiswiki": "Sellest võrgukohast ei leitud vasteid sinu otsingule.",
        "powersearch-legend": "Täpsem otsing",
        "powersearch-ns": "Otsing nimeruumidest:",
        "powersearch-togglelabel": "Vali:",
        "prefs-help-recentchangescount": "See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.",
        "prefs-help-watchlist-token2": "See on sinu jälgimisloendi veebivoo salavõti.\nIgaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.\n[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].",
        "savedprefs": "Sinu eelistused on salvestatud.",
+       "savedrights": "Kasutaja $1 õigused on salvestatud.",
        "timezonelegend": "Ajavöönd:",
        "localtime": "Kohalik aeg:",
        "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)",
        "rcshowhidemine": "Minu parandused ($1)",
        "rcshowhidemine-show": "näita",
        "rcshowhidemine-hide": "peida",
+       "rcshowhidecategorization": "Kategoriseerimine ($1)",
+       "rcshowhidecategorization-show": "näita",
+       "rcshowhidecategorization-hide": "peida",
        "rclinks": "Näita viimast $1 muudatust viimase $2 päeva jooksul<br />$3",
        "diff": "erin",
        "hist": "ajal",
        "upload-dialog-button-done": "Valmis",
        "upload-dialog-button-save": "Salvesta",
        "upload-dialog-button-upload": "Laadi üles",
-       "upload-process-error": "Esines tõrge",
-       "upload-process-warning": "Esines hoiatus",
        "upload-form-label-select-file": "Vali fail",
        "upload-form-label-infoform-title": "Üksikasjad",
        "upload-form-label-infoform-name": "Pealkiri",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Võimalik, et soovid kasutada [[Special:Upload|harilikku üleslaadimislehekülge]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Saan aru, et laadin selle faili jagatud varamusse. Kinnitan, et teen seda kooskõlas sealsete kasutustingimuste ja litsentsipõhimõtetega.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Kui sul pole võimalik laadida seda faili üles kooskõlas jagatud varamu reeglitega, siis palun sule see dialoog ja proovi teisiti toimida.",
-       "foreign-structured-upload-form-label-not-own-work-local-default": "Võimalik, et soovid [[Special:Upload|laadida selle faili üles saidil {{SITENAME}}]], kui seda on võimalik teha kooskõlas sealsete reeglitega.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Võimalik, et soovid [[Special:Upload|laadida selle faili üles saidil {{SITENAME}}]], kui seda on võimalik teha kooskõlas siinsete reeglitega.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Kinnitan, et olen selle faili autoriõiguse valdaja ja nõustun faili avaldamisega Wikimedia Commonsis pöördumatult Creative Commonsi litsentsi \"[https://creativecommons.org/licenses/by-sa/4.0/deed.et Autorile viitamine + jagamine samadel tingimustel 4.0]\" all. Samuti nõustun [https://wikimediafoundation.org/wiki/Terms_of_Use kasutustingimustega].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Kui sa pole selle faili autoriõiguse valdaja või kui soovid avaldada seda teise litsentsi all, siis on sul võimalik kasutada [https://commons.wikimedia.org/wiki/Special:UploadWizard Commonsi üleslaadimisviisardit].",
-       "foreign-structured-upload-form-label-not-own-work-local-shared": "Võimalik, et soovid kasutada [[Special:Upload|saidi {{SITENAME}} üleslaadimislehekülge]], kui seda faili on lubatud üles laadida kooskõlas sealsete reeglitega.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Võimalik, et soovid kasutada [[Special:Upload|saidi {{SITENAME}} üleslaadimislehekülge]], kui seda faili on lubatud üles laadida kooskõlas siinsete reeglitega.",
        "backend-fail-stream": "Faili $1 ei saanud edastada.",
        "backend-fail-backup": "Faili $1 ei saanud varundada.",
        "backend-fail-notexists": "Faili $1 pole olemas.",
index 1eca2bb..630bea2 100644 (file)
        "upload-dialog-button-done": "Egina",
        "upload-dialog-button-save": "Gorde",
        "upload-dialog-button-upload": "Igo",
-       "upload-process-error": "Errore bat gertatu da",
        "upload-form-label-select-file": "Fitxategia Aukeratu",
        "upload-form-label-infoform-title": "Xehetasunak",
        "upload-form-label-infoform-name": "Izena",
index 8c39588..4313261 100644 (file)
@@ -55,6 +55,7 @@
        "tog-hideminor": "تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند",
        "tog-hidepatrolled": "ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند",
        "tog-newpageshidepatrolled": "صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند",
+       "tog-hidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها",
        "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحات تغییرات اخیر و فهرست پیگیری‌ها",
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
@@ -84,6 +85,7 @@
        "tog-watchlisthideliu": "ویرایش‌های کاربران وارد شده به سامانه در فهرست پی‌گیری‌ها پنهان شود",
        "tog-watchlisthideanons": "ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌های من پنهان شود",
        "tog-watchlisthidepatrolled": "ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود",
+       "tog-watchlisthidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "tog-ccmeonemails": "رونوشتی از ایمیلی که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود",
        "tog-diffonly": "محتوای صفحه، زیر تفاوت نمایش داده نشود",
        "tog-showhiddencats": "رده‌های پنهان نمایش داده شود",
        "viewsource": "نمایش مبدأ",
        "viewsource-title": "نمایش مبدأ برای $1",
        "actionthrottled": "جلوی عمل شما گرفته شد",
-       "actionthrottledtext": "بÙ\87 Ù\85Ù\86ظÙ\88ر Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ø§Ù\86تشار Ø§Ø³Ù¾Ù\85، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.\nلطفاً پس از چند دقیقه دوباره تلاش کنید.",
+       "actionthrottledtext": "بÙ\87 Ù\85Ù\86ظÙ\88ر Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ø§Ù\86تشار Ø®Ø±Ø§Ø¨Ú©Ø§Ø±Û\8c، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.\nلطفاً پس از چند دقیقه دوباره تلاش کنید.",
        "protectedpagetext": "این صفحه برای جلوگیری از ویرایش یا فعالیت دیگر محافظت شده‌است.",
        "viewsourcetext": "می‌توانید متن مبدأ این صفحه را مشاهده کنید یا از آن نسخه بردارید:",
        "viewyourtext": "می‌توانید کد مبدأ <strong>ویرایش‌هایتان</strong> در این صفحه را ببینید و کپی کنید.",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "چرا شما حساب دیگری می‌سازید؟",
-       "createacct-captcha": "بررسی امنیتی",
-       "createacct-imgcaptcha-ph": "متن تصویری که در بالا می‌بینید، وارد کنید",
        "createacct-submit": "حسابتان را بسازید",
        "createacct-another-submit": "ایجاد حساب کاربری",
        "createacct-benefit-heading": "{{SITENAME}} توسط افرادی مانند شما ساخته شده است",
        "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را داده است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailtext-user": "کاربر $1 از {{SITENAME}} درخواست بازنشانی گذرواژهٔ شما در {{SITENAME}} ($4) را کرده است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط است:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} تا {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.\nشما باید هم‌اکنون وارد شده و یک گذرواژهٔ جدید برگزینید. اگر شخص دیگری این درخواست را داده است، یا اگر گذرواژهٔ اصلی‌تان را به خاطر آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
-       "passwordreset-emailsent": "یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
+       "passwordreset-emailsent": "اگر ایمیلی را برای حساب کاربریتان مشخص کرده باشید، یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
        "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
        "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
        "changeemail": "تغییر یا حذف نشانی ایمیل",
-       "changeemail-header": "تغییر آدرس ایمیل حساب کاربری",
+       "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
+       "changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژه‌تان را وارد کنید.",
        "changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "changeemail-oldemail": "آدرس ایمیل کنونی:",
        "changeemail-newemail": "آدرس ایمیل جدید:",
+       "changeemail-newemail-help": "برای حذف ایمیل باید این بخش را خالی رها کنید در نتیجه امکان بازگردانی گذرواژه و دریافت ایمیل از ویکی برای شما مقدور نخواهد بود.",
        "changeemail-none": "(هیچ)",
        "changeemail-password": "گذرواژهٔ {{SITENAME}} شما:",
        "changeemail-submit": "تغییر ایمیل",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"{{int:savearticle}}\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
-       "missingcommentheader": "'''یادآوری:''' شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "summary-preview": "پیش‌نمایش خلاصه:",
-       "subject-preview": "پیش‌نمایش موضوع/عنوان:",
+       "subject-preview": "پیش‌نمایش موضوع:",
        "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطای رخ داد.",
        "blockedtitle": "کاربر بسته شده‌است",
        "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</strong>\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: <em>$2</em>\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "permissionserrors": "خطای سطح دسترسی",
        "permissionserrorstext": "شما اجازهٔ انجام این کار را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
        "permissionserrorstext-withaction": "شما اجازهٔ $2 را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
+       "contentmodelediterror": "امکان ویرایش این نسخه برای شما نیست چون نوع محتوای آن <code>$1</code> است و نوع محتوای کنونی صفحه <code>$2</code> است.",
        "recreate-moveddeleted-warn": "<strong>هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.</strong>\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
        "moveddeleted-notice": "این صفحه حذف شده‌است.\nدر زیر سیاههٔ حذف و انتقال این صفحه نمایش داده شده‌است.",
        "moveddeleted-notice-recent": "متاسفانه صفحه قبلا حذف شده‌است (در ۲۴ ساعت اخیر) \nدلیل حذف و سیاههٔ انتقال در پائین موجود است.",
        "prefs-help-recentchangescount": "این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.",
        "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.\nهرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].",
        "savedprefs": "ترجیحات شما ذخیره شد.",
+       "savedrights": "دسترسی کاربری {{GENDER:$1|$1}} ذخیره شده‌است.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "زمان محلی:",
        "timezoneuseserverdefault": "استفاده از پیش‌فرض ویکی ($1)",
        "group-bot": "ربات‌ها",
        "group-sysop": "مدیران",
        "group-bureaucrat": "دیوان‌سالاران",
-       "group-suppress": "Ù¾Ù\86Ù\87اÙ\86گران",
+       "group-suppress": "Ù\81رÙ\88Ù\86شاÙ\86Ù\86دگان",
        "group-all": "(همه)",
        "group-user-member": "{{GENDER:$1|کاربر}}",
        "group-autoconfirmed-member": "{{GENDER:$1|کاربر تأییدشده}}",
        "group-bot-member": "ربات",
        "group-sysop-member": "{{GENDER:$1|مدیر}}",
        "group-bureaucrat-member": "{{GENDER:$1|دیوان‌سالار}}",
-       "group-suppress-member": "{{GENDER:$1|Ù¾Ù\86Ù\87اÙ\86گر}}",
+       "group-suppress-member": "{{GENDER:$1|Ù\81رÙ\88Ù\86شاÙ\86Ù\86دÙ\87}}",
        "grouppage-user": "{{ns:project}}:کاربران",
        "grouppage-autoconfirmed": "{{ns:project}}:کاربران تأییدشده",
        "grouppage-bot": "{{ns:project}}:ربات‌ها",
        "grouppage-sysop": "{{ns:project}}:مدیران",
        "grouppage-bureaucrat": "{{ns:project}}:دیوان‌سالاران",
-       "grouppage-suppress": "{{ns:project}}:Ù¾Ù\86Ù\87اÙ\86گر",
+       "grouppage-suppress": "{{ns:project}}:Ù\81رÙ\88Ù\86شاÙ\86Û\8c",
        "right-read": "خواندن صفحه",
        "right-edit": "ویرایش صفحه",
        "right-createpage": "ایجاد صفحه (در مورد صفحه‌های غیر بحث)",
        "rcshowhidemine": "$1 ویرایش‌های من",
        "rcshowhidemine-show": "نمایش",
        "rcshowhidemine-hide": "نهفتن",
+       "rcshowhidecategorization": "$1 رده‌بندی صفحه‌ها",
+       "rcshowhidecategorization-show": "نمایش",
+       "rcshowhidecategorization-hide": "نهفتن",
        "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر به رده اضافه شدند",
        "recentchanges-page-removed-from-category": "[[:$1]] از رده حذف شد",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر از رده حذف شدند",
+       "autochange-username": "تغییرات خودکار مدیاویکی",
        "upload": "بارگذاری پرونده",
        "uploadbtn": "بارگذاری پرونده",
        "reuploaddesc": "بازگشت به فرم بارگذاری",
        "upload-options": "گزینه‌های بارگذاری",
        "watchthisupload": "پی‌گیری این پرونده",
        "filewasdeleted": "پرونده‌ای با همین نام پیشتر بارگذاری و پس از آن پاک شده‌است.\nشما باید $1 را قبل از بارگذاری مجدد آن ببینید.",
+       "filename-thumb-name": "به نظر می رسد که عنوان thumbnail است. لطفاً تصویر thumbnail  از دیگر ویکی‌ها را بارگذاری نکنید. عنوان پرونده را اصلاح کنید به صورتی که پیشوند thumbnail نداشته باشد.",
        "filename-bad-prefix": "نام پرونده‌ای که بارگذاری می‌کنید با '''$1''' آغاز می‌شود که یک پیشوند مخصوص تصاویر ثبت شده توسط دوربین‌های دیجیتال است.\nلطفاً نامی بهتر برای پرونده برگزینید.",
        "upload-success-subj": "بارگذاری با موفقیت انجام شد",
        "upload-success-msg": "بارگذاری شما از [$2] موفق بود. این پرونده در اینجا قابل دسترسی است: [[:{{ns:file}}:$1]]",
        "upload-dialog-button-done": "انجام شد",
        "upload-dialog-button-save": "ذخیره",
        "upload-dialog-button-upload": "بارگذاری",
-       "upload-process-error": "يک خطا اتفاق افتاد",
-       "upload-process-warning": "یک هشدار رخ‌داد",
        "upload-form-label-select-file": "یک فایل انتخاب کنید",
        "upload-form-label-infoform-title": "جزئیات",
        "upload-form-label-infoform-name": "نام",
        "foreign-structured-upload-form-label-own-work": "این کار خودم است",
        "foreign-structured-upload-form-label-infoform-categories": "رده‌ها",
        "foreign-structured-upload-form-label-infoform-date": "تاریخ",
+       "foreign-structured-upload-form-label-own-work-message-local": "تائید می کنم که این پرونده را تحت مجوزها و سیاست‌های {{SITENAME}} بارگذاری می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "اگر امکان بارگذاری پرونده تحت سیاست‌های {{SITENAME}} را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "ممکن بخواهید از [[Special:Upload|پنجرهٔ بارگذاری پیش‌فرض]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-default": "متوجهم که این پرونده را بر روی مخزن مشترک بارگذاری می‌کنم و تائید می‌کنم که تحت سیاست‌ها و مجوزهای آنجا عمل می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "اگر امکان بارگذاری پرونده تحت سیاست‌ها و مجوزهای مخزن اشتراک‌گذاری را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "در صورتی که نمی‌شود پرونده را تحت سیاست‌ها بارگذاری کنید ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "تصدیق می‌کنم که مالک حق تکثیر این پرونده هستم و موافق اشتراک‌گذاری آن تحت مجوز [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] هستم و موافق [https://wikimediafoundation.org/wiki/Terms_of_Use سیاست نحوهٔ استفاده] هستم.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "اگر مالک حق تکثیر این پرونده نیستید یا قصد بارگذاری تحت مجوز دیگری دارید، از [https://commons.wikimedia.org/wiki/Special:UploadWizard جادوگر بارگذاری ویکی‌انبار] استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "در صورتی که سایت امکان بارگذاری پرونده را تحت سیاست‌ها بارگذاری می‌دهد ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
        "backend-fail-stream": "نمی‌توان پروندهٔ $1 را ارسال کرد.",
        "backend-fail-backup": "نمی‌توان نسخهٔ پشتیبان برای پروندهٔ $1 ایجاد کرد.",
        "backend-fail-notexists": "پروندهٔ $1 وجود ندارد.",
        "nopagetext": "صفحهٔ هدفی که شما مشخص کردید وجود ندارد.",
        "pager-newer-n": "{{PLURAL:$1|یک مورد جدیدتر|$1 مورد جدیدتر}}",
        "pager-older-n": "{{PLURAL:$1|یک مورد قدیمی‌تر|$1 مورد قدیمی‌تر}}",
-       "suppress": "نظارت",
+       "suppress": "سرکوب",
        "querypage-disabled": "این صفحه ویژه به دلایل عملکردی غیرفعال شده‌است.",
        "apihelp": "راهنمای API",
        "apihelp-no-such-module": "پودمان \" $1 \" یافت نشد.",
        "move-page-legend": "انتقال صفحه",
        "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
        "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پس از انتقال، پیوندها به عنوان پیشین به جایی منتهی می‌شوند که باید.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید یک صفحه را به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n'''هشدار!'''\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
-       "movepagetalktext": "صÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« Ù\85ربÙ\88Ø·Ø\8c Ø§Ú¯Ø± Ù\88جÙ\88د Ø¯Ø§Ø´ØªÙ\87 Ø¨Ø§Ø´Ø¯Ø\8c Ø¨Ø·Ù\88ر Ø®Ù\88دکار Ù\87Ù\85راÙ\87 Ø¨Ø§ Ù\85Ù\82اÙ\84Ù\87Ù\94 Ø§ØµÙ\84Û\8c Ù\85Ù\86تÙ\82Ù\84 Ø®Ù\88اÙ\87د Ø´Ø¯ <strong>Ù\85گر Ø§Û\8cÙ\86Ú©Ù\87:</strong>\n* Ø¯Ø± Ø­Ø§Ù\84 Ø§Ù\86تÙ\82اÙ\84 ØµÙ\81Ø­Ù\87 Ø§Ø² Ø§Û\8cÙ\86 Ù\81ضاÛ\8c Ù\86اÙ\85 Ø¨Ù\87 Ù\81ضاÛ\8c Ù\86اÙ\85 Ø¯Û\8cگرÛ\8c Ø¨Ø§Ø´Û\8cدØ\8c\n* Û\8cÚ© ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« ØºÛ\8cرخاÙ\84Û\8c ØªØ­Øª Ø§Û\8cÙ\86 Ù\86اÙ\85 Ø¬Ø¯Û\8cد Ù\88جÙ\88د Ø¯Ø§Ø´ØªÙ\87 Ø¨Ø§Ø´Ø¯Ø\8c Û\8cا\n* Ø¬Ø¹Ø¨Ù\87Ù\94 Ø²Û\8cر Ø±Ø§ ØªÛ\8cÚ© Ù\86زدÙ\87 Ø¨Ø§Ø´Û\8cد.\n\nدر Ø§Û\8cÙ\86 Ø­Ø§Ù\84ات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
+       "movepagetalktext": "اگر Ø§Û\8cÙ\86 Ú¯Ø²Û\8cÙ\86Ù\87 Ø±Ø§ Ø§Ù\86تخاب Ú©Ù\86Û\8cدØ\8c ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« Ù\85رتبط Ø¨Ù\87 ØµÙ\88رت Ø®Ù\88دکار Ø§Ù\86تÙ\82اÙ\84 Ø¯Ø§Ø¯Ù\87 Ù\85Û\8câ\80\8cØ´Ù\88د Ø¨Ù\87 Ø¹Ù\86Ù\88اÙ\86 Ø¬Ø¯Û\8cد Ù\88 Ø¯Ø± ØµÙ\88رت Ø¹Ø¯Ù\85 Ø§Ù\86تخاب Ú¯Ø²Û\8cÙ\86Ù\87Ø\8c ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« Ø¬Ø¯Û\8cد Û\8cÚ© ØµÙ\81Ø­Ù\87Ù\94 Ø®Ø§Ù\84Û\8c Ø®Ù\88اÙ\87د Ø¨Ù\88د Ù\88 Ø¯Ø± Ø§Û\8cÙ\86 Ø­Ø§Ù\84ت، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
        "movenologintext": "برای انتقال صفحات باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
        "svg-long-error": "پرونده SVG نامجاز: $1",
        "show-big-image": "پروندهٔ اصلی",
        "show-big-image-preview": "اندازهٔ این پیش‌نمایش: $1.",
+       "show-big-image-preview-differ": "حجم پیش‌نمایش $3 این $2 file:$1",
        "show-big-image-other": "{{PLURAL:$2|کیفیت|کیفیت‌های}} دیگر: $1.",
        "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل",
        "file-info-gif-looped": "چرخش‌دار",
        "logentry-protect-move_prot": "$1 تنظیمات محافظت را از $4 به $3 {{GENDER:$2|منتقل کرد}}",
        "logentry-protect-unprotect": "$1 $3 را از محافظت {{GENDER:$2|خارج کرد}}",
        "logentry-protect-protect": "$1 $3 را {{GENDER:$2|محافظت کرد}} $4",
+       "logentry-protect-protect-cascade": "$1 $3 $4 {{GENDER:$2|محافظت کرد}} [آبشاری]",
        "logentry-protect-modify": "$1 سطح محافظت $3 را {{GENDER:$2|تغییر داد}} $4",
+       "logentry-protect-modify-cascade": "$1 سطح حفاظت برای $3 $4 را {{GENDER:$2|تغییر داد}}[آبشاری]",
        "logentry-rights-rights": "$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
index 6322387..de13ad1 100644 (file)
@@ -53,6 +53,7 @@
        "tog-hideminor": "Piilota pienet muutokset tuoreet muutokset -listasta",
        "tog-hidepatrolled": "Piilota tarkastetut muutokset tuoreet muutokset -listasta",
        "tog-newpageshidepatrolled": "Piilota tarkastetut sivut uusien sivujen listalta",
+       "tog-hidecategorization": "Piilota sivujen luokittelu",
        "tog-extendwatchlist": "Laajenna tarkkailulista näyttämään kaikki tehdyt muutokset eikä vain viimeisimmät",
        "tog-usenewrc": "Ryhmittele muutokset sivun mukaan tuoreiden muutosten listalla ja tarkkailulistalla",
        "tog-numberheadings": "Numeroi otsikot automaattisesti",
@@ -82,6 +83,7 @@
        "tog-watchlisthideliu": "Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta",
+       "tog-watchlisthidecategorization": "Piilota muutokset, jotka koskevat sivujeen lisäämistä tai poistamista luokkiin",
        "tog-ccmeonemails": "Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista",
        "tog-diffonly": "Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella",
        "tog-showhiddencats": "Näytä piilotetut luokat",
        "listingcontinuesabbrev": "jatkuu",
        "index-category": "Indeksoidut sivut",
        "noindex-category": "Indeksointikiellolliset sivut",
-       "broken-file-category": "Sivut, joilla toimimattomia tiedostolinkkejä",
+       "broken-file-category": "Sivut, joissa on toimimattomia tiedostolinkkejä",
        "about": "Tietoja",
        "article": "Sivu",
        "newwindow": "(avautuu uuteen ikkunaan)",
        "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Miksi olet luomassa toista käyttäjätunnusta",
-       "createacct-captcha": "Turvatarkastus",
-       "createacct-imgcaptcha-ph": "Kirjoita teksti, jonka näet edellä",
        "createacct-submit": "Luo tunnus",
        "createacct-another-submit": "Luo käyttäjätunnus",
        "createacct-benefit-heading": "{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.",
        "permissionserrors": "Puutteelliset oikeudet",
        "permissionserrorstext": "Sinulla ei ole oikeutta suorittaa toimintoa {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
        "permissionserrorstext-withaction": "Sinulla ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
+       "contentmodelediterror": "Et voi muokata tätä versiota, koska sen sisältömalli on <code>$1</code>, ja sivun nykyinen sisältömalli on <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Varoitus: Olet luomassa sellaista sivua, joka on aikaisemmin poistettu.'''\n\nHarkitse, kannattaako tätä sivua luoda uudelleen. \nAlla on tämän sivun poisto- ja siirtohistoria:",
        "moveddeleted-notice": "Tämä sivu on poistettu. Alla on tämän sivun poisto- ja siirtohistoria.",
        "moveddeleted-notice-recent": "Valitettavasti tämä sivu on poistettu aivan äskettäin (viimeisen 24 tunnin aikana).\nAlla näkyy sivun poisto- ja siirtolokin tietoja.",
        "prefs-help-recentchangescount": "Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.",
        "prefs-help-watchlist-token2": "Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.\nKuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.\n[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].",
        "savedprefs": "Asetuksesi on tallennettu.",
+       "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttöoikeudet on tallennettu.",
        "timezonelegend": "Aikavyöhyke",
        "localtime": "Paikallinen aika",
        "timezoneuseserverdefault": "Käytä oletusta ($1)",
        "rcshowhidemine": "$1 omat muutokset",
        "rcshowhidemine-show": "Näytä",
        "rcshowhidemine-hide": "Piilota",
+       "rcshowhidecategorization": "$1 sivujen luokkien muutokset",
+       "rcshowhidecategorization-show": "Näytä",
+       "rcshowhidecategorization-hide": "Piilota",
        "rclinks": "Näytä $1 tuoretta muutosta viimeisten $2 päivän ajalta.<br />$3",
        "diff": "ero",
        "hist": "historia",
        "upload-dialog-button-done": "Valmis",
        "upload-dialog-button-save": "Tallenna",
        "upload-dialog-button-upload": "Tallenna",
-       "upload-process-error": "Tapahtui virhe",
-       "upload-process-warning": "Sisältää varoituksen",
        "upload-form-label-select-file": "Valitse tiedosto",
        "upload-form-label-infoform-title": "Yksityiskohdat",
        "upload-form-label-infoform-name": "Nimi",
        "pager-newer-n": "← {{PLURAL:$1|1 uudempi|$1 uudempaa}}",
        "pager-older-n": "{{PLURAL:$1|1 vanhempi|$1 vanhempaa}} →",
        "suppress": "Häivytys",
-       "querypage-disabled": "Tämä toimintosivu on poistettu käytöstä suorituskykysyistä.",
+       "querypage-disabled": "Tämä toimintosivu on poistettu käytöstä suorituskykyyn liittyvien syiden vuoksi.",
        "apihelp": "API-apu",
        "apihelp-no-such-module": "Moduulia ”$1” ei löydy.",
        "booksources": "Kirjalähteet",
        "post-expand-template-inclusion-category-desc": "Sivun koko on suurempi kuin <code>$wgMaxArticleSize</code>, kun kaikki mallineet on laajennettu. Tämän vuoksi joitakin mallineita ei laajennettu.",
        "post-expand-template-argument-category-desc": "Sivu on suurempi kuin <code>$wgMaxArticleSize</code>, kun mallineen argumentti on laajennettu (argumentti on merkkijono kolmen aaltosulun sisällä kuten <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "Tämä sivu käyttää liian monta resursseja vaativaa jäsenninfunktiota (kuten <code>#ifexist</code>). Katso [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Tämä sivu sisältää rikkinäisen tiedostolinkin. Tällä tarkoitetaan linkkiä sellaiseen tiedostoon, jota ei olemassa.",
+       "broken-file-category-desc": "Tämä sivu sisältää toimimattoman tiedostolinkin (eli linkin sellaiseen tiedoston upottamiseksi, jota ei olemassa).",
        "hidden-category-category-desc": "Tämä luokka sisältää koodin <code><nowiki>__HIDDENCAT__</nowiki></code> sen tekstisisällössä. Koodi estää luokan näkymisen sivujen alareunassa olevassa luokkien laatikossa kuten yleensä.",
        "trackingcategories-nodesc": "Ei kuvausta olemassa.",
        "trackingcategories-disabled": "Luokka on poistettu käytöstä",
        "email-legend": "Sähköpostin lähetys {{GRAMMAR:genitive|{{SITENAME}}}} käyttäjälle",
        "emailfrom": "Lähettäjä",
        "emailto": "Vastaanottaja",
-       "emailsubject": "Aihe",
+       "emailsubject": "Aihe:",
        "emailmessage": "Viesti",
        "emailsend": "Lähetä",
        "emailccme": "Lähetä kopio viestistä minulle.",
        "feedback-error3": "Virhe: Ohjelmointirajapinta ei vastaa",
        "feedback-error4": "Virhe: Annetun palautteen otsikkoa ei voida lähettää",
        "feedback-message": "Viesti",
-       "feedback-subject": "Otsikko",
+       "feedback-subject": "Aihe:",
        "feedback-submit": "Lähetä",
        "feedback-terms": "Ymmärrän, että minua koskeva \"user agent\" -tieto sisältää tiedon siitä, mitä yksittäistä selainta ja käyttöjärjestelmää minä käytän ja että nämä tiedot tulevat näkymään julkisesti kaikille palautteeni yhteydessä.",
        "feedback-termsofuse": "Sitoudun lähettämään palautteen käyttöehtojen määräysten mukaisesti.",
index d00a80b..3890845 100644 (file)
                        "Lucky",
                        "TomT0m",
                        "L",
-                       "SRXcraft"
+                       "SRXcraft",
+                       "StevenJ81"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "tog-hideminor": "Masquer les modifications mineures dans les changements récents",
        "tog-hidepatrolled": "Masquer les modifications surveillées dans les modifications récentes",
        "tog-newpageshidepatrolled": "Masquer les pages surveillées dans la liste des nouvelles pages",
+       "tog-hidecategorization": "Masquer la catégorisation des pages",
        "tog-extendwatchlist": "Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes",
        "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et la liste de suivi",
        "tog-numberheadings": "Numéroter automatiquement les titres de section",
        "tog-watchlisthideliu": "Masquer les modifications faites par des utilisateurs inscrits dans la liste de suivi",
        "tog-watchlisthideanons": "Masquer les modifications d'utilisateurs anonymes dans la liste de suivi",
        "tog-watchlisthidepatrolled": "Masquer les modifications surveillées dans la liste de suivi",
+       "tog-watchlisthidecategorization": "Masquer la catégorisation des pages",
        "tog-ccmeonemails": "M'envoyer une copie des courriels que j'envoie aux autres utilisateurs",
        "tog-diffonly": "Ne pas afficher le contenu des pages sous les diffs",
        "tog-showhiddencats": "Afficher les catégories cachées",
        "createaccountreason": "Motif :",
        "createacct-reason": "Motif",
        "createacct-reason-ph": "Pourquoi créez-vous un autre compte",
-       "createacct-captcha": "Contrôle de sécurité",
-       "createacct-imgcaptcha-ph": "Entrez le texte que vous voyez ci-dessus",
        "createacct-submit": "Créez votre compte",
        "createacct-another-submit": "Créer le compte",
        "createacct-benefit-heading": "{{SITENAME}} est écrit par des gens comme vous.",
        "prefs-help-recentchangescount": "Ceci inclut les modifications récentes, les pages d'historiques et les journaux.",
        "prefs-help-watchlist-token2": "Voici la clé secrète du flux Web de votre liste de suivi.\nToute personne la connaissant pourra lire votre liste de suivi, ne la communiquez donc pas.\n[[Special:ResetTokens|Cliquez ici si vous devez la réinitialiser]].",
        "savedprefs": "Les préférences ont été sauvegardées.",
+       "savedrights": "Les droits utilisateur de {{GENDER:$1|$1}} ont été enregistrés.",
        "timezonelegend": "Fuseau horaire :",
        "localtime": "Heure locale :",
        "timezoneuseserverdefault": "Utiliser la valeur par défaut du wiki ($1)",
        "rcshowhidemine": "$1 mes modifications",
        "rcshowhidemine-show": "Afficher",
        "rcshowhidemine-hide": "Masquer",
+       "rcshowhidecategorization": "$1 la catégorisation des pages",
+       "rcshowhidecategorization-show": "Afficher",
+       "rcshowhidecategorization-hide": "Cacher",
        "rclinks": "Afficher les $1 dernières modifications effectuées au cours des $2 derniers jours<br />$3.",
        "diff": "diff",
        "hist": "hist",
        "upload-dialog-button-done": "Fait",
        "upload-dialog-button-save": "Enregistrer",
        "upload-dialog-button-upload": "Téléverser",
-       "upload-process-error": "Une erreur est survenue",
-       "upload-process-warning": "Un avertissement s’est produit",
        "upload-form-label-select-file": "Sélectionner un fichier",
        "upload-form-label-infoform-title": "Détails",
        "upload-form-label-infoform-name": "Nom",
        "hijri-calendar-m10": "Chawwal",
        "hijri-calendar-m11": "Dhou al qi’da",
        "hijri-calendar-m12": "Dhou al-hijja",
-       "hebrew-calendar-m1": "Tichri",
-       "hebrew-calendar-m2": "Hèchvane",
-       "hebrew-calendar-m3": "Kislev",
-       "hebrew-calendar-m4": "Téveth",
-       "hebrew-calendar-m5": "Schébat",
-       "hebrew-calendar-m6": "Adar",
-       "hebrew-calendar-m7": "Nissane",
-       "hebrew-calendar-m8": "Iyar",
-       "hebrew-calendar-m9": "Sivane",
-       "hebrew-calendar-m10": "Tamouz",
-       "hebrew-calendar-m11": "Av",
-       "hebrew-calendar-m12": "Éloul",
-       "hebrew-calendar-m1-gen": "Tichri",
-       "hebrew-calendar-m2-gen": "Hèchvane",
-       "hebrew-calendar-m3-gen": "Kislev",
-       "hebrew-calendar-m4-gen": "Téveth",
-       "hebrew-calendar-m5-gen": "Schébat",
-       "hebrew-calendar-m6-gen": "Adar",
-       "hebrew-calendar-m7-gen": "Nissane",
-       "hebrew-calendar-m8-gen": "Iyar",
-       "hebrew-calendar-m9-gen": "Sivane",
-       "hebrew-calendar-m10-gen": "Tamouz",
-       "hebrew-calendar-m11-gen": "Av",
-       "hebrew-calendar-m12-gen": "Éloul",
+       "hebrew-calendar-m1": "tichri",
+       "hebrew-calendar-m2": "hechvan",
+       "hebrew-calendar-m3": "kislev",
+       "hebrew-calendar-m4": "tévet",
+       "hebrew-calendar-m5": "chevat",
+       "hebrew-calendar-m6": "adar",
+       "hebrew-calendar-m6a": "adar I",
+       "hebrew-calendar-m6b": "adar II",
+       "hebrew-calendar-m7": "nissan",
+       "hebrew-calendar-m8": "iyar",
+       "hebrew-calendar-m9": "sivan",
+       "hebrew-calendar-m10": "tamouz",
+       "hebrew-calendar-m11": "av",
+       "hebrew-calendar-m12": "eloul",
+       "hebrew-calendar-m1-gen": "tichri",
+       "hebrew-calendar-m2-gen": "hechvan",
+       "hebrew-calendar-m3-gen": "kislev",
+       "hebrew-calendar-m4-gen": "tévet",
+       "hebrew-calendar-m5-gen": "chevat",
+       "hebrew-calendar-m6-gen": "adar",
+       "hebrew-calendar-m6a-gen": "adar I",
+       "hebrew-calendar-m6b-gen": "adar II",
+       "hebrew-calendar-m7-gen": "nissan",
+       "hebrew-calendar-m8-gen": "iyar",
+       "hebrew-calendar-m9-gen": "sivan",
+       "hebrew-calendar-m10-gen": "tamouz",
+       "hebrew-calendar-m11-gen": "av",
+       "hebrew-calendar-m12-gen": "eloul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
        "duplicate-defaultsort": "Attention : la clé de tri par défaut « $2 » écrase la précédente clé « $1 ».",
        "duplicate-displaytitle": "<strong>Attention :</strong> Le titre d'affichage «$2» remplace l'ancien titre d'affichage «$1».",
index ae63bc4..26d1d26 100644 (file)
@@ -28,6 +28,7 @@
        "tog-hideminor": "Agochar as edicións pequenas nos cambios recentes",
        "tog-hidepatrolled": "Agochar as edicións patrulladas nos cambios recentes",
        "tog-newpageshidepatrolled": "Agochar as páxinas revisadas da lista de páxinas novas",
+       "tog-hidecategorization": "Agochar a categorización das páxinas",
        "tog-extendwatchlist": "Expandir a lista de vixilancia para mostrar todos os cambios e non só os máis recentes",
        "tog-usenewrc": "Agrupar as modificacións por páxina nos cambios recentes e na lista de vixilancia",
        "tog-numberheadings": "Numerar automaticamente as cabeceiras",
@@ -57,6 +58,7 @@
        "tog-watchlisthideliu": "Agochar as edicións dos usuarios rexistrados na lista de vixilancia",
        "tog-watchlisthideanons": "Agochar as edicións dos usuarios anónimos na lista de vixilancia",
        "tog-watchlisthidepatrolled": "Agochar as edicións patrulladas na lista de vixilancia",
+       "tog-watchlisthidecategorization": "Agochar a categorización das páxinas",
        "tog-ccmeonemails": "Enviádeme ao meu enderezo unha copia das mensaxes de correo electrónico que envíe a outros usuarios",
        "tog-diffonly": "Non mostrar o contido da páxina debaixo das diferenzas entre edicións",
        "tog-showhiddencats": "Mostrar as categorías ocultas",
        "prefs-help-recentchangescount": "Isto inclúe os cambios recentes, os historiais e mais os rexistros.",
        "prefs-help-watchlist-token2": "Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.\nCalquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.\n[[Special:ResetTokens|Prema aquí se necesita restablecela]].",
        "savedprefs": "Gardáronse as súas preferencias.",
+       "savedrights": "Gardáronse os permisos de {{GENDER:$1|$1}}.",
        "timezonelegend": "Fuso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar a hora do servidor por defecto ($1)",
        "rcshowhidemine": "$1 as edicións propias",
        "rcshowhidemine-show": "Mostrar",
        "rcshowhidemine-hide": "Agochar",
+       "rcshowhidecategorization": "$1 a categorización de páxinas",
+       "rcshowhidecategorization-show": "Mostrar",
+       "rcshowhidecategorization-hide": "Agochar",
        "rclinks": "Mostrar os últimos $1 cambios nos últimos $2 días.<br />$3",
        "diff": "dif",
        "hist": "hist",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Gardar",
        "upload-dialog-button-upload": "Subir",
-       "upload-process-error": "Houbo un erro",
-       "upload-process-warning": "Produciuse unha advertencia",
        "upload-form-label-select-file": "Seleccionar un ficheiro",
        "upload-form-label-infoform-title": "Detalles",
        "upload-form-label-infoform-name": "Nome",
        "svg-long-error": "Ficheiro SVG non válido: $1",
        "show-big-image": "Ficheiro orixinal",
        "show-big-image-preview": "Tamaño desta vista previa: $1.",
+       "show-big-image-preview-differ": "Tamaño desta revisión $3 do ficheiro $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Outra resolución|Outras resolucións}}: $1.",
        "show-big-image-size": "$1 × $2 píxeles",
        "file-info-gif-looped": "en bucle",
index b38176e..b30c69e 100644 (file)
        "statistics-files": "Upload kel'le faili",
        "brokenredirects-edit": "bodol",
        "brokenredirects-delete": "Kadun udoi",
-       "nbytes": "$1 {{PLURAL:$1|byte|bytesi}}",
+       "nbytes": "$1 {{PLURAL:$1|byte|byti}}",
        "nmembers": "$1 {{PLURAL:$1|vangddi}}",
        "prefixindex": "Panam jenche nanvache survatek asa...",
        "shortpages": "Dhaktim panam",
index a019dba..1e6f40f 100644 (file)
@@ -27,6 +27,7 @@
        "tog-hideminor": "Keini «chlyni Änderige» aazeige",
        "tog-hidepatrolled": "Vu Fäldhieter/inne aagluegti Änderige in dr „Letschte Änderige“ usblände",
        "tog-newpageshidepatrolled": "Vu Fäldhieter/inne aagluegti Änderige in dr Lischt „Neiji Syte“ usblände",
+       "tog-hidecategorization": "Kategorisierige vo de Syte nid zeige",
        "tog-extendwatchlist": "Beobachtungslischte erwytere go alli Änderige aazeige, nit numme di letschte",
        "tog-usenewrc": "Änderigen uf „Letschte Änderige“ un dr Beobachtigslischt no Syte gruppiere",
        "tog-numberheadings": "Überschrifte outomatisch numeriere",
@@ -56,6 +57,7 @@
        "tog-watchlisthideliu": "Bearbeitige vu aagmäldete Benutzer usblände",
        "tog-watchlisthideanons": "Bearbeitige vu anonyme Benutzer (IP-Adresse) usblände",
        "tog-watchlisthidepatrolled": "vum Fäldhieter aagluegti Änderige in dr Beobachtigslischt usblände",
+       "tog-watchlisthidecategorization": "Kategorisierig vo de Syte nid zeige",
        "tog-ccmeonemails": "Schick mr Kopie vo de E-Mails, won i andere schick.",
        "tog-diffonly": "Numme Versionsunterschiid aazeige, ohni d Syte",
        "tog-showhiddencats": "Zeig di versteckte Kategorie",
        "viewsource": "Quelltext aaluege",
        "viewsource-title": "Quälltext vu $1 aaluege",
        "actionthrottled": "Aktionsaazahl limitiert",
-       "actionthrottledtext": "As Schutz vor Spam cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.",
+       "actionthrottledtext": "As Schutz vor Missbruch cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.",
        "protectedpagetext": "Die Syte isch fir s Bearbeite gsperrt.",
        "viewsourcetext": "Du chasch der Quelltext vo dere Syten aluegen u kopiere.",
        "viewyourtext": "Du chasch dr Quälltext vu '''Dyne Bearbeitige''' vu däre Syte aaluege un kopiere.",
        "createaccountreason": "Grund:",
        "createacct-reason": "Grund",
        "createacct-reason-ph": "Wurum Du ne ander Benutzerkonto aaleisch",
-       "createacct-captcha": "Sicherheitspriefig",
-       "createacct-imgcaptcha-ph": "Gib dr Tekscht yy, wu Du obe siisch",
        "createacct-submit": "Dyy Benutzerkonto aalege",
        "createacct-another-submit": "Benutzerkonto aalege",
        "createacct-benefit-heading": "{{SITENAME}} wird vu Mänsche wie Dir gschaffe.",
        "passwordreset-emailtext-ip": "Eber mit dr IP-Adresse $1, wahrschyns Du sälber, het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
        "passwordreset-emailtext-user": "Dr Benutzer $1 bi {{SITENAME}} het e Zrucksetzig vu Dym Passwort bi {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
        "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporär Passwort: \n$2",
-       "passwordreset-emailsent": "E Passwort-Zrucksetzig isch per E-Mail verschickt wore.",
+       "passwordreset-emailsent": "We das di bestätigti E-Mail-Adrässen vo dym Wiki-Konto isch, de wird es E-Mail verschickt, für ds Passwort zrüggzsetze.",
        "passwordreset-emailsent-capture": "E Passwort-Zrucksetzigs-Mail isch vergschickt worde, un isch unte aazeigt.",
        "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzrucksetzigsmail, wu unten aazeigt wird, isch generiert wore, aber dr Versand an {{GENDER:$2|dr Benutzer|d Benutzeri}} het nit funktioniert: $1",
        "changeemail": "E-Mail-Adrässen änderen oder lösche",
-       "changeemail-header": "D E-Mail-Adräss vo däm Chonto ändre",
+       "changeemail-header": "Füll das Formular uus, für dyni E-Mail-Adrässe z ändere. We du möchtisch, das dys Wiki-Konto nümm mit eren E-Mail-Adrässe verbunden isch, de chasch ds Fäld für’ne nöüi E-Mail-Adrässe läär la und ds Formular abschicke.",
+       "changeemail-passwordrequired": "Du muesch dys Passwort agä, für d Änderig z bestätige.",
        "changeemail-no-info": "Du muesch aagmolde sy zum uff die Syte diräkt zuegryfe z chönne.",
        "changeemail-oldemail": "Aktuelli E-Mail-Adräss",
        "changeemail-newemail": "Nöii E-Mail-Adräss:",
        "missingsummary": "'''Obacht:''' Du hesch kei Zämefassig aagee. Wenn du nomol uf Spychere drucksch, wird d Änderung ohni gspychert.",
        "selfredirect": "<strong>Obacht:</strong> Du bisch die Syten uf sech sälber am Wyterleite.\nVilech hesch für d Wyterleitig ds falsche Zil y’gä, oder vilech bisch di falschi Syten am bearbeite.\nWe d’ nomal «{{int:savearticle}}» kliksch, de wird d Wyterleitig einewäg agleit.",
        "missingcommenttext": "Bitte gib Dyy Kommentar unte yy.",
-       "missingcommentheader": "'''ACHTIG:''' Du hesch kei Iberschrift im Fäld „Betreff:“ yygee. Wänn nomol uf „{{int:savearticle}}“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
+       "missingcommentheader": "<strong>Obacht:</strong> Du hesch kei Iberschrift für dä Kommentar yygee.\nWänn nomol uf „{{int:savearticle}}“ drucksch, wird Dyyni Bearbeitig ohni Iberschrift gspicheret.",
        "summary-preview": "Vorschou vor Zämefassig:",
        "subject-preview": "Vorschau vum Betreff:",
        "previewerrortext": "Es het e Fähler ’gä bim Versuech, e Vorschou vo dynen Änderige z zeige.",
        "permissionserrors": "Berächtigungsfähler",
        "permissionserrorstext": "Du bisch nid berächtigt, die Aktion uszfiere. {{PLURAL:$1|Grund|Grind}}:",
        "permissionserrorstext-withaction": "Du bisch nit berächtigt, $2.\n{{PLURAL:$1|Grund|Grind}}:",
+       "contentmodelediterror": "Du chasch die Version nid bearbeite. Si het ds Inhaltsmodäll <code>$1</code>, aber ds aktuellen Inhaltsmodäll vo der Syten isch <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Obacht: Du bisch e Syten am aalege, wo scho emol glescht woren isch.'''\n\nBitte iberprief, eb s sinnvoll isch, mit em Bearbeite wyter z mache.\nZue Dyyre Information sihsch do s Lesch-Logbuech vo däre Syte:",
        "moveddeleted-notice": "Die Syte isch glescht wore. Do chunnt e Uuszuug us em Lesch-Logbuech fir die Syte.",
        "moveddeleted-notice-recent": "Die Syten isch leider ersch grad glöscht worde (i de letste 24 Stund). Zur Information stöh unde ds Lösch- und ds Verschiebigs-Logbuech.",
        "prefs-help-recentchangescount": "Des umfasst d Lischt vu dr letschte Änderige, d Versionsgschicht un d Logbiecher.",
        "prefs-help-watchlist-token2": "Des isch dr gheim Schlissel zum Webfeed vu Dyre Beobachtigslischt.\nE jede, wu ne chännt, cha Dyni Beobachtigslischt läse. tue ne wäge däm nit mit andere teile.\n[[Special:ResetTokens|Druck do, wän Du ne muesch zrucksetze]].",
        "savedprefs": "Dyni Ystellige sy gspycheret worde.",
+       "savedrights": "{{GENDER:$1|Em $1 syni Benutzerrächt|Der $1 iri Benutzerrächt|D Benutzerrächt vo $1}} sy gspycheret.",
        "timezonelegend": "Zytzone:",
        "localtime": "Ortszyt:",
        "timezoneuseserverdefault": "Standardzyt vum Server bruche ($1)",
        "rcshowhidemine": "Eigeni Änderige $1",
        "rcshowhidemine-show": "aazeige",
        "rcshowhidemine-hide": "usblände",
+       "rcshowhidecategorization": "Sytekategorisierige $1",
+       "rcshowhidecategorization-show": "zeige",
+       "rcshowhidecategorization-hide": "nid zeige",
        "rclinks": "Zeig di letschte $1 Änderige vo de vergangene $2 Täg.<br />$3",
        "diff": "Unterschid",
        "hist": "Versione",
        "upload-options": "Optione fir s Uffelade",
        "watchthisupload": "Die Syte beobachte",
        "filewasdeleted": "E Datei mit däm Name isch scho mol uffeglade wore un isch in dr Zwischezyt wider glescht wore. Bitte prief zerscht dr Yytrag im $1, voreb Du die Datei wirkli spycheresch.",
+       "filename-thumb-name": "Das gseht uus wi’ne Titel für’nes Vorschoubildli. Bitte lad kener Vorschoubildli zrügg ufen uf ds glyche Wiki. We’s nid eso isch, de tue bitte der Dateinamen eso ändere, das er ussagchräftiger isch u nid ds Präfix vomene Vorschoubildli het.",
        "filename-bad-prefix": "Dr Dateiname fangt mit '''„$1“''' aa. Des isch isch normalerwyys dr Dateiname, wu vun ere Digitalkamera vorgee wird un d Datei nit bschryybt.\nBitte gib dr Datei e Name, wu dr Inhalt besser bschryybt.",
        "upload-success-subj": "Erfolgryych uffegelade",
        "upload-success-msg": "Dyyni vu [$2] uffeglade Datei isch jetz do verfiegbar: [[:{{ns:file}}:$1]]",
        "upload-dialog-button-done": "Fertig",
        "upload-dialog-button-save": "Spychere",
        "upload-dialog-button-upload": "Ufelade",
-       "upload-process-error": "Es het e Fähler ’gä",
-       "upload-process-warning": "Es het e Warnig ’gä",
        "upload-form-label-select-file": "Datei ussueche",
        "upload-form-label-infoform-title": "Details",
        "upload-form-label-infoform-name": "Name",
        "foreign-structured-upload-form-label-own-work": "Das han i sälber gmacht.",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorië",
        "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "I bestätige, das i die Datei under de Nutzigsbedingigen und Lizänzrichtlinje vo {{SITENAME}} ufelade.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "We du die Datei nid under de Nutzigsbedingigen und Lizänzrichtlinje vo {{SITENAME}} chasch ufelade, de schliess bitte dä Dialog u probier’s uf’nen anderi Art.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Du chasch es ou mit der [[Special:Upload|Standardsyte zum Ufelade]] probiere.",
        "foreign-structured-upload-form-label-own-work-message-default": "I bi mer bewusst, das i die Datei in es gmeinsams Repository ufelade. I bestätige, das mi derby a d Nutzigs- und Lizänzbedingige dört halte.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Bitte schliess dä Dialog und versuech’s mit eren andere Methode, falls du die Datei nid under de Bedingige vom gmeinsame Repository chasch ufelade.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls du die Datei dört under denen irne Bedingige chasch ufelade.",
        "svg-long-error": "Ungültigi SVG-Datei: $1",
        "show-big-image": "Originaldatei",
        "show-big-image-preview": "Greßi vu däre Vorschau: $1.",
+       "show-big-image-preview-differ": "Gröössi vor $3-Vorschou vor $2-Datei: $1.",
        "show-big-image-other": "Wyteri {{PLURAL:$2|Ufflösig|Ufflösige}}: $1.",
        "show-big-image-size": "$1 × $2 Pixel",
        "file-info-gif-looped": "Ändlosschlupf",
index 366e73c..c6aa30b 100644 (file)
@@ -37,6 +37,7 @@
        "tog-hideminor": "הסתרת שינויים משניים ברשימת השינויים האחרונים",
        "tog-hidepatrolled": "הסתרת שינויים בדוקים ברשימת השינויים האחרונים",
        "tog-newpageshidepatrolled": "הסתרת דפים בדוקים ברשימת הדפים החדשים",
+       "tog-hidecategorization": "הסתרת הוספות והסרות של דפים מקטגוריות",
        "tog-extendwatchlist": "הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף",
        "tog-usenewrc": "קיבוץ השינויים לפי דף בשינויים האחרונים וברשימת המעקב",
        "tog-numberheadings": "מספור כותרות אוטומטי",
@@ -66,6 +67,7 @@
        "tog-watchlisthideliu": "הסתרת עריכות של משתמשים רשומים ברשימת המעקב",
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
+       "tog-watchlisthidecategorization": "הסתרת הוספות והסרות של דפים מקטגוריות",
        "tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דואר אלקטרוני ששלחתי למשתמשים אחרים",
        "tog-diffonly": "ביטול הצגת תוכן הדף מתחת להשוואות הגרסאות",
        "tog-showhiddencats": "הצגת קטגוריות מוסתרות",
        "createaccountreason": "סיבה:",
        "createacct-reason": "סיבה",
        "createacct-reason-ph": "סיבה ליצירת חשבון נוסף",
-       "createacct-captcha": "בדיקת אבטחה",
-       "createacct-imgcaptcha-ph": "יש להקליד את הטקסט המופיע למעלה",
        "createacct-submit": "יצירת החשבון שלך",
        "createacct-another-submit": "יצירת חשבון",
        "createacct-benefit-heading": "אנשים כמוך יוצרים את {{SITENAME}}.",
        "permissionserrors": "שגיאת הרשאה",
        "permissionserrorstext": "אינך מורשה לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
        "permissionserrorstext-withaction": "אינך מורשה $2, מה{{PLURAL:$1|סיבה הבאה|סיבות הבאות}}:",
+       "contentmodelediterror": "לא ניתן לערוך את הגרסה הזאת כי מודל התוכן שלה הוא <code>$1</code>, ואילו מודל התוכן הנוכחי של הדף הוא <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''אזהרה: הנכם יוצרים דף חדש שנמחק בעבר.'''\n\nכדאי לשקול אם יהיה זה נכון להמשיך לערוך את הדף.\nיומני המחיקות וההעברות של הדף מוצגים להלן:",
        "moveddeleted-notice": "דף זה נמחק.\nיומני המחיקות וההעברות של הדף מוצגים להלן.",
        "moveddeleted-notice-recent": "מצטערים, הדף הזה נמחק לאחרונה (ב־24 השעות האחרונות).\nיומני המחיקה וההעברה של הדף מוצגים להלן לעיון.",
        "showingresultsinrange": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} בין המספרים <strong>$2</strong> ו‏‏־<strong>$3</strong>:",
        "search-showingresults": "{{PLURAL:$4|תוצאה <strong>$1</strong> מתוך <strong>$3</strong>|תוצאות <strong>$1 - $2</strong> מתוך <strong>$3</strong>}}",
        "search-nonefound": "לא נמצאו תוצאות המתאימות לחיפוש.",
+       "search-nonefound-thiswiki": "לא נמצאו תוצאות המתאימות לחיפוש באתר זה.",
        "powersearch-legend": "חיפוש מתקדם",
        "powersearch-ns": "חיפוש על־פי מרחבי שם:",
        "powersearch-togglelabel": "בחירה:",
        "prefs-help-recentchangescount": "כולל דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
        "prefs-help-watchlist-token2": "זהו המפתח הסודי של ההזנה של רשימת המעקב שלך.\nכל מי שיודע אותו יוכל לקרוא את רשימת המעקב שלך, לכן אין לשתף אותו.\n[[Special:ResetTokens|אם יש בכך צורך, אפשר לאפס אותו כאן]].",
        "savedprefs": "ההעדפות שלך נשמרו.",
+       "savedrights": "הרשאות {{GENDER:$1|המשתמש|המשתמשת}} של $1 נשמרו.",
        "timezonelegend": "אזור זמן:",
        "localtime": "זמן מקומי:",
        "timezoneuseserverdefault": "ברירת המחדל של האתר ($1)",
        "rcshowhidemine": "$1 עריכות שלי",
        "rcshowhidemine-show": "הצגת",
        "rcshowhidemine-hide": "הסתרת",
+       "rcshowhidecategorization": "$1 הוספות והסרות של דפים מקטגוריות",
+       "rcshowhidecategorization-show": "הצגת",
+       "rcshowhidecategorization-hide": "הסתרת",
        "rclinks": "הצגת $1 שינויים אחרונים ב־$2 הימים האחרונים.<br /> $3",
        "diff": "הבדל",
        "hist": "היסטוריה",
        "upload-dialog-button-done": "בוצע",
        "upload-dialog-button-save": "שמירה",
        "upload-dialog-button-upload": "העלאה",
-       "upload-process-error": "אירעה שגיאה",
-       "upload-process-warning": "אירעה אזהרה",
        "upload-form-label-select-file": "בחירת קובץ",
        "upload-form-label-infoform-title": "פרטים",
        "upload-form-label-infoform-name": "שם",
        "mw-widgets-dateinput-no-date": "לא נבחר תאריך",
        "mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
        "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
-       "api-error-blacklisted": "× ×\90 ×\9c×\91×\97×\95ר ×\9b×\95תרת ×©×\95× ×\94, ×\9eת×\90רת ×\99×\95תר."
+       "api-error-blacklisted": "× ×\90 ×\9c×\91×\97×\95ר ×\9b×\95תרת ×\90×\97רת, ×\94×\9eת×\90רת ×\98×\95×\91 ×\99×\95תר ×\90ת ×\94ת×\95×\9b×\9f."
 }
index 2f376de..e4f567f 100644 (file)
@@ -66,7 +66,8 @@
                        "राम प्रसाद जोशी",
                        "ShrUtiable",
                        "Matma Rex",
-                       "Angpradesh"
+                       "Angpradesh",
+                       "Sfic"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "edit": "सम्पादन",
        "edit-local": "स्थानीय विवरण सम्पादन करें",
        "create": "बनाएँ",
-       "create-local": "स्थानीय विवरण जोडें",
+       "create-local": "सà¥\8dथानà¥\80य à¤µà¤¿à¤µà¤°à¤£ à¤\9cà¥\8bड़à¥\87à¤\82",
        "editthispage": "यह पृष्ठ संपादन करें",
        "create-this-page": "यह पृष्ठ बनाएँ",
        "delete": "हटाएँ",
        "databaseerror-error": "त्रुटि: $1",
        "laggedslavemode": "'''चेतावनी:''' यह पृष्ठ अद्यतनीत जानकारी-युक्त ना होने की आशंका है।",
        "readonly": "डाटाबेस लॉक किया हुआ है",
-       "enterlockreason": "लà¥\89à¤\95 à¤\95रनà¥\87 à¤\95ा à¤\95ारण à¤¦à¥\80à¤\9cिà¤\8f, à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤²à¥\89à¤\95 à¤\96à¥\81लनà¥\87 à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95ा à¤²à¤\97भà¤\97 à¤\86à¤\95लन à¤¦à¤¿à¤\9cà¥\80ये।",
+       "enterlockreason": "लà¥\89à¤\95 à¤\95रनà¥\87 à¤\95ा à¤\95ारण à¤¦à¥\80à¤\9cिà¤\8f, à¤¸à¤¾à¤¥ à¤¹à¥\80 à¤²à¥\89à¤\95 à¤\96à¥\81लनà¥\87 à¤\95à¥\87 à¤¸à¤®à¤¯ à¤\95ा à¤²à¤\97भà¤\97 à¤\86à¤\95लन à¤¦à¥\80à¤\9cिये।",
        "readonlytext": "शायद मेंटेनन्स के चलते डाटाबेस नये संपादन और अन्य बदलावों से लॉक किया गया है, जिसके बाद यह सामान्य स्थिति में आ जाना चाहिये।\n\nजिस प्रबंधक ने यह लॉक किया था उसने यह कारण दिया है: $1",
        "missing-article": "डाटाबेस में $2 के अंदर कहीं भी \"$1\" नहीं मिला।\n\nआम तौर पर हटाए जा चुके पृष्ठ की इतिहास कड़ी का प्रयोग करने पर ऐसा होता है।\n\nअगर ऐसा नहीं है, तो शायद आपने सॉफ़्टवेयर में त्रुटि खोज ली है।\nकृपया यू॰आर॰एल पते समेत किसी [[Special:ListUsers/sysop|प्रबंधक]] को इसका ब्यौरा दें।",
        "missingarticle-rev": "(अवतरण#: $1)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आप एक अन्य खाता क्यों बना रहे हैं",
-       "createacct-captcha": "सुरक्षा जाँच",
-       "createacct-imgcaptcha-ph": "उपरोक्त पाठ लिखें",
        "createacct-submit": "अपना खाता बनाएँ",
-       "createacct-another-submit": "à¤\8fà¤\95 à¤\85नà¥\8dय à¤\96ाता à¤\96à¥\8bलà¥\87à¤\82",
+       "createacct-another-submit": "à¤\96ाता à¤¬à¤¨à¤¾à¤\8fà¤\81",
        "createacct-benefit-heading": "{{SITENAME}} आपके जैसे लोगों द्वारा बनायी गई है।",
        "createacct-benefit-body1": "{{PLURAL:$1|सम्पादन}}",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ}}",
index 8630a02..94c6460 100644 (file)
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate drugi račun",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Stvorite svoj suradnički račun",
        "createacct-another-submit": "Stvori još jedan račun",
        "createacct-benefit-heading": "{{SITENAME}} su stvorili ljudi poput Vas.",
        "permissionserrorstext-withaction": "Nemate dopuštenje za $2, iz {{PLURAL:$1|razloga|razloga}}:",
        "recreate-moveddeleted-warn": "'''Upozorenje: Ponovno stvarate stranicu koja je prethodno bila izbrisana.'''\n\nRazmotrite je li prikladno nastaviti s uređivanje ove stranice.\nZa Vašu informaciju slijedi evidencija brisanja i premještanja ove stranice:",
        "moveddeleted-notice": "Ova stranica je bila izbrisana.\nEvidencija brisanja i evidencija premještanja za ovu stranicu je prikazana niže.",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je izbrisana u prošla 24 sata. \nNiže je navedena evidencija brisanja i premještanja.",
        "log-fulllog": "Prikaži cijelu evidenciju",
        "edit-hook-aborted": "Uređivanje prekinuto kukom.\nRazlog nije ponuđen.",
        "edit-gone-missing": "Stranica nije spremljena.\nČini se kako je obrisana.",
        "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene}} stranice [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice}} datoteke [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:",
-       "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti vidljivi javno.",
+       "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti javno vidljivi.",
+       "revdelete-text-file": "Izbrisane inačice datoteke će i dalje biti vidljive u povijesti datoteke, ali neki dijelovi sadržaja neće biti javno vidljivi.",
        "logdelete-text": "Izbrisane izmjene i dalje će biti vidljive u evidencijama, ali dijelovi njihova sadržaja biti će nedostupni za javnost.",
        "revdelete-text-others": "Ostali administratori na projektu moći će pristupiti izbrisanom sadržaju i vratiti ga, osim ako nisu postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "search-section": "(odlomak $1)",
        "search-category": "(kategorija $1)",
        "search-suggest": "Mislili ste: $1",
+       "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
        "search-interwiki-caption": "Sestrinski projekti",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|otvorio|otvorila}} suradnički račun $3",
        "logentry-newusers-byemail": "$1 je {{GENDER:$2|otvorio|otvorila}} suradnički račun $3 i zaporka je poslana e-porukom.",
        "logentry-newusers-autocreate": "Suradnički je račun $1 automatski {{GENDER:$2|stvoren|stvorila}}.",
+       "logentry-protect-move_prot": "$1 je {{GENDER:$2|premjestio|premjestila}} postavke zaštićivanja s $4 na $3",
+       "logentry-protect-unprotect": "$1 je {{GENDER:$2|uklonio|uklonila}} zaštitu stranice $3",
+       "logentry-protect-protect": "$1 je {{GENDER:$2|zaštitio|zaštitila}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 je {{GENDER:$2|zaštitio|zaštitila}} $3 $4 [prenosiva zaštita]",
+       "logentry-protect-modify": "$1 je {{GENDER:$2|promijenio|promijenila}} stupanj zaštićivanja za $3 $4",
+       "logentry-protect-modify-cascade": "$1 je {{GENDER:$2|promijenio|promijenila}} stupanj zaštite za $3 $4 [prenosiva zaštita]",
        "logentry-rights-rights": "$1 {{GENDER:$2|je promijenio|je promijenila}} suradnička prava računa $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|je promijenio|je promijenila}} članstvo skupine suradničkog računa $3",
        "logentry-rights-autopromote": "Suradničkom računu $1 {{GENDER:$1| automatski je promijenjeno članstvo|automatski su promijenjena članstva}} iz $4 u $5",
index 0c8cc3a..d0ff39a 100644 (file)
        "nstab-template": "Předłoha",
        "nstab-help": "Pomoc",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Hłowna strona",
        "nosuchaction": "Žana tajka akcija",
        "nosuchactiontext": "Akcija, kotruž URL podawa, je njepłaćiwa.\nSy so snano při zapodaću URL zapisał abo sy wopačnemu wotkazej slědował.\nTo móhło tež programowanski zmylk w {{GRAMMAR:lokatiw|{{SITENAME}}}} być.",
        "nosuchspecialpage": "Tuta specialna strona njeeksistuje.",
        "createaccountreason": "Přičina:",
        "createacct-reason": "Přičina",
        "createacct-reason-ph": "Čehodla załožuješ druhe konto?",
-       "createacct-captcha": "Wěstotna kontrola",
-       "createacct-imgcaptcha-ph": "Zapodaj tekst, kotryž deleka widźiš",
        "createacct-submit": "Twoje konto załožić",
        "createacct-another-submit": "Dalše konto załožić",
        "createacct-benefit-heading": "{{SITENAME}} je so wot ludźi kaž ty wutworił.",
        "protect-locked-dblock": "Datowa banka je zawrjena, tohodla njemóžeš škit strony změnić. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-locked-access": "Nimaš trěbne prawa, zo by škit strony změnił. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-cascadeon": "Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitane}}. Změny na škitnym schodźenku tuteje strony njebudu kaskadowy škit wobwliwować.",
-       "protect-default": "Wšěch wužiwarjow dowolić",
+       "protect-default": "Wšěm wužiwarjam dowolić",
        "protect-fallback": "Jenož wužiwarjow z prawom \"$1\" dowolić",
-       "protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenych wužiwarjow dowolić",
-       "protect-level-sysop": "Jenož administratorow dowolić",
+       "protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenym wužiwarjam dowolić",
+       "protect-level-sysop": "Jenož administratoram dowolić",
        "protect-summary-cascade": "kaskadowacy",
        "protect-expiring": "spadnje $1 (UTC)",
        "protect-expiring-local": "płaćiwy hač do $1",
        "tooltip-ca-nstab-main": "stronu wobhladać",
        "tooltip-ca-nstab-user": "wužiwarsku stronu wobhladać",
        "tooltip-ca-nstab-media": "datajowu stronu wobhladać",
-       "tooltip-ca-nstab-special": "To je specialna strona. Njemóžeš ju wobdźěłać.",
+       "tooltip-ca-nstab-special": "To je specialna strona, kotruž wobdźěłać njemóžeš.",
        "tooltip-ca-nstab-project": "projektowu stronu wobhladać",
        "tooltip-ca-nstab-image": "Datajowu stronu pokazać",
        "tooltip-ca-nstab-mediawiki": "systemowu zdźělenku wobhladać",
index 082562c..2b42a24 100644 (file)
        "nstab-template": "Sablon",
        "nstab-help": "Segítség",
        "nstab-category": "Kategória",
+       "mainpage-nstab": "Kezdőlap",
        "nosuchaction": "Nincs ilyen művelet",
        "nosuchactiontext": "Az URL-ben megadott művelet érvénytelen.\nValószínűleg elgépelted vagy hibás hivatkozásra kattintottál.\nAz is előfordulhat, hogy a(z) {{SITENAME}} wiki szoftverében hiba található.",
        "nosuchspecialpage": "Nem létezik ilyen speciális lap",
        "createaccountreason": "Indoklás:",
        "createacct-reason": "Indoklás",
        "createacct-reason-ph": "Miért hozol létre egy másik fiókot",
-       "createacct-captcha": "Biztonsági ellenőrzés",
-       "createacct-imgcaptcha-ph": "Írd be a szöveget, amit fent látsz",
        "createacct-submit": "Felhasználói fiók létrehozása",
        "createacct-another-submit": "Újabb felhasználói fiók létrehozása",
        "createacct-benefit-heading": "A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.",
        "patrol-log-page": "Ellenőrzési napló (patrol)",
        "patrol-log-header": "Ez az ellenőrzött változatok naplója.",
        "log-show-hide-patrol": "járőrnapló $1",
-       "log-show-hide-tag": "$1 címke napló",
+       "log-show-hide-tag": "címkenapló $1",
        "deletedrevision": "Régebbi változat törölve: $1",
        "filedeleteerror-short": "Hiba a fájl törlésekor: $1",
        "filedeleteerror-long": "Hibák merültek föl a következő fájl törlésekor:\n\n$1",
        "logentry-managetags-delete": "$1 {{GENDER:$2|törölte}} a „$4” címkét (eltávolított $5 változatról és/vagy napló bejegyzésről)",
        "logentry-managetags-activate": "$1 {{GENDER:$2|aktiválta}} a „$4” címkét a szerkesztők és botok számára történő használatára",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|deaktiválta}} a „$4” címkét a szerkesztők és botok számára történő használatára",
-       "log-name-tag": "Címke napló",
+       "log-name-tag": "Címkenapló",
        "log-description-tag": "Ez a lap azt tartalmazza, amikor a szerkesztő egyedi változathoz vagy napló bejegyzéshez   [[Special:Tags|címkét]] vett fel, vagy törölte azt. A napló nem tartalmazza azokat a címkézéseket, amikor az szerkesztés, törlés, vagy hasonló tevékenység részeként történik.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|felvette}} a(z) $6 {{PLURAL:$7|címkét|címkéket}} a(z) $3 lap $4 változatához",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|felvette}} a(z) $6 {{PLURAL:$7|címkét|címkéket}} a(z) $3 lap $5 napló bejegyzéséhez",
index 45da113..ba0af4e 100644 (file)
        "createaccountreason": "Պատճառը՝",
        "createacct-reason": "Պատճառ",
        "createacct-reason-ph": "Ինչո՞ւ եք փորձում ստեղծել մեկ այլ հաշիվ",
-       "createacct-captcha": "Անվտանգության ստուգում",
-       "createacct-imgcaptcha-ph": "Մուտքագրեք վերը բերված գրվածքը",
        "createacct-submit": "Ստեղծել ձեր հաշիվը",
        "createacct-another-submit": "Ստեղծել մեկ այլ հաշիվ",
        "createacct-benefit-heading": "{{SITENAME}}՝ ստեղծվում է ձեր պես մարդկանց կողմից։",
        "passwordreset-emailsent-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։",
        "passwordreset-emailerror-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։ Սակայն մասնակցին ուղարկելը չհաջողվեց․",
        "changeemail": "Փոխել էլ. հասցեն",
+       "changeemail-header": "Փոխել հաշվի էլ․ հասցեն",
        "changeemail-oldemail": "Ներկա էլ․ հասցե․",
        "changeemail-newemail": "Նոր էլ․ հասցե․",
        "changeemail-none": "(ոչ մի)",
        "rightslogtext": "Սա մասնակիցների իրավունքների փոփոխությունների տեղեկամատյանն է։",
        "action-edit": "խմբագրել այս էջը",
        "action-createpage": "Ստեղծել էջ",
+       "action-move": "տեղափոխել այս էջը",
        "action-move-rootuserpages": "տեղափոխել մասնակցի էջի արմատը",
        "action-movefile": "տեղափոխել այս ֆայլը",
        "action-upload": "Բեռնել այս ֆայլը",
        "movepagetext": "Ստորև բերված ձևով կարող եք վերանվանել էջը՝ միաժամանակ տեղափոխելով նրա պատմությունը նոր անվանմանը։\nՀին էջը կդառնա վերահղման էջ դեպի նոր անվանումը։\nԴուք կարող եք ավտոմատիկ կերպով թարմացնել հին անվանմանը տանող վերահղումները։\nԵթե ընտրեք չանել դա, ապա խնդրում ենք ստուգել [[Special:DoubleRedirects|կրկնակի]] կամ [[Special:BrokenRedirects|չգործող վերահղումների]] առկայությունը։\nԴուք պատասխանատու եք ստուգել, որպեսզի հղումները շարունակեն տանել այնտեղ, ուր պետք է տանեն։\n\nԻ նկատի ունեցեք, որ էջը '''չի''' տեղափոխվի, եթե նոր անվանմամբ էջ արդեն գոյություն ունի՝ բացառությամբ այն դեպքերի, երբ էջը դատարկ է կամ վերահղման էջ է, և չունի նախկին փոփոխումների պատմություն\nՍա նշանակում է, որ դուք կարող եք հետ տեղափոխել էջը հին անվանմանը, եթե տեղափոխումը կատարվել է սխալմամբ և նաև չեք կարող արդեն գոյություն ունեցող էջը վրագրել։\n\n'''ԶԳՈՒՇԱՑՈ՜ՒՄ'''\nԱյս գործողությունը կարող է ունենալ արմատական ազդեցություն ''ժողովրդական'' էջի համար։\nՇարունակելուց առաջ խնդրում ենք համոզվել նրանում, որ դուք հասկանում եք հնարավոր հետևանքները։",
        "movepagetext-noredirectfixer": "Օգտագործելով ներքևի ձևը, դուք կարող եք վերանավանել էջը։ Այդ դեպքում էջի ողջ կտեղափոխվի նոր վերնագրի ներքո։ Հին վերնագիրը կդառնա ավտոմատ վերահղում նոր վերնագրին։ Ստուգե՛ք, արդյոք վերանվանման պատճառով չե՞ն առաջացել [[Special:DoubleRedirects|կրկնակի]] կամ [[Special:BrokenRedirects|կոտրված վերահղումներ]]։ Դուք պատասխանատու եք, որ այլ էջերի հղումները այս անվանափոխությունից հետո շարունակեն ճիշտ գործել։\n\nԷջը հնարավոր '''չի''' լինի վերանվանել, եթե նոր վերնագրով արդեն էջ գոյութուն ունի, բացի այն դեպքից, երբ այն դատարկ է կամ վերահղում է առանց պատմության։ Այսինքն սխալ անուն ընտրելու դեպքում դուք կարող եք վերադարձնել էջի նախկին անվանումը, սակայն դուք չեք կարող օգտագործել գոյություն ունեցող էջի վերնագիր։\n\n'''Ուշադրությո՛ւն'''\nԱնվանափոխությունը կարող է լուրջ խնդիրներ առաջացնել հաճախակի խմբագրվող էջի դեպքում։\nԽնդրում ենք շարունակել միայն, եթե գիտակցում եք կատարվող փոփոխության հետևանքները։",
        "movepagetalktext": "Կցված քննարկման էջը ավտոմատ կտեղափոխվի էջի հետ՝ '''բացառությամբ այն դեպքերի, երբ'''.\n*Գոյություն ունի ոչ-դատարկ քննարկման էջ նոր անվանման տակ\n*Դուք հանել եք նշումը ստորև արկղից\n\nԱյսպիսի դեպքերում հարկավոր է տեղափոխել կամ միաձուլել էջերը ձեռքով, եթե դա ցանկանաք։",
-       "movearticle": "Տեղափոխել էջը",
        "moveuserpage-warning": "'''Զգուշացո՜ւմ՝ '''You are about to move a user page. Please note that only the page will be moved and the user will ''not'' be renamed.",
        "movenologintext": "Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]]՝ էջը տեղափոխելու համար։",
        "movenotallowed": "Դուք չունեք էջերի տեղափոխման իրավունք։",
index 5f52a54..4effd6e 100644 (file)
@@ -21,6 +21,7 @@
        "tog-hideminor": "Celar le modificationes minor in le modificationes recente",
        "tog-hidepatrolled": "Celar le modificationes patruliate in le modificationes recente",
        "tog-newpageshidepatrolled": "Celar le paginas patruliate del lista de nove paginas",
+       "tog-hidecategorization": "Celar le categorisation de paginas",
        "tog-extendwatchlist": "Displicar le observatorio pro monstrar tote le modificationes, non solmente les plus recente",
        "tog-usenewrc": "Gruppar modificationes per pagina in modificationes recente e observatorio",
        "tog-numberheadings": "Numerar titulos automaticamente",
@@ -50,6 +51,7 @@
        "tog-watchlisthideliu": "Celar modificationes de usatores registrate in le observatorio",
        "tog-watchlisthideanons": "Celar modificationes de usatores anonyme in le observatorio",
        "tog-watchlisthidepatrolled": "Celar le modificationes patruliate in le observatorio",
+       "tog-watchlisthidecategorization": "Celar le categorisation de paginas",
        "tog-ccmeonemails": "Inviar me copias del messages de e-mail que io invia a altere usatores",
        "tog-diffonly": "Non monstrar le contento del pagina sub le comparation de duo versiones",
        "tog-showhiddencats": "Monstrar categorias celate",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Proque crea tu un altere conto?",
-       "createacct-captcha": "Controlo de securitate",
-       "createacct-imgcaptcha-ph": "Scribe le texto que tu vide hic supra",
        "createacct-submit": "Crear tu conto",
        "createacct-another-submit": "Crear conto",
        "createacct-benefit-heading": "{{SITENAME}} es facite per gente como tu.",
        "permissionserrors": "Error de permission",
        "permissionserrorstext": "Tu non ha le permission de facer isto, pro le sequente {{PLURAL:$1|motivo|motivos}}:",
        "permissionserrorstext-withaction": "Tu non ha le permission de $2, pro le sequente {{PLURAL:$1|motivo|motivos}}:",
+       "contentmodelediterror": "Non es possibile modificar iste version perque su modello de contento es <code>$1</code>, e le modello de contento actual del pagina es <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Attention: Tu es sur le puncto de recrear un pagina que ha essite delite anteriormente.'''\n\nTu deberea considerar si il es appropriate continuar a modificar iste pagina.\nEcce le registro de deletiones e de renominationes pro iste pagina:",
        "moveddeleted-notice": "Iste pagina ha essite delite.\nIn basso se revela le registro de deletiones e de modificationes del pagina pro ulterior informationes.",
        "moveddeleted-notice-recent": "Regrettabilemente iste pagina ha essite delite (in le ultime 24 horas).\nLe registro de deletion e renomination pro le pagina es fornite hic infra pro vostre information.",
        "prefs-help-recentchangescount": "Isto include modificationes recente, historias de paginas, e registros.",
        "prefs-help-watchlist-token2": "Isto es le clave secrete pro le syndication web de tu observatorio.\nOmne persona qui lo cognosce pote leger tu observatorio, dunque, non divide lo.\n[[Special:ResetTokens|Clicca hic pro reinitialisar lo]].",
        "savedprefs": "Tu preferentias ha essite confirmate.",
+       "savedrights": "Le derectos de usator de {{GENDER:$1|$1}} ha essite salveguardate.",
        "timezonelegend": "Fuso horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar le valor predefinite del wiki ($1)",
        "rcshowhidemine": "$1 mi modificationes",
        "rcshowhidemine-show": "Monstrar",
        "rcshowhidemine-hide": "Celar",
+       "rcshowhidecategorization": "$1 le categorisation de paginas",
+       "rcshowhidecategorization-show": "Monstrar",
+       "rcshowhidecategorization-hide": "Celar",
        "rclinks": "Monstrar le $1 ultime modificationes in le $2 ultime dies<br />$3",
        "diff": "diff",
        "hist": "hist",
        "upload-dialog-button-done": "Facite",
        "upload-dialog-button-save": "Salveguardar",
        "upload-dialog-button-upload": "Incargar",
-       "upload-process-error": "Un error ha occurrite",
-       "upload-process-warning": "Un advertimento se ha producite",
        "upload-form-label-select-file": "Seliger file",
        "upload-form-label-infoform-title": "Detalios",
        "upload-form-label-infoform-name": "Nomine",
index e623de5..67c616b 100644 (file)
@@ -41,7 +41,9 @@
                        "Totosunarto",
                        "Mirws",
                        "Ilham",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "WongKentir",
+                       "Rachmat.Wahidi"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "nstab-template": "Templat",
        "nstab-help": "Bantuan",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Halaman Utama",
        "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 benar. Hal ini juga mungkin mengindikasikan suatu bug pada perangkat lunak yang digunakan oleh {{SITENAME}}.",
        "nosuchspecialpage": "Tidak ada halaman istimewa tersebut",
        "createaccountreason": "Alasan:",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Mengapa Anda membuat akun lain",
-       "createacct-captcha": "Pemeriksaan keamanan",
-       "createacct-imgcaptcha-ph": "Masukkan teks yang Anda lihat di atas",
        "createacct-submit": "Buat akun Anda",
        "createacct-another-submit": "Buat akun lain",
        "createacct-benefit-heading": "{{SITENAME}} dibuat oleh orang-orang seperti Anda.",
        "rcshowhidemine": "$1 suntingan saya",
        "rcshowhidemine-show": "Tampilkan",
        "rcshowhidemine-hide": "Sembunyikan",
+       "rcshowhidecategorization-show": "Tampilkan",
+       "rcshowhidecategorization-hide": "Sembunyikan",
        "rclinks": "Perlihatkan $1 perubahan terbaru dalam $2 hari terakhir<br />$3",
        "diff": "beda",
        "hist": "versi",
        "upload-too-many-redirects": "URL mengandung terlalu banyak pengalihan",
        "upload-http-error": "Kesalahan HTTP terjadi: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
+       "upload-dialog-title": "Unggah berkas",
+       "upload-dialog-button-cancel": "Batalkan",
+       "upload-dialog-button-done": "Selesai",
+       "upload-dialog-button-save": "Simpan",
+       "upload-dialog-button-upload": "Unggah",
+       "upload-form-label-select-file": "Pilih berkas",
+       "upload-form-label-infoform-title": "Rincian",
+       "upload-form-label-infoform-name": "Nama",
+       "upload-form-label-infoform-description": "Deskripsi",
+       "upload-form-label-usage-title": "Penggunaan",
+       "upload-form-label-usage-filename": "Nama berkas",
+       "foreign-structured-upload-form-label-own-work": "Ini adalah karya saya sendiri",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategori",
+       "foreign-structured-upload-form-label-infoform-date": "Tanggal",
        "backend-fail-stream": "Tidak bisa mengalikan berkas $1.",
        "backend-fail-backup": "Tidak dapat mencadangkan berkas $1.",
        "backend-fail-notexists": "Berkas $1 tidak ada.",
        "rollback-success": "Pembatalan suntingan oleh $1; dibatalkan ke versi terakhir oleh $2.",
        "sessionfailure-title": "Kegagalan sesi",
        "sessionfailure": "Sepertinya ada masalah dengan sesi log Anda; log Anda telah dibatalkan untuk mencegah pembajakan. Silakan tekan tombol \"kembali\" dan muat kembali halaman sebelum Anda masuk, lalu coba lagi.",
+       "changecontentmodel-title-label": "Judul halaman",
+       "changecontentmodel-model-label": "Model konten baru",
+       "changecontentmodel-reason-label": "Alasan:",
+       "changecontentmodel-success-title": "Model konten ini telah diubah",
+       "changecontentmodel-success-text": "Jenis konten [[:$1]] telah diubah",
+       "logentry-contentmodel-change-revertlink": "batalkan",
+       "logentry-contentmodel-change-revert": "batalkan",
        "protectlogpage": "Log pelindungan",
        "protectlogtext": "Di bawah ini adalah daftar perubahan terhadap perlindungan halaman.\nLihat [[Special:ProtectedPages|daftar halaman terlindungi]] untuk daftar perlindungan halaman terkini.",
        "protectedarticle": "melindungi \"[[$1]]\"",
        "sp-contributions-newbies": "Hanya dari para pengguna baru",
        "sp-contributions-newbies-sub": "Untuk pengguna baru",
        "sp-contributions-newbies-title": "Kontribusi pengguna baru",
-       "sp-contributions-blocklog": "Log pemblokiran",
+       "sp-contributions-blocklog": "log pemblokiran",
        "sp-contributions-suppresslog": "kontribusi pengguna yang disembunyikan",
        "sp-contributions-deleted": "kontribusi pengguna yang dihapus",
        "sp-contributions-uploads": "unggahan",
        "cant-move-to-user-page": "Anda tidak memiliki hak akses untuk memindahkan halaman ke suatu halaman pengguna (kecuali ke subhalaman pengguna).",
        "cant-move-category-page": "Anda tidak memiliki izin untuk memindahkan halaman kategori.",
        "cant-move-to-category-page": "Anda tidak memiliki izin untuk memindahkan halaman ke halaman kategori.",
-       "newtitle": "Ke judul baru:",
+       "newtitle": "Judul baru:",
        "move-watch": "Pantau halaman ini",
        "movepagebtn": "Pindahkan halaman",
        "pagemovedsub": "Pemindahan berhasil",
        "spam_reverting": "Membatalkan ke versi terakhir yang tak memiliki pranala ke $1",
        "spam_blanking": "Semua revisi yang memiliki pranala ke $1, kosong",
        "spam_deleting": "Semua revisi yang memiliki pranala ke $1, penghapusan",
-       "simpleantispam-label": "Pemeriksaan anti-spam.\nMasukan ini '''DILARANG'''!",
+       "simpleantispam-label": "Pemeriksaan anti-spam.\n<strong>Jangan</strong> diisi!",
        "pageinfo-title": "Informasi untuk \"$1\"",
        "pageinfo-not-current": "Maaf, tidak mungkin memberikan informasi ini ke revisi lama.",
        "pageinfo-header-basic": "Informasi dasar",
        "autosumm-replace": "←Mengganti halaman dengan '$1'",
        "autoredircomment": "←Mengalihkan ke [[$1]]",
        "autosumm-new": "←Membuat halaman berisi '$1'",
+       "autosumm-newblank": "Membuat halaman kosong",
        "lag-warn-normal": "Perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
        "lag-warn-high": "Karenanya besarnya keterlambatan basis data server, perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
        "watchlistedit-normal-title": "Sunting daftar pantauan",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikel path]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skrip path]",
+       "version-libraries-library": "Perpustakaan",
+       "version-libraries-version": "Versi",
+       "version-libraries-license": "Lisensi",
+       "version-libraries-description": "Deskripsi",
+       "version-libraries-authors": "Pembuat",
        "redirect": "Pengalihan berdasarkan ID berkas, pengguna, halaman atau revisi",
        "redirect-legend": "Pengalihan ke sebuah berkas atau halaman",
        "redirect-summary": "Halaman istimewa ini beralih ke berkas (sesuai nama berkasnya), halaman (sesuai ID revisinya), atau halaman pengguna (sesuai ID numerik penggunanya). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "Nama tag",
        "tags-display-header": "Tampilan di daftar perubahan",
        "tags-description-header": "Deskripsi lengkap atau makna",
+       "tags-source-header": "Sumber",
        "tags-active-header": "Aktif?",
        "tags-hitcount-header": "Perubahan bertag",
+       "tags-actions-header": "Tindakan",
        "tags-active-yes": "Ya",
        "tags-active-no": "Tidak",
+       "tags-source-none": "Tidak digunakan lagi",
        "tags-edit": "sunting",
        "tags-delete": "hapus",
        "tags-activate": "aktifkan",
        "tags-deactivate": "nonaktifkan",
        "tags-hitcount": "$1 {{PLURAL:$1|perubahan}}",
+       "tags-create-heading": "Buat sebuah tag baru",
+       "tags-create-reason": "Alasan:",
+       "tags-create-submit": "Buat",
+       "tags-delete-reason": "Alasan:",
+       "tags-activate-reason": "Alasan:",
+       "tags-activate-submit": "Aktifkan",
+       "tags-deactivate-reason": "Alasan:",
+       "tags-deactivate-submit": "Matikan",
+       "tags-edit-reason": "Alasan:",
        "comparepages": "Bandingkan halaman",
        "compare-page1": "Halaman 1",
        "compare-page2": "Halaman 2",
        "htmlform-cloner-create": "Tambahkan lebih banyak",
        "htmlform-cloner-delete": "Hapus",
        "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
+       "htmlform-title-not-exists": "[[:$1]] tidak ada.",
        "sqlite-has-fts": "$1 dengan dukungan pencarian teks lengkap",
        "sqlite-no-fts": "$1 tanpa dukungan pencarian teks lengkap",
        "logentry-delete-delete": "$1 {{GENDER:$2|menghapus}} halaman $3",
        "rightsnone": "(tidak ada)",
        "revdelete-summary": "ringkasan",
        "feedback-adding": "Menambahkan umpan balik ke halaman...",
+       "feedback-back": "Kembali",
        "feedback-bugcheck": "Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].",
        "feedback-bugnew": "Saya telah memeriksa. Laporkan bug baru",
        "feedback-bugornote": "Jika Anda sudah siap untuk mendeskripsikan masalah teknis secara rinci silakan [$1 melaporkan bug].\nJika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda akan ditambahkan ke halaman \"[$3 $2]\", bersama dengan nama pengguna Anda dan apa browser yang Anda gunakan.",
        "feedback-cancel": "Batal",
        "feedback-close": "Selesai",
+       "feedback-error-title": "Kesalahan",
        "feedback-error1": "Galat: Hasil tidak dikenal dari API",
        "feedback-error2": "Galat: Penyuntingan gagal",
        "feedback-error3": "Error: API tidak merespons",
        "feedback-subject": "Perihal:",
        "feedback-submit": "Kirim",
        "feedback-thanks": "Terima kasih! Umpan balik Anda telah dikirimkan ke halaman \"[$2 $1]\".",
+       "feedback-thanks-title": "Terima kasih!",
        "searchsuggest-search": "Cari",
        "searchsuggest-containing": "berisi...",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
index 5d1fd88..68b8cd6 100644 (file)
        "upload-dialog-button-done": "Nalpasen",
        "upload-dialog-button-save": "Idulin",
        "upload-dialog-button-upload": "Agikarga",
-       "upload-process-error": "Adda napasamak a biddut",
-       "upload-process-warning": "Adda napasamak a ballaag",
        "upload-form-label-select-file": "Pilien ti papeles",
        "upload-form-label-infoform-title": "Dagiti salaysay",
        "upload-form-label-infoform-name": "Nagan",
index b8deaf7..f3cab6b 100644 (file)
@@ -98,6 +98,7 @@
        "tog-hideminor": "Nascondi le modifiche minori nelle ultime modifiche",
        "tog-hidepatrolled": "Nascondi le modifiche verificate nelle ultime modifiche",
        "tog-newpageshidepatrolled": "Nascondi le pagine verificate dall'elenco delle pagine più recenti",
+       "tog-hidecategorization": "Nascondi la categorizzazione delle pagine",
        "tog-extendwatchlist": "Mostra tutte le modifiche agli osservati speciali, non solo l'ultima",
        "tog-usenewrc": "Raggruppa le modifiche per pagina nelle ultime modifiche e negli osservati speciali",
        "tog-numberheadings": "Numerazione automatica dei titoli di sezione",
        "tog-watchlisthideliu": "Nascondi le modifiche degli utenti registrati negli osservati speciali",
        "tog-watchlisthideanons": "Nascondi le modifiche degli utenti anonimi negli osservati speciali",
        "tog-watchlisthidepatrolled": "Nascondi le modifiche verificate negli osservati speciali",
+       "tog-watchlisthidecategorization": "Nascondi la categorizzazione delle pagine",
        "tog-ccmeonemails": "Inviami una copia dei messaggi spediti agli altri utenti",
        "tog-diffonly": "Non visualizzare il contenuto della pagina dopo il confronto tra versioni",
        "tog-showhiddencats": "Mostra le categorie nascoste",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Perché stai creando un'altra utenza",
-       "createacct-captcha": "Controllo di sicurezza",
-       "createacct-imgcaptcha-ph": "Inserisci il testo che vedi sopra",
        "createacct-submit": "Crea la tua utenza",
        "createacct-another-submit": "Crea utenza",
        "createacct-benefit-heading": "{{SITENAME}} cresce grazie a persone come te.",
        "changeemail-no-info": "Devi aver effettuato l'accesso per accedere a questa pagina direttamente.",
        "changeemail-oldemail": "Indirizzo email attuale:",
        "changeemail-newemail": "Nuovo indirizzo email:",
+       "changeemail-newemail-help": "Questo campo deve essere lasciato vuoto se vuoi rimuovere il tuo indirizzo email. Non sarai in grado di reimpostare una password dimenticata e non riceverai email da questo wiki, se l'indirizzo di posta elettronica viene rimosso.",
        "changeemail-none": "(nessuno)",
        "changeemail-password": "La password su {{SITENAME}}:",
        "changeemail-submit": "Modifica email",
        "permissionserrors": "Permessi non sufficienti",
        "permissionserrorstext": "Non si dispone dei permessi necessari ad eseguire l'azione richiesta, per {{PLURAL:$1|il seguente motivo|i seguenti motivi}}:",
        "permissionserrorstext-withaction": "Non si dispone dei permessi necessari per $2, per {{PLURAL:$1|il seguente motivo|i seguenti motivi}}:",
+       "contentmodelediterror": "Non è possibile modificare questa versione poiché il suo modello di contenuto è <code>$1</code>, mentre il modello di contenuto attuale della pagina è <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Attenzione: si sta per ricreare una pagina già cancellata in passato.</strong>\n\nAccertarsi che sia davvero opportuno continuare a modificare questa pagina.\nL'elenco delle relative cancellazioni e degli spostamenti viene riportato di seguito per comodità:",
        "moveddeleted-notice": "Questa pagina è stata cancellata. L'elenco delle relative cancellazioni e degli spostamenti viene riportato di seguito per informazione.",
        "moveddeleted-notice-recent": "Spiacenti, questa pagina è stata cancellata recentemente (nelle ultime 24 ore).\n\nLe azioni di cancellazione e spostamento per questa pagina sono disponibili di seguito per completezza.",
        "showingresultsinrange": "{{PLURAL:$1|Viene mostrato|Vengono mostrati}} sotto {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultati}} dal <strong>$2</strong> al <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> di <strong>$3</strong>|Risultati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
        "search-nonefound": "La ricerca non ha prodotto risultati.",
+       "search-nonefound-thiswiki": "La ricerca non ha prodotto risultati in questo sito.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca nei namespace:",
        "powersearch-togglelabel": "Seleziona:",
        "prefs-help-recentchangescount": "Comprende ultime modifiche, cronologie e registri.",
        "prefs-help-watchlist-token2": "Questa è la chiave segreta per il feed web dei tuoi osservati speciali.\nChiunque la conosce sarà in grado di leggere i tuoi osservati speciali, per cui non condividerla. [[Special:ResetTokens|Clicca qui se hai bisogno di reimpostarla]].",
        "savedprefs": "Le preferenze sono state salvate.",
+       "savedrights": "I diritti utente di {{GENDER:$1|$1}} sono stati salvati.",
        "timezonelegend": "Fuso orario:",
        "localtime": "Ora locale:",
        "timezoneuseserverdefault": "Usa ora predefinita del wiki ($1)",
        "rcshowhidemine": "$1 le mie modifiche",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Nascondi",
+       "rcshowhidecategorization": "$1 la categorizzazione della pagina",
+       "rcshowhidecategorization-show": "Mostra",
+       "rcshowhidecategorization-hide": "Nascondi",
        "rclinks": "Mostra le $1 modifiche più recenti apportate negli ultimi $2 giorni<br />$3",
        "diff": "diff",
        "hist": "cron",
        "uploaded-href-attribute-svg": "Attributi href <code>&lt;$1 $2=\"$3\"&gt;</code> com un bersaglio non locale (e.g. http://, javascript:, etc) non sono permessi file SGV",
        "uploaded-href-unsafe-target-svg": "Trovati href ad un bersaglio non sicuro <code>&lt;$1 $2=\"$3\"&gt;</code> caricato nel file SVG",
        "uploaded-animate-svg": "Trovato il tag \"animate\" che potrebbe cambiare href, usando l'attributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> nel file SVG caricato.",
+       "uploaded-setting-event-handler-svg": "La configurazione di attributi per il gestore di eventi è bloccata, trovato <code>&lt;$1 $2=\"$3\"&gt;</code> nel file SVG caricato.",
        "uploaded-setting-href-svg": "Utilizzare il tag \"set\" per aggiungere l'attributo \"href\" all'elemento parentale è bloccato.",
+       "uploaded-wrong-setting-svg": "L'uso dell'elemento \"set\" per aggiungere una destinazione remote/data/script per qualsiasi attributo è bloccato. Trovato <code>&lt;set to=\"$1\"&gt;</code> nel file SVG caricato.",
+       "uploaded-setting-handler-svg": "SVG che imposta l'attributo \"handler\" con remote/data/script è bloccato. Trovato <code>$1=\"$2\"</code> nel file SVG caricato.",
+       "uploaded-remote-url-svg": "SVG che imposta qualsiasi attributo di stile con URL remoti è bloccato. Trovato <code>$1=\"$2\"</code> nel file SVG caricato.",
        "uploaded-image-filter-svg": "Trovato filtro immagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel file in formato SVG caricato.",
        "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
        "uploadinvalidxml": "Il codice XML nel file caricato non può essere elaborato.",
        "upload-dialog-button-done": "Fatto",
        "upload-dialog-button-save": "Salva",
        "upload-dialog-button-upload": "Carica",
-       "upload-process-error": "Si è verificato un errore",
-       "upload-process-warning": "Si è verificato un avviso",
        "upload-form-label-select-file": "Seleziona file",
        "upload-form-label-infoform-title": "Dettagli",
        "upload-form-label-infoform-name": "Nome",
        "foreign-structured-upload-form-label-own-work": "Questo è un mio lavoro",
        "foreign-structured-upload-form-label-infoform-categories": "Categorie",
        "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Confermo che sto caricando questo file seguendo le condizioni di servizio e le politiche sulle license di {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Se non si è in grado di caricare il file in base alle politiche di {{SITENAME}}, chiudi questa finestra e prova un altro metodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Puoi anche provare la [[Special:Upload|pagina di caricamento predefinita]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Ho capito che sto caricando questo file in un archivio condiviso. Confermo che lo sto facendo secondo le condizioni di servizio e le politiche sulle license di lì.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Se non si è in grado di caricare il file in base alle politiche dell'archivio condiviso, chiudi questa finestra e prova un altro metodo.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Puoi anche provare ad usare la [[Special:Upload|pagina di caricamento su {{SITENAME}}]], se questo file può essere caricato in base alle sue politiche.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Attesto che possiedo i diritti d'autore su questo file, e accetto irrevocabilmente il rilascio di questo file su Wikimedia Commons in base alla licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribuzione-Condividi allo stesso modo 4.0], e accetto le [https://wikimediafoundation.org/wiki/Terms_of_Use Condizioni d'uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Se non possiedi i diritti d'autore su questo file, o se lo vuoi rilasciare con una licenza diversa, usa il [https://commons.wikimedia.org/wiki/Special:UploadWizard caricamento guidato di Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Puoi anche provare ad usare la [[Special:Upload|pagina di caricamento su {{SITENAME}}]], se il sito consente il caricamento di questo file in base alle sue politiche.",
        "backend-fail-stream": "Impossibile trasmettere il file $1.",
        "backend-fail-backup": "Impossibile eseguire il backup del file $1 .",
        "backend-fail-notexists": "Il file $1 non esiste.",
        "changecontentmodel-success-text": "Il tipo di contenuto di [[:$1]] è stato modificato.",
        "changecontentmodel-cannot-convert": "Il contenuto di [[:$1]] non può essere convertito in tipo $2.",
        "changecontentmodel-nodirectediting": "Il modello di contenuto $1 non supporta la modifica diretta",
-       "log-name-contentmodel": "Registro delle modifiche del modello contenuti",
+       "log-name-contentmodel": "Modifiche del modello contenuti",
        "log-description-contentmodel": "Eventi relativi al modello di contenuto di una pagina",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|ha modificato}} il modello di contenuto della pagina $3 da \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "ripristina",
        "pageinfo-category-pages": "Numero di pagine",
        "pageinfo-category-subcats": "Numero di sottocategorie",
        "pageinfo-category-files": "Numero di file",
-       "markaspatrolleddiff": "Segna la modifica come verificata",
+       "markaspatrolleddiff": "Segna come verificata",
        "markaspatrolledtext": "Segna questa pagina come verificata",
        "markedaspatrolled": "Modifica verificata",
        "markedaspatrolledtext": "La modifica di [[:$1]] selezionata è stata segnata come verificata.",
        "logentry-upload-upload": "$1 {{GENDER:$2|ha caricato}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ha caricato}} una nuova versione di $3.",
        "logentry-upload-revert": "$1 {{GENDER:$2|ha caricato}} $3",
-       "log-name-managetags": "Registro gestione tag",
+       "log-name-managetags": "Gestione etichette",
        "log-description-managetags": "Questa pagina elenca le azioni di gestione relative alle [[Special:Tags|etichette]]. Il registro contiene solo le azioni effettuate manualmente da un amministratore; le etichette potrebbero essere create o cancellate dal programma wiki senza che ciò venga registrato qui.",
        "logentry-managetags-create": "$1 {{GENERE:$2|ha creato}} il tag \"$4\"",
        "logentry-managetags-delete": "$1 {{GENDER:$2|ha rimosso}} l'etichetta \"$4\" (da $5 {{PLURAL:$5|versione o voce di registro|versioni o voci di registro}})",
index 2368816..f209c00 100644 (file)
@@ -74,6 +74,7 @@
        "tog-hideminor": "最近の更新に、細部の編集を表示しない",
        "tog-hidepatrolled": "最近の更新に、巡回済みの編集を表示しない",
        "tog-newpageshidepatrolled": "新しいページの一覧に、巡回済みのページを表示しない",
+       "tog-hidecategorization": "ページのカテゴリ化を隠す",
        "tog-extendwatchlist": "ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示",
        "tog-usenewrc": "最近の更新とウォッチリストで、複数の変更をページごとにまとめる",
        "tog-numberheadings": "見出しに番号を自動的に振る",
        "tog-watchlisthideliu": "ログイン利用者による編集をウォッチリストに表示しない",
        "tog-watchlisthideanons": "匿名利用者による編集をウォッチリストに表示しない",
        "tog-watchlisthidepatrolled": "巡回済みの編集をウォッチリストに表示しない",
+       "tog-watchlisthidecategorization": "ページのカテゴリ化を隠す",
        "tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信",
        "tog-diffonly": "差分の下にページ内容を表示しない",
        "tog-showhiddencats": "隠しカテゴリを表示",
        "createaccountreason": "理由:",
        "createacct-reason": "理由",
        "createacct-reason-ph": "アカウントを作成する理由",
-       "createacct-captcha": "自動作成防止チェック",
-       "createacct-imgcaptcha-ph": "上に表示されている文字列を入力",
        "createacct-submit": "アカウントを作成",
        "createacct-another-submit": "アカウントを作成",
        "createacct-benefit-heading": "{{SITENAME}}は、あなたのような人々が創っています。",
        "permissionserrors": "権限エラー",
        "permissionserrorstext": "あなたにはこの操作を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "permissionserrorstext-withaction": "あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:",
+       "contentmodelediterror": "コンテンツモデルが <code>$1</code> であるため、この版を編集することができません。ページの現在のコンテンツモデルは <code>$2</code> です。",
        "recreate-moveddeleted-warn": "<strong>警告: 以前削除されたページを再作成しようとしています。</strong>\n\nこのページの編集を続行するのが適切かどうかご確認ください。\n参考までに、このページの削除と移動の記録を以下に示します:",
        "moveddeleted-notice": "このページは削除されています。\n参考のため、このページの削除と移動の記録を以下に表示します。",
        "moveddeleted-notice-recent": "ごめんなさい、このページは最近に削除されました (過去24時間以内)。このページについての削除と移動の記録が、参考のため、以下にて提供されています。",
        "showingresultsinrange": "<strong>$2</strong> 件目から<strong>$3</strong> 件目までの範囲内で最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}",
        "search-nonefound": "問い合わせに合致する検索結果はありませんでした。",
+       "search-nonefound-thiswiki": "このサイトでの、そのクエリに一致する結果は、何もありませんでした。",
        "powersearch-legend": "高度な検索",
        "powersearch-ns": "名前空間を指定して検索:",
        "powersearch-togglelabel": "チェックを入れる:",
        "prefs-help-recentchangescount": "この設定は最近の更新、ページの履歴、および記録に適用されます。",
        "prefs-help-watchlist-token2": "これはあなたのウォッチリスト フィードの秘密のコードです。\nこのトークンを知っている人は誰でもあなたのウォッチリストを読めてしまうため、他の人に教えないでください。\n[[Special:ResetTokens|トークンを再設定する必要がある場合はここをクリックしてください]]。",
        "savedprefs": "個人設定を保存しました。",
+       "savedrights": "{{GENDER:$1|$1}}の利用者権限が保存されました。",
        "timezonelegend": "タイムゾーン:",
        "localtime": "地域の時刻:",
        "timezoneuseserverdefault": "ウィキの既定を使用 ($1)",
        "rcshowhidemine": "自分の編集を$1",
        "rcshowhidemine-show": "表示",
        "rcshowhidemine-hide": "非表示",
+       "rcshowhidecategorization": "$1 ページ カテゴリ化",
+       "rcshowhidecategorization-show": "表示",
+       "rcshowhidecategorization-hide": "非表示",
        "rclinks": "最近 $2 日間の更新を最大 $1 件表示<br />$3",
        "diff": "差分",
        "hist": "履歴",
        "recentchangeslinked-page": "ページ名:",
        "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
        "recentchanges-page-added-to-category": "[[:$1]] カテゴリに追加",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリに追加しました",
        "recentchanges-page-removed-from-category": "[[:$1]] カテゴリから削除",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリから削除しました",
        "autochange-username": "メディアウィキ自動変更",
        "upload": "ファイルをアップロード",
        "uploadbtn": "ファイルをアップロード",
        "upload-dialog-button-done": "完了",
        "upload-dialog-button-save": "保存",
        "upload-dialog-button-upload": "アップロード",
-       "upload-process-error": "エラーが発生しました",
-       "upload-process-warning": "警告",
        "upload-form-label-select-file": "ファイル選択",
        "upload-form-label-infoform-title": "詳細",
        "upload-form-label-infoform-name": "名前",
        "unusedimages": "使われていないファイル",
        "wantedcategories": "カテゴリページが存在しないカテゴリ",
        "wantedpages": "ページが存在しないリンク",
-       "wantedpages-summary": "そのページのみへのリダイレクトリンクを含むページを除いた、ほとんどリンクが存在しないページの一覧です。そのページへのリダイレクトリンクを含む存在しないページの一覧は、[[{{#special:BrokenRedirects}}|迷子のリダイレクトの一覧]]を参照してください。",
+       "wantedpages-summary": "多くのページからリンクされた、存在しないページの一覧です(そのページのみへのリダイレクトリンクを含むページを除きます)。そのページへのリダイレクトリンクを含む存在しないページ一覧は、[[{{#special:BrokenRedirects}}|迷子のリダイレクトの一覧]]を参照してください。",
        "wantedpages-badtitle": "結果が、無効なページ名を含んでいます: $1",
        "wantedfiles": "ファイル情報ページが存在しないファイル",
        "wantedfiletext-cat": "以下のファイルは使用されていますが存在しません。外部リポジトリ由来のファイルは、存在していてもここに列挙される場合があります。その場合は<del>取り消し線</del>が付きます。さらに、存在しないファイルを埋め込んでいるページは[[:$1]]に列挙されます。",
        "nopagetext": "指定したページは存在しません。",
        "pager-newer-n": "{{PLURAL:$1|以後の$1件}}",
        "pager-older-n": "{{PLURAL:$1|以前の$1件}}",
-       "suppress": "秘匿する",
+       "suppress": "秘匿",
        "querypage-disabled": "パフォーマンスに悪影響を与えるおそれがあるため、この特別ページは無効になっています。",
        "apihelp": "API のヘルプ",
        "apihelp-no-such-module": "モジュール「$1」が見つかりません。",
        "svg-long-error": "無効な SVG ファイル: $1",
        "show-big-image": "元のファイル",
        "show-big-image-preview": "このプレビューのサイズ: $1。",
+       "show-big-image-preview-differ": "この $2 ファイルのこの $3 プレビューのサイズ: $1.",
        "show-big-image-other": "その他の{{PLURAL:$2|解像度}}: $1。",
        "show-big-image-size": "$1 × $2 ピクセル",
        "file-info-gif-looped": "ループします",
index 0b8abff..f5afec6 100644 (file)
        "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Kenapa sampeyan nggawe akun liyane",
-       "createacct-captcha": "Periksa kamanan",
-       "createacct-imgcaptcha-ph": "Lebokna tulisan ing dhuwur",
        "createacct-submit": "Gawé akun",
        "createacct-another-submit": "Gawé akun anyar",
        "createacct-benefit-heading": "{{SITENAME}} digawe karo wong-wong kaya sampeyan.",
        "recentchanges-label-minor": "Iki suntingan sithik",
        "recentchanges-label-bot": "Suntingan iki diayahi déning bot",
        "recentchanges-label-unpatrolled": "Suntingan iki durung dipatroli",
-       "recentchanges-label-plusminus": "Gedhene kaca wis diowahi segede niki.",
+       "recentchanges-label-plusminus": "Agengipun kaca sampun dipunowahi samekaten.",
        "recentchanges-legend-heading": "'''Katrangan:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
index 5c3199e..c693f22 100644 (file)
        "createaccountreason": "მიზეზი:",
        "createacct-reason": "მიზეზი",
        "createacct-reason-ph": "რატომ ქმნით ახალ ანგარიშს?",
-       "createacct-captcha": "უსაფრთხოების შემოწმება",
-       "createacct-imgcaptcha-ph": "შეიყვანეთ ზემოთ მოცემული ტექსტი",
        "createacct-submit": "შექმენით თქვენი ანგარიში",
        "createacct-another-submit": "ანგარიშის შექმნა",
        "createacct-benefit-heading": "{{SITENAME}} შექმნილია თქვენნაირი ადამიანების მიერ.",
        "sig_tip": "თქვენი ხელმოწერა და დრო",
        "hr_tip": "ჰორიზონტალური ხაზი (ნუ გამოიყენებთ ხშირად)",
        "summary": "რეზიუმე:",
-       "subject": "თემა/სათაური:",
+       "subject": "თემა:",
        "minoredit": "მცირე რედაქტირება",
        "watchthis": "უთვალთვალე ამ გვერდს",
        "savearticle": "შენახვა",
        "missingsummary": "'''შეხსენება:''' თქვენ არ მიგითითებიათ რედაქტირების რეზიუმე.\nთუ ისევ დააწკაპუნებთ შენახვაზე, თქვენი რედაქტირება რეზიუმეს გარეშე დამახსოვრდება.",
        "selfredirect": "გაფრთხილება: თქვენ გადამისამართებას იმავე გვერდზე ქმნით. შესაძლოა, თქვენ გადამისამართებისთვის აირჩიეთ არასწორი სამიზნე გვერდი ან არედაქტირებთ არასამიზნე გვერდს. \n\nთუ თქვენ კიდევ ერთხელ დააჭერთ ღილაკს \"{{int:savearticle}}\", გადამისამართება შეიქმნება.",
        "missingcommenttext": "გთხოვთ კომენტარი შეიყვანოთ ქვემოთ.",
-       "missingcommentheader": "'''შეხსენება:''' თქვენ ამ კომენტარისთვის სათაური/თემა არ მიგითითებიათ. თუ შენახვაზე \"{{int:savearticle}}\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
+       "missingcommentheader": "<strong>შეხსენება:</strong> თქვენ ამ კომენტარისთვის თემა არ მიგითითებიათ. თუ შენახვაზე \"{{int:savearticle}}\" დააწკაპუნებთ, თქვენი ცვლილება მის გარეშე იქნება შენახული.",
        "summary-preview": "რეზიუმეს წინასწარი გადახედვა:",
-       "subject-preview": "თემის/სათაურის წინასწარი გადახედვა:",
+       "subject-preview": "თემის გადახედვა:",
        "previewerrortext": "თქვენი ცვლილებების წინასწარი გადახედვის მცდელობის დროს მოხდა შეცდომა",
        "blockedtitle": "მომხმარებელი ბლოკირებულია",
        "blockedtext": "'''თქვენი მომხმარებლის სახელი ან IP მისამართი დაბლოკილ იქნა.'''\n\nბლოკირება განახორციელა $1-მ.\nმიზეზად დასახელდა შემდეგი: ''$2''.\n\n* დაბლოკვის დასაწყისი: $8\n* ბლოკის ვადის გასვლის დრო: $6\n* დაბლოკილ იქნა: $7\n\nშეგიძლიათ დაუკავშირდეთ $1-ს ან რომელიმე სხვა [[{{MediaWiki:Grouppage-sysop}}|ადმინისტრატორს]] დაბლოკვის განსახილველად.\nგაითვალისწინეთ, რომ თქვენ ვერ შეძლებთ გამოიყენოთ ფუნქცია „მომხმარებლისთვის ელ. ფოსტის გაგზავნა“, თუ არ გაქვთ მითითებული მოქმედი ელ. ფოსტის მისამართი თქვენი [[Special:Preferences|ანგარიშის კონფიგურაციაში]] ან თუ დაბლოკვის შედეგად გაქვთ ამ ფუნქციის გამოყენების ნებართვა ჩამორთმეული.\nთქვენი ამჟამინდელი IP მისამართია $3, ხოლო ბლოკის იდენტიფიკატორი #$5.\nგთხოვთ, მიუთითოთ ყველა ზემოთხსენებული მონაცემი თქვენს კორესპონდენციაში.",
        "templatesused": "ამ გვერდზე გამოყენებული {{PLURAL:$1|თარგი|თარგები}}:",
        "templatesusedpreview": "{{PLURAL:$1|თარგი, რომელიც|თარგები, რომლებიც}} წინასწარ გადახედვის გვერდზეა გამოყენებული:",
        "templatesusedsection": "ამ სექციაში გამოყენებული {{PLURAL:$1|თარგი|თარგები}}:",
-       "template-protected": "(დაცული)",
+       "template-protected": "(დაცული)",
        "template-semiprotected": "(ნახევრად დაცული)",
        "hiddencategories": "ეს გვერდი გაერთიანებულია $1 დამალულ კატეგორიაში.",
        "edittools": "<!-- აქ განთავსებული ტექსტი ნაჩვენები იქნება რედაქტირებისა და ატვირთვის ფორმების ქვეშ. -->",
        "upload-dialog-button-done": "შესრულდა",
        "upload-dialog-button-save": "შენახვა",
        "upload-dialog-button-upload": "ატვირთვა",
-       "upload-process-error": "მოხდა შეცდომა",
-       "upload-process-warning": "გაჩნდა გაფრთხილება",
        "upload-form-label-select-file": "ფაილის არჩევა",
        "upload-form-label-infoform-title": "დეტალები",
        "upload-form-label-infoform-name": "სახელი",
        "upload-form-label-infoform-description": "აღწერა",
        "upload-form-label-usage-title": "გამოყენება",
        "upload-form-label-usage-filename": "ფაილის სახელი",
+       "foreign-structured-upload-form-label-own-work": "ეს ჩემი პირადი ნამუშევარია",
+       "foreign-structured-upload-form-label-infoform-categories": "კატეგორიები",
+       "foreign-structured-upload-form-label-infoform-date": "თარიღი",
        "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
        "backend-fail-backup": "ფაილი $1 სარეზერვო ასლის გაკეთება ვერ მოხერხდა.",
        "backend-fail-notexists": "ფაილი $1 არ არსებობს.",
        "tooltip-pt-logout": "გასვლა",
        "tooltip-pt-createaccount": "ჩვენ გთავაზობთ, შექმნათ ანგარიში და შეხვიდეთ სისტემაში; თუმცა ეს არ არის აუცილებელი",
        "tooltip-ca-talk": "შიგთავსის გვერდის განხილვა",
-       "tooltip-ca-edit": "á\83\97á\83¥á\83\95á\83\94á\83\9c á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90. á\83\92á\83\97á\83®á\83\9dá\83\95á\83\97 á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\9dá\83\97  á\83¬á\83\98á\83\9cá\83\90á\83¡á\83¬á\83\90á\83 á\83\98 á\83®á\83\94á\83\93á\83\95á\83\98á\83¡ á\83¦á\83\98á\83\9aá\83\90á\83\99á\83\98 á\83¡á\83\90á\83\9cá\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83¡ á\83¨á\83\94á\83\98á\83\9cá\83\90á\83®á\83\90á\83\95á\83\97.",
+       "tooltip-ca-edit": "á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90",
        "tooltip-ca-addsection": "ახალი სექციის შექმნა",
        "tooltip-ca-viewsource": "გვერდი დაცულია. შეგიძლიათ იხილოთ მისი წყარო.",
        "tooltip-ca-history": "ამ გვერდის ბოლო ვერსიები.",
        "tooltip-ca-nstab-main": "შინაარსის ჩვენება",
        "tooltip-ca-nstab-user": "მომხმარებლის გვერდის ჩვენება",
        "tooltip-ca-nstab-media": "მედია-ფაილი",
-       "tooltip-ca-nstab-special": "ეს სპეციალური გვერდია. მისი რედაქტირება არ შეგიძლიათ.",
+       "tooltip-ca-nstab-special": "ეს სპეციალური გვერდია და მისი რედაქტირება შეუძლებელია",
        "tooltip-ca-nstab-project": "იხილეთ პროექტის გვერდი",
        "tooltip-ca-nstab-image": "სურათის გვერდის ჩვენება",
        "tooltip-ca-nstab-mediawiki": "იხილე სისტემური შეტყობინება",
        "spam_reverting": "დაბრუნება ბოლო ვერსიასთან, რომელიც არ შეიცავს ბმულს $1-თან",
        "spam_blanking": "ყველა გვერდი შეიცავს ბმულს $1-გვერდზე. გასუფთავება",
        "spam_deleting": "ყველა ვერსია შეიცავდა ბმულს $1-ზე, მიმდინარეობს წაშლა",
-       "simpleantispam-label": "სპამის საწინააღმდეგო შემოწმება.\nეს '''არ''' შეავსოთ!",
+       "simpleantispam-label": "სპამის საწინააღმდეგო შემოწმება.\nეს <strong>არ</strong> შეავსოთ!",
        "pageinfo-title": "ინფორმაცია „$1“-თვის",
        "pageinfo-not-current": "ბოდიში, ეს ინფორმაცია შეიძლება არ იყოს ძველ ვერსიებში.",
        "pageinfo-header-basic": "საბაზისო ინფორმაცია",
index 049cc74..610c9c2 100644 (file)
        "category-file-count-limited": "Ағымдағы санатта келесі $1 файл бар.",
        "listingcontinuesabbrev": "(жалғ.)",
        "index-category": "Индекстелген беттер",
-       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмеген беттер",
+       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмейÑ\82Ñ\96н беттер",
        "broken-file-category": "Ақаулы файлдық сілтемелері бар беттер",
        "about": "Жоба туралы",
        "article": "Мағлұмат беті",
        "createaccountreason": "Себебі:",
        "createacct-reason": "Себебі:",
        "createacct-reason-ph": "Неге басқа тіркегі жасамақшысыз",
-       "createacct-captcha": "Құпиялық тексеруі",
-       "createacct-imgcaptcha-ph": "Жоғарыдағы мәтінді енгізіңіз",
        "createacct-submit": "Тіркелгіңізді жасаңыз",
        "createacct-another-submit": "Тіркелгі жасау",
        "createacct-benefit-heading": "{{SITENAME}} сіздермен жасалады.",
        "upload-dialog-button-done": "Бітті",
        "upload-dialog-button-save": "Сақтау",
        "upload-dialog-button-upload": "Жүктеу",
-       "upload-process-error": "Белгісіз қате кездесті",
-       "upload-process-warning": "Ескерту кездесті",
        "upload-form-label-select-file": "Файлды таңдау",
        "upload-form-label-infoform-title": "Егжей-тегжейі",
        "upload-form-label-infoform-name": "Атауы",
        "mimesearch-summary": "Бұл бетте файлдарды MIME түрімен сүзгілеуі қосылған.\nКірісі: мағлұмат_түрі/түр_тарауы не мағлұмат_түрі/*, мысалы <code>image/jpeg</code>.",
        "mimetype": "MIME түрі:",
        "download": "Түсіріп алу",
-       "unwatchedpages": "Бақыланылмаған беттер",
+       "unwatchedpages": "Бақыланбаған беттер",
        "listredirects": "Айдағыш бет тізімі",
        "listduplicatedfiles": "Телнұсқалы файлдар тізімі",
        "listduplicatedfiles-summary": "Бұл кейбір басқа файлдың ең соңғы нұсқалы файлдың ең соңғы телнұсқасы файлдардың тізімі. Тек жергілікті файлдар есептелінеді.",
        "specialpage-empty": "Бұл сұраныс бойынша нәтиже жоқ.",
        "lonelypages": "Еш беттен сілтелмеген беттер",
        "lonelypagestext": "Келесі беттерге {{SITENAME}} жобасындағы басқа беттерінің ішіндегі кірікбеттер сілтемейді.",
-       "uncategorizedpages": "СанаÑ\82Ñ\81Ñ\8bз беттер",
+       "uncategorizedpages": "СанаÑ\82Ñ\82алмаÒ\93ан беттер",
        "uncategorizedcategories": "Санатсыз санаттар",
        "uncategorizedimages": "Санатсыз файлдар",
        "uncategorizedtemplates": "Санатсыз үлгілер",
index 90338d8..af5b715 100644 (file)
@@ -22,6 +22,7 @@
        "tog-hideminor": "លាក់​កំណែប្រែតិចតួច​ពីបញ្ជីបន្លាស់ប្ដូរថ្មីៗ",
        "tog-hidepatrolled": "លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពីបញ្ជីបន្លាស់ប្ដូរ​ថ្មីៗ",
        "tog-newpageshidepatrolled": "លាក់​ទំព័រ​ដែល​បាន​ល្បាតពី​បញ្ជី​ទំព័រ​ថ្មី",
+       "tog-hidecategorization": "លាក់ការដាក់ចំណាត់ថ្នាក់ក្រុមទំព័រ",
        "tog-extendwatchlist": "ពន្លាត​បញ្ជីតាមដាន​ដើម្បី​បង្ហាញ​គ្រប់​បន្លាស់ប្ដូរទាំងអស់ មិន​មែន​ត្រឹមតែ​បន្លាស់ប្ដូរថ្មី​ៗ​នោះ​ទេ",
        "tog-usenewrc": "បន្លាស់ប្ដូរជាក្រុមតាមទំព័រក្នុងបន្លាស់ប្តូរថ្មីៗនិងបញ្ជីតាមដាន",
        "tog-numberheadings": "ដាក់លេខ​ចំណងជើងរង​ដោយស្វ័យប្រវត្តិ",
@@ -51,6 +52,7 @@
        "tog-watchlisthideliu": "លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់ដែលបានកត់ឈ្មោះចូលពីបញ្ជីតាមដាន",
        "tog-watchlisthideanons": "លាក់កំណែប្រែរបស់អ្នកប្រើប្រាស់អនាមិកពីបញ្ជីតាមដាន",
        "tog-watchlisthidepatrolled": "លាក់​កំណែប្រែ​ដែល​បាន​ល្បាតពី​បញ្ជីតាមដាន",
+       "tog-watchlisthidecategorization": "លាក់ការដាក់ចំណាត់ថ្នាក់ក្រុមទំព័រ",
        "tog-ccmeonemails": "ផ្ញើច្បាប់ចម្លង​អ៊ីមែលដែលខ្ញុំផ្ញើទៅកាន់អ្នកប្រើប្រាស់ផ្សេងទៀតមកខ្ញុំខ្លួនឯងផងដែរ",
        "tog-diffonly": "កុំបង្ហាញខ្លឹមសារទំព័រនៅពីក្រោមតារាងប្រៀបធៀបចំណុចខុសគ្នា",
        "tog-showhiddencats": "បង្ហាញចំណាត់ថ្នាក់ក្រុមដែលត្រូវបានលាក់",
        "createaccountreason": "មូលហេតុ៖",
        "createacct-reason": "មូលហេតុ",
        "createacct-reason-ph": "មូលហេតុដែលអ្នកចង់បង្កើតគណនីមួយទៀត",
-       "createacct-captcha": "ត្រួតពិនិត្យសុវត្ថិភាព",
-       "createacct-imgcaptcha-ph": "បញ្ចូលឃ្លាដែលអ្នកឃើញខាងលើ",
        "createacct-submit": "បង្កើតគណនីរបស់អ្នក",
        "createacct-another-submit": "បង្កើតគណនី",
        "createacct-benefit-heading": "{{SITENAME}} ត្រូវបង្កើតឡើងដោយបុគ្គលស្ម័គ្រចិត្តដូចជាអ្នកជាដើម។",
        "sig_tip": "ហត្ថលេខា​របស់អ្នកជាមួយនឹងកាលបរិច្ឆេទ",
        "hr_tip": "បន្ទាត់ដេក (មិនសូវប្រើទេ)",
        "summary": "ចំណារពន្យល់៖",
-       "subject": "ប្រធានបទ/ចំណងជើងរង:",
+       "subject": "ប្រធានបទ",
        "minoredit": "នេះជា​កំណែប្រែតិចតួចប៉ុណ្ណោះ",
        "watchthis": "តាមដាន​ទំព័រនេះ",
        "savearticle": "រក្សាទំព័រទុក",
        "missingsummary": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ចំណារពន្យល់អំពីកំណែប្រែនេះទេ។\n\nបើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានចំណារពន្យល់។",
        "selfredirect": "<strong>ប្រយ័ត្ន៖</strong> អ្នកកំពុងតែបញ្ជូនបន្តទំព័រនេះទៅកាន់ទំព័រខ្លួនឯង។\n\nប្រហែលជាអ្នកបានផ្ដល់ទំព័រគោលដៅសម្រាប់បញ្ជូនបន្តខុខ ឬប្រហែលជាអ្នកកំពុងកែប្រែទំព័រខុស។\nបើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀត តំណភ្ជាប់បញ្ជូនបន្តនឹងត្រូវបង្កើតឡើងបែបនេះ។",
        "missingcommenttext": "សូមវាយបញ្ចូលយោបល់មួយនៅខាងក្រោម។",
-       "missingcommentheader": "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99á\9e\93á\9e¼á\9e\9c á\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84 á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\91á\9f\81á\9f\94\ná\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9e\85 \"{{int:savearticle}}\" á\9e\98á\9f\92á\9e\8aá\9e\84á\9e\91á\9f\80á\9e\8fនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
+       "missingcommentheader": "'''á\9e\9aá\9f\86á\9e\9bá\9e¹á\9e\80á\9f\96''' á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e\91á\9e¶á\9e\93á\9f\8bá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\98á\9e\8fá\9e·á\9e\99á\9f\84á\9e\94á\9e\9bá\9f\8bá\9e\93á\9f\81á\9f\87á\9e\91á\9f\81á\9f\94\ná\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e»á\9e\85 \"{{int:savearticle}}\" á\9e\98á\9f\92á\9e\8aá\9e\84á\9e\91á\9f\80á\9e\8f នោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
        "summary-preview": "ការមើលជាមុនរបស់ចំណារពន្យល់:",
-       "subject-preview": "ការមើលជាមុនរបស់ប្រធានបទ/ចំណងជើង:",
+       "subject-preview": "ការមើលជាមុនរបស់ប្រធានបទ",
        "previewerrortext": "មានបញ្ហាកើតឡើងពេលព្យាយាមើលជាមុនបន្លាស់ប្ដូររបស់អ្នក។",
        "blockedtitle": "អ្នកប្រើនេះត្រូវបានហាមឃាត់ហើយ",
        "blockedtext": "'''ឈ្មោះគណនីឬអាសយដ្ឋានIPរបស់អ្នកស្ថិតក្រោមការហាមឃាត់ហើយ។'''\n\nការហាមឃាត់ត្រូវបានធ្វើដោយ $1\n\nដោយសំអាងលើហេតុផល ''$2''។\n\n\n* ចាប់ផ្ដើមការហាមឃាត់ ៖ $8\n* ផុតកំណត់ការហាមឃាត់ ៖ $6\n* គណនីហាមឃាត់់ ៖ $7\n\n\nអ្នកអាចទាក់ទងទៅ $1 ឬ [[{{MediaWiki:Grouppage-sysop}}|អ្នកអភិបាល]]ដទៃទៀតដើម្បីពិភាក្សាពីការហាមឃាត់នេះ ។\n\nអ្នកមិនអាចប្រើប្រាស់មុខងារ \"អ៊ីមែលទៅអ្នកប្រើប្រាស់នេះ\" បានទេ លើកលែងតែអាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ​ត្រូវបានផ្ដល់អោយក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]​របស់លោកអ្នកហើយលោកអ្នកមិនត្រូវបានគេហាមឃាត់មិនឱ្យប្រើប្រាស់មុខងារនោះ។\n\nអាសយដ្ឋានIPបច្ចុប្បន្នរបស់លោកអ្នកគឺ $3 និងអត្តលេខហាមឃាត់គឺ #$5 ។\n\nសូមបញ្ចូលព័ត៌មានលំអិតទាំងអស់ខាងលើនេះ ក្នុងអ៊ីមែលទាក់ទងនឹងបញ្ហានេះ។",
        "prefs-watchlist-token": "កូនសោរបញ្ជីតាមដាន៖",
        "prefs-misc": "ផ្សេងៗ",
        "prefs-resetpass": "ប្តូរពាក្យសម្ងាត់",
-       "prefs-changeemail": "ផ្លាស់ប្ដូរអ៊ីមែល",
+       "prefs-changeemail": "á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¬á\9e\9bá\9e»á\9e\94á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b",
        "prefs-setemail": "ដាក់អាសយដ្ឋានអ៊ីមែលមួយ",
        "prefs-email": "ជម្រើសទាក់ទិននឹងអ៊ីមែល",
        "prefs-rendering": "ការរចនា",
        "rcshowhidemine": "$1កំណែប្រែរបស់ខ្ញុំ",
        "rcshowhidemine-show": "បង្ហាញ",
        "rcshowhidemine-hide": "លាក់",
+       "rcshowhidecategorization-show": "បង្ហាញ​",
+       "rcshowhidecategorization-hide": "លាក់",
        "rclinks": "បង្ហាញបន្លាស់ប្ដូរ$1ចុងក្រោយធ្វើឡើងក្នុងរយៈពេល$2ថ្ងៃចុងក្រោយ<br />$3",
        "diff": "ប្រៀបធៀប",
        "hist": "ប្រវត្តិ",
        "upload-dialog-button-done": "រួចរាល់",
        "upload-dialog-button-save": "រក្សាទុក",
        "upload-dialog-button-upload": "ផ្ទុកឡើង",
-       "upload-process-error": "មានបញ្ហាកើតឡើង",
-       "upload-process-warning": "មានការព្រមាន",
        "upload-form-label-select-file": "ជ្រើសរើសឯកសារ",
        "upload-form-label-infoform-title": "ព័ត៌មាន​លំអិត",
        "upload-form-label-infoform-name": "ឈ្មោះ​",
index 0bb2640..042f8c6 100644 (file)
                        "Leeheonjin",
                        "Hwangjy9",
                        "Kurousagi",
-                       "Macofe"
+                       "Macofe",
+                       "Yearning"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "tog-hideminor": "최근 바뀜에서 사소한 편집을 숨기기",
        "tog-hidepatrolled": "최근 바뀜에서 점검한 편집을 숨기기",
        "tog-newpageshidepatrolled": "새 문서 목록에서 검토한 문서를 숨기기",
+       "tog-hidecategorization": "페이지 종류 숨기기",
        "tog-extendwatchlist": "주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기",
        "tog-usenewrc": "최근 바뀜과 주시문서 목록의 문서별 그룹 바뀜",
        "tog-numberheadings": "자동으로 머릿글 번호 매기기",
@@ -89,6 +91,7 @@
        "tog-watchlisthideliu": "주시문서 목록에서 로그인한 사용자의 편집을 숨기기",
        "tog-watchlisthideanons": "주시문서 목록에서 익명 사용자의 편집을 숨기기",
        "tog-watchlisthidepatrolled": "주시문서 목록에서 점검한 편집을 숨기기",
+       "tog-watchlisthidecategorization": "페이지 종류 숨기기",
        "tog-ccmeonemails": "이메일을 보낼 때 내 이메일로 복사본을 보내기",
        "tog-diffonly": "편집 차이를 비교할 때 문서 내용을 보지 않기",
        "tog-showhiddencats": "숨은 분류 보이기",
        "createaccountreason": "이유:",
        "createacct-reason": "이유",
        "createacct-reason-ph": "왜 다른 계정을 만들어야 합니까",
-       "createacct-captcha": "보안 검사",
-       "createacct-imgcaptcha-ph": "위에 보이는 텍스트를 입력하세요",
        "createacct-submit": "계정 만들기",
        "createacct-another-submit": "계정 만들기",
        "createacct-benefit-heading": "{{SITENAME}} 프로젝트는 여러분과 같은 사람들이 만듭니다.",
        "nonunicodebrowser": "<strong>경고: 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.</strong>\n아스키가 아닌 문자가 16진수 코드로 나타날 수 있습니다.",
        "editingold": "<strong>경고: 이 문서의 오래된 판을 편집하고 있습니다.</strong>\n이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.",
        "yourdiff": "차이",
-       "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
+       "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
        "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
        "editpage-cannot-use-custom-model": "이 문서의 콘텐츠 모델은 변경될 수 없습니다.",
        "longpageerror": "'''오류: 문서의 크기가 {{PLURAL:$1|$1킬로바이트}}로 최대 크기인 {{PLURAL:$2|$2킬로바이트}}보다 큽니다.'''\n저장할 수 없습니다.",
        "showingresultsinrange": "#<strong>$2</strong>부터 #<strong>$3</strong>까지의 범위에서 <strong>$1</strong>개의 {{PLURAL:$1|결과}}가 아래에 보입니다.",
        "search-showingresults": "{{PLURAL:$4|결과 <strong>$3</strong>개 중 <strong>$1</strong>개|결과 <strong>$3</strong>개 중 <strong>$1 - $2</strong>개}}",
        "search-nonefound": "검색어와 일치하는 결과가 없습니다.",
+       "search-nonefound-thiswiki": "이 사이트에서 검색어와 일치하는 결과가 없습니다.",
        "powersearch-legend": "고급 검색",
        "powersearch-ns": "다음 이름공간에서 검색:",
        "powersearch-togglelabel": "확인:",
        "prefs-help-recentchangescount": "이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.",
        "prefs-help-watchlist-token2": "내 주시문서 목록의 웹 피드의 비밀 키입니다.\n비밀 키를 알고 있는 사람은 내 주시문서 목록을 읽읅 수 있으니 비밀 키를 알리지 마세요.\n[[Special:ResetTokens|비밀 키를 재설정해야 한다면 여기를 클릭하세요]].",
        "savedprefs": "설정을 저장했습니다.",
+       "savedrights": "$1의 사용자 권한이 저장되었습니다.",
        "timezonelegend": "시간대:",
        "localtime": "현지 시각:",
        "timezoneuseserverdefault": "위키 기본값 사용 ($1)",
        "right-autopatrol": "자신의 편집을 자동으로 점검된 판으로 표시",
        "right-patrolmarks": "최근 바뀜에서 점검 표시를 보기",
        "right-unwatchedpages": "주시되지 않은 문서 목록 보기",
-       "right-mergehistory": "문서의 역사를 합침",
+       "right-mergehistory": "문서 역사를 합치기",
        "right-userrights": "사용자의 모든 권한 조정",
        "right-userrights-interwiki": "다른 위키의 사용자 권한을 조정",
        "right-siteadmin": "데이터베이스를 잠그거나 잠금 해제",
        "rcshowhidemine": "내 편집을 $1",
        "rcshowhidemine-show": "보이기",
        "rcshowhidemine-hide": "숨기기",
+       "rcshowhidecategorization-show": "보이기",
+       "rcshowhidecategorization-hide": "숨기기",
        "rclinks": "최근 $2일간의 $1개 바뀐 문서 보기<br />$3",
        "diff": "차이",
        "hist": "역사",
        "upload-dialog-button-done": "완료",
        "upload-dialog-button-save": "저장",
        "upload-dialog-button-upload": "올리기",
-       "upload-process-error": "오류가 발생했습니다",
-       "upload-process-warning": "경고가 일어났습니다",
        "upload-form-label-select-file": "파일을 선택해주세요.",
        "upload-form-label-infoform-title": "자세한 사항",
        "upload-form-label-infoform-name": "이름",
        "logentry-tag-update-add-logentry": "$1 사용자가 $3 문서의 기록 항목 $5에 $6 {{PLURAL:$7|태그}}를 {{GENDER:$2|추가했습니다}}",
        "logentry-tag-update-remove-revision": "$1 사용자가 $3 문서의 $4판에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
        "logentry-tag-update-remove-logentry": "$1 사용자가 $3 문서의 기록 항목 $5에서 $8 {{PLURAL:$9|태그}}를 {{GENDER:$2|제거했습니다}}",
-       "logentry-tag-update-revision": "$1 사용자가 $3 문서의 $4 판에서 태그를 수정했습니다 ($6을(를) {{PLURAL:$7|추가함}}; $8을(를) {{PLURAL:$9|제거함}})",
+       "logentry-tag-update-revision": "$1 사용자가 $3 문서의 $4 판에서 태그를 {{GENDER:$2|수정했습니다}} ($6을(를) {{PLURAL:$7|추가함}}; $8을(를) {{PLURAL:$9|제거함}})",
        "rightsnone": "(없음)",
        "revdelete-summary": "편집 요약",
        "feedback-adding": "문서에 피드백을 올리는 중...",
index e24f877..7fbbd03 100644 (file)
        "history_short": "Väsjohne",
        "updatedmarker": "(jeändert)",
        "printableversion": "För ze Dröcke",
-       "permalink": "Ne Permalink noh heh",
+       "permalink": "Permalengk noh heh",
        "print": "Drocke",
        "view": "Beloore",
        "view-foreign": "Op $1 beloohre",
        "edit-local": "Aanmärkonge heh em Wikki beärbeide",
        "create": "Aanlähje",
        "create-local": "Aanmärkonge heh em Wikki derbei donn",
-       "editthispage": "De Sigg ändere",
+       "editthispage": "De Sigg änndere",
        "create-this-page": "Neu aanläje",
        "delete": "Fottschmieße",
        "deletethispage": "De Sigg fottschmieße",
        "createaccountreason": "Jrond:",
        "createacct-reason": "Der Jrond udder Aanlaß",
        "createacct-reason-ph": "Woröm deihs De noch ene Zohjang aanlääje?",
-       "createacct-captcha": "Zor Sescherheit",
-       "createacct-imgcaptcha-ph": "Jiv dä Täx en, dä De heh drövver sühs!",
        "createacct-submit": "Lohß Jonn!",
-       "createacct-another-submit": "Donn jäz enne zohsäjlejje Zohjang aanlääje",
+       "createacct-another-submit": "Donn jäz enne zohsäzlejje Zohjang aanlääje",
        "createacct-benefit-heading": "{{ucfirst:{{GRAMMAR:Nominative|{{ucfirst:{{SITENAME}}}}}}}} weed vun Minsche wi Dir jemaat.",
        "createacct-benefit-body1": "{{PLURAL:$1|Änderong|Änderonge|Änderonge }}",
        "createacct-benefit-body2": "{{PLURAL:$1|Sigg|Sigge|Sigge }}",
        "passwordreset-emailsent-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh es verschek woode. Heh dronger kanns De se lässe.",
        "passwordreset-emailerror-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh sullt verschek wääde, ävver dat Verscheke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1",
        "changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
-       "changeemail-header": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere",
+       "changeemail-header": "Donn heh dat Fommulaa ußfölle, öm Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze ändere. Wann De en Adräß loß wähde wells, maach dat Fäld läddesch, ih dat De dat Fommolaa loß scheks.",
+       "changeemail-passwordrequired": "Do moß Ding Paßwood enjävve, öm di Änderong ze beschtähteje.",
        "changeemail-no-info": "Do mööts ald enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
        "changeemail-oldemail": "Ding Address för de <i lang=\"en\">e-mail</i> es jäz:",
        "changeemail-newemail": "Ding neue Address för de <i lang=\"en\">e-mail</i> sull wääde:",
+       "changeemail-newemail-help": "Dat Fäld heh sullt läddesch blihve, wann De Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> loß wähde wells. Do kanns Ding Paßwoot nit neu automattesch neu verjävve lohße, wann et fodd es, un kanns och kein <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> vum WIkki krijje, wann heh di Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> fodd es.",
        "changeemail-none": "(kein)",
        "changeemail-password": "Ding Passwoot {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}}:",
        "changeemail-submit": "Lohß jonn!",
        "sig_tip": "Dinge Nahme, med de Uhrzigk unn_em Dattum",
        "hr_tip": "En Querlinnich",
        "summary": "Koot zosammejefaß, Quäll:",
-       "subject": "Ã\9cvverschreff - wodröm jeiht et?",
+       "subject": "Ã\96vverschreff - wodröm jeiht et?",
        "minoredit": "Dat es en klein Änderong (mini)",
        "watchthis": "Op di Sigg heh oppaßße",
        "savearticle": "De Sigg Avspeichere",
        "missingsummary": "<strong>Opjepass:</strong> Do häs nix bei „{{int:summary}}“ enjejovve. Dun noch ens op „{{int:savearticle}}“ klicke, öm Ding Änderunge ohne de Zosammefassung ze Speichere. Ävver besser jiss De do jetz tirek ens jet en!",
        "selfredirect": "<strong>Opjepaß:</strong> Do wells heh di Sigg op sesch sällver ömleide lohße.\nDat hät zwa keine rääschte Senn, ävver wann De jäz norr_enz op „{{int:savearticle}}“ klecks, weed dat esu jemaat.",
        "missingcommenttext": "Jevv en „Koot Zosammejefass, Quell“ aan!",
-       "missingcommentheader": "'''Opjepass:''' Do häs kein Üvverschreff för Dinge Beidrach enjejovve. Wann De noch ens op „{{int:savearticle}}“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
+       "missingcommentheader": "<strong>Opjepass:</strong> Do häs kein Övverschreff för Dinge Beidrach enjejovve.\nWann De noch ens op „{{int:savearticle}}“ dröcks, weed Dinge Beidrach der ohne avjespeichert.",
        "summary-preview": "Vör-Aansich vun „Koot Zosammejefass, Quell“:",
-       "subject-preview": "Vör-Aansich vun de Üvverschreff:",
+       "subject-preview": "Vöraff-Aanseesch vun dä Övverschreff:",
        "previewerrortext": "Ene Fähler es beim Versohch opjetrodde, de Sigg met de Änderonge aanzezeije.",
        "blockedtitle": "Dä Metmaacher es jesperrt",
        "blockedtext": "'''Dinge Metmaacher-Nahme oder IP Adress es vun „$1“ jesperrt woode.'''\n\nAls Jrund es enjedrage: „''$2''“\n\nDo kanns heh em Wiki immer noch lässe. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, udder Sigge ändere wells, denn doför bes De jäz jeschperrt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''E-Mail aan dä Metmaacher''“ aanwände, wann De ald en E-Mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et E-mail schecke nit metjesperrt es.\n\nDun en Ding Aanfroge nenne:\n* Dä Wikki-Köhbeß, dä jeschpächt hät: $1\n* Der Jrond för et Schpärre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Schpärr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 Logbohch met de Schpärre]</span> loore.",
        "permissionserrors": "Dat jeit nit, dat darfs De nit.",
        "permissionserrorstext": "Do häs nit dat Rääch, dat ze maache, {{PLURAL:$1|dä Jrund es:|de Jründe sin:|oohne Jrund.}}",
        "permissionserrorstext-withaction": "Do häs nit dat Rääch $2, {{PLURAL:$1|dä Jrond es:|de Jrönde sin:|ävver ohne aanjävbahre Jrond.}}",
+       "contentmodelediterror": "Di Väsjohn kam_mer nit änndere, weil its content model is <code>$1</code>, but the current content model of the page is <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Opjepaß:''' Do bes om bäste Wääsch, en Sigg neu aanzelähje, di doför ald ens fottjeschmeße woode wohr.\n\nBes förseschtesch un övverlääsch Der, of dat en johde Ideh es, di Sigg widder opzemaache. Domet De Bescheid weiß, heh de Endrääsh em Logbohch vum Sigge-Ömnänne, un em Logbohch vum Sigge-Fottschmihße mem Jrond, woröm di Sigg dohmohls fottjeschmeße woode es:",
        "moveddeleted-notice": "Heh di Sigg es fottjeschmeße.\nE Schtök uß dä Logböhscher fum Sigge_Fottschmihße un fum Sigge-Ömnänne för di Sigg kütt jäz, en dä Hoffnung, dat dat hellef.",
+       "moveddeleted-notice-recent": "Schahd, di Sigg wohd en de läzde 24 Schtonde fottjeschmeße.\nDe Enndrähsch för heh di Sigg em Logbohch fum Sigge Fottschmiiße un Ömnänne küntt heh för zom Nohlohre.",
        "log-fulllog": "Donn dat janze Logbohch aanlohre",
        "edit-hook-aborted": "Et Ändere wood affjebroche övver ene sujenannte „Hoke“ en de ẞoffwäer.\nEne Jrond weße mer nit.",
        "edit-gone-missing": "Kunnt di Sigg nit änndere. Se schingk verschwunde un weed fottjeschemeße woode sin.",
        "prefs-help-recentchangescount": "Dat ömfaß de „{{int:recentchanges}}“, de Versione uß de Fojangeheit, un de Logbööcher.",
        "prefs-help-watchlist-token2": "Dat heh es dä jeheime Schlößel för dä <i lang=\"en\" xml:lang=\"en\">Atom</i>- udder <i lang=\"en\" xml:lang=\"en\">RSS</i>-Kanaal met de Änderonge aan Sigge en Dinger Oppaßleß\nWä dä kännt, kann Ding Oppaßleß lässe, alsu halld_en för Desch.\nDo kann Der [[Special:ResetTokens|ene neue Schlößel maache lohße]], wann nüüdesch.",
        "savedprefs": "Ding Ennschtällonge sin jäz jeseeschert.",
+       "savedrights": "De Jroppeääschte för {{GENDER:$1|dä|et|dä Metmaacher|di Metmaacherėn|dät}} en sen jäz faßjehallde.",
        "timezonelegend": "Ziggzohn:",
        "localtime": "De Zigg op Dingem Kompjuter:",
        "timezoneuseserverdefault": "Nemm däm ẞööver sing Zigg ($1)",
        "group-bot": "Bots",
        "group-sysop": "Wiki-Köbesse",
        "group-bureaucrat": "Bürrokrahde",
-       "group-suppress": "Kontrollettis",
+       "group-suppress": "Verschteijscher",
        "group-all": "(jeede)",
        "group-user-member": "{{GENDER:$1|Metmaacher|Metmaacherėn}}",
        "group-autoconfirmed-member": "automattesch beschtähteschte {{GENDER:$1|Metmaacher|Metmaacherėn|Metmaacher|Metmaacherėn|Metmaacher}}",
        "group-bot-member": "{{GENDER:$1|Bot}}",
        "group-sysop-member": "{{GENDER:$1|Wiki-Köbes}}",
        "group-bureaucrat-member": "{{GENDER:$1|Bürrokraad|Bürrokraadefrou}}",
-       "group-suppress-member": "{{GENDER:$1|Kontrolletti}}",
+       "group-suppress-member": "Ongerdröcker{{GENDER:$1}}",
        "grouppage-user": "{{ns:project}}:Metmaacher",
        "grouppage-autoconfirmed": "{{ns:project}}:Bestätichte Metmaacher",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Wiki Köbes",
        "grouppage-bureaucrat": "{{ns:project}}:Bürrokrahd",
-       "grouppage-suppress": "{{ns:project}}:Kontrolletti",
+       "grouppage-suppress": "{{ns:project}}:Verscheijsche",
        "right-read": "Sigge lesse",
        "right-edit": "Sigge ändere",
        "right-createpage": "Neu Sigge, ävver kein Klaafsigge, aanlääje",
        "right-editmywatchlist": "De eije Oppaßleß ändere. Opjepaß: e paa Axjuhne donn Sigge en di Less_eren, och der ohne dat Rääsch.",
        "right-viewmyprivateinfo": "ding eije päsöhnlesche Dahte belohre, wi de Adräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> udder Dinge ääschte Nahme",
        "right-editmyprivateinfo": "ding eije päsöhnlesche Dahte ändere, wi de Adräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> udder der ääschte Nahme",
-       "right-editmyoptions": "De eije Enschtällonge ändere",
+       "right-editmyoptions": "De eije Enschtällonge änndere",
        "right-rollback": "All de letzte Ännderonge vum läzde Metmaacher aan ene Sigg retuhr maache",
        "right-markbotedits": "Retuhr jenumme Ännderonge als Ännderonge vun Bots makkehre",
        "right-noratelimit": "Kein Beschränkonge dorsch Jränze (<i lang=\"en\">[http://www.mediawiki.org/wiki/Manual:%24wgRateLimits $wgRateLimits]</i>)",
        "rcshowhidebots": "de Bots ehr Änderonge $1",
        "rcshowhidebots-show": "aanzeije",
        "rcshowhidebots-hide": "verschteihsche",
-       "rcshowhideliu": "de aanjemällte Metmaacher ehr Änderonge $1",
+       "rcshowhideliu": "$1 de aanjemällte Metmaacher ehr Änderonge",
        "rcshowhideliu-show": "aanzeije",
        "rcshowhideliu-hide": "verschteihsche",
-       "rcshowhideanons": "de nahmelohse Metmaacher ehr Änderonge $1",
+       "rcshowhideanons": "$1 de nahmelohse Metmaacher ehr Änderonge",
        "rcshowhideanons-show": "aanzeije",
        "rcshowhideanons-hide": "verschteihsche",
        "rcshowhidepatr": "de nohjeluhrte Änderonge $1",
        "upload-dialog-button-done": "Jedonn",
        "upload-dialog-button-save": "Faßhalde",
        "upload-dialog-button-upload": "Lohß Jonn!",
-       "upload-process-error": "Ene Fähler es opjetrodde",
-       "upload-process-warning": "En Warnong wood ußjejovve.",
        "upload-form-label-select-file": "De ußjesöhk Dattei",
        "upload-form-label-infoform-title": "Eijnzelheijte",
        "upload-form-label-infoform-name": "Nahme",
        "foreign-structured-upload-form-label-own-work": "dat es ming eije Wärk",
        "foreign-structured-upload-form-label-infoform-categories": "Saachjroppe",
        "foreign-structured-upload-form-label-infoform-date": "Dattum",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Do künnts edd och ens met dä [[Special:Upload|Schtandatt-Sigg zom Huhlahde]] versöhke welle.",
        "foreign-structured-upload-form-label-own-work-message-default": "Esch verschtonn, dadd esch en en jemeinsamme Sammlong huh aam lahde ben un dadd sesch dat met dä Bedengonge un de Lezänzbedengonge heh verdräht.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei de Rähjelle ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
        "backend-fail-stream": "Mer kunnte di Dattei $1 nit övverdraare.",
        "uploadstash-refresh": "De Leß met de Dateie op ene neue Shtand bränge",
        "invalid-chunk-offset": "Ene onjöltijje Aanfangspungk för dä Rötsch",
        "img-auth-accessdenied": "Keine Zohjang",
-       "img-auth-nopathinfo": "De <code lang=\"en\">PATH_INFO</code> fäählt.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code lang=\"en\">CGI</code> opjebout sin, un dröm <code lang=\"en\">img_auth</code> nit ongshtöze künne. Loor em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Handbooch] noh, wat domet es.",
+       "img-auth-nopathinfo": "De <code xml:lang=\"en\" lang=\"en\">PATH_INFO</code> fäält.\nDä Webßööver es nit doför ennjerescht, di Ennfommazjuhn wigger ze jävve.\nHä künnd_op <code lang=\"en\">CGI</code> opjebout sin, un dröm <code lang=\"en\">img_auth</code> nit ongschtöze künne. Loor em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization Handbooch] noh, wat domet es.",
        "img-auth-notindir": "Dä aanjefroochte Pat is nit em enjeschtallte Verzeischneß för et Huhlaade.",
        "img-auth-badtitle": "Uß „$1“ löht sesch kein jöltijje Övverschreff maache.",
        "img-auth-nologinnWL": "Do bes nit ennjelogg, un „$1“ es nit op dä Leß met de zohjelohße Datteiname.",
        "mostinterwikis": "Atikkele met de miehste Engerwikilengks",
        "mostrevisions": "Atikkele met de mihste Änderonge",
        "prefixindex": "Alle Sigge, dänne ehr Nahme med enem beschtemmpte Wood udder Täx aanfängk",
-       "prefixindex-namespace": "All Sigge med enem beschtemmpte Aanfang (Appachtemang $1 )",
+       "prefixindex-namespace": "Alle Sigge med enem beschtemmpte Aanfang em Appachtemang „$1“",
        "prefixindex-strip": "Donn der jemeinsamme Aanfang vun dä Tetelle en dä Leß fottlohße.",
        "shortpages": "Atikele zoteet vun koot noh lang",
        "longpages": "Atikele zoteet vun lang noh koot",
        "nopagetext": "Do häss en Sigg aanjovve, di jidd et jaa nit.",
        "pager-newer-n": "{{PLURAL:$1|aller neuerste|neuer $1}}",
        "pager-older-n": "{{PLURAL:$1|vörrije|vörrije $1}}",
-       "suppress": "Versteiche",
+       "suppress": "Ongerdröke",
        "querypage-disabled": "Heh di {{int:specialpage}} es ußjeschalldt, domet dä ẞööver jät winnijer ze brassele hät.",
        "apihelp": "Hölp för de <i lang=\"en\" xml:lang=\"en\" title=\"Application Programmers Interface\">API</i>",
        "apihelp-no-such-module": "Et Moduhl „$1“ wood nit jefonge.",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "log-edit-tags": "Donn de Makehronge vun de ußjesöhk Enndrähsch em Logbohch beärbeide",
-       "allpages": "All Sigge",
+       "allpages": "Alle Sigge",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "allpagesfrom": "Sigge aanzeije av däm Nahme:",
        "allpagesto": "Sigge aanzeije bes:",
        "allarticles": "All Atikkele",
-       "allinnamespace": "All Sigge (Em Appachtemeng „$1“)",
+       "allinnamespace": "Alle Sigge em Appachtemeng „$1“",
        "allpagessubmit": "Lohß Jonn!",
        "allpagesprefix": "Sigge zeije, wo dä Name aanfängk met:",
        "allpagesbadtitle": "Dä Siggenahme es nit ze jebruche. Dä hät e Köözel för en Schprohch uder för ene Engerwikki_Lengk am Aanfang, uder et kütt e Zeijsche dren för, wat en SiggenaHme nit jeiht, velleijsch och mih wie\neins vun all dämm op eimohl.",
        "emailccsubject": "En Kopie vun Dinger E-Mail aan $1: $2",
        "emailsent": "De <i lang=\"en\">e-mail</i> es ongerwähs",
        "emailsenttext": "Ding E-Mail es jetz lossjescheck woode.",
-       "emailuserfooter": "Hee di e-mail hät dä „$1“ an dä „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.",
+       "emailuserfooter": "Heh di <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> hät {{GENDER:$1|dä|et|dä Metmaacher|di Metmaacherėn|dät}} „$1“ an {{GENDER:$2|dä|et|dä Metmaacher|di Metmaacherėn|dät}} „$2“ jescheck, un doför {{GRAMMAR:en dative|{{SITENAME}}}} dat „{{int:emailuser}}“ jebruch.",
        "usermessage-summary": "En Nohreesch vum Wiki afjelivvert.",
        "usermessage-editor": "Name vum Metmaacher för de Täxte un Nohreshte vum Wiki ze beärbeide",
        "watchlist": "ming Oppaßleß",
        "thumbnail_toobigimagearea": "Datteij met mih wi $1",
        "thumbnail_dest_directory": "Dat Verzeichnis för dat erin ze donn kunte mer nit aanlääje.",
        "thumbnail_image-type": "Di Zoot Beld künne mer nit met ömjonn",
-       "thumbnail_gd-library": "Vun dä <i lang=\"en\">GD</i> Projramm_Biplijotheek fäählt en Funkßuhn: „$1“",
+       "thumbnail_gd-library": "Vun dä <i lang=\"en\">GD</i> Projramm_Biplijotehk fääld en Funkßuhn: „$1“",
        "thumbnail_image-missing": "Di Dattei schingk nit doh ze sin: <code>$1</code>",
        "thumbnail_image-failure-limit": "Mih wi {{PLURAL:$1|eine Versohch|$1 Versohche|keine Versohch}} dat Minnibelldsche ze zeije. Versöhg_et schpääder widder.",
        "import": "Sigge Emporteere",
        "importnosources": "Heh es kein Wikki för_enne tiräkte Empoot enjereesch.\nÄllder Väsjohne huhzelade es nit zohjelohße.",
        "importnofile": "Et wood kein Dattei huhjelahde för ze Empottehre.",
        "importuploaderrorsize": "De Import-Datei huhzelade jingk scheif, weil dat Denge jrößer wi äloup es.",
-       "importuploaderrorpartial": "De Import-Datei huhzelade jingk scheif, weil dat Denge nit komplett zo eng transpotteet woode es. Do fäählt jet.",
+       "importuploaderrorpartial": "De Impoot_Datteij huhzelade jingk scheif, weil dat Denge nit komplett zo eng transpotteet woode es. Do fäält jet drahn.",
        "importuploaderrortemp": "De Empoot_Dattei huhzelahde jingk scheif, weil e Zwescheverzeijschneß fäält.",
        "import-parse-failure": "Fäähler bem Import per XML:",
        "import-noarticle": "Kein Sigge do, för ze Emporteere!",
index ed1dac4..b496fbc 100644 (file)
        "userlogin-yourpassword-ph": "Şîfreya xwe binivîse",
        "createacct-yourpassword-ph": "Şîfreya xwe binivîse",
        "yourpasswordagain": "Şîfreyê dîsa binivîse:",
-       "createacct-yourpasswordagain": "Şîfreye bipejirîne",
-       "createacct-yourpasswordagain-ph": "Şîfreyê ji nû ve têkeve",
+       "createacct-yourpasswordagain": "Şîfreyê bipejirîne",
+       "createacct-yourpasswordagain-ph": "Şîfreyê ji nû ve binivîse",
        "remembermypassword": "Şifreya min di her têketina min de bîne bîra xwe (herî zêde $1 {{PLURAL:$1|rojekê|rojan}})",
        "userlogin-remembermypassword": "Min têketî bihêle",
        "userlogin-signwithsecure": "Girêdana parastî bikarbîne",
        "gotaccount": "Hesabê te heye? $1.",
        "gotaccountlink": "Têkeve",
        "userlogin-resetlink": "Te agahiyên hesabê xwe ji bîr kirin?",
-       "userlogin-resetpassword-link": "Te şîfreye xwe jibîrkir?",
+       "userlogin-resetpassword-link": "Te şîfreya xwe ji bîr kir?",
        "userlogin-helplink2": "Alîkariya têketinê",
-       "userlogin-createanother": "Hesabek din çeke",
+       "userlogin-createanother": "Hesabekî din çeke",
        "createacct-emailrequired": "E-name",
        "createacct-emailoptional": "E-name",
        "createacct-email-ph": "E-nameya xwe binivîse",
-       "createacct-another-email-ph": "E-nameya xwe têkeve",
-       "createaccountmail": "Şîfreyek ji bo ji bo demeke kin bikarbînin û ji navnîşana hatiye diyarkirin re e-nameyek bişînin.",
+       "createacct-another-email-ph": "E-nameya xwe binivîse",
+       "createaccountmail": "Şîfreyeke demkî bikar bîne û wê ji navnîşana hatiye diyarkirin re bişîne.",
        "createacct-realname": "Navê te ya rast (Ko tu bixwazi bikeve, pêdivî nîne)",
        "createaccountreason": "Sedem:",
        "createacct-reason": "Sedem",
-       "createacct-reason-ph": "Çima hesabek din çedikîy",
-       "createacct-captcha": "Kontrola asayîşê",
-       "createacct-imgcaptcha-ph": "Nivîsa ku tu li jor dibînî binivîse",
+       "createacct-reason-ph": "Çima hesabekî din çêdikî",
        "createacct-submit": "Hesabê xwe biafirîne",
-       "createacct-another-submit": "Hesabek çêke",
-       "createacct-benefit-heading": "{{SITENAME}} ji alî mirovên wek te tê çêkirin.",
+       "createacct-another-submit": "Hesabekî çêke",
+       "createacct-benefit-heading": "{{SITENAME}} ji aliyê mirovên wek te ve tê çêkirin.",
        "createacct-benefit-body1": "{{PLURAL:$1|guhertin}}",
        "createacct-benefit-body2": "{{PLURAL:$1|rûpel}}",
        "badretype": "Her du şîfreyên ku te nivîsîn li hevdu nayên.",
        "userexists": "Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din dake.",
        "loginerror": "Çewtiya têketinê",
-       "createacct-error": "Çewtîya çêkirine hesabê",
+       "createacct-error": "Çewtiya çêkirina hesabî",
        "createaccounterror": "Hesab nikare were çêkirin: $1",
        "nocookiesnew": "Hesabê bikarhêner hatibû çêkirin, lê te xwe qeyd nekiriye. {{SITENAME}} ji bo qeydkirina bikarhêneran cookie'yan bikartîne. Te bikaranîna cookie'yan girtiye. Xêra xwe cookie'yan qebûl bike, piştre bi navê bikarhêner û şîfreya xwe têkeve.",
        "nocookieslogin": "Ji bo qeydkirina bikarhêneran {{SITENAME}} \"cookies\" bikartîne. Te fonksîyona \"cookies\" girtîye. Xêra xwe kerema xwe \"cookies\" gengaz bike û careke din biceribîne.",
-       "noname": "Navê ku te nivîsand derbas nabe.",
+       "noname": "Navê ku te nivîsand ne derbasdar e.",
        "loginsuccesstitle": "Têketin serkevtî bû!",
        "loginsuccess": "Tu niha di {{SITENAME}} de tomarkirî yî wek \"$1\".",
        "nosuchuser": "Bikarhênerê bi navê \"$1\" tune. Navê rast binivîse an bi vê formê <b>hesabekî nû çêke</b>. (Ji bo hevalên nû \"Têkeve\" çênabe!)",
index c322162..7769044 100644 (file)
        "createaccountreason": "Causa:",
        "createacct-reason": "Causa",
        "createacct-reason-ph": "Cur aliam rationem creas",
-       "createacct-imgcaptcha-ph": "Textum quem supra vidis inscribe",
        "createacct-submit": "Rationem tuam creare",
        "createacct-another-submit": "Aliam rationem creare",
        "createacct-benefit-body1": "{{PLURAL:$1|recensio|recensiones}}",
        "enhancedrc-history": "Historia",
        "recentchanges": "Nuper mutata",
        "recentchanges-legend": "Indicis paginarum nuper mutatarum praeferentiae",
-       "recentchanges-summary": "Inspice mutationes recentes huic vici in hac pagina.",
+       "recentchanges-summary": "Ecce mutationes recentes.",
        "recentchanges-feed-description": "Nuper mutata Viciae hoc in fluxu observare.",
        "recentchanges-label-newpage": "Haec recensio paginam novam creavit",
        "recentchanges-label-minor": "Haec est recensio minor",
index d0d98b4..05b6d26 100644 (file)
@@ -91,7 +91,7 @@
        "march-gen": "Março",
        "april-gen": "Abril",
        "may-gen": "Mayo",
-       "june-gen": "Juño",
+       "june-gen": "Junio",
        "july-gen": "Julio",
        "august-gen": "Agosto",
        "september-gen": "Setiembre",
        "passwordreset-email": "Adresso de letral:",
        "passwordreset-emailelement": "Usuario: \n$1\n\nKontrasenya temporal: \n$2",
        "changeemail": "Kambiar adreso de korreo elektroniko",
+       "changeemail-header": "Kambiar adreso de korreo elektroniko de kuento",
        "changeemail-oldemail": "Adreso de korreo elektroniko aktual:",
        "changeemail-newemail": "Muevo adreso de korreo elektroniko:",
        "changeemail-none": "(dinguno)",
        "lockedbyandtime": "(por {{GENDER:$1|$1}} el $2 a la $3)",
        "movepagetext": "Uzando el sigiente formulario va renombrar una pajina, kitando todo su istoria a su nuevo nombre.\nEl titulo orijinal se va convertir en una redireksyon al muevo titulo.\nPuede aktualizar otomatikamente las redireksyones al titulo orijinal.\nSi eskoje no azerlo, asegurate de verifikar ke no ay  [[Special:DoubleRedirects|redireksyones dobles]] o [[Special:BrokenRedirects|rotas]].\nTú sos responsable de asegurar ke los enlases funksyonan korrectamente.\n\nNota ke la pajina '''no''' va ser renombrada si ya egziste una hoja con esta muevo título, a no ser que sea una redireksyon sin istoria.\nEsto sinyifica que vas pueder renombrar una pajina a su titulo orijinal si hazes un yerro, ma que no vas pueder sobreskrivir una pajina que ya existe.\n\n'''Aviso!'''\nEste puede ser un trocamiento muy muy emportante e inesperado para una pajina popular;\nasegurate de entender las resultados del lo que azes antes de ir endelantre.",
        "movepagetalktext": "La hoja de diskussión associada, si egziste, va ser renombrada otomáticamente '''a menos que:'''\n*Esté renombrando la hoja entre espacios de nombres diferentes,\n*Una hoja de diskussión no vazía ya egziste con el nombre nuevo, o\n*Desactivara la opción \"Renombrar la hoja de diskussión también\".\n\nEn estos casos, va deber trasladar manualmente el contenido de la hoja de diskussión.",
-       "movearticle": "Renombra la hoja",
        "newtitle": "A título nuevo",
        "move-watch": "Cudiar este artículo",
        "movepagebtn": "Renombra la hoja",
        "hebrew-calendar-m8": "Iyyar",
        "hebrew-calendar-m9": "Siván",
        "hebrew-calendar-m10": "Tammuz",
-       "hebrew-calendar-m1-gen": "Tishre",
-       "hebrew-calendar-m2-gen": "Ḥeshvan",
+       "hebrew-calendar-m1-gen": "Tishri",
+       "hebrew-calendar-m2-gen": "Ḥeshván",
+       "hebrew-calendar-m4-gen": "Teveth",
+       "hebrew-calendar-m6-gen": "Adhar",
+       "hebrew-calendar-m6a-gen": "Adhar I",
+       "hebrew-calendar-m6b-gen": "Adhar II",
+       "hebrew-calendar-m7-gen": "Nissán",
+       "hebrew-calendar-m8-gen": "Iyyar",
+       "hebrew-calendar-m9-gen": "Siván",
+       "hebrew-calendar-m10-gen": "Tammuz",
        "duplicate-defaultsort": "'''Aviso:''' la klave primaria para ordenamiento \"$2\" anula la primera \"$1\"",
        "version": "Versión",
        "version-specialpages": "Pajinas espesiales",
index d07d95a..48526c8 100644 (file)
@@ -22,6 +22,7 @@
        "tog-hideminor": "Kleng Ännerungen an de rezenten Ännerunge verstoppen",
        "tog-hidepatrolled": "Nogekuckt Ännerungen an de \"Rezenten Ännerungen\" verstoppen",
        "tog-newpageshidepatrolled": "Nogekuckt Säiten op der Lëscht vun den \"Neie Säite\" verstoppen",
+       "tog-hidecategorization": "Kategorisatioun vu Säite verstoppen",
        "tog-extendwatchlist": "Iwwerwaachungslëscht op all Ännerungen ausbreeden, net nëmmen op déi rezentst",
        "tog-usenewrc": "Rezent Ännerungen an Iwwerwaachungslëscht pro Säit weisen",
        "tog-numberheadings": "Iwwerschrëften automatesch numeréieren",
@@ -51,6 +52,7 @@
        "tog-watchlisthideliu": "Ännerunge vun ugemellte Benotzer verstoppen",
        "tog-watchlisthideanons": "Ännerunge vun anonyme Benotzer (IP-Adressen) verstoppen",
        "tog-watchlisthidepatrolled": "Iwwerkuckten Ännerungen op der Iwwerwaachungslëscht verstoppen",
+       "tog-watchlisthidecategorization": "Kategorisatioun vu Säite verstoppen",
        "tog-ccmeonemails": "Schéck mir eng Kopie vun de Mailen, déi ech anere Benotzer schécken.",
        "tog-diffonly": "Weis bei Versiounsvergläicher just d'Ënnerscheeder an net déi ganz Säit",
        "tog-showhiddencats": "Verstoppt Kategorië weisen",
        "createaccountreason": "Grond:",
        "createacct-reason": "Grond",
        "createacct-reason-ph": "Fir wat Dir een anere Benotzerkonnt uleet",
-       "createacct-captcha": "Sécherheets-Check",
-       "createacct-imgcaptcha-ph": "Gitt den Text an deen Dir hei driwwer gesitt",
        "createacct-submit": "Äre Benotzerkont uleeën",
        "createacct-another-submit": "Benotzerkont uleeën",
        "createacct-benefit-heading": "{{SITENAME}} gëtt vu Leit wéi Iech gemaach.",
        "createacct-benefit-body2": "{{PLURAL:$1|Säit|Säiten}}",
        "createacct-benefit-body3": "rezent {{PLURAL:$1|Mataarbechter}}",
        "badretype": "Är Passwierder stëmmen net iwwereneen.",
+       "usernameinprogress": "D'Uleeë vun engem Benotzerkont fir dëse Benotzernumm ass schonn am Gaang. Waart w.e.g..",
        "userexists": "De Benotzernumm deen agi gouf gëtt scho benotzt.\nSicht Iech een anere Benotzernumm.",
        "loginerror": "Feeler beim Aloggen",
        "createacct-error": "Feeler beim Uleeë vum Benotzerkont",
        "passwordreset-emailsent-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
        "passwordreset-emailerror-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
-       "changeemail-header": "Mailadress vum Benotzerkont änneren",
+       "changeemail-header": "Fëllt dëse Formulaire aus fir Är E-Mailadress z'änneren.  Wann Dir d'Verbindung tëscht Ärer E-Mailadress an Ärem Benotzerkont ewechhuele wëllt, da loosst d'Feld e-Mailadress eidel wann Dir de Formulaire späichert.",
        "changeemail-passwordrequired": "Dir musst Äert Passwuert agi fir dës Ännerung ze konfirméieren.",
        "changeemail-no-info": "Dir musst ageloggt sinn, fir direkt op dës Säit ze kommen.",
        "changeemail-oldemail": "Aktuell Mailadress:",
        "permissionserrorstext-withaction": "Dir sidd, aus {{PLURAL:$1|dësem Grond|dëse Grënn}}, net berechtegt $2 :",
        "recreate-moveddeleted-warn": "'''Opgepasst: Dir sidd am Gaang eng Säit unzeleeën déi schonn eng Kéier geläscht gouf.'''\n\nFrot Iech ob et wierklech sënnvoll ass dës Säit nees nei ze schafen.\nFir Iech z'informéieren fannt Dir hei d'Logbuch vum Läsche mam Grond:",
        "moveddeleted-notice": "Dës Säit gouf geläscht.\nHei ass den Extrait aus dem Logbuch vum Réckelen a Läsche fir déi Säit.",
+       "moveddeleted-notice-recent": "Leider gouf dëse Säit rezent (bannent de leschte 24 Stonnen) geläscht. D'Logbuch vum Läschen a Réckele vun dëser Säit fannt Dir fir Ar Informatioun hei drënner.",
        "log-fulllog": "Dat ganzt Logbuch weisen",
        "edit-hook-aborted": "D'Ännerung gouf ouni Erklärung vun enger Schnëttstell (hook) ofgebrach.",
        "edit-gone-missing": "D'Säit konnt net aktualiséiert ginn.\nSi gouf anscheinend geläscht.",
        "prefs-help-recentchangescount": "Inklusiv Rezent Ännerungen, Versiounshistoriquen a Logbicher.",
        "prefs-help-watchlist-token2": "Dëst ass de geheime Schlëssel fir de Webfeed vun Ärer Iwwerwaachungslëscht. Jiddwereen deen e kennt kann Är Iwwerwaachungslëscht liesen, dofir sollt Dir en net weider ginn. [[Special:ResetTokens|Klickt hei wann Dir en zrécksetze musst]].",
        "savedprefs": "Är Astellunge goufe gespäichert.",
+       "savedrights": "D'Benotzerrechter vum {{GENDER:$1|$1}} goufe gespäichert.",
        "timezonelegend": "Zäitzon:",
        "localtime": "Lokalzäit:",
        "timezoneuseserverdefault": "De Standardwäert vun der Wiki ($1) benotzen",
        "badsig": "D'Syntax vun Ärer Ënnerschrëft ass net korrekt; iwwerpréift w.e.g. den HTML Code.",
        "badsiglength": "Är Ënnerschrëft ass ze laang.\nSi muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.",
        "yourgender": "Wéi wëllt Dir beschriwwe ginn?",
-       "gender-unknown": "Wann Dir ernimmt gëtt da benotzt D'Software do wou et méiglech ass geschlechtsneutral Wierder",
+       "gender-unknown": "Wann Dir ernimmt gëtt da benotzt d'Software do wou et méiglech ass geschlechtsneutral Wierder",
        "gender-male": "Hien ännert Wikisäiten",
        "gender-female": "Si ännert Wikisäiten",
        "prefs-help-gender": "Fakultativ:\nD'Software benotzt seng Wäerter fir Iech unzeschwätzen a fir vun Iech vis-a-vis vun Aneren grammatesch ''Gender-korrekt'' ze schwätzen. \n\nDës Informatioun ass ëffentlech.",
        "rcshowhidemine": "Meng Ännerunge $1",
        "rcshowhidemine-show": "Weisen",
        "rcshowhidemine-hide": "Verstoppen",
+       "rcshowhidecategorization": "Kategorisatioun vu Säite $1",
+       "rcshowhidecategorization-show": "Weisen",
+       "rcshowhidecategorization-hide": "Verstoppen",
        "rclinks": "Déi lescht $1 Ännerunge vun de leschten $2 Deeg weisen.<br />$3",
        "diff": "Ënnerscheed",
        "hist": "Versiounen",
        "upload-dialog-button-done": "Fäerdeg",
        "upload-dialog-button-save": "Späicheren",
        "upload-dialog-button-upload": "Eroplueden",
-       "upload-process-error": "Et ass e Feeler geschitt",
-       "upload-process-warning": "Eng Warnung gouf ausgeschwat",
        "upload-form-label-select-file": "Fichier eraussichen",
        "upload-form-label-infoform-title": "Detailer",
        "upload-form-label-infoform-name": "Numm",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
        "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
-       "api-error-blacklisted": "Sicht w.e.g. en aneren Titel, deen méi iwwer de Sujet ausseet."
+       "api-error-blacklisted": "Sicht w.e.g. en aneren Titel, dee méi iwwer de Sujet ausseet."
 }
index 75d2db3..54486ea 100644 (file)
@@ -13,6 +13,7 @@
        "tog-hideminor": "قام کئردئن ڤیرایشتیا کوچئک مین آلئشتیا تازە",
        "tog-hidepatrolled": "قام کئردئن ڤیرایشتیا تیە دیار کئردە مین آلئشتیا تازە",
        "tog-newpageshidepatrolled": "بألگە یا تیە دیار کئردە نە مئن نومگە بألگە یا تازە قام کو",
+       "tog-hidecategorization": "قام کئردئن جأرغە کاری بألگە یا",
        "tog-extendwatchlist": "سئیل بأرگە نە سی نئشوٙ دأئن تأموٙم آلئشتیا ڤا کو نە فأقأط سی بیشتئر تازە باڤیا.",
        "tog-usenewrc": "دأسە بأنی آلئشتیا ڤا بألگە د آلئشتیا تازە و سئیل بأرگ",
        "tog-numberheadings": "سأربألگە خود شمارئشت کو",
@@ -42,6 +43,7 @@
        "tog-watchlisthideliu": "ڤبرایشتیایی نە کئ ڤئ دأس کاریاریا ڤامین ئوٙماە أنجوم گئرئتە د سئیل بأرگ نئهوٙ بأک",
        "tog-watchlisthideanons": "ڤیرایئشتیا کاریاریایی کئ نادیارئن د سئیل بأرگ نئهوٙ بأک",
        "tog-watchlisthidepatrolled": "ڤیرایشتیایی که هان د تیە رأس د سئیل بأرگ قام کو",
+       "tog-watchlisthidecategorization": "قام کئردئن جأرغە کاری بألگە یا",
        "tog-ccmeonemails": "ڤورداشتە یا أنجومانامه یا مئنە کئ سی کاریاریا هأنی کئل می کئم سیم کئل بأک",
        "tog-diffonly": "بألگە یایی کئ د ڤأر گئرتە فأرخیا هارئن دیاریشوٙ بأک",
        "tog-showhiddencats": "دأسە یا نئهوٙ بییأنئ دیاری بأک",
@@ -79,7 +81,7 @@
        "july": "جوٙلای",
        "august": "آگوست",
        "september": "سئپتامر",
-       "october": "ئوکتور",
+       "october": "ئÙ\88کتÙ\88بر",
        "november": "نوڤامر",
        "december": "دئسامر",
        "january-gen": "جانڤیە",
@@ -91,7 +93,7 @@
        "july-gen": "جوٙلای",
        "august-gen": "آگوست",
        "september-gen": "سئپتامر",
-       "october-gen": "ئوکتوڤر",
+       "october-gen": "ئوکتوبر",
        "november-gen": "نوڤامر",
        "december-gen": "دئسامر",
        "jan": "جانڤیە",
        "july-date": "جوٙلای $1",
        "august-date": "آگوست $1",
        "september-date": "سئپتامر $1",
-       "october-date": "ئوکتوڤر $1",
+       "october-date": "ئوکتوبر $1",
        "november-date": "نوڤامر $1",
        "december-date": "دئسامر $1",
        "pagecategories": "{{PLURAL:$1|}}{{PLURAL:$1|دأسە|دأسە يا}}",
        "createaccountreason": "دألیل:",
        "createacct-reason": "دألیل",
        "createacct-reason-ph": "سی چی شوما داریت یئ گئل حئساڤ هأنی راس میکید",
-       "createacct-captcha": "ڤارئسی أمنیأت دار بییئن",
-       "createacct-imgcaptcha-ph": "نیسئسە یی نە کئ د ڤارو مئینیت ڤارئد بأکیت",
        "createacct-submit": "حئسأڤ خوتوٙنە راس بأکیت",
        "createacct-another-submit": "یئ گئل حئساڤ هأنی راس بأکیت",
        "createacct-benefit-heading": "{{SITENAME}}  ڤئ دأس خألکی چی شوما رأڤأندیاری بییە.",
        "passwordreset-emailsent-capture": "رازینە گوڤاردئن تازە توٙ سی أنجومانامە توٙ کئ ها د هار کئل بییە.",
        "passwordreset-emailerror-capture": "رازینە گوڤاردئن د أنجومانامە د نۊ زئنە کون کئل بییە،و ڤئ د هار دیاری میکە، ڤألی کئل بییئن ڤئ سی {{GENDER:$2|کاریار}} ناخوش سأرنجوم بییە:$1",
        "changeemail": "أنجومانامە توٙنە آلئشت کاری بأکیت",
-       "changeemail-header": "اÛ\8cÙ\85Û\8cÙ\84 Ø­Ø³Ø§Ù\88تÙ\88Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ú©Û\8cد",
+       "changeemail-header": "ئÛ\8c Ù\81Ù\88رÙ\85ئ Ù\86Û\95 Ø³Û\8c Ø¢Ù\84ئشتکارÛ\8c Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99 Ù¾Ù\88ر Ø¨Ø£Ú©Û\8cت. Ø£Ø± Ù\85Û\8cھاÛ\8cت Ú¾Ø£Ø± Ø¬Ù\88Ù\99ر Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ù\86Û\95 Ø¯ Ù\85Û\8cÙ\86جا Ø­Ø¦Ø³Ø§Ú¤Ø¦ØªÙ\88Ù\99 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ø£Ú©Û\8cتØ\8c Ø¬Ø§Ú¯Û\95 Ø¯Ø£Ø¦Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\86ئ Ø¯ Ú\86ئÙ\86Û\8c Ù\81Ù\88رÙ\85Û\8c Ø­Ø§Ù\84Û\8c Ø¨Ø£Ù\86Û\8cت.",
        "changeemail-passwordrequired": "شوما سی پوشت راستکاری ئی آلئشت بایأد یئ گئل رازینە گوڤاردئن بأزئنیت.",
        "changeemail-no-info": "شوما سی یە کئ د ئی بألگە دأسرئسی داشتوٙییت باس بیاییت ڤامین.",
        "changeemail-oldemail": "تیرنئشوٙن أنجومانامە ئیسئنی:",
        "changeemail-newemail": "تیرنئشوٙن أنجومانامە تازە:",
+       "changeemail-newemail-help": "أر شوما میھایت تیرنئشوٙن أنجفونامە توٙنە ڤئرداریت چئنی جاگە یی نە بایأد حالی بأنیت. شوما. ئوٙسئ أر رازینە گورادئنئتوٙ د ڤیرتوٙ رأتە با نئمی توٙنیت د نۊ زئنەش بأکیت و ھأنی ھیچ جوٙر أنجومانامە یی د ئی ڤیکی ڤئ دأس شوما نئمی رئسە.-",
        "changeemail-none": "(هيش كوم)",
        "changeemail-password": "رازینە گوڤاردئن{{SITENAME}} شوما:",
        "changeemail-submit": "آلئشت دأئن أنجومانامە",
        "rcshowhidemine": "ڤیرایئشتیا مئ $1",
        "rcshowhidemine-show": "نئشوٙ دأئن",
        "rcshowhidemine-hide": "قام کئردئن",
+       "rcshowhidecategorization": "جأرغە کاری بألگە $1",
+       "rcshowhidecategorization-show": "نئشوٙ دأئن",
+       "rcshowhidecategorization-hide": "قام کئردئن",
        "rclinks": "آخرین آلشتیا $1 نشو بیه د اخرین روزیا $2",
        "diff": "فأرخ",
        "hist": "ڤیرگار",
        "boteditletter": "ب",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 دینه {{PLURAL:$1|کاریار|کاریاریا}}]",
-       "rc_categories": "دسÙ\87 Û\8cا Ù\86Ù\87 Ù\85حدÙ\88د Ú©Ù\88\88ا \"|\" Ø¬Ú¯Ø§ Ø¨Ù\88ئÙ\86",
-       "rc_categories_any": "هرکوم",
+       "rc_categories": "جأرغÛ\95 Û\8cا Ù\86Û\95 Ù\85أدÙ\88Ù\99د Ú©Ù\88(ڤا \"|\" Ø¬Ø¦Ú¯Ø§ Ø¨Ø§Ù\86)",
+       "rc_categories_any": "ھأرکوم کئ گولئ ڤورچیە بیینە",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتیا}} نئها آلئشتکاری",
        "newsectionsummary": "/* $1 */ بهرجا تازه",
        "recentchangeslinked-summary": "ای نوم گه تازه د بلگیایی که وا بلگیا ویجه هوم پیوند بینه آلشت بیه(یا سی اندومیا دسه بنی بیه)\nبلگیا یی که هان [[Special:Watchlist|your watchlist]]و گپ بینه",
        "recentchangeslinked-page": "نوم بألگە:",
        "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
+       "recentchanges-page-added-to-category": "[[:$1]]د دأسە ئضاف بی",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
+       "recentchanges-page-removed-from-category": "[[:$1]] د دأسە جئگا بی",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
+       "autochange-username": "آلئشتکاری خودأنجوم مئدیاڤیکی",
        "upload": "سوڤار کئردئن جانیا",
        "uploadbtn": "سوڤار کئردئن جانیا",
        "reuploaddesc": "سوار کردن نه انجوم شیو بکیت و د ورئردیت جابلگ سوارکرد",
        "uploaderror": "خأطا د سوڤار کئردئن",
        "upload-recreate-warning": "'''زئنار: جانیایی که وه ای نومه یا پاکسا بیه یا جا وه جا بیه.'''\n\nسی رائتی، نومگه پاکساگری و جا وه جا کردن ای بلگه ها د هار:",
        "uploadtext": "دسی دئین جانیایی که  د دماتر سوار بینه روئیت وه  [[Special:FileList|نوم گه جانیایا]] . د نو سوارکردن  د [[Special:Log/upload|نوم گه سوارکردیا]] و پاکساگری جانیایا د [[Special:Log/delete|deletion log]] جاگئر موئه.\n\nنها یه که یه گل جانیانه سوار کردیت می تونیت د سه شکل هاری وه نه د بلگه یا وه کار بونیت:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' سی به کار بسن نسقه کامل جانیا\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' سی به کار بسن یه گل نسقه 200 پیکسلی  د جانیایی که ها د مینه یه گل جعوه  که ها د لا چپ نیسسه که د وه عبارت alt text چی توضیح وه کار بسه بیه\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' سی دروس کردن یه گل هوم پیوند سرراست وه جانیا بی یه که جانیا دیاری بکه نوم بلگه هاری سی سوارکرد جانیایا تازه استفاده بکیت.",
-       "upload-permitted": "جورا جانیا صلادار:$1 .",
-       "upload-preferred": "جورا جانیا صلادار:$1.",
+       "upload-permitted": "جوٙرا صئلادار جانیا {{PLURAL:$2|جوٙر|جوٙرا}}:$1 .",
+       "upload-preferred": "جوٙرا حاستئنی جانیا {{PLURAL:$2|جوٙر|جوٙرا}}:$1 .",
        "upload-prohibited": "جورا جانیا صلادار:$1{{PLURAL:$2|.}}",
        "uploadlogpage": "سوارکرد",
        "uploadlogpagetext": "نومگه هاری یه گل نومگه د آخری سوارکرد جانیایا هئ.\nسی د نو سیل کردن[[Special:NewFiles|عسگدونی جانیایا تازه نه]] به ونیت.",
        "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ",
        "upload-http-error": "یه گل خطا اچ تی تی پی پیش اومائه:$1",
        "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
+       "upload-dialog-title": "سوڤار کئردئن جانیا",
+       "upload-dialog-button-cancel": "أنجوم شیڤئسئن",
        "upload-dialog-button-done": "أنجوم بییە",
        "upload-dialog-button-save": "ئمایە کئردئن",
        "upload-dialog-button-upload": "سوڤار کئردئن",
+       "upload-form-label-select-file": "ئنتئخاڤ جانیا",
+       "upload-form-label-infoform-title": "جوزئیات",
        "upload-form-label-infoform-name": "نوم",
        "upload-form-label-infoform-description": "توضی",
        "upload-form-label-usage-title": "ڤئ کار گئرئتئن",
        "upload-form-label-usage-filename": "نوم جانیا",
+       "foreign-structured-upload-form-label-own-work": "یە کار مئنە",
+       "foreign-structured-upload-form-label-infoform-categories": "دأسە یا",
+       "foreign-structured-upload-form-label-infoform-date": "گات",
        "backend-fail-stream": "نبوئه جانیا\"$1\" کل بوئه.",
        "backend-fail-backup": "نبوئه سی \"$1\" پشتجا گرت.",
        "backend-fail-notexists": "جانیا $1 وجود ناره.",
        "randomincategory-nopages": "هیچ بلگه ای د ای  [[:دسه نئ:$1|$1]] دسه.",
        "randomincategory-category": "دأسە:",
        "randomincategory-legend": "بلگه بختی د ای دسه",
+       "randomincategory-submit": "رو",
        "randomredirect": "واگردونی بختکی",
        "randomredirect-nopages": "هیچ واگردونی د نومجا \"$1\" نئ.",
        "statistics": "آماريا",
        "booksources-text": "د هار نومگه ای د هوم پیوندیا د دیارگه یا هنی اومائه که کتاویا نو و دس دوئم می فروشن، و همچنو شایت دونسمنیا بیشتری راجع وه کتاو حاستنی شما داشتوئن:",
        "booksources-invalid-isbn": "شازک که دئه بیه معتور نئ؛ وارسی خطایا د گات ؤرداشتن د سرچشمه اولی وه کار گرته بوئه.",
        "specialloguserlabel": "انجومکار:",
-       "speciallogtitlelabel": "حاستنی(موضوع یا کاریار):",
+       "speciallogtitlelabel": "حاستئنی(داسوٙن یا نوم کاریاری سی کاریار):",
        "log": "پهرستنومه یا",
        "all-logs-page": "همه پهرستنومه یا عمومی",
        "alllogstext": "نماشت یه جا همه پهرستنومه یا که هان د{{SITENAME}}.\nمی تونید وا انتخاو نوع پهرستنومه، نوم کاریاری(حساس وه کؤچکی و گپی حرفیا) و بلگه یا آلشت کرده(حساس و گپی و کؤچکی حرنیا) نمایشت نه دیر د ویرتر بکیت.\n\n{{SITENAME}}.",
        "listgrouprights-members": "(نوم گه اندومیا)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-       "listgrouprights-addgroup": "{{PLURAL:$2|گرویا|گرویا}} اضاف بکیتو: $1",
-       "listgrouprights-removegroup": "{{PLURAL:$2|گرویا|گرویا}} ورداریت: $1",
-       "listgrouprights-addgroup-all": "همه گرویا نه اضاف کو",
-       "listgrouprights-removegroup-all": "همه گرویا نه وردار",
-       "listgrouprights-addgroup-self": " {{PLURAL:$2|گروه|گرویا}} نه د حساو: $1 اضاف کو",
-       "listgrouprights-removegroup-self": "{{PLURAL:$2|گرویا|گرویا}} نه د حساو ورداریت: $1",
+       "listgrouprights-addgroup": "{{PLURAL:$2|جأرغە|جأرغە یا}} نە ئضاف بأکیت: $1",
+       "listgrouprights-removegroup": "{{PLURAL:$2|جأرغە|جأرغە یا}} نە ڤئرداریت: $1",
+       "listgrouprights-addgroup-all": "هأمە جأرغە یا نە ئضاف کو",
+       "listgrouprights-removegroup-all": "ھأمە جأرغە یا نە ڤئردار",
+       "listgrouprights-addgroup-self": " {{PLURAL:$2|جأرغە|جأرغە یا}} نە د حئساڤ: $1 ئضاف کو",
+       "listgrouprights-removegroup-self": " {{PLURAL:$2|جأرغە|جأرغە یا}} نە د حئساڤ: $1 ڤئرداریت",
        "listgrouprights-addgroup-self-all": "همه گرویا نه د حساو خوشو اضاف بکیت",
        "listgrouprights-removegroup-self-all": "همه گرویا نه د حساو خوشو ورداریت",
        "listgrouprights-namespaceprotection-header": "محدودیت نومجا",
        "listgrouprights-namespaceprotection-namespace": "نوم جا",
        "listgrouprights-namespaceprotection-restrictedto": "دسرسیا مجاز کاریار سی ویرایشت",
-       "trackingcategories": "دما گری دسه یا",
+       "trackingcategories": "دئماگئری دأسە یا",
        "trackingcategories-summary": "ای بلگه نومگه دسه یایی دماگری بیه ئه که وه شکل خودانجوم وه دس ویکی وارسگر پر بوئن . نومیا ونو نها آلشت کردن پیغومیا سامونه ای مرتوط د نومجا {{ns:8}} آلشت دئه با.",
-       "trackingcategories-msg": "دماگری دسه",
-       "trackingcategories-name": "نوم پیغوم",
+       "trackingcategories-msg": "دئماگئری دأسە",
+       "trackingcategories-name": "نوم پئیغوم",
        "trackingcategories-desc": "جادیارکنیا گنجایشت دسه",
        "noindex-category-desc": "ای بلگه وا رباتیا نومگه کاری نبیه و سی یه کلیمه یا جادویی <code><nowiki>__NOINDEX__</nowiki></code> د وه یا د جاگه ای که بیرق مجازه دش هئ.",
        "index-category-desc": "ای بلگه<code><nowiki>__INDEX__</nowiki></code> که ها دش(و د نومجایی یه که بیرق دش مجازه)،  سی یه وا رباط ما مشگلی ناره که وه شکل عادی نباید با.",
        "trackingcategories-disabled": "دسه ناکشتگر بیه",
        "mailnologin": "هیپچ نشونی یی کل نبیه",
        "mailnologintext": "سی کل کردن انجومانامه وه کاریاریا هنی واس [[Special:UserLogin|بیایت وامین سامونه]] و تیرنشون انجومانامه معتوری د [[Special:Preferences|ترجیحات]] خوتو داشتوئیت.",
-       "emailuser": "اÛ\8c Ù\83ارÙ\88ر Ù\86Ù\87 Ø§Ù\8aÙ\85Ù\8aÙ\84 Ù\83و",
-       "emailuser-title-target": "اÛ\8cÙ\85Û\8cÙ\84 Ø³Û\8c Ø§Û\8c {{GENDER:$1|کارÙ\88ر}}",
+       "emailuser": "ئÛ\8c Ú©Ø§Ø±Û\8cار Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø§Ø±Û\8c Ú©و",
+       "emailuser-title-target": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø³Û\8c Ø¦Û\8c {{GENDER:$1|کارÛ\8cار}}",
        "emailuser-title-notarget": "أنجومانامە کاریار",
        "emailpagetext": "شما می تونیت  نوم بلگه هار نه سی کل کردن یه گل انجومانامه وه ای  {{GENDER:$1|کاریار}} وه کار بئیرت.\nتیرنشون انجومانامه یی که د [[Special:Preferences|ترجیحات کاریارتو]] دئیه ته د تیرنشون کلکار انجومانامه میا، سی یه که گیرنه بتونه جواوش بیه.",
        "defemailsubject": "{{نوم سیل جا}} ایمیل د کارور \"$1\"",
        "email-legend": "کل کردن یه گل انجومانامه سی یه گل کاریار هنی د {{SITENAME}}",
        "emailfrom": "د:",
        "emailto": "سی:",
-       "emailsubject": "سرÙ\88ن:",
-       "emailmessage": "پيغوم:",
-       "emailsend": "كل بيه",
+       "emailsubject": "داسÙ\88Ù\99ن:",
+       "emailmessage": "پئیغوٙم",
+       "emailsend": "کئل کئردئن",
        "emailccme": "یه گل وردار د پیغوم مه نه سیم ایمیل کو.",
        "emailccsubject": " پیغومتو سی $1:$2 ورداشته بی",
-       "emailsent": "اÛ\8cÙ\85Û\8cÙ\84 Ú©Ù\84 Ø¨Û\8cÙ\87",
+       "emailsent": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95",
        "emailsenttext": "پیغوم ایمیلی تو کل بیه.",
        "emailuserfooter": "ای انجومانامه وا به کار گرتن د خصوصیت \"کل کردن نومه د ای کاریار\"{{SITENAME}} وه دس $1 به $2 کل بی.",
        "usermessage-summary": "رئتن د سامونه پیغوم",
        "usermessage-editor": "پیغوم فرسن سیستم",
        "usermessage-template": "ویکی وارسگر:پیغوم کاریار",
-       "watchlist": "سیل برگ",
-       "mywatchlist": "سیل برگ",
+       "watchlist": "سئیل بأرگ",
+       "mywatchlist": "سئیل بأرگ",
        "watchlistfor2": "سي $1 $2",
        "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت",
        "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
-       "watchnologin": "وارد نبیه",
-       "addwatch": "اضاÙ\81 Ú©Ø±Ø¯Ù\86 Ø¯ Ø³Û\8cÙ\84 Ø¨رگ",
+       "watchnologin": "ھأنی نیوٙماە ڤامین",
+       "addwatch": "ئضاÙ\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¯ Ø³Ø¦Û\8cÙ\84 Ø¨Ø£رگ",
        "addedwatchtext": "بلگه «[[:$1]]» د [[Special:Watchlist|نومگه دماگردی]] شما اضاف بی.\nآلشتیا ای بلگه بلگه چک چنه ری وه ریش د نهاتر د ایچه نومگه کاری بوئه.",
        "addedwatchtext-short": "بلگه \"$1\" وه سیل برگ شما اضاف بیه.",
-       "removewatch": "جا وه جا کردن د سیل برگ",
+       "removewatch": "جا ڤئ جا کئردئن د سئیل بأرگ",
        "removedwatchtext": "بلگه\"[[:$1]]\" د [[Special:سیل برگ|سیل برگ خوتو]] جا وه جا بیه.",
        "removedwatchtext-short": "بلگه \"$1\" د سیل برگ جا وه جا بیه.",
-       "watch": "سيل كردن",
-       "watchthispage": "ديئن ای بلگه",
-       "unwatch": "ديه نبيه",
-       "unwatchthispage": "Ù\88اداشتÙ\86 دیئن",
-       "notanarticle": "مینونه هیچ بلگه ای نئ",
+       "watch": "سئیل کئردئن",
+       "watchthispage": "دیئن ئی بألگە",
+       "unwatch": "دیە نأبییە",
+       "unwatchthispage": "Ù\86ئھاگئرÛ\8c دیئن",
+       "notanarticle": "ھیچ بألگە مینوٙنە داری نی",
        "notvisiblerev": "آخری وانئری که د دس یه کاریار هنی انجوم بیه پاکسا بیه.",
        "watchlist-details": "{{PLURAL:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی.",
-       "wlheader-enotif": "وارسیاری ایمیل فعال بیه.",
+       "wlheader-enotif": "ڤارئسیاری أنجومانامە کونئشتکار بییە.",
        "wlheader-showupdated": "بلگه یایی که د آخرین کرتی که شما دشو دیئن کردیته آلشت بینه د <strong>توپر</strong>نشون دئه بینه",
        "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتی}} که د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} دماتر انجوم بیه هیئش، ویرگار آخرین واجوری انجام شده موجود است، ویرگار آخری واجوری: $3، $4",
        "wlshowlast": "آخرین$1 ساعتیا $2و روزیا  نشو بیئه",
-       "watchlist-options": "گزÛ\8cÙ\86Û\8cا Ø³Û\8cÙ\84 Ø¨رگ",
-       "watching": "د حال دیئن...",
+       "watchlist-options": "Ú\86Û\8cا Ø³Ø¦Û\8cÙ\84 Ø¨Ø£رگ",
+       "watching": "د حال و بال دیئن...",
        "unwatching": "د حال ندیئن...",
        "watcherrortext": "یه گل اشگال د گات آلشت کردن میزونکاری نومگه سیل برگتو سی «$1» پیش اوما.",
        "enotif_reset": "همه بلگه یا دیئه بینه نشودار بکید",
        "enotif_body_intro_changed": "{{SITENAME}} بلگه $1 د ویرگار $PAGEEDITDATE وه دس {{gender:$2|$2}} آلشت بیه، سی وانئری ایسنی سیل $3 بکیت.",
        "enotif_lastvisited": "همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.",
        "enotif_lastdiff": "سی دیئن ای آلشتیا $1 نه سیل بکیت.",
-       "enotif_anon_editor": "کارو ناشناس$1",
+       "enotif_anon_editor": "کاریار نادیار $1",
        "enotif_body": "$WATCHINGUSERNAME نازار،\n\n$PAGEINTRO $NEWPAGE\n\n\nتوضیح ویراشتکار: $PAGESUMMARY $PAGEMINOREDIT\n\nپیوند گرتن وا ویراشتکار:\nنومه: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا گاتی که سر نه دئیته وه بلگه، د حال و بار پیش اومائن ائتمالی کنشتیاری بیشتر، تا گاتی که وا نوم کاریاریتو هایت د سامونه، گوته دیاری سی شما کل نبوئه.\nشما همچنی می تونید د بلگه دماگریا خوتو بیرقیا مربوط وه وارسکاری نه صفر بکیت همچنی می تونیت بیرقیا وارسکاری نه د نو نشوکاری بکیت.\n\nدوسیار شما، سامونه وارسکاری {{SITENAME}}\n\n--\nسی آلشت دئن میزونکاریا نومگه انجومانامه یا گوته دیاری روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی آلشت دئن میزونکاری نومگه دماگریاتو روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی پاکساکاری بلگه د نومگه دماگریاتو روئیت د $UNWATCHURL.\n\nبازحرد و هومیاری بیشتر:\n$HELPPAGE",
        "created": "دروس بیه",
        "changed": "آلشت بیه",
-       "deletepage": "پاک کردن بلگه",
-       "confirm": "Ù\85ئÙ\83Ù\85 Ù\83ردن",
-       "excontent": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 :\"$1\" بی",
+       "deletepage": "پاکسا کئردئن بألگە",
+       "confirm": "Ù¾Ù\88شت Ø±Ø§Ø³ Ú©Ø§Ø±Û\8c Ú©Ø¦Ø±Ø¯Ø¦ن",
+       "excontent": "Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 :\"$1\" بی",
        "excontentauthor": "مینونه بلگه یه بی: «$1» (و تئنا هومیار«[[Special:Contributions/$2|$2]]» بی)",
        "exbeforeblank": "مینونه حالی دمایی:\"$1\" بی",
-       "delete-confirm": "پاکسا Ú©Ø±Ø¯Ù\86\"$1\"",
-       "delete-legend": "پاك كردن",
+       "delete-confirm": "پاکسا Ú©Ø¦Ø±Ø¯Ø¦Ù\86 \"$1\"",
+       "delete-legend": "پاکسا کئردئن",
        "historywarning": "<strong>هشدار:</strong> بلگه یی که شما میهایت پاکساش بکیت دش یه گل ویرگارچه واگرد $1 {{PLURAL:$1|وانئری|وانئریا}} ئه:",
        "confirmdeletetext": "شما د حال و بار پاکسا کردن یه گل بلگه یا عسگ د رسینه جا واگرد همه ویرگارچه ونیت.\nلطف بکیت ای کنشتکاری نه پشت راسکاری بکیت و یه دل بوئیت که سرانجوم ای کار نه دونیت و ای کار نه مطابق وا [[{{MediaWiki:Policy-url}}|سیاستیا]] انجوم دئیته.",
        "actioncomplete": "عملكرد كامل بيه",
        "dellogpagetext": "نومگه هاری یه گل نومگه د آخری چیا پاکسا بیه هئ.",
        "deletionlog": "پهرستنومه پاک بیئن",
        "reverted": "لرسه د نزیکترین وانئری",
-       "deletecomment": "دليل:",
-       "deleteotherreason": "دليليا هنی:",
-       "deletereasonotherlist": "دلیل هنی",
+       "deletecomment": "دألیل:",
+       "deleteotherreason": "دألیلیا/ئضافی ھأنی:",
+       "deletereasonotherlist": "دألیل ھأنی",
        "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
        "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
        "delete-toobig": "ای بلگه ویرگارچه ویرایشت فره گپی داره، که د ور گرته بیشتر د یه گل د $1 {{PLURAL:$1|نسقه|نسقه}} ئه.\nسی یه که د اختلال ناحاستنی د {{SITENAME}} نهاگری با پاکسا کردن ای جوراین بلگه یا محدود بیه.c",
        "rollback-success": "ویرایشتیا $1 پاکساگری بی؛\nبلگه وه آخری ویرایشت $2 آلشت بیه.",
        "sessionfailure-title": "شکست حردن نشینگه",
        "sessionfailure": "چنی وه نظری میا که مشکلی ها د نشتجا کاریاری شما؛\nانجومگر حاستنی سی یه که د دزیه بیین دونسمنیاتو د نشسجا کاریاری نهاگری با انجومشیو بیه.\nلطف بکیت د ری دگمه ؤرئشتن بپورنیت و بلگه یی که رسسینه دش د نو واحونی بکیت، اوسه دنو تلاش بکیت.",
+       "changecontentmodel-title-label": "داسوٙن بألگە",
+       "changecontentmodel-reason-label": "دألیل:",
        "protectlogpage": "پر و پیم کاری کردن",
        "protectlogtext": "د هار یه گل نومگه د آلشتیا ریتراز پر و پیم کاری بلگه یا اومائه.\n[[Special:ProtectedPages|نومگه بلگه یا پر و پیم کار بیه]] نه سی دیئن نومگه پر و پیم کاری کارگرا بلگه یا سیل بکیت.",
        "protectedarticle": "حفاظت بيه [[$1]]",
        "protect-norestrictiontypes-text": "امکان پر و پیم کردن ای بلگه سی یه که نوع محدودیتی ناره، وجود ناره.",
        "protect-norestrictiontypes-title": "بلگه بی حامین گر",
        "protect-legend": "پشت راس کردن حامین گری",
-       "protectcomment": "دلیل:",
+       "protectcomment": "دألیل:",
        "protectexpiry": "تموم بين:",
        "protect_expiry_invalid": "گات تموم بیین نامعتوره.",
        "protect_expiry_old": "گات تموم بیین مال دماتره.",
        "duration-days": "$1{{PLURAL:$1|روز|روزیا}}",
        "duration-weeks": "$1 {{PLURAL:$1|هفته|هفته یا}}",
        "duration-years": "$1{{PLURAL:$1| سال|سالیا}}",
-       "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
+       "duration-decades": "$1 {{PLURAL:$1|دأھە|دأھە یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
        "duration-millennia": "$1 {{PLURAL:$1|میلینیوم|ملینا}}",
        "rotate-comment": "عسگ وا $1 {{PLURAL:$1|گرینج|گرینج}} ساعت گرد در حرده",
index 67ff93b..a64e379 100644 (file)
@@ -41,6 +41,7 @@
        "tog-hideminor": "Slėpti smulkius pakeitimus naujausių keitimų sąraše",
        "tog-hidepatrolled": "Slėpti patikrintus keitimus paskutinių keitimų sąraše",
        "tog-newpageshidepatrolled": "Slėpti patikrintus puslapius iš naujausių straipsnių sąrašo",
+       "tog-hidecategorization": "Slėpti puslapių kategorizavimą",
        "tog-extendwatchlist": "Išplėsti stebimųjų sąrašą, kad rodytų visus tinkamus keitimus, ne tik pačius naujausius.",
        "tog-usenewrc": "Grupuoti pakeitimas pagal puslapį paskutinių keitimų ir stebėjimo sąrašuose",
        "tog-numberheadings": "Automatiškai numeruoti skyrelius",
@@ -60,7 +61,7 @@
        "tog-enotifminoredits": "Siųsti man laišką, kai puslapio keitimas yra smulkus",
        "tog-enotifrevealaddr": "Rodyti mano el. pašto adresą priminimo laiškuose",
        "tog-shownumberswatching": "Rodyti stebinčių naudotojų skaičių",
-       "tog-oldsig": "Esamo parašo peržiūra:",
+       "tog-oldsig": "Galiojantis parašas:",
        "tog-fancysig": "Laikyti parašą vikitekstu (be automatinių nuorodų)",
        "tog-uselivepreview": "Naudoti tiesioginę peržiūrą",
        "tog-forceeditsummary": "Klausti, kai palieku tuščią keitimo komentarą",
@@ -70,6 +71,7 @@
        "tog-watchlisthideliu": "Slėpti prisijungusių naudotojų keitimus stebimųjų sąraše",
        "tog-watchlisthideanons": "Slėpti anoniminių naudotojų keitimus stebimųjų sąraše",
        "tog-watchlisthidepatrolled": "Slėpti patikrintus keitimus stebimųjų sąraše",
+       "tog-watchlisthidecategorization": "Slėpti puslapių kategorizavimą",
        "tog-ccmeonemails": "Siųsti man laiškų, kuriuos siunčiu kitiems naudotojams, kopijas",
        "tog-diffonly": "Nerodyti puslapio turinio po skirtumais",
        "tog-showhiddencats": "Rodyti paslėptas kategorijas",
        "thu": "Ket",
        "fri": "Pen",
        "sat": "Šeš",
-       "january": "Sausis",
+       "january": "sausio",
        "february": "vasario",
        "march": "kovo",
-       "april": "Balandis",
-       "may_long": "Gegužė",
-       "june": "Birželis",
-       "july": "Liepa",
-       "august": "Rugpjūtis",
+       "april": "balandžio",
+       "may_long": "gegužės",
+       "june": "birželio",
+       "july": "liepos",
+       "august": "rugpjūčio",
        "september": "rugsėjo",
-       "october": "Spalis",
-       "november": "Lapkritis",
+       "october": "spalio",
+       "november": "lapkričio",
        "december": "gruodžio",
        "january-gen": "Sausio",
        "february-gen": "Vasario",
        "versionrequired": "Reikalinga $1 MediaWiki versija",
        "versionrequiredtext": "Reikalinga $1 MediaWiki versija, kad pamatytumėte šį puslapį. Žiūrėkite [[Special:Version|versijos puslapį]].",
        "ok": "Gerai",
-       "retrievedfrom": "Gauta iš \"$1\"",
+       "retrievedfrom": "Gauta iš „$1“",
        "youhavenewmessages": "Jūs turite $1 ($2).",
        "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito vartotojo|$3 vartotojų}} ($2).",
        "youhavenewmessagesmanyusers": "Jūs turite $1 iš daugelio vartotojų ( $2 ) .",
        "createaccountreason": "Priežastis:",
        "createacct-reason": "Priežastis",
        "createacct-reason-ph": "Kodėl kuriate kitą paskyrą",
-       "createacct-captcha": "Saugumo patikrinimas",
-       "createacct-imgcaptcha-ph": "Įveskite tekstą, kurį matote aukščiau",
        "createacct-submit": "Sukurkite savo paskyrą",
        "createacct-another-submit": "Sukurti paskyrą",
        "createacct-benefit-heading": "{{SITENAME}} sukurtas žmonių kaip jūs.",
        "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:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJū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}}\n($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} susieto su šiuo elektroniniu paštu $2. \n\n{{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: \n$1\n\nLaikinas slaptažodis: \n$2",
-       "passwordreset-emailsent": "Slaptažodžio priminimo laiškas buvo išsiųstas.",
+       "passwordreset-emailsent": "Jeigu tai yra jūsų paskyros registruotas el. pašto adresas, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
        "passwordreset-emailsent-capture": "Slaptažodžio priminimo laiškas bus išsiųstas, toks koks parodytas.",
        "passwordreset-emailerror-capture": "Priminimo elektroninis laiškas buvo sukurtas, toks, koks parodytas žemiau, bet pasiuntimas naudotojui buvo nesėkmingas: $1",
        "changeemail": "Pakeisti ar pašalinti el. pašto adresą",
-       "changeemail-header": "Keisti paskyros el. pašto adresą",
+       "changeemail-header": "Užpildykite šią formą, kad pakeistumėte savo el. pašto adresą. Jeigu norite pašalinti bet kurio el. pašto adreso susiejimą su savo paskyra, palikite naujojo el. pašto adreso lauką tuščią, kai pateiksite formą.",
+       "changeemail-passwordrequired": "Jums reikės įvesti savo slaptažodį, kad patvirtintumėte šį pakeitimą.",
        "changeemail-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
        "changeemail-oldemail": "Dabartinis el. pašto adresas:",
        "changeemail-newemail": "Naujas el. pašto adresas:",
+       "changeemail-newemail-help": "Jeigu norite pašalinti savo el. pašto adresą, šį laukelį palikite tuščią. Jeigu pašalinsite el. pašto adresą, nebegalėsite atstatyti pamiršto slaptažodžio ir nebegausite el. laiškų iš šios svetainės.",
        "changeemail-none": "(nėra)",
        "changeemail-password": "Jūsų {{SITENAME}} slaptažodis:",
        "changeemail-submit": "Keisti el. pašto adresą",
        "sig_tip": "Jūsų parašas bei laikas",
        "hr_tip": "Horizontali linija (naudokite taupiai)",
        "summary": "Paaiškinimas:",
-       "subject": "Tema/antraštė:",
+       "subject": "Tema:",
        "minoredit": "Tai smulkus pataisymas",
        "watchthis": "Stebėti šį puslapį",
        "savearticle": "Išsaugoti puslapį",
        "missingcommenttext": "Prašome įvesti komentarą.",
        "missingcommentheader": "'''Priminimas:''' Jūs nenurodėte šio komentaro pavadinimo/antraštės.\nJei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus įrašytas be jo.",
        "summary-preview": "Komentaro peržiūra:",
-       "subject-preview": "Skyrelio/antraštės peržiūra:",
+       "subject-preview": "Temos peržiūra:",
        "previewerrortext": "Įvyko klaida bandant peržiūrėti jūsų pakeitimus.",
        "blockedtitle": "Naudotojas yra užblokuotas",
        "blockedtext": "'''Jūsų naudotojo vardas arba IP adresas yra užblokuotas.'''\n\nUžblokavo $1. Nurodyta priežastis yra ''$2''.\n\n* Blokavimo pradžia: $8\n* Blokavimo pabaiga: $6\n* Numatytas blokuojamasis: $7\n\nJūs galite susisiekti su $1 arba kuriuo nors kitu [[{{MediaWiki:Grouppage-sysop}}|administratoriumi]] ir aptarti neaiškumus dėl blokavimo.\nAtkreipkite dėmesį, kad negalėsite naudotis funkcija „Rašyti laišką šiam naudotojui“, jei nesate užsiregistravę ir pateikę realaus savo el. pašto adreso naudotojo [[Special:Preferences|nustatymuose]], arba, jei jums užblokuotas šios funkcijos naudojimas.\nJūsų IP adresas yra $3, o blokavimo ID yra #$5.\nPrašome nurodyti vieną iš jų ar abu, kai kreipiatės dėl blokavimo.",
        "token_suffix_mismatch": "'''Jūsų pakeitimas buvo atmestas, nes jūsų naršyklė iškraipė skyrybos ženklus keitimo žymėje. Keitimas buvo atmestas norint apsaugoti puslapio tekstą nuo sugadinimo. Taip kartais būna, kai jūs naudojate anoniminį tarpinio serverio paslaugą.'''",
        "edit_form_incomplete": "'''Kai redaguoti formos dalys nepasiekė serverio; du kartus patikrinti, kad jūsų pakeitimai yra nesugadintos ir bandykite dar kartą.'''",
        "editing": "Taisomas $1",
-       "creating": "Kuriama $1",
+       "creating": "Kuriamas straipsnis „$1“",
        "editingsection": "Taisomas $1 (skyrelis)",
        "editingcomment": "Taisomas $1 (naujas skyrius)",
        "editconflict": "Redaguoti konfliktą: $1",
        "permissionserrors": "Teisių klaida",
        "permissionserrorstext": "Jūs neturite teisių tai daryti dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
        "permissionserrorstext-withaction": "Jūs neturite leidimo $2 dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
+       "contentmodelediterror": "Jūs negalite redaguoti šios versijos, nes jos turinio modelis yra <code>$1</code> ir dabartinis puslapio turinio modelis yra <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
        "moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų ir pervadinimų sąrašas.",
        "moveddeleted-notice-recent": "Atsiprašome, šis puslapis nesenai buvo ištrintas (per pastarąsias 24 valandas). Puslapio ištrynimo ir perkėlimo istorija yra pateikiama žemiau kaip nuoroda.",
        "showingresultsinrange": "Žemiau rodoma iki {{PLURAL:$1|<strong>1</strong> gavinio|<strong>$1</strong> gavinių}} imtyje nuo <strong>$2</strong> iki <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Davinys <strong>$1</strong> iš <strong>$3</strong>|Daviniai <strong>$1 - $2</strong> iš <strong>$3</strong>}}",
        "search-nonefound": "Nėra rezultatų, atitinkančių užklausą.",
+       "search-nonefound-thiswiki": "Nėra rezultatų atitinkančių užklausą šiame tinklapyje.",
        "powersearch-legend": "Išplėstinė paieška",
        "powersearch-ns": "Ieškoti vardų srityse:",
        "powersearch-togglelabel": "Pažymėti:",
        "prefs-watchlist-token": "Stebimųjų sąrašo raktas:",
        "prefs-misc": "Įvairūs nustatymai",
        "prefs-resetpass": "Keisti slaptažodį",
-       "prefs-changeemail": "Keisti el. pašto adresą",
+       "prefs-changeemail": "Keisti arba pašalinti el. pašto adresą",
        "prefs-setemail": "Nustatyti el. pašto adresą",
        "prefs-email": "El. pašto nustatymai",
        "prefs-rendering": "Išvaizda",
        "prefs-help-recentchangescount": "Į tai įeina naujausi keitimai, puslapių istorijos ir specialiųjų veiksmų sąrašai.",
        "prefs-help-watchlist-token2": "Tai yra slaptas jūsų stebimųjų sąrašo raktas, skirtas žiniatinkliui.\nKiekvienas, kurį jį žino, gali skaityti jūsų stebimųjų puslapių sąrašą, taigi, juo nesidalinkite.\nJei reikia jį anuliuoti, [[Special:ResetTokens|spauskite čia]].",
        "savedprefs": "Nustatymai sėkmingai išsaugoti.",
+       "savedrights": "Naudotojo teisės {{GENDER:$1|$1}} buvo išsaugotos.",
        "timezonelegend": "Laiko juosta:",
        "localtime": "Vietinis laikas:",
        "timezoneuseserverdefault": "Naudoti wiki pradinį ($1)",
        "group-bot": "Robotai",
        "group-sysop": "Administratoriai",
        "group-bureaucrat": "Biurokratai",
-       "group-suppress": "Peržiūrėtojai",
+       "group-suppress": "Slopintojai",
        "group-all": "(visi)",
        "group-user-member": "{{GENDER:$1|naudotojas|naudotoja}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatiškai patvirtintas naudotojas|automatiškai patvirtinta naudotoja}}",
        "group-bot-member": "Botas",
        "group-sysop-member": "Administratorius",
        "group-bureaucrat-member": "Biurokratas",
-       "group-suppress-member": "Peržiūrėtojas",
+       "group-suppress-member": "{{GENDER:$1|slopintojas|slopintoja}}",
        "grouppage-user": "{{ns:project}}:Naudotojai",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatiškai patvirtinti naudotojai",
        "grouppage-bot": "{{ns:project}}:Robotai",
        "rcshowhidemine": "$1 mano keitimus",
        "rcshowhidemine-show": "Rodyti",
        "rcshowhidemine-hide": "Slėpti",
+       "rcshowhidecategorization": "$1 puslapio kategorizavimas",
+       "rcshowhidecategorization-show": "Rodyti",
+       "rcshowhidecategorization-hide": "Slėpti",
        "rclinks": "Rodyti paskutinius $1 pakeitimų per paskutiniąsias $2 dienų<br />$3",
        "diff": "skirt",
        "hist": "ist",
        "upload-options": "Įkėlimo nustatymai",
        "watchthisupload": "Stebėti šią rinkmeną",
        "filewasdeleted": "Failas šiuo vardu anksčiau buvo įkeltas, o paskui ištrintas. Jums reikėtų patikrinti $1 prieš bandant įkelti jį vėl.",
+       "filename-thumb-name": "Tai panašu į miniatiūros pavadinimą. Prašome neįkėlinėti miniatiūrų atgal į tą patį vikį. Kitu atveju, prašome pataisyti failo pavadinimą taip, kad jis būtų prasmingesnis ir neturėtų miniatiūros prefikso.",
        "filename-bad-prefix": "Jūsų įkeliamas failas prasideda su '''„$1“''', bet tai yra neapibūdinantis pavadinimas, dažniausiai priskirtas skaitmeninių kamerų. Prašome suteikti labiau apibūdinantį pavadinimą savo failui.",
        "upload-success-subj": "Įkelta sėkmingai",
        "upload-success-msg": "Jūsų įkėlimas iš [$2] buvo sėkmingas. Jį galima rasti čia: [[:{{ns:file}}:$1]]",
        "upload-dialog-button-done": "Atlikta",
        "upload-dialog-button-save": "Išsaugoti",
        "upload-dialog-button-upload": "Įkelti",
-       "upload-process-error": "Įvyko klaida",
-       "upload-process-warning": "Įvyko įspėjimas",
        "upload-form-label-select-file": "Pasirinkti failą",
        "upload-form-label-infoform-title": "Detalės",
        "upload-form-label-infoform-name": "Pavadinimas",
        "foreign-structured-upload-form-label-own-work": "Tai yra mano darbas",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorijos",
        "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-own-work-message-local": "Patvirtinu, kad įkeliu šį failą su šiomis naudojimosi sąlygomis ir licencijavimo politika į {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Jeigu Jūs negalite įkelti šio failo su {{SITENAME}}  politika, prašome uždaryti dialogą ir pabandyti kitą metodą.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Jūs taip pat galite norėti išbandyti [[Special:Upload|numatytąjį įkėlimo puslapį]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Aš suprantu, kad įkeliu šį failą į dalinimosi repozitoriją. Aš patvirtinu, kad tai darau laikydamasis jų paslaugų teikimo sąlygų ir licencijavimo politikos.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Jeigu negalite įkelti šio failo su dalinimosi repozitorijos politika, prašome uždaryti šį dialogą ir bandyti kitą metodą.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Jūs taip pat galite norėti išbandyti [[Special:Upload|{{SITENAME}} įkėlimo puslapį]], jeigu šis failas gali būti įkeltas su jų politika.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Aš patvirtinu, kad man priklauso šio failo autorinės teisės ir sutinku neatšaukiamai išleisti šį failą į Wikimedia Commons su [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] licencija, ir aš sutinku su [https://wikimediafoundation.org/wiki/Terms_of_Use paslaugų teikimo sąlygomis].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Jeigu Jums nepriklauso šio failo autorinės teisės arba Jūs norite išleisti jį su kitokia licencija, apsvarstykite naudojimą [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons įkėlimo vedlį].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Jūs taip pat galite norėti išbandyti [[Special:Upload|{{SITENAME}} įkėlimo puslapį]], jeigu šis puslapis leidžia failų įkėlimą pagal jų politiką.",
        "backend-fail-stream": "Negali būti apdorotas failas $1.",
        "backend-fail-backup": "Negali būti išsaugotas failas $1.",
        "backend-fail-notexists": "Failas $1 neegzistuoja.",
        "filerevert-legend": "Failo sugrąžinimas",
        "filerevert-intro": "<span class=\"plainlinks\">Jūs grąžinate '''[[Media:$1|$1]]''' į versiją $4 ($2, $3).</span>",
        "filerevert-comment": "Priežastis:",
-       "filerevert-defaultcomment": "Grąžinta į $1, $2 versiją",
+       "filerevert-defaultcomment": "Grąžinta į $1, $2 ($3) versiją",
        "filerevert-submit": "Grąžinti",
        "filerevert-success": "<span class=\"plainlinks\">'''[[Media:$1|$1]]''' buvo sugrąžintas į versiją $4 ($2, $3).</span>",
        "filerevert-badversion": "Nėra jokių ankstesnių vietinių šio failo versijų su pateiktu laiku.",
        "deletepage": "Trinti puslapį",
        "confirm": "Tvirtinu",
        "excontent": "buvęs turinys: „$1“",
-       "excontentauthor": "buvęs turinys: „$1“ (redagavo tik „[[Special:Contributions/$2|$2]]“)",
+       "excontentauthor": "buvęs turinys: „$1“; redagavo tik „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|aptarimas]])",
        "exbeforeblank": "prieš ištrinant turinys buvo: „$1“",
        "delete-confirm": "Ištrinti „$1“",
        "delete-legend": "Trynimas",
        "svg-long-error": "Neleistinas SVG failas: $1",
        "show-big-image": "Pradinė rinkmena",
        "show-big-image-preview": "Šios peržiūros dydis: $1.",
+       "show-big-image-preview-differ": "Rinkmenos $2 peržiūros $3 dydisː $1.",
        "show-big-image-other": "{{PLURAL:$2|Kita rezoliucija|Kitos $2 rezoliucijos|Kitų $2 rezoliucijų}}: $1.",
        "show-big-image-size": "$1 × $2 taškų",
        "file-info-gif-looped": "ciklinis",
        "api-error-badaccess-groups": "Jums neleidžiama įkelti failus į šią wiki.",
        "api-error-badtoken": "Vidinė klaida: blogai atpažinimo ženklas.",
        "api-error-copyuploaddisabled": "Siuntimas pagal URL yra išjungtas šiame serveryje.",
-       "api-error-duplicate": "Jau {{PLURAL:$1|yra kitas failas|yra kiti failai}} puslapyje su tuo pačiu turiniu..",
+       "api-error-duplicate": "Jau {{PLURAL:$1|yra kitas failas|yra kiti failai}} puslapyje su tuo pačiu turiniu.",
        "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo kitas failas|buvo kitų failų}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo|buvo}} ištrinti.",
        "api-error-empty-file": "Pateikta failas buvo tuščias.",
        "api-error-emptypage": "Kurti naujus, tuščius puslapius neleidžiama.",
        "default-skin-not-found-no-skins": "Ups! Jūsų viki numatytoji išvaizdą, nurodyta <code>$wgDefaultSkin</code> <code>$1</code>, yra negalima.\n\nJūs neturite įdiegtų išvaizdų.\n\n; Jei ką tik įsidiegėte MediaWiki:\n: Jūs tikriausiai įsidiegėte iš git arba tiesiai iš kodo naudodami kitą metodą. To buvo tikimasi. Pabandykite įsidiegti išvaizdų iš [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org išvaizdų katalogo] taip:\n:* Parsisiųsdami  [https://www.mediawiki.org/wiki/Download tvarkyklę], kuri turi kelias išvaizdas ir plėtinius. Jūs galite nukopijuoti ir įklijuoti <code>skins/</code> katalogą iš jos.\n:* Persiųsdami individualias išvaizdas iš [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Naudodami Git išvaizdų parsisiuntimui].\n: Tai neturėtų trukdyti Jūsų git saugyklai jei Jūs esate MediaWiki kūrėjas. Žiūrėkite [https://www.mediawiki.org/wiki/Manual:Skin_configuration Instrukcija: Išvaizdos konfigūracija] dėl informacijos kaip įgalinti išvaizdas ir pasirinkti numatytąją.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (įgalinta)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''išjungtas''')",
-       "mediastatistics": "Medios statistika",
+       "mediastatistics": "Daugialypės terpės statistika",
        "mediastatistics-summary": "Statistika apie įkeltus failo tipus. Tai apima tik naujausias failo versijas. Senos ar ištrintos failų versijos nėra įtrauktos.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bitas|$1 bitai}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME tipas",
index b10cf28..22053d7 100644 (file)
        "nstab-template": "Veidne",
        "nstab-help": "Palīdzība",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Sākumlapa",
        "nosuchaction": "Šādas darbības nav.",
        "nosuchactiontext": "Iekš URL norādītā darbība ir nederīga.\nTas var būt no drukas kļūdas URL, vai arī no kļūdainas saites.\nTas arī var būt saistīts ar {{GRAMMAR:ģenitīvs|{{SITENAME}}}} programmatūras kļūdu.",
        "nosuchspecialpage": "Nav tādas īpašās lapas",
        "createaccountreason": "Iemesls:",
        "createacct-reason": "Iemesls",
        "createacct-reason-ph": "Kāpēc jūs veidojat citu kontu",
-       "createacct-captcha": "Drošības pārbaude",
-       "createacct-imgcaptcha-ph": "Ievadiet tekstu, kuru jūs redzat augstāk",
        "createacct-submit": "Izveidot savu kontu",
        "createacct-another-submit": "Izveidot citu dalībnieka kontu",
        "createacct-benefit-heading": "{{SITENAME}} darbojas ar tādu cilvēku kā Tu ieguldījumu.",
        "sig_tip": "Tavs paraksts ar laika atzīmi",
        "hr_tip": "Horizontāla līnija (neizmanto lieki)",
        "summary": "Kopsavilkums:",
-       "subject": "Tēma/virsraksts:",
+       "subject": "Temats:",
        "minoredit": "Maznozīmīgs labojums",
        "watchthis": "Uzraudzīt šo lapu",
        "savearticle": "Saglabāt lapu",
        "missingcommenttext": "Lūdzu, ievadi tekstu zemāk redzamajā logā!",
        "missingcommentheader": "'''Atgādinājums:''' Tu šim komentāram neesi norādījis virsrakstu/tematu.\nJa tu vēlreiz spiedīsi uz \"{{int:savearticle}}\", tavas izmaiņas tiks saglabātas bez virsraksta.",
        "summary-preview": "Kopsavilkuma pirmskats:",
-       "subject-preview": "Kopsavilkuma/virsraksta pirmskats:",
+       "subject-preview": "Temata pirmskats:",
        "blockedtitle": "Dalībnieks ir bloķēts.",
        "blockedtext": "'''Tavs lietotāja vārds vai IP adrese ir nobloķēta.'''\n\n$1 nobloķēja tavu lietotāja vārdu vai IP adresi.\nBloķējot norādītais iemesls bija: ''$2''.\n\n*Bloka sākums: $8\n*Bloka beigas: $6\n*Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|administratoru]] lai apspriestu šo bloku.\n\nPievērs uzmanību, tam, ka ja tu neesi norādījis derīgu e-pasta adresi ''[[Special:Preferences|savās izvēlēs]]'', tev nedarbosies \"sūtīt e-pastu\" iespēja.\n\nTava IP adrese ir $3 un bloka identifikators ir #$5. Lūdzu iekļauj vienu no tiem, vai abus, visos turpmākajos pieprasījumos.",
        "autoblockedtext": "Tava IP adrese ir tikusi automātiski nobloķēta, tāpēc, ka to (nupat kā) ir lietojis cits lietotājs, kuru nobloķēja $1.\nNorādītais bloķēšanas iemesls bija:\n\n:''$2''\n\n* Bloka sākums: $8\n* Bloka beigas: $6\n* Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|adminu]] lai apspriestu šo bloku.\n\nAtceries, ka tu nevari lietot \"sūtīt e-pastu šim lietotājam\" iespēju, ja tu neesi norādījis derīgu e-pasta adresi savās [[Special:Preferences|lietotāja izvelēs]] un bloķējot tev nav aizbloķēta iespēja sūtīt e-pastu.\n\nTava pašreizējā IP adrese ir $3 un  bloka ID ir $5.\nLūdzu iekļauj šos visos ziņojumos, kurus sūti adminiem, apspriežot šo bloku.",
        "prefs-watchlist": "Uzraugāmie raksti",
        "prefs-editwatchlist": "Labot uzraugāmo rakstu sarakstu",
        "prefs-editwatchlist-label": "Labot ierakstus savā uzraugāmo rakstu sarakstā:",
+       "prefs-editwatchlist-raw": "Izmainīt uzraugāmo rakstu saraksta kodu",
        "prefs-editwatchlist-clear": "Notīrīt uzraugāmos rakstus",
        "prefs-watchlist-days": "Dienu skaits, kuras parādīt uzraugāmo rakstu sarakstā:",
        "prefs-watchlist-days-max": "Ne vairāk kā $1 {{PLURAL:$1|dienas|dienu|dienas}}",
        "prefs-watchlist-token": "Uzraugāmo lapu saraksta marķieris:",
        "prefs-misc": "Dažādi",
        "prefs-resetpass": "Mainīt paroli",
-       "prefs-changeemail": "Mainīt e-pastu",
+       "prefs-changeemail": "Mainīt vai noņemt e-pastu",
        "prefs-setemail": "Uzstādīt e-pasta adresi",
        "prefs-email": "E-pasta uzstādījumi",
        "prefs-rendering": "Izskats",
        "rcshowhidemine": "$1 manus",
        "rcshowhidemine-show": "Rādīt",
        "rcshowhidemine-hide": "Slēpt",
+       "rcshowhidecategorization-show": "Rādīt",
+       "rcshowhidecategorization-hide": "Paslēpt",
        "rclinks": "Parādīt pēdējās $1 izmaiņas pēdējās $2 dienās.<br />$3",
        "diff": "izmaiņas",
        "hist": "hronoloģija",
index 002e571..4dd3759 100644 (file)
@@ -23,6 +23,7 @@
        "tog-hideminor": "Скривај ги ситните уредувања во скорешните промени",
        "tog-hidepatrolled": "Скриј испатролирани уредувања во скорешните промени",
        "tog-newpageshidepatrolled": "Скриј испатролирани страници од списокот на нови страници",
+       "tog-hidecategorization": "Сокриј ја категоризацијата на страниците",
        "tog-extendwatchlist": "Прошири го список на набљудувања за приказ на сите промени, не само скорешните",
        "tog-usenewrc": "Промени во групи по страници во списокот на скорешни промени",
        "tog-numberheadings": "Наброј ги заглавијата",
@@ -52,6 +53,7 @@
        "tog-watchlisthideliu": "Скриј ги уредувањата на најавените корисници во набљудуваните",
        "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во набљудуваните",
        "tog-watchlisthidepatrolled": "Скриј испатролирани уредувања од мојот список на набљудувања",
+       "tog-watchlisthidecategorization": "Сокриј ја категоризацијата на страниците",
        "tog-ccmeonemails": "Испраќај ми мои примероци од писмата што ги праќам на другите корисници",
        "tog-diffonly": "Не ја покажувај содржината на страницата под разликите",
        "tog-showhiddencats": "Прикажи скриени категории",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зошто правите друга сметка",
-       "createacct-captcha": "Безбедносна проверка",
-       "createacct-imgcaptcha-ph": "Внесете го гореприкажаниот текст",
        "createacct-submit": "Направи ја",
        "createacct-another-submit": "Создај сметка",
        "createacct-benefit-heading": "{{SITENAME}} е дело на луѓе како вас.",
        "permissionserrors": "Грешка со дозволата",
        "permissionserrorstext": "Немате дозвола да го направите тоа, од {{PLURAL:$1|следнава причина|следниве причини}}:",
        "permissionserrorstext-withaction": "Немате дозвола за $2, од {{PLURAL:$1|следнава причина|следниве причини}}:",
+       "contentmodelediterror": "Не можете да ја измените оваа преработка бидејќи нејзиниот содржински модел е <code>$1</code>, а тековниот содржински модел на страницата е <code>$2</code>.",
        "recreate-moveddeleted-warn": "Внимание: Повторно создавате страница што претходно била бришена.'''\n\nРазмислете дали е правилно да продолжите со уредување на оваа страница.\nПодолу е прикажан дневникот на бришења и преместувања на оваа страница:",
        "moveddeleted-notice": "Оваа страница била претходно бришена.\nДневникот на бришења и преместувања за оваа страница е прикажан подолу за ваше дополнително информирање.",
        "moveddeleted-notice-recent": "За жал, страницава беше неодамна избришана (во последниве 24 часа).\nПодолу можете да го погледате дневникот на бришење и преместување.",
        "showingresultsinrange": "Долу {{PLURAL:$1|е прикажан до <strong>еден</strong> резултат|се прикажани до <strong>$1</strong> резултати}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> од <strong>$3</strong>|Резултати <strong>$1 - $2</strong> од <strong>$3</strong>}}",
        "search-nonefound": "Нема резултати што одговараат на бараното.",
+       "search-nonefound-thiswiki": "Нема резултати што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Одбери:",
        "prefs-help-recentchangescount": "Подразбира скорешни промени, истории на страници и дневници.",
        "prefs-help-watchlist-token2": "Ова е тајна шифра за вашиот канализиран список на набљудувања.\nСекој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.\n[[Special:ResetTokens|Стиснете тука ако треба да зададете нова]].",
        "savedprefs": "Вашите нагодувања се зачувани.",
+       "savedrights": "Корисничките права на {{GENDER:$1|$1}} не се зачувани.",
        "timezonelegend": "Часовен појас:",
        "localtime": "Месно време:",
        "timezoneuseserverdefault": "Од викито ($1)",
        "rcshowhidemine": "$1 мои уредувања",
        "rcshowhidemine-show": "Прикажи",
        "rcshowhidemine-hide": "Скриј",
+       "rcshowhidecategorization": "$1 ја категоризацијата на страниците",
+       "rcshowhidecategorization-show": "Прикажи",
+       "rcshowhidecategorization-hide": "Скриј",
        "rclinks": "Прикажи скорешни $1 промени во последните $2 дена<br />$3",
        "diff": "разл",
        "hist": "истор",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Зачувај",
        "upload-dialog-button-upload": "Подигни",
-       "upload-process-error": "Се појави грешка",
-       "upload-process-warning": "Се јави предупредување",
        "upload-form-label-select-file": "Одберете податотека",
        "upload-form-label-infoform-title": "Подробно",
        "upload-form-label-infoform-name": "Назив",
        "autoredircomment": "Пренасочување кон [[$1]]",
        "autosumm-new": "Создадена страница со: $1",
        "autosumm-newblank": "Создадена празна страница",
-       "size-bytes": "$1 Б",
+       "size-bytes": "$1 {{PLURAL:$1|бајт|бајти}}",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "size-gigabytes": "$1 ГБ",
        "size-exabytes": "$1 ЕБ",
        "size-zetabytes": "$1 ЗБ",
        "size-yottabytes": "$1 ЈБ",
-       "size-pixel": "$1 П",
+       "size-pixel": "$1 {{PLURAL:$1|пиксел|пиксели}}",
        "size-kilopixel": "$1 КП",
        "size-megapixel": "$1 МП",
        "size-gigapixel": "$1 ГП",
index 75bfcde..dfdcc75 100644 (file)
@@ -37,6 +37,7 @@
        "tog-hideminor": "പുതിയ മാറ്റങ്ങളുടെ പട്ടികയിൽ ചെറിയ തിരുത്തുകൾ പ്രദർശിപ്പിക്കാതിരിക്കുക",
        "tog-hidepatrolled": "റോന്തുചുറ്റിയ തിരുത്തുകൾ പുതിയമാറ്റങ്ങളിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക",
        "tog-newpageshidepatrolled": "റോന്തുചുറ്റപ്പെട്ട താളുകൾ പുതിയതാളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക",
+       "tog-hidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം മറയ്ക്കുക",
        "tog-extendwatchlist": "ഏറ്റവും പുതിയവ മാത്രമല്ല, എല്ലാ മാറ്റങ്ങളും ദൃശ്യമാകുന്ന വിധത്തിൽ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വികസിപ്പിക്കുക.",
        "tog-usenewrc": "സമീപകാല മാറ്റങ്ങൾ, ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എന്നീ താളുകളിൽ മാറ്റങ്ങൾ ഗണംതിരിക്കുക",
        "tog-numberheadings": "ഉപവിഭാഗങ്ങൾക്ക് ക്രമസംഖ്യ കൊടുക്കുക",
@@ -66,6 +67,7 @@
        "tog-watchlisthideliu": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും ലോഗിൻ ചെയ്തിട്ടുള്ളവരുടെ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthideanons": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും അജ്ഞാത ഉപയോക്താക്കളുടെ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthidepatrolled": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് റോന്തുചുറ്റിയ തിരുത്തുകൾ മറയ്ക്കുക",
+       "tog-watchlisthidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം മറയ്ക്കുക",
        "tog-ccmeonemails": "ഞാൻ മറ്റുള്ളവർക്കയക്കുന്ന ഇമെയിലുകളുടെ ഒരു പകർപ്പ് എനിക്കും അയക്കുക",
        "tog-diffonly": "രണ്ട് പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസത്തിനു താഴെ താളിന്റെ ഉള്ളടക്കം കാണിക്കരുത്.",
        "tog-showhiddencats": "മറഞ്ഞിരിക്കുന്ന വർഗ്ഗങ്ങളെ കാണിക്കുക",
        "viewsource": "മൂലരൂപം കാണുക",
        "viewsource-title": "$1 എന്ന താളിന്റെ മൂലരൂപം കാണുക",
        "actionthrottled": "പ്രവൃത്തി നടത്തിയിരിക്കുന്നു",
-       "actionthrottledtext": "പാഴàµ\86à´´àµ\81ത്തിനെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ ഒരേ പ്രവൃത്തി കുറഞ്ഞ സമയത്തിനുള്ളിൽ നിരവധി തവണ ആവർത്തിക്കുന്നതു പരിമിതപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾ ആ പരിധി ലംഘിച്ചിരിക്കുന്നു. കുറച്ച് മിനിറ്റുകൾക്കു ശേഷം വീണ്ടും ശ്രമിക്കുക.",
+       "actionthrottledtext": "à´¦àµ\81à´°àµ\81പയàµ\8bà´\97ത്തിനെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ ഒരേ പ്രവൃത്തി കുറഞ്ഞ സമയത്തിനുള്ളിൽ നിരവധി തവണ ആവർത്തിക്കുന്നതു പരിമിതപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾ ആ പരിധി ലംഘിച്ചിരിക്കുന്നു. കുറച്ച് മിനിറ്റുകൾക്കു ശേഷം വീണ്ടും ശ്രമിക്കുക.",
        "protectedpagetext": "ഈ താൾ തിരുത്തോ മറ്റു പ്രവൃത്തികളോ തടയാനാകും വിധം സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്.",
        "viewsourcetext": "താങ്കൾക്ക് ഈ താളിന്റെ മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും.",
        "viewyourtext": "താങ്കൾക്ക് ഈ താളിലെ <strong>താങ്കളുടെ തിരുത്തുകളുടെ</strong> മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും.",
        "createaccountreason": "കാരണം:",
        "createacct-reason": "കാരണം",
        "createacct-reason-ph": "താങ്കൾ എന്തുകൊണ്ടാണ് മറ്റൊരു അംഗത്വം എടുക്കുന്നത്",
-       "createacct-captcha": "സുരക്ഷാ പരിശോധന",
-       "createacct-imgcaptcha-ph": "മുകളിൽ കാണുന്ന എഴുത്ത് ഇവിടെ നൽകുക",
        "createacct-submit": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക",
        "createacct-another-submit": "അംഗത്വമെടുക്കുക",
        "createacct-benefit-heading": "താങ്കളെപ്പോലെയുള്ളവരാണ്  {{SITENAME}}  പടുത്തുയർത്തിയിരിക്കുന്നത്.",
        "passwordreset-emailsent-capture": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.",
        "passwordreset-emailerror-capture": "താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1",
        "changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
-       "changeemail-header": "അംഗത്വത്തിന്റെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക",
+       "changeemail-header": "താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക.താങ്കളുടെ അംഗത്വവുമായി ഏതെങ്കിലുമൊരു ഇമെയിൽ വിലാസത്തിനുള്ള ബന്ധം ഒഴിവാക്കാൻ ഫോം പൂരിപ്പിക്കുമ്പോൾ പുതിയ ഇമെയിൽ വിലാസത്തിനുള്ള ഭാഗം ഒഴിച്ചിടുക.",
+       "changeemail-passwordrequired": "ഈ മാറ്റം സ്ഥിരീകരിക്കാൻ താങ്കളുടെ രഹസ്യവാക്ക് നൽകുക.",
        "changeemail-no-info": "ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.",
        "changeemail-oldemail": "ഇപ്പോഴത്തെ ഇമെയിൽ വിലാസം:",
        "changeemail-newemail": "പുതിയ ഇമെയിൽ വിലാസം:",
        "sig_tip": "തിരുത്തൽ സമയമടക്കമുള്ള താങ്കളുടെ ഒപ്പ്",
        "hr_tip": "തിരശ്ചീനരേഖ (മിതമായി മാത്രം ഉപയോഗിക്കുക)",
        "summary": "ചുരുക്കം:",
-       "subject": "വിഷയം/തലക്കെട്ട്:",
+       "subject": "വിഷയം:",
        "minoredit": "ഇതൊരു ചെറിയ തിരുത്താണ്",
        "watchthis": "ഈ താളിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "savearticle": "താൾ സേവ് ചെയ്യുക",
        "missingsummary": "'''ഓർമ്മക്കുറിപ്പ്:''' താങ്കൾ തിരുത്തലിന്റെ ചുരുക്കരൂപം നൽകിയിട്ടില്ല. ''സേവ് ചെയ്യുക'' ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ താങ്കൾ വരുത്തിയ മാറ്റം കാത്തുസൂക്ഷിക്കുന്നതാണ്.",
        "selfredirect": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താളിലേക്ക് തന്നെയുള്ള തിരിച്ചുവിടലാണ് താങ്കൾ സൃഷ്ടിക്കുന്നത്.\nതിരിച്ചുവിടലിനു താങ്കൾ നൽകിയ ലക്ഷ്യം തെറ്റിയിരിക്കാം അല്ലെങ്കിൽ താങ്കൾ തിരുത്തുന്നത് തെറ്റായ താൾ ആയിരിക്കാം.\nഎന്തായാലും, വീണ്ടും \"{{int:savearticle}}\" അമർത്തിയാൽ, തിരിച്ചുവിടൽ സൃഷ്ടിക്കപ്പെടുന്നതാണ്.",
        "missingcommenttext": "താങ്കളുടെ അഭിപ്രായം ദയവായി താഴെ രേഖപ്പെടുത്തുക.",
-       "missingcommentheader": "'''ഓർമ്മക്കുറിപ്പ്:''' ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''{{int:savearticle}}'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
+       "missingcommentheader": "<strong>ഓർമ്മക്കുറിപ്പ്:</strong> ഈ കുറിപ്പിന് താങ്കൾ വിഷയം/തലക്കെട്ട് നൽകിയിട്ടില്ല. ''{{int:savearticle}}'' എന്ന ബട്ടൺ ഒരുവട്ടം കൂടി അമർത്തിയാൽ വിഷയം/തലക്കെട്ട് ഇല്ലാതെ തന്നെ കാത്തുസൂക്ഷിക്കുന്നതാവും.",
        "summary-preview": "ചുരുക്കരൂപം എങ്ങനെയുണ്ടെന്നു കാണുക:",
-       "subject-preview": "വിഷയം/തലക്കെട്ട് എങ്ങനെയുണ്ടെന്ന് കാണുക:",
+       "subject-preview": "വിഷയം എങ്ങനെയുണ്ടെന്ന് കാണുക:",
        "previewerrortext": "താങ്കളുടെ മാറ്റങ്ങൾ എങ്ങനെയുണ്ടെന്ന് കാണാൻ ശ്രമിച്ചപ്പോൾ പിഴവുണ്ടായി.",
        "blockedtitle": "ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു",
        "blockedtext": "'''താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു'''\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, 'ഇദ്ദേഹത്തിന് ഇമെയിൽ അയക്കൂ' എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
        "prefs-help-recentchangescount": "പുതിയ മാറ്റങ്ങൾ, താളിന്റെ നാൾവഴികൾ, രേഖകൾ എന്നിവക്കും ഇത് ബാധകമാണ്.",
        "prefs-help-watchlist-token2": "ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ  പട്ടികയുടെ വെബ്‌ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.\nഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.\n[[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കണമെങ്കിൽ ഇവിടെ ഞെക്കുക]].",
        "savedprefs": "താങ്കളുടെ ക്രമീകരണങ്ങൾ കാത്തുസൂക്ഷിച്ചിരിക്കുന്നു.",
+       "savedrights": "{{GENDER:$1|$1}} എന്ന ഉപയോക്താവിന്റെ ഉപയോക്തൃ അവകാശങ്ങൾ സേവ് ചെയ്തിരിക്കുന്നു.",
        "timezonelegend": "സമയ മേഖല:",
        "localtime": "പ്രാദേശിക സമയം:",
        "timezoneuseserverdefault": "വിക്കിയിൽ സ്വതേയുള്ളത് ഉപയോഗിക്കുക ($1)",
        "rcshowhidemine": "എന്റെ തിരുത്തുകൾ $1",
        "rcshowhidemine-show": "പ്രദർശിപ്പിക്കുക",
        "rcshowhidemine-hide": "മറയ്ക്കുക",
+       "rcshowhidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം $1",
+       "rcshowhidecategorization-show": "പ്രദർശിപ്പിക്കുക",
+       "rcshowhidecategorization-hide": "മറയ്ക്കുക",
        "rclinks": "കഴിഞ്ഞ $2 ദിവസങ്ങൾക്കുള്ളിലുണ്ടായ $1 മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക<br />$3",
        "diff": "മാറ്റം",
        "hist": "നാൾവഴി",
        "upload-options": "അപ്‌‌ലോഡ് ഐച്ഛികങ്ങൾ",
        "watchthisupload": "ഈ പ്രമാണം ശ്രദ്ധിക്കുക",
        "filewasdeleted": "ഈ പേരിലുള്ള ഒരു പ്രമാണം ഇതിനു മുൻപ് അപ്‌ലോഡ് ചെയ്യുകയും പിന്നീട് മായ്ക്കുകയും ചെയ്തിട്ടുള്ളതാണ്‌. ഈ പ്രമാണം തുടർന്നും അപ്‌ലോഡ് ചെയ്യുന്നതിനു മുൻപ് $1 പരിശോധിക്കേണ്ടതാണ്‌.",
+       "filename-thumb-name": "ഇത് കണ്ടിട്ട് ലഘുചിത്രത്തിന്റെ തലക്കെട്ട് പോലെയുണ്ട്. ദയവായി ഇതേ വിക്കിയിലെ ചിത്രങ്ങളുടെ ലഘുചിത്രം തന്നെ അപ്‌ലോഡ് ചെയ്യരുത്. അങ്ങനെയല്ലെങ്കിൽ, ലഘുചിത്രമെന്ന പൂർവ്വപദഭാഗമില്ലാതെ, കൂടുതൽ അർത്ഥപൂർണ്ണമായ പേര് നൽകുക.",
        "filename-bad-prefix": "താങ്കൾ അപ്‌ലോഡ് ചെയ്യുവാൻ ശ്രമിക്കുന്ന പ്രമാണത്തിന്റെ പേര്‌ '''\"$1\"''' എന്നാണ്‌ തുടങ്ങുന്നത്. ഇതു ഡിജിറ്റൽ ക്യാമറയിൽ പടങ്ങൾക്കു യാന്ത്രികമായി ചേർക്കുന്ന പേരാണ്‌. ദയവു ചെയ്തു താങ്കൾ അപ്‌ലോഡ് ചെയ്യുന്ന പ്രമാണത്തെ വിശദീകരിക്കുന്ന അനുയോജ്യമായ ഒരു പേരു തിരഞ്ഞെടുക്കുക.",
        "upload-success-subj": "അപ്‌ലോഡ് വിജയിച്ചിരിക്കുന്നു",
        "upload-success-msg": "താങ്കളുടെ [$2]-ൽ നിന്നും വിജയകരമായി അപ്‌ലോഡ് ചെയ്തിരിക്കുന്നു. [[:{{ns:file}}:$1]] കാണുക",
        "upload-dialog-button-done": "ചെയ്തു കഴിഞ്ഞു",
        "upload-dialog-button-save": "സേവ് ചെയ്യുക",
        "upload-dialog-button-upload": "അപ്‌‌ലോഡ്",
-       "upload-process-error": "ഒരു പിഴവുണ്ടായി",
-       "upload-process-warning": "ഒരു മുന്നറിയിപ്പുണ്ടായി",
        "upload-form-label-select-file": "പ്രമാണം തിരഞ്ഞെടുക്കുക",
        "upload-form-label-infoform-title": "വിശദാംശങ്ങൾ",
        "upload-form-label-infoform-name": "പേര്‌",
        "foreign-structured-upload-form-label-own-work": "ഇതെന്റെ സ്വന്തം സൃഷ്ടി ആണ്",
        "foreign-structured-upload-form-label-infoform-categories": "വർഗ്ഗങ്ങൾ",
        "foreign-structured-upload-form-label-infoform-date": "തീയതി",
+       "foreign-structured-upload-form-label-own-work-message-local": "{{SITENAME}} സംരംഭത്തിലെ സേവന നിബന്ധനകൾക്കും ഉപയോഗാനുമതി നയങ്ങൾക്കും അനുസരിച്ചാണ് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുന്നതെന്ന് ഞാൻ സ്ഥിരീകരിക്കുന്നു.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "{{SITENAME}} സംരംഭത്തിലെ നയങ്ങളനുസരിച്ച് താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ലെങ്കിൽ, ദയവായി ഇത് അടച്ച് മറ്റൊരു മാർഗ്ഗം ശ്രമിക്കുക.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "താങ്കൾക്ക് [[Special:Upload|സ്വതേ ഉള്ള അപ്‌ലോഡ് താളും]] പരിശോധിക്കാവുന്നതാണ്.",
        "foreign-structured-upload-form-label-own-work-message-default": "ഈ പ്രമാണം പങ്ക് വെയ്ക്കപ്പെട്ടിരിക്കുന്ന ഒരു ശേഖരത്തിലോട്ടാണ് അപ്‌ലോഡ് ചെയ്യുന്നതെന്ന് ഞാൻ മനസ്സിലാക്കുന്നു. അവിടുത്തെ ഉപയോഗ നിബന്ധനകൾക്കും അനുമതി നയങ്ങൾക്കും അനുസൃതമായാണ് ഇത് ചെയ്യുന്നതെന്ന് ഞാൻ സ്ഥിരീകരിക്കുന്നു.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "പങ്ക് വെയ്ക്കപ്പെട്ടിരിക്കുന്ന ശേഖരത്തിന്റെ നയങ്ങളനുസരിച്ച് താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ലെങ്കിൽ, ദയവായി ഇത് അടക്കുകയും മറ്റൊരു മാർഗ്ഗം ശ്രമിക്കുകയും ചെയ്യുക.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "ഈ പ്രമാണം അവരുടെ നയങ്ങളുമായി ചേർന്നുപോകുമെങ്കിൽ താങ്കൾക്ക് [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
        "svg-long-error": "അസാധുവായ എസ്.വി.ജി. പ്രമാണം: $1",
        "show-big-image": "പൂർണ്ണ വലിപ്പം",
        "show-big-image-preview": "ഈ പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.",
+       "show-big-image-preview-differ": "ഈ  $2 പ്രമാണത്തിന്റെ $3 പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.",
        "show-big-image-other": "കൂടുതൽ {{PLURAL:$2|റെസലൂഷൻ}}: $1.",
        "show-big-image-size": "$1 × $2 പിക്സലുകൾ",
        "file-info-gif-looped": "പുനരാവർത്തിതം",
index 7a1baee..e5f6352 100644 (file)
@@ -56,6 +56,7 @@
        "tog-hideminor": "अलीकडील बदलांत छोटी संपादने लपवा",
        "tog-hidepatrolled": "पहारा दिलेली संपादने (नित्य पहाण्यात असलेली संपादने) अलीकडील बदलांमधून लपवा",
        "tog-newpageshidepatrolled": "नवीन पृष्ठ यादीतून पहारा दिलेली पाने (नित्य पहाण्यात असलेली संपादने)  लपवा",
+       "tog-hidecategorization": "पानांचे वर्गीकरण लपवा",
        "tog-extendwatchlist": "निरीक्षणसूचीत सगळे बदल दाखवा. फक्त अलीकडील नाही.",
        "tog-usenewrc": "अलीकडील बदल आणि पहाऱ्याची सूचीत मांडणी करा",
        "tog-numberheadings": "शीर्षके स्वयंक्रमांकित करा",
@@ -66,6 +67,7 @@
        "tog-watchdefault": "मी संपादित केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchmoves": "मी स्थानांतर केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchdeletion": "मी वगळलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
+       "tog-watchrollback": "यात ज्या पानात मी माझ्या निरीक्षणसूचीत पुनर्परतीची (रोलबॅक) क्रिया केलेली आहे.",
        "tog-minordefault": "सर्व संपादने 'छोटा बदल' म्हणून आपोआप जतन करा.",
        "tog-previewontop": "झलक संपादन खिडकीच्या आधी दाखवा",
        "tog-previewonfirst": "पहिल्या संपादनानंतर झलक दाखवा",
@@ -84,6 +86,7 @@
        "tog-watchlisthideliu": "पहाऱ्याच्या सूचीतून प्रवेश केलेल्या सदस्यांची संपादने लपवा",
        "tog-watchlisthideanons": "निरीक्षणसूचीतून अनामिक सदस्यांची संपादने लपवा",
        "tog-watchlisthidepatrolled": "निरीक्षणसूचीतून तपासलेली संपादने लपवा",
+       "tog-watchlisthidecategorization": "पानांचे वर्गीकरण लपवा",
        "tog-ccmeonemails": "मी इतर सदस्यांना पाठविलेल्या ई-मेल च्या प्रती मलाही माझ्या ई-मेल पत्त्यावर पाठवा",
        "tog-diffonly": "निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.",
        "tog-showhiddencats": "लपविलेले वर्ग दाखवा",
        "pool-timeout": "ताळ्यासाठी वाट पाहण्याची वेळ संपली",
        "pool-queuefull": "सर्व्हरवर ताण आहे.",
        "pool-errorunknown": "अपरिचित त्रुटी",
+       "pool-servererror": "पूल काउंटर सेवा उपलब्ध नाही($1).",
        "poolcounter-usage-error": "वापर त्रूटी:$1",
-       "aboutsite": "{{SITENAME}}बद्दल",
+       "aboutsite": "{{SITENAME}} बद्दल",
        "aboutpage": "Project:माहितीपृष्ठ",
        "copyright": "येथील मजकूर $1च्या अंतर्गत उपलब्ध आहे जोपर्यंत इतर नोंदी केलेल्या नाहीत.",
        "copyrightpage": "{{ns:project}}:प्रताधिकार",
        "disclaimers": "उत्तरदायित्वास नकार",
        "disclaimerpage": "Project: सर्वसाधारण उत्तरदायकत्वास नकार",
        "edithelp": "संपादन साहाय्य",
-       "helppage-top-gethelp": "मदत",
+       "helppage-top-gethelp": "साहायà¥\8dय",
        "mainpage": "मुखपृष्ठ",
        "mainpage-description": "मुखपृष्ठ",
        "policy-url": "Project:नीती",
        "readonly_lag": "मुख्य विदागार दात्याच्या (मास्टर डाटाबेस सर्व्हर) बरोबरीने पोहचण्यास पराधीन-विदागारदात्यास (स्लेव्ह सर्व्हर) वेळ लागल्यामुळे, विदागार आपोआप बंद झाला आहे.",
        "internalerror": "अंतर्गत त्रुटी",
        "internalerror_info": "अंतर्गत त्रुटी: $1",
+       "internalerror-fatal-exception": "\"$1\"प्रकारचा घातक अपवाद",
        "filecopyerror": "\"$1\" संचिकेची \"$2\" ही प्रत करता आली नाही.",
        "filerenameerror": "\"$1\" संचिकेचे \"$2\" असे नामांतर करता आले नाही.",
        "filedeleteerror": "\"$1\" संचिका वगळता आली नाही.",
        "title-invalid-empty": "आपण विनंति केलेले पान-शिर्षक एकतर रिकामे आहे किंवा त्यात एखाद्या नामविश्वाचे नाव आहे.",
        "title-invalid-utf8": "आपण विनंती केलेल्या पानाच्या शिर्षकात अवैध यूटिएफ-८ क्रमवारी आहेत.",
        "title-invalid-interwiki": "आपण विनंती केलेल्या पानात आंतरविकि दुवे आहेत जे शिर्षकात वापरता येउ शकत नाहीत.",
-       "title-invalid-talk-namespace": "आपण विनंति केलेले पान उपलब्ध नसलेल्या चर्च्या पानास संबोधित करते",
+       "title-invalid-talk-namespace": "आपण विनंति केलेले पान शिर्षक चर्चा पानास संदर्भांकित करते जे अस्तित्वात नाही.",
+       "title-invalid-characters": "विनंती केलेल्या पानात अवैध वर्ण आहेत:\"$1\".",
+       "title-invalid-relative": "शिर्षकास संलग्न मार्ग आहेत.संलग्न पान शिर्षके (./, ../)अवैध आहेत, कारण ते सदस्याच्या न्याहाळकाद्वारे हाताळल्यावर, अनेकदा, त्यावर पोचता येणार नाही.",
+       "title-invalid-magic-tilde": "विनंती केलेल्या पानाच्या शिर्षकात अवैध जादुई नासिक्यत्व-चिन्ह क्रमवारी(मॅजिक टिल्ड सिक्वेन्स) आहे(<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "विनंती केलेल्या पानाचे शिर्षक फारच लांबीचे आहे.यूटीएफ-८ एनकोडिंगमध्ये ते $1{{PLURAL:$1|बाईट|बाईटस्}} पेक्षा लांब नको.",
+       "title-invalid-leading-colon": "विनंती केलेल्या पानाचे शिर्षकाचे सुरुवातीस अवैध द्विबिंदुचिन्ह(:) आहे.",
        "perfcached": "खालील माहिती सयीमधील (कॅशे) असल्यामुळे ती अद्ययावत् नाही.जास्तीतजास्त {{PLURAL:$1|एक प्रतिफळ |$1 प्रतिफळे }} सयीमध्ये असतात.",
        "perfcachedts": "खालील माहिती सयीमधील (कॅशे) आहे व ती  $1 पर्यंत अद्ययावत् आहे. जास्तीतजास्त {{PLURAL:$4|एक प्रतिफळ |$4 प्रतिफळे}} सयीमध्ये असतात.",
        "querypage-no-updates": "सध्या या पानाकरिता नवी अद्यतने अनुपलब्ध केली आहेत.आत्ताच येथील विदा तरोताजा होणार नाही.",
        "viewyourtext": "तुम्ही या पानाची,<strong>तुमची संपादने</strong> पाहू शकता व त्याची प्रत करू शकता.",
        "protectedinterface": "हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.\n\nसर्व विकिंवर, अनुवाद जोडण्याकरता किंवा बदलण्याकरता अथवा शुद्धलेखन चिकित्सेकरीता , कृपया [//translatewiki.net/ translatewiki.net], या मिडियाविकि स्थानिकीकरण प्रकल्पावर जा.",
        "editinginterface": "<strong>सावधान</strong>तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.",
+       "translateinterface": "सर्व विकिंवर अनुवाद जोडण्याकरता किंवा बदलण्याकरता, कृपया [//translatewiki.net/ ट्रांसलेटविकि.नेट]चा वापर करा,जो मिडियाविकिचा स्थानिकीकरण प्रकल्प आहे.",
        "cascadeprotected": "हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:\n$2",
        "namespaceprotected": "'''$1''' नामविश्वातील पाने संपादण्याची आपणांस परवानगी नाही.",
        "customcssprotected": "या पानावर इतर सदस्याची वैयक्तिक मांडणी असल्यामुळे, तुम्हाला हे सीएसएस पान संपादित करण्याची परवानगी नाही.",
        "invalidtitle-knownnamespace": "\"$2\" नामविश्वात \"$3\" मजकूराचे अयोग्य शीर्षक",
        "invalidtitle-unknownnamespace": "अनोळखी नामविश्वाच्या आकड्यासह अवैध मथळा $1 व मजकूर \"$2\"",
        "exception-nologin": "सनोंद-प्रवेशित नाही",
-       "exception-nologin-text": "हà¥\87 à¤ªà¤¾à¤¨ à¤\95िà¤\82वा à¤\95à¥\8dरिया à¤\95रणà¥\8dयासाठà¥\80 à¤\86पलà¥\8dयाला à¤¯à¤¾ à¤µà¤¿à¤\95िवर [[Special:Userlogin|सनà¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शित]] असावयास हवे.",
+       "exception-nologin-text": "हà¥\87 à¤ªà¤¾à¤¨ à¤\95िà¤\82वा à¤\95à¥\8dरिया à¤\95रणà¥\8dयासाठà¥\80 à¤\86पलà¥\8dयाला à¤¸à¤¨à¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शित असावयास हवे.",
        "exception-nologin-text-manual": "हे पान किंवा क्रियेस पोचण्यास कृपया $1 करा.",
        "virus-badscanner": "खराब विन्यास (कॉन्फिगरेशन): अनोळखी व्हायरस स्कॅनर: ''$1''",
        "virus-scanfailed": "क्रमवीक्षण (स्कॅन) अयशस्वी (कोड $1)",
        "gotaccountlink": "सनोंद-प्रवेश करा",
        "userlogin-resetlink": "सनोंद-प्रवेश तपशील विसरला असाल तर येथे टिचकी मारा.",
        "userlogin-resetpassword-link": "आपला परवलीचा शब्द विसरलात?",
-       "userlogin-helplink2": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शासà¤\82बà¤\82धà¥\80 à¤®à¤¦à¤¤",
+       "userlogin-helplink2": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शासà¤\82बà¤\82धà¥\80 à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dय",
        "userlogin-loggedin": "आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.",
        "userlogin-createanother": "दुसरे नवीन खाते तयार करा",
        "createacct-emailrequired": "विपत्र पत्ता(ई-मेल)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आपण दुसरे खाते कां बनवीत आहात",
-       "createacct-captcha": "सुरक्षा तपासणी",
-       "createacct-imgcaptcha-ph": "वर दिसत असलेला मजकूर येथे टाका",
        "createacct-submit": "आपले खाते निर्माण करा",
        "createacct-another-submit": "खाते तयार करा",
        "createacct-benefit-heading": "{{SITENAME}} हे आपल्यासारख्याच लोकांनी बनविलेले आहे.",
        "createacct-benefit-body2": "{{PLURAL:$1|लेख}}",
        "createacct-benefit-body3": "अलीकडील {{PLURAL:$1|योगदानकर्ता|योगदानकर्ते}}",
        "badretype": "तुम्ही टाकलेले परवलीचे शब्द जुळत नाहीत.",
+       "usernameinprogress": "या सदस्यनावाचे खाते तयार करण्याचे काम प्रगतीपथावर आहे. कृपया थांबा.",
        "userexists": "तुम्ही टाकलेले सदस्यनाम पूर्वीच वापरात आहे.\nकृपया वेगळे सदस्यनाम निवडा.",
        "loginerror": "सनोंद-प्रवेशात चूक झाली आहे",
        "createacct-error": "खाते तयार करण्यात चुकी",
        "nosuchusershort": "\"$1\" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?",
        "nouserspecified": "तुम्हाला सदस्यनाव नमूद करावे लागेल.",
        "login-userblocked": "हा सदस्य ’प्रतिबंधित’ आहे. त्यास सनोंद-प्रवेशाची परवानगी नाही.",
-       "wrongpassword": "à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\9aà¥\81à¤\95à¥\80à¤\9aा आहे, पुन्हा एकदा प्रयत्न करा.",
-       "wrongpasswordempty": "परवलà¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤°à¤¿à¤\95ामा à¤\86हà¥\87; à¤ªà¤°à¤¤ प्रयत्न करा.",
+       "wrongpassword": "à¤\86पण à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\9aà¥\81à¤\95à¥\80à¤\9aा à¤\9fाà¤\95ला आहे, पुन्हा एकदा प्रयत्न करा.",
+       "wrongpasswordempty": "परवलà¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\95à¥\8bरा à¤\86हà¥\87; à¤ªà¥\81नà¥\8dहा प्रयत्न करा.",
        "passwordtooshort": "तुमच्या परवलीच्या शब्दात किमान {{PLURAL:$1|१ अक्षर |$1 अक्षरे}} हवीत.",
+       "passwordtoolong": "परवलीचा शब्द हा {{PLURAL:$1|१ वर्ण पेक्षा|$1 वर्णांपेक्षा}} लांबीचा नको.",
        "password-name-match": "आपला परवलीचा शब्द हा आपल्या सदस्यनावापेक्षा वेगळा हवा.",
        "password-login-forbidden": "या सदस्यनामाचा व परवलीच्या शब्दाचा वापर निषिद्ध आहे.",
        "mailmypassword": "नवीन परवलीचा शब्द पुनर्स्थापित(रिसेट) करा",
-       "passwordremindertitle": "{{SITENAME}}करिता नवा तात्पुरता परवलीचा शब्दांक.",
+       "passwordremindertitle": "{{SITENAME}}करिता नवा तात्पुरता परवलीचा शब्द",
        "passwordremindertext": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शब्दांक पाठवावा’ अशी विनंती केली आहे ($4).\n\"$2\" सदस्याकरिता तात्पुरता परवलीचा शब्दांक \"$3\" झाला आहे.\nतुम्ही आता प्रवेश करा व तुमचा परवलीचा शब्दांक बदला. तुमचा अस्थायी शब्दांक {{PLURAL:$5|एका दिवसात|$5 दिवसांत}} मृत होईल.\n\nजर ही विनंती इतर कुणी केली असेल किंवा तुम्हाला तुमचा परवलीचा शब्दांक आठवला असेल आणि तुम्ही तो आता बदलू इच्छित नसाल तर, तुम्ही हा संदेश दुर्लक्षित करून जुना परवलीचा शब्दांक वापरत राहू शकता.",
        "noemail": "\"$1\" सदस्याच्या कोणत्याही विपत्रपत्त्याची(ई-मेल)नोंद नाही.",
        "noemailcreate": "आपण वैध विरोप-पत्ता (ई-मेल ऍड्रेस) देणे आवश्यक आहे.",
        "eauthentsent": "नमूद केलेल्या ई-मेल पत्त्यावर एक निश्चितता स्वीकारक ई-मेल पाठविला गेला आहे.\nखात्यावर कोणताही इतर ई-मेल पाठविण्यापूर्वी - तो ई-मेल पत्ता तुमचाच आहे, हे सुनिश्चित करण्यासाठी - तुम्हाला त्या ई-मेल मधील सूचनांचे पालन करावे लागेल.",
        "throttled-mailpassword": "मागील {{PLURAL:$1|तासात|$1 तासांत}} परवलीचा शब्द बदलण्यासाठीची सूचना विपत्राद्वारे पाठविलेली आहे. दुरुपयोग टाळण्यासाठी, {{PLURAL:$1|एका तासामध्ये|$1 तासांमध्ये}} फक्त एकदाच सूचना दिली जाईल.",
        "mailerror": "विपत्र पाठवण्यात त्रुटी: $1",
-       "acct_creation_throttle_hit": "माफ à¤\95रा, à¤¤à¥\81मà¥\8dहà¥\80 à¤\86तà¥\8dतापरà¥\8dयà¤\82त {{PLURAL:$1|१ à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 à¤\86हà¥\87|$1 à¤\96ातà¥\80 à¤\89à¤\98डलà¥\80 à¤\86हà¥\87त}}. à¤¤à¥\81मà¥\8dहाला à¤\86णà¤\96à¥\80 à¤\96ातà¥\80 उघडता येणार नाहीत.",
+       "acct_creation_throttle_hit": "à¤\86पला à¤\85à¤\82à¤\95पतà¥\8dता à¤µà¤¾à¤ªà¤°à¥\81न à¤¯à¤¾ à¤µà¤¿à¤\95िस à¤­à¥\87à¤\9f à¤¦à¥\87णाऱà¥\8dयाà¤\82नà¥\80 à¤\95ाल {{PLURAL:$1|१ à¤\96ातà¥\87|$1 à¤\96ातà¥\80}} à¤\89à¤\98डलà¥\80 à¤\86हà¥\87त à¤¤à¥\80 à¤¯à¤¾ à¤\95ालावधà¥\80तà¥\80ल à¤®à¤¹à¤¤à¥\8dतम à¤\86हà¥\87त.\n\nतà¥\8dयाà¤\9aा à¤ªà¤°à¤¿à¤ªà¤¾à¤\95 à¤®à¥\8dहणà¥\82न à¤¸à¤§à¥\8dया à¤¹à¤¾ à¤\85à¤\82à¤\95पतà¥\8dता à¤µà¤¾à¤ªà¤°à¥\81न à¤­à¥\87à¤\9f à¤¦à¥\87णाऱà¥\8dयास à¤\85धिà¤\95 à¤\96ातà¥\87 उघडता येणार नाहीत.",
        "emailauthenticated": "तुमचा विपत्रपत्ता $2 ला $3 यावेळी तपासण्यात आला आहे.",
        "emailnotauthenticated": "तुमच्या ई-मेल पत्त्याची अद्याप निश्चिती झालेली नाही. खालील कोणत्याही फिचर्ससाठी ई-मेल पाठविला जाणार नाही.",
        "noemailprefs": "खालील सुविधा कार्यान्वित करण्यासाठी,पसंतीक्रमात ई-मेल पत्ता नमूद करा.",
        "createaccount-text": "तुमचा विपत्र पत्ता घेउन {{SITENAME}} ($4)वर \"$2\" नावाच्या कोण्या एकाने \"$3\" परवलीने खाते उघडले आहे. कृपया आपण सनोंद-प्रवेश करून आपला परवलीचा शब्द बदलावा.\n\nजर ही खातेनोंदणी चुकिने झाली असेल तर, तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.",
        "login-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "login-abort-generic": "तुमचा प्रवेश अयशस्वी होऊन रद्द झाला.",
+       "login-migrated-generic": "आपल्या खात्याचे स्थलांतर झाले आहे,या विकिवर आपले सदस्यनाव आता यापुढे अस्तित्वात राहणार नाही.",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "तुमच्या सनोंद-निर्गमनास नकार दिल्या गेला कारण असे दिसते की ती विनंती अन-अनुबंधित(डिसकनेक्टेड) न्याहाळकाद्वारे पाठवल्या गेली.",
        "createacct-another-realname-tip": "आपले खरे नाव टाकणे वैकल्पिक आहे.\nजर आपण ते द्यायचे ठरविले तर,ते आपल्या कामाचा मूळ स्रोत म्णून देण्यास वापरले जाईल.",
        "pt-createaccount": "खाते बनवा",
        "pt-userlogout": "सनोंद-निर्गम",
        "php-mail-error-unknown": "पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक",
-       "user-mail-no-addy": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dया à¤µà¤¿à¤¨à¤¾ à¤\88मà¥\87ल à¤ªà¤¾à¤ à¤µà¤£à¥\8dयà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95à¥\87ला",
+       "user-mail-no-addy": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dया à¤µà¤¿à¤¨à¤¾ à¤\88मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¿à¤£à¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95à¥\87ला.",
        "user-mail-no-body": "रिकामे किंवा अत्यंत छोटा मजकूर असलेले विपत्र पाठविण्याचा प्रयत्न करण्यात आला",
        "changepassword": "परवलीचा शब्द बदला",
-       "resetpass_announce": "à¤\96ातà¥\8dयामधà¥\8dयà¥\87 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤¹à¥\8bणà¥\87 à¤¥à¤¾à¤\82बविणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पलà¥\8dया à¤\96ातà¥\8dयाà¤\9aा à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²ा.",
+       "resetpass_announce": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87श à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रा.",
        "resetpass_text": "<!-- मजकूर इथे लिहा -->",
        "resetpass_header": "खात्याचा परवलीचा शब्द बदला",
        "oldpassword": "जुना परवलीचा शब्दः",
        "resetpass-submit-loggedin": "परवलीचा शब्द बदला",
        "resetpass-submit-cancel": "रद्द करा",
        "resetpass-wrong-oldpass": "अवैध किंवा अस्थायी परवलीचा शब्द.\nकदाचित तुम्ही आधीच तो यशस्वीरीत्या बदलला असेल किंवा नवीन तात्पुरता परवलीचा शब्द मागवला असेल.",
+       "resetpass-recycled": "सध्याच्या परवलीच्या शब्दापेक्षा काहीतरी वेगळ्या परवलीच्या शब्दाची पुनर्स्थापना करा.",
+       "resetpass-temp-emailed": "विप्त्राद्वारे पाठविलेल्या तात्पुरत्या संकेताने आपण प्रवेश घेतला.सनोंद प्रवेश पूर्ण करण्यास, आपण येथे नविन परवलीच्या शब्दाची स्थापना करावयास हवी:",
        "resetpass-temp-password": "तात्पुरता परवलीचा शब्द",
        "resetpass-abort-generic": "परवलीचा शब्दबदल विस्तारकाद्वारे नाकारण्यात आला.",
+       "resetpass-expired": "आपला परवलीचा शब्द संपुष्टात आला.कृपया प्रवेशास नविन परवलीचा शब्द स्थापा.",
+       "resetpass-expired-soft": "आपला परवलीचा शब्द संपुष्टात आला असुन त्याची पुनर्स्थापना करणे आवश्यक आहे. कृपया आता  नविन परवलीचा शब्द निवडा किंवा नंतर पुनर्स्थापना करण्यास \"{{int:resetpass-submit-cancel}}\" येथे टिचका.",
+       "resetpass-validity-soft": "आपला परवलीचा शब्द वैध नाही:$1\n\nकृपया नविन परवलीचा शब्द निवडा किंवा नंतर पुनर्स्थापना करण्यास \"{{int:resetpass-submit-cancel}}\" येथे टिचका.",
        "passwordreset": "परवलीचा शब्द पूर्ववत करा",
        "passwordreset-text-one": "आपला परवलीचा शब्द बदलण्यास हे आवेदन भरा.",
        "passwordreset-text-many": "{{PLURAL:$1|आपला तात्पुरता परवलीचा शब्द विपत्रामार्फत प्राप्त करण्यास खालील क्षेत्रातील एखादे भरा.}}",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
        "changeemail": "विपत्रपत्ता बदला किंवा हटवा",
        "changeemail-header": "आपला विपत्रपत्ता बदलण्यास हे आवेदन पूर्ण करा.जर आपणास आपल्या खात्याशी संलग्न कोणताही विपत्रपत्ता हटवायचा असेल तर,आवेदन सादर करण्यापूर्वी, नविन विपत्रपत्त्यासाठी असलेली जागा कोरी ठेवा.",
-       "changeemail-passwordrequired": "हà¥\87 à¤¬à¤¦à¤² à¤¨à¤\95à¥\8dà¤\95à¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86पणास à¤\86पला à¤¸à¤\82à¤\95à¥\87ताà¤\82à¤\95 टाकावा लागेल.",
+       "changeemail-passwordrequired": "हà¥\87 à¤¬à¤¦à¤² à¤¨à¤\95à¥\8dà¤\95à¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86पणास à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद टाकावा लागेल.",
        "changeemail-no-info": "हे पान थेट बघण्यासठी तुम्हाला सनोंद-प्रवेशित असावे लागेल.",
        "changeemail-oldemail": "सध्याचा ईमेल पत्ता :",
        "changeemail-newemail": "नवा ईमेल पत्ता:",
+       "changeemail-newemail-help": "जर आपणास आपला विपत्रपत्ता(ई-मेल एड्रेस) हटवायचा असेल तर हे क्षेत्र आपण कोरे ठेवावयास हवे. जर आपण आपला विपत्रपत्ता हटविला तर, आपण विसरलेला परवलीचा शब्द पुनर्स्थापित करु शकणार नाही व या विकिवरुन आपणास विपत्रे प्राप्त होणार नाहीत.",
        "changeemail-none": "(काहीही नाही)",
-       "changeemail-password": "तà¥\81मà¤\9aा {{SITENAME}} à¤¸à¤\82à¤\95à¥\87ताà¤\82à¤\95:",
+       "changeemail-password": "तà¥\81मà¤\9aा {{SITENAME}} à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद:",
        "changeemail-submit": "ईमेल बदला",
        "changeemail-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
+       "changeemail-nochange": "कृपया  वेगळा नविन विपत्रपत्ता टाका.",
        "resettokens": "ओळखचिन्ह(टोकन) पुनर्स्थापित करा",
        "resettokens-text": "येथे आपल्या खात्यात असलेला व्यक्तिगत मजकूरापर्यंत पोचण्यासाठी आपण ओळखचिन्ह(टोकन) पुनर्स्थापित करू शकता.\nआपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खात्याची आपण तडजोड केली असल्यास, हे करावयास हवे.",
        "resettokens-no-tokens": "पुनर्स्थापित करण्यासाठी कोणतीही ओळखचिन्हे नाहीत.",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "showdiff": "बदल दाखवा",
+       "blankarticle": "<strong>ईशारा:</strong>आपण तयार करीत असलेले पान कोरे आहे.जर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर,कोणताही आशय/मजकूर नसलेले पान तयार होईल.",
        "anoneditwarning": "<strong>इशारा:</strong> तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेले नाही.आपण काही संपादन केले तर, तुमचा अंकपत्ता (आयपी) सार्वजनिक रित्या दृष्य होईल. जर आपण <strong>[$1 सनोंद प्रवेश केला]</strong> किंवा <strong>[$2 खाते उघडले]</strong>,तर आपण केलेली संपादने ही आपल्या नांवाशी संलग्न होतील, त्याशिवाय याचे इतरही फायदे आहेत.",
        "anonpreviewwarning": "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
        "missingsummary": "'''आठवण:''' आपण संपादन सारांश पुरवलेला नाही.आपण 'जतन करा' वर पुन्हा टिचकी मारली तर, ते त्याशिवायच जतन होईल.",
+       "selfredirect": "<strong>ईशारा:</strong>आपण या पानास, त्याच पानावर पुनर्निर्देशित करीता आहात.\nआपण पुनर्निर्देशनासाठी चूकिचे लक्ष्य नमूद केले आहे किंवा आपण चूकिच्या पानाचे संपादन करीत आहात.\nजर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर, कसेहीकरुन ते पुनर्निर्देशन तयार होईल.",
        "missingcommenttext": "कृपया खाली प्रतिक्रिया भरा.",
        "missingcommentheader": "<strong>आठवण:<strong> आपण या लेखनाकरिता विषय दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
        "summary-preview": "आढाव्याची झलक:",
        "subject-preview": "विषय झलक:",
+       "previewerrortext": "आपल्या बदलांची झलक बघण्याचे प्रयत्नादरम्यान त्रूटी उद्भवली.",
        "blockedtitle": "हा सदस्य प्रतिबंधित आहे",
        "blockedtext": "'''तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.'''\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी ''$2'' हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "autoblockedtext": "तुमचा आंतरजालीय अंकपत्ता आपोआप स्थगित केला आहे कारण तो इतर अशा सदस्याने वापरला, ज्याला $1ने प्रतिबंधित केले.\nआणि दिलेले कारण खालील प्रमाणे आहे\n:''$2''\nब्लॉकची सुरूवात: $8\nब्लॉकचा शेवट: $6\nकुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.\n\n[[Special:Preferences|सदस्य पसंतीत]]त शाबीत विपत्र पत्ता नमूद असल्या शिवाय आणि तुम्हाला  तो वापरण्या पासून प्रतिबंधित केले असल्यास तुम्ही  \"या सदस्यास विपत्र पाठवा\" सुविधा  वापरू शकणार नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे. \nतुमचा स्थगन क्र $5 आहे. कृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "accmailtitle": "परवलीचा शब्द पाठविण्यात आलेला आहे.",
        "accmailtext": "[[User talk:$1|$1]] यांसाठी अनियतक्रमाने निर्मित केलेला परवलीचा शब्द $2 यांना पाठवण्यात आला आहे.\n\nया नवीन खात्यासाठीचा परवलीचा शब्द,सनोंद-प्रवेश घेतल्यावर [[Special:ChangePassword|परवलीचा शब्द बदला]] येथे बदलता येईल.",
        "newarticle": "(नवीन लेख)",
-       "newarticletext": "तà¥\81मà¥\8dहाला à¤\85पà¥\87à¤\95à¥\8dषित à¤\85सलà¥\87ला à¤²à¥\87à¤\96 à¤\85à¤\9cà¥\82न à¤²à¤¿à¤¹à¤¿à¤²à¤¾ à¤\97à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80. à¤¹à¤¾ à¤²à¥\87à¤\96 à¤²à¤¿à¤¹à¤¿à¤£à¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤ªà¥\87à¤\9fà¥\80त à¤®à¤\9cà¤\95à¥\82र à¤²à¤¿à¤¹à¤¾. à¤®à¤¦à¤¤à¥\80साठà¥\80 [$1 à¤¯à¥\87थà¥\87] à¤\9fिà¤\9aà¤\95à¥\80 à¤¦à¥\8dया.\n\nà¤\9cर à¤¯à¥\87थà¥\87 à¤\9aà¥\81à¤\95à¥\82न à¤\86ला à¤\85साल à¤¤à¤° à¤¬à¥\8dराà¤\89à¤\9dरà¤\9aà¥\8dया à¤¬à¥\85à¤\95 (back) कळीवर टिचकी द्या.",
+       "newarticletext": "à¤\86पण à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¦à¥\81वà¥\8dयाà¤\9aा à¤®à¤¾à¤\97à¥\8bवा à¤\98à¥\87त à¤\86ला à¤\86हात.\nहà¥\87 à¤ªà¤¾à¤¨ à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयासाठà¥\80,à¤\96ालà¥\80ल à¤ªà¥\87à¤\9fà¥\80त à¤\9fà¤\82à¤\95न à¤\95रणà¥\87 à¤¸à¥\81रà¥\81 à¤\95रा(à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80साठà¥\80 [$1 à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dय à¤ªà¤¾à¤¨] à¤¬à¤\98ा).\n\nà¤\9cर à¤\86पण à¤¯à¥\87थà¥\87 à¤\9aà¥\81à¤\95à¥\82न à¤\86ला à¤\85साल à¤¤à¤° à¤¬à¥\8dराà¤\89à¤\9dरà¤\9aà¥\8dया  <strong>परत</strong>(बà¥\85à¤\95) कळीवर टिचकी द्या.",
        "anontalkpagetext": "---- ''हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत. त्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. जर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा]] किंवा [[Special:UserLogin/signup|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.''",
        "noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}} लिहू शकता]</span>.",
        "noarticletext-nopermission": "सध्या या लेखात  काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
        "token_suffix_mismatch": "'''तुमचे संपादन रद्द करण्यात आलेले आहे कारण तुमच्या क्लायंटनी तुमच्या संपादनातील उद्गारवाचक चिन्हांमध्ये (punctuation) बदल केलेले आहेत.\nपानातील मजकूर खराब होऊ नये यासाठी संपादन रद्द करण्यात आलेले आहे.\nअसे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
        "edit_form_incomplete": "'''तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा व पुन्हा प्रयत्न करा.'''",
        "editing": "$1 चे संपादन होत आहे.",
-       "creating": "$1 à¤¯à¤¾ à¤²à¥\87à¤\96ाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\82 à¤\86हà¥\87",
+       "creating": "$1 ची निर्मिती सुरू आहे",
        "editingsection": "$1 (विभाग) संपादन",
        "editingcomment": "$1 चे संपादन (प्रतिक्रिया)",
        "editconflict": "संपादन मतभेद: $1",
        "yourdiff": "फरक",
        "copyrightwarning": "{{SITENAME}} येथे केलेले कोणतेही लेखन $2 (अधिक माहितीसाठी $1 पहा) अंतर्गत मुक्त उद्घोषित केले आहे असे गृहीत धरले जाईल याची कृपया नोंद घ्यावी. आपणास आपल्या लेखनाचे मुक्त संपादन आणि मुक्त वितरण होणे पसंत नसेल तर येथे संपादन करू नये.<br />\nतुम्ही येथे लेखन करताना हे सुद्धा गृहीत धरलेले असते की येथे केलेले लेखन तुमचे स्वतःचे आणि केवळ स्वतःच्या प्रताधिकार (कॉपीराईट) मालकीचे आहे किंवा प्रताधिकाराने गठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात. '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
        "copyrightwarning2": "{{SITENAME}} येथे केलेले कोणतेही लेखन हे इतर संपादकांकरवी बदलले अथवा काढले जाऊ शकते. जर आपणास आपल्या लेखनाचे मुक्त संपादन होणे पसंत नसेल तर येथे संपादन करू नये.<br />\nतुम्ही येथे लेखन करताना हे सुद्धा गृहीत धरलेले असते की येथे केलेले लेखन तुमचे स्वतःचे आणि केवळ स्वतःच्या प्रताधिकार (कॉपीराईट) मालकीचे आहे किंवा प्रताधिकाराने गठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
+       "editpage-cannot-use-custom-model": "या पानाचा आशय-आराखडा(कंटेन्ट मॉडेल) बदलता येणार नाही.",
        "longpageerror": "त्रूटी:आपण दिलेला मजकूर जास्तीत जास्त शक्य {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेक्षा अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही",
        "readonlywarning": "'''सावधान:विदागारास अनुरक्षणासाठी(मेंटेनन्स) ताळे ठोकले आहे,त्यामुळे सध्याच तुम्ही तुमचे संपादन जतन करू शकत नाही.'''\nजर तुम्हाला हवे असेल तर नंतर उपयोग करण्याच्या दृष्टीने, तुम्ही मजकूर नक्कल करुन, पुढील संपादनासाठी ’मजकुर संचिकेत’(टेक्स्ट फाईल)चिटकवू शकता.\nविदागारास ताळे ठोकलेल्या प्रचालकांनी खालील स्पष्टीकरण दिले आहे:$1",
        "protectedpagewarning": "'''सूचना: हे सुरक्षित पान आहे. फक्त प्रचालक याच्यात बदल करू शकतात.'''",
        "semiprotectedpagewarning": "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.",
-       "cascadeprotectedwarning": "'''ताकिद:''' हे पान निम्न-लिखीत निपतन-प्रतिबंधीत {{PLURAL:$1|पानात|पानांत}} आंतरभूत असल्यामुळे,केवळ प्रचालक सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
+       "cascadeprotectedwarning": "<strong>ताकिद:</strong>हे पान निम्न-लिखीत निपतन-प्रतिबंधीत {{PLURAL:$1|पानात|पानांत}} आंतरभूत असल्यामुळे,केवळ प्रचालक-सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
        "titleprotectedwarning": "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे म्हणून ह्या पानास ताळे आहे.'''",
        "templatesused": "या पानामध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "templatesusedpreview": "या झलकेमध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "permissionserrors": "परवानगीस नकार",
        "permissionserrorstext": "खालील{{PLURAL:$1|कारणामुळे|कारणांमुळे}} तुम्हाला तसे करण्याची परवानगी नाही:",
        "permissionserrorstext-withaction": "तुम्हाला $2 क्रियेची परवानगी नाही, खालील {{PLURAL:$1|कारणासाठी|कारणांसाठी}}:",
+       "contentmodelediterror": "ही आवृत्ती आपण संपादू शकत नाही कारण त्याचा आशय-आराखडा (कंटेन्ट मॉडेल)<code>$1</code> आहे व सध्याच्या पानाचा आशय आराखडा <code>$2</code> आहे.",
        "recreate-moveddeleted-warn": "'''सूचना: पूर्वी वगळलेला लेख तुम्ही पुन्हा बनवित आहात.'''\n\nआपण याचा विचार करा कि या पानाचे संपादन यापुढे करणे योग्य आहे काय.या पानाच्या वगळण्याच्या व स्थानांतराच्या नोंदी आपल्या (कामाच्या) सुलभतेसाठी दिलेल्या आहेत:",
        "moveddeleted-notice": "हे पान वगळण्यात आलेले आहे.\nसंदर्भासाठी, वगळण्याची व स्थानांतराची नोंद खाली दिलेली आहे.",
+       "moveddeleted-notice-recent": "माफ करा,हे पान अलीकडेच (मागील २४ तासात) वगळल्या गेले आहे.हा पानाच्या वगळण्याचा व हलविण्याचा लॉग संदर्भासाठी खाली दिला आहे.",
        "log-fulllog": "पूर्ण नोंदी पहा",
        "edit-hook-aborted": "हूकद्वारे संपादन रद्द.\nकारण दिलेले नाही.",
        "edit-gone-missing": "नविन पृष्ठ अद्यतन करता आले नाही. ते वगळले असण्याची शक्यता आहे.",
        "edit-conflict": "वादग्रस्त संपादन",
        "edit-no-change": "तुमचे संपादन दुर्लक्षित करण्यात आले आहे, कारण मजकूरात काहीही बदल झालेला नाही.",
-       "postedit-confirmation-created": "पान निर्मित केले",
+       "postedit-confirmation-created": "पान निर्मित केल्या गेले आहे",
+       "postedit-confirmation-restored": "हे पान पुनर्स्थापित केल्या गेले.",
        "postedit-confirmation-saved": "आपले संपादन जतन करण्यात आले आहे.",
        "edit-already-exists": "नवीन पान तयार करता येऊ शकले नाही.\nया नावाचे पान पूर्वीच अस्तित्वात आहे.",
        "defaultmessagetext": "अविचल संदेश मजकूर",
        "expensive-parserfunction-warning": "”’इशारा:”’ या पानावर खूप सारे खर्चीक पार्सर क्रिया कॉल्स आहेत.\n\nते $2{{PLURAL:$2|कॉल|कॉल्स}} पेक्षा कमी असायला हवेत, सध्या $1{{PLURAL:$1| $1 कॉल| $1 कॉल्स}} एवढे आहेत.",
        "expensive-parserfunction-category": "खूप सारे खर्चीक पार्सर क्रिया कॉल्स असणारी पाने",
        "post-expand-template-inclusion-warning": "<strong>ईशारा:</strong> साचे वाढविण्याची मर्यादा संपलेली आहे.\nकाही साचे वगळले जातील.",
-       "post-expand-template-inclusion-category": "अशी पाने ज्यांच्यावर साचे चढविण्याची मर्यादा संपलेली आहे",
+       "post-expand-template-inclusion-category": "à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤\9cà¥\8dयाà¤\82à¤\9aà¥\8dयावर à¤¸à¤¾à¤\9aà¥\87 à¤\9aढविणà¥\8dयाà¤\9aà¥\80 à¤\86à¤\95ार à¤®à¤°à¥\8dयादा à¤¸à¤\82पलà¥\87लà¥\80 à¤\86हà¥\87",
        "post-expand-template-argument-warning": "<strong>ईशारा:</strong> या पानावर असा एकतरी साचा आहे जो वाढविल्यास खूप मोठा होईल.\nअसे साचे वगळण्यात आलेले आहेत.",
        "post-expand-template-argument-category": "अशी पाने ज्यांच्यामध्ये साचे वगळलेले आहेत",
        "parser-template-loop-warning": "साचा चक्र मिळाले: [[$1]]",
        "cantcreateaccounttitle": "खाते उघडू शकत नाही",
        "cantcreateaccount-text": "('''$1''')या आंतरजाल अंकपत्त्याकडूनच्या खाते निर्मितीस [[User:$3|$3]]ने अटकाव केला आहे.\n\n$3ने ''$2'' कारण दिले आहे.",
        "viewpagelogs": "या पानाच्या नोंदी पहा",
-       "nohistory": "या à¤ªà¥\83षà¥\8dठासाठà¥\80 à¤\86वà¥\83तà¥\8dतà¥\80 इतिहास अस्तित्वात नाही.",
+       "nohistory": "या à¤ªà¥\83षà¥\8dठासाठà¥\80 à¤¸à¤\82पादन इतिहास अस्तित्वात नाही.",
        "currentrev": "सध्याची आवृत्ती",
        "currentrev-asof": "$1 ची नविनतम आवृत्ती",
        "revisionasof": "$1 नुसारची आवृत्ती",
-       "revision-info": "$2ने $1चे आवर्तन",
+       "revision-info": "{{GENDER:$6|$2}}द्वारा $1चे आवर्तन",
        "previousrevision": "←मागील आवृत्ती",
        "nextrevision": "नविनतम आवृत्ती→",
        "currentrevisionlink": "सध्याची आवृत्ती",
        "rev-deleted-event": "(क्रिया नोंद वगळली)",
        "rev-deleted-user-contribs": "[सदस्यनाव / अंकपत्ता वगळला - योगदानातुन संपादन लपविले]",
        "rev-deleted-text-permission": "या पानाची आवृत्ती सार्वजनिक विदागारातून '''वगळण्यात आली आहे'''.\n\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदीत] अधिक तपशील असण्याची शक्यता आहे.",
-       "rev-suppressed-text-permission": "या पानाची आवृत्ती '''दडपली'''.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
+       "rev-suppressed-text-permission": "या पानाची आवृत्ती  <strong>दडपली</strong> आहे.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
        "rev-deleted-text-unhide": "या पानाचे संस्करण '''वगळले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-suppressed-text-unhide": "या पानाचे संस्करण '''दडपले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} दडपलेले क्रमलेख] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-deleted-text-view": "या पानाची आवृत्ती '''वगळण्यात आली आहे'''.\nती तुम्ही बघू शकता; अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदी] येथे मिळेल.",
        "revdelete-legend": "दृश्य बंधने स्थापित करा",
        "revdelete-hide-text": "आवर्तीत मजकूर",
        "revdelete-hide-image": "संचिका आशय लपवा",
-       "revdelete-hide-name": "à¤\95à¥\83तà¥\80 à¤\86णि à¤²à¤\95à¥\8dषà¥\8dय लपवा",
+       "revdelete-hide-name": "लà¤\95à¥\8dषà¥\8dय à¤µ à¤ªà¥\8dराà¤\9aल लपवा",
        "revdelete-hide-comment": "संपादन तपशील",
        "revdelete-hide-user": "संपादकाचे सदस्यनाव/आयपी अंकपत्ता",
        "revdelete-hide-restricted": "प्रशासकांद्वारेची माहिती दडपा तसेच ईतरांचीही",
        "searchall": "सर्व",
        "showingresults": "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
        "showingresultsinrange": "खाली #<strong>$2</strong> ते #<strong>$3</strong> पर्यंतच्या कक्षेतील {{PLURAL:$1|<strong>१</strong> निकाल दाखविला आहे|<strong>$1</strong> निकाल दाखविले आहेत}}.",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|निकाल <strong>$3</strong> चे<strong>$1 - $2</strong>}}",
        "search-nonefound": "दिलेल्या पृच्छेशी जुळणारे निकाल नाहीत.",
        "powersearch-legend": "प्रगत शोध",
        "powersearch-ns": "नामविश्वांमध्ये शोधा:",
        "preferences": "पसंतीक्रम",
        "mypreferences": "पसंतीक्रम",
        "prefs-edits": "संपादनांची संख्या:",
-       "prefsnologintext2": "आपला पसंतीक्रम बदलण्यास $1 करा",
+       "prefsnologintext2": "आपला पसंतीक्रम बदलण्यास सनोंद प्रवेश करा.",
        "prefs-skin": "त्वचा",
        "skin-preview": "झलक",
        "datedefault": "प्राथमिकता नाही",
        "prefs-personal": "सदस्य व्यक्तिरेखा",
        "prefs-rc": "अलीकडील बदल",
        "prefs-watchlist": "निरीक्षणसूची",
+       "prefs-editwatchlist": "पहाऱ्याच्या सूचीचे संपादन करा",
+       "prefs-editwatchlist-label": "आपल्या निरीक्षणसूचीतील प्रविष्ट्या संपादन करा:",
+       "prefs-editwatchlist-edit": "आपल्या निरीक्षणसूचीतील मथळे बघा व हटवा",
+       "prefs-editwatchlist-raw": "कच्ची निरीक्षणसूची संपादित करा",
+       "prefs-editwatchlist-clear": "आपली निरीक्षणसूची साफ(क्लिअर) करा",
        "prefs-watchlist-days": "निरीक्षणसूचीमध्ये दिसणाऱ्या दिवसांची संख्या:",
        "prefs-watchlist-days-max": "जास्तीत जास्त $1 {{PLURAL:$1|दिवस|दिवस}}",
        "prefs-watchlist-edits": "वाढीव निरीक्षणसूचीमध्ये दिसणाऱ्या संपादनांची संख्या:",
        "rows": "ओळी:",
        "columns": "स्तंभ:",
        "searchresultshead": "शोध",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">अंकुरीत दुव्यांच्या</a> रचनेची नांदी (बाईट्स):",
+       "stub-threshold": "रिकाम्या पानाच्या दुव्याची अध:सीमा (Threshold) ($1):",
+       "stub-threshold-sample-link": "नमुना",
        "stub-threshold-disabled": "अक्षम केले",
        "recentchangesdays": "अलीकडील बदल मधील दाखवावयाचे दिवस:",
        "recentchangesdays-max": "जास्तीतजास्त $1 {{PLURAL:$1|दिवस}}",
        "prefs-help-recentchangescount": "यात नुकतेच झालेले बदल, पानांचे इतिहास व नोंदी या गोष्टी असतात.",
        "prefs-help-watchlist-token2": "ही आपल्या निरिक्षणसूचीच्या 'वेब फिड'ची गुप्त चाबी आहे.ज्या कोणास त्याची माहिती होईल तो आपली निरिक्षणसूची बघू शकेल,म्हणुन कोणास यात सहभागी करून घेउ नका.[[Special:ResetTokens|पुनर्स्थापनाची आपणास गरज असल्यास येथे टिचकी द्या]].",
        "savedprefs": "तुमच्या पसंती जतन केल्या आहेत.",
+       "savedrights": "{{GENDER:$1|$1}}चे सदस्याधिकार जतन केले आहेत.",
        "timezonelegend": "वेळक्षेत्र",
        "localtime": "स्थानिक वेळ:",
        "timezoneuseserverdefault": "सर्व्हर मूलस्थिती वापरा ($1)",
        "badsig": "अयोग्य कच्ची सही;HTML खुणपताका तपासा.",
        "badsiglength": "तुमची स्वाक्षरी खूप लांब आहे.\nटोपणनाव $1 {{PLURAL:$1|अक्षरापेक्षा|अक्षरांपेक्षा}} कमी लांबीचे हवे.",
        "yourgender": "आपणास कश्या प्रकारे वर्णन केल्या गेलेले आवडेल?",
-       "gender-unknown": "मà¥\80 à¤\85धिà¤\95 à¤¦à¥\87à¤\89 à¤\87à¤\9aà¥\8dà¤\9bित à¤¨à¤¾à¤¹à¥\80",
+       "gender-unknown": "à¤\86पला à¤\89लà¥\8dलà¥\87à¤\96 à¤\95रताà¤\82ना, à¤¹à¥\87 à¤¸à¤\82à¤\9aà¥\87तन, à¤\9cà¥\87थà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87 à¤¤à¥\87थà¥\87, à¤²à¤¿à¤\82à¤\97ाबाबत à¤\85à¤\95à¥\8dरिय à¤¶à¤¬à¥\8dदाà¤\9aा à¤µà¤¾à¤ªà¤° à¤\95रà¥\87ल.",
        "gender-male": "तो विकिपाने संपादितो",
        "gender-female": "ती विकिपाने संपादिते",
        "prefs-help-gender": "या पसंतीक्रमास स्थापणे ऐच्छिक आहे:संचेतन याचा उपयोग आपल्यास लिंगानुसार संबोधित करण्यास करते व आपल्यास दुसऱ्यांना उल्लेखण्यास होतो. ही माहिती सार्वजनिक असेल.",
        "email": "विपत्र",
-       "prefs-help-realname": "तुमचे खरे नाव (वैकल्पिक): हे नाव दिल्यास आपले योगदान या नावाखाली नोंदले व दाखवले जाईल.",
+       "prefs-help-realname": "तुमचे खरे नाव वैकल्पिक आहे.\nते दिल्यास,त्याचा वापर आपणास आपल्या कामाचे श्रेय देण्यास होऊ शकतो.",
        "prefs-help-email": "विपत्रपत्ता वैकल्पिक आहे,परंतु,परवलीचा शब्द आपण विसरल्यास, तो  त्याच्या पुनर्स्थापनेसाठी आवश्यक आहे.",
        "prefs-help-email-others": "आपण इतरांना आपल्याशी ईमेलद्वारे संपर्क साधण्यास,आपल्या सदस्य किंवा सदस्य चर्चा पानातून दुवा देण्याचे निवडू शकता.जेंव्हा इतर आपल्याशी संपर्क साधतात तेंव्हा, आपला विपत्रपत्ता त्यांना दाखविल्या जात नाही.",
        "prefs-help-email-required": "विपत्र(ईमेल)पत्ता हवा.",
        "prefs-tokenwatchlist": "ओळखचिन्ह",
        "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "हा पसंतीक्रम आपल्या पुढील सनोंद प्रवेशानंतर कार्यान्वित होईल.",
+       "prefswarning-warning": "आपण आपल्या पसंतीक्रमात केलेला बदल अद्याप जतन झाला नाही.जर आपण \"$1\" न टिचकता, या पानावरुन दुसरीकडे गेलात तर आपला पसंतीक्रम अद्यतन होणार नाही.",
        "email-address-validity-valid": "विपत्रपत्ता वैध दिसत आहे",
        "email-address-validity-invalid": "वैध विपत्रपत्ता लिहा",
        "userrights": "सदस्य अधिकार व्यवस्थापन",
        "userrights-lookup-user": "सदस्य गटांचे(ग्रूप्स) व्यवस्थापन करा.",
        "userrights-user-editname": "सदस्य नाव टाका:",
        "editusergroup": "सदस्याचे गट संपादित करा",
-       "editinguser": "सदस्य '''[[User:$1|$1]]''' $2 चे सदस्य अधिकारात बदल केला जात आहे.",
+       "editinguser": "{{GENDER:$1|सदस्य}}चे सदस्य अधिकारात बदल केला जात आहे <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्याचे गट संपादित करा",
        "saveusergroups": "सदस्य गट जतन करा",
        "userrights-groupsmember": "(चा) सभासद:",
        "grouppage-suppress": "{{ns:project}}:झापडबंद",
        "right-read": "पृष्ठे वाचा",
        "right-edit": "पाने संपादा",
-       "right-createpage": "पृष्ठे तयार करा (जी चर्चापानांव्यतिरिक्त)",
+       "right-createpage": "पृष्ठे तयार करा (जी चर्चापानांव्यतिरिक्त आहेत)",
        "right-createtalk": "चर्चा पृष्ठे तयार करा",
        "right-createaccount": "नवीन सदस्य खाती तयार करा",
        "right-minoredit": "बदल किरकोळ म्हणून जतन करा",
        "right-deletedtext": "वगळलेला मजकूर व वगळलेल्या आवृत्त्यांमधील बदल पहा",
        "right-browsearchive": "वगळलेली पाने शोधा",
        "right-undelete": "एखादे पान पुनर्स्थापित करा",
-       "right-suppressrevision": "पà¥\8dरà¤\9aालà¤\95ाà¤\82पासà¥\82न à¤²à¤ªà¤µà¤¿à¤²à¥\87लà¥\8dया à¤\86वà¥\83तà¥\8dतà¥\8dया à¤ªà¥\81नरावलà¥\8bà¤\95ित à¤µ à¤ªà¥\81नरà¥\8dसà¥\8dथापित करा",
+       "right-suppressrevision": "à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤¸à¤¦à¤¸à¥\8dयास à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9f à¤\86वà¥\83तà¥\8dतà¥\8dया à¤¦à¤°à¥\8dशवा,लपवा à¤\95िà¤\82वा à¤ªà¥\8dरà¤\97à¤\9f करा",
        "right-suppressionlog": "खासगी नोंदी पहा",
        "right-block": "इतर सदस्यांना संपादन करण्यापासून प्रतिबंधित करा",
        "right-blockemail": "एखाद्या सदस्याला इ-मेल पाठविण्यास प्रतिबंधित करा",
        "action-createpage": "लेख बनवा",
        "action-createtalk": "चर्चा पृष्ठे तयार करा",
        "action-createaccount": "हे सदस्यखाते तयार करा",
+       "action-history": "या पानाचा इतिहास बघा.",
        "action-minoredit": "हे संपादन 'किरकोळ' म्हणून खूण करा",
        "action-move": "हे पान स्थानांतरित करा",
        "action-move-subpages": "हे पान व त्याची उपपाने हलवा",
        "action-move-rootuserpages": "मूळ सदस्यपाने हलवा",
+       "action-move-categorypages": "वर्ग पाने स्थानांतरील करा",
        "action-movefile": "ही संचिका हलवा",
        "action-upload": "या संचिकेचे अपभारण करा",
        "action-reupload": "अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन करा",
        "recentchanges-legend-heading": "'''विवरण:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
-       "rcnotefrom": "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
-       "rclistfrom": "$3 $2 नंतर केले गेलेले बदल दाखवा.",
+       "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
+       "rclistfrom": "$2,$3  नंतर केले गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "rcshowhideminor-show": "दाखवा",
        "rcshowhideminor-hide": "लपवा",
        "rcshowhidemine": "माझे बदल $1",
        "rcshowhidemine-show": "दाखवा",
        "rcshowhidemine-hide": "लपवा",
+       "rcshowhidecategorization-show": "दाखवा",
+       "rcshowhidecategorization-hide": "लपवा",
        "rclinks": "मागील $2 दिवसांतील $1 बदल पहा.<br />$3",
        "diff": "फरक",
        "hist": "इति",
        "newpageletter": "न",
        "boteditletter": "सां",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]",
-       "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा)",
-       "rc_categories_any": "कोणतेही",
+       "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा):",
+       "rc_categories_any": "निवडलà¥\8dयापà¥\88à¤\95à¥\80 à¤\95à¥\8bणतà¥\87हà¥\80",
        "rc-change-size-new": " बदलानंतर $1 {{PLURAL:$1|बाईट|बाईटस्}}",
        "newsectionsummary": "/* $1 */ नवीन विभाग",
        "rc-enhanced-expand": "तपशील दाखवा",
        "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी) जोडलेल्या पानांवरील बदल दर्शवते.\nतुमच्या [[Special:Watchlist|नित्य पहाण्याच्या सूचीमधील]] ही पाने '''ठळक''' दिसतील.",
        "recentchangeslinked-page": "पृष्ठ नाव:",
        "recentchangeslinked-to": "याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा",
+       "recentchanges-page-added-to-category": "[[:$1]] वर्गास जोडले",
        "upload": "संचिका चढवा",
        "uploadbtn": "संचिकेचे अपभारण करा",
        "reuploaddesc": "अपभारण रद्द करुन ,अपभारणाच्या अर्जाकडे परत जा",
        "uploaderror": "अपभारणात चूक",
        "upload-recreate-warning": "'''सावधान: या नावाची संचीका वगळली अथवा स्थलांतरित करण्यात आली आहे.'''\nया पानाची वगळल्याची व स्थलांतरणाची नोंद तुमच्या सोयीसाठी येथे पुरवली आहे.:",
        "uploadtext": "खालील अर्ज नवीन संचिका चढविण्यासाठी वापरा.\nपूर्वी चढविलेल्या संचिका पाहण्यासाठी अथवा शोधण्यासाठी [[Special:FileList|चढविलेल्या संचिकांची यादी]] पहा. चढविलेल्या तसेच वगळलेल्या संचिकांची यादी पहाण्यासाठी [[Special:Log/upload|चढवलेल्या संचिकांची सूची]] व [[Special:Log/delete|वगळलेल्या संचिकांची सूची]] पहा.\n\nएखाद्या लेखात ही संचिका वापरण्यासाठी खालीलप्रमाणे दुवा द्या\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki>''' किंवा\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' संचिकेला थेट दुवा देण्यासाठी वापरा.",
-       "upload-permitted": "अनुमतीत संचिका वर्ग: $1.",
-       "upload-preferred": "शà¥\8dरà¥\87यसà¥\8dà¤\95र à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¥\8dरà¤\95ार:$1.",
-       "upload-prohibited": "प्रतिबंधीत संचिका प्रकार: $1.",
+       "upload-permitted": "अनुमतीत संचिका{{PLURAL:$2|प्रकार}}: $1.",
+       "upload-preferred": "पसà¤\82तà¥\80तला à¤¸à¤\82à¤\9aिà¤\95ा {{PLURAL:$2|पà¥\8dरà¤\95ार}}:$1.",
+       "upload-prohibited": "प्रतिबंधीत संचिका {{PLURAL:$2|प्रकार}}:$1.",
        "uploadlogpage": "अपभारणाच्या नोंदी",
        "uploadlogpagetext": "नवीनतम चढवलेल्या संचिकांची यादीखाली दिलेली आहे.जास्त बघण्यासाठी [[Special:NewFiles|नविन संचिकांची दिर्घिका]] बघा.",
        "filename": "संचिकेचे नाव",
        "largefileserver": "सेवा संगणकावर (सर्व्हर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.",
        "emptyfile": "चढवलेली संचिका रिकामी आहे.असे संचिकानाम चुकीचे लिहिल्याने होउ शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.",
        "windows-nonascii-filename": "या विकिवर विशेष वर्ण असलेल्या संचिकानामाचा आधार घेता येणार नाही.",
-       "fileexists": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87, à¤\95à¥\83पया à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¬à¤¦à¤²à¤£à¥\8dयाबदà¥\8dदल à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¾à¤¶à¤\82à¤\95 à¤\85साल à¤¤à¤° <strong>[[:$1]]</strong> तपासा.\n[[$1|thumb]]",
+       "fileexists": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87, à¤\9cर à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¬à¤¦à¤²à¤£à¥\8dयाबदà¥\8dदल à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¾à¤¶à¤\82à¤\95 à¤\85साल à¤¤à¤°, à¤\95à¥\83पया <strong>[[:$1]]</strong>तपासा.\n[[$1|thumb]]",
        "filepageexists": "या नावाचे एक माहितीपृष्ठ (संचिका नव्हे) अगोदरच अस्तित्त्वात आहे. कृपया जर आपणांस त्यात बदल करायचा नसेल तर <strong>[[:$1]]</strong> तपासा.\n[[$1|thumb]]",
-       "fileexists-extension": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87: [[$2|thumb]]\n* à¤\9aढवà¥\80त à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$1]]</strong>\n* à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$2]]</strong>\nà¤\95à¥\83पया à¤¦à¥\81सरà¥\87 à¤¨à¤¾à¤µ à¤¨à¤¿à¤µà¤¡à¤¾.",
+       "fileexists-extension": "या à¤¸à¤¾à¤°à¤\96à¥\8dया à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87: [[$2|thumb]]\n* à¤\9aढवà¥\80त à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$1]]</strong>\n* à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$2]]</strong>\nà¤\86पणास à¤\85धिà¤\95 à¤µà¥\88शिषà¥\8dà¤\9fà¥\8dयपà¥\82रà¥\8dण à¤¨à¤¾à¤µ à¤¨à¤¿à¤µà¤¡à¤¾à¤¯à¤\9aà¥\87 à¤\86हà¥\87 à¤\95ाय?",
        "fileexists-thumbnail-yes": "आपण चढवीत असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]\nकृपया <strong>[[:$1]]</strong> ही संचिका तपासा.\nजर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
        "file-thumbnail-no": "या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.\nजर तुमच्याकडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.",
        "fileexists-forbidden": "या नावाची संचिका अगोदरच अस्तित्त्वात आहे; कृपया पुन्हा परत जाऊन ही संचिका नवीन नावाने चढवा.\n[[File:$1|thumb|center|$1]]",
        "filename-bad-prefix": "तुम्ही चढवत असलेल्या संचिकेचे नाव '''\"$1\"''' पासून सुरू होते, जे की अंकीय छाउ (कॅमेरा) ने दिलेले अवर्णनात्मक नाव आहे.कृपया तुमच्या संचिकेकरिता अधिक वर्णनात्मक नाव निवडा.",
        "upload-success-subj": "यशस्वीरीत्या अपभारित केले",
        "upload-success-msg": "तुमचे [$2] येथून अपभारण यशस्वी ठरले. ते येथे उपलब्ध आहे: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "à¤\9aढवणà¥\8dयातà¥\80ल à¤¤à¥\8dरà¥\82à¤\9fि:",
-       "upload-failure-msg": "[$2] à¤¯à¥\87थà¥\82न à¤¤à¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात à¤\9aà¥\82à¤\95 झाली:\n\n$1",
-       "upload-warning-subj": "à¤\9aढवताना à¤¸à¥\82à¤\9aना",
-       "upload-warning-msg": "तà¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात [$2] à¤¯à¥\87थà¥\82न à¤\9aà¥\82à¤\95 झाली. तुम्ही [[Special:Upload/stash/$1|चढवण्याचा अर्ज]] पुन्हा भरून ही चूक दूर करू शकता.",
-       "upload-proto-error": "à¤\9aà¥\82à¤\95à¥\80à¤\9aा à¤¸à¤\82à¤\95à¥\87त",
-       "upload-proto-error-text": "दà¥\82रसà¥\8dथ à¤\9aढवणà¥\8dयाच्या क्रियेत <code>http://</code>पासून किंवा <code>ftp://</code>पासून सुरू होणारी URL लागतात.",
+       "upload-failure-subj": "à¤\85पभारणातà¥\80ल à¤¤à¥\8dरà¥\82à¤\9fि",
+       "upload-failure-msg": "[$2] à¤¯à¥\87थà¥\82न à¤¤à¥\81मà¤\9aà¥\8dया à¤\85पभारणात à¤\85डà¤\9aण à¤¨à¤¿à¤°à¥\8dमाण झाली:\n\n$1",
+       "upload-warning-subj": "à¤\85पभारण à¤¤à¤¾à¤\95िद",
+       "upload-warning-msg": "तà¥\81मà¤\9aà¥\8dया à¤\85पभारणात [$2] à¤¯à¥\87थà¥\82न à¤\85डà¤\9aण à¤¨à¤¿à¤°à¥\8dमाण झाली. तुम्ही [[Special:Upload/stash/$1|चढवण्याचा अर्ज]] पुन्हा भरून ही चूक दूर करू शकता.",
+       "upload-proto-error": "à¤\9aà¥\82à¤\95à¥\80à¤\9aा à¤¶à¤¿à¤·à¥\8dà¤\9fाà¤\9aार",
+       "upload-proto-error-text": "दà¥\82रसà¥\8dथ à¤\85पभारणाच्या क्रियेत <code>http://</code>पासून किंवा <code>ftp://</code>पासून सुरू होणारी URL लागतात.",
        "upload-file-error": "अंतर्गत त्रूटी",
-       "upload-file-error-text": "विदादातà¥\8dयावर à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सताना à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¤¾à¤\82तà¥\8dरिà¤\95 à¤\85डà¤\9aण à¤\86ली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
-       "upload-misc-error": "सà¤\82à¤\9aिà¤\95ा à¤\9aढविताना à¤®à¤¾à¤¹à¥\80त à¤¨à¤¸à¤²à¥\87लà¥\80 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\86लà¥\87लà¥\80 à¤\86हà¥\87.",
-       "upload-misc-error-text": "à¤\9aढवताना à¤\85à¤\9cà¥\8dà¤\9eात à¤¤à¤¾à¤\82तà¥\8dरिà¤\95 à¤\85डà¤\9aण à¤\86लà¥\80.à¤\95à¥\83पया à¤\86à¤\82तरà¤\9cालपतà¥\8dता à¤¸à¥\81यà¥\8bà¤\97à¥\8dय à¤\86णि à¤\89पलबà¥\8dध à¤\86हà¥\87 à¤\95ा à¤¤à¥\87 à¤¤à¤ªà¤¾à¤¸à¤¾ à¤\86णि à¤ªà¥\81नà¥\8dहा à¤ªà¥\8dरयतà¥\8dन à¤\95रा. à¤\85धिà¤\95 à¤\85डà¤\9aणà¥\80 à¤\86लà¥\8dयास à¤¤à¤° [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
+       "upload-file-error-text": "विदादातà¥\8dयावर à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सताना à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¥\8dरà¥\82à¤\9fà¥\80 à¤\98डली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
+       "upload-misc-error": "à¤\85नà¥\8bळà¤\96à¥\80 à¤\85पभारण à¤¤à¥\8dरà¥\82à¤\9fà¥\80.",
+       "upload-misc-error-text": "à¤\85पभारणात à¤\85नà¥\8bळà¤\96à¥\80 à¤¤à¥\8dरà¥\82à¤\9fà¥\80 à¤\98डलà¥\80.à¤\95à¥\83पया à¤¯à¥\82à¤\86रà¤\8fल à¤µà¥\88ध à¤\86णि à¤ªà¥\8bहà¥\8bà¤\9aयà¥\8bà¤\97à¥\8dय à¤\86हà¥\87 à¤\95ा à¤¤à¥\87 à¤¤à¤ªà¤¾à¤¸à¤¾ à¤\86णि à¤ªà¥\81नà¥\8dहा à¤ªà¥\8dरयतà¥\8dन à¤\95रा. à¤\85डà¤\9aण à¤¤à¤¶à¥\80à¤\9a à¤\9fिà¤\95à¥\81न à¤°à¤¾à¤¹à¤¿à¤²à¥\8dयास,  [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
        "upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
        "upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
-       "upload-copy-upload-invalid-domain": "सà¤\82à¤\95à¥\8dरमित à¤\95à¥\87लà¥\87लà¥\80 à¤®à¤¹à¤¿à¤¤à¥\80 à¤\85धिà¤\95à¥\8dषà¥\87तà¥\8dरात à¤\89पलबà¥\8dध à¤¨à¤¾à¤¹à¥\80.",
+       "upload-copy-upload-invalid-domain": "या à¤¡à¥\8bमà¥\87नमधà¥\8dयà¥\87 à¤ªà¥\8dरत-à¤\85पभारणà¥\87 à¤\85नà¥\81पलबà¥\8dध à¤\86हà¥\87त.",
        "upload-dialog-title": "संचिकेचे अपभारण करा",
        "upload-dialog-button-cancel": "रद्द करा",
        "upload-dialog-button-done": "झाले",
        "upload-dialog-button-save": "जतन करा",
        "upload-dialog-button-upload": "अपभारण करा",
-       "upload-process-error": "त्रुटी घडली",
-       "upload-process-warning": "ईशारा उद्भवला",
        "upload-form-label-select-file": "संचिका निवडा",
        "upload-form-label-infoform-title": "तपशील",
        "upload-form-label-infoform-name": "नाव",
        "backend-fail-hashes": "तुलना करण्यासाठी फाइल हॅशेस मिळाले नाही",
        "backend-fail-notsame": " $1 येथे यापेक्षा विभिन्न असलेली संचिका पूर्वीच विद्यमान आहे",
        "backend-fail-invalidpath": "$1 हा वैध संग्राहक-पथ नाही.",
-       "backend-fail-delete": "$1 ही संचिका (फाईल) बनवता आली नाही.",
-       "backend-fail-describe": "\"$1\" à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87साठà¥\80 à¤\86पण मेटाडाटा बदलू शकत नाही.",
+       "backend-fail-delete": "\"$1\" ही संचिका (फाईल) वगळता आली नाही.",
+       "backend-fail-describe": "\"$1\" à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87साठà¥\80 à¤\85सलà¥\87ला मेटाडाटा बदलू शकत नाही.",
        "backend-fail-alreadyexists": "$1 ही संचिका अगोदरच अस्तित्वात आहे.",
-       "backend-fail-store": "$1 ही संचिका $2मधे साठवू शकत नाही.",
-       "backend-fail-copy": "\"$1\" à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\80 \"$2\" à¤¹à¥\80 à¤ªà¥\8dरत à¤\95रता à¤\86लà¥\80 नाही.",
-       "backend-fail-move": "संचिका $1 पासून $2मधे हलवता आली नाही.",
+       "backend-fail-store": "\"$1\" ही संचिका \"$2\"मध्ये साठवू शकत नाही.",
+       "backend-fail-copy": "\"$1\" à¤¸à¤\82à¤\9aिà¤\95à¥\87स \"$2\" à¤®à¤§à¥\8dयà¥\87 à¤¨à¤\95लता à¤\86लà¥\87 नाही.",
+       "backend-fail-move": "संचिका \"$1\"ला \"$2\"मधे स्थानांतरीत करता आले नाही.",
        "backend-fail-opentemp": "तात्पुरती संचिका उघडणे जमले नाही.",
        "backend-fail-writetemp": "तात्पुरत्या संचिकेत लिहिणे जमले नाही.",
        "backend-fail-closetemp": "तात्पुरती संचिका बंद करणे जमले नाही.",
-       "backend-fail-read": "$1 ही संचिका वाचता आली नाही.",
-       "backend-fail-create": "$1 ही संचिका लिहिता आली नाही.",
+       "backend-fail-read": "\"$1\"ही संचिका वाचता आली नाही.",
+       "backend-fail-create": "\"$1\"ही संचिका लिहिता आली नाही.",
        "backend-fail-maxsize": "$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|एक बाइट|$2 बाइट्स}} पेक्षा मोठी आहे.",
        "backend-fail-readonly": "पार्श्वभौमीक साठवण \"$1\" “फक्त वाचा” अशी आहे. दिलेले कारण आहे: \"<em>$2</em>\"",
        "backend-fail-synced": "अंतर्गत पार्श्वभौमीक साठवणीतील फाईल \"$1\" विसंगत आहे.",
        "backend-fail-connect": "पार्श्वभौमीक साठा \"$1\"शी संबंध जोडू शकत नाही.",
        "backend-fail-internal": "पार्श्वभौमीक साठा \"$1\" यात अज्ञात चूक झाली आहे.",
-       "backend-fail-contenttype": "\"$1\" à¤®à¤§à¥\8dयà¥\87 à¤ à¥\87वलà¥\87लà¥\8dया à¤«à¤¾à¤\88लà¤\9aा à¤®à¤¹à¤¿à¤¤à¥\80à¤\9aा à¤ªà¥\8dरà¤\95ार à¤\95ळत à¤¨à¤¾à¤¹à¥\80",
+       "backend-fail-contenttype": "\"$1\" à¤®à¤§à¥\8dयà¥\87 à¤¸à¤¾à¤ à¤µà¤¿à¤£à¥\8dयात à¤¯à¥\87णाऱà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aा à¤\86शय-पà¥\8dरà¤\95ार(à¤\95à¤\82à¤\9fà¥\87à¤\82à¤\9f à¤\9fाà¤\88प) à¤¨à¤\95à¥\8dà¤\95à¥\80 à¤\95रता à¤\86ला à¤¨à¤¾à¤¹à¥\80.",
        "backend-fail-batchsize": "पार्श्वभौमीक साठयातील बॅच $1 फाईल{{PLURAL:$1|क्रियेत|क्रियांमध्ये}}; मर्यादित कस्त $२ {{PLURAL:$2|क्रिया}} असू शकते",
        "backend-fail-usable": "अपुऱ्या परवानगीमुळे किंवा निर्देशिकेच्या/धारिकेच्या(डिरेक्टरीज/कंटेनर्स) अभावामुळे \"$1\" संचिका वाचु अथवा लिहू शकत नाही.",
        "filejournal-fail-dbconnect": "\"$1\" स्टोरेज बॅकएंडकरिता, माहिती-भांडाराच्या ज्ञानपत्रिकेशी जुळता आले नाही.",
        "lockmanager-fail-deletelock": "\"$1\" साठी लॉक फाइल वगळू शकत नाही",
        "lockmanager-fail-acquirelock": "\"$1\" साठी लॉक फाइल मिळवू शकत नाही",
        "lockmanager-fail-openlock": "\"$1\" साठी लॉक फाइल उघडू शकत नाही",
-       "lockmanager-fail-releaselock": "\"$1\" à¤¸à¤¾à¤ à¥\80 à¤²à¥\89à¤\95 à¤\89à¤\98डà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80",
+       "lockmanager-fail-releaselock": "\"$1\" à¤¸à¤¾à¤ à¥\80 à¤¤à¤¾à¤³à¤¾ à¤\89à¤\98डà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.",
        "lockmanager-fail-db-bucket": "$1 बकेट मधील कुलूप बंद डेटाबेसशी पुरेसा संपर्क होवू शकत नाही.",
-       "lockmanager-fail-db-release": "\"$1\" à¤¡à¤¾à¤\9fाबà¥\87स à¤µà¤°à¥\80ल à¤²à¥\89à¤\95 उघडू शकत नाही",
+       "lockmanager-fail-db-release": "\"$1\" à¤¡à¤¾à¤\9fाबà¥\87स à¤µà¤°à¥\80ल à¤¤à¤¾à¤³à¤¾ उघडू शकत नाही",
        "lockmanager-fail-svr-acquire": "सर्व्हर \"$1\" वरील कुलूप उघडू शकत नाही",
        "lockmanager-fail-svr-release": "सर्व्हर \"$1\" वरील् लॉक उघडू शकत नाही",
-       "zip-file-open-error": "सà¤\82à¤\9aà¥\80à¤\95ा ZIP à¤¤à¤ªà¤¾à¤¸à¤£à¥\80साठà¥\80 à¤\89à¤\98डताना à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\86ली.",
-       "zip-wrong-format": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा \"à¤\9dिप\" à¤ªà¥\8dरà¤\95ारà¤\9aà¥\80 नाही.",
+       "zip-file-open-error": "सà¤\82à¤\9aिà¤\95ा ZIP à¤¤à¤ªà¤¾à¤¸à¤£à¥\80साठà¥\80 à¤\89à¤\98डताना à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\89दà¥\8dभवली.",
+       "zip-wrong-format": "नमà¥\82द à¤\95à¥\87लà¥\87लà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¹à¥\80 à¤\9dिप(ZIP)सà¤\82à¤\9aिà¤\95ा नाही.",
        "zip-bad": "ही संचिका दूषित किंवा न वाचता येणारी झिप संचिका आहे.\nती सुरक्षिततेसाठी नीट तपासता आली नाही.",
        "zip-unsupported": "ही संचिका एक ZIP संचिका आहे जी मिडीयाविकी द्वारे  (support) न केलेले ZIP वैशिष्ट्ये (features) वापरते.\nया संचिकेची सुरक्षा पडताळणी व्यवस्थितरीत्या होऊ शकत नाही.",
        "uploadstash": "चढवणे लपवा",
        "uploadstash-badtoken": "ही कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.",
        "uploadstash-errclear": "संचिका स्वच्छ करणे अयशस्वी.",
        "uploadstash-refresh": "संचिकांची यादी ताजीतवानी करा",
-       "invalid-chunk-offset": "à¤\85à¤\97à¥\8dराहà¥\8dय चंक ऑफसेट",
+       "invalid-chunk-offset": "à¤\85वà¥\88ध चंक ऑफसेट",
        "img-auth-accessdenied": "पोहोच नाकारल्या गेली.",
-       "img-auth-nopathinfo": "मारà¥\8dà¤\97 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\86ढळलà¥\80 à¤¨à¤¾à¤¹à¥\80.\nà¤\86पला à¤¸à¤°à¥\8dवà¥\8dहर à¤¹à¥\80 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤ªà¥\8bà¤\9aवà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.\nतà¥\8b à¤¸à¥\80à¤\9cà¥\80à¤\86य-à¤\86धारित à¤µ à¤\87मà¥\87à¤\9c_à¤\91थला à¤¸à¤®à¤°à¥\8dथन à¤¨ à¤¦à¥\87à¤\8a à¤¶à¤\95णारा à¤\85सà¥\82 à¤¶à¤\95तà¥\8b.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization à¤\95à¥\83पया हे पहा.",
-       "img-auth-notindir": "माà¤\97ितलà¥\87ला à¤®à¤¾à¤°à¥\8dà¤\97 à¤\85पलà¥\8bड à¤¨à¤¿à¤°à¥\8dदà¥\87शिà¤\95à¥\87à¤\95रà¥\80ता à¤\9cà¥\8bडलà¥\87ला नाही.",
+       "img-auth-nopathinfo": "मारà¥\8dà¤\97 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\86ढळलà¥\80 à¤¨à¤¾à¤¹à¥\80.\nà¤\86पला à¤¸à¤°à¥\8dवà¥\8dहर à¤¹à¥\80 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¦à¥\87णà¥\8dयास à¤\85नà¥\81नत à¤¨à¤¾à¤¹à¥\80.\nतà¥\8b à¤¸à¥\80à¤\9cà¥\80à¤\86य-à¤\86धारित à¤µ à¤\87मà¥\87à¤\9c_à¤\91थला à¤¸à¤®à¤°à¥\8dथन à¤¨ à¤¦à¥\87à¤\8a à¤¶à¤\95णारा à¤\85सà¥\82 à¤¶à¤\95तà¥\8b.\nà¤\95à¥\83पया https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization  हे पहा.",
+       "img-auth-notindir": "विनà¤\82तà¥\80 à¤\95à¥\87लà¥\87ला à¤®à¤¾à¤°à¥\8dà¤\97 à¤\85पभारण à¤¶à¤¬à¥\8dदà¤\95à¥\8bशाà¤\95रà¥\80ता à¤°à¤\9aित नाही.",
        "img-auth-badtitle": "\"$1\" पासून वैध शीर्षक बनवण्यात अयशस्वी.",
        "img-auth-nologinnWL": "तुम्ही प्रवेश घेतलेला नाही व \"$1\" श्वेतयादीत नाही.",
        "img-auth-nofile": "\"$1\" ही संचिका अस्तित्वात नाही.",
-       "img-auth-isdir": "तुम्ही $1 निदेशक वापरण्याचा प्रयत्न करत आहात.\nफक्त संचिका वापरण्याची परवानगी आहे.",
+       "img-auth-isdir": "तुम्ही \"$1\" निदेशक वापरण्याचा प्रयत्न करत आहात.\nफक्त संचिका वापरण्याची परवानगी आहे.",
        "img-auth-streaming": "स्ट्रीमिंग \"$1\".",
        "img-auth-public": "img_auth.php हे  वैयक्तिक विकीमधून  माहिती प्रदान करण्याचे कार्य करते.\nहा विकि सार्वजनिक विकि म्हणून सब्चित करण्यात आला आहे.\nकिमान सुरक्षेसाठी img_auth.php ला अक्षम केले आहे.",
        "img-auth-noread": "तुम्हाला \"$1\" वाचण्याची परवानगी नाही",
        "http-bad-status": "एचटीटीपी मागणीदरम्यान एक चूक उद्भवली: $1 $2",
        "upload-curl-error6": "आंतरजाल पत्त्यापाशी पोहोचले नाही",
        "upload-curl-error6-text": "दिलेल्या URL ला पोहचू शकलो नाही.कृपया URL बरोबर असून संकेतस्थळ चालू असल्याची पुनश्च खात्री करा.",
-       "upload-curl-error28": "à¤\9aढवणà¥\8dयात à¤µà¥\87ळà¤\97à¥\87लà¥\80",
-       "upload-curl-error28-text": "संकेतस्थळाने साद देण्यात खूप जास्त वेळ घेतला आहे,कृपया थोडा वेळ थांबा आणि पुन्हा प्रयत्न करा.कदाचित तुम्ही कमी गर्दीच्या वेळात प्रयत्न करू इच्छीताल.",
+       "upload-curl-error28": "à¤\85पभारण à¤\95ालबाहà¥\8dय à¤\9dालà¥\87",
+       "upload-curl-error28-text": "संकेतस्थळाने साद देण्यात खूप जास्त वेळ घेतला आहे.\nकृपया हे तपासा कि ते संकेतस्थळ सुरु आहे.थोडा वेळ थांबा आणि पुन्हा प्रयत्न करा.\nकदाचित तुम्ही कमी गर्दीच्या वेळात प्रयत्न करू इच्छीत असाल.",
        "license": "परवाना:",
        "license-header": "परवाना:",
        "nolicense": "काही निवडलेले नाही",
        "upload_source_file": "(तुमच्या संगणकावरील एक संचिका निवडली आहे)",
        "listfiles-delete": "वगळा",
        "listfiles-summary": "हे विशेष पान सर्व अपभारिलेल्या संचिका दर्शिविते.",
-       "listfiles_search_for": "à¤\9aितà¥\8dर à¤¨à¤¾à¤µà¤¾à¤¨à¥\87 à¤¶à¥\8bध:",
+       "listfiles_search_for": "माधà¥\8dयमाà¤\9aà¥\87 à¤¨à¤¾à¤µ à¤¶à¥\8bधा:",
        "listfiles-userdoesnotexist": "सदस्यखाते \"$1\"  हे नोंदलेले नाही.",
        "imgfile": "संचिका",
-       "listfiles": "à¤\9aितà¥\8dर यादी",
+       "listfiles": "सà¤\82à¤\9aिà¤\95ा यादी",
        "listfiles_thumb": "नखुले",
        "listfiles_date": "दिनांक",
        "listfiles_name": "नाव",
        "filehist-comment": "प्रतिक्रीया",
        "imagelinks": "संचिका वापर",
        "linkstoimage": "खालील {{PLURAL:$1|पान चित्राशी जोडले आहे|$1 पाने चित्राशी जोडली आहेत}}:",
-       "linkstoimage-more": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ $1 {{PLURAL:$1|पान à¤\9cà¥\8bडलà¥\87|पानà¥\87 à¤\9cà¥\8bडलà¥\80}} à¤\86हà¥\87त.\nया à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ à¤\9cà¥\8bडलà¥\87लà¥\8dया {{PLURAL:$1|पहिलà¥\8dया à¤ªà¤¾à¤¨à¤\9aा à¤¦à¥\81वा à¤\96ालà¥\80 à¤¦à¤¿à¤²à¤¾ à¤\86हà¥\87|पहिलà¥\8dया $1 à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¦à¥\81वà¥\87 à¤\96ालà¥\80 à¤¦à¤¿à¤²à¥\87 à¤\86हà¥\87त}}.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
+       "linkstoimage-more": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ $1 {{PLURAL:$1|पान à¤\9cà¥\8bडलà¥\87|पानà¥\87 à¤\9cà¥\8bडलà¥\80}} à¤\86हà¥\87त.\nà¤\96ालà¥\80ल à¤¯à¤¾à¤¦à¥\80 à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ à¤\9cà¥\8bडलà¥\87लà¥\8dया {{PLURAL:$1|पहिलà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤¦à¥\81वा |पहिलà¥\8dया $1 à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¦à¥\81वà¥\87 }}दरà¥\8dशवितà¥\87.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
        "nolinkstoimage": "या चित्राशी जोडलेली पृष्ठे नाही आहेत.",
        "morelinkstoimage": "या संचिकेचे [[Special:WhatLinksHere/$1|अधिक दुवे]] पहा.",
        "linkstoimage-redirect": "$1 (संचिका पुनर्निर्देशन) $2",
        "duplicatesoffile": "खालील संचिका या दिलेल्या {{PLURAL:$1|संचिकेची प्रत आहे|$1 संचिकांच्या प्रती आहेत}}. [[Special:FileDuplicateSearch/$2|अधिक माहिती]]",
-       "sharedupload": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82मधà¥\8dयà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\80 à¤\97à¥\87लà¥\8dयाà¤\9aà¥\80 à¤¶à¤\95à¥\8dयता à¤\86हे.",
-       "sharedupload-desc-there": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82मधà¥\8dयà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\80 जाऊ शकते.\nअधिक माहिती साठी कृपया [$2 संचिका वर्णन पान] पहावे.",
+       "sharedupload": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82दà¥\8dवारà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\9cाà¤\8a à¤¶à¤\95ते.",
+       "sharedupload-desc-there": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82दà¥\8dवारà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\8dया जाऊ शकते.\nअधिक माहिती साठी कृपया [$2 संचिका वर्णन पान] पहावे.",
        "sharedupload-desc-here": "ही संचिका $1 येथील असून ती इतर प्रकल्पात वापरलेली असू शकते.\nतिचे तेथील [$2 संचिका वर्णन पान] खाली दाखवले आहे.",
        "sharedupload-desc-edit": "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जाऊ शकते.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता.",
        "sharedupload-desc-create": "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जात असल्याची शक्यता आहे.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता",
        "filepage-nofile": "या नावाची संचिका अस्तित्वात नाही.",
        "filepage-nofile-link": "या नावाची संचिका अस्तित्वात नाही, पण तुम्ही ती [$1 चढवू शकता].",
-       "uploadnewversion-linktext": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\80 à¤¨à¤µà¥\80न à¤\86वà¥\83तà¥\8dतà¥\80 à¤\9aढवा",
+       "uploadnewversion-linktext": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\8dया à¤¨à¤µà¥\80न à¤\86वà¥\83तà¥\8dतà¥\80à¤\9aà¥\87 à¤\85पभारण à¤\95रा",
        "shared-repo-from": "$1 पासून",
        "shared-repo": "एक मुक्त कोश",
        "upload-disallowed-here": "या संचिकेवर आपण पुनर्लिखाण करू शकत नाही.",
-       "filerevert": "$1 पूर्वपद",
-       "filerevert-legend": "संचिका पूर्वपदास",
+       "filerevert": "$1 पूर्वपदास न्या",
+       "filerevert-legend": "संचिका पूर्वपदास न्या",
        "filerevert-intro": "तुम्ही [$3, $2 प्रमाणे आवर्तन$4 कडे]<strong>[[Media:$1|$1]]</strong>  उलटवत आहात.",
        "filerevert-comment": "कारण:",
        "filerevert-defaultcomment": "$2, $1 च्या आवृत्तीस पूर्वपदावर ($3)",
-       "filerevert-submit": "पूर्वपद",
+       "filerevert-submit": "पूर्वपदास न्या",
        "filerevert-success": "[$3, $2 प्रमाणे आवर्तन $4]कडे<strong>[[Media:$1|$1]]</strong>उलटवण्यात आली.",
        "filerevert-badversion": "दिलेलेल्या वेळ मापनानुसार,या संचिकेकरिता कोणतीही पूर्वीची स्थानिक आवृत्ती नाही.",
        "filedelete": "$1 वगळा",
        "download": "अधिभारण करा",
        "unwatchedpages": "देखरेख नसलेली पाने",
        "listredirects": "पुनर्निर्देशनांची यादी",
+       "listduplicatedfiles": "प्रतिलिपी(डुप्लिकेट) संचिकांची यादी",
        "unusedtemplates": "न वापरलेले साचे",
        "unusedtemplatestext": "या पानावर साचा नामविश्वातील अशी सर्व पाने आहेत जी कुठल्याही पानात वापरलेली नाहीत. वगळण्यापूर्वी साच्यांना जोडणारे इतर दुवे पाहण्यास विसरू नका.",
        "unusedtemplateswlh": "इतर दुवे",
        "statistics-edits": "{{SITENAME}} च्या सुरुवातीपासूनची पानांची संपादने",
        "statistics-edits-average": "प्रतिपान सरासरी संपादने",
        "statistics-users": "नोंदणीकृत [[Special:ListUsers|सदस्य]]",
-       "statistics-users-active": "à¤\95ारà¥\8dयरत सदस्य",
-       "statistics-users-active-desc": "{{PLURAL:$1|शेवटच्या दिवसात|शेवटच्या $1 दिवसांत}} एकतरी संपादन केलेले सदस्य",
+       "statistics-users-active": "à¤\95à¥\8dरियाशà¥\80ल सदस्य",
+       "statistics-users-active-desc": "शेवटच्या{{PLURAL:$1|दिवसात|$1 दिवसांत}} एकतरी संपादन केलेले सदस्य",
        "pageswithprop": "'पृष्ठ गुणधर्म' असणारी पाने",
        "pageswithprop-legend": "पृष्ठ गुणधर्म असणारी पाने",
        "pageswithprop-text": "या पानावर अश्या पानांची यादी आहे जे एक विशिष्ट 'पृष्ठ गुणधर्म'  वापरतात.",
        "doubleredirects": "दुहेरी-पुनर्निर्देशने",
        "doubleredirectstext": "हे पान, अशा पानांची यादी पुरवते की जी पाने, दुसऱ्या पुर्ननिर्देशीत पानाकडे पुर्ननिर्देशीत झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनाचा दुवा दिला आहे,तसेच, दुसऱ्या  पुर्ननिर्देशनाचे लक्ष्य पान पण दिले आहे,जे मुळात ते \nलक्ष्यपान आहे ज्याकडे, पहिले पुनर्निर्देशन असावयास हवे.\n\n<del>खोडलेल्या प्रविष्टी</del>समायोजित करण्यात आलेल्या आहेत.",
        "double-redirect-fixed-move": "[[$1]] हलवले गेले आहे.\nते आता स्वयंचलितरित्या अद्यतन केल्या गेले व [[$2]] येथे निर्देशित होते.",
-       "double-redirect-fixed-maintenance": "[[$1]] ते [[$2]] हे चुकीचे पुनर्निर्देशन ठिकठाक केले.",
+       "double-redirect-fixed-maintenance": "देखभालीच्या कामादरम्यान,स्वयंचलितरित्या [[$1]]पासून ते [[$2]]ला, हे दुहेरी पुनर्निर्देशन ठिकठाक केले.",
        "double-redirect-fixer": "पुनर्निर्देशन ठिकठाक करणारा",
        "brokenredirects": "मोडकी पुनर्निर्देशने",
        "brokenredirectstext": "खालील पुनर्निर्देशने अस्तित्वात नसलेली पाने जोडतात:",
        "withoutinterwiki-submit": "दाखवा",
        "fewestrevisions": "सगळ्यात कमी बदल असलेले लेख",
        "nbytes": "$1 {{PLURAL:$1|बाइट}}",
-       "ncategories": "$1 {{PLURAL:$1|वर्ग|वर्ग}}",
-       "ninterwikis": "$1 {{PLURAL:$1|आंतरविकि|आंतरविकि दुवे}}",
+       "ncategories": "$1 {{PLURAL:$1|वर्ग}}",
+       "ninterwikis": "$1 {{PLURAL:$1|आंतरविकि}}",
        "nlinks": "$1 {{PLURAL:$1|दुवा|दुवे}}",
        "nmembers": "$1 {{PLURAL:$1|सदस्य}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्य}}",
        "lonelypagestext": "खालील पानांना {{SITENAME}}च्या इतर पानांकडून दुवा जोड झालेली नाही.",
        "uncategorizedpages": "अवर्गीकृत पाने",
        "uncategorizedcategories": "अवर्गीकृत वर्ग",
-       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤\9aितà¥\8dरà¥\87",
+       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤¸à¤\82à¤\9aिà¤\95ा",
        "uncategorizedtemplates": "अवर्गीकृत साचे",
        "unusedcategories": "न वापरलेले वर्ग",
        "unusedimages": "न वापरलेल्या संचिका",
        "wantedcategories": "पाहिजे असलेले वर्ग",
        "wantedpages": "पाहिजे असलेले लेख",
+       "wantedpages-summary": "ही,ज्यांना अधिकांश दुवे आहेत अश्या अस्तित्वात नसलेल्या पानांची यादी आहे. यात ती पाने वगळली आहेत, ज्यांना फक्त पुनर्निर्देशनाचा दुवा आहे. अस्तित्वात नसलेली पण पुनर्निर्देशनाने जोडलेली जी पाने आहेत, अश्यांच्या यादीसाठी [[{{#special:BrokenRedirects}}|मोडकी पुनर्निर्देशने असलेल्या पानांची यादी]] बघा.",
        "wantedpages-badtitle": "परिणामाच्या यादीत अवैध शीर्षक: $1",
        "wantedfiles": "पाहिजे असलेल्या संचिका",
-       "wantedfiletext-cat": "पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त. à¤¬à¤¾à¤¹à¥\87रà¥\80ल à¤ à¤¿à¤\95ाणाà¤\82à¤\9aà¥\8dया à¤«à¤¾à¤\87लà¥\8dस à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¤¾à¤¤ à¤ªà¤£ à¤\85सतà¥\80लà¤\9a à¤\85सà¥\87 à¤¨à¤¾à¤¹à¥\80. à¤\85शा à¤«à¤¾à¤\87लà¥\8dस à¤\86ढळलà¥\8dयास à¤µà¤\97ळलà¥\8dया à¤\9cातà¥\80ल. à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87 [[:$1]] à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¥\80ल.",
+       "wantedfiletext-cat": "पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त. à¤¬à¤¾à¤¹à¥\87रà¥\80ल à¤ à¤¿à¤\95ाणाà¤\82à¤\9aà¥\8dया à¤«à¤¾à¤\87लà¥\8dस à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¤¾à¤¤ à¤ªà¤£ à¤\85सतà¥\80लà¤\9a à¤\85सà¥\87 à¤¨à¤¾à¤¹à¥\80. à¤\85शा à¤«à¤¾à¤\87लà¥\8dस à¤\86ढळलà¥\8dयास à¤µà¤\97ळलà¥\8dया à¤\9cातà¥\80ल. à¤\85तिरिà¤\95à¥\8dतपणà¥\87,à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87, à¤\9cà¥\8dयात à¤\9fाà¤\95लà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त,तà¥\8dयाà¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80 [[:$1]] à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¥\87ल.",
        "wantedfiletext-nocat": "पुढील फाइल्स वापरल्या असतील पण आता अस्तित्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील.",
        "wantedtemplates": "पाहिजे असलेले साचे",
        "mostlinked": "सर्वाधिक जोडलेली पाने",
        "mostlinkedcategories": "सर्वाधिक जोडलेले वर्ग",
-       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤\9cà¥\8bडलà¥\87लà¥\87 à¤¸à¤¾à¤\9aे",
-       "mostcategories": "सरà¥\8dवाधिà¤\95 à¤µà¤°à¥\8dà¤\97à¥\80à¤\95à¥\83त पाने",
+       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤\86à¤\82तरभà¥\82त à¤ªà¤¾à¤¨े",
+       "mostcategories": "बहà¥\81तà¥\87à¤\95 à¤¸à¤°à¥\8dव à¤µà¤°à¥\8dà¤\97 à¤\85सलà¥\87लà¥\80 पाने",
        "mostimages": "सर्वाधिक जोडलेली चित्रे",
        "mostinterwikis": "सर्वाधिक आंतरविकि दुवे असणारी पाने",
        "mostrevisions": "सर्वाधिक बदललेले लेख",
        "shortpages": "छोटी पाने",
        "longpages": "मोठी पाने",
        "deadendpages": "टोकाची पाने",
-       "deadendpagestext": "या पानांवर या विकिवरील इतर कुठल्याही पानाला जोडणारा दुवा नाही.",
+       "deadendpagestext": "या पानांवर या {{SITENAME}}वरील इतर कुठल्याही पानाला जोडणारा दुवा नाही.",
        "protectedpages": "सुरक्षित पाने",
        "protectedpages-indef": "फक्त अनंत काळासाठी सुरक्षित केलेले",
-       "protectedpages-summary": "या पानात,अस्तित्वात असणाऱ्या संरक्षित अशा पानाची यादी आहे.नवनिर्माणापासून संरक्षित शीर्षकांच्या यादीसाठी [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] बघा.",
+       "protectedpages-summary": "या पानात,अस्तित्वात असणाऱ्या संरक्षित अशा पानाची यादी आहे.नवनिर्माणापासून संरक्षित शीर्षकांच्या यादीसाठी [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]  बघा.",
        "protectedpages-cascade": "केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)",
        "protectedpages-noredirect": "पुनर्निर्देशने लपवा",
        "protectedpagesempty": "सध्या या नियमावलीने कोणतीही पाने सुरक्षित केलेली नाहीत.",
        "movethispage": "हे पान स्थानांतरित करा",
        "unusedimagestext": "कृपया लक्षात घ्या की इतर संकेतस्थळे संचिकेशी थेट दुव्याने जोडल्या असू शकतात, त्यामुळे सक्रिय उपयोगात असून सुद्धा यादीत असू शकतात.",
        "unusedcategoriestext": "खालील वर्ग पाने अस्तित्वात आहेत पण कोणतेही लेख किंवा वर्ग त्यांचा वापर करत नाहीत.",
-       "notargettitle": "à¤\95रà¥\8dम(target) नाही",
+       "notargettitle": "लà¤\95à¥\8dषà¥\8dय(à¤\9fारà¤\97à¥\87à¤\9f) नाही",
        "notargettext": "ही क्रिया करण्यासाठी तुम्ही सदस्य किंवा पृष्ठ लिहिले नाही.",
        "nopagetitle": "असे लक्ष्य पान नाही",
        "nopagetext": "तुम्ही दिलेले लक्ष्य पान अस्तित्वात नाही.",
        "pager-newer-n": "{{PLURAL:$1|नवे 1|नवे $1}}",
        "pager-older-n": "{{PLURAL:$1|जुने 1|जुने $1}}",
-       "suppress": "à¤\9dापडबà¤\82द",
+       "suppress": "दमन à¤\95रा(सपà¥\8dरà¥\87स)",
        "querypage-disabled": "हे विषेश पान कार्यमापन (performance) करणांमुळे प्रतिबंधित करण्यात आले आहे.",
+       "apihelp": "एपीआय साहाय्य",
+       "apihelp-no-such-module": "मॉड्यूल \"$1\" सापडत नाही.",
        "booksources": "पुस्तक स्रोत",
        "booksources-search-legend": "पुस्तक स्रोत शोधा",
        "booksources-search": "शोधा",
        "booksources-text": "खालील यादीत नवी आणिजुनी पुस्तके विकणाऱ्या संकेतस्थळाचे दुवे आहेत,आणि त्यात कदाचित आपण शोधू पहात असलेल्या पुस्तकाची अधिक माहिती असेल:",
        "booksources-invalid-isbn": "दिलेला आयएसबीएन वैध नाही; मूळ स्रोतातून उतरवताना झालेल्या चुकांचे निरसन करा.",
        "specialloguserlabel": "कार्यकर्ता:",
-       "speciallogtitlelabel": "à¤\89दà¥\8dदिषà¥\8dà¤\9f (लà¤\95à¥\8dष):",
+       "speciallogtitlelabel": "लà¤\95à¥\8dष (शिरà¥\8dषà¤\95 à¤\95िà¤\82वा {{ns:user}}:सदसà¥\8dयाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाव):",
        "log": "नोंदी",
        "all-logs-page": "सर्व नोंदी",
        "alllogstext": "{{SITENAME}}च्या सर्व नोंदीचे एकत्र दर्शन.नोंद प्रकार, सदस्यनाव किंवा बाधित पान निवडून तुम्ही तुमचे दृश्यपान मर्यादित करू शकता.",
        "allpages-hide-redirects": "पुनर्निर्देशने लपवा",
        "cachedspecial-viewing-cached-ttl": "तुम्ही या पानाची कॅचड् आवृत्ती पहात आहात. पाहत आहात या पाठया ची छोटी  आवृत्ती,जी $1 ईतकी जुनी असू शकते.",
        "cachedspecial-viewing-cached-ts": "तुम्ही या पानाची कॅचड् आवृत्ती पहात आहात. पाहत आहात या पाठया ची छोटी  आवृत्ती,जी पुर्णतः मुळ आवृत्ती नसू शकते.",
-       "cachedspecial-refresh-now": "à¤\86à¤\96à¥\87रà¤\9aà¥\87 à¤¦à¥\83शà¥\8dय",
+       "cachedspecial-refresh-now": "नà¥\81à¤\95तà¥\87à¤\9a à¤\95à¥\87लà¥\87लà¥\87 à¤¦à¤¾à¤\96वा.",
        "categories": "वर्ग",
        "categoriespagetext": "विकिवर खालील वर्ग {{PLURAL:$1|आहे|आहेत}}.\n[[Special:UnusedCategories|न वापरलेले वर्ग]] येथे दाखवलेले नाहीत.\nहेही पहा: [[Special:WantedCategories|पाहिजे असलेले वर्ग]].",
        "categoriesfrom": "या शब्दापासून सुरू होणारे वर्ग दाखवा:",
-       "special-categories-sort-count": "à¤\95à¥\8dरमानà¥\81सार à¤²à¤¾à¤µा",
-       "special-categories-sort-abc": "à¤\85à¤\95à¥\8dषराà¤\82पà¥\8dरमाणà¥\87 à¤²à¤¾à¤µा",
+       "special-categories-sort-count": "मà¥\8bà¤\9cणà¥\80नà¥\81सार à¤¨à¤¿à¤µà¤¡ा",
+       "special-categories-sort-abc": "à¤\85à¤\95ारविलà¥\8dहà¥\87 à¤¨à¤¿à¤µà¤¡ा",
        "deletedcontributions": "वगळलेली सदस्य संपादने",
        "deletedcontributions-title": "वगळलेली सदस्य संपादने",
        "sp-deletedcontributions-contribs": "संपादने",
        "linksearch": "बाह्य दुवे शोध",
-       "linksearch-pat": "शोधण्याचा मजकूर:",
+       "linksearch-pat": "शोध पद्धत:",
        "linksearch-ns": "नामविश्व:",
        "linksearch-ok": "शोध",
        "linksearch-text": "\"*.wikipedia.org\" सारखी वाईल्डकार्ड्स वापरायला परवानगी आहे.\nकिमान एक उच्च-स्तरिय डोमेन,उदा.- \"*.org\".<br />गरजेचे आहे.\nसहाय्याचे प्रोटोकॉल्स {{PLURAL:$2|protocol|protocols}}:  \n $1(जर कोणतेही प्रोटोकॉल्स नमूद केल्या गेले नसतील तर http://)हा डिफॉल्ट आहे.",
        "listusersfrom": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
        "listusers-submit": "दाखवा",
        "listusers-noresult": "एकही सदस्य सापडला नाही.",
-       "listusers-blocked": "(à¤\96à¤\82डित)",
-       "activeusers": "à¤\95ारà¥\8dयरत सदस्यांची यादी",
-       "activeusers-intro": "$1 {{PLURAL:$1|day|days}} मधे शेवटी काम केलेल्या सदस्यांची यादी येथे मिळेल",
+       "listusers-blocked": "(à¤\85वरà¥\8bधित)",
+       "activeusers": "à¤\95à¥\8dरियाशà¥\80ल सदस्यांची यादी",
+       "activeusers-intro": "शेवटच्या $1 {{PLURAL:$1|दिवसात}} काम केलेल्या सदस्यांची यादी येथे मिळेल",
        "activeusers-count": "शेवटच्या {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|क्रिया}}",
        "activeusers-from": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
        "activeusers-hidebots": "सांगकामे लपवा",
        "listgrouprights-namespaceprotection-header": "नामविश्व प्रतिबंध",
        "listgrouprights-namespaceprotection-namespace": "नामविश्व",
        "trackingcategories": "वर्ग शोधत आहोत",
+       "trackingcategories-summary": "या पानात रेखापथनातील ते वर्ग आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
        "trackingcategories-name": "संदेश नाम",
+       "trackingcategories-nodesc": "वर्णन उपलब्ध नाही.",
+       "trackingcategories-disabled": "वर्ग अक्षम केल्या गेला आहे",
        "mailnologin": "पाठविण्याचा पत्ता नाही",
        "mailnologintext": "इतर सदस्यांना विपत्र(ई-मेल) पाठवण्याकरिता तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असणे आणि  प्रमाणित (ई-मेल) पत्ता तुमच्या [[Special:Preferences|पसंतीत]] नमूद असणे आवश्यक आहे.",
        "emailuser": "या सदस्याला ई-मेल पाठवा",
        "watchnologin": "सनोंद-प्रवेशित नाही",
        "addwatch": "पहाऱ्याच्या सूचीमध्ये टाका",
        "addedwatchtext": "\"[[:$1]]\"  हे पान तुमच्या  [[Special:Watchlist|'माझी निरीक्षणसूची']]मध्ये टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील भविष्यातील बदल तेथे दाखवले जातील",
+       "addedwatchtext-short": "\"$1\" हे पान आपल्या निरीक्षणसूचीत जोडण्यात आले आहे.",
        "removewatch": "पहाऱ्याच्या सूचीतून वगळा",
-       "removedwatchtext": "\"[[:$1]]\" पान तुमच्या [[Special:Watchlist|पहाऱ्याच्या सूची]]तून वगळण्यात आले आहे.",
+       "removedwatchtext": "\"[[:$1]]\" हे पान व त्याची चर्चापाने तुमच्या [[Special:Watchlist|निरीक्षण सूचीतून]] हटविण्यात आले आहे.",
+       "removedwatchtext-short": "\"$1\" हे पान आपल्या निरीक्षणसूचीतुन हटविण्यात आले आहे.",
        "watch": "पहारा",
        "watchthispage": "या पानावर बदलांसाठी लक्ष ठेवा.",
        "unwatch": "पहारा काढा",
        "unwatchthispage": "पहारा काढून टाका",
        "notanarticle": "हे आशयपान नाही",
        "notvisiblerev": "आवृत्ती वगळण्यात आलेली आहे",
-       "watchlist-details": "पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने मोजलेली नाहीत.",
+       "watchlist-details": "पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने  वेगळी मोजलेली नाहीत.",
        "wlheader-enotif": "विपत्र अधिसूचना सुविधा शक्य केली.",
        "wlheader-showupdated": "ती पाने, जी आपण दिलेल्या शेवटच्या भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
        "wlnote": "खाली $3, $4 पर्यंतचे गेल्या {{PLURAL:$2| '''१''' तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे '''$1'''बदल दिले आहेत}}.",
        "sp-contributions-newbies-sub": "नवशिक्यांसाठी",
        "sp-contributions-newbies-title": "नवीन खात्यांसाठी सदस्य योगदान",
        "sp-contributions-blocklog": "रोध नोंदी",
+       "sp-contributions-suppresslog": "सदस्य योगदानाचे दमन केले",
        "sp-contributions-deleted": "वगळलेली सदस्य संपादने",
        "sp-contributions-uploads": "अपभारणे",
        "sp-contributions-logs": "नोंदी",
        "sp-contributions-search": "योगदान शोधयंत्र",
        "sp-contributions-username": "आंतरजाल अंकपत्ता किंवा सदस्यनाम:",
        "sp-contributions-toponly": "केवळ नवीनतम आवर्तने असलेलीच संपादने दाखवा",
+       "sp-contributions-newonly": "केवळ पान तयार केलेली संपादनेच दाखवा",
        "sp-contributions-submit": "शोध",
        "whatlinkshere": "येथे काय जोडले आहे",
        "whatlinkshere-title": "\"$1\" ला जुळलेली पाने",
        "autoblockid": "स्वयंचलितपणे #$1ला प्रतिबंधित करा",
        "block": "सदस्यास प्रतिबंध करा",
        "unblock": "सदस्यप्रतिबंध काढा",
-       "blockip": "हा अंकपत्ता अडवा",
+       "blockip": "{{GENDER:$1|सदस्यास}} प्रतिबंधित करा",
        "blockip-legend": "सदस्यास प्रतिबंध करा",
        "blockiptext": "एखाद्या विशिष्ट अंकपत्त्याची किंवा सदस्याची लिहिण्याची क्षमता प्रतिबंधित  करण्याकरिता खालील सारणी वापरा.\nहे केवळ उच्छेद टाळण्याच्याच दृष्टीने आणि [[{{MediaWiki:Policy-url}}|निती]]स अनुसरून केले पाहिजे.\nखाली विशिष्ट कारण भरा(उदाहरणार्थ,ज्या पानांवर उच्छेद माजवला गेला त्यांची उद्धरणे देऊन).",
        "ipaddressorusername": "अंकपत्ता किंवा सदस्यनाम:",
        "ipb-unblock-addr": "$1चा प्रतिबंध उठवा",
        "ipb-unblock": "सदस्यनाव आणि अंकपत्त्यावरचे प्रतिबंधन उठवा",
        "ipb-blocklist": "सध्याचे प्रतिबंध पहा",
-       "ipb-blocklist-contribs": "$1 साठी सदस्याचे योगदान",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}}साठीचे योगदान",
        "unblockip": "अंकपत्ता सोडवा",
        "unblockiptext": "खाली दिलेला फॉर्म वापरून पूर्वी अडवलेल्या अंकपत्त्याला लेखनासाठी आधिकार द्या.",
        "ipusubmit": "हा पत्ता सोडवा",
        "thumbnail_image-failure-limit": "हे नखुले देण्यासाठी नुकतेच अनेक अयशस्वी प्रयत्न($1 किंवा अधिक) केल्या गेले आहेत.कृपया नंतर पुन्हा प्रयत्न करा.",
        "import": "पाने आयात करा",
        "importinterwiki": "दुसऱ्या विकीवरुन आयात करा",
-       "import-interwiki-text": "à¤\86यात à¤\95रणà¥\8dयाà¤\95रिता à¤\8fà¤\95 à¤µà¤¿à¤\95ि à¤\86णि à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤¥à¤³à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾.\nà¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\8dया à¤¤à¤¾à¤°à¤\96ा à¤\86णि à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\80 à¤¨à¤¾à¤µà¥\87 à¤\9cतन à¤\95à¥\87लà¥\80 à¤\9cातà¥\80ल.\nसरà¥\8dव à¤\86à¤\82तरविà¤\95ि à¤\86यात à¤\95à¥\8dरिया [[Special:Log/import|à¤\86यात à¤¨à¥\8bà¤\82दà¥\80त]] à¤¦à¤¾à¤\96ल à¤\95à¥\87लà¥\8dया à¤\86हà¥\87त.",
+       "import-interwiki-text": "à¤\86यात à¤\95रणà¥\8dयाà¤\95रिता à¤\8fà¤\95 à¤µà¤¿à¤\95ि à¤\86णि à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤¥à¤³à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾.\nà¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\8dया à¤¤à¤¾à¤°à¤\96ा à¤\86णि à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\80 à¤¨à¤¾à¤µà¥\87 à¤\9cतन à¤\95à¥\87लà¥\80 à¤\9cातà¥\80ल.\nसरà¥\8dव à¤\86à¤\82तरविà¤\95ि à¤\86यात à¤\95à¥\8dरिया [[Special:Log/import|à¤\86यात à¤¨à¥\8bà¤\82दà¥\80त]] à¤¦à¤¾à¤\96ल à¤\95रणà¥\8dयात à¤¯à¥\87तात.",
        "import-interwiki-sourcewiki": "स्रोत विकि:",
        "import-interwiki-sourcepage": "स्रोत पान:",
        "import-interwiki-history": "या पानाकरिताची साऱ्या इतिहास आवर्तनांची नक्कल करा",
        "import-upload": "XML डाटा चढवा",
        "import-token-mismatch": "अधिवेशन माहितीची हानी.\nकृपया पुन्हा प्रयत्न करा.",
        "import-invalid-interwiki": "नमूद केलेल्या विकिमधून आयात करू शकत नाही.",
-       "import-error-edit": "तुम्हाला संपादनाची परवानगी नसल्याने $1 पान आयात केले गेले नाही.",
-       "import-error-create": "तुम्हाला $1 तयार करण्याची परवानगी नसल्याने ते आयात केले गेले नाही.",
-       "import-error-interwiki": "à¤\87à¤\82à¤\9fर à¤µà¤¿à¤\95à¥\80 à¤²à¤¿à¤\82à¤\95 à¤¸à¤¾à¤ à¥\80 $1 à¤ªà¤¾à¤¨ à¤\86रà¤\95à¥\8dषित à¤\95à¥\87लà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80",
-       "import-error-special": "विशà¥\87ष à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवासाठà¥\80 $1 à¤ªà¤¾à¤¨ à¤\86रà¤\95à¥\8dषित à¤\95à¥\87लà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80. à¤¯à¤¾ à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤ªà¤¾à¤¨à¥\87 à¤\85सत à¤¨à¤¾à¤¹à¥\80त.",
-       "import-error-invalid": "नाव à¤\85यà¥\8bà¤\97à¥\8dय à¤\85सलà¥\8dयानà¥\87 $1 à¤ªà¤¾à¤¨ à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.",
+       "import-error-edit": "तुम्हाला संपादनाची परवानगी नसल्याने \"$1\" पान आयात केल्या गेले नाही.",
+       "import-error-create": "तुम्हाला पान \"$1\" तयार करण्याची परवानगी नसल्याने ते आयात केल्या गेले नाही.",
+       "import-error-interwiki": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\8dयाà¤\9aà¥\87 à¤¨à¤¾à¤µ à¤¬à¤¾à¤¹à¥\8dय à¤¦à¥\81वà¥\8dयाà¤\82साठà¥\80 (à¤\86à¤\82तरविà¤\95ि) à¤\86रà¤\95à¥\8dषित à¤\86हà¥\87.",
+       "import-error-special": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\87 à¤µà¤¿à¤¶à¥\87ष à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤\85सलà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤ªà¤¾à¤¨à¤¾à¤\82ना (साठविणà¥\8dयाà¤\9aà¥\80)परवानà¤\97à¥\80 à¤¦à¥\87त à¤¨à¤¾à¤¹à¥\80.",
+       "import-error-invalid": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\87 à¤\9cà¥\8dया à¤¨à¤¾à¤µà¤¾à¤¤ à¤\86यात à¤\95रणà¥\8dयात à¤¯à¥\87त à¤\86हà¥\87 à¤¤à¥\87 à¤¨à¤¾à¤µ à¤¯à¤¾ à¤µà¤¿à¤\95ित à¤\85वà¥\88ध à¤\86हà¥\87.",
        "import-error-unserialize": " \"$1\" पानाची $2 आवृत्ती अनुक्रमांकातून काढता आली नाही.ही आवृत्ती कंटेंट मॉडेल $3 वापरत असल्याचा व $4 म्हणून अनुक्रमांकीत झाली असल्याचा अहवाल प्राप्त झाला             आहे.",
        "import-options-wrong": "चुकिचे {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "दिलेले मूळ पान अवैध नाव आहे",
        "import-rootpage-nosubpage": "\"$1\" नामविश्वाची मुल पाने, उपपानास परवानगी देत नाही.",
        "importlogpage": "ईम्पोर्ट सूची",
        "importlogpagetext": "इतर विकिक्डून पानांची, संपादकीय इतिहासासहीत, प्रबंधकीय आयात.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}",
-       "import-logentry-interwiki-detail": "$2 पासून $1 {{PLURAL:$1|आवर्तन|आवर्तने}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}आयात केलीत",
+       "import-logentry-interwiki-detail": "$2 पासून $1 {{PLURAL:$1|आवर्तन|आवर्तने}} आयात केलीत",
        "javascripttest": "जावा स्क्रिप्ट तपासणी",
        "javascripttest-pagetext-noframework": "हे पान जावा स्क्रिप्ट तपासणी साठी सुरक्षित केले आहे",
        "javascripttest-pagetext-unknownframework": "अज्ञात तपासणीचे ठिकाण $1",
+       "javascripttest-pagetext-unknownaction": "अनोळखी क्रिया \"$1\".",
        "javascripttest-pagetext-frameworks": "कृपया टेस्टिंग साठी पुढील पैकी व्यवस्था / पद्धत निवडावी: $1",
        "javascripttest-pagetext-skins": "टेस्ट करण्यासाठी योग्य ती स्कीन निवडावी",
        "javascripttest-qunit-intro": "mediawiki.org वर [$1 testing documentation] पहा",
        "tooltip-feed-atom": "या पानाकरिता ऍटम रसद",
        "tooltip-t-contributions": "या सदस्याच्या योगदानांची यादी पहा",
        "tooltip-t-emailuser": "या सदस्याला ई-मेल पाठवा",
+       "tooltip-t-info": "या पानाबाबत अधिक माहिती",
        "tooltip-t-upload": "संचिकेचे अपभारण करा",
        "tooltip-t-specialpages": "सर्व विशेष पृष्ठांची यादी",
        "tooltip-t-print": "या पानाची छापण्यायोग्य आवृत्ती",
        "pageinfo-length": "पानाचा आकार (बाइट्समध्ये)",
        "pageinfo-article-id": "पृष्ठ-परिचय",
        "pageinfo-language": "पानाच्या मजकूराची भाषा",
+       "pageinfo-content-model": "पान आशय नमूना",
        "pageinfo-robot-policy": "यंत्रमानवाद्वारे अनुक्रमन",
        "pageinfo-robot-index": "अनुमती दिली",
        "pageinfo-robot-noindex": "अनुमती दिल्या जात नाही",
        "pageinfo-protect-cascading-yes": "होय",
        "pageinfo-protect-cascading-from": "रखणे(प्रोटक्शन्स) प्रपातीत होतात (कॅस्केडिंग) येथून",
        "pageinfo-category-info": "वर्ग माहिती",
+       "pageinfo-category-total": "सदस्यांचा एकूण आकडा",
        "pageinfo-category-pages": "पानांची संख्या",
        "pageinfo-category-subcats": "उपवर्गांची संख्या",
        "pageinfo-category-files": "संचिकांची संख्या",
        "exif-label": "लेबल",
        "exif-datetimemetadata": "मेटाडाटाच्या शेवटच्या बदलाची तारीख",
        "exif-nickname": "चित्राचे / फोटोचे सामान्य नाव",
-       "exif-rating": "गुण (५ पैकी)",
+       "exif-rating": "गुणानुक्रम (५ पैकी)",
        "exif-rightscertificate": "अधिकार व्यवस्थापन प्रमाणपत्र",
        "exif-copyrighted": "प्रताधिकार स्थिती",
        "exif-copyrightowner": "प्रताधिकार धारक",
        "confirm-watch-top": "हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?",
        "confirm-unwatch-button": "ठिक आहे",
        "confirm-unwatch-top": "हे पान तुमच्या नित्य पहाण्याच्या सूचीतून काढायचे?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← मागील पान",
        "imgmultipagenext": "पुढील पान →",
        "imgmultigo": "चला!",
        "duplicate-defaultsort": "'''ताकिद:''' डिफॉल्ट सॉर्ट की \"$2\" ओवर्राइड्स अर्लीयर डिफॉल्ट सॉर्ट की \"$1\".",
        "version": "आवृत्ती",
        "version-extensions": "स्थापित विस्तार",
-       "version-skins": "त्वचा",
+       "version-skins": "à¤\87à¤\82सà¥\8dà¤\9fà¥\89ल à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87लà¥\8dया à¤¤à¥\8dवà¤\9aा",
        "version-specialpages": "विशेष पाने",
        "version-parserhooks": "पृथकक अंकुश",
        "version-variables": "चल",
        "version-hook-name": "अंकुश नाव",
        "version-hook-subscribedby": "वर्गणीदार",
        "version-version": "($1)",
+       "version-no-ext-name": "[नाव नाही]",
        "version-license": "मिडियाविकि परवाना",
        "version-ext-license": "परवाना",
        "version-ext-colheader-name": "विस्तारक",
+       "version-skin-colheader-name": "त्वचा",
        "version-ext-colheader-version": "आवृत्ती",
        "version-ext-colheader-license": "परवाना",
        "version-ext-colheader-description": "वर्णन",
        "version-ext-colheader-credits": "लेखक",
        "version-license-title": "$1 साठी परवाना",
        "version-license-not-found": "या विस्तारकासाठी विस्तृत परवाना माहिती सापडली नाही.",
+       "version-credits-title": "$1साठीचे श्रेय",
+       "version-credits-not-found": "या विस्तारकासाठी विस्तृत श्रेयनिर्देशन माहिती सापडली नाही.",
        "version-poweredby-credits": "हा विकी '''[https://www.mediawiki.org/ मीडियाविकी]'''द्वारे संचालित आहे, प्रताधिकारित © २००१-$1 $2.",
        "version-poweredby-others": "इतर",
        "version-poweredby-translators": "ट्रांसलेटविकि.नेट वरील भाषांतरकार",
        "specialpages-group-wiki": "डाटा व उपकरणे",
        "specialpages-group-redirects": "पुनर्निर्देशन करणारी विशेष पृष्ठे",
        "specialpages-group-spam": "उत्पात साधने",
+       "specialpages-group-developer": "विकसक उपकरण",
        "blankpage": "रिकामे पान",
        "intentionallyblankpage": "हे पान मुद्दाम कोरे सोडण्यात आले आहे.",
        "external_image_whitelist": "#ही ओळ जशी आहे तशीच घ्या.\n#\n#.\n#\n#\n#हे केस सेन्सेटिव्ह आहे.",
        "feedback-subject": "विषय:",
        "feedback-submit": "सादर करा",
        "feedback-thanks": " \"[$2 $1]\" या पानात आपला पश्चप्रदाय (फिडबॅक) टाकत आहोत.",
+       "feedback-thanks-title": "आपणास धन्यवाद!",
+       "feedback-useragent": "सदस्य प्रतिनीधी:",
        "searchsuggest-search": "शोधा",
        "searchsuggest-containing": ".......हे असलेले",
        "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "expand_templates_generate_xml": "XML चा पार्स (parse) वृक्ष दाखवा",
        "expand_templates_preview": "झलक",
        "pagelang-name": "पान",
+       "pagelang-language": "भाषा",
+       "pagelang-use-default": "अविचल भाषा वापरा",
+       "pagelang-select-lang": "भाषा निवडा",
+       "right-pagelang": "पानाची भाषा बदला",
+       "action-pagelang": "पानाची असलेली भाषा बदला",
+       "log-name-pagelang": "भाषा बदल नोंदवही",
+       "mediastatistics": "माध्यम सांख्यिकी",
+       "mediastatistics-table-extensions": "शक्य विस्तारके",
+       "mediastatistics-table-count": "संचिकांची संख्या",
+       "mediastatistics-table-totalbytes": "एकत्रित आकार",
+       "mediastatistics-header-unknown": "अनोळखी",
        "mediastatistics-header-office": "कार्यालय",
        "special-characters-group-latin": "लॅटीन",
        "special-characters-group-latinextended": "विस्तारीत लॅटीन भाषा",
        "special-characters-title-minus": "ॠण चिन्ह",
        "mw-widgets-dateinput-no-date": "कोणताही दिनांक निवडला नाही",
        "mw-widgets-titleinput-description-new-page": "अद्याप पान अस्तित्वात नाही",
+       "mw-widgets-titleinput-description-redirect": "$1ला पुनर्निर्देशित करा",
        "api-error-blacklisted": "कुपया वेगळे वर्णनात्मक शीर्षक निवडा"
 }
index 1db008b..271130f 100644 (file)
        "about": "Ītechcopa",
        "article": "Tlâkuilòpilli",
        "newwindow": "(Motlapoāz cē yancuīc tlanexillōtl)",
-       "cancel": "Ticcāhuaz",
+       "cancel": "Xiccāhua",
        "moredotdotdot": "Huehca ōmpa...",
        "mypage": "Noāmauh",
        "mytalk": "Nozānīl",
        "anontalk": "Inīn IP ītēixnāmiquiliz",
        "navigation": "Nēnemōhualiztli",
        "and": "&#32;īhuān",
-       "qbfind": "Ticahciz",
-       "qbbrowse": "Titlatepotztocaz",
-       "qbedit": "Ticpatlaz",
+       "qbfind": "Xicahci",
+       "qbbrowse": "Xitlatepotztoca",
+       "qbedit": "Xicpatla",
        "qbpageoptions": "Inīn tlaīxtli",
        "qbmyoptions": "Notlaīx",
        "faq": "Zan īc tētlatlanīliztli",
        "variants": "Nepāpan",
        "navigation-heading": "Nemiliztlahtōlpōhualāmatl",
        "errorpagetitle": "Aiuhcāyōtl",
-       "returnto": "Timocuepaz īhuīc $1.",
+       "returnto": "Ximocuepa īhuīc $1.",
        "tagline": "Īhuīcpa {{SITENAME}}",
        "help": "Tēpalēhuiliztli",
-       "search": "Titlatēmōz",
-       "searchbutton": "Tictēmōz",
-       "go": "Tiyāz",
-       "searcharticle": "Tiyāz",
+       "search": "Xitlatēmo",
+       "searchbutton": "Xictēmo",
+       "go": "Xiyauh",
+       "searcharticle": "Xiyauh",
        "history": "Tlaīxtli ītlahtōllo",
        "history_short": "Tlahtōllōtl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
        "printableversion": "Tepoztlahcuilōlli",
        "permalink": "Mochipa tzonhuiliztli",
-       "print": "Tictepoztlahcuilōz",
-       "view": "Tiquittaz",
-       "view-foreign": "Īpan tiquittaz in $1",
-       "edit": "Ticpatlaz",
-       "edit-local": "Ticpatlaz nicān tlahtōlli",
-       "create": "Ticchīhuaz",
-       "create-local": "Ticahxiltīz nicān tlahtōlli",
-       "editthispage": "Ticpatlaz inīn tlaīxtli",
-       "create-this-page": "Ticchīhuaz inīn tlaīxtli",
-       "delete": "Ticpolōz",
-       "deletethispage": "Ticpolōz inīn tlaīxtli",
-       "undeletethispage": "Ticmāquīxtīz inīn tlaīxtli",
+       "print": "Xictepoztlahcuilo",
+       "view": "Xiquitta",
+       "view-foreign": "Īpan xiquitta in $1",
+       "edit": "Xicpatla",
+       "edit-local": "Xicpatla nicān tlahtōlli",
+       "create": "Xicchīhua",
+       "create-local": "Xicahxilti nicān tlahtōlli",
+       "editthispage": "Xicpatla inīn tlaīxtli",
+       "create-this-page": "Xicchīhua inīn tlaīxtli",
+       "delete": "Xicpolo",
+       "deletethispage": "Xicpolo inīn tlaīxtli",
+       "undeletethispage": "Xicmāquīxti inīn tlaīxtli",
        "undelete_short": "Ahticpolōz {{PLURAL:$1|cē tlapatlaliztli|$1 tlapatlaliztli}}",
        "viewdeleted_short": "Mà mỏta {{PLURAL:$1|se tlatlaìxpôpolòlli tlayèktlàlilistli|$1 tlatlaìxpôpolòltin tlayèktlàlilistin}}",
-       "protect": "Ticpiyaz",
-       "protect_change": "ticpatlaz",
-       "protectthispage": "Ticpiyaz inīn tlaīxtli",
-       "unprotect": "Ticpatlaz in tlapiyaliztli",
-       "unprotectthispage": "Ticpatlaz inīn tlaīxtli ītlapiyaliz",
+       "protect": "Xicpiya",
+       "protect_change": "xicpatla",
+       "protectthispage": "Xicpiya inīn tlaīxtli",
+       "unprotect": "Xicpatla in tlapiyaliztli",
+       "unprotectthispage": "Xicpatla inīn tlaīxtli ītlapiyaliz",
        "newpage": "Yancuic tlaīxtli",
-       "talkpage": "Tictlahtōz inīn zāzaniltechcopa",
+       "talkpage": "Xictlahto inīn tlaīxtli ītechcopa",
        "talkpagelinktext": "Zānīlli",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "personaltools": "In tlein nitēquitiltilia",
-       "articlepage": "Tiquittaz in tlahcuilōlli",
+       "articlepage": "Xiquitta in tlamantlaīxtli",
        "talk": "Zānīlli",
        "views": "Tlachiyaliztli",
        "toolbox": "Tequitīhuani",
        "userpage": "Xiquitta tlatequitiltilīlli zāzanilli",
        "projectpage": "Xiquitta tlachīhualiztli zāzanilli",
-       "imagepage": "Tiquittaz in zāzanilli īāma",
+       "imagepage": "Xiquitta in zāzanilli īāma",
        "mediawikipage": "Xiquitta tlahcuilōltzin zāzanilli",
-       "templatepage": "Tiquittāz nemachiyōtīlli zāzanilli",
+       "templatepage": "Xiquitta neīxcuītīllaīxtli",
        "viewhelppage": "Xiquitta tēpalēhuiliztli zāzanilli",
        "categorypage": "Mà mỏta in tlaìxmatkàtlàlilòtlaìxtlapalli",
        "viewtalkpage": "Xiquitta tēixnāmiquiliztli zāzanilli",
        "retrievedfrom": "Ōquīzqui ītech  \"$1\"",
        "youhavenewmessages": "Tiquimpiya $1 ($2).",
        "youhavenewmessagesmulti": "Tiquimpiya yancuīc tlahcuilōlli īpan $1",
-       "editsection": "ticpatlaz",
-       "editold": "ticpatlaz",
-       "viewsourceold": "tiquittaz mēyalli",
-       "editlink": "ticpatlaz",
-       "viewsourcelink": "tiquittaz mēyalli",
-       "editsectionhint": "Ticpatlaz in: $1",
+       "editsection": "xicpatla",
+       "editold": "xicpatla",
+       "viewsourceold": "xiquitta mēyalli",
+       "editlink": "xicpatla",
+       "viewsourcelink": "xiquitta mēyalli",
+       "editsectionhint": "Xicpatla in: $1",
        "toc": "Inīn tlahcuilōlco",
-       "showtoc": "ticnēxtīz",
-       "hidetoc": "tictlātīz",
+       "showtoc": "xicnēxti",
+       "hidetoc": "xictlāti",
        "collapsible-collapse": "Motlàtìs",
        "collapsible-expand": "Monèxtìs",
        "confirmable-yes": "Quēmah",
        "cannotdelete": "Ahmō ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
        "badtitle": "Ahcualli tōcāitl",
        "badtitletext": "Zāzanilli ticnequi in ītōca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tōcāhuicpa.\nHueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.",
-       "viewsource": "Tiquittaz mēyalli",
-       "viewsource-title": "Tiquittaz $1 īmēyal",
+       "viewsource": "Xiquitta mēyalli",
+       "viewsource-title": "Xiquitta in $1 īmēyal",
        "actionthrottled": "Tlachīhualiztli ōmotzacuili",
        "viewsourcetext": "Tihuelīti tiquitta auh ticcopīna inīn zāzanilli ītlahtōlcaquiliztilōni:",
        "namespaceprotected": "Ahmo tiquihuelīti tiquimpatla zāzaniltin īpan '''$1'''.",
        "titleprotected": "Inīn zāzanilli ōmoquīxti ic tlachīhualiztli ic [[User:$1|$1]].\nŌquihto: ''$2''",
        "exception-nologin": "Ahmō timocalac",
        "virus-unknownscanner": "ahmatic antivirus:",
-       "welcomeuser": "Ximopanōltih, $1!",
-       "yourname": "Motlatequitiltilīltōca:",
+       "welcomeuser": "Ximopanōlti, $1!",
+       "yourname": "Tequihuihcātōcāitl:",
        "userlogin-yourname": "Tequihuihcātōcāitl",
        "yourpassword": "Motlahtōlichtacāyo",
        "yourpasswordagain": "Motlahtōlichtacāyo occeppa",
        "nav-login-createaccount": "Ximocalaqui / ximomachiyōmaca",
        "userlogin": "Ximomachiyōmaca/Ximocalaqui",
        "userloginnocreate": "Ximocalaqui",
-       "logout": "Tiquīzaz",
-       "userlogout": "Tiquīzaz",
+       "logout": "Xiquīza",
+       "userlogout": "Xiquīza",
        "notloggedin": "Ahmō ōtimocalac",
        "userlogin-noaccount": "Cuix ahmō titlapōhualeh?",
        "nologin": "Cuix ahmō titlapōhualeh? $1.",
-       "nologinlink": "Ticchīhuaz cē cuentah",
-       "createaccount": "Ticchīhuaz cuentah",
+       "nologinlink": "Xicchīhua cē tlapōhualli",
+       "createaccount": "Xicchīhua tlapōhualli",
        "gotaccount": "¿Ye ticpiya cē tlapōhualli? '''$1'''.",
        "gotaccountlink": "Ximocalaqui",
        "createaccountmail": "Ticnemītīz ahmo cemihcac zāzoichtacātlahtōlli nō in tiquēhualtīz in maltzinteyōtl monetitlanizyeyān",
        "createaccountreason": "Tleīpampa:",
        "createacct-reason": "Tleīpampa",
-       "createacct-submit": "Ticchīhuaz in motlapōhual",
+       "createacct-submit": "Xicchīhua in motlapōhual",
        "badretype": "Ahneneuhqui motlahtōlichtacāyo.",
        "userexists": "In tlatequitiltilīltōcāitl in ōquipehpen ye ia.\nTimitztlātlauhtiah xicpehpena occē.",
        "loginerror": "Ahcuallōtl tlacalaquiliztechcopa",
        "accountcreated": "Tlapōhualli ōmochīuh",
        "accountcreatedtext": "In ītlatequitiltilīllapōhual in [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ōquiyōcoyalo.",
        "createaccount-title": "Cuentah ītlachīhualiz ic {{SITENAME}}",
-       "loginlanguagelabel": "Tlâtòlli: $1",
+       "loginlanguagelabel": "Tlahtōlli: $1",
        "pt-login": "Xicalaqui",
        "pt-createaccount": "Xicchīhua motlapōhual",
-       "changepassword": "Ticpatlāz motlahtōlichtacāyo",
-       "resetpass_header": "Xicpatlāz motlahtōlichtacāyo",
+       "changepassword": "Xicpatla motlahtōlichtacāyo",
+       "resetpass_header": "Xicpatla motlahtōlichtacāyo",
        "oldpassword": "Huēhueh motlahtōlichtacayo:",
        "newpassword": "Yancuīc motlahtōlichtacayo:",
        "retypenew": "Occeppa xiquihcuiloa yancuīc motlahtōlichtacayo:",
        "changepassword-success": "Mochtacātlahtōl cualli ōtlapatlalo.",
        "resetpass_forbidden": "Tlahtōlichtacayōtl ahmo mohuelītih mopatlah",
        "resetpass-submit-loggedin": "Ticpatlāz motlahtōlichtacāyo",
-       "resetpass-submit-cancel": "Ticcuepāz",
-       "passwordreset-username": "Tlatequitiltilīltōcāitl:",
+       "resetpass-submit-cancel": "Xiccāhua",
+       "passwordreset-username": "Tequihuihcātōcāitl:",
        "bold_sample": "Tlīltic tlahcuilōlli",
        "bold_tip": "Tlīltic tlahcuilōlli",
        "italic_sample": "Cōliuhqui tlahcuilōliztli",
        "summary": "Mopatlaliz:",
        "subject": "Tōcāitl/Āmoxmachiyōtl:",
        "minoredit": "Inīn tlapatlaliztli tepitōn",
-       "watchthis": "Tictlachiyāz inīn zāzanilli",
-       "savearticle": "Ticpiyaz tlaīxtli",
+       "watchthis": "Xicpiya inīn tlaīxtli",
+       "savearticle": "Xicpiya tlaīxtli",
        "preview": "Xiquitta achtochīhualiztli",
        "showpreview": "Xiquitta achtochīhualiztli",
-       "showdiff": "Tiquinttāz tlapatlaliztli",
+       "showdiff": "Xicnēxti tlapatlaliztli",
        "missingcommenttext": "Timitztlātlauhtiah xitlanitlahcuiloa.",
        "summary-preview": "Tlahcuilōltōn achtochīhualiztli:",
        "blockedtitle": "Ōmotzacuili tlatequitiltilīlli",
        "loginreqpagetext": "Tihuīquilia $1 ic tiquintta occequīntīn zāzaniltin.",
        "accmailtitle": "Tlahtōlichtacāyōtl ōmoihuah.",
        "accmailtext": "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
-       "newarticle": "(Yancuīc)",
+       "newarticle": "(Yancuic)",
        "newarticletext": "Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [$1 tēpalēhuiliztli zāzanilli] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.",
        "noarticletext": "In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.\nTihuelīti [[Special:Search/{{PAGENAME}}|tictēmoa inīn zāzaniltōcācopa]] occequīntīn zāzanilpan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} machiyōmacalpan], ahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} ticpatla inīn zāzanilli]</span>.",
        "userpage-userdoesnotexist": "Ahmo ia cuentah \"<nowiki>$1</nowiki>\" ītōca. Timitztlātlauhtiah xitēchquinōtza intlā ticchīhuāz intlā nozo ticpatlāz inīn zāzanilli.",
        "updated": "(Ōmoyancuīli)",
        "note": "'''Tlahtōlcaquiliztilōni:'''",
        "previewnote": "'''Xiquilnamiqui tein inīn zan tlaachtopaittaliztli.'''\n¡Motlapatlaliz ayamo ōquinpix!",
-       "editing": "Ticpatlacah $1",
+       "editing": "Ticpatla $1",
        "creating": "Ticchīhua $1",
        "editingsection": "Ticpatlacah $1 (tlahtōltzintli)",
        "editingcomment": "Ticpatlacah $1 (tlahtōltzintli)",
        "last": "xōcoyōc",
        "page_first": "achto",
        "page_last": "xōcoyōc",
-       "history-fieldset-title": "Tictēmōz īpan tlahcuilōlloh",
+       "history-fieldset-title": "Xitlatēmo īpan tlahtōllōtl",
        "history-show-deleted": "Zan tlapolōlli",
        "histfirst": "in achto",
        "histlast": "in tlatzaucticah",
        "history-feed-item-nocomment": "$1 īpan $2",
        "history-feed-empty": "In zāzanilli tiquiēlēhuia ahmo ia.\nHueliz ōmopolo huiqui nozo ōmozacac.\n[[Special:Search|Xitēmoa huiquipan]] yancuīc huēyi zāzaniltin.",
        "rev-delundel": "tiquittāz/tictlātīz",
-       "rev-showdeleted": "ticnēxtīz",
+       "rev-showdeleted": "xicnēxti",
        "revisiondelete": "Tiquimpolōz/ahtiquimpolōz tlachiyaliztli",
        "revdelete-show-file-submit": "Quēmah",
        "revdelete-hide-text": "In tlahtlachiyaliztli ītlahcuilōl",
        "revdelete-radio-unset": "Ittalōni",
        "revdelete-log": "Tleīpampa:",
        "revdel-restore": "Ticpatlāz tlattaliztli",
-       "pagehist": "Zāzanilli tlahcuilōlloh",
+       "pagehist": "Tlaīxtli ītlahtōllo",
        "deletedhist": "Ōtlapolo tlahcuilōlloh",
        "revdelete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "mergehistory-from": "Zāzanilhuīcpa:",
+       "mergehistory-from": "Mēyallaīxtli:",
        "mergehistory-into": "Zāzanilhuīc:",
        "mergehistory-no-source": "Zāzanilhuīcpa $1 ahmo ia.",
        "mergehistory-no-destination": "Zāzanilhuīc $1 ahmo ia.",
        "skin-preview": "Xiquitta quemeh yez",
        "datedefault": "Ayāc tlanequiliztli",
        "prefs-labs": "Ìntlâtlamảtilis in tlayêyẻkòyàntìn",
-       "prefs-personal": "Motlācatlanōnōtzaliz",
-       "prefs-rc": "Yancuīc tlapatlaliztli",
+       "prefs-personal": "Tequihuihcātlapōhualli",
+       "prefs-rc": "Yancuic tlapatlaliztli",
        "prefs-watchlist": "Tlachiyaliztli",
        "prefs-watchlist-days": "Tōnaltin tiquinttāz tlachiyalizpan:",
        "prefs-watchlist-edits": "Tlapatlaliztli tiquintta tlachiyalizpan:",
        "prefs-misc": "Zāzo",
        "prefs-resetpass": "Ticpatlāz motlahtōlichtacāyo",
-       "saveprefs": "Ticpiyāz",
+       "saveprefs": "Xicpiya",
        "prefs-editing": "Tlapatlaliztli",
        "rows": "Pāntli:",
        "searchresultshead": "Tlatēmoliztli",
        "timezoneregion-indian": "Índico Ilhuicaātl",
        "timezoneregion-pacific": "Pacífico Ilhuicaātl",
        "prefs-searchoptions": "Titlatēmōz",
-       "prefs-namespaces": "Tōcātzin",
+       "prefs-namespaces": "Tōcātlacāuhtli",
        "default": "ic default",
-       "prefs-files": "Tlahcuilōlli",
+       "prefs-files": "Ihcuilōlli",
        "youremail": "Maltzinteyōtl netitlanizyeyāntli:",
-       "username": "{{GENDER:$1|Tlatequitiltilīltōcāitl}}:",
+       "username": "{{GENDER:$1|Tequihuihcātōcāitl}}:",
        "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:",
+       "yourlanguage": "Tlahtōlli:",
        "yournick": "Motōcātlaliz:",
        "badsiglength": "Motōcātlaliz cah ocachi huēyac.\nAhmo quihuīquilia quimpiya achi $1 {{PLURAL:$1|machiyōtlahtōliztli}}.",
        "gender-male": "Oquichtli",
        "userrights-reason": "Īxtlamatiliztli:",
        "userrights-no-interwiki": "Ahmo tihuelīti ticpatla tlatequitiltilīlli huelītiliztli occequīntīn huiquipan.",
        "group": "Olōlli:",
-       "group-user": "Tlatequitiltilīlli",
+       "group-user": "Tequihuihqueh",
        "group-bot": "Tepoztlācah",
        "group-sysop": "Tlahcuilōlpixqueh",
        "group-all": "(mochīntīn)",
        "right-suppressredirect": "Ahmo ticchīhuāz tlacuepaliztli huēhueh tōcāhuīc ihcuāc ticzacāz cē zāzanilli",
        "right-upload": "Tiquinquetzāz tlahcuilōlli",
        "right-upload_by_url": "Ticquetzāz cē tlahcuilōlli īhuīcpa URL",
-       "right-delete": "Tiquimpolōz zāzaniltin",
+       "right-delete": "Xicpolo tlaīxtli",
        "right-bigdelete": "Tiquimpolōz zāzaniltin īca huēiyac tlahcuilōlloh",
        "right-browsearchive": "Tlatēmōz zāzaniltin ōmopoloh",
        "right-undelete": "Ahticpolōz cē zāzanilli",
        "right-block": "Tiquintzacuilīz occequīntīn tlatequitiltilīlli",
        "right-blockemail": "Titēquīxtīz tlatequitiltilīlli ic tēch-e-mailīz",
        "right-hideuser": "Ticquīxtīz cē tlatequitiltilīltōcāitl, āuh ichtac",
-       "right-editmyoptions": "Ticpatlaz mopanitlatlālīl",
+       "right-editmyoptions": "Xicpatla in mopanitlatlālīl",
        "right-import": "Ticcōhuāz zāzaniltin occequīntīn huiquihuīcpa",
        "right-importupload": "Tiquincōhuāz zāzaniltin tlahcuilōlquetzalizhuīcpa",
        "right-patrolmarks": "Tiquinttāz tlapiyalizmachiyōtl īpan yancuīc tlapatlaliztli",
        "right-userrights-interwiki": "Tiquimpatlāz tlatequitiltilīlli huelītiliztli occequīntīn huiquipan",
        "newuserlogpage": "Tequihuihcāchīhualiztlapōhualāmatl",
        "rightslog": "Tlatequitiltilīlli huelītiliztli tlahcuilōlloh",
-       "action-read": "ticpōhuāz inīn zāzanilli",
-       "action-edit": "ticpatlāz inīn zāzanilli",
-       "action-createpage": "tiquinchīhuāz zāzaniltin",
+       "action-read": "xāmapōhua inīn tlaīxtli",
+       "action-edit": "xicpatla inīn tlaīxtli",
+       "action-createpage": "xicchīhua tlaīxtli",
        "action-createtalk": "tiquinchīhuāz tēixnāmiquiliztli zāzaniltin",
        "action-createaccount": "ticchīhuaz inīn tlatequitiltilīlli īcuentah",
        "action-move": "ticpatlāz inīn zāzanilli",
        "rcshowhidebots-hide": "Tiquihyānaz",
        "rcshowhideliu": "$1 tēmachiyōmacalli tlatequitiltilīltin",
        "rcshowhideanons": "$1 ahtōcā tlatequitiltilīlli",
-       "rcshowhideanons-show": "Ticnēxtīz",
+       "rcshowhideanons-show": "Xicnēxti",
        "rcshowhidepatr": "$1 tlapatlaliztli mochiyahua",
        "rcshowhidemine": "$1 notlahcuilōl",
-       "rcshowhidemine-show": "Ticnēxtīz",
+       "rcshowhidemine-show": "Xicnēxti",
        "rclinks": "Xiquintta xōcoyōc $1 tlapatlaliztli xōcoyōc $2 tōnalpan.<br />$3",
        "diff": "ahneneuh",
        "hist": "tlahtōl",
        "hide": "Tiquintlātīz",
-       "show": "Tiquinttāz",
+       "show": "Xicnēxti",
        "minoreditletter": "p",
        "newpageletter": "Y",
        "boteditletter": "T",
        "filedesc": "Tlahcuilōltōn",
        "fileuploadsummary": "Tlahcuilōltōn:",
        "filestatus": "Copyright:",
-       "filesource": "Īhuīcpa:",
+       "filesource": "Mēyalli:",
        "minlength1": "Tlahcuilōltōcāitl quihuīlquilia huehca ōmpa cē tlahtōl.",
        "badfilename": "Īxiptli ītōcā ōmopatlac īhuīc \"$1\".",
        "filetype-unwanted-type": "'''\".$1\"''' ahmo moēlēhuia quemeh tlahcuilōlli iuhcāyōtl.\nTlahcuilōlli iuhcāyōtl {{PLURAL:$3|moēlēhuia cah|moēlēhuiah cateh}} $2.",
        "uploaddisabled": "Ahmo mohuelīti tlahcuilōlquetzā",
        "uploaddisabledtext": "Ahmo huelīti moquetzazqueh tlahcuilōlli.",
        "upload-source": "Mēyalihcuilōlli",
-       "sourcefilename": "Tōcāhuīcpa:",
+       "sourcefilename": "Mēyalihcuilōltōcāitl:",
        "sourceurl": "Mēyal-URL:",
        "destfilename": "Tōcāhuīc:",
        "watchthisupload": "Tictlachiyāz inīn zāzanilli",
        "upload-form-label-usage-filename": "Ihcuilōlli ītōcā",
        "upload_source_file": " (cē tlahcuilōlli mochīuhpōhualhuazco)",
        "listfiles_search_for": "Tlatēmōz mēdiatl tōcācopa:",
-       "imgfile": "īxiptli",
+       "imgfile": "ihcuilōlli",
        "listfiles": "Mochīntīn īxiptli",
        "listfiles_name": "Tōcāitl",
-       "listfiles_user": "Tlatequitiltilīlli",
+       "listfiles_user": "Tequihuihqui",
        "listfiles_size": "Octacayōtl (bytes)",
        "listfiles_count": "Cuepaliztli",
        "listfiles-latestversion-yes": "Quēmah",
        "file-anchor-link": "Ihcuilōlli",
        "filehist": "Ihcuilōlli ītlahtōllo",
        "filehist-deleteall": "tiquimpolōz mochīntīn",
-       "filehist-deleteone": "ticpolōz",
+       "filehist-deleteone": "xicpolo",
        "filehist-revert": "tlacuepāz",
        "filehist-current": "āxcān",
        "filehist-datetime": "Tlapōhualpan/Cāhuitl",
        "filehist-thumb": "Īxiptlahtōn",
-       "filehist-user": "Tlatequitiltilīlli",
+       "filehist-user": "Tequihuihqui",
        "filehist-dimensions": "Octacayōtl",
        "filehist-comment": "TlahtōIcaquiliztīlōni",
        "imagelinks": "Ihcuilōlli ītequiuh",
        "filedelete": "Ticpolōz $1",
        "filedelete-legend": "Ticpolōz tlahcuilōlli",
        "filedelete-comment": "Īxtlamatiliztli:",
-       "filedelete-submit": "Ticpolōz",
+       "filedelete-submit": "Xicpolo",
        "filedelete-success": "Ōmopolo '''$1'''.",
        "filedelete-nofile": "'''$1''' ahmo ia.",
        "filedelete-otherreason": "Occē īxtlamatiliztli:",
index 1d00676..266cbb1 100644 (file)
@@ -18,6 +18,7 @@
        "tog-hideminor": "Annascunne 'e cagne piccirille  'int'a ll'úrdeme cagne",
        "tog-hidepatrolled": "Annascunne 'e cagne 'verificate' 'a ll'úrdeme cagnamiente",
        "tog-newpageshidepatrolled": "Annascunne 'e paggene cuntrullate 'a ll'elenco 'e ppaggene",
+       "tog-hidecategorization": "Annascunne 'a categorizzaziona d' 'e paggene",
        "tog-extendwatchlist": "Spanne ll'asservate speciale pe fà vedé tutte 'e cagnàmiente, nun solo l'ultimo",
        "tog-usenewrc": "Urdeme càgnamiente avanzate (JavaScript)",
        "tog-numberheadings": "Annúmmera automatecamente 'e títule",
@@ -47,6 +48,7 @@
        "tog-watchlisthideliu": "Annascunne 'e cagnamiénte 'e l'utente riggistrate 'a l'elenco 'e cuntrollo",
        "tog-watchlisthideanons": "Annascunne 'e cagnamiente fatte d'anonime 'a l'elenco 'e cuntrollo",
        "tog-watchlisthidepatrolled": "Annascunne 'e modifiche cuntrullate 'a l'elenco 'e cuntrollo",
+       "tog-watchlisthidecategorization": "Annascunne 'a categorizzazione d' 'e paggene",
        "tog-ccmeonemails": "Famme na masciata pùre c' 'a copia 'e le mail mannate a l'ati utente",
        "tog-diffonly": "Nun me fà vedé cuntenute aropp'o cunfronto nfra verziune",
        "tog-showhiddencats": "Fa' vedé 'e categurie annascunnute",
        "createaccountreason": "Mutivo:",
        "createacct-reason": "Mutivo",
        "createacct-reason-ph": "Pecché staje crianno n'at'utenza",
-       "createacct-captcha": "Cuntrollo 'e sicurezza",
-       "createacct-imgcaptcha-ph": "Scrivite 'o testo ca vedite ncoppa",
        "createacct-submit": "Cria 'a toja utenza",
        "createacct-another-submit": "Cria nu cunto",
        "createacct-benefit-heading": "{{SITENAME}} è fatta 'e perzone comme te.",
        "permissionserrors": "Nun haje 'e premmesse abbastante.",
        "permissionserrorstext": "Nun haje premmesse pe lle ffà st'azziune, {{PLURAL:$1|'o mutivo è chesto|'e mutive so' chiste}}:",
        "permissionserrorstext-withaction": "Nun haje premmesse abbastante pe' $2, {{PLURAL:$1|'o mutivo è chesto|'e mutive so' chiste}}:",
+       "contentmodelediterror": "Vuje nun putite cagnà sta verziona pecché 'o mudell' 'e cuntenute è <code>$1</code>, e 'o mudell' 'e mò d' 'a paggena è <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Attenziò: staje a crià na paggena scancellata già.'''\n\nVire si è bbuono 'e cuntinuà a cagnà sta paggena. L'elenco ch' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' ffà comodo:",
        "moveddeleted-notice": "Sta paggena è stata scancellata.\nL'elenco d' 'e relative scancellamiente e spustamente s'è scritto ccà abbascio pe' n'avé nfurmazione.",
        "moveddeleted-notice-recent": "Scusate, sta mmasciata è stata scancellata mo mo (dint'a sti 24 ore).\n\nL'aziune 'e scancellazione e spustamento pe' sta paggena so dispunibbele ccà p' 'a cumpretezza.",
        "showingresultsinrange": "{{PLURAL:$1|Vene mmustato|Veneno mmustate}} abbascio {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultate}} d' 'o <strong>$2</strong> a 'o <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> 'e <strong>$3</strong>|Risultate <strong>$1 - $2</strong> 'e <strong>$3</strong>}}",
        "search-nonefound": "'A ricerca nun ha produtto risultate.",
+       "search-nonefound-thiswiki": "Nun ce stevano risultate p' 'a ricerca fatta.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Ascìa dint' 'o namespace:",
        "powersearch-togglelabel": "Cuntrolla:",
        "prefs-help-recentchangescount": "Chesto ntenne ll'urdeme cagnamiente, 'e cronologgie 'e paggena, e riggistre.",
        "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco 'e cuntrollo, picciò nun 'a spartite. [[Special:ResetTokens|Cliccate ccà se tenite necessità d' 'a rimpizzà]].",
        "savedprefs": "'E preferenze songo state sarvate.",
+       "savedrights": "'E dritte 'e l'utente {{GENDER:$1|$1}} sto state sarvate.",
        "timezonelegend": "Fuso orario:",
        "localtime": "Ora lucale:",
        "timezoneuseserverdefault": "Aúsa ora predefinita d' 'o wiki ($1)",
        "rcshowhidemine": "$1 'e ffatiche mieie",
        "rcshowhidemine-show": "Faje vedé",
        "rcshowhidemine-hide": "Annascunne",
+       "rcshowhidecategorization": "$1 categorizzaziona d' 'a paggena",
+       "rcshowhidecategorization-show": "Faje vedé",
+       "rcshowhidecategorization-hide": "Annascunne",
        "rclinks": "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
        "diff": "diff",
        "hist": "cron",
        "upload-dialog-button-done": "Fatto",
        "upload-dialog-button-save": "Sarva",
        "upload-dialog-button-upload": "Carreca",
-       "upload-process-error": "N'errore cumparette",
-       "upload-process-warning": "N'avviso cumparette",
        "upload-form-label-select-file": "Sceglie file",
        "upload-form-label-infoform-title": "Dettaglie",
        "upload-form-label-infoform-name": "Nomme",
index 5deced8..4adc0c0 100644 (file)
        "internalerror": "Intern feil",
        "internalerror_info": "Intern feil: $1",
        "internalerror-fatal-exception": "Uhåndterlig unntak av typen «$1»",
-       "filecopyerror": "Klarte ikke å kopiere filen «$1» til «$2».",
+       "filecopyerror": "Kunne ikke kopiere filen «$1» til «$2».",
        "filerenameerror": "Klarte ikke å døpe om filen «$1» til «$2».",
        "filedeleteerror": "Klarte ikke å slette filen «$1».",
        "directorycreateerror": "Klarte ikke å opprette mappe «$1».",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Hvorfor lager du en annen bruker",
-       "createacct-captcha": "Sikkerhetssjekk",
-       "createacct-imgcaptcha-ph": "Fyll inn teksten du ser ovenfor",
        "createacct-submit": "Opprett konto",
        "createacct-another-submit": "Opprett konto",
        "createacct-benefit-heading": "{{SITENAME}} er laget av folk som deg.",
        "passwordreset-emailerror-capture": "En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1",
        "changeemail": "Endre eller fjerne epostadresse",
        "changeemail-header": "Endre kontoens e-postadresse",
+       "changeemail-passwordrequired": "Du må skrive inn passordet ditt for å bekrefte denne endringen.",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
        "changeemail-oldemail": "Nåværende e-postadresse:",
        "changeemail-newemail": "Ny e-postadresse:",
        "missingsummary": "'''Påminnelse:''' Du har ikke lagt inn en redigeringsforklaring.\nVelger du ''Lagre siden'' en gang til blir endringene lagret uten forklaring.",
        "selfredirect": "<strong>Advarsel:</strong> Du omdirigerer denne siden til seg selv. Du kan ha oppgitt feil mål for omdirigeringen, eller kanskje du redigerer feil side. Om du klikker «{{int:savearticle}}» igjen vil omdirigeringen bli opprettet uansett.",
        "missingcommenttext": "Vennligst legg inn en kommentar under.",
-       "missingcommentheader": "'''Påminnelse:''' Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
+       "missingcommentheader": "<strong>Påminnelse:</strong> Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
        "summary-preview": "Forhåndsvisning av redigeringsforklaring:",
        "subject-preview": "Forhåndsvisning av emne/overskrift:",
        "previewerrortext": "En feil oppsto mens dine endringer skulle forhåndsvises.",
        "upload-dialog-button-done": "Utført",
        "upload-dialog-button-save": "Lagre",
        "upload-dialog-button-upload": "Last opp",
-       "upload-process-error": "En feil oppstod",
-       "upload-process-warning": "En advarsel oppstod",
        "upload-form-label-select-file": "Velg fil",
        "upload-form-label-infoform-title": "Detaljer",
        "upload-form-label-infoform-name": "Navn",
        "actioncomplete": "Gjennomført",
        "actionfailed": "Handling mislyktes",
        "deletedtext": "«$1» er slettet.\nSe $2 for en oversikt over de siste slettingene.",
-       "dellogpage": "Slettingslogg",
+       "dellogpage": "Slettelogg",
        "dellogpagetext": "Under er ei liste over nylige slettinger.",
-       "deletionlog": "slettingslogg",
+       "deletionlog": "slettelogg",
        "reverted": "Gjenopprettet en tidligere versjon",
        "deletecomment": "Årsak:",
        "deleteotherreason": "Annen/utdypende grunn:",
        "ipbenableautoblock": "Blokker forrige IP-adresse brukt av denne brukeren automatisk, samt alle IP-adresser brukeren forsøker å redigere med i framtiden",
        "ipbsubmit": "Blokker denne brukeren",
        "ipbother": "Annen tid",
-       "ipboptions": "2 timer:2 hours,1 dag:1 day,3 dager:3 days,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,uendelig:infinite",
+       "ipboptions": "2 timer:2 hours,1 dag:1 day,3 dager:3 days,1 uke:1 week,2 uker:2 weeks,1 måned:1 month,3 måneder:3 months,6 måneder:6 months,1 år:1 year,ubestemt:infinite",
        "ipbhidename": "Skjul brukernavn fra endringer og lister",
        "ipbwatchuser": "Overvåk brukerens brukerside og diskusjonsside",
        "ipb-disableusertalk": "Hindre denne brukeren i å redigere sin egen diskusjonsside mens han/hun er blokkert",
index 8bf7425..8af08a5 100644 (file)
        "upload-dialog-button-done": "सकियो",
        "upload-dialog-button-save": "सङ्ग्रह गर्ने",
        "upload-dialog-button-upload": "अपलोड गर्ने",
-       "upload-process-error": "एक त्रुटि भयो ।",
        "upload-form-label-select-file": "फाइल छान्नुहोस्",
        "upload-form-label-infoform-title": "विवरणहरू",
        "upload-form-label-infoform-name": "नाम",
index 068a16e..df18827 100644 (file)
@@ -77,6 +77,7 @@
        "tog-hideminor": "Kleine wijzigingen verbergen in recente wijzigingen",
        "tog-hidepatrolled": "Gemarkeerde wijzigingen verbergen in recente wijzigingen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
+       "tog-hidecategorization": "Categorisatie van pagina's verbergen",
        "tog-extendwatchlist": "Uitgebreide volglijst gebruiken om alle wijzigingen te bekijken, en niet alleen de laatste",
        "tog-usenewrc": "Wijzigingen per pagina weergeven in recente wijzigingen en volglijst",
        "tog-numberheadings": "Koppen automatisch nummeren",
        "tog-watchlisthideliu": "Bewerkingen van aangemelde gebruikers op mijn volglijst verbergen",
        "tog-watchlisthideanons": "Bewerkingen van anonieme gebruikers op mijn volglijst verbergen",
        "tog-watchlisthidepatrolled": "Gemarkeerde wijzigingen op mijn volglijst verbergen",
+       "tog-watchlisthidecategorization": "Categorisatie van pagina's verbergen",
        "tog-ccmeonemails": "Mij een kopie zenden van e-mails die ik naar andere gebruikers stuur",
        "tog-diffonly": "Pagina-inhoud onder wijzigingen niet weergeven",
        "tog-showhiddencats": "Verborgen categorieën weergeven",
        "badtitletext": "De naam van de opgegeven pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikikoppeling.\nWellicht bevat de paginanaam niet toegestane tekens.",
        "title-invalid-empty": "De opgevraagde paginanaam is leeg of bevat de naam van een naamruimte.",
        "title-invalid-utf8": "De opgevraagde paginanaam bevat een ongeldige UFT-8-reeks.",
-       "title-invalid-interwiki": "De aangevraagde paginatitel bevat een interwikikoppeling die niet gebruikt kan worden in titels.",
+       "title-invalid-interwiki": "De aangevraagde paginanaam bevat een interwikikoppeling die niet gebruikt kan worden in paginanamen.",
        "title-invalid-talk-namespace": "De opgevraagde paginanaam verwijst naar een overlegpagina die niet kan bestaan.",
        "title-invalid-characters": "De opgevraagde paginanaam bevat ongeldige tekens: \"$1\".",
        "title-invalid-relative": "De paginanaam bevat een relatief pad. Relatieve paginanamen (\"./\", \"../\") zijn ongeldig omdat ze vaak onbereikbaar zijn als de browser van een gebruiker ze toepast.",
        "viewsource": "Brontekst bekijken",
        "viewsource-title": "Brontekst bekijken van $1",
        "actionthrottled": "Handeling tegengehouden",
-       "actionthrottledtext": "Als maatregel tegen spam is het aantal keren per tijdseenheid dat u deze handeling kunt verrichten beperkt.\nDe limiet is overschreden.\nProbeer het over een aantal minuten opnieuw.",
+       "actionthrottledtext": "Als maatregel tegen spam is het aantal keren per tijdseenheid dat u deze handeling kunt verrichten beperkt.\nProbeer het over een aantal minuten opnieuw.",
        "protectedpagetext": "Deze pagina is beveiligd. Bewerken of andere handelingen zijn niet mogelijk.",
        "viewsourcetext": "U kunt de brontekst van deze pagina bekijken en kopiëren.",
        "viewyourtext": "U kunt <strong>uw bewerkingen</strong> aan de brontekst van deze pagina bekijken en kopiëren.",
        "nologin": "Hebt u geen account? $1.",
        "nologinlink": "Registreren",
        "createaccount": "Registreren",
-       "gotaccount": "Hebt u al een gebruiker? $1.",
+       "gotaccount": "Hebt u al een account? $1.",
        "gotaccountlink": "Aanmelden",
        "userlogin-resetlink": "Bent u uw aanmeldgegevens vergeten?",
        "userlogin-resetpassword-link": "Wachtwoord vergeten?",
        "userlogin-helplink2": "Hulp bij aanmelden",
        "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
-       "userlogin-createanother": "Een andere gebruiker registreren",
+       "userlogin-createanother": "Een andere account registreren",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (optioneel)",
        "createacct-email-ph": "Geef uw e-mailadres op",
        "createacct-realname": "Echte naam (optioneel)",
        "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
-       "createacct-reason-ph": "Waarom u een andere gebruiker aanmaakt",
-       "createacct-captcha": "Veiligheidscontrole",
-       "createacct-imgcaptcha-ph": "Geef de tekst in die u hierboven ziet",
+       "createacct-reason-ph": "Waarom u een andere account aanmaakt",
        "createacct-submit": "Account aanmaken",
-       "createacct-another-submit": "Gebruiker aanmaken",
+       "createacct-another-submit": "Account aanmaken",
        "createacct-benefit-heading": "{{SITENAME}} wordt gemaakt door mensen zoals u.",
        "createacct-benefit-body1": "bewerking{{PLURAL:$1||en}}",
        "createacct-benefit-body2": "pagina{{PLURAL:$1||'s}}",
        "createacct-benefit-body3": "recente bijdrager{{PLURAL:$1||s}}",
        "badretype": "De ingevoerde wachtwoorden verschillen van elkaar.",
-       "usernameinprogress": "Het aanmaken van een gebruiker met die naam is al bezig.\nGelieve te wachten.",
+       "usernameinprogress": "Het aanmaken van een gebruiker met die naam is al bezig.\nEven geduld alstublieft.",
        "userexists": "De gekozen gebruikersnaam is al in gebruik.\nKies een andere naam.",
        "loginerror": "Aanmeldfout",
-       "createacct-error": "Fout tijdens aanmaken gebruiker",
-       "createaccounterror": "Het was niet mogelijk de gebruiker aan te maken: $1",
+       "createacct-error": "Fout tijdens aanmaken account",
+       "createaccounterror": "Het was niet mogelijk de account aan te maken: $1",
        "nocookiesnew": "De gebruiker is geregistreerd, maar niet aangemeld.\n{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nSchakel die in en meld daarna aan met uw nieuwe gebruikersnaam en wachtwoord.",
        "nocookieslogin": "{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.\nCookies zijn uitgeschakeld in uw browser.\nSchakel deze optie in en probeer het opnieuw.",
        "nocookiesfornew": "De gebruiker is niet gemaakt omdat de bron niet bevestigd kon worden.\nZorg ervoor dat u cookies hebt ingeschakeld, herlaad deze pagina en probeer het opnieuw.",
        "wrongpassword": "Het opgegeven wachtwoord is onjuist.\nProbeer het opnieuw.",
        "wrongpasswordempty": "Het opgegeven wachtwoord was leeg.\nProbeer het opnieuw.",
        "passwordtooshort": "Wachtwoorden moeten uit minstens {{PLURAL:$1|$1 teken|$1 tekens}} bestaan.",
-       "passwordtoolong": "Wachtwoorden kunnen niet langer zijn dan {{PLURAL:$1|een teken|$1 tekens}}.",
+       "passwordtoolong": "Wachtwoorden kunnen niet langer zijn dan {{PLURAL:$1|één teken|$1 tekens}}.",
        "password-name-match": "Uw wachtwoord en uw gebruikersnaam mogen niet overeenkomen.",
        "password-login-forbidden": "Het gebruik van deze gebruikersnaam met dit wachtwoord is niet toegestaan.",
        "mailmypassword": "Nieuw wachtwoord e-mailen",
        "passwordreset-capture": "De resulterende e-mail bekijken?",
        "passwordreset-capture-help": "Als u dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan u weergegeven.",
        "passwordreset-email": "E-mailadres:",
-       "passwordreset-emailtitle": "Gebruikersgegevens op {{SITENAME}}",
+       "passwordreset-emailtitle": "Accountgegevens op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}. Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
        "passwordreset-emailtext-user": "Gebruiker $1 op de site {{SITENAME}} heeft een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.\nMeld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
        "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
-       "passwordreset-emailsent": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden.",
+       "passwordreset-emailsent": "Als dit een geregistreerd e-mailadres is voor uw account, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.",
        "passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1",
-       "changeemail": "E-mailadres wijzigen",
-       "changeemail-header": "Het e-mailadres van mijn gebruiker wijzigen",
+       "changeemail": "E-mailadres wijzigen of verwijderen",
+       "changeemail-header": "Vul dit formulier in om uw e-mailadres te wijzigen. Als u het e-mailadres wilt ontkoppelen van uw account, laat het e-mailadres dan leeg als u het formulier opslaat.",
+       "changeemail-passwordrequired": "U  moet uw wachtwoord invoeren om deze wijziging te bevestigen.",
        "changeemail-no-info": "U moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.",
        "changeemail-oldemail": "Huidig e-mailadres:",
        "changeemail-newemail": "Nieuw e-mailadres:",
+       "changeemail-newemail-help": "Laat dit veld leeg als u uw e-mailadres wilt verwijderen. Na het verwijderen kunt u niet langer een vergeten wachtwoord opnieuw instellen en u ontvangt geen e-mails van deze wiki meer.",
        "changeemail-none": "(geen)",
        "changeemail-password": "Uw wachtwoord voor {{SITENAME}}:",
        "changeemail-submit": "E-mailadres wijzigen",
        "changeemail-throttled": "U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.\nWacht alstublieft $1 voordat u het opnieuw probeert.",
+       "changeemail-nochange": "Geef een ander e-mailadres op.",
        "resettokens": "Tokens opnieuw instellen",
        "resettokens-text": "U kunt hier tokens opnieuw instellen die toegang tot bepaalde persoonlijke gegevens die zijn gekoppeld aan uw gebruiker.\n\nDoe dit als u ze per ongeluk met iemand hebt gedeeld of als uw onbevoegden toegang hebben gekregen tot uw gebruiker.",
        "resettokens-no-tokens": "Er zijn geen tokens om opnieuw in te stellen.",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
        "selfredirect": "<strong>Waarschuwing:</strong>U heeft een doorverwijzing gemaakt naar dezelfde pagina. Mogelijk heeft u de verkeerde bestemming voor de doorverwijzing gebruikt, of bewerkt u de verkeerde pagina. Door alsnog op \"{{int:savearticle}}\" te klikken word de doorverwijzing alsnog aangemaakt.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
-       "missingcommentheader": "'''Let op:''' u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
+       "missingcommentheader": "<strong>Let op:</strong> u hebt geen onderwerp/kop voor deze opmerking opgegeven.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
        "summary-preview": "Bewerkingssamenvatting nakijken:",
-       "subject-preview": "Onderwerp/kop nakijken:",
+       "subject-preview": "Onderwerp nakijken:",
        "previewerrortext": "Er is een fout opgetreden tijdens het weergeven van uw wijzigingen.",
        "blockedtitle": "Gebruiker is geblokkeerd",
        "blockedtext": "'''Uw gebruiker of IP-adres is geblokkeerd.'''\n\nDe blokkade is uitgevoerd door $1.\nDe opgegeven reden is ''$2''.\n\n* Aanvang blokkade: $8\n* Einde blokkade: $6\n* Bedoeld te blokkeren: $7\n\nU kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheerder]] om de blokkade te bespreken.\nU kunt geen gebruik maken van de functie \"Deze gebruiker e-mailen\", tenzij u een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.\nUw huidige IP-adres is $3 en het blokkadenummer is #$5.\nVermeld alle bovenstaande gegevens als u ergens op deze blokkade reageert.",
        "yourdiff": "Wijzigingen",
        "copyrightwarning": "Let op: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de $2 (zie $1 voor details).\nAls u niet wilt dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor \"Pagina opslaan\".<br />\nHierbij belooft u ons tevens dat u deze tekst zelf hebt geschreven of overgenomen uit een vrije, openbare bron.<br />\n'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
        "copyrightwarning2": "Al uw bijdragen aan {{SITENAME}} kunnen bewerkt, gewijzigd of verwijderd worden door andere gebruikers.\nAls u niet wilt dat uw teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />\nU belooft ook dat u de oorspronkelijke auteur bent van dit materiaal of dat u het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).\n'''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
-       "editpage-cannot-use-custom-model": "Het inhoudsmodel van deze pagina kan niet worden veranderd.",
+       "editpage-cannot-use-custom-model": "Het inhoudsmodel van deze pagina kan niet worden gewijzigd.",
        "longpageerror": "'''Fout: de tekst die u hebt toegevoegd is {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''\nOpslaan is niet mogelijk.",
        "readonlywarning": "'''Waarschuwing: u kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.'''\nHet is misschien verstandig om uw tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.\n\nEen beheerder heeft de database geblokkeerd om de volgende reden: $1",
        "protectedpagewarning": "'''Waarschuwing: deze beveiligde pagina kan alleen door gebruikers met beheerdersrechten bewerkt worden.'''\nDe laatste logboekregel staat hieronder:",
        "permissionserrors": "Fouten in rechten",
        "permissionserrorstext": "U hebt geen rechten om dit te doen om de volgende {{PLURAL:$1|reden|redenen}}:",
        "permissionserrorstext-withaction": "U hebt geen rechten om $2, {{PLURAL:$1|want}}:",
+       "contentmodelediterror": "U kunt deze versie niet bewerken, want het contentmodel ervan is <code>$1</code> en het huidige contentmodel van de pagina is <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Waarschuwing: u bent bezig met het aanmaken van een pagina die in het verleden verwijderd is.'''\n\nOverweeg of het terecht is dat u verder werkt aan deze pagina.\nVoor uw gemak staan hieronder het verwijderingslogboek en het hernoemingslogboek voor deze pagina:",
        "moveddeleted-notice": "Deze pagina is verwijderd.\nTer informatie wordt het verwijderingslogboek en het hernoemingslogboek van deze pagina hieronder weergegeven.",
+       "moveddeleted-notice-recent": "Deze pagina is helaas recentelijk verwijderd (in de afgelopen 24 uur).\nDe verwijdering- en hernoemingslogboek worden voor uw gemak hieronder weergegeven.",
        "log-fulllog": "Het volledige logboek bekijken",
        "edit-hook-aborted": "De bewerking is afgebroken door een hook.\nEr is geen toelichting beschikbaar.",
        "edit-gone-missing": "De pagina is niet bijgewerkt.\nDeze lijkt verwijderd te zijn.",
        "revdelete-submit": "Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}",
        "revdelete-success": "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
        "revdelete-failure": "'''De zichtbaarheid van de wijziging kon niet bijgewerkt worden:'''\n$1",
-       "logdelete-success": "Zichtbaarheid van de gebeurtenis ingesteld.",
+       "logdelete-success": "De zichtbaarheid van de gebeurtenis is ingesteld.",
        "logdelete-failure": "'''De zichtbaarheid van de logboekregel kon niet ingesteld worden:'''\n$1",
        "revdel-restore": "Zichtbaarheid wijzigen",
        "pagehist": "Geschiedenis",
        "mergehistory-go": "Samenvoegbare bewerkingen bekijken",
        "mergehistory-submit": "Versies samenvoegen",
        "mergehistory-empty": "Er zijn geen versies die samengevoegd kunnen worden.",
-       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 zijn samengevoegd naar [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 {{PLURAL:$3|is|zijn}} samengevoegd naar [[:$2]].",
        "mergehistory-fail": "Kan geen geschiedenis samenvoegen, controleer opnieuw de pagina- en tijdinstellingen.",
        "mergehistory-fail-toobig": "Niet in staat om geschiedenis samen te voegen omdat meer dan de limiet van $1 {{PLURAL:$1|versie wordt|versie worden}} verplaatst.",
        "mergehistory-no-source": "De bronpagina $1 bestaat niet.",
        "search-category": "(categorie $1)",
        "search-file-match": "(komt overeen met de inhoud van het bestand)",
        "search-suggest": "Bedoelde u: $1",
-       "search-rewritten": "Resultaten voor $1 getoond. Zoek in plaats daarvan naar $2.",
+       "search-rewritten": "De resultaten voor $1 worden weergegeven. Zoek in plaats daarvan naar $2.",
        "search-interwiki-caption": "Zusterprojecten",
        "search-interwiki-default": "Resultaten van $1:",
        "search-interwiki-more": "(meer)",
        "prefs-watchlist-token": "Volglijstsleutel:",
        "prefs-misc": "Diversen",
        "prefs-resetpass": "Wachtwoord wijzigen",
-       "prefs-changeemail": "E-mailadres wijzigen",
+       "prefs-changeemail": "E-mailadres wijzigen of verwijderen",
        "prefs-setemail": "Een e-mailadres instellen",
        "prefs-email": "E-mail",
        "prefs-rendering": "Uiterlijk",
        "rows": "Regels:",
        "columns": "Kolommen:",
        "searchresultshead": "Zoekresultaten",
-       "stub-threshold": "Drempel voor markering als <a href=\"#\" class=\"stub\">beginnetje</a>:",
+       "stub-threshold": "Drempel voor markering als beginnetje ($1):",
        "stub-threshold-sample-link": "voorbeeld",
        "stub-threshold-disabled": "Uitgeschakeld",
        "recentchangesdays": "Aantal dagen weer te geven in de recente wijzigingen:",
        "prefs-help-recentchangescount": "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
        "prefs-help-watchlist-token2": "Dit is de geheime sleutel voor de webfeed van uw volglijst.\nIedereen die het token kent, kan uw volglijst bekijken, dus deel dit token niet.\nU kunt de [[Special:ResetTokens|tokens opnieuw instellen]] als u dat wilt.",
        "savedprefs": "Uw voorkeuren zijn opgeslagen.",
+       "savedrights": "De gebruikersrechten van {{GENDER:$1|$1}} zijn opgeslagen.",
        "timezonelegend": "Tijdzone:",
        "localtime": "Plaatselijke tijd:",
        "timezoneuseserverdefault": "Wikistandaard gebruiken ($1)",
        "prefs-help-variant": "Uw voorkeursvariant of -spelling om de inhoudspagina's van deze wiki in weer te geven.",
        "yournick": "Tekst voor ondertekening:",
        "prefs-help-signature": "Reacties op de overlegpagina's worden meestal ondertekend met \"<nowiki>~~~~</nowiki>\".\nDe tildes worden omgezet in uw ondertekening en een datum en tijd van de bewerking.",
-       "badsig": "Ongeldige ondertekening; controleer de HTML-tags.",
+       "badsig": "Ongeldige ondertekening; controleer de HTML-labels.",
        "badsiglength": "Uw ondertekening is te lang.\nDeze moet minder dan $1 {{PLURAL:$1|teken|tekens}} bevatten.",
        "yourgender": "Hoe wilt u beschreven worden?",
-       "gender-unknown": "De software zal waar mogelijk geslachtsneutrale woorden gebruiken als het over jou gaat",
+       "gender-unknown": "De software gebruikt waar mogelijk geslachtsneutrale woorden als het over u gaat",
        "gender-male": "Hij bewerkt pagina's",
        "gender-female": "Zij bewerkt pagina's",
        "prefs-help-gender": "Deze voorkeur instellen is optioneel.\n\nDe software gebruikt deze waarde om u aan te spreken en u te vermelden aan andere gebruikers door middel van het juiste grammaticale geslacht.\n\nDeze informatie is openbaar en zichtbaar voor andere gebruikers.",
        "group-bot": "bots",
        "group-sysop": "beheerders",
        "group-bureaucrat": "bureaucraten",
-       "group-suppress": "Toezichthouders",
+       "group-suppress": "toezichthouders",
        "group-all": "(iedereen)",
        "group-user-member": "{{GENDER:$1|gebruiker}}",
        "group-autoconfirmed-member": "{{GENDER:$1|autobevestigde gebruiker}}",
        "action-viewmywatchlist": "uw eigen volglijst te bekijken",
        "action-viewmyprivateinfo": "uw eigen privégegevens te bekijken",
        "action-editmyprivateinfo": "uw eigen privégegevens te bewerken",
-       "action-editcontentmodel": "de paginainhoudmodel te bewerken",
-       "action-managechangetags": "labels aanmaken en verwijderen",
+       "action-editcontentmodel": "het paginainhoudmodel te bewerken",
+       "action-managechangetags": "labels aan te maken en te verwijderen",
        "action-applychangetags": "labels aan uw bewerkingen toe te voegen",
        "action-changetags": "willekeurige labels toe te voegen aan en te verwijderen van versies en logboekregels",
        "nchanges": "$1 {{PLURAL:$1|bewerking|bewerkingen}}",
        "rcshowhidemine": "mijn bewerkingen $1",
        "rcshowhidemine-show": "weergeven",
        "rcshowhidemine-hide": "verbergen",
+       "rcshowhidecategorization": "Paginacategorisatie $1",
+       "rcshowhidecategorization-show": "weergeven",
+       "rcshowhidecategorization-hide": "verbergen",
        "rclinks": "De $1 laatste wijzigingen bekijken in de laatste $2 dagen<br />$3",
        "diff": "wijz",
        "hist": "gesch",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|keer|keer}} op een volglijst]",
        "rc_categories": "Beperken tot categorieën (scheiden met een \"|\"):",
-       "rc_categories_any": "Een van de aangeduide",
+       "rc_categories_any": "Een van de gekozen",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} na de wijziging",
        "newsectionsummary": "/* $1 */ nieuwe subkop",
        "rc-enhanced-expand": "Details weergeven",
        "recentchangeslinked-page": "Paginanaam:",
        "recentchangeslinked-to": "Wijzigingen aan pagina's met koppelingen naar deze pagina bekijken",
        "recentchanges-page-added-to-category": "[[:$1]] aan categorie toegevoegd",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] en {{PLURAL:$2|één pagina|$2 pagina's}} zijn toegevoegd aan categorie",
+       "recentchanges-page-removed-from-category": "[[:$1]] is verwijderd uit categorie",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] en {{PLURAL:$2|één pagina|$2 pagina's}} zijn verwijderd uit categorie",
+       "autochange-username": "Automatische wijziging van MediaWiki",
        "upload": "Bestand uploaden",
        "uploadbtn": "Bestand uploaden",
        "reuploaddesc": "Upload annuleren en terugkeren naar het uploadformulier",
        "uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld.",
        "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
        "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
-       "upload-scripted-pi-callback": "Het uploaden van een bestand met instructies voor de verwerking van XML-stijlbladen is niet mogelijk.",
-       "uploaded-script-svg": "Scriptable element \"$1\" in het geüploade SVG-bestand gevonden.",
+       "upload-scripted-pi-callback": "Het uploaden van een bestand met instructies voor de verwerking van XML-stylesheets is niet mogelijk.",
+       "uploaded-script-svg": "Scriptbaar element \"$1\" in het geüploade SVG-bestand gevonden.",
        "uploaded-hostile-svg": "Onveilige CSS in het \"style\"-element van het geüploade SVG-bestand gevonden.",
-       "uploaded-event-handler-on-svg": "Het instellen van de event-handler attributen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
-       "uploaded-href-attribute-svg": "href-attributen <code>&lt;$1 $2=\"$3\"&gt;</code> met niet-lokaal doel (bv. http://, javascript:, enz.) zijn niet toegestaan in SVG-bestanden.",
+       "uploaded-event-handler-on-svg": "Het instellen van de event-handlereigenschappen <code>$1=\"$2\"</code> is niet toegestaan in SVG-bestanden.",
+       "uploaded-href-attribute-svg": "href-eigenschappen <code>&lt;$1 $2=\"$3\"&gt;</code> met niet-lokaal doel (bijvoorbeeld http://, javascript:, enz.) zijn niet toegestaan in SVG-bestanden.",
        "uploaded-href-unsafe-target-svg": "href met onveilig doel <code>&lt;$1 $2=\"$3\"&gt;</code> in het geüploade SVG-bestand gevonden.",
-       "uploaded-animate-svg": "\"animate\"-tag gevonden in het geüploade svg-bestand die href zou kunnen veranderen, met behulp van het \"from\"-attribuut <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploaded-setting-event-handler-svg": "Het instellen van de event-handler-attributen is geblokkeerd, <code>&lt;$1 $2=\"$3\"&gt;</code> gevonden in het geüploade SVG-bestand.",
-       "uploaded-setting-href-svg": "Met behulp van de \"set\" tag toevoegen \"href\" attribuut te bovenliggende element is geblokkeerd.",
-       "uploaded-wrong-setting-svg": "Met behulp van de \"set\" tag toevoegen van een afstandsbediening/data/script doel aan een kenmerk is geblokkeerd. Gevonden <code><set=\"$1\"></code> in het geüploade SVG-bestand.",
-       "uploaded-setting-handler-svg": "SVG-dat stelt de \"handler\" attribuut met afstandsbediening/data/script geblokkeerd. Gevonden <code>$1=\"$2\"</code> in de SVG-bestand geüpload.",
-       "uploaded-remote-url-svg": "SVG-dat wordt voorzien van een style attribuut met externe URL wordt geblokkeerd. Gevonden <code>$1=\"$2\"</code> in de SVG-bestand geüpload.",
-       "uploaded-image-filter-svg": "Gevonden href tot onveilige doel <code><$1 $2=\"$3\"></code> in het geüploade SVG-bestand .",
+       "uploaded-animate-svg": "\"animate\"-label gevonden in het geüploade svg-bestand die href zou kunnen veranderen, met behulp van het \"from\"-attribuut <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-setting-event-handler-svg": "Het instellen van de event-handlereigenschappen is geblokkeerd, <code>&lt;$1 $2=\"$3\"&gt;</code> gevonden in het geüploade SVG-bestand.",
+       "uploaded-setting-href-svg": "Het label \"set\" gebruiken om het attribuut \"href\" toe te voegen aan het ouderelement is niet mogelijk.",
+       "uploaded-wrong-setting-svg": "Het gebruik van het label \"set\" voor het toevoegen van een externe bron, gegevens of script aan attributen is niet toegestaan. Het volgende is aangetroffen in het geüploade SVG-bestand: <code>&lt;set to=\"$1\"&gt;</code>",
+       "uploaded-setting-handler-svg": "SVG-bestanden die de eigenschap \"handler\" instellen met remote, data of script worden geblokkeerd. <code>$1=\"$2\"</code> is aangetroffen in het geüploade SVG-bestand.",
+       "uploaded-remote-url-svg": "SVG-bestanden die de style-eigenschap gebruiken met een remote URL worden geblokkeerd. <code>$1=\"$2\"</code> is aangetroffen in het geüploade SVG-bestand.",
+       "uploaded-image-filter-svg": "Er is een afbeeldingsfilter met URL aangetroffen: <code>&lt;$1 $2=\"$3\"&gt;</code> in het geüploade SVG-bestand.",
        "uploadscriptednamespace": "Dit SVG-bestand bevat een ongeldige naamruimte \"$1\".",
        "uploadinvalidxml": "De XML in het geüploade bestand kon niet worden verwerkt.",
        "uploadvirus": "Het bestand bevat een virus! Details: $1",
        "upload-options": "Uploadinstellingen",
        "watchthisupload": "Dit bestand volgen",
        "filewasdeleted": "Er is eerder een bestand met deze naam verwijderd.\nRaadpleeg het $1 voordat u het opnieuw toevoegt.",
+       "filename-thumb-name": "Dit ziet eruit als de naam van een miniatuurbestand. Upload alstublieft geen miniaturen opnieuw in de wiki. Is dit niet het geval, corrigeer dan de bestandsnaam naar een meer betekenisvolle naam zonder het voorvoegsel voor miniaturen.",
        "filename-bad-prefix": "De naam van het bestand dat u aan het uploaden bent begint met '''\"$1\"''', wat een niet-beschrijvende naam is die meestal automatisch door een digitale camera wordt gegeven.\nKies een duidelijke naam voor uw bestand.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# De syntaxis is als volgt:\n#   * Alle tekst vanaf het karakter \"#\" tot het einde van de regel wordt gezien als opmerking\n#   * Iedere niet-lege regel is een voorvoegsel voor bestandsnamen die vaak automatisch worden toegekend door digitale camera's\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # sommige mobiele telefoons\nIMG # algemeen\nJD # Jenoptik\nMGP # Pentax\nPICT # overig\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-success-subj": "Het bestand is toegevoegd",
        "upload-dialog-button-cancel": "Annuleren",
        "upload-dialog-button-done": "Afgerond",
        "upload-dialog-button-save": "Opslaan",
-       "upload-dialog-button-upload": "Upload",
-       "upload-process-error": "Er is een fout opgetreden",
-       "upload-process-warning": "Een waarschuwing is opgetreden",
+       "upload-dialog-button-upload": "Uploaden",
        "upload-form-label-select-file": "Selecteer bestand",
        "upload-form-label-infoform-title": "Details",
        "upload-form-label-infoform-name": "Naam",
        "foreign-structured-upload-form-label-own-work": "Dit is mijn eigen werk",
        "foreign-structured-upload-form-label-infoform-categories": "Categorieën",
        "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Ik bevestig dat ik dit bestand upload onder de voorwaarden en het licentiebeleid van {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Als u niet in staat bent dit bestand te uploaden onder het beleid van {{SITENAME}}, sluit dit venster dan alstublieft en kies een andere methode.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "U kunt ook de [[Special:Upload|standaard uploadpagina]] gebruiken.",
+       "foreign-structured-upload-form-label-own-work-message-default": "Ik begrijp dat ik dit bestand upload naar een gedeelde repository. Ik bevestig dat ik voldoe aan de voorwaarden en het licentiebeleid daar.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Als u niet in staat bent dit bestand te uploaden onder het beleid van de gedeelde repository, sluit dit venster dan alstublieft en kies een andere methode.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "U kunt ook proberen de [[Special:Upload|uploadpagina van {{SITENAME}}]] te gebruiken als dit bestand geüpload kan worden onder hun beleid.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Ik verklaar dat ik de auteursrechten bezit op dit bestand en ik ga onherroepbaar akkoord met het vrijgeven van dit bestand aan Wikimedia Commons onder de licentie [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Naamsvermelding-GelijkDelen 4.0] en ik ga akkoord met de [https://wikimediafoundation.org/wiki/Terms_of_Use Gebruiksvoorwaarden].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Als u geen eigenaar bent van de auteursrechten van dit bestand, of als u het onder een andere licentie wilt vrijgeven, overweeg dan gebruik te maken van de [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "U kunt ook de [[Special:Upload|uploadpagina op {{SITENAME}}]] gebruiken, als de site het uploaden van dit bestand onder hun beleid toestaat.",
        "backend-fail-stream": "Het was niet mogelijk het bestand \"$1\" te streamen.",
        "backend-fail-backup": "Het was niet mogelijk een reservekopie van het bestand $1 te maken.",
        "backend-fail-notexists": "Het bestand $1 bestaat niet.",
        "booksources-text": "Hieronder staat een lijst met koppelingen naar andere websites die nieuwe of gebruikte boeken verkopen, en die wellicht meer informatie over het boek dat u zoekt hebben:",
        "booksources-invalid-isbn": "Het opgegeven ISBN lijkt niet geldig te zijn.\nControleer of u wellicht een fout hebt gemaakt bij de invoer.",
        "specialloguserlabel": "Uitvoerende gebruiker:",
-       "speciallogtitlelabel": "Doel (paginanaam of gebruiker):",
+       "speciallogtitlelabel": "Doel (paginanaam of {{ns:user}}:gebruikersnaam voor gebruiker):",
        "log": "Logboeken",
        "all-logs-page": "Alle openbare logboeken",
        "alllogstext": "Dit is het gecombineerde logboek van {{SITENAME}}.\nU kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlettergevoelig) en paginanaam (hoofdlettergevoelig).",
        "listgrouprights-removegroup-all": "Gebruikers uit alle groepen verwijderen",
        "listgrouprights-addgroup-self": "De volgende {{PLURAL:$2|groep|groepen}} toevoegen aan eigen gebruiker: $1",
        "listgrouprights-removegroup-self": "De volgende {{PLURAL:$2|groep|groepen}} verwijderen van eigen gebruiker: $1",
-       "listgrouprights-addgroup-self-all": "Alle groepen toevoegen aan eigen gebruiker",
-       "listgrouprights-removegroup-self-all": "Alle groepen verwijderen van eigen gebruiker",
+       "listgrouprights-addgroup-self-all": "Alle groepen toevoegen aan eigen account",
+       "listgrouprights-removegroup-self-all": "Alle groepen verwijderen van eigen account",
        "listgrouprights-namespaceprotection-header": "Naamruimtebeperkingen",
        "listgrouprights-namespaceprotection-namespace": "Naamruimte",
        "listgrouprights-namespaceprotection-restrictedto": "Recht(en) waardoor gebruiker kan bewerken",
        "emailccsubject": "Kopie van uw bericht aan $1: $2",
        "emailsent": "E-mail verzonden",
        "emailsenttext": "Uw e-mail is verzonden.",
-       "emailuserfooter": "Deze e-mail is verstuurd door $1 aan $2 door de functie \"{{int:emailuser}}\" van {{SITENAME}}.",
+       "emailuserfooter": "Deze e-mail is {{GENDER:$1|verstuurd}} door $1 aan {{GENDER:$2|$2}} door de functie \"{{int:emailuser}}\" van {{SITENAME}}.",
        "usermessage-summary": "Systeembericht achtergelaten",
        "usermessage-editor": "Systeembericht",
        "watchlist": "Volglijst",
        "watchlistanontext": "Om uw volglijst te bekijken of te bewerken moet u zich aanmelden.",
        "watchnologin": "U bent niet aangemeld",
        "addwatch": "Toevoegen aan volglijst",
-       "addedwatchtext": "De pagina \"[[:$1]]\" is toegevoegd aan uw [[Special:Watchlist|volglijst]].\nToekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden daar weergegeven.",
+       "addedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
        "addedwatchtext-short": "De pagina \"$1\" is aan uw volglijst toegevoegd.",
        "removewatch": "Verwijderen uit volglijst",
-       "removedwatchtext": "De pagina \"[[:$1]]\" is van [[Special:Watchlist|uw volglijst]] verwijderd.",
+       "removedwatchtext": "\"[[:$1]]\" en de overlegpagina zijn verwijderd van [[Special:Watchlist|uw volglijst]].",
        "removedwatchtext-short": "De pagina \"$1\" is van uw volglijst verwijderd.",
        "watch": "Volgen",
        "watchthispage": "Pagina volgen",
        "deletepage": "Pagina verwijderen",
        "confirm": "Bevestigen",
        "excontent": "De inhoud was: \"$1\"",
-       "excontentauthor": "De inhoud was: \"$1\" ([[Special:Contributions/$2|$2]] was de enige auteur)",
+       "excontentauthor": "inhoud was: \"$1\" ([[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) was de enige auteur)",
        "exbeforeblank": "De inhoud was: \"$1\"",
        "delete-confirm": "\"$1\" verwijderen",
        "delete-legend": "Verwijderen",
        "sessionfailure-title": "Sessiefout",
        "sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nGa een pagina terug, laad die pagina opnieuw en probeer het nog eens.",
        "changecontentmodel": "Inhoudsmodel van pagina bewerken",
-       "changecontentmodel-legend": "Inhoudsmodel veranderen",
-       "changecontentmodel-title-label": "Paginatitel",
+       "changecontentmodel-legend": "Inhoudsmodel wijzigen",
+       "changecontentmodel-title-label": "Paginanaam",
        "changecontentmodel-model-label": "Nieuw inhoudsmodel",
        "changecontentmodel-reason-label": "Reden:",
-       "changecontentmodel-success-title": "Het inhoudsmodel is veranderd",
-       "changecontentmodel-success-text": "Het inhoudstype van [[:$1]] is veranderd.",
-       "changecontentmodel-cannot-convert": "De inhoud van [[:$1]] kan niet worden omgezet in een type $2.",
+       "changecontentmodel-success-title": "Het inhoudsmodel is gewijzigd",
+       "changecontentmodel-success-text": "Het inhoudstype van [[:$1]] is gewijzigd.",
+       "changecontentmodel-cannot-convert": "De inhoud van [[:$1]] kan niet worden omgezet in een type van $2.",
        "changecontentmodel-nodirectediting": "Het inhoudsmodel $1 ondersteunt direct bewerken niet",
-       "log-name-contentmodel": "Veranderingenlogboek van inhoudsmodel",
+       "log-name-contentmodel": "Wijzigingenlogboek van inhoudsmodel",
        "log-description-contentmodel": "Gebeurtenissen rond het inhoudsmodel van een pagina",
-       "logentry-contentmodel-change": "$1 {{GENDER:$2|veranderde}} het inhoudsmodel van pagina $3 van \"$4\" in \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|heeft}} het inhoudsmodel gewijzigd van pagina $3 van \"$4\" in \"$5\"",
        "logentry-contentmodel-change-revertlink": "terugdraaien",
        "logentry-contentmodel-change-revert": "terugdraaien",
        "protectlogpage": "Beveiligingslogboek",
        "viewdeletedpage": "Verwijderde pagina's bekijken",
        "undeletepagetext": "Hieronder {{PLURAL:$1|staat de pagina die verwijderd is|staan pagina's die zijn verwijderd}} en vanuit het archief teruggeplaatst {{PLURAL:$1|kan|kunnen}} worden.",
        "undelete-fieldset-title": "Versies terugplaatsen",
-       "undeleteextrahelp": "Laat alle vakjes leeg en klik op <strong><em>Terugplaatsen</em></strong> om de hele pagina inclusief alle eerdere versies terug te plaatsen.\nVink de terug te plaatsen versies aan en klik op <strong><em>Terugplaatsen</em></strong> om bepaalde versies terug te plaatsen.",
-       "undeleterevisions": "$1 {{PLURAL:$1|versie|versies}} gearchiveerd",
+       "undeleteextrahelp": "Laat alle vakjes leeg en klik op <strong><em>Terugplaatsen</em></strong> om de hele pagina inclusief alle eerdere versies terug te plaatsen.\nSelecteer de terug te plaatsen versies en klik op <strong><em>Terugplaatsen</em></strong> om bepaalde versies terug te plaatsen.",
+       "undeleterevisions": "$1 {{PLURAL:$1|versie|versies}} verwijderd",
        "undeletehistory": "Als u een pagina terugplaatst, worden alle versies hersteld.\nAls er al een nieuwe pagina met dezelfde naam is aangemaakt sinds de pagina is verwijderd, worden de eerder verwijderde versies teruggeplaatst en blijft de huidige versie intact.",
        "undeleterevdel": "Herstellen is niet mogelijk als daardoor de meest recente versie van de pagina of het bestand gedeeltelijk wordt verwijderd.\nVerwijder in die gevallen de meest recent verwijderde versie uit de selectie.",
        "undeletehistorynoadmin": "Deze pagina is verwijderd.\nDe reden hiervoor staat hieronder, samen met de details van de gebruikers die deze pagina hebben bewerkt vóór de verwijdering.\nDe verwijderde inhoud van de pagina is alleen zichtbaar voor beheerders.",
        "undelete-show-file-submit": "Ja",
        "namespace": "Naamruimte:",
        "invert": "Selectie omkeren",
-       "tooltip-invert": "Vink dit aan om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
-       "tooltip-whatlinkshere-invert": "Vink dit vakje aan om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
+       "tooltip-invert": "Selecteer dit om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
+       "tooltip-whatlinkshere-invert": "Selecteer dit vakje om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
        "namespace_association": "Gekoppelde naamruimte",
-       "tooltip-namespace_association": "Vink dit aan om ook wijzigingen weer te geven in de overleg- of onderwerpnaamruimte die bij de geselecteerde naamruimte hoort",
+       "tooltip-namespace_association": "Selecteer dit om ook wijzigingen weer te geven in de overleg- of onderwerpnaamruimte die bij de geselecteerde naamruimte hoort",
        "blanknamespace": "(Hoofdnaamruimte)",
        "contributions": "{{GENDER:$1|Gebruikersbijdragen}}",
        "contributions-title": "Bijdragen van $1",
        "mycontris": "Bijdragen",
        "contribsub2": "Voor {{GENDER:$3|$1}} ($2)",
-       "contributions-userdoesnotexist": "De gebruiker \"$1\" is niet geregistreerd.",
+       "contributions-userdoesnotexist": "De account \"$1\" is niet geregistreerd.",
        "nocontribs": "Geen wijzigingen gevonden die aan de gestelde criteria voldoen.",
        "uctop": "(laatste wijziging)",
        "month": "Van maand (en eerder):",
        "ipbreason": "Reden:",
        "ipbreason-dropdown": "*Veelvoorkomende redenen voor blokkades\n** Foutieve informatie invoeren\n** Verwijderen van informatie uit pagina's\n** Spamkoppeling naar externe websites\n** Invoegen van nonsens in pagina's\n** Intimiderend gedrag\n** Misbruik door meerdere gebruikers\n** Onaanvaardbare gebruikersnaam",
        "ipb-hardblock": "Voorkomen dat aangemelde gebruikers vanaf dit IP-adres kunnen bewerken",
-       "ipbcreateaccount": "Registreren gebruikers blokkeren",
+       "ipbcreateaccount": "Registreren accounts blokkeren",
        "ipbemailban": "Gebruiker weerhouden van het sturen van e-mail",
        "ipbenableautoblock": "Automatisch de IP-adressen van deze gebruiker blokkeren",
        "ipbsubmit": "Deze gebruiker blokkeren",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] is geblokkeerd.<br />\nZie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.",
        "ipb-blockingself": "U staat op het punt uzelf te blokkeren. Weet u zeker dat u dat wilt doen?",
        "ipb-confirmhideuser": "U staat op het punt een verborgen gebruiker te blokkeren. Hiervoor worden gebruikersnamen in alle lijsten en logboekregels verborgen. Weet u het zeker?",
-       "ipb-confirmaction": "Weet u zeker dat u dit wilt doen? Vink dank het vakje \"{{int:ipb-confirm}}\" hieronder aan.",
+       "ipb-confirmaction": "Weet u zeker dat u dit wilt doen? Selecteer dan het selectievakje \"{{int:ipb-confirm}}\" hieronder.",
        "ipb-edit-dropdown": "Lijst van redenen bewerken",
        "ipb-unblock-addr": "$1 deblokkeren",
        "ipb-unblock": "Een gebruiker of IP-adres deblokkeren",
        "blocklist": "Geblokkeerde gebruikers",
        "ipblocklist": "Geblokkeerde gebruikers",
        "ipblocklist-legend": "Een geblokkeerde gebruiker zoeken",
-       "blocklist-userblocks": "Geblokkeerde gebruikers verbergen",
+       "blocklist-userblocks": "Geblokkeerde accounts verbergen",
        "blocklist-tempblocks": "Tijdelijke blokkades verbergen",
        "blocklist-addressblocks": "Blokkades van één IP-adres verbergen",
        "blocklist-rangeblocks": "IP-adresblokken verbergen",
        "expiringblock": "vervalt op $1 om $2",
        "anononlyblock": "alleen anonieme",
        "noautoblockblock": "autoblokkeren uitgeschakeld",
-       "createaccountblock": "registreren gebruikers uitgeschakeld",
+       "createaccountblock": "aanmaken accounts uitgeschakeld",
        "emailblock": "e-mail uitgeschakeld",
        "blocklist-nousertalk": "kan eigen overlegpagina niet bewerken",
        "ipblocklist-empty": "De blokkeerlijst is leeg.",
        "blocklogtext": "Hier ziet u een lijst van de recente blokkeringen en deblokkeringen.\nAutomatische blokkeringen en deblokkeringen komen niet in het logboek.\nZie ook de [[Special:BlockList|blokkadelijst]] voor de op dit moment actieve blokkades.",
        "unblocklogentry": "heeft de blokkade van $1 opgeheven",
        "block-log-flags-anononly": "alleen anonieme gebruikers",
-       "block-log-flags-nocreate": "registreren gebruikers geblokkeerd",
+       "block-log-flags-nocreate": "aanmaken accounts uitgeschakeld",
        "block-log-flags-noautoblock": "autoblokkeren is uitgeschakeld",
        "block-log-flags-noemail": "e-mail uitgeschakeld",
        "block-log-flags-nousertalk": "kan eigen overlegpagina niet bewerken",
        "unlockconfirm": "Ja, ik wil de database vrijgeven.",
        "lockbtn": "Database blokkeren",
        "unlockbtn": "Database vrijgeven",
-       "locknoconfirm": "U hebt uw keuze niet bevestigd via het vinkvakje.",
+       "locknoconfirm": "U hebt uw keuze niet bevestigd via het selectievakje.",
        "lockdbsuccesssub": "De database is afgesloten",
        "unlockdbsuccesssub": "De database is vrijgegeven",
        "lockdbsuccesstext": "De database is afgesloten.<br />\nVergeet niet de [[Special:UnlockDB|database vrij te geven]] zodra u klaar bent met uw onderhoud.",
        "move-page-legend": "Pagina hernoemen",
        "movepagetext": "Door middel van het onderstaande formulier kunt u een pagina hernoemen.\nDe geschiedenis gaat mee naar de nieuwe pagina.\n* De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\n* Koppelingen naar de oude pagina worden niet aangepast.\n* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.\nAls u dit niet wenst, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\n\n'''Waarschuwing!'''\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
        "movepagetext-noredirectfixer": "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.\nDe oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\nControleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\nU kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en u kunt een bestaande pagina niet overschrijven. \n\n'''Waarschuwing!'''\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
-       "movepagetalktext": "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':\n* De overlegpagina onder de nieuwe naam al bestaat;\n* U het onderstaande vinkje deselecteert.\n\nIn die gevallen moet u de pagina handmatig hernoemen of samenvoegen.",
+       "movepagetalktext": "Als u het onderstaande vinkje selecteert, krijgt de bijbehorende overlegpagina automatisch een andere naam, tenzij de overlegpagina onder de nieuwe naam al bestaat.\n\nIn dit geval moet u de pagina handmatig hernoemen of samenvoegen.",
        "moveuserpage-warning": "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
        "movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd wordt; pagina's in de oude categorie worden <em>niet</em> automatisch naar de nieuwe verplaatst.",
        "movenologintext": "U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.",
        "importcantopen": "Kon het importbestand niet openen",
        "importbadinterwiki": "Verkeerde interwikikoppeling",
        "importsuccess": "Import afgerond!",
-       "importnosources": "Er zijn geen wiki's van waaruit geïmporteerd kan worden vastgelegd. Directe geschiedenis-uploads zijn uitgeschakeld.",
+       "importnosources": "Er zijn geen wiki's ingesteld van waaruit geïmporteerd kan worden. Directe geschiedenisuploads zijn uitgeschakeld.",
        "importnofile": "Er is geen importbestand geüpload.",
        "importuploaderrorsize": "Upload van het importbestand in mislukt.\nHet bestand is groter dan de ingestelde limiet.",
        "importuploaderrorpartial": "Upload van het importbestand in mislukt.\nHet bestand is slechts gedeeltelijk aangekomen.",
        "javascripttest": "JavaScript testen",
        "javascripttest-pagetext-noframework": "Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.",
        "javascripttest-pagetext-unknownframework": "Onbekend testframework \"$1\".",
-       "javascripttest-pagetext-unknownaction": "Onbekende actie \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Onbekende handeling \"$1\".",
        "javascripttest-pagetext-frameworks": "Kies een van de volgende testframeworks: $1",
        "javascripttest-pagetext-skins": "Kies een vormgeving om de tests mee uit te voeren:",
        "javascripttest-qunit-intro": "Zie de [$1 testdocumentatie] op mediawiki.org.",
        "svg-long-error": "Ongeldig SVG-bestand: $1",
        "show-big-image": "Oorspronkelijk bestand",
        "show-big-image-preview": "Grootte van deze voorvertoning: $1.",
+       "show-big-image-preview-differ": "Afmetingen van deze voorvertoning van het type $3 van dit $2-bestand: $1",
        "show-big-image-other": "Andere {{PLURAL:$2|resolutie|resoluties}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "herhalend",
        "lag-warn-high": "Door een hoge database-servertoevoer zijn wijzigingen nieuwer dan $1 {{PLURAL:$1|seconde|seconden}} mogelijk niet beschikbaar in de lijst.",
        "watchlistedit-normal-title": "Volglijst bewerken",
        "watchlistedit-normal-legend": "Pagina’s van uw volglijst verwijderen",
-       "watchlistedit-normal-explain": "Hieronder worden de pagina’s op uw volglijst weergegeven.\nKlik op het vinkvakje ernaast en daarna op \"{{int:Watchlistedit-normal-submit}}\" om een pagina te verwijderen.\nU kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].",
+       "watchlistedit-normal-explain": "Hieronder worden de pagina’s op uw volglijst weergegeven.\nKlik op het selectievakje ernaast en daarna op \"{{int:Watchlistedit-normal-submit}}\" om een pagina te verwijderen.\nU kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].",
        "watchlistedit-normal-submit": "Pagina's verwijderen",
        "watchlistedit-normal-done": "Er {{PLURAL:$1|is één pagina|zijn $1 pagina’s}} verwijderd van uw volglijst:",
        "watchlistedit-raw-title": "Ruwe volglijst bewerken",
        "tags-actions-header": "Acties",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nee",
-       "tags-source-extension": "Door een extensie toegevoegd",
+       "tags-source-extension": "Door een uitbreiding toegevoegd",
        "tags-source-manual": "Handmatig toegevoegd door gebruikers en bots",
        "tags-source-none": "Niet meer in gebruik",
        "tags-edit": "bewerken",
        "tags-delete-explanation-warning": "Deze handeling is <strong>onomkeerbaar</strong> en <strong>kan niet ongedaan gemaakt worden</strong>, zelfs niet door databasebeheerders. Weet zeker dat u dit label wilt verwijderen.",
        "tags-delete-explanation-active": "<strong>Het label \"$1\" is nog steeds actief, en wordt in de toekomst gebruikt.</strong> Om te verhinderen dat dit gebeurt, gaat u naar de plaats(en) waar is ingesteld dat het label wordt toegevoegd, en past daar de instellingen aan.",
        "tags-delete-reason": "Reden:",
-       "tags-delete-submit": "Deze tag onomkeerbaar verwijderen",
+       "tags-delete-submit": "Dit label onomkeerbaar verwijderen",
        "tags-delete-not-allowed": "Labels die worden gedefinieerd door een uitbreiding kunnen niet worden verwijderd, tenzij de uitbreiding dit specifiek toestaat.",
        "tags-delete-not-found": "Het label \"$1\" bestaat niet.",
        "tags-delete-too-many-uses": "Het label \"$1\" is toegepast op meer dan $2 {{PLURAL:$2|versies}}. Daardoor kan het niet verwijderd worden.",
        "tags-edit-add": "Deze labels toevoegen:",
        "tags-edit-remove": "Deze labels verwijderen:",
        "tags-edit-remove-all-tags": "(alle labels verwijderen)",
-       "tags-edit-chosen-placeholder": "Selecteer een paar labels",
+       "tags-edit-chosen-placeholder": "Selecteer een aantal labels",
        "tags-edit-chosen-no-results": "Er zijn geen overeenkomende labels",
        "tags-edit-reason": "Reden:",
        "tags-edit-revision-submit": "Wijzigingen op {{PLURAL:$1|deze versie|$1 versies}} toepassen",
        "compare-revision-not-exists": "De versie die u hebt opgegeven bestaat niet.",
        "dberr-problems": "Onze excuses. Deze site ondervindt op het moment technische problemen.",
        "dberr-again": "Wacht een aantal minuten en probeer het daarna opnieuw.",
-       "dberr-info": "(Kan geen toegang krijgen tot database: $1)",
-       "dberr-info-hidden": "(Kan geen toegang krijgen tot database)",
+       "dberr-info": "(Kan geen toegang krijgen tot de database: $1)",
+       "dberr-info-hidden": "(Kan geen toegang krijgen tot de database)",
        "dberr-usegoogle": "Wellicht kunt u in de tussentijd zoeken via Google.",
        "dberr-outofdate": "Let op: hun indexen van onze pagina's zijn wellicht niet recent.",
        "dberr-cachederror": "Deze pagina is een kopie uit de cache en is wellicht niet de meest recente versie.",
        "htmlform-cloner-create": "Meer toevoegen",
        "htmlform-cloner-delete": "Verwijderen",
        "htmlform-cloner-required": "Ten minste één waarde is vereist.",
+       "htmlform-title-badnamespace": "[[:$1]] bevindt zich niet in de naamruimte \"{{ns:$2}}\".",
+       "htmlform-title-not-creatable": "\"$1\" is geen paginanaam die aangemaakt kan worden",
        "htmlform-title-not-exists": "[[:$1]] bestaat niet.",
        "htmlform-user-not-exists": "<strong>$1</strong> bestaat niet.",
        "htmlform-user-not-valid": "<strong>$1</strong> is geen geldige gebruikersnaam.",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|heeft}} pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 gemarkeerd als gecontroleerd",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 automatisch gemarkeerd als gecontroleerd",
-       "logentry-newusers-newusers": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
+       "logentry-newusers-newusers": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
        "logentry-newusers-create": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
        "logentry-newusers-create2": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1",
        "logentry-newusers-byemail": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1 en het wachtwoord is per e-mail verzonden",
        "logentry-newusers-autocreate": "Gebruikersaccount $1 {{GENDER:$2|is}} automatisch aangemaakt",
+       "logentry-protect-move_prot": "$1 heeft de beveiligingsinstellingen {{GENDER:$2|verplaatst}} van $4 naar $3",
+       "logentry-protect-unprotect": "$1 heeft de beveiliging {{GENDER:$2|opgeheven}} van $3",
+       "logentry-protect-protect": "$1 heeft $3 {{GENDER:$2|beveiligd}} $4",
+       "logentry-protect-protect-cascade": "$1 heeft $3 {{GENDER:$2|beveiligd}} $4 [cascade]",
+       "logentry-protect-modify": "$1 heeft het beveiligingsniveau van $3 {{GENDER:$2|aangepast}} $4",
+       "logentry-protect-modify-cascade": "$1 heeft het beveiligingsniveau van $3 {{GENDER:$2|aangepast}} $4 [cascade]",
        "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|heeft}} het label \"$4\" gedeactiveerd voor gebruik door gebruikers in robots",
        "log-name-tag": "Labellogboek",
        "log-description-tag": "Op deze pagina wordt weergegeven wanneer gebruikers [[Special:Tags|labels]] hebben toegevoegd of verwijderd van versies of logboekregels. In het logboek is niet opgenomen dat labels zijn toegevoegd als onderdeel van een bewerking, verwijdering of soortgelijke handeling.",
-       "logentry-tag-update-add-revision": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 aan versie $4 van pagina $3 {{GENDER:$2|toegevoegd}}",
-       "logentry-tag-update-add-logentry": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 aan logboekregel $5 van pagina $3 {{GENDER:$2|toegevoegd}}",
-       "logentry-tag-update-remove-revision": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 van versie $4 van pagina $3 {{GENDER:$2|verwijderd}}",
-       "logentry-tag-update-remove-logentry": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 van logboekregel $5 van pagina $3 {{GENDER:$2|verwijderd}}",
+       "logentry-tag-update-add-revision": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 {{GENDER:$2|toegevoegd}} aan versie $4 van pagina $3",
+       "logentry-tag-update-add-logentry": "$1 heeft {{PLURAL:$7|het label|de labels}} $6 {{GENDER:$2|toegevoegd}} aan logboekregel $5 van pagina $3",
+       "logentry-tag-update-remove-revision": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 {{GENDER:$2|verwijderd}} van versie $4 van pagina $3",
+       "logentry-tag-update-remove-logentry": "$1 heeft {{PLURAL:$9|het label|de labels}} $8 {{GENDER:$2|verwijderd}} van logboekregel $5 van pagina $3",
        "logentry-tag-update-revision": "$1 heeft de labels van versie $4 van pagina $3  {{GENDER:$2|bijgewerkt}} ($6 {{PLURAL:$7|toegevoegd}}; $8 {{PLURAL:$9|verwijderd}})",
        "logentry-tag-update-logentry": "$1 heeft de labels van logboekregel $5 van pagina $3 {{GENDER:$2|bijgewerkt}} ($6 {{PLURAL:$7|toegevoegd}}; $8 {{PLURAL:$9|verwijderd}})",
        "rightsnone": "(geen)",
        "expand_templates_html_output": "Ruwe HTML",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Opmerkingen verwijderen",
-       "expand_templates_remove_nowiki": "Tags <nowiki> in resultaat onderdrukken",
+       "expand_templates_remove_nowiki": "Labels <nowiki> in resultaat onderdrukken",
        "expand_templates_generate_xml": "XML-parserboom bekijken",
        "expand_templates_generate_rawhtml": "Ruwe HTML weergeven",
        "expand_templates_preview": "Voorvertoning",
        "log-description-pagelang": "Dit is een logboek van wijzigingen van de taal van pagina's.",
        "logentry-pagelang-pagelang": "$1 heeft de taal van de pagina \"$3\" gewijzigd van $4 naar $5.",
        "default-skin-not-found": "Het standaard uiterlijk voor de wiki, dat is ingesteld in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is niet beschikbaar.\n\nUw installatie heeft {{PLURAL:$4|het volgende uiterlijk|de volgende uiterlijken}}. Zie [https://www.mediawiki.org/wiki/Manual:Skin_configuration Handboek: uiterlijk instellen] voor meer informatie over hoe u het uiterlijk instelt en een standaard uiterlijk aangeeft.\n\n$2\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Het downloaden van tarballs voor uiterlijken van [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git gebruiken voor het downloaden van uiterlijken].\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository.\n\n; Als u MediaWiki net hebt bijgewerkt:\n: In MediaWiki 1.24 en nieuwere versies worden geïnstalleerde uiterlijken niet langer automatisch ingeschakeld (zie [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handboek: uiterlijken automatisch vinden]). U kunt de volgende {{PLURAL:$5|regel|regels}} kopieren naar <code>LocalSettings.php</code> om alle op dit moment geïnstalleerde uiterlijken in te schakelen:\n\n<pre dir=\"ltr\">$3</pre>\n\n; In het geval u zojuist <code>LocalSettings.php</code> hebt aangepast:\n: Controleer de namen van de uiterlijken op spelfouten.",
-       "default-skin-not-found-no-skins": "Het standaard uiterlijk voor uw wiki, als aangegeven in <code>$wgDefaultSkin</code> als <code>$1</code>, is niet beschikbaar.\n\nU hebt geen geïnstalleerde uiterlijken.\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Het downloaden van tarballs voor uiterlijken van [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git gebruiken voor het downloaden van uiterlijken].\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository.",
+       "default-skin-not-found-no-skins": "Het standaard uiterlijk voor uw wiki, als aangegeven in <code>$wgDefaultSkin</code> als <code>$1</code>, is niet beschikbaar.\n\nU hebt geen geïnstalleerde uiterlijken.\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Sinds MediaWiki 1.24 staan er geen skins meer in de hoofdrepository. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Het downloaden van tarballs voor uiterlijken van [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org];\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Git gebruiken voor het downloaden van uiterlijken].\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository. Zie [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skinconfiguratie] voor meer informatie over hoe skins in te schakelen en een standaard te kiezen.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ingeschakeld)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>uitgeschakeld</strong>)",
        "mediastatistics": "Mediastatistieken",
index 61c61ac..8df9450 100644 (file)
@@ -15,7 +15,7 @@
        "tog-numberheadings": "Automuattizesti numeroija kirjutuksien nimet",
        "tog-showtoolbar": "Ozuta ruadovälinehpalki",
        "tog-editondblclick": "Edituiče sivuloi kaksoispainalduksel",
-       "tog-editsectiononrightclick": "Korjua sektsielöi painamal sektsien nimie hiiren oigiel näppäimel",
+       "tog-editsectiononrightclick": "Kohendele sektsielöi painamal sektsien nimie hiiren oigiel näppäimel",
        "tog-watchcreations": "Ližiä minun luajitut sivut da ližätyt failat minun valvonduluvetteloh",
        "tog-watchdefault": "Ližiä minun kohendetut sivut da failat minun valvonduluvetteloh",
        "tog-watchmoves": "Ližiä minun siirretyt sivut da failat minun valvonduluvetteloh",
        "tog-enotifrevealaddr": "Näytä minun sähköpoštuadressii muile lähetettylöis ilmoituksis",
        "tog-shownumberswatching": "Ozuta tädä sivuu tarkailevien käyttäjien miäriä",
        "tog-oldsig": "Nygöine allekirjutus:",
+       "tog-fancysig": "Allekirjutus wikitekstannu (ilmai automuattistu linkii)",
        "tog-uselivepreview": "Käytä välittömiä ezikaččeluu",
        "tog-forceeditsummary": "Huomavuta minuu, gu en olle kirjutannuh yhtehveduo",
-       "tog-watchlisthideown": "Peittiä minun korjavukset valvonduluvettelospäi",
+       "tog-watchlisthideown": "Peitä minun kohendukset valvonduluvettelospäi",
        "tog-watchlisthidebots": "Peitä botan kohendukset valdondulistalpäi",
        "tog-watchlisthideminor": "Peitä pienet kohendukset valvondulistalpäi",
        "tog-watchlisthideliu": "Peitä kirjutannuhuoloin käyttäjien kohendukset valvondulistalpäi",
        "tog-diffonly": "Älä ozuta sivun syväindyö eroverdailun alapuolel",
        "tog-showhiddencats": "Ozuta peitetyt kategouriet",
        "tog-norollbackdiff": "Älä ozuta eroloi, konzu olet ottanuh järilleh aijemban versien järilleh tuondu -toimindol",
+       "tog-useeditwarning": "Ollen lähtemäs sivulpäi iäre tallendamattah muutoksii, huomaita minuu",
+       "tog-prefershttps": "Käytä ainos suojattuu yhtevytty ku olet kirjutannuhes",
        "underline-always": "Ainos",
        "underline-never": "Nikonzu",
-       "underline-default": "Ketun libo livaimen piäazetus",
+       "underline-default": "Käytä livaimen piäazetuksii",
        "editfont-style": "Edituičendualovehen kirjainstiil'u:",
        "editfont-default": "Livaimen piäazetus",
        "editfont-monospace": "Tazalevyhine kirjain",
        "tuesday": "Toinargi",
        "wednesday": "Kolmaspäivy",
        "thursday": "Nelläspäivy",
-       "friday": "Piäteniččy",
+       "friday": "Piätteniččy",
        "saturday": "Suovattu",
        "sun": "Pyh",
-       "mon": "Enzimäinargi",
-       "tue": "Toinargi",
+       "mon": "Enzi",
+       "tue": "Toin",
        "wed": "Kol",
        "thu": "Nel",
        "fri": "Piä",
@@ -79,7 +82,7 @@
        "january-gen": "pakkaskuudu",
        "february-gen": "tuhukuudu",
        "march-gen": "kevätkuudu",
-       "april-gen": "kevätkuudu",
+       "april-gen": "sulakuudu",
        "may-gen": "oraskuudu",
        "june-gen": "kezäkuudu",
        "july-gen": "heinykuudu",
        "hidden-categories": "{{PLURAL:$1|Peitetty kategourii|Peitetyt kategouriet}}",
        "hidden-category-category": "Peitetyt kategouriet",
        "category-subcat-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä alikategourii.|Täs kategouries on nämmä {{PLURAL:$1|subcategory|$1 alikategouriedu}}, kaikkiedah $2.}}",
+       "category-subcat-count-limited": "Täs kategouries on {{PLURAL:$1| alakategourii|$1 alakategouriedu}}.",
        "category-article-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä sivu.|{{PLURAL:$1|Tämä sivu on|$1 Nämmä sivut ollah}} täs kategouries, $2 kaikkiedah.}}",
+       "category-article-count-limited": "{{PLURAL:$1|Tämä sivu on|$1 Nämmä sivut ollah}} täs kategouries.",
        "category-file-count": "{{PLURAL:$2|Täs kategouriis on vaiku tämä failu.| {{PLURAL:$1|Tämä failu on|$1 Nämmä failat ollah}} täs kategouries, $2 kaikkiedah.}}",
        "listingcontinuesabbrev": "(jatko)",
        "index-category": "Indeksiruitut sivut",
        "print": "Pane bumuagale",
        "view": "Kačo",
        "view-foreign": "Kačo saital $1",
-       "edit": "Korjua",
+       "edit": "Kohendele",
        "edit-local": "Edituiče paikallistu kuvavustu",
        "create": "Luaji",
        "create-local": "Ližiä paikalline kuvavus",
-       "editthispage": "Korjua tädä sivuu",
+       "editthispage": "Kohendele tädä sivuu",
        "create-this-page": "Luaji tämä sivu",
        "delete": "Ota iäre",
        "deletethispage": "Ota tämä sivu iäre",
        "disclaimers": "Kieldävymine vastuos",
        "disclaimerpage": "Project:Vastuos kieldävymine",
        "edithelp": "Abu korjuamizeh",
-       "helppage-top-gethelp": "Kyzyö abuu",
+       "helppage-top-gethelp": "Kyzy abuu",
        "mainpage": "Piäsivu",
        "mainpage-description": "Piäsivu",
        "policy-url": "Project:Käytändöt",
        "newmessageslinkplural": "{{PLURAL:$1|uuzi viesti|999=uuzii viestilöi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|jälgimäine muutos|jälgimästy muutostu}}",
        "youhavenewmessagesmulti": "Sinul on uuzii viestilöi sivuloil $1",
-       "editsection": "Korjua",
-       "editold": "korjua",
+       "editsection": "Kohendele",
+       "editold": "kohendele",
        "viewsourceold": "Kačo algukoodu",
-       "editlink": "korjua",
+       "editlink": "kohendele",
        "viewsourcelink": "Kačo algukoodu",
-       "editsectionhint": "Korjua tädä kohtua: $1",
+       "editsectionhint": "Kohendele tädä kohtua: $1",
        "toc": "Sizäldö",
        "showtoc": "ozuttua",
        "hidetoc": "peittiä",
        "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Mindäh olet luadimas tostu käyttäitilii",
-       "createacct-captcha": "Turvallizusvarmistus",
-       "createacct-imgcaptcha-ph": "Kirjuta ylähän olii tekstu",
        "createacct-submit": "Luaji tili",
        "createacct-another-submit": "Luaji tili",
        "createacct-benefit-heading": "Sivun {{SITENAME}} ollah luajittu sinunjyttymät rahvas.",
        "pt-userlogout": "Kirjuttai ullos",
        "php-mail-error-unknown": "Tundematoi haireh PHP:n mail()-funktsies",
        "user-mail-no-addy": "Opit työndiä sähköpoštan sähköpoštuadressittah.",
-       "user-mail-no-body": "Sähköpoštan syväindön pidäy olla pitkembi.",
+       "user-mail-no-body": "Sähköpoštan syväindö pidäy olla suurembi.",
        "changepassword": "Vaihta peittosana",
        "resetpass_announce": "Suaja sizähkirjuamine loppuh, sinul pidäy keksie uuzi peittosana.",
        "resetpass_header": "Vaihta tilin peittosana",
        "hr_tip": "Horizontualine viivu (älä käytä liijakse)",
        "summary": "Yhtehvedo:",
        "subject": "Tiemu/rubriekku:",
-       "minoredit": "Tämä on pieni korjavus",
+       "minoredit": "Tämä on pieni kohendus",
        "watchthis": "Tarkaile tädä sivuu",
        "savearticle": "Tallenda sivu",
        "preview": "Ezikačo",
        "showpreview": "Ezikačo",
-       "showdiff": "Luajitut korjavukset",
+       "showdiff": "Luajitut kohendukset",
        "anoneditwarning": "<strong>Varaitus:</strong> Et ole kirjutannuhes. Luadinet muutoksii syväindölöih, sinun Ip-adressu tulou nägövih kaikile. Ku <strong>[$1 kirjutannuttos]</strong> libo <strong>[$2 registriiruičettos]</strong>, sinun syväindömuutokset nävytäh sinun käyttäinimel, toizien eduloin ližäkse.",
        "summary-preview": "Yhtehvevon ezikačondu:",
-       "subject-preview": "Tiemam ezikačondu:",
+       "subject-preview": "Teeman ezikačondu:",
        "previewerrortext": "Rodih haireh oppijes ezikaččuo muutoksii.",
        "blockedtitle": "Käyttäi on estetty",
        "blockednoreason": "ei viärysty annettu",
        "whitelistedittext": "Sinun pidäy $1 ku edituija sivuloi.",
-       "nosuchsectiontitle": "Nengostu sektua ei ole",
-       "loginreqtitle": "Pidäy kirjautuakseh",
+       "nosuchsectiontitle": "Nengostu sektsiedu ei ole",
+       "loginreqtitle": "Pidäy kirjuttuakseh",
        "loginreqlink": "kirjuttai",
        "loginreqpagetext": "Toizien sivuloin kaččomizekse pidäy $1.",
        "accmailtitle": "Peittosana työtty",
        "editing": "Edituijah sivuu $1",
        "creating": "Luajitah sivuu \"$1\"",
        "editingsection": "Korjuandu $1 (alalugu)",
-       "editingcomment": "Edituijah $1 (uuzi sektu)",
+       "editingcomment": "Edituijah $1 (uuzi sektsii)",
        "yourtext": "Sinun tekstu",
        "yourdiff": "Erot",
        "templatesused": "{{PLURAL:$1|Šablon|Šablonat}} käytetty täl sivul:",
        "template-protected": "(suojattu)",
        "template-semiprotected": "(puolekse suojattu)",
        "hiddencategories": "Tämä sivu kuuluu {{PLURAL:$1|1 peitettyh kategourieh|$1 peitettyh kategourieh}}:",
-       "sectioneditnotsupported-title": "Sektan kohendustu ei tuveta.",
-       "sectioneditnotsupported-text": "Sektan kohendustu ei tuveta täl sivul.",
+       "sectioneditnotsupported-title": "Sektsien kohendustu ei tuveta.",
+       "sectioneditnotsupported-text": "Sektsien kohendustu ei tuveta täl sivul.",
        "permissionserrors": "Ei oigevuksii",
        "permissionserrorstext": "Sinul ei ole lubua toimindoh {{PLURAL:$1|tämän syyn periä|nämmien syylöin periä}}:",
        "permissionserrorstext-withaction": "Sinul ei ole lubua toimindoh $2 niškoi, {{PLURAL:$1|tämän syyn periä|nämmien syylöin periä}}:",
        "moveddeleted-notice": "Tämä sivu on otettu iäre. Sivun iäreotandu- da siirdohistourii ollah annettu al viittavuksennu.",
        "postedit-confirmation-created": "Sivu on nygöi luajittu.",
-       "postedit-confirmation-restored": "Sivus on otettu järilleh sen aijembi versii.",
+       "postedit-confirmation-restored": "Sivun aijembi versii on tuodu järilleh.",
        "postedit-confirmation-saved": "Sinun kohendus tallendettih.",
        "edit-already-exists": "Ei voi luadie uuttu sivuu. Se on jo olemas.",
        "content-model-wikitext": "wikitekstu",
        "content-json-empty-object": "Tyhjy objektu",
        "cantcreateaccounttitle": "Ei voi luadie tunnustu",
        "cantcreateaccount-text": "Tunnuksien luadimine täs IP-adressaspäi ('''$1''') on estetty. Estäjänny on [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy on ''$2''",
-       "cantcreateaccount-range-text": "Tunnuksien luadimine IP-adressilois adressualovehel '''$1''', kuduah kuuluu dai sinun käytetty IP-adressu('''$4'''), on estetty. Eston on azettanuh [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy estole on \"$2\".",
+       "cantcreateaccount-range-text": "Tunnuksien luadimine IP-adressilois adressualovehel '''$1''', kuduah kuuluu sinungi käytetty IP-adressu('''$4'''), on estetty. Eston on azetannuh [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy estole on \"$2\".",
        "viewpagelogs": "Ozuta tämän sivun logat",
        "nohistory": "Täl sivul ei ole kohendushistoriedu.",
        "currentrev": "Jälgimäzin versii",
        "history-feed-description": "Tämän sivun versiihistourii",
        "history-feed-item-nocomment": "$1 ($2)",
        "rev-deleted-user": "(käyttäinimi on otettu iäre)",
-       "rev-deleted-event": "(logan tiijot on otettu iäre)",
+       "rev-deleted-event": "(login tiijot on otettu iäre)",
        "rev-deleted-user-contribs": "[käyttäinimi libo IP-adressu on otettu iäre – edituičendu on peitetty edituičenduluvettelospäi]",
        "rev-delundel": "vaihta nägyvys",
        "rev-showdeleted": "ozuttua",
        "pagehist": "Sivuhistourii",
        "deletedhist": "Iäre otettuloin versielöin histourii",
        "revdelete-offender": "Versien luadii:",
-       "suppressionlog": "Peitändyloga",
+       "suppressionlog": "Peitändylog",
        "mergehistory": "Yhtistä sivuloin edituičenduhistourii",
        "mergehistory-header": "Täl sivul voit yhtistiä lähtehsivun sivuhistourien versielöi uvvemban sivun histourieh. Varmista, ku sivuloin yhtenäine edituičenduhistourii pyzyy eigo mene ristakkai immin-kummin!",
        "mergehistory-box": "Yhtistä kahten sivun versielöi:",
        "action-move-subpages": "siirrä tämä sivu, da sen alisivut",
        "action-movefile": "siirrä tämä failu",
        "enhancedrc-history": "histourii",
-       "recentchanges": "Uvvet korjavukset",
+       "recentchanges": "Uvvet kohendukset",
        "recentchanges-legend": "Tuorehien muutoksien azetukset",
        "recentchanges-summary": "Jällitä kaikkii jälgimäzet muutokset wikih täl sivul.",
        "recentchanges-label-newpage": "Tämä korjavus on johtanuh uvven sivun luadimizeh",
-       "recentchanges-label-minor": "Tämä on pieni korjavus",
+       "recentchanges-label-minor": "Tämä on pieni kohendus",
        "recentchanges-label-bot": "Tämän muutoksen on luadinuh bot",
        "recentchanges-label-unpatrolled": "Tädä korjuandua vie ei ole tarkistettu",
        "recentchanges-label-plusminus": "Sivu on kazvanuh [] baital",
        "boteditletter": "b",
        "rc-change-size-new": "Kogo jälles muutoksii: $1 {{PLURAL:$1|baitu|baitua}}",
        "recentchangeslinked": "Koskijat muutokset",
-       "recentchangeslinked-toolbox": "Toine toizeh liittyjät korjavukset",
+       "recentchangeslinked-toolbox": "Toine toizeh liittyjät kohendukset",
        "recentchangeslinked-title": "Muutokset koskijen sivuu \"$1\"",
        "recentchangeslinked-summary": "Tämä on nengomien sivuloin korjavuksien luvettelo, kudamih viittuau tämä sivu (libo sih kategourieh kuulujat).Sivut, kudamat kuulutah [[Special:Watchlist|teijän valvonduluvettelo]], ollah  <strong>bold</strong>.",
        "recentchangeslinked-page": "Sivun nimi:",
        "whatlinkshere-hidelinks": "$1 linkat",
        "whatlinkshere-filters": "Filtrat",
        "blocklink": "Lukiče",
-       "contribslink": "korjavukset",
+       "contribslink": "kohendukset",
        "movelogpage": "Siirrä loga",
        "export": "Vie sivut",
        "allmessages-language": "Kieli:",
        "tooltip-pt-logout": "Kirjuttai ullos",
        "tooltip-pt-createaccount": "Voit registriiruijakseh da kirjuttuakseh järjestelmäh, ga se ei ole vältämätöi",
        "tooltip-ca-talk": "Pagize piäsivun sizäldös",
-       "tooltip-ca-edit": "Korjua tädä sivuu",
+       "tooltip-ca-edit": "Kohendele tädä sivuu",
        "tooltip-ca-addsection": "Luaji uuzi alalugu",
        "tooltip-ca-viewsource": "Tämä sivu on suojattu. Voit kaččuo sen lähtehkoudan",
        "tooltip-ca-history": "Tämän sivun jälgimäzet muutokset",
        "tooltip-save": "Tallenda muutokset",
        "tooltip-preview": "Ezikačo muutokset. Ole hyvä, luaji nenga ainos enne tallendamistu!",
        "tooltip-diff": "Ozuta sinun luajitut muutokset tekstah",
-       "tooltip-rollback": "Yhtel painalluksel poistua jälgimäine korjavus",
+       "tooltip-rollback": "Yhtel painalluksel poistua jälgimäine kohendus",
        "tooltip-undo": "\"Kumua\" tuou järilleh aijemban edituičenduversien da avuau edituičenduankietan ezikaččelendutilas. Sen vuoh voi ližätä kumuandumotiivan yhtehvevos.",
        "tooltip-summary": "Kirjuta lyhyt kuvavus",
        "simpleantispam-label": "Anti-spam-tarkistus. \n<strong>älä</strong> täytä!",
index 453c8de..f1c204c 100644 (file)
@@ -88,6 +88,7 @@
        "tog-hideminor": "Ukryj drobne edycje z ostatnich zmian",
        "tog-hidepatrolled": "Ukryj sprawdzone edycje w ostatnich zmianach",
        "tog-newpageshidepatrolled": "Ukryj sprawdzone strony na liście nowych stron",
+       "tog-hidecategorization": "Ukryj kategoryzację stron",
        "tog-extendwatchlist": "Pokaż na liście obserwowanych wszystkie zmiany, nie tylko ostatnie",
        "tog-usenewrc": "Grupuj zmiany według stron na liście ostatnich zmian i obserwowanych",
        "tog-numberheadings": "Automatyczna numeracja nagłówków",
        "tog-watchlisthideliu": "Ukryj edycje zalogowanych użytkowników na liście obserwowanych",
        "tog-watchlisthideanons": "Ukryj edycje anonimowych użytkowników na liście obserwowanych",
        "tog-watchlisthidepatrolled": "Ukryj sprawdzone edycje na liście obserwowanych",
+       "tog-watchlisthidecategorization": "Ukryj kategoryzację stron",
        "tog-ccmeonemails": "Przesyłaj mi kopie wiadomości, które wysyłam do innych użytkowników",
        "tog-diffonly": "Nie pokazuj treści stron pod porównaniami zmian",
        "tog-showhiddencats": "Pokazuj ukryte kategorie",
        "createaccountreason": "Powód:",
        "createacct-reason": "Powód",
        "createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
-       "createacct-captcha": "Kontrola bezpieczeństwa",
-       "createacct-imgcaptcha-ph": "Wpisz tekst widoczny powyżej",
        "createacct-submit": "Utwórz konto",
        "createacct-another-submit": "Utwórz konto",
        "createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
        "passwordreset-emailsent-capture": "Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.",
        "passwordreset-emailerror-capture": "Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
-       "changeemail-header": "Zmiana adresu e‐mail",
+       "changeemail-header": "Wypełnij ten formularz, aby zmienić swój adres e-mail. Jeśli chcesz usunąć swój adres e-mail, to przy wypełnianiu formularza pozostaw puste pole nowego adresu e-mail.",
        "changeemail-passwordrequired": "Musisz podać swoje hasło, aby potwierdzić tę zmianę.",
        "changeemail-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
        "changeemail-oldemail": "Obecny adres e‐mail:",
        "showingresultsinrange": "Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
+       "search-nonefound-thiswiki": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
        "powersearch-ns": "Przeszukaj przestrzenie nazw:",
        "powersearch-togglelabel": "Zaznacz:",
        "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
        "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez Ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].",
        "savedprefs": "Twoje preferencje zostały zapisane.",
+       "savedrights": "Zapisano uprawnienia {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
        "timezonelegend": "Strefa czasowa:",
        "localtime": "Czas lokalny:",
        "timezoneuseserverdefault": "Użyj domyślnej dla tej wiki ($1)",
        "badsig": "Nieprawidłowy podpis, sprawdź znaczniki HTML.",
        "badsiglength": "Twój podpis jest zbyt długi.\nDopuszczalna długość to $1 {{PLURAL:$1|znak|znaki|znaków}}.",
        "yourgender": "Płeć:",
-       "gender-unknown": "nie określono",
-       "gender-male": "mężczyzna",
-       "gender-female": "kobieta",
+       "gender-unknown": "Oprogramowanie, gdy będzie to możliwe, będzie korzystać z neutralnych słów",
+       "gender-male": "Jest zarejestrowany",
+       "gender-female": "Jest zarejestrowana",
        "prefs-help-gender": "Podanie płci nie jest obowiązkowe. Jeśli zdecydujesz się ją określić, oprogramowanie dostosuje do niej interfejs. Informacja o Twojej płci będzie widoczna dla wszystkich.",
        "email": "E‐mail",
        "prefs-help-realname": "Imię i nazwisko jest opcjonalne.\nJeśli je podasz, to może być stosowane w celu przypisania Twojej pracy.",
        "rcshowhidemine": "$1 moje edycje",
        "rcshowhidemine-show": "Pokaż",
        "rcshowhidemine-hide": "Ukryj",
+       "rcshowhidecategorization": "$1 kategoryzację stron",
+       "rcshowhidecategorization-show": "Pokaż",
+       "rcshowhidecategorization-hide": "Ukryj",
        "rclinks": "Pokaż ostatnie $1 zmian w ciągu ostatnich $2 dni.<br />$3",
        "diff": "różn.",
        "hist": "hist.",
        "recentchanges-page-added-to-category-bundled": "dodano [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} do kategorii",
        "recentchanges-page-removed-from-category": "usunięto [[:$1]] z kategorii",
        "recentchanges-page-removed-from-category-bundled": "usunięto [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} z kategorii",
+       "autochange-username": "Automatyczna zmiana MediaWiki",
        "upload": "Prześlij plik",
        "uploadbtn": "Prześlij plik",
        "reuploaddesc": "Przerwij wysyłanie i wróć do formularza wysyłki",
        "upload-dialog-button-done": "Gotowe",
        "upload-dialog-button-save": "Zapisz",
        "upload-dialog-button-upload": "Prześlij",
-       "upload-process-error": "Wystąpił błąd",
-       "upload-process-warning": "Pojawiło się ostrzeżenie",
        "upload-form-label-select-file": "Wybierz plik",
        "upload-form-label-infoform-title": "Szczegóły",
        "upload-form-label-infoform-name": "Nazwa",
        "foreign-structured-upload-form-label-own-work-message-local": "Potwierdzam, że wysyłam ten plik zgodnie z warunkami i zasadami licencjowania obowiązującymi na {{SITENAME}}.",
        "foreign-structured-upload-form-label-not-own-work-message-local": "Jeśli nie możesz wysłać tego pliku zgodnie z zasadami obowiązującymi na {{SITENAME}}, zamknij ten komunikat i spróbuj innej metody.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Jeśli nie jesteś w stanie przesłać tego pliku zgodnie z zasadami współdzielonego repozytorium, zamknij to okno i spróbuj innej metody.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Oświadczam, że mam prawa autorskie do tego pliku, nieodwołalnie publikuję go na Wikimedia Commons na licencji [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons BY-SA 4.0] i zgadzam się na [https://wikimediafoundation.org/wiki/Terms_of_Use warunki użytkowania].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Jeżeli nie masz praw autorskich do tego pliku albo chcesz go opublikować na innej licencji, rozważ użycie [https://commons.wikimedia.org/wiki/Special:UploadWizard kreatora przesyłania plików].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Możesz spróbować użyć [[Special:Upload|kreatora przesyłania plików {{GRAMMAR:D.lp|{{SITENAME}}}}]], jeżeli wolontariusze {{GRAMMAR:D.lp|{{SITENAME}}}} dopuszczają publikację plików na własnych zasadach.",
        "backend-fail-stream": "Nie można odczytać pliku $1.",
        "backend-fail-backup": "Nie można utworzyć kopii zapasowej pliku  $1 .",
        "backend-fail-notexists": "Plik  $1  nie istnieje.",
        "nopagetext": "Wybrana strona docelowa nie istnieje.",
        "pager-newer-n": "{{PLURAL:$1|1 nowszy|$1 nowsze|$1 nowszych}}",
        "pager-older-n": "{{PLURAL:$1|1 starszy|$1 starsze|$1 starszych}}",
-       "suppress": "Rewizor",
+       "suppress": "Ukryj (oversight)",
        "querypage-disabled": "Ta strona specjalna została wyłączona ze względu na ograniczenia wydajności.",
        "apihelp": "Pomoc API",
        "apihelp-no-such-module": "Moduł \"$1\" nie znaleziony.",
        "booksources-text": "Poniżej znajduje się lista odnośników do innych witryn, które pośredniczą w sprzedaży nowych i używanych książek, a także mogą posiadać dalsze informacje na temat poszukiwanej przez Ciebie książki.",
        "booksources-invalid-isbn": "Podany numer ISBN został rozpoznany jako nieprawidłowy. Sprawdź czy podany numer zgadza się z numerem zaczerpniętym ze źródła.",
        "specialloguserlabel": "Kto:",
-       "speciallogtitlelabel": "Co (tytuł lub użytkownik):",
+       "speciallogtitlelabel": "Co (tytuł lub {{ns:user}}:nick użytkownika):",
        "log": "Rejestr operacji",
        "all-logs-page": "Wszystkie publiczne operacje",
        "alllogstext": "Wspólny rejestr wszystkich typów operacji dla {{GRAMMAR:D.lp|{{SITENAME}}}}.\nMożesz zawęzić liczbę wyników poprzez wybranie typu rejestru, nazwy użytkownika albo tytułu strony.",
        "deletepage": "Usuń stronę",
        "confirm": "Potwierdź",
        "excontent": "treść: „$1”",
-       "excontentauthor": "treść: „$1” (jedyny autor: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "treść: „$1”, jedyny autor: „[[Special:Contributions/$2|$2]]” ([[User talk:$2|dyskusja]])",
        "exbeforeblank": "poprzednia zawartość, obecnie pustej strony: „$1”",
        "delete-confirm": "Usuwanie „$1”",
        "delete-legend": "Usuń",
        "confirmemail_text": "Projekt {{SITENAME}} wymaga weryfikacji adresu e‐mail przed użyciem funkcji korzystających z poczty.\nWciśnij przycisk poniżej aby wysłać na swój adres list z linkiem do strony WWW.\nList będzie zawierał link do strony, w którym zakodowany będzie identyfikator.\nOtwórz ten link w przeglądarce, czym potwierdzisz, że jesteś użytkownikiem tego adresu e‐mail.",
        "confirmemail_pending": "Kod potwierdzenia został właśnie do Ciebie wysłany. Jeśli zarejestrował{{GENDER:|eś|aś|eś(‐aś)}} się niedawno, poczekaj kilka minut na dostarczenie wiadomości przed kolejną prośbą o wysłanie kodu.",
        "confirmemail_send": "Wyślij kod potwierdzenia",
-       "confirmemail_sent": "Wiadomość e‐mail z kodem uwierzytelniającym została wysłana.",
+       "confirmemail_sent": "Wiadomość z kodem uwierzytelniającym została wysłana.",
        "confirmemail_oncreate": "Link z kodem potwierdzenia został wysłany na Twój adres e‐mail.\nKod ten nie jest wymagany do zalogowania się, jednak będziesz musiał go aktywować otwierając, otrzymany link, w przeglądarce przed włączeniem niektórych opcji e‐mail na wiki.",
        "confirmemail_sendfailed": "Nie udało się wysłać potwierdzającej wiadomości e‐mail.\nSprawdź poprawność adresu pod kątem literówki.\n\nSystem pocztowy zwrócił komunikat: $1",
        "confirmemail_invalid": "Błędny kod potwierdzenia.\nKod może być przedawniony.",
        "logentry-newusers-byemail": "Konto $3 zostało utworzone przez użytkownika $1, hasło wysłano e-mailem",
        "logentry-newusers-autocreate": "$1 automatycznie {{GENDER:$2|utworzył|utworzyła|utworzył}} konto użytkownika",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|przeniósł|przeniosła}} ustawienia zabezpieczeń z $4 do $3",
-       "logentry-protect-unprotect": "$1 {{GENDER:$2|usunął|usunęła}} zabezpieczanie z $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|usunął|usunęła}} zabezpieczenie z $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|zabezpieczył|zabezpieczyła|zabezpieczył(a)}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zabezpieczył|zabezpieczyła|zabezpieczył(a)}} $3 $4 [kaskadowo]",
        "logentry-protect-modify": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} poziom zabezpieczenia dla $3 $4",
index 7d0c45f..51ebe45 100644 (file)
@@ -12,6 +12,7 @@
        "tog-hideminor": "په وروستيو بدلونو کې واړه سمونونه پټول",
        "tog-hidepatrolled": "په وروستيو بدلونونو کې څارل شوې سمونونه پټول",
        "tog-newpageshidepatrolled": "د نوؤ مخونو په لړليک کې کتل شوي مخونه پټول",
+       "tog-hidecategorization": "په وېشنيزو کې د مخونو وېشنه پټول",
        "tog-extendwatchlist": "يوازې د وروستني بدلونونو د ښکاره کولو لپاره نه بلکه د ټولو بدلونونو د ښکاره کولو لپاره کتنلړ غځول",
        "tog-usenewrc": "په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه",
        "tog-numberheadings": "د سرليکونو خپلکاره شمېرايښودنه",
@@ -41,6 +42,7 @@
        "tog-watchlisthideliu": "په کتنلړ کې د ثبت شويو کارنانو سمونې پټول",
        "tog-watchlisthideanons": "په کتنلړ کې د ورکنومو کارنانو سمونې پټول",
        "tog-watchlisthidepatrolled": "په کتنلړ کې څارل شوې سمونې پټول",
+       "tog-watchlisthidecategorization": "په وېشنيزو کې د مخونو وېشنه پټول",
        "tog-ccmeonemails": "هغه برېښليکونه چې زه يې نورو ته لېږم، د هغو يوه کاپي دې ماته هم راشي",
        "tog-diffonly": "د توپيرونو نه لاندې د مخ مېنځپانگه پټول",
        "tog-showhiddencats": "پټې وېشنيزې ښکاره کول",
        "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ولې تاسې بل گڼون جوړول غوااړۍ",
-       "createacct-captcha": "امنيتي تدبير",
-       "createacct-imgcaptcha-ph": "پورته ښکاره شوی متن دلته وټاپئ",
        "createacct-submit": "گڼون مو جوړ کړئ",
        "createacct-another-submit": "گڼون جوړول",
-       "createacct-benefit-heading": "{{SITENAME}} ستاسې په شان خلکو لخوا جوړ شوی.",
+       "createacct-benefit-heading": "{{SITENAME}} ستاسې په څېر خلکو جوړ کړی.",
        "createacct-benefit-body1": "{{PLURAL:$1|سمون|سمونونه}}",
        "createacct-benefit-body2": "{{PLURAL:$1|مخ|مخونه}}",
        "createacct-benefit-body3": "{{PLURAL:$1|وروستنی ونډه وال|وروستني ونډه وال}}",
        "sig_tip": "ستاسې لاسليک د وخت د ټاپې سره",
        "hr_tip": "څنډيزه ليکه (ددې په کارولو کې سپما وکړۍ)",
        "summary": "لنډيز:",
-       "subject": "سکالو/سرليک:",
+       "subject": "سکالو:",
        "minoredit": "دا يو وړوکی سمون دی",
        "watchthis": "همدا مخ کتل",
        "savearticle": "مخ خوندي کول",
        "anonpreviewwarning": "''تاسې غونډال ته نه ياست ننوتي. خوندي کولو سره به ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.''",
        "missingcommenttext": "لطفاً تبصره لاندې وليکۍ.",
        "summary-preview": "د لنډيز مخليدنه:",
-       "subject-preview": "سکاÙ\84Ù\88/سرÙ\84Ù\8aÚ© مخليدنه:",
+       "subject-preview": "د Ø³Ú©Ø§Ù\84Ù\88 مخليدنه:",
        "previewerrortext": "د بدلونونو د مخليدنو په وخت کې مو يوه ستونزه رامېنځ ته شوه.",
        "blockedtitle": "پر کارن بنديز لگېدلی",
        "blockedtext": "'''ستاسې د کارن-نوم يا آی پي پتې مخنيوی شوی.'''\n\nهمدا بنديز د $1 له خوا پر تاسې لږېدلی. او د همدې کړنې سبب ''$2'' دی.\n\n* د بنديز د پېل نېټه: $8\n* د بنديز د پای نېټه: $6\n* بنديزونه دي پر: $7\n\nتاسې کولای شی چې د $1 او يا هم د يو بل [[{{MediaWiki:Grouppage-sysop}}|پازوال]] سره اړيکې ټينگې کړی او د بنديز ستونزې مو هوارې کړی.\nتاسې نه شی کولای چې د 'کارن ته برېښلک لېږل' کړنې نه گټه پورته کړی تر څو چې تاسې د خپل گڼون په [[Special:Preferences|غوره توبونو]] کې يوه کره برېښليک پته نه وي ځانگړې کړې او تر دې بريده چې پر تاسې د هغې د کارولو بنديز نه وي لگېدلی.\nستاسې د دم مهال آی پي پته $3 ده، او ستاسې د بنديز پېژند #$5 دی. مهرباني وکړۍ د خپلې يادونې پر مهال د دغو دوو څخه د يوه او يا هم د دواړو ورکول مه هېروۍ.",
        "rcshowhidemine": "زما سمونې $1",
        "rcshowhidemine-show": "ښکاره کول",
        "rcshowhidemine-hide": "پټول",
+       "rcshowhidecategorization-show": "ښکاره کول",
+       "rcshowhidecategorization-hide": "پټول",
        "rclinks": "هغه وروستي $1 بدلونونه ښکاره کړی چې په $2 ورځو کې پېښ شوي<br />$3",
        "diff": "توپير",
        "hist": "پېښليک",
        "newpageletter": "ن",
        "boteditletter": "ر",
        "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]",
-       "rc_categories": "د Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 Ø¨Ø±Ù\8aدÙ\88Ù\86ه (په \"|\" بېلول)",
+       "rc_categories": "د Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 ØªØ± Ø¨Ø±Ù\8aده (په \"|\" بېلول)",
        "rc_categories_any": "له ټاکل شويو هر يو",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته",
        "newsectionsummary": "/* $1 */ نوې برخه",
        "recentchangeslinked-summary": "دا د هغه بدلونونو لړليک دی چې وروستۍ ځل په تړن لرونکيو مخونو کې د يوه ځانگړي مخ (او يا هم د يوې ځانگړې وېشنيزې غړو) نه رامېنځ ته شوي.\n[[Special:Watchlist|ستاسې د کتنلړ]] مخونه په '''زغرد ليک''' کې ښکاري.",
        "recentchangeslinked-page": "د مخ نوم:",
        "recentchangeslinked-to": "د ورکړل شوي مخ پر ځای د اړونده تړلي مخونو بدلونونه ښکاره کول",
+       "recentchanges-page-added-to-category": "[[:$1]] وېشنيزې کې ورگډ شو",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] او {{PLURAL:$2|يو مخ|$2 مخونه}} وېشنيزې کې ورگډ شول",
+       "recentchanges-page-removed-from-category": "[[:$1]] له وېشنيزې وغورځول شو",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] او {{PLURAL:$2|يو مخ|$2 مخونه}} له وېشنيزې وغورځول شول",
+       "autochange-username": "د مېډياويکي خپلکاره بدلون",
        "upload": "دوتنه پورته کول",
        "uploadbtn": "دوتنه پورته کول",
        "reuploaddesc": "پورته کېدنه ناگارل او بېرته د پورته کېدنې فورمې ته ورگرځېدل",
        "upload-dialog-button-done": "ترسره شو",
        "upload-dialog-button-save": "خوندي کول",
        "upload-dialog-button-upload": "پورته کول",
-       "upload-process-error": "يوه ستونزه پېښه شوې",
-       "upload-process-warning": "يوه گواښنه رامېنځ ته شوه",
        "upload-form-label-select-file": "دوتنه ټاکل",
        "upload-form-label-infoform-title": "ځانگړنې",
        "upload-form-label-infoform-name": "نوم",
        "upload-form-label-infoform-description": "څرگندونه",
        "upload-form-label-usage-title": "کارېدنې",
        "upload-form-label-usage-filename": "د دوتنې نوم",
+       "foreign-structured-upload-form-label-infoform-categories": "وېشنيزې",
+       "foreign-structured-upload-form-label-infoform-date": "نېټه",
        "backend-fail-notexists": "د $1 په نوم دوتنه نشته.",
        "backend-fail-delete": "د \"$1\" دوتنه ړنګه نه شوه.",
        "backend-fail-alreadyexists": "د $1 دوتنه له پخوا نه شته.",
        "movenotallowedfile": "تاسې د دوتنو د لېږدولو پرېښله نلرۍ.",
        "cant-move-user-page": "تاسې د کارن مخونو د لېږدولو پرېښله نلرۍ (د څېرمه مخونو نه پرته).",
        "cant-move-to-user-page": "تاسې د يو کارن مخ ته د يوه بل مخ د لېږدولو پرېښله نلرۍ (د يو کارن د څېرمه مخ نه پرته).",
-       "newtitle": "نوي سرليک ته:",
+       "newtitle": "نوی سرليک:",
        "move-watch": "همدا مخ کتل",
        "movepagebtn": "مخ لېږدول",
        "pagemovedsub": "لېږدول په برياليتوب سره ترسره شوه",
        "htmlform-cloner-create": "نور ورگډول",
        "htmlform-cloner-delete": "غورځول",
        "htmlform-cloner-required": "لږ تر لږه يو ارزښت ته اړتيا شته.",
+       "htmlform-title-not-exists": "[[:$1]] نشته.",
+       "htmlform-user-not-exists": "<strong>$1</strong> نشته.",
        "logentry-delete-delete": "$1 د $3 مخ {{GENDER:$2|ړنگ کړ}}",
        "revdelete-content-hid": "مېنځپانگه پټېدلې",
        "revdelete-uname-hid": "کارن نوم پټ شوی",
        "special-characters-group-thai": "تايلنډي",
        "special-characters-group-lao": "لاوي",
        "special-characters-group-khmer": "خمري",
-       "mw-widgets-titleinput-description-new-page": "پدې نوم لا تر اوسه پورې مخ نشته",
-       "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځول"
+       "mw-widgets-titleinput-description-new-page": "تر اوسه پورې دا مخ نشته",
+       "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځېدنه"
 }
index 9711ee9..192b927 100644 (file)
@@ -85,7 +85,8 @@
                        "L",
                        "Walesson",
                        "Rhcastilhos",
-                       "Claudio Emanuel Weiler"
+                       "Claudio Emanuel Weiler",
+                       "Almondega"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que você está criando outra conta",
-       "createacct-captcha": "Verificação de segurança",
-       "createacct-imgcaptcha-ph": "Digite o texto acima",
        "createacct-submit": "Crie sua conta",
        "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feita por pessoas como você.",
        "prefs-help-recentchangescount": "Isto inclui mudanças recentes, histórico de páginas e registros.",
        "prefs-help-watchlist-token2": "Esta é a senha secreta para o feed da Web com sua lista de tokens vigiados.\nQualquer pessoa que descobrir esta senha será capaz de ler sua lista, então não a compartilhe.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram salvas.",
+       "savedrights": "Os direitos de usuário de {{GENDER:$1|$1}} foram salvos.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Horário local:",
        "timezoneuseserverdefault": "Utilizar padrão do wiki ($1)",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Salvar",
        "upload-dialog-button-upload": "Enviar",
-       "upload-process-error": "Ocorreu um erro",
-       "upload-process-warning": "Ocorreu um aviso",
        "upload-form-label-select-file": "Selecionar arquivo",
        "upload-form-label-infoform-title": "Detalhes",
        "upload-form-label-infoform-name": "Nome",
        "tooltip-ca-nstab-main": "Ver a página de conteúdo",
        "tooltip-ca-nstab-user": "Ver a página de usuário",
        "tooltip-ca-nstab-media": "Ver a página de mídia",
-       "tooltip-ca-nstab-special": "Esta é uma página especial. Não é possível editar seu conteúdo de forma direta.",
+       "tooltip-ca-nstab-special": "Esta é uma página especial e não pode ser editada",
        "tooltip-ca-nstab-project": "Ver a página de projeto",
        "tooltip-ca-nstab-image": "Ver a página de arquivo",
        "tooltip-ca-nstab-mediawiki": "Ver a mensagem de sistema",
index 17d678c..486ad66 100644 (file)
        "tog-watchlisthideliu": "Esconder edições de utilizadores autenticados ao listar mudanças às páginas vigiadas",
        "tog-watchlisthideanons": "Esconder edições de utilizadores anónimos ao listar mudanças às páginas vigiadas",
        "tog-watchlisthidepatrolled": "Esconder edições patrulhadas ao listar mudanças às páginas vigiadas",
+       "tog-watchlisthidecategorization": "Ocultar categorização de páginas",
        "tog-ccmeonemails": "Enviar-me cópias das mensagens por correio electrónico que eu enviar a outros utilizadores",
        "tog-diffonly": "Não mostrar o conteúdo da página ao comparar duas edições",
        "tog-showhiddencats": "Mostrar categorias ocultas",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Porque está a criar outra conta",
-       "createacct-captcha": "Verificação de segurança",
-       "createacct-imgcaptcha-ph": "Digite o texto que vê acima",
        "createacct-submit": "Crie a sua conta",
        "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feito por pessoas como você.",
        "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
        "changeemail": "Alterar ou remover o endereço de correio eletrónico",
-       "changeemail-header": "Alterar o endereço de correio eletrónico da conta",
+       "changeemail-header": "Complete este formulário para alterar o seu endereço de correio eletrónico. Se quer eliminar a associação de qualquer endereço de correio eletrónico com a sua conta, deixe em branco o novo endereço de correio eletrónico ao submeter o formulário.",
        "changeemail-passwordrequired": "Necessita de introduzir a sua palavra-passe para confirmar esta alteração.",
        "changeemail-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
        "prefs-help-recentchangescount": "Inclui mudanças recentes, histórico de páginas e registos.",
        "prefs-help-watchlist-token2": "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.\nQualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram gravadas.",
+       "savedrights": "Os privilégios de utilizador para {{GENDER:$1|$1}} foram gravados.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar padrão da wiki ($1)",
        "recentchangeslinked-summary": "Esta é uma lista de mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
+       "recentchanges-page-added-to-category": "[[:$1]] foi adicionada à categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram adicionadas à categoria",
+       "recentchanges-page-removed-from-category": "[[:$1]] foi removida da categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram removidas da categoria",
        "upload": "Carregar ficheiro",
        "uploadbtn": "Carregar ficheiro",
        "reuploaddesc": "Cancelar o envio e voltar ao formulário de carregamento",
        "upload-dialog-button-done": "Feito",
        "upload-dialog-button-save": "Gravar",
        "upload-dialog-button-upload": "Carregar",
-       "upload-process-error": "Ocorreu um erro",
-       "upload-process-warning": "Ocorreu um aviso",
        "upload-form-label-select-file": "Selecionar ficheiro",
        "upload-form-label-infoform-title": "Detalhes",
        "upload-form-label-infoform-name": "Nome",
        "nopagetext": "A página de destino que especificou não existe.",
        "pager-newer-n": "{{PLURAL:$1|posterior|$1 posteriores}}",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
-       "suppress": "Supervisor",
+       "suppress": "Suprimir",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "apihelp": "Ajuda API",
        "apihelp-no-such-module": "Módulo \"$1\" não encontrado.",
index 6b593ce..7298f4e 100644 (file)
                        "Robin0van0der0vliet",
                        "TTO",
                        "J. 'mach' wust",
-                       "Ciencia Al Poder"
+                       "Ciencia Al Poder",
+                       "Aursani"
                ]
        },
        "sidebar": "{{notranslate}}",
        "tog-hideminor": "[[Special:Preferences]], tab 'Recent changes'. Offers user to hide minor edits in recent changes or not. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-hidepatrolled": "Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-newpageshidepatrolled": "Toggle in [[Special:Preferences]], section \"Recent changes\" (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}",
+       "tog-hidecategorization": "Option in \"Recent changes\" tab of [[Special:Preferences]]. Offers user to hide/show categorization of pages. Appears next to messages such as {{msg-mw|tog-hideminor}}.",
        "tog-extendwatchlist": "[[Special:Preferences]], tab 'Watchlist'. Offers user to show all applicable changes in watchlist (by default only the last change to a page on the watchlist is shown). {{Gender}}",
        "tog-usenewrc": "{{Gender}}\nUsed as label for the checkbox in [[Special:Preferences]], tab \"Recent changes\".\n\nOffers user to use alternative representation of [[Special:RecentChanges]] and watchlist.",
        "tog-numberheadings": "[[Special:Preferences]], tab 'Misc'. Offers numbered headings on content pages to user. {{Gender}}",
        "tog-watchlisthideliu": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthideanons": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthidepatrolled": "Option in Watchlist tab of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlisthidecategorization": "Option in Watchlist tab of [[Special:Preferences]]. Offers user to hide/show categorization of pages. Appears next to checkboxes with labels such as {{msg-mw|tog-watchlisthideminor}}.",
        "tog-ccmeonemails": "Option in [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}. {{Gender}}",
        "tog-diffonly": "Toggle option used in [[Special:Preferences]]. {{Gender}}",
        "tog-showhiddencats": "Toggle option used in [[Special:Preferences]]. {{Gender}}",
        "createaccountreason": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED\n\n{{Identical|Reason}}",
        "createacct-reason": "In create account form, label for field to enter reason to create an account when already logged-in.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Reason}}",
        "createacct-reason-ph": "Placeholder in vertical-layout create account form for reason field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
-       "createacct-captcha": "Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.",
        "createacct-imgcaptcha-help": "{{Optional}} Optional help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.\n\nBlank by default.",
-       "createacct-imgcaptcha-ph": "Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.",
        "createacct-submit": "Submit button on vertical-layout create account form.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-another-submit": "Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.\n\nThe original means \"create an account in addition to the one you already have\"; sometimes, but not always, it means you are going to \"Create the account on behalf of somebody else\" or \"Create account for another\".\n{{Identical|Create another account}}",
        "createacct-benefit-heading": "In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nIf in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.",
        "sig_tip": "This is the text that appears when you hover the mouse over the second key from the right on the edit toolbar.\n{{Identical|Signature with timestamp}}",
        "hr_tip": "This is the text that appears when you hover the mouse over the first button on the right on the edit toolbar.",
        "summary": "The Summary text beside the edit summary field\n\nSee also:\n* {{msg-mw|Subject}}\nSee also:\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}\n{{Identical|Summary}}",
-       "subject": "Used as label for input box in the EditPage page.\n\nSee also:\n* {{msg-mw|Summary}}",
+       "subject": "Used as label for input box in the EditPage page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
        "minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "watchthis": "Text of checkbox above {{msg-mw|Showpreview}} button in editor.\n\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}\n{{Identical|Watch this page}}",
        "savearticle": "Text on the Save page button. See also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}\n{{Identical|Save page}}",
        "permissionserrors": "Used as title of error message.\n\nSee also:\n* {{msg-mw|loginreqtitle}}\n{{Identical|Permission error}}",
        "permissionserrorstext": "This message is \"without action\" version of {{msg-mw|Permissionserrorstext-withaction}}.\n\nParameters:\n* $1 - the number of reasons that were found why ''the action'' cannot be performed",
        "permissionserrorstext-withaction": "This message is \"with action\" version of {{msg-mw|Permissionserrorstext}}.\n\nParameters:\n* $1 - the number of reasons that were found why the action cannot be performed\n* $2 - one of the action-* messages (for example {{msg-mw|action-edit}}) or other such messages tagged with {{tl|doc-action}} in their documentation\n\nPlease report at [[Support]] if you are unable to properly translate this message. Also see [[phab:T16246]] (now closed) for background.",
+       "contentmodelediterror": "Error message shown when trying to edit an old revision with a content model different from that of the current revision\n* $1 - content model of the old revision\n* $2 - content model of the current revision",
        "recreate-moveddeleted-warn": "Warning shown when creating a page which has already been deleted. See for example [[Test]].",
        "moveddeleted-notice": "Shown on top of a deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
        "moveddeleted-notice-recent": "Shown on top of a recently deleted page in normal view modus ([{{canonicalurl:Test}} example]).",
        "showingresultsinrange": "Used in pagination of [[Special:MostLinkedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\n* $3 - the number of last item in the batch shown\n\nSee also {{msg-mw|Showingresults}}",
        "search-showingresults": "Used in search results of [[Special:Search]]. Parameters:\n* $1 - minimum offset\n* $2 - maximum offset\n* $3 - total number of results\n* $4 - number of results",
        "search-nonefound": "Message shown when a search returned no results (when using the default MediaWiki search engine).",
+       "search-nonefound-thiswiki": "Message shown when a search in current wiki returned no results (when using the default MediaWiki search engine) but search in other wikis did return results.",
        "powersearch-legend": "Advanced search\n\n{{Identical|Advanced search}}",
        "powersearch-ns": "Used in the extended search form at [[Special:Search]]",
        "powersearch-togglelabel": "Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: \"Select\" as verb.\n{{Identical|Check}}",
        "prefs-help-recentchangescount": "Used in [[Special:Preferences]], tab \"Recent changes\".",
        "prefs-help-watchlist-token2": "Used in [[Special:Preferences]], tab Watchlist. (Formerly in {{msg-mw|prefs-help-watchlist-token}}.)",
        "savedprefs": "This message appears after saving changes to your user preferences.",
+       "savedrights": "This message appears after saving the user rights on [[Special:UserRights]].\n* $1 - The user name of the user which rights was saved.",
        "timezonelegend": "{{Identical|Time zone}}",
        "localtime": "Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].",
        "timezoneuseserverdefault": "[[Special:Preferences]] > Date and time > Time zone\n\nThis option lets your time zone setting use the one that is used on the wiki (often UTC).\n\nParameters:\n* $1 - timezone name, or timezone offset (in \"%+03d:%02d\" format)",
        "rcshowhidemine": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidemine-show}} or {{msg-mw|rcshowhidemine-hide}}",
        "rcshowhidemine-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.\n\nSee also:\n* {{msg-mw|rcshowhidemine-hide}}\n{{Identical|show}}",
        "rcshowhidemine-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.\n\nSee also:\n* {{msg-mw|rcshowhidemine-show}}\n{{Identical|hide}}",
+       "rcshowhidecategorization": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidecategorization-show}} or {{msg-mw|rcshowhidecategorization-hide}}",
+       "rcshowhidecategorization-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidecategorization}}.\n\nSee also:\n* {{msg-mw|rcshowhidecategorization-hide}}\n{{Identical|show}}",
+       "rcshowhidecategorization-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidecategorization}}.\n\nSee also:\n* {{msg-mw|rcshowhidecategorization-show}}\n{{Identical|hide}}",
        "rclinks": "Used on [[Special:RecentChanges]].\n* $1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".\n* $2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".\n* $3 - a block of text that consists of other messages.<br />&nbsp;Example: \"''Hide minor edits{{int:pipe-separator}}Show bots{{int:pipe-separator}}Hide anonymous users{{int:pipe-separator}}Hide logged-in users{{int:pipe-separator}}Hide patrolled edits{{int:pipe-separator}}Hide my edits''\"\nList elements are separated by {{msg-mw|Pipe-separator}} each. Each list element is, or contains, a link.",
        "diff": "Short form of \"differences\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...\n{{Identical|Diff}}",
        "hist": "Short form of \"history\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...",
        "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]],\n[[Special:Disambiguations]], etc}}",
+       "specialpages-group-pages": "{{doc-special-group|like=[[Special:AllPages]], [[Special:PrefixIndex]], [[Special:Categories]], 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}}",
index 3693e3a..6703c51 100644 (file)
@@ -35,6 +35,7 @@
        "tog-hideminor": "Ascunde modificările minore din schimbările recente",
        "tog-hidepatrolled": "Ascunde modificările patrulate din schimbările recente",
        "tog-newpageshidepatrolled": "Ascunde paginile patrulate din lista de pagini noi",
+       "tog-hidecategorization": "Ascunde categorisirea paginilor",
        "tog-extendwatchlist": "Extinde lista de articole urmărite pentru a arăta toate schimbările efectuate, nu doar pe cele mai recente",
        "tog-usenewrc": "Grupează modificările după pagină în cadrul schimbărilor recente și listei paginilor urmărite",
        "tog-numberheadings": "Numerotează automat secțiunile",
@@ -64,6 +65,7 @@
        "tog-watchlisthideliu": "Ascunde modificările efectuate de utilizatori autentificați din lista de pagini urmărite",
        "tog-watchlisthideanons": "Ascunde modificările făcute de utilizatori anonimi din lista de pagini urmărite",
        "tog-watchlisthidepatrolled": "Ascunde paginile patrulate din lista de pagini urmărite",
+       "tog-watchlisthidecategorization": "Ascunde categorisirea paginilor",
        "tog-ccmeonemails": "Doresc să primesc o copie a mesajelor e-mail pe care le trimit altor utilizatori",
        "tog-diffonly": "Nu arăta conținutul paginii sub dif",
        "tog-showhiddencats": "Arată categoriile ascunse",
        "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "De ce creați un alt cont",
-       "createacct-captcha": "Verificare de securitate",
-       "createacct-imgcaptcha-ph": "Introduceți textul pe care îl vedeți deasupra",
        "createacct-submit": "Creați-vă contul",
        "createacct-another-submit": "Creează contul",
        "createacct-benefit-heading": "{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.",
        "permissionserrors": "Eroare de permisiune",
        "permissionserrorstext": "Nu aveți permisiune pentru a face acest lucru, din următoarele {{PLURAL:$1|motiv|motive}}:",
        "permissionserrorstext-withaction": "Nu aveți permisiunea să $2, din {{PLURAL:$1|următorul motiv|următoarele motive}}:",
+       "contentmodelediterror": "Nu puteți modifica această versiune, deoarece modelul de conținut al acesteia este <code>$1</code>, iar actualul model de conținut al paginii este <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Atenție: Recreați o pagină care a fost ștearsă anterior.'''\n\nAsigurați-vă că este oportună recrearea acestei pagini.\nJurnalul ștergerilor și al mutărilor pentru această pagină este disponibil:",
        "moveddeleted-notice": "Această pagină a fost ștearsă.\nJurnalul ștergerilor și al redenumirilor este disponibil mai jos.",
        "moveddeleted-notice-recent": "Ne cerem scuze, dar această pagină a fost ștearsă recent (în ultimele 24 de ore).\nJurnalele de ștergere și redenumire ale paginii sunt disponibile mai jos cu scop informativ.",
        "showingresultsinrange": "Mai jos se afișează un număr de până la {{PLURAL:$1|<strong>1</strong> rezultat|<strong>$1</strong> rezultate|<strong>$1</strong> de rezultate}} din intervalul #<strong>$2</strong> la #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultatul <strong>$1</strong> din <strong>$3</strong>|Rezultatele <strong>$1 - $2</strong> din <strong>$3</strong>}}",
        "search-nonefound": "Nu sunt rezultate conforme interogării.",
+       "search-nonefound-thiswiki": "Nu sunt rezultate conforme interogării pe acest site.",
        "powersearch-legend": "Căutare avansată",
        "powersearch-ns": "Căutare în spațiile de nume:",
        "powersearch-togglelabel": "Selectare:",
        "prefs-help-recentchangescount": "Sunt incluse schimbările recente, istoricul paginilor și jurnalele.",
        "prefs-help-watchlist-token2": "Aceasta este cheia secretă pentru fluxul web al listei dumneavoastră de pagini urmărite.\nOricine o cunoaște vă va putea citi lista de pagini urmărite, așa că n-o partajați cu nimeni.\n[[Special:ResetTokens|Faceți clic aici dacă doriți să o resetați]].",
        "savedprefs": "Preferințele dumneavoastră au fost salvate.",
+       "savedrights": "Drepturile utilizatorului {{GENDER:$1|$1}} au fost salvate.",
        "timezonelegend": "Fus orar:",
        "localtime": "Ora locală:",
        "timezoneuseserverdefault": "Folosește ora implicită a wikiului ($1)",
        "rcshowhidemine": "$1 contribuțiile mele",
        "rcshowhidemine-show": "Arată",
        "rcshowhidemine-hide": "Ascunde",
+       "rcshowhidecategorization": "$1 categorisirea paginilor",
+       "rcshowhidecategorization-show": "Arată",
+       "rcshowhidecategorization-hide": "Ascunde",
        "rclinks": "Se arată ultimele $1 modificări din ultimele $2 zile.<br />\n$3",
        "diff": "dif",
        "hist": "ist",
        "upload-dialog-button-done": "Realizat",
        "upload-dialog-button-save": "Salvare",
        "upload-dialog-button-upload": "Încarcă",
-       "upload-process-error": "A apărut o eroare",
-       "upload-process-warning": "A apărut o atenționare",
        "upload-form-label-select-file": "Selectează fișier",
        "upload-form-label-infoform-title": "Detalii",
        "upload-form-label-infoform-name": "Nume",
index a19444d..38f16df 100644 (file)
        "createaccountreason": "Mutive:",
        "createacct-reason": "Mutive",
        "createacct-reason-ph": "Purcé tu ste ccreje 'n'otre cunde utende?",
-       "createacct-captcha": "Verifiche de securezze",
-       "createacct-imgcaptcha-ph": "Mitte 'u teste tune aqquà sus",
        "createacct-submit": "Ccreje 'u cunde utende tune",
        "createacct-another-submit": "Ccreje 'nu cunde utende",
        "createacct-benefit-heading": "{{SITENAME}} jè fatte da crestiane cumme a te.",
        "passwordreset-emailsent-capture": "'Na e-mail pe azzeramende d'a passuord ha state mannate, ca jè fatte vedè aqquà sotte.",
        "passwordreset-emailerror-capture": "'Na e-mail de azzeramende d'a passuord ha state generate, ca jè fatte vedè aqquà sotte, ma 'u 'nvie a {{GENDER:$2|l'utende}} ha fallite: $1",
        "changeemail": "Cange o live 'u 'ndirizze e-mail",
-       "changeemail-header": "Cange 'u 'ndirizze e-mail d'u cunde",
+       "changeemail-header": "Comblete stu module pe cangià 'u 'ndirizze email. Ce tu vuè ccu live l'associazione cu ogne indirizze email da 'u cunde tune, lasse 'u 'ndirizze email vacande quanne conferme 'u module.",
        "changeemail-no-info": "Tu a essere collegate pe accedere a sta pàgene direttamende.",
        "changeemail-oldemail": "Indirizze e-mail de mò:",
        "changeemail-newemail": "Indirizze e-mail nuève:",
        "missingsummary": "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu riepileghe de le cangiaminde.\nCe tu cazze Reggistre 'n'otra vote, 'u cangiamende tue avène memorizzete senze une.",
        "selfredirect": "<strong>Attenziò:</strong> Tu ste redirezione sta pàgene da sule.\nTu puè avè specificate 'a destinazione sbagliate pe stu redirezionamende, o tu ste cange 'a pàgena sbagliate.\nCe tu cazze \"{{int:savearticle}}\" arrete, 'u redirezionamende avène ccrejate 'u stesse.",
        "missingcommenttext": "Pe piacere mitte 'nu commende aqquà sotte.",
-       "missingcommentheader": "'''Arrecuèrdete:''' Tu non g'è provvedute a 'nu soggette/testate pe stu commende.\nCe tu cazze \"{{int:savearticle}}\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
+       "missingcommentheader": "<strong>Arrecuèrdete:</strong> Tu non g'è provvedute a 'nu soggette pe stu commende.\nCe tu cazze \"{{int:savearticle}}\" 'n'otra vote, 'u cangiamende tune avène memorizzate senze jidde.",
        "summary-preview": "Andeprime d'u riepileghe:",
-       "subject-preview": "Andeprime de l'Oggette/Testete:",
+       "subject-preview": "Andeprime de l'Oggette:",
        "previewerrortext": "'N'errore ha assute quanne ste facive l'andeprime de le cangiaminde.",
        "blockedtitle": "L'utende è blocchete",
        "blockedtext": "''''U nome de l'utende o l'indirizze IP ha state bloccate.'''\n\n'U blocche ha state fatte da $1.\n'U mutive date jè ''$2''.\n\n* 'U Blocche accumenze: $8\n* 'U Blocche spicce: $6\n* Tipe de blocche: $7\n\nTu puè condatta $1 o n'otre [[{{MediaWiki:Grouppage-sysop}}|amministratore]] pe 'ngazzarte sus a 'u blocche.\nTu non ge puè ausà 'u strumende 'manne 'na mail a stu utende' senza ca mitte n'indirizze e-mail valide jndr'à le\n[[Special:Preferences|preferenze tue]] e ce è state blocchete sus 'a l'use sue.\nL'IP ca tine mò jè $3 e 'u codece d'u blocche jè #$5.\nPe piacere mitte ste doje 'mbormaziune ce manne 'na richieste de sblocche.",
        "mergehistory-go": "Fà vedè le cangiaminde ca se ponne squagghià 'nzieme",
        "mergehistory-submit": "Scuagghije 'nzieme le revisiune",
        "mergehistory-empty": "Nisciuna revisione pò essere scuagghiate.",
-       "mergehistory-done": "$3 {{PLURAL:$3|revisione|revisiune}} de $1 onne state scuagghiate jndr'à [[:$2]] correttamende.",
+       "mergehistory-done": "$3 {{PLURAL:$3|revisione|revisiune}} de $1 {{PLURAL:$3|ha|onne}} state scuagghiate jndr'à [[:$2]].",
        "mergehistory-fail": "Non ge se pò fa vedè 'a storie d'u scuagghiamende, pe piacere verifiche 'n'otra vota a pàgene e le parametre de l'orarie.",
        "mergehistory-fail-toobig": "Non ge pozze combletà 'u scuagghiamende s'u cunde purcé supranesce 'u limite de $1 {{PLURAL:$1|revisione|revisiune}} ca onna essere spustate.",
        "mergehistory-no-source": "'A pàgena sorgende $1 non g'esiste.",
        "upload-dialog-button-done": "Fatte",
        "upload-dialog-button-save": "Reggìstre",
        "upload-dialog-button-upload": "Careche",
-       "upload-process-error": "Ave assute 'n'errore",
-       "upload-process-warning": "Ha assute 'n'avvise",
        "upload-form-label-select-file": "Scacchie 'u file",
        "upload-form-label-infoform-title": "Dettaglie",
        "upload-form-label-infoform-name": "Nome",
        "upload-form-label-infoform-description": "Descrizione",
        "upload-form-label-usage-title": "Ause",
        "upload-form-label-usage-filename": "Nome d'u file",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorije",
        "foreign-structured-upload-form-label-infoform-date": "Date",
        "backend-fail-stream": "Non ge pozze trasmettere 'u file $1.",
        "backend-fail-backup": "Non ge pozze cupià 'u file $1.",
        "deletepage": "Scangille 'a pàgene",
        "confirm": "Conferme",
        "excontent": "'u condenute ere: '$1'",
-       "excontentauthor": "'u condenute ere: '$1' (e l'uneche condrebbutore ere '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "'u condenute ere: '$1' e l'uneche condrebbutore ere \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|'ngazzamende]])",
        "exbeforeblank": "'u condenute apprime d'a pulizie ere: '$1'",
        "delete-confirm": "Scangille \"$1\"",
        "delete-legend": "Scangille",
        "move-page-legend": "Spuèste 'a pàgene",
        "movepagetext": "Ausanne 'u form aqquà sotte ste cange 'u nome d'a pàgene, spustanne tutte 'a storia soje sus a 'u nome nuéve.\nU' vecchie titole devènde 'nu ridirezionamende sus 'a pàgena nove.\nTu puè aggiornà 'u ridirezionamende ca apponde a 'u titole origgenale automaticamende.\nCe tu no ste scacchie, sta secure de condrollà [[Special:DoubleRedirects|doppie ridirezionaminde]] o [[Special:BrokenRedirects|ridirezionaminde scuasciate]].\nTu si 'u responsabbile de quidde ca cumbine, assicurate ca 'u collegamende condinue a appondà addò avessa scè.\n\nVide Bbuene ca 'a pàgene '''non''' g'avène spustate ce esiste n'otra pàgene cu 'u titole nuéve, a mene ca jè vacande o jè 'na pàgene de ridirezionamende senza storie.\nQuieste significhe ca tu puè fà turnà 'u vecchie nome 'a pàgene ce jedde ha state renomenate e t'è rese conde ca è fatte 'na studecarije sovrascrevènne 'na pàgene esistende.\n\n'''ATTENZIONE!'''\nQuiste pò essere 'nu cangiamende drastiche e inaspettate de 'na pàgene famose assaje;\npe piacere a essere secure-secure de le conseguenze apprime de condinuà.",
        "movepagetext-noredirectfixer": "Ausanne 'u module aqquà sotte puè renomenà 'na pàgene, spustanne tutte 'a storia soje sotte a 'u nome nuève.\n'U titele vecchie addevende 'na pàgene de ridirezionamende a 'u titele nuève.\nMe raccomande condrolle le redirezionaminde [[Special:DoubleRedirects|a doppie]] o [[Special:BrokenRedirects|scuasciate]].\nTu si responsabbele de assicurarte ca le collagaminde appondene a 'u punde giuste.\n\nVide ca 'a pàgene '''non''' g'avene spustate ce già stè 'na pàgene cu 'u titele nuève, a meno che non g'è vacande o jè 'nu ridirezionamende e non ge tène 'na storie de cangiaminde.\nQuiste signifeche ca jè possibbele renominà 'na pàgene accume se chiamave apprime addò tu è fatte 'n'errore e non g'è possibbele sovrascirevere 'na pàgene esistende.\n\n'''Fà Attenziò!'''\nQuiste pò essere 'nu cangiamende inaspettate pe 'na pàgene popolare;\nPe piacere ha essere secure secure de avere capite le conzeguenze apprime de scè nnande.",
-       "movepagetalktext": "'A pagene de le 'ngazzaminde associete avène spustete automaticamende ce però:\n\n* Ste 'na pàgene de 'ngazzaminde chiena sotte 'a vôsce nova, o\n* Non ge signe 'u cieck box de sotte.\n\nJndr'à ste case, 'a pàgene non g'avène spustete e pò t'a cupià a màne 'u codenute sue.",
+       "movepagetalktext": "Ce tu cazze sta buatte, 'A pàgene de le 'ngazzaminde associate avène spustate automaticamende, sembre ca non g'esisite 'n'otra pàgene de le 'ngazzaminde.\n\nJndr'à stu case, 'a pàgene non g'avène spustate e pò t'a cupià a màne 'u condenute sue.",
        "moveuserpage-warning": "'''Attenziò:''' Tu stè spuèste 'na pàgene utende. Vide bbuène ca sulamende 'a pàgene avène spustate ma l'utende ''non'' g'avene renomenate.",
        "movecategorypage-warning": "<strong>Attenziò:</strong> Tu vuè ccu spuéste 'na pàgene categorije. Vide ca sulamende 'a pàgene avène spustate ma tutte le pàggene ca stonne jndr'à categorije <em>non</em> g'avène spustate sotte a quedda nove.",
        "movenologintext": "Tu a essere 'n'utende reggistrete e [[Special:UserLogin|colleghete]] pe spustà 'na pàgene.",
        "cant-move-to-user-page": "Tu non ge tìne 'u permesse pe spustà 'na pàgene a 'na pàgene utende (sulamende pe le sottopàggene de l'utinde).",
        "cant-move-category-page": "Tu non ge tìne 'u permesse pe spustà le pàggene de categorije.",
        "cant-move-to-category-page": "Tu non ge tìne 'u permesse pe spustà 'na pàgena cumme 'na pàgene de categorije.",
-       "newtitle": "A 'u titele nuève:",
+       "newtitle": "Titole nuève:",
        "move-watch": "condrolle sta pàgene",
        "movepagebtn": "Spueste 'a pàgene",
        "pagemovedsub": "Spustaminde eseguite",
        "logentry-newusers-create2": "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1",
        "logentry-newusers-byemail": "'U cunde utende $3 ha state {{GENDER:$2|ccrejate}} da $1 e 'a passuord ha state mannate pe e-mail",
        "logentry-newusers-autocreate": "'U cunde utende $1 ha state {{GENDER:$2|ccrejate}} automaticamende",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|ave spustate}} le 'mbostaziune de protezzione da $4 a $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|ave luate}} 'a protezzione da $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ptuette}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|prutette}} $3 $4 [a cascate]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ave cangiate}} 'u levélle de protezzione pe $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ave cangiate}} 'u levélle de protezzione pe $3 $4 [a cascate]",
        "logentry-rights-rights": "$1 membre d'u gruppe {{GENDER:$2|cangiate}} pe $3 da $4 a $5",
        "logentry-rights-rights-legacy": "$1 ave {{GENDER:$2|cangiate}} 'u membre d'u gruppe pe $3",
        "logentry-rights-autopromote": "$1 ha state {{GENDER:$2|promosse}} automaticamende da $4 a $5",
index cd70f92..183c3cb 100644 (file)
                        "Normalex",
                        "WindEwriX",
                        "Nzeemin",
-                       "INS Pirat"
+                       "INS Pirat",
+                       "Краснорядцева Елена"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "tog-hideminor": "Скрывать малые правки из списка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
+       "tog-hidecategorization": "Скрывать категоризацию страниц",
        "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние",
        "tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
        "tog-numberheadings": "Автоматически нумеровать заголовки",
        "tog-watchlisthideliu": "Скрывать правки представившихся участников из списка наблюдения",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
+       "tog-watchlisthidecategorization": "Скрывать категоризацию страниц",
        "tog-ccmeonemails": "Отправлять мне копии писем, которые я посылаю другим участникам",
        "tog-diffonly": "Не показывать содержание страницы под сравнением двух версий",
        "tog-showhiddencats": "Показывать скрытые категории",
        "viewsource": "Просмотр",
        "viewsource-title": "Просмотр исходного текста страницы $1",
        "actionthrottled": "Ограничение по скорости",
-       "actionthrottledtext": "Ð\92 ÐºÐ°Ñ\87еÑ\81Ñ\82ве Ð¼ÐµÑ\80Ñ\8b Ð±Ð¾Ñ\80Ñ\8cбÑ\8b Ñ\81о Ñ\81памом, Ñ\83Ñ\81Ñ\82ановлено Ð¾Ð³Ñ\80аниÑ\87ение Ð½Ð° Ð¼Ð½Ð¾Ð³Ð¾ÐºÑ\80аÑ\82ное Ð¿Ñ\80именение Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f Ð² Ñ\82еÑ\87ение ÐºÐ¾Ñ\80оÑ\82кого Ð¿Ñ\80омежÑ\83Ñ\82ка Ð²Ñ\80емени. Пожалуйста, повторите попытку через несколько минут.",
+       "actionthrottledtext": "Ð\94лÑ\8f Ð±Ð¾Ñ\80Ñ\8cбÑ\8b Ñ\81о Ñ\81памом Ð±Ñ\8bло Ñ\83Ñ\81Ñ\82ановлено Ð¾Ð³Ñ\80аниÑ\87ение Ð½Ð° Ð¼Ð°ÐºÑ\81ималÑ\8cное Ñ\87иÑ\81ло Ð¿Ð¾Ð¿Ñ\8bÑ\82ок Ð²Ñ\8bполнениÑ\8f Ñ\8dÑ\82ого Ð´ÐµÐ¹Ñ\81Ñ\82виÑ\8f Ð² ÐºÐ¾Ñ\80оÑ\82кий Ð¿Ñ\80омежÑ\83Ñ\82ок Ð²Ñ\80емени â\80\94 Ð¸ Ð²Ñ\8b Ð¸Ñ\81Ñ\87еÑ\80пали Ñ\8dÑ\82оÑ\82 Ð»Ð¸Ð¼Ð¸Ñ\82. Пожалуйста, повторите попытку через несколько минут.",
        "protectedpagetext": "Эта страница защищена для предотвращения её редактирования или совершений других действий.",
        "viewsourcetext": "Вы можете просмотреть и скопировать исходный текст этой страницы.",
        "viewyourtext": "Вы можете просмотреть и скопировать исходный текст <strong>ваших правок</strong> на этой странице.",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зачем вы создаёте другую учетную запись",
-       "createacct-captcha": "Проверка безопасности",
-       "createacct-imgcaptcha-ph": "Введите текст, который вы видите выше",
        "createacct-submit": "Создать учётную запись",
        "createacct-another-submit": "Создать учётную запись",
        "createacct-benefit-heading": "{{SITENAME}} — совместный труд таких же людей, как вы.",
        "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
        "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
        "changeemail": "Изменить или удалить адрес электронной почты",
-       "changeemail-header": "Изменение адреса электронной почты",
+       "changeemail-header": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Если вы хотите отвязать свой адрес электронной почты от учётной записи, то при заполнении формы оставьте пустым поле нового адреса электронной почты.",
+       "changeemail-passwordrequired": "Чтобы подтвердить это изменение, вам нужно будет ввести свой пароль.",
        "changeemail-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
        "changeemail-oldemail": "Текущий адрес электронной почты:",
        "changeemail-newemail": "Новый адрес электронной почты:",
        "missingsummary": "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}» ваши изменения будут сохранены без комментария.",
        "selfredirect": "<strong>Внимание:</strong> Вы создаёте перенаправление на ту же самую статью.\nВозможно, Вы выбрали неправильную целевую страницу для перенаправления или редактируете не ту страницу.\nЕсли Вы нажмёте кнопку «{{int:savearticle}}» ещё раз, перенаправление всё же будет создано.",
        "missingcommenttext": "Пожалуйста, введите ниже ваше сообщение.",
-       "missingcommentheader": "'''Напоминание.''' Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
+       "missingcommentheader": "<strong>Напоминание.</strong> Вы не указали тему/заголовок для этого комментария.\nПри повторном нажатии на кнопку «{{int:savearticle}}», ваша правка будет записана без заголовка.",
        "summary-preview": "Описание будет:",
-       "subject-preview": "Заголовок будет:",
+       "subject-preview": "Заголовок будет выглядеть так:",
        "previewerrortext": "При попытке отобразить предварительный просмотр ваших изменений произошла ошибка.",
        "blockedtitle": "Участник заблокирован",
        "blockedtext": "'''Ваша учётная запись или IP-адрес заблокированы.'''\n\nБлокировка произведена администратором $1.\nУказана следующая причина: «''$2''».\n\n* Начало блокировки: $8\n* Окончание блокировки: $6\n* Цель блокировки: $7\n\nВы можете связаться с $1 или любым другим [[{{MediaWiki:Grouppage-sysop}}|администратором]], чтобы обсудить блокировку.\nОбратите внимание, что не сможете использовать функцию «письмо участнику», если в своих [[Special:Preferences|персональных настройках]] не задали или не подтвердили корректный адрес электронной почты, или если ваша блокировка включает запрет отправки писем подобным образом.\nВаш IP-адрес — $3, идентификатор блокировки — $5.\nПожалуйста, указывайте эти сведения в любых своих обращениях.",
        "permissionserrors": "Ошибка прав доступа",
        "permissionserrorstext": "У вас нет прав на выполнение этой операции по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "permissionserrorstext-withaction": "У вас нет прав на $2 по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
+       "contentmodelediterror": "Вы не можете редактировать эту версию, поскольку её моделью содержимого является <code>$1</code>, а текущая модель содержимого страницы — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Внимание. Вы пытаетесь воссоздать страницу, которая ранее удалялась.'''\n\nПроверьте, действительно ли вам нужно воссоздавать эту страницу.\nНиже приведены журналы удалений и переименований этой страницы.",
        "moveddeleted-notice": "Эта страница была удалена.\nДля справки ниже показаны соответствующие записи из журналов удалений и переименований.",
        "moveddeleted-notice-recent": "К сожалению, эта страница была недавно удалена (в течение последних 24 часов).\nНиже для справки приведены журналы удаления и перемещения для этой страницы.",
        "parser-template-loop-warning": "Обнаружена петля в шаблонах: [[$1]]",
        "parser-template-recursion-depth-warning": "Превышен предел глубины рекурсии шаблона ($1)",
        "language-converter-depth-warning": "Превышен предел глубины преобразователя языков ($1)",
-       "node-count-exceeded-category": "Странице, на которых превышено число узлов",
+       "node-count-exceeded-category": "Страницы, на которых превышено число узлов",
        "node-count-exceeded-category-desc": "У страницы превышено максимально допустимое число узлов.",
        "node-count-exceeded-warning": "Страница, на которой превышено максимально допустимое число узлов.",
        "expansion-depth-exceeded-category": "Страницы с превышением глубины раскрытия",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
+       "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу на этом сайте.",
        "powersearch-legend": "Расширенный поиск",
        "powersearch-ns": "Поиск в пространствах имён:",
        "powersearch-togglelabel": "Отметить:",
        "prefs-help-recentchangescount": "Включает свежие правки, истории страниц, журналы.",
        "prefs-help-watchlist-token2": "Это секретный ключ для веб-канала вашего списка наблюдений.\nЛюбой, кто знает его, сможет читать ваш список наблюдения, поэтому не сообщайте его другим. [[Special:ResetTokens|Нажмите здесь, если вам нужно сбросить его]].",
        "savedprefs": "Ваши настройки сохранены.",
+       "savedrights": "Права пользователя {{GENDER:$1|$1}} были сохранены.",
        "timezonelegend": "Часовой пояс:",
        "localtime": "Местное время:",
        "timezoneuseserverdefault": "Использовать настройки сервера ($1)",
        "rcshowhidemine": "$1 свои правки",
        "rcshowhidemine-show": "Показать",
        "rcshowhidemine-hide": "Скрыть",
+       "rcshowhidecategorization": "$1 категоризацию страницы",
+       "rcshowhidecategorization-show": "Показать",
+       "rcshowhidecategorization-hide": "Скрыть",
        "rclinks": "Показать последние $1 изменений за $2 дней<br />$3",
        "diff": "разн.",
        "hist": "история",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Сохранить",
        "upload-dialog-button-upload": "Загрузить",
-       "upload-process-error": "Произошла ошибка",
-       "upload-process-warning": "Появилось предупреждение",
        "upload-form-label-select-file": "Выбрать файл",
        "upload-form-label-infoform-title": "Подробности",
        "upload-form-label-infoform-name": "Имя",
        "foreign-structured-upload-form-label-not-own-work-message-local": "Если Вы не можете загрузить этот файл в соответствиями с правилами сайта {{SITENAME}}, пожалуйста, закройте это диалоговое окно и попробуйте другой метод.",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Возможно, вы также захотите попробовать [[Special:Upload|страницу загрузки по умолчанию]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Я понимаю, что загружаю этот файл в общий репозиторий. Я подтверждаю, что я делаю это в соответствии с пользовательским соглашением и лицензионной политикой.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Если Вы не можете загрузить этот файл в соответствиями с правилами общего хранилища, пожалуйста, закройте это диалоговое окно и попробуйте другой метод.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "В том случае, если этот файл может быть загружен в соответствии с правилами сайта {{SITENAME}}, вы также можете попробовать использовать его [[Special:Upload|страницу загрузки]].",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Я подтверждаю, что являюсь владельцем авторских прав на этот файл, и соглашаюсь на безотзывной основе разместить этот файл на Викискладе под лицензией [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0], а также соглашаюсь с [https://wikimediafoundation.org/wiki/Условия_использования Условиями использования].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Если вы не являетесь владельцем авторских прав на этот файл, или вы хотите выпустить его под другой лицензией, рассмотрите возможность использования [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастера загрузки на Викисладе].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "В том случае, если этот файл может быть загружен в соответствии с правилами сайта {{SITENAME}}, вы также можете попробовать использовать его [[Special:Upload|страницу загрузки]].",
        "backend-fail-stream": "Не удалось транслировать файл $1.",
        "backend-fail-backup": "Невозможно сделать резервную копию файла $1.",
        "backend-fail-notexists": "Файл $1 не существует.",
        "move-page-legend": "Переименование страницы",
        "movepagetext": "Воспользовавшись нижеприведённой формой, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое.\nВы можете автоматически обновить перенаправления, которые вели на старое название.\nЕсли вы этого не сделаете, пожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если уже существует страница с названием, идентичным выбранному, кроме случаев, когда такая страница пуста или представляет собой перенаправление, и при этом не имеет истории правок.\nЭто означает, что сделав ошибочное переименование, вы можете переименовать страницу обратно в то название, которое у неё только что было, но не можете случайно затереть существующую страницу.\n\n<strong>Предупреждение!</strong>\nПереименование популярных страниц может привести к масштабным и неожиданным изменениям.\nПожалуйста, прежде чем продолжать, убедитесь, что понимаете все возможные последствия.",
        "movepagetext-noredirectfixer": "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое название.\nПожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если страница с новым названием уже существует, кроме случаев, если она пуста или представляет собой перенаправление, и при этом не имеет истории правок.\nЭто означает, что сделав ошибочное переименование, вы сможете переименовать страницу обратно в то название, которое у неё только что было, но не сможете случайно затереть существующую страницу.\n\n<strong>Предупреждение!</strong>\nПереименование может привести к масштабным и неожиданным изменениям для популярных страниц.\nПожалуйста, прежде чем продолжить, убедитесь, что понимаете все возможные последствия.",
-       "movepagetalktext": "Ð\9fÑ\80иÑ\81оединÑ\91ннаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ð±Ñ\83деÑ\82 Ñ\82акже Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¿ÐµÑ\80еименована, '''кÑ\80оме Ñ\81лÑ\83Ñ\87аев, ÐºÐ¾Ð³Ð´Ð°:'''\n\n*Ð\9dе Ð¿Ñ\83Ñ\81Ñ\82аÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ð¿Ð¾Ð´ Ñ\82аким Ð¶Ðµ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ð¸Ð»Ð¸\n*Ð\92Ñ\8b Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82авили Ð³Ð°Ð»Ð¾Ñ\87кÑ\83 Ð² Ð¿Ð¾Ð»Ðµ Ð½Ð¸Ð¶Ðµ.\n\nÐ\92 Ñ\8dÑ\82иÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85, Ð²Ñ\8b Ð±Ñ\83деÑ\82е Ð²Ñ\8bнÑ\83жденÑ\8b Ð¿ÐµÑ\80емеÑ\81Ñ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¾Ð±Ñ\8aединиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð²Ñ\80Ñ\83Ñ\87нÑ\83Ñ\8e, ÐµÑ\81ли Ñ\8dÑ\82о Ð½Ñ\83жно.",
+       "movepagetalktext": "Ð\95Ñ\81ли Ð²Ñ\8b Ð¾Ñ\82меÑ\82иÑ\82е Ñ\8dÑ\82оÑ\82 Ð¿Ñ\83нкÑ\82, Ñ\81вÑ\8fзаннаÑ\8f Ñ\81 Ð½ÐµÐ¹ Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ð±Ñ\83деÑ\82 Ñ\82акже Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¿ÐµÑ\80еименована, ÐµÑ\81ли Ñ\82олÑ\8cко Ñ\83же Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ð½ÐµÐ¿Ñ\83Ñ\81Ñ\82аÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ñ\81 Ñ\82аким Ð¶Ðµ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼.\n\nÐ\92 Ñ\8dÑ\82ом Ñ\81лÑ\83Ñ\87ае Ð²Ð°Ð¼ Ð½Ñ\83жно Ð±Ñ\83деÑ\82 Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¾Ð±Ñ\8aединиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð²Ñ\80Ñ\83Ñ\87нÑ\83Ñ\8e, ÐµÑ\81ли Ñ\8dÑ\82о Ð½ÐµÐ¾Ð±Ñ\85одимо.",
        "moveuserpage-warning": "'''Внимание.''' Вы собираетесь переименовать страницу участника. Пожалуйста, обратите внимание, что переименована будет только страница, участник '''не''' будет переименован.",
        "movecategorypage-warning": "<strong>Предупреждение:</strong> Вы собираетесь переименовать страницу категории. Пожалуйста, обратите внимание, что будет переименована только эта страница, а все страницы старой категории <em>не</em> будут перекатегоризованы в новую.",
        "movenologintext": "Вы должны [[Special:UserLogin|представиться системе]],\nчтобы иметь возможность переименовать страницы.",
        "svg-long-error": "Неправильный SVG-файл: $1",
        "show-big-image": "Исходный файл",
        "show-big-image-preview": "Размер при предпросмотре: $1.",
+       "show-big-image-preview-differ": "Размер этого $3-превью для исходного $2-файла: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Другое разрешение|Другие разрешения}}: $1.",
        "show-big-image-size": "$1 × $2 пикселей",
        "file-info-gif-looped": "закольцованный",
        "tags-edit-revision-submit": "Применить изменения к {{PLURAL:$1|этой версии|$1 версиям}}",
        "tags-edit-logentry-submit": "Применить изменения к {{PLURAL:$1|этой записи журнала|$1 записям журнала}}",
        "tags-edit-success": "Изменения были успешно применены.",
-       "tags-edit-failure": "Ð\98зменениÑ\8f Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80именениÑ\82Ñ\8c.\n$1",
+       "tags-edit-failure": "Изменения не удалось применить.\n$1",
        "tags-edit-nooldid-title": "Не задана целевая версия",
        "tags-edit-nooldid-text": "Вы не задали целевую версию (версии) для выполнения этой функции, или указанная версия не существует.",
        "tags-edit-none-selected": "Пожалуйста, выберите по крайней мере один тег, чтобы добавить или удалить.",
index b36de28..96b8e89 100644 (file)
        "nologin": "सदस्यता नास्ति किम् ? $1",
        "nologinlink": "सदस्यता प्राप्यताम्",
        "createaccount": "सदस्यता प्राप्यताम्",
-       "gotaccount": "पà¥\82रà¥\8dवमà¥\87व à¤¯à¥\8bà¤\9cà¤\95ः अस्ति किम् ? $1",
+       "gotaccount": "पà¥\82रà¥\8dवमà¥\87व à¤¸à¤¦à¤¸à¥\8dयः अस्ति किम् ? $1",
        "gotaccountlink": "प्रविश्यताम्",
        "userlogin-resetlink": "स्वस्य प्रवेशविवरणानि विस्मृतानि किम् ?",
        "userlogin-resetpassword-link": "स्वस्य कूटशब्दः विस्मृतः किम् ?",
        "loginsuccesstitle": "स्वागतं ! प्रवेशः सिद्धः ।",
        "loginsuccess": "भवता/भवत्या {{SITENAME}} इत्यत्र \"$1\"-योजकत्वेन प्रवेशः प्राप्तः ।",
        "nosuchuser": "'''$1''' नाम्नः न कोऽपि योजकः विद्यते ।\n\nप्रयोक्तृनामानि पक्षानुगुणं (case sensitive) भवन्ति ।\n\nयत् टङ्कितं, तत् पश्यतु अथवा [[Special:UserLogin/signup|नूतनसदस्यता प्राप्यताम्]] ।",
-       "nosuchusershort": "'''$1''' à¤¨à¤¾à¤®à¥\8dनà¤\83 à¤¨ à¤\95à¥\8bऽपि à¤¯à¥\8bà¤\9cà¤\95ः विद्यते ।\n\nयत् टङ्कितं, तत् पश्यतु ।",
+       "nosuchusershort": "'''$1''' à¤¨à¤¾à¤®à¥\8dनà¤\83 à¤¨ à¤\95à¥\8bऽपि à¤¸à¤¦à¤¸à¥\8dयः विद्यते ।\n\nयत् टङ्कितं, तत् पश्यतु ।",
        "nouserspecified": "भवता/भवत्या एकं योग्यं प्रयोक्तृनाम अवश्यमेव दातव्यम् ।",
-       "login-userblocked": "à¤\8fषà¤\83 à¤¯à¥\8bà¤\9cà¤\95ः प्रतिबन्धितः । प्रवेष्टुम् अनुमतिः नास्ति ।",
+       "login-userblocked": "à¤\8fषà¤\83 à¤¸à¤¦à¤¸à¥\8dयः प्रतिबन्धितः । प्रवेष्टुम् अनुमतिः नास्ति ।",
        "wrongpassword": "भवता/भवत्या लिखितः कूटशब्दः त्रुटियुक्तः । \nकृपया पुनः लिख्यताम् ।",
        "wrongpasswordempty": "कूटशब्दपेटिकायां कूटशब्दः न लिखितः ।\n\nकृपया पुनः प्रयासः क्रियताम् ।",
        "passwordtooshort": "न्यूनातिन्यूनं {{PLURAL:$1| 1 अक्षरात्मकः|$1 अक्षरात्मकः}} कूटशब्दः भवेदेव ।",
        "eauthentsent": "अधिकृतपुष्टै भवता/भवत्या पञ्जीकृताय वि-पत्रसङ्केताय वि-पत्रं प्रेषितमस्ति । तस्य वि-पत्रसङ्केतस्यैव इतः परम् उपयोगः भवतु इति इच्छति चेत् प्रेषिते वि-पत्रे यथा लिखितमस्ति, तथा करोतु । एवं तस्य वि-पत्रसङ्केतस्य अधिकृतपुष्टता भविष्यति ।",
        "throttled-mailpassword": "कूटशब्दं परिर्वतितुं भवतः/भवत्याः पञ्जीकृताय वि-पत्रसङ्केताय अन्तिम{{PLURAL:$1|होरायां|$1 होरासु}} नूतनकूटशब्दः प्रेषितः अस्ति ।\n\nदुरुपयोगं वारयितुम् प्रति {{PLURAL:$1|होरं|$1 होरं}} केवलम् एकम् वि-पत्रं प्रेष्यते ।",
        "mailerror": "वि-पत्रसम्प्रेषणे दोषः : $1",
-       "acct_creation_throttle_hit": "à¤\9aतà¥\81à¥\8dरà¥\8dविà¤\82शतिà¤\98णà¥\8dà¤\9fासà¥\81 à¤\85सà¥\8dय à¤¸à¤\99à¥\8dà¤\97णà¤\95सà¥\8dय à¤\86नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदा (IP) {{PLURAL:$1|1 à¤¯à¥\8bà¤\9cà¤\95à¤\83|$1 à¤¯à¥\8bà¤\9cà¤\95ाà¤\83}} à¤¸à¤¦à¤¸à¥\8dयताà¤\82 à¤ªà¥\8dरापà¥\8dतवानà¥\8d/वनà¥\8dतà¤\83 à¥¤ à¤\85दà¥\8dय à¤\87तà¥\8bपि अधिकसदस्याः प्राप्तुं न शक्यन्ते ।",
+       "acct_creation_throttle_hit": "à¤\9aतà¥\81à¥\8dरà¥\8dविà¤\82शतिà¤\98णà¥\8dà¤\9fासà¥\81 à¤\85सà¥\8dय à¤¸à¤\99à¥\8dà¤\97णà¤\95सà¥\8dय à¤\86नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदा (IP) {{PLURAL:$1|1 à¤¸à¤¦à¤¸à¥\8dयà¤\83|$1 à¤¸à¤¦à¤¸à¥\8dयाà¤\83}} à¤¸à¤¦à¤¸à¥\8dयताà¤\82 à¤ªà¥\8dरापà¥\8dतवानà¥\8d/वनà¥\8dतà¤\83 à¥¤ à¤\85दà¥\8dय à¤\87तà¥\8bऽपि अधिकसदस्याः प्राप्तुं न शक्यन्ते ।",
        "emailauthenticated": "$2 दिनाङ्के $3 वादने भवतः/भवत्याः वि-पत्रसङ्केतः पुष्टितः ।",
        "emailnotauthenticated": "एतावता भवतः/भवत्याः वि-पत्रसङ्केतः पुष्टः नाभवत् । \nनिम्नलिखिताय न किमपि वि-पत्रं प्रेषयितुं शक्यते ।",
        "noemailprefs": "एनं विकल्पं समर्थितुम् \"इष्टतमानि\" मध्ये भवतः/भवत्याः वि-पत्रसङ्केतस्य उल्लेखः आवश्यकः ।",
        "passwordreset-email": "वि-पत्रसङ्केतः",
        "passwordreset-emailtitle": "{{SITENAME}} इत्यत्र योजकविषये",
        "passwordreset-emailtext-ip": "कोऽपि (कदाचित् भवान्/भवती, $1 अन्तर्जालसंविदः (from IP)) {{SITENAME}}($4) जालस्थानस्य  कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । निम्न{{PLURAL:$3|योजकः|योजकाः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विनतिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
-       "passwordreset-emailtext-user": "$1 à¤¯à¥\8bà¤\9cà¤\95à¤\83 {{SITENAME}}($4) à¤\9cालसà¥\8dथानसà¥\8dय  à¤\95à¥\83तà¥\87 à¤\95à¥\82à¤\9fशबà¥\8dदपरिवरà¥\8dतनसà¥\8dय à¤µà¤¿à¤¨à¤¤à¤¿à¤®à¥\8d à¤\85à¤\95रà¥\8bतà¥\8d à¥¤ à¤¨à¤¿à¤®à¥\8dन{{PLURAL:$3|यà¥\8bà¤\9cà¤\95à¤\83|यà¥\8bà¤\9cà¤\95ाः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विज्ञप्तिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
+       "passwordreset-emailtext-user": "$1 à¤¸à¤¦à¤¸à¥\8dयà¤\83 {{SITENAME}}($4) à¤\9cालसà¥\8dथानसà¥\8dय  à¤\95à¥\83तà¥\87 à¤\95à¥\82à¤\9fशबà¥\8dदपरिवरà¥\8dतनसà¥\8dय à¤µà¤¿à¤¨à¤¤à¤¿à¤®à¥\8d à¤\85à¤\95रà¥\8bतà¥\8d à¥¤ à¤¨à¤¿à¤®à¥\8dन{{PLURAL:$3|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विज्ञप्तिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
        "passwordreset-emailelement": "प्रयोक्तृनाम : \n$1\n\nअल्पकालीनकूटशब्दः : \n$2",
        "passwordreset-emailsent": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति ।",
        "passwordreset-emailsent-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति । तत् अधः द्रष्टुं शक्यते ।",
        "searchprofile-everything-tooltip": "सर्वत्र अन्विष्यताम् (चर्चापृष्ठानि अपि)",
        "searchprofile-advanced-tooltip": "नामाकाशेषु अन्विष्यताम्",
        "search-result-size": "$1 ({{PLURAL:$2|1 शब्दः|$2 शब्दाः}})",
-       "search-result-category-size": "{{PLURAL:$1|1 à¤¯à¥\8bà¤\9cà¤\95à¤\83|$1 à¤¯à¥\8bà¤\9cà¤\95ाः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपवर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})",
+       "search-result-category-size": "{{PLURAL:$1|1 à¤¸à¤¦à¤¸à¥\8dयà¤\83|$1 à¤¸à¤¦à¤¸à¥\8dयाः}} ({{PLURAL:$2|1 उपवर्गः|$2 उपवर्गाः}}, {{PLURAL:$3|1 सञ्चिका|$3 सञ्चिकाः}})",
        "search-redirect": "($1 तः अनुप्रेषितम्)",
        "search-section": "(विभागः $1)",
        "search-category": "(वर्गः $1)",
        "prefs-emailconfirm-label": "वि-पत्रं दृढीक्रियताम् :",
        "youremail": "वि-पत्रसङ्केतः :",
        "username": "{{GENDER:$1|योजकनाम}} :",
-       "prefs-memberingroups": "{{PLURAL:$1|समà¥\82हसà¥\8dय|समà¥\82हानाà¤\82}} {{GENDER:$2|यà¥\8bà¤\9cà¤\95à¤\83/यà¥\8bà¤\9cà¤\95ाः}} :",
+       "prefs-memberingroups": "{{PLURAL:$1|समà¥\82हसà¥\8dय|समà¥\82हानाà¤\82}} {{GENDER:$2|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}} :",
        "prefs-registration": "पञ्जीकरणकालः :",
        "yourrealname": "वास्तविकनाम :",
        "yourlanguage": "भाषा :",
        "prefs-dateformat": "दिनाङ्कस्य प्रारूपः",
        "prefs-timeoffset": "समयान्तरम्",
        "prefs-advancedediting": "सामान्यविकल्पाः",
-       "prefs-editor": "यà¥\8bà¤\9cà¤\95ः",
+       "prefs-editor": "सदसà¥\8dयः",
        "prefs-preview": "प्राग्दृश्यम्",
        "prefs-advancedrc": "विशेषविकल्पाः",
        "prefs-advancedrendering": "विशेषविकल्पाः",
        "saveusergroups": "योजकसमूहः रक्ष्यताम्",
        "userrights-groupsmember": "अस्य सदस्यः :",
        "userrights-groupsmember-auto": "निम्न{{PLURAL:$1|समूहस्य|समूहानाम्}} अन्तर्निहितः सदस्यः :",
-       "userrights-groups-help": "à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयसà¥\8dय à¤¸à¤®à¥\82हसदसà¥\8dयतà¥\8dवà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ \n* à¤\85à¤\99à¥\8dà¤\95नपà¥\87à¤\9fिà¤\95ा (check box) à¤\85à¤\99à¥\8dà¤\95िता à¤\9aà¥\87तà¥\8d, à¤¯à¥\8bà¤\9cà¤\95ः अस्य समूहस्य सदस्यः अस्ति ।\n* अङ्कनपेटिका अनङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः नास्ति ।\n* एकवारं समूहः योजितः अपाकृतः वा चेत्, पुनः पूर्ववत् कर्तुं न शक्यते इति * चिह्नं सूचयति ।",
+       "userrights-groups-help": "à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयसà¥\8dय à¤¸à¤®à¥\82हसदसà¥\8dयतà¥\8dवà¤\82 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ \n* à¤\85à¤\99à¥\8dà¤\95नपà¥\87à¤\9fिà¤\95ा (check box) à¤\85à¤\99à¥\8dà¤\95िता à¤\9aà¥\87तà¥\8d, à¤¸à¤¦à¤¸à¥\8dयः अस्य समूहस्य सदस्यः अस्ति ।\n* अङ्कनपेटिका अनङ्किता चेत्, योजकः अस्य समूहस्य सदस्यः नास्ति ।\n* एकवारं समूहः योजितः अपाकृतः वा चेत्, पुनः पूर्ववत् कर्तुं न शक्यते इति * चिह्नं सूचयति ।",
        "userrights-reason": "कारणम् :",
        "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
        "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते अथवा तु सः स्थानीयः नास्ति ।",
        "group-bureaucrat": "अधिकारिणः",
        "group-suppress": "अलक्ष्यम्",
        "group-all": "(सर्वम्)",
-       "group-user-member": "{{GENDER:$1|यà¥\8bà¤\9cà¤\95ः}}",
+       "group-user-member": "{{GENDER:$1|सदसà¥\8dयः}}",
        "group-autoconfirmed-member": "{{GENDER:$1|स्वदृढितयोजकः}}",
        "group-bot-member": "{{GENDER:$1|बॉट्}}",
        "group-sysop-member": "{{GENDER:$1|प्रबन्धकः}}",
        "right-viewsuppressed": "अन्ययोजकैः गूहितं संस्करणं दृश्यताम्",
        "right-suppressionlog": "वैयक्तिकसंस्करणानि दृश्यन्ताम्",
        "right-block": "अस्य योजकस्य सम्पादनानि अवरुध्यन्ताम्",
-       "right-blockemail": "वि-पतà¥\8dरपà¥\8dरà¥\87षयितà¥\81मà¥\8d à¤\8fषà¤\83 à¤¯à¥\8bà¤\9cà¤\95ः अवरुध्यताम्",
+       "right-blockemail": "वि-पतà¥\8dरपà¥\8dरà¥\87षयितà¥\81मà¥\8d à¤\8fषà¤\83 à¤¸à¤¦à¤¸à¥\8dयः अवरुध्यताम्",
        "right-hideuser": "प्रयोक्तृनाम अवरुध्यताम्, तत् अन्ययोजकेभ्यः गोप्यतां च",
        "right-ipblock-exempt": "स्वयम् अवरोधितं, समूहावरोधितम् अन्तर्जालसङ्केतम् (IP) अवगण्य अग्रे गच्छतु",
        "right-proxyunbannable": "प्रतिनिधीनां (of prxies) स्वयम्-अवरोधान् अवगण्य अग्रे गच्छतु",
        "minoreditletter": "(लघु)",
        "newpageletter": "(नवीनम्)",
        "boteditletter": "(बोट्)",
-       "number_of_watching_users_pageview": "[$1 à¤\85वलà¥\8bà¤\95यति {{PLURAL:$1|यà¥\8bà¤\9cà¤\95à¤\83|यà¥\8bà¤\9cà¤\95ाः}}]",
+       "number_of_watching_users_pageview": "[$1 à¤\85वलà¥\8bà¤\95यति {{PLURAL:$1|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}}]",
        "rc_categories": "वर्गान् नियतीकरोतु ।",
        "rc_categories_any": "कश्चित्",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} परिवर्तनपश्चात् ।",
        "filehist-thumb": "लघ्वाकृतिः",
        "filehist-thumbtext": "$1 इत्यस्य संस्करणस्य लघुस्वरूपम् ।",
        "filehist-nothumb": "अङ्गुष्टनखाकारकं नाश्ति ।",
-       "filehist-user": "यà¥\8bà¤\9cà¤\95ः",
+       "filehist-user": "सदसà¥\8dयः",
        "filehist-dimensions": "आयामाः",
        "filehist-filesize": "सञ्चिकाकारः ।",
        "filehist-comment": "टिप्पणी",
        "statistics-files": "उद्भारितसञ्चिकाः",
        "statistics-edits": "{{SITENAME}} व्यवस्थापनपर्यन्तं पुटसम्पादनानि ।",
        "statistics-edits-average": "प्रतिपुटं माध्यसम्पादनानि ।",
-       "statistics-users": "पà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83तà¤\83 [[Special:ListUsers|यà¥\8bà¤\9cà¤\95ः]]",
+       "statistics-users": "पà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83तà¤\83 [[Special:ListUsers|सदसà¥\8dयः]]",
        "statistics-users-active": "सक्रियाः सदस्याः",
        "statistics-users-active-desc": "गतेषु {{PLURAL:$1|day|$1 दिनेषु}} सक्रियाः योजकाः  ।",
        "pageswithprop": "प्रगुणविशेषयुतानि पृष्ठानि",
        "ncategories": "{{PLURAL:$1|वर्गः|वर्गाः }}",
        "ninterwikis": "$1 {{PLURAL:$1|अन्तार्विकी|अन्तार्विक्यः}}",
        "nlinks": "$1 {{PLURAL:$1|परिसन्धिः|परिसन्धयः}}",
-       "nmembers": "$1 {{PLURAL:$1|यà¥\8bà¤\9cà¤\95à¤\83|यà¥\8bà¤\9cà¤\95ाः}}",
+       "nmembers": "$1 {{PLURAL:$1|सदसà¥\8dयà¤\83|सदसà¥\8dयाः}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्यः|सदस्याः}}",
        "nrevisions": "$1 {{PLURAL:$1|पुनरावृत्तिः}}",
        "nimagelinks": "$1 {{PLURAL:$1|पुटम्|पुटानि}} प्रयुक्तानि ।",
        "linksearch-error": "वन्यपत्राणि आतिथेयस्य नाम्ना समं केवलं प्रभान्ति ।",
        "listusersfrom": "एतस्मात् आरभमाणान् योजकान् दर्शयतु ।",
        "listusers-submit": "दृश्यताम्",
-       "listusers-noresult": "यà¥\8bà¤\9cà¤\95ः न प्राप्तः ।",
+       "listusers-noresult": "सदसà¥\8dयः न प्राप्तः ।",
        "listusers-blocked": "अवरुद्धम् ।",
        "activeusers": "सक्रिययोजकानाम् आवली ।",
        "activeusers-intro": "एषा तु गतेषु $1 {{PLURAL:$1|दिनेषु}} कृतकार्याणां योजकाना आवली ।",
        "activeusers-from": "एतस्मात् आरभमाणान् योजकान् दर्शयतु ।",
        "activeusers-hidebots": "स्वयं चालकान् गोपयतु ।",
        "activeusers-hidesysops": "प्रशासकान् गोपयतु ।",
-       "activeusers-noresult": "यà¥\8bà¤\9cà¤\95ः न प्राप्तः ।",
+       "activeusers-noresult": "सदसà¥\8dयः न प्राप्तः ।",
        "listgrouprights": "योजकसमूहाधिकाराः ।",
        "listgrouprights-summary": "अधोदत्ता विकिपरिभाषितस्य सङ्गताभिगम्यताधिकारैः सहिता योजकसमूहस्य आवली । [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]",
        "listgrouprights-key": "विवरणम् -\n* <span class=\"listgrouprights-granted\">दत्ताधिकाराः</span>\n* <span class=\"listgrouprights-revoked\">हृताधिकाराः</span>",
        "mailnologintext": "अस्य योजकेभ्यः विद्युन्मानपत्रप्रेषणार्थम् [[Special:UserLogin|नामाभिलेखनम्]] आवश्यकम् [[Special:Preferences|आद्यता]]यां प्रेषयितुं विद्युन्मानपत्रसङ्केतः आवश्यकः ।",
        "emailuser": "एतस्मै योजकाय वि-पत्रं प्रेष्यताम्",
        "emailuser-title-target": "{{GENDER:$1|एतस्मै सदस्याय}} वि-पत्रं प्रैष्यताम्",
-       "emailuser-title-notarget": "à¤\88पतà¥\8dर à¤¯à¥\8bà¤\9cà¤\95ः",
+       "emailuser-title-notarget": "वि-पतà¥\8dरयà¥\81à¤\95à¥\8dतà¤\83 à¤¸à¤¦à¤¸à¥\8dयः",
        "emailpagetext": "{{GENDER:$1|अस्मै}} योजकाय विद्युन्मानपत्रं प्रेषयितुम् अधो दत्तप्रपत्रम् उपयोक्तुं शक्नोति । \n[[Special:Preferences|your user preferences]] अत्र भवता विनिवेशितः वि-पत्रसङ्केतः सकाशात् इति स्थाने प्रतिभाति । अनेन स्वीकर्ता साक्षात् प्रत्युत्तरं दातुं प्रभविष्यति ।",
        "defemailsubject": "{{SITENAME}}\"$1\" इति योजकात् विद्युन्मानपत्रम् ।",
        "usermaildisabled": "योजकस्य विद्युन्मानपत्रं निष्क्रियम् ।",
        "usermaildisabledtext": "अस्यां विक्याम् अन्ययोजकेभ्यः विद्युन्मानपत्रं प्रेषयितुं नै शक्नोति ।",
        "noemailtitle": "विद्युन्मानपत्रसङ्केतः नास्ति ।",
        "noemailtext": "अस्य योजकस्य निरिदिष्टः विद्युन्मानपत्रसङ्केतः नास्ति ।",
-       "nowikiemailtext": "à¤\85यà¤\82 à¤¯à¥\8bà¤\9cà¤\95à¤\83 à¤\85नà¥\8dययà¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤µà¤¿-पतà¥\8dराणि à¤¸à¥\8dवà¥\80à¤\95ार्तुं नेच्छति ।",
+       "nowikiemailtext": "à¤\85यà¤\82 à¤¸à¤¦à¤¸à¥\8dयà¤\83 à¤\85नà¥\8dयसदसà¥\8dयà¥\87भà¥\8dयà¤\83 à¤µà¤¿-पतà¥\8dराणि à¤¸à¥\8dवà¥\80à¤\95र्तुं नेच्छति ।",
        "emailnotarget": "स्वीकर्तुः अस्तित्वविहीनम् अथवा अमान्यं योजकनाम  ।",
        "emailtarget": "स्वीकर्तुः योजकनाम लिखतु ।",
        "emailusername": "योजकनामन्:",
        "enotif_body_intro_changed": "{{SITENAME}} पृष्ठं $1 इत्येतत् $PAGEEDITDATE इति दिनाङ्के {{gender:$2 इत्यनेन|$2 इत्यनया}} परिवर्तितमस्ति, वर्तमानसंस्करणार्थं $3 इत्येतत् दृश्यताम्।",
        "enotif_lastvisited": "भवतः पूवसन्दर्शनस्य पश्चात् सवृत्तपरिवर्तनार्थं $1 पश्यतु ।",
        "enotif_lastdiff": "परिवर्तनं दृष्टुम् एतत् $1 पश्यतु ।",
-       "enotif_anon_editor": "à¤\85नामà¤\95à¤\83 à¤¯à¥\8bà¤\9cà¤\95ः $1",
+       "enotif_anon_editor": "à¤\85नामà¤\95à¤\83 à¤¸à¤¦à¤¸à¥\8dयः $1",
        "enotif_body": "प्रिय $WATCHINGUSERNAME !,\n\n$PAGEINTRO $NEWPAGE\n\nसम्पादकस्य सारांशः : $PAGESUMMARY $PAGEMINOREDIT\n\nसम्पादकेन स्य सम्पर्कः :\nवि-पत्रम् : $PAGEEDITOR_EMAIL\nविकि    : $PAGEEDITOR_WIKI\n\nयावत् पुनःप्रवेशं प्राप्य भवान्/भवती एतत् पृष्ठं प्रति पुनः न गच्छति, तावत् अन्यपरिवर्तने सत्यपि भवते/भवत्यै सूचना प्रेषयितुं न शक्यते ।\nइच्छति चेत्, स्वनिरीक्षासूच्यां स्थितानां पृष्ठानां चिह्नं परिवर्तयितुं शक्नोति ।\n\n{{SITENAME}} सहायकानां सूचकप्रणाली\n\n--\nस्वस्य वि-पत्रस्य सूचनायाः व्यवस्थां परिवर्तयितुम् अत्र दृश्यताम् \n{{canonicalurl:{{#special:Preferences}}}}\n\nस्वस्य निरीक्षासूच्याः व्यवस्थां परिवर्तयितुम् अत्र दृश्यताम् \n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nएतत् पृष्ठं स्वनिरीक्षासूच्याः अपाकर्तुम् \n$UNWATCHURL\n\nपरामर्शं दातुम् उत साहाय्यं प्राप्तुम् :\n$HELPPAGE",
        "created": "सृष्टम् ।",
        "changed": "परिवर्तितम् ।",
        "autoblockid": "स्वयं पिहितम् । $1",
        "block": "योजकम् अवरुणद्धु ।",
        "unblock": "योजकम् अनवरुणद्धु ।",
-       "blockip": "{{GENDER:$1|यà¥\8bà¤\9cà¤\95ः}} अवरुद्ध्यताम्",
+       "blockip": "{{GENDER:$1|सदसà¥\8dयः}} अवरुद्ध्यताम्",
        "blockip-legend": "योजकम् अवरुणद्धु ।",
        "blockiptext": "विशिष्टं  IP सङ्केतम् अथवा योजकनाम लेखानाधिकारस्य प्राप्तये निम्नदत्तपत्रस्य उपयोगं करोतु ।\nकेवलं नाशकत्वम् अवरोद्धुं एतस्य उपयोगं करोतु । [[{{MediaWiki:Policy-url}}|नीतिः]] इत्यानुसारं करणीयम् ।\nअधः विशिष्टं कारणमपि लिखतु ।",
        "ipaddressorusername": "आइ.पी.सङ्केतः अथवा योजकनाम :",
        "autoblocker": "भवतः/भवत्याः अन्तर्जालसङ्केतः \"[[User:$1|$1]]\" इत्यनेन उपयुज्यमानः अस्ति, अतः स्वतः अवरुद्धः ।\n$1 इत्यस्य अवरोधनस्य \"$2\" इत्येतत् कारणं विद्यते ।",
        "blocklogpage": "अवरोधाऽऽवलिः",
        "blocklog-showlog": "अयम् एपि सङ्केतः पूर्वमेव अवरुद्धः । \nअवरोधसूची आधाराय अधः दत्तः अस्ति :",
-       "blocklog-showsuppresslog": "à¤\85यà¤\82 à¤¯à¥\8bà¤\9cà¤\95ः पूर्वमेव अवरुद्धः सङ्गुप्तः च  ।\nनिग्रहकरणं तु अधः उल्लिखितम् ।",
+       "blocklog-showsuppresslog": "à¤\85यà¤\82 à¤¸à¤¦à¤¸à¥\8dयः पूर्वमेव अवरुद्धः सङ्गुप्तः च  ।\nनिग्रहकरणं तु अधः उल्लिखितम् ।",
        "blocklogentry": "$2 $3 समयपर्यन्तं [[$1]] एतत् प्रतिबन्धितं वर्तते",
        "reblock-logentry": "[[$1]] इत्यस्य अवरोधस्य विन्यासः परिवर्तितः अयं $2 $3 समये विनश्येत् ।",
        "blocklogtext": "इयम् अवरुद्धानवरुद्धप्रक्रियायाः अवलोकनस्य सूचिका । \nस्वयम् अवरुद्धानाम् ऐपिसङ्केतानाम् आवली न कृता ।\nसद्यः उपयोगनिषेधस्य अवरोधानाम् आवलीप्राप्तये [[Special:BlockList|block list]] अवलोकयतु ।",
        "sorbsreason": "DNSBL उपयोगः {{SITENAME}} कृतस्य भवतः ऐपिसङ्केतः मुक्तप्रतिहस्तकः इति आवलीगतः",
        "sorbs_create_account_reason": "DNSBL उपयुक्तः {{SITENAME}} अतः भवतः ऐपिसङ्केतः अवरुद्धः यतः अयं मुक्तप्रतिहस्तकः इति आवलीगतः । अतः भवान् योजकस्थानं निर्मातुं न शक्नोति ।",
        "xffblockreason": "X-Forwarded-For इत्यस्मिन् स्थितः शिरोभागः भवाताम् उत यत् प्रतिनिधिवितरकं भवान्/भवती उपयुङ्क्ते, सः प्रतिबन्धितः अस्ति । अवरोधस्य मूलकारणम् $1 आसीत् ।",
-       "cant-see-hidden-user": "यà¤\82 à¤¯à¥\8bà¤\9cà¤\95à¤\83 à¤\85वरà¥\8bदà¥\8dधà¤\82 à¤­à¤µà¤¾à¤¨à¥\8d à¤ªà¥\8dरयतमानà¤\83 à¤¸à¤\83 à¤ªà¥\82रà¥\8dवमà¥\87व à¤\85वरà¥\81दà¥\8dधà¤\83 à¤¸à¤\99à¥\8dà¤\97à¥\81पà¥\8dतà¤\83 à¤\9a à¥¤\nभवानà¥\8d à¤¤à¥\81 à¤¯à¥\8bà¤\9cà¤\95सà¤\99à¥\8dà¤\97à¥\8bपनाधिà¤\95ारयà¥\81à¤\95à¥\8dतà¤\83 à¤¨ à¥¤ à¤\85तà¤\83 à¤­à¤µà¤¾à¤¨à¥\8d à¤¯à¥\8bà¤\9cà¤\95ावरोधं दृष्टुं सम्पादयितुं वा न शक्नोति ।",
+       "cant-see-hidden-user": "यà¤\82 à¤¸à¤¦à¤¸à¥\8dयमà¥\8d à¤\85वरà¥\8bदà¥\8dधà¤\82 à¤­à¤µà¤¾à¤¨à¥\8d à¤ªà¥\8dरयतमानà¤\83 à¤¸à¤\83 à¤ªà¥\82रà¥\8dवमà¥\87व à¤\85वरà¥\81दà¥\8dधà¤\83 à¤¸à¤\99à¥\8dà¤\97à¥\81पà¥\8dतà¤\83 à¤\9a à¥¤\nभवानà¥\8d à¤¤à¥\81 à¤¸à¤¦à¤¸à¥\8dयासà¤\99à¥\8dà¤\97à¥\8bपनाधिà¤\95ारयà¥\81à¤\95à¥\8dतà¤\83 à¤¨ à¥¤ à¤\85तà¤\83 à¤­à¤µà¤¾à¤¨à¥\8d à¤¸à¤¦à¤¸à¥\8dयावरोधं दृष्टुं सम्पादयितुं वा न शक्नोति ।",
        "ipbblocked": "भवान् अन्ययोजकान् अवरोद्धुम् विमोचयितुं वा न शक्नोति । यतः भवान् तु अवरुद्धः अस्ति ।",
        "ipbnounblockself": "भवान् भवन्तं मोचयितुं नैव शक्नोति ।",
        "lockdb": "दत्तपाठान् अवरुणद्धु ।",
        "scarytranscludefailed-httpstatus": "[$1 : इत्यस्य कृते फलकसङ्कर्षणम् असफलम् HTTP $2]",
        "scarytranscludetoolong": "[URLअतिदीर्घा अस्ति ]",
        "deletedwhileediting": "पूर्वसूचना : भवतः सम्पादनारम्भात् पश्चात् एतत् पुटम् अपमर्जितम् ।",
-       "confirmrecreate": "यà¥\8bà¤\9cà¤\95à¤\83 [[User:$1|$1]] ([[User talk:$1|समà¥\8dभाषणमà¥\8d]]) à¤¸à¤\95ारणà¤\82 à¤­à¤µà¤¤à¤\83 à¤¸à¤®à¥\8dपादनातà¥\8d à¤ªà¤°à¤\82 à¤ªà¥\81à¤\9fमà¥\87ततà¥\8d à¤\85पमरà¥\8dà¤\9cितमà¥\8d à¥¤ \n: ''$2''\nएतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
-       "confirmrecreate-noreason": "यदा à¤­à¤¾à¤µà¤¾à¤¨à¥\8d à¤\85सà¥\8dय à¤ªà¥\81à¤\9fासà¥\8dय à¤¸à¤®à¥\8dपादनमà¥\8d à¤\86रबà¥\8dधवानà¥\8d à¤¤à¤¤à¥\8dपशà¥\8dà¤\9aातà¥\8d à¤\85नà¥\8dयà¤\83 à¤¯à¥\8bà¤\9cà¤\95ः [[User:$1|$1]] ([[User talk:$1|talk]]) एतत् अपनीतवान् । अतः एतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
+       "confirmrecreate": "सदसà¥\8dयà¤\83 [[User:$1|$1]] ([[User talk:$1|समà¥\8dभाषणमà¥\8d]]) à¤¸à¤\95ारणà¤\82 à¤­à¤µà¤¤à¤\83 à¤¸à¤®à¥\8dपादनातà¥\8d à¤ªà¤°à¤\82 à¤ªà¥\81à¤\9fमà¥\87ततà¥\8d à¤\85पमरà¥\8dà¤\9cितमà¥\8d à¥¤ \n: <em>$2</em>\nएतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
+       "confirmrecreate-noreason": "यदा à¤­à¤¾à¤µà¤¾à¤¨à¥\8d à¤\85सà¥\8dय à¤ªà¥\81à¤\9fासà¥\8dय à¤¸à¤®à¥\8dपादनमà¥\8d à¤\86रबà¥\8dधवानà¥\8d à¤¤à¤¤à¥\8dपशà¥\8dà¤\9aातà¥\8d à¤\85नà¥\8dयà¤\83 à¤¸à¤¦à¤¸à¥\8dयः [[User:$1|$1]] ([[User talk:$1|talk]]) एतत् अपनीतवान् । अतः एतत्पुटं पुनर्निमातुम् इच्छति वेति दृढयतु ।",
        "recreate": "पुनर्निर्मीयताम्",
        "confirm_purge_button": "अस्तु",
        "confirm-purge-top": "अस्य पुटस्य इतिहाससङ्ग्रहं निर्मलं करोति वा ?",
index ed74c31..c65111a 100644 (file)
@@ -20,6 +20,7 @@
        "tog-hideminor": "Кыра көннөрүүлэри көрдөрбөккө",
        "tog-hidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ",
        "tog-newpageshidepatrolled": "Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ",
+       "tog-hidecategorization": "Сирэй категорияларын көрдөрүмэ",
        "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт тиһигэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
        "tog-usenewrc": "Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ",
        "tog-numberheadings": "Түһүмэхтэр ааттарын нүөмэрдээ",
@@ -49,6 +50,7 @@
        "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир тиһиккэ көрдөрүмэ",
        "tog-watchlisthideanons": "Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин тиһигэр көрдөрүмэ",
        "tog-watchlisthidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн кэтээһин испииһэгэр көрдөрүмэ",
+       "tog-watchlisthidecategorization": "Сирэй категорияларын көрдөрүмэ",
        "tog-ccmeonemails": "Атын кыттааччыларга суруйбут суруктарбын бэйэбэр эмиэ ыыт",
        "tog-diffonly": "Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ",
        "tog-showhiddencats": "Кистэммит категориялары көрдөр",
        "viewsource": "Көрүү",
        "viewsource-title": "Бу сирэй $1 исходнигын көрүү",
        "actionthrottled": "Түргэнин хааччахтааһын",
-       "actionthrottledtext": "Бу дьайыыны кылгас кэм иһигэр элбэхтик оҥорор бобуллар. Бу быраабыла спаамы утары охсуһарга көмөлөһөр. Аҕыйах мүнүүтэннэн өссө боруобалаар.",
+       "actionthrottledtext": "Бу дьайыыны кылгас кэм иһигэр элбэхтик оҥорор бобуллар. Бу быраабыла спаамы утары охсуһарга көмөлөһөр. \nТохтуу түһэн баран хатылаан көрөөр.",
        "protectedpagetext": "Бу сирэй уларытыыттан уонна да атын дьайыылартан көмүскэммит.",
        "viewsourcetext": "Эн бу сирэй төрүт куодун көрүөххүн уонна төгүллээн ылыаххын сөп:",
        "viewyourtext": "<strong>Бэйэҥ көннөрүүлэриҥ</strong> төрүт куодун бу сирэйгэ көрүөххүн уонна хатылаан ылыаххын сөп.",
        "createaccountreason": "Төрүөтэ:",
        "createacct-reason": "Төрүөтэ",
        "createacct-reason-ph": "Саҥа аатынан тоҕо киирэҕиний",
-       "createacct-captcha": "Куттал суох буолуутун тургутуу",
-       "createacct-imgcaptcha-ph": "Үөһэ көстөрү хатылаа",
        "createacct-submit": "Бэлиэтэнии",
        "createacct-another-submit": "Бэлиэтэн",
        "createacct-benefit-heading": "{{SITENAME}} ситим-сири эн курдук дьон оҥороллор.",
        "passwordreset-emailtext-ip": "Ким эрэ (баҕар эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка киирии тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
        "passwordreset-emailtext-user": "$1 диэн кыттааччы  {{SITENAME}} ($4) бырайыакка киирии тылгын уларытар туһунан ыйытык ыыппыт.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
        "passwordreset-emailelement": "Кыттааччы: \n$1\n\nБыстах киирии тыл: \n$2",
-       "passwordreset-emailsent": "Киирии тылы уларытар туһунан сурук барда.",
+       "passwordreset-emailsent": "Өскө ааккар баайыллыбыт аадырыһы суруйбут буоллаххына, аһарык тылы уларытар туһунан сурук онно барыа.",
        "passwordreset-emailsent-capture": "Киирии тылы уларытар туһунан сурук аллара эмиэ көрдөрүлүннэ.",
        "passwordreset-emailerror-capture": "Манна киирии тылы уларытар туһунан сурук көрдөрүлүннэ. Ол эрэн сурук бу төрүөттэн $2 кыттааччыга сатаан барбата: $1",
        "changeemail": "Аадырыһы уларытыы уонна сотуу",
-       "changeemail-header": "Аадырыһын уларытыы",
+       "changeemail-header": "Бу форманы толорон аадырыскын уларыт. Уларытыыны бигэргэтэргэ аһарыккын киллэриэхтээххин. Почтаҥ аадырыһыттан бэлиэ-ааккыттан араарыаххын баҕарар буоллаххына аадырыһы сотон баран бигэргэтэн кэбиһээр.",
+       "changeemail-passwordrequired": "Бу дьайыыны бигэргэтэргэ аһарык тылгын киллэриэхтээххин.",
        "changeemail-no-info": "Бу сирэйгэ чопчу тиийэргэ, тиһиликкэ бэлиэтэммит ааккын этиэхтиэххин.",
        "changeemail-oldemail": "Билиҥҥи аадырыс:",
        "changeemail-newemail": "Саҥа аадырыс:",
        "sig_tip": "Илии баттааһыныҥ уонна хаһан илии баттаабытыҥ",
        "hr_tip": "Туора сурааһын (наһаа элбэхтик туттума)",
        "summary": "Уларытыыҥ ис хоһооно:",
-       "subject": "Тиэмэтэ/бас тыла:",
+       "subject": "Тиэмэтэ:",
        "minoredit": "Бу суолтата суох уларытыы",
        "watchthis": "Бу сирэйи кэтээн көрөргө",
        "savearticle": "Уларытыыны бигэргэтии",
        "missingsummary": "'''Санатыы:''' Уларыппытыҥ кылгас быһаарыытын суруйбатаххын. Уларытыыны бигэргэттэххинэ улартытыыҥ хос быһаарыыта суох барыа.",
        "selfredirect": "<strong>Болҕой:</strong> Утаарыыны ыстатыйа бэйэтигэр оҥороору гынныҥ.\nБаҕар, утаарыы сирэйин атыны суруйаары гыммытыҥ буолуо эбэтэр атын сирэйи көннөрө олороҕун. \nОл да буоллар, өскө «{{int:savearticle}}» баттамы хат баттаатаххына, утаары оҥоһуллуо.",
        "missingcommenttext": "Манна хос быһаарыыны суруй.",
-       "missingcommentheader": "'''Санатыы:''' Хос быһаарыы аатын суруйбатаххын.\n«{{int:savearticle}}» тимэҕи баттаан бигэргэттэххинэ быһаарыыҥ аата суох барыа.",
+       "missingcommentheader": "<strong>Санатыы:</strong> Хос быһаарыы аатын суруйбатаххын.\n«{{int:savearticle}}» тимэҕи баттаан бигэргэттэххинэ быһаарыыҥ аата суох барыа.",
        "summary-preview": "Хос быһаарыыны көрүү:",
-       "subject-preview": "Аатын/тиэмэтин көрүү:",
+       "subject-preview": "Аата маннык көстүөҕэ:",
        "previewerrortext": "Уларытыыгын бигэргэтиэх иннинэ көрдөрөргө алҕас таҕыста.",
        "blockedtitle": "Кыттааччы уларытар кыаҕа быһылынна",
        "blockedtext": "'''Эн аатыҥ эбэтэр IP-аадырыһыҥ бобулуннулар.'''\n\nБоппут киһи $1.\nТөрүөтэ: ''«$2»''.\n\n*Бобуллубут: $8\n*Бобуу болдьоҕо: $6\n*Бобулунна: $7\n\nЭн $1 диэн киһиэхэ эбэтэр атын [[{{MediaWiki:Grouppage-sysop}}|администраатарга]] суруйан быһаарсыаххын сөп.\nБолҕой, өскө регистрацияламматах буоллаххына, эбэтэр эл. аадырыскын [[Special:Preferences|бигэргэппэтэх]] буоллаххына, эбэтэр сурук суруйарыҥ бобуллубут буоллаҕына администраатарга суруйар кыаҕыҥ суох.\nЭн IP-аадырыһыҥ — $3, бобуу нүөмэрэ — #$5.\nОну суруккар киллэрээр.",
        "permissionserrors": "Киирии алҕаһа",
        "permissionserrorstext": "Маны оҥорор кыаҕыҥ суох, {{PLURAL:$1|төрүтэ|төрүттэрэ}}:",
        "permissionserrorstext-withaction": "Бу дьайыыны ($2) оҥорор кыаҕыҥ суох.  {{PLURAL:$1|Биричиинэтэ|Биричиинэлэрэ}}:",
+       "contentmodelediterror": "Бу торуму уларытар кыаҕыҥ суох эбит, тоҕо диэтэххэ иһинээҕитин мадьыала маннык <code>$1</code>, оттон сирэй иһинээҕитин билиҥҥитэ маннык — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Болҕой: сотулубут сирэйи төттөрү оҥорон эрэҕин.'''\n\nТолкуйдаан көр, кырдьык бу сирэйи оҥорор туһалаах дуо.\nАллара сотуулар уонна аат уларыйыытын сурунааллара көрдөрүлүннэ.",
        "moveddeleted-notice": "Бу сирэй сотуллубут.\nАллара сотуу уонна аат уларытыытын сурунаалларыгар онно сыһыаннаах туох суруллубута көстөр.",
+       "moveddeleted-notice-recent": "Бу сирэй соторутааҕыта (тиһэх 24 чаас иһигэр) сотуллубут эбит.\nАллара сотуу уонна көһөрүү сурунаалларыгар сигэлэр көстөллөр.",
        "log-fulllog": "Сурунаалы барытын көрүү",
        "edit-hook-aborted": "Көннөрүү төттөрү көннөрүллүбүт.\nЭбии туох да быһаарыллыбатах.",
        "edit-gone-missing": "Сирэйи саҥардар кыах суох.\nАрааһа сотуллубут быһыылаах.",
        "mergehistory-go": "Силлэһиилэр уларыйыыларын көрдөр",
        "mergehistory-submit": "Силлэһии барыллара",
        "mergehistory-empty": "Биир да барыл силлиһэр кыаҕа суох.",
-       "mergehistory-done": "$3 {{PLURAL:$3|барыл|барыллар}} $1 биир [[:$2]] барылга силлистилэр.",
+       "mergehistory-done": "$3 {{PLURAL:$3|барыл|барыллар}} $1 биир [[:$2]] барылы кытта силлистилэр.",
        "mergehistory-fail": "Сирэй устуоруйалара кыайан холбоспотулар, өссө биирдэ торумнар бириэмэлэрин уонна сирэй параметрдарын бэрэбиэркэлээ.",
        "mergehistory-fail-toobig": "Устуоруйаны холбуур табыллыбата, тоҕо диэтэххэ $1  барылга көҥүллэнэр лимииттэн элбэҕи көһөрөр наада эбит.",
        "mergehistory-no-source": "Бастакы $1 сирэй суох.",
        "showingresultsinrange": "Манна {{PLURAL:$1|<strong>1</strong> түмүк|<strong>$1</strong> түмүк}} мантан саҕалаан <strong>$2</strong> маныаха дылы <strong>$3</strong> көрдөрүлүннэ.",
        "search-showingresults": "{{PLURAL:$4|Түмүк <strong>$1</strong> из <strong>$3</strong>|Түмүктэр <strong>$1 — $2</strong> мантан <strong>$3</strong>}}",
        "search-nonefound": "Көрдөбүлгэ эппиэттиир билэлэр көстүбэтилэр.",
+       "search-nonefound-thiswiki": "Көрдөбүлгэ эппиэттиир билэ бу ситим-сиргэ көстүбэтэ.",
        "powersearch-legend": "Дириҥэтэн көрдөөһүн",
        "powersearch-ns": "Аат далыгар көрдөө:",
        "powersearch-togglelabel": "Бэлиэтээ:",
        "prefs-watchlist-token": "Кэтэбил тиһигин бэлиэтэ (токен):",
        "prefs-misc": "Атын туруоруулар",
        "prefs-resetpass": "Кирии тылы уларытыы",
-       "prefs-changeemail": "Аадырыһы уларытыы",
+       "prefs-changeemail": "Аадырыһы уларытыы уонна сотуу",
        "prefs-setemail": "Аадырыһы киллэрии",
        "prefs-email": "Email туруоруулара",
        "prefs-rendering": "Тас көрүҥэ",
        "prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
        "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
        "savedprefs": "Эн туруорууларыҥ олохтоннулар.",
+       "savedrights": "{{GENDER:$1|$1}} кыттааччы бырааба бигэргэннэ.",
        "timezonelegend": "Олохтоох кэм:",
        "localtime": "Олохтоох кэмим:",
        "timezoneuseserverdefault": "Сиэрбэр туруоруутунан ($1)",
        "group-bot": "Роботтар",
        "group-sysop": "Дьаһабыллар",
        "group-bureaucrat": "Бюрокрааттар",
-       "group-suppress": "Ð\90лÒ\95аÑ\81Ñ\82ар",
+       "group-suppress": "РевизоÑ\80дар",
        "group-all": "(бары)",
        "group-user-member": "{{GENDER:$1|кыттааччы}}",
        "group-autoconfirmed-member": "{{GENDER:$1|аптамаатынан бигэргэтиллибит кыттааччы}}",
        "grouppage-bot": "{{ns:project}}:Роботтар",
        "grouppage-sysop": "{{ns:project}}:Дьаһабыллар",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрокрааттар",
-       "grouppage-suppress": "{{ns:project}}:Ð\90лÒ\95аÑ\81",
+       "grouppage-suppress": "{{ns:project}}:РевизоÑ\80даÑ\80",
        "right-read": "Сирэйдэри көрүү",
        "right-edit": "Сирэйдэри уларытыы",
        "right-createpage": "Сирэйдэри оҥоруу (ырытыы сирэйдэриттэн ураты)",
        "rcshowhidemine": "Мин уларытыыларбын $1",
        "rcshowhidemine-show": "Көрдөр",
        "rcshowhidemine-hide": "Кистээ",
+       "rcshowhidecategorization-show": "Көрдөр",
+       "rcshowhidecategorization-hide": "Кистээ",
        "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
        "diff": "уратыта",
        "hist": "устуоруйата",
        "recentchangeslinked-summary": "Бу анал сирэйгэ сигэнэр сирэйдэр бүтэһик уларыйыылара көһүннүлэр. [[Special:Watchlist|Кэтэнэр сирэйдэр]] '''модьу бичигинэн''' бэлиэтэннилэр.",
        "recentchangeslinked-page": "Сирэй аата:",
        "recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр",
+       "recentchanges-page-added-to-category": "[[:$1]] категорияҕа эбилиннэ",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияҕа эбилиннэ",
+       "recentchanges-page-removed-from-category": "[[:$1]] категорияттан сотулунна",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияттан сотулунна",
+       "autochange-username": "MediaWiki аптамаатынан уларыйыыта",
        "upload": "Билэни угуу",
        "uploadbtn": "Билэни киллэрии",
        "reuploaddesc": "Тохтот уонна киллэрии форматыгар төнүн",
        "uploaded-href-attribute-svg": "SVG-билэлэргэ олохтоох соруга суох href-атрибууттар <code>&lt;$1 $2=\"$3\"&gt;</code> бобуллаллар (а.э. http://, javascript:, уо.д.а.).",
        "uploaded-href-unsafe-target-svg": "Хачайдаммыт SVG-билэҕэ кутталлаах сигэ көһүннэ <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "«Animate» тиэк көһүннэ, кини «from»-атрибут көмөтүнэн  <code>&lt;$1 $2=\"$3\"&gt;</code> хачайдаммыт SVG-билэҕэ сигэни уларытыан сөп.",
+       "uploaded-setting-event-handler-svg": "Дьайыы таҥастыыр тэрил атрибуутун уларытар бобуллубут, киллэриллибит SVG-билэҕэ <code>&lt;$1 $2=\"$3\"&gt;</code> куод көстүбүт.",
        "uploaded-setting-href-svg": "Төрүт элэмиэҥҥэ «href» атрибуту киллэрэр «set» тиэги туһанар бобуулаах.",
        "uploaded-wrong-setting-svg": "«Set» тиэги аадырыс/дааннай/сценарий быһыытынан ханнык баҕарар атрибуукка эбии хааччахтаммыт. Угуллубут SVG-билэҕэ <code>&lt;set to=\"$1\"&gt;</code> конструкция көстүбүт.",
        "uploaded-setting-handler-svg": "«Handler» атрибууту аадырыс/дааннай/скрипт көмөтүнэн быһаарар SVG хааччахтаммыт. Угуллубут SVG-билэҕэ <code>$1=\"$2\"</code> конструкция көстүбүт.",
+       "uploaded-remote-url-svg": "Тэйиччи URL-лунан атрибууттуур SVG хааччахтаммыт. Киллэриллибит SVG-билэҕэ <code>$1=\"$2\"</code> көстүбүт.",
        "uploaded-image-filter-svg": "Хачайдаммыт SVG-билэҕэ маннык URL-аадырыстаах ойуу сиидэтэ көстүбүт <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "Бу SVG-билэ алҕастаах аат даллаах эбит: '$1'",
        "uploadinvalidxml": "Хачайдаммит билэҕэ XML анаалыстанар кыаҕа суох.",
        "upload-options": "Хачайдааһын туруоруулара",
        "watchthisupload": "Билэни кэтииргэ",
        "filewasdeleted": "Маннык ааттаах билэ урут баар эбит, ону соппуттар. $1 суруттарыах иннинэ өссө биирдэ толкуйдаа.",
+       "filename-thumb-name": "Билэҥ аата кыра ойуу аатыгар маарыҥныыр. Бука диэн, манныгы угума. Өскө, бу билэни хайаан да угуоххун баҕарар буоллаххына, аатын уларыт, кыра ойуу префиксын сотон баран.",
        "filename-bad-prefix": "Киллэрээри гынар билэҥ аата '''\"$1\"''' фотоаппарат аптамаатынан ааттыыр аатыгар майгынныыр. Бука диэн атыннык, арыый сиһилии ааттаан киллэрэриҥ буоллар.",
        "filename-prefix-blacklist": " #<!-- Бу строканы оннунан хааллар --> <pre>\n# Синтаксииһа маннык:\n#   * Бу \"#\" бэлиэттэн саҕалаан строка бүтүөр дылы быһаарыы\n#   * Кураанах буолбатах строка - билэ фотоаппарат аптамаатынан ааттаабыт ааттарын префикса\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # сорох мобильнай төлөппүөннэр\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- Бу строканы оннунан хааллар -->",
        "upload-success-subj": "Сатанна",
        "upload-dialog-button-done": "Оҥоһулунна",
        "upload-dialog-button-save": "Бигэргэт",
        "upload-dialog-button-upload": "Киллэрии",
-       "upload-process-error": "Алҕас таҕыста",
-       "upload-process-warning": "Сэрэтии үөскээтэ",
        "upload-form-label-select-file": "Билэни тал",
        "upload-form-label-infoform-title": "Сиһилии",
        "upload-form-label-infoform-name": "Аата",
        "upload-form-label-infoform-description": "Быһаарыыта",
        "upload-form-label-usage-title": "Туһаныы",
        "upload-form-label-usage-filename": "Билэ аата",
+       "foreign-structured-upload-form-label-own-work": "Бу бэйэм оҥоруум",
+       "foreign-structured-upload-form-label-infoform-categories": "Категорията",
+       "foreign-structured-upload-form-label-infoform-date": "Күнэ-дьыла",
+       "foreign-structured-upload-form-label-own-work-message-local": "{{SITENAME}} быраабылатын уонна лиссиэнсийэлиир бэлиитикэтин тутуһан бу билэни киллэрэрбин бигэргэтэбин.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Бу билэҕин {{SITENAME}} быраабылатынан угар кыаҕыҥ суох буоллаҕына, маны сап уонна атын ньыманан туһанан көр.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Баҕар [[Special:Upload|киллэрии сүрүн ньыматын]] туһаныаххын баҕарыаҥ.",
+       "foreign-structured-upload-form-label-own-work-message-default": "Уопсай репозиторийга угарбын өйдөөн туран угабын. Туһаныы сиэрин уонна лиссиэнсийэлиир бэлиитикэни кытта сөп түбэһэрин мэктиэлиибин.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Бу билэҕин уопсай репозиторий быраабылатынан угар кыаҕыҥ суох буоллаҕына, маны сап уонна атын ньыманы туһанан көр.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын сөп.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Бу билэни бас билэрбин уонна Биики Ыскылаакка төнүннэрбэттии [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0] лиссиэнсийэннэн угары бигэргэтэбин. Ону тэҥэ [https://wikimediafoundation.org/wiki/Условия_использования Туһаныы усулуобуйатын кытта] сөбүлэһэбин.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Өскөтө билэни бас билбэт буоллаххына, биитэр атын лиссиэнсийэннэн угуоххун баҕарар буоллаххына, манна баар ньыманы туһаныаххын сөп: [https://commons.wikimedia.org/wiki/Special:UploadWizard Биики Ыскылаакка угуу маастара].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын эмиэ сөп.",
        "backend-fail-stream": "$1 билэни ыытар табыллыбата.",
        "backend-fail-backup": "Бу билэ $1 резервнэй куопуйатын оҥорор табыллыбата.",
        "backend-fail-notexists": "Маннык $1 билэ суох эбит.",
        "index-category-desc": "Сирэйгэ <nowiki>__INDEX__</nowiki> диэн «аптаах тыл» баар эбит (сирэй ону көҥүллүүр аат далыгар баар эбит), онон көрдүүр роботтар кинини болҕомтоҕо ылыа да суох түгэннэргэ көрөллөр эбит.",
        "post-expand-template-inclusion-category-desc": "Халыыптары барытын көрдөрдөххө сирэй ыйааһына маны <code>$wgMaxArticleSize</code> куоһарыан сөп, онон сорҕото эрэ көрдөрүлүннэ.",
        "post-expand-template-argument-category-desc": "Халыып аргуменын арыйдахха (фигурнай ускуопка иһигэр баары, холобур, <code>{{{Foo}}})</code>, сирэй маннааҕар улахан буолуо: <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "СиÑ\80Ñ\8dйгÑ\8d Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81анÑ\8b Ñ\81ииÑ\80 Ñ\84Ñ\83нкÑ\86иÑ\8f Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллÑ\83бÑ\83Ñ\82 (Ñ\85олобÑ\83Ñ\80, Ð¼Ð°Ð½Ð½Ñ\8bк <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Ð\91Ñ\83 ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 Ñ\81игÑ\8d Ð±Ð°Ð°Ñ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна Ñ\8dбиллÑ\8dÑ\80 (Ñ\81Ñ\83оÑ\85 Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dнии).",
-       "hidden-category-category-desc": "Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8dлÑ\8dÑ\8dÑ\85 ÐºÐ°Ñ\82егоÑ\80иÑ\8f <code><nowiki>__HIDDENCAT__</nowiki></code> ÐºÐ¸Ð½Ð¸Ð½Ð¸ ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81алааÑ\82Ñ\8bгаÑ\80 ÐºÓ©Ñ\81Ñ\82Ó©Ñ\80үн Ð±Ð¾Ð±ор.",
+       "expensive-parserfunction-category-desc": "СиÑ\80Ñ\8dйгÑ\8d Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81анÑ\8b Ñ\81ииÑ\80 Ñ\84Ñ\83нкÑ\86иÑ\8f Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллÑ\83бÑ\83Ñ\82 (Ñ\85олобÑ\83Ñ\80, Ð¼Ð°Ð½Ð½Ñ\8bгÑ\8b <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "СиÑ\80Ñ\8dй Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dÑ\82Ñ\8d Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 (Ñ\81Ñ\83оÑ\85 Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dнÑ\8dÑ\80).",
+       "hidden-category-category-desc": "Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8dлÑ\8dÑ\8dÑ\85 ÐºÐ°Ñ\82егоÑ\80иÑ\8f <code><nowiki>__HIDDENCAT__</nowiki></code> ÐºÐ¸Ð½Ð¸Ð½Ð¸ ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81алааÑ\82Ñ\8bн Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80игÑ\8dÑ\80 ÐºÓ©Ñ\81Ñ\82үбÑ\8dÑ\82 Ð¾Ò¥Ð¾Ñ\80ор.",
        "trackingcategories-nodesc": "Ойуулааһына суох.",
        "trackingcategories-disabled": "Араарыллыбыт категория",
        "mailnologin": "Аадырыһа суох",
        "emailccsubject": "Эн суругуҥ куоппуйата $1: $2",
        "emailsent": "Сурук барда",
        "emailsenttext": "Эн суругуҥ ыытылынна.",
-       "emailuserfooter": "Ð\91Ñ\83 Ñ\81Ñ\83Ñ\80Ñ\83к $2 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bга $1 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82Ñ\82ан Â«Ð¡Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\8bÑ\8bÑ\82» Ð´Ð¸Ñ\8dн Ñ\84Ñ\83нкÑ\86иÑ\8f ÐºÓ©Ð¼Ó©Ñ\82үнÑ\8dн {{SITENAME}} Ñ\81аайÑ\82ан ыытыллыбыт.",
+       "emailuserfooter": "Ð\91Ñ\83 Ñ\81Ñ\83Ñ\80Ñ\83к $2 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bга $1 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82Ñ\82ан Â«Ð¡Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\8bÑ\8bÑ\82» Ð´Ð¸Ñ\8dн Ñ\82Ñ\8dÑ\80ил ÐºÓ©Ð¼Ó©Ñ\82үнÑ\8dн {{SITENAME}} Ñ\81иÑ\82им-Ñ\81иÑ\80Ñ\82Ñ\8dн ыытыллыбыт.",
        "usermessage-summary": "Тиһилик биллэриитин хааллар.",
        "usermessage-editor": "Тиһилик биллэрээччитэ",
        "watchlist": "Кэтэбилим тиһигэ",
        "mywatchlist": "Кэтэбил тиһигэ",
        "watchlistfor2": "$1 $2 аналлаах",
        "nowatchlist": "Эн кэтиир сирэйдэриҥ суохтар.",
-       "watchlistanontext": "Кэтэбилиҥ сирэйин көрөргөр эбэтэр уларытаргар маны оҥор: $1.",
+       "watchlistanontext": "Кэтэбилиҥ сирэйин көрөргө эбэтэр уларытарга бэлиэ-аатынан киириэхтээххин.",
        "watchnologin": "Бэйэҕин билиһиннэр",
        "addwatch": "Кэтэбил тиһигэр киллэр",
-       "addedwatchtext": "«[[:$1]]» сирэй [[Special:Watchlist|кэтэбил тиһигэр]] киирдэ.\nСирэй уларытыылара уонна кинини кытта ситимнээх ырытыы сирэйин уларытыылара бүгүҥҥүттэн онно көстөр буолуохтара.",
+       "addedwatchtext": "«[[:$1]]» сирэй уонна кинини кытта ситимнээх ырытыы сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигэр]] киирдэ.",
        "addedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигэр эбилиннэ.",
        "removewatch": "Кэтэбил тиһигиттэн сот",
-       "removedwatchtext": "[[:$1]]\" сирэй [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулунна.",
+       "removedwatchtext": "[[:$1]]\" сирэй уонна кини ырытыытын сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулунна.",
        "removedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигиттэн сотулунна.",
        "watch": "Кэтээ",
        "watchthispage": "Бу сирэйи кэтээ",
        "wlheader-enotif": "Эл. почтанан биллэрии холбоммут.",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
        "wlnote": "Манна кэлиҥҥи {{PLURAL:$2|чаас|'''$2''' чаас}} иһигэр оҥоһуллубут бүтэһик $1 уларытыы көрдөрүлүннэ, бу кэмҥэ туругунан $3 $4.",
-       "wlshowlast": "бүÑ\82Ñ\8dһик $1 Ñ\87ааÑ\81ка $2 ÐºÒ¯Ò¥Ò¥Ñ\8d  көрдөр",
+       "wlshowlast": "Ð\91Ò¯Ñ\82Ñ\8dһик $2 ÐºÒ¯Ò¥Ò¥Ñ\8d $1 Ñ\87ааÑ\81ка көрдөр",
        "watchlist-options": "Кэтээн көрүү туруоруутун уларытыы",
        "watching": "Кэтээ...",
        "unwatching": "Кэтээмэ...",
        "deletepage": "Сирэйи сот",
        "confirm": "Бигэргэтии",
        "excontent": "иһинээҕитэ: '$1'",
-       "excontentauthor": "иһинээҕитэ: «$1» (соҕотох ааптар [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "иһинээҕитэ: «$1», соҕотох ааптар \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "иһинээҕитэ сотуллуон иннинэ: '$1'",
        "delete-confirm": "Маны \"$1\" соторго",
        "delete-legend": "Сотуу",
-       "historywarning": "'''Сэрэтии''': Сотоору турар сирэйиҥ көрүллүбүт $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
+       "historywarning": "<strong>Сэрэтии</strong>: Сотоору турар сирэйиҥ $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
        "confirmdeletetext": "Эн сирэйи (ойууну) уонна кини устуоруйатын букатын сотоору гынаҕын.\nБука диэн, кырдьык инньэ гынаары гынаргын,\nбу дьайыы туох содуллаах буоларын толору билэргин\nуонна [[{{MediaWiki:Policy-url}}]] сиэрин кэспэккин бигэргэт.",
        "actioncomplete": "Дьайыы оҥоһулунна",
        "actionfailed": "Дьайыы оҥоһуллубата",
        "delete-edit-reasonlist": "Сотуу төрүөтүн уларытыы",
        "delete-toobig": "Бу сирэй уларытыыларын историята уһун, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маннык сирэйдэри сотор хааччахтанар, тоҕо диэххэ алҕас {{SITENAME}} алдьаныан сөп.",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
+       "deleteprotected": "Бу сирэйи, көмүскэллээх буолан, сотор кыаҕыҥ суох эбит.",
        "deleting-backlinks-warning": "'''Сэрэтии.''' Сотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
        "rollback": "Уруккутугар төннөр",
        "rollbacklink": "төннөр",
        "sessionfailure-title": "Сиэссийэ алҕаһа",
        "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
        "changecontentmodel": "Сирэй ис тутулун киэбин уларытыы",
+       "changecontentmodel-legend": "Сирэй иһинээҕитин моделын уларытыы",
        "changecontentmodel-title-label": "Сирэй баһа",
        "changecontentmodel-model-label": "Иһинээҕитин саҥа киэбэ",
        "changecontentmodel-reason-label": "Төрүөтэ:",
        "changecontentmodel-nodirectediting": "$1 иһинээҕитин киэбин быһа уларытар сатаммат эбит",
        "log-name-contentmodel": "Иһинээҕитин киэбин уларытыы сурунаала",
        "log-description-contentmodel": "Сирэй иһинээҕитин киэбин кытта ситимнээх",
+       "logentry-contentmodel-change": "$1 кыттааччы $3 сирэй иһинээҕитин мадьыалын мантан «$4» манна «$5» уларыппыт",
        "logentry-contentmodel-change-revertlink": "төннөрүү",
        "logentry-contentmodel-change-revert": "төннөрүү",
        "protectlogpage": "Харысхал сурунаала (көннөрүүттэн көмүскэммит билэлэр испииһэктэрэ)",
        "undeletepagetext": "Манна ыйыллыбыт {{PLURAL:$1|сирэй сотуллубут|$1 сирэй сотуллубуттар}} гынан баран архыыпка сыталлар.\nОнон оннуларыгар төннөрүөххүн сөп. Архыып кэмиттэн кэмигэр ыраастанар.",
        "undelete-fieldset-title": "Торумнары төнүннэр",
        "undeleteextrahelp": "Сирэйи барытын оннугар төннөрөргө тугу да бэлиэтээмэ уонна '''''{{int:undeletebtn}}''''' тимэҕи баттаа.\nСирэй сороҕун эрэ төннөрөр буоллаххына сирэй төннөрүллүөхтээх барылларын бэлиэтээ уонна '''''{{int:undeletebtn}}''''' тимэҕи баттаа.",
-       "undeleterevisions": "Архыыпка $1 {{PLURAL:$1|барыллаах|барыл баар}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|сотуллубут торумнаах|сотуллубут торум баар}}",
        "undeletehistory": "Сирэйи төннөрдөххүнэ уларытыытын устуоруйата барыта төннөрүллүө.\nСотуллубутун кэннэ маннык ааттаах атын сирэй оҥоһуллубут түбэлтэтигэр төннөрүллүбүт торумнар уларытыы сурунаалыгар саҥа суруктар иннилэригэр суруллуохтара.",
        "undeleterevdel": "Бу дьайыы сирэй эбэтэр билэ бүтэһик торумун сороҕун сотор кыахтаах буоллаҕына, оҥоһуллуо суоҕа.\nОннук түбэлтэҕэ эн бэлиэни устуохтааххын, эбэтэр бүтэһик сотуллубут торумнары көрдөрүөхтээххин.",
        "undeletehistorynoadmin": "Ыстатыйа сотуллубут.\nСотуу төрүөтэ уонна ыстатыйаны суруйбут кыттааччылар испииһэктэрэ манна көрдөрүлүннэ.\nСотуллубут ыстатыйа ис хоһоонун дьаһабыллар эрэ көрүөхтэрин сөп.",
        "move-page-legend": "Аатын уларытыы",
        "movepagetext": "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.\nБу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.\nУрукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.\nУрукку аакка ыйынньыктары аптамаатынан уларытыаххын сөп.\nИнньэ гыммат буоллаххына, бука диэн [[Special:DoubleRedirects|хос ыйынньыктар]] уонна [[Special:BrokenRedirects|быстыбыт сигэниилэр]] баалларын-суохтарын көр.\nСиэр быһыытынан ыйынньыктар сөпкө сигэнэллэрин эн ситиһиэхтээххин.\n\nӨскө маннык ааттаах сирэй номнуо баар буоллаҕына сирэй аата '''уларыйыа суоҕа''', арай ол сирэй кураанах эбэтэр утаарар сирэй буолбатах буоллаҕына.\nОл аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп, ол гынан баран баар сирэйи алҕас сотор кыаҕыҥ суох.\n\n'''Сэрэтии!'''\n''Элбэхтик туһаныллар'' сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.\nОнон, бука диэн, салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
        "movepagetext-noredirectfixer": "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.\nБу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.\nУрукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.\nБука диэн [[Special:DoubleRedirects|хос ыйынньыктар]] уонна [[Special:BrokenRedirects|быстыбыт сигэниилэр]] баалларын көр.\nСигэлэр сөпкө ыйалларын эн ситиһиэхтээххин.\n\nӨскө маннык ааттаах сирэй хайыы-үйэ баар буоллаҕына сирэй аата '''уларыйыа суоҕа''', арай ол сирэй кураанах эбэтэр утаарар сирэй буолбатах буоллаҕына.\nОл аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп гынан баран, баар сирэйи алҕас сотор кыаҕыҥ суох.\n\n'''СЭРЭТИИ!'''\nСирэй аатын уларытыы улахан уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.\nОнон, бука диэн салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
-       "movepagetalktext": "ХолбонÑ\83ллÑ\83бÑ\83Ñ\82 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b (бааÑ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна) Ñ\8dмиÑ\8d Ð°Ð°Ñ\82Ñ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bа. Ð\9eл Ñ\81аÑ\82аммаÑ\82 Ñ\82үбÑ\8dлÑ\82Ñ\8dлÑ\8dÑ\80Ñ\8d:\n*Ð\9cаннÑ\8bк Ð°Ð°Ñ\82Ñ\82ааÑ\85 ÐºÑ\83Ñ\80аанаÑ\85 Ð±Ñ\83олбаÑ\82аÑ\85 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ð±Ð°Ð°Ñ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна\n*Ð\9cанна Ð±Ñ\8dлиÑ\8d Ñ\82Ñ\83Ñ\80Ñ\83оÑ\80баÑ\82аÑ\85Ñ\85Ñ\8bна.\n\nÐ\98Ñ\82и Ñ\82үгÑ\8dннÑ\8dÑ\80гÑ\8d Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ð±Ñ\8dйÑ\8dÒ¥ ÐºÓ©Ò»Ó©Ñ\80Ò¯Ó©Ñ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\85олбÑ\83оÑ\85Ñ\82ааÑ\85Ñ\85Ñ\8bн.",
+       "movepagetalktext": "Ð\91Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dÑ\82Ñ\8dÑ\85Ñ\85инÑ\8d Ð¼Ð°Ð½Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ñ\8dмиÑ\8d Ð°Ð°Ñ\82Ñ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bа. Ð\9eл Ñ\81аÑ\82аммаÑ\82 Ñ\82үбÑ\8dлÑ\82Ñ\8dÑ\82Ñ\8d: Ð\9cаннÑ\8bк Ð°Ð°Ñ\82Ñ\82ааÑ\85 ÐºÑ\83Ñ\80аанаÑ\85 Ð±Ñ\83олбаÑ\82аÑ\85 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ð±Ð°Ð°Ñ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна.\n\nÐ\9eннÑ\83к Ñ\82үгÑ\8dÒ¥Ò¥Ñ\8d Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ð±Ñ\8dйÑ\8dÒ¥ ÐºÓ©Ò»Ó©Ñ\80Ò¯Ó©Ñ\85Ñ\85үн Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\85олбÑ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.",
        "moveuserpage-warning": "'''Болҕой:''' Эн кыттааччы тус сирэйин аатын уларытаары гынныҥ. Инньэ гыннаххына сирэй аата эрэ уларыйыа, кыттааччы бэйэтин аата уларыйыа '''суоҕа'''.",
        "movecategorypage-warning": "<strong>Сэрэтии:</strong> Категория сирэйин көһөрөөрү гынныҥ. Бука диэн, өйдөө, бу эрэ сирэй көһүө, эргэ категория атын сирэйдэрэ саҥа категорияҕа <em>киириэхтэрэ суоҕа</em>.",
        "movenologintext": "Эн аакын [[Special:UserLogin|билиһиннэрдэххинэ]] эрэ сирэй аатын уларытар кыахтаныаҥ.",
        "import-error-special": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ кини угуллубут аатын далыгар саҥа сирэйдэри оҥорор көҥүллэммэт эбит.",
        "import-error-invalid": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ маннык аат туттуллара бу биикигэ бобуулаах.",
        "import-error-unserialize": "«$1» сирэй $2 барыла структуураланар (десериализация) кыаҕа суох. Барылга иһинээҕитин модела маннык: $3, маннык серияланар: $4.",
+       "import-error-bad-location": "$2 уларытыы, $3 мадьыалы туһанар буолан бу биики «$1» сирэйигэр бигэргэтиллэр кыаҕа суох эбит, тоҕо диэтэххэ ити мадьыал бу сирэйгэ өйөнүллүбэт.",
        "import-options-wrong": "Алҕастаах {{PLURAL:$2|опция|опциялар}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Тирэх сирэй ыйыллыбыт аата алҕастаах.",
        "import-rootpage-nosubpage": "\"$1\" тирэх сирэй аатын далыгар сирэй үөдүҥнэрэ (подстраницалар) көҥүллэммэттэр",
        "importlogpage": "Импорт сурунаала",
        "importlogpagetext": "Сирэйдэри историяларын кытта холбуу атын биикилэртэн импортааһын.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|барыл|барыл баар}}",
-       "import-logentry-interwiki-detail": "баÑ\80Ñ\8bÑ\82а $2 Ð±Ð°Ñ\80Ñ\8bлÑ\82ан $1 Ð±Ð°Ñ\80Ñ\8bл",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|барыл угулунна|барылы уктубут}}",
+       "import-logentry-interwiki-detail": "Ð\91аÑ\80Ñ\8bÑ\82а $2 Ð±Ð°Ñ\80Ñ\8bлÑ\82ан $1 Ð±Ð°Ñ\80Ñ\8bл Ñ\83гÑ\83лÑ\83нна",
        "javascripttest": "JavaScript тургутуу",
        "javascripttest-pagetext-noframework": "Бу сирэй JavaScript тургутууларга анаммыт.",
        "javascripttest-pagetext-unknownframework": "\"$1\" тургутуу биллибэт эйгэтэ.",
+       "javascripttest-pagetext-unknownaction": "Биллибэт дьайыы «$1».",
        "javascripttest-pagetext-frameworks": "Бука диэн, бу тургуутуу эйгэлэриттэн биирин тал: $1",
        "javascripttest-pagetext-skins": "Тургутууну ыытарга тас көрүҥүн бастаан тал:",
        "javascripttest-qunit-intro": "[$1 тургутуу документациятын] манна mediawiki.org көр.",
        "tooltip-feed-atom": "Atom бу сирэйгэ",
        "tooltip-t-contributions": "Бу кыттааччы уларыппыт сирэйдэрин испииһэгэ",
        "tooltip-t-emailuser": "Бу киһиэхэ сурук ыытарга",
+       "tooltip-t-info": "Бу сирэй туһунан сиһилии",
        "tooltip-t-upload": "Билэлэри суруттарыы",
        "tooltip-t-specialpages": "Анал сирэйдэр испииһэктэрэ",
        "tooltip-t-print": "Сирэй бэчээккэ ыытыллар торума",
        "pageinfo-robot-index": "Көҥүллэммит",
        "pageinfo-robot-noindex": "Араарыллыбыт",
        "pageinfo-watchers": "Кэтээнэр сирэйдэр ахсааннара",
+       "pageinfo-visiting-watchers": "Сирэйи кэтиир уонна тиһэх көннөрүүлэри көрбүт дьон ахсаана",
        "pageinfo-few-watchers": "$1 кыттааччыттан аҕыйах кэтээччи",
+       "pageinfo-few-visiting-watchers": "Сирэйи кэтиир уонна тиһэх уларыйыылары көрбүт да, атын да кыттааччылар буолуохтарын сөп",
        "pageinfo-redirects-name": "Бу сирэйгэ утаарыы ахсаана",
        "pageinfo-subpages-name": "Сирэй аннынааҕы сирэйдэр ахсааннара",
        "pageinfo-subpages-value": "$1 ($2 утаарыы; $3 көннөрү (утаарыыта суох))",
        "pageinfo-protect-cascading-yes": "Сөп",
        "pageinfo-protect-cascading-from": "Каскадынан көмүскэл мантан",
        "pageinfo-category-info": "Категория туһунан",
+       "pageinfo-category-total": "Бары",
        "pageinfo-category-pages": "Сирэй ахсаана",
        "pageinfo-category-subcats": "Субкатегория ахсаана",
        "pageinfo-category-files": "Билэ ахсаана",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ырытыы]])",
        "duplicate-defaultsort": "Болҕой: Наардааһын «$2» күлүүһэ урукку «$1» күлүүһү сабар (Ключ сортировки переопределяет прежний ключ).",
        "duplicate-displaytitle": "<strong>Болҕой:</strong> Көрдөрүллүбүт «$2» аат урут көрдөрүллүбүт «$1» ааты уларытар.",
+       "invalid-indicator-name": "<strong>Алҕас:Сирэй туругун көрдөрөр индикатор </strong> атрибута <code>name</code> кураанах буолуо суохтаах.",
        "version": "MediaWiki барыла (биэрсийэтэ)",
        "version-extensions": "Туруоруллубут расширениялар",
        "version-skins": "Туруоруллубут тас көстүү барыллара",
        "tags-create-invalid-chars": "Бэлиэ аатыгар сопутуой (<code>,</code>) эбэтэр слэш  (<code>/</code>) буолуохтаах.",
        "tags-create-invalid-title-chars": "Тиэк аатыгар сирэй баһыгар туттуллуо суохтаах бэлиэ киириэ суохтаах",
        "tags-create-already-exists": "«$1» тиэк хайыы-үйэ баар эбит.",
+       "tags-create-warnings-above": "«$1» тиэги оҥорорго маннык {{PLURAL:$2|сэрэтии көһүннэ|сэрэтиилэр көһүннүлэр}}:",
+       "tags-create-warnings-below": "Тиэги салгыы оҥоруоххун баҕараҕын дуо?",
+       "tags-delete-title": "Тиэги сот",
+       "tags-delete-explanation-initial": "«$1» тиэги билии олоҕуттан сотон эрэҕин.",
        "tags-delete-reason": "Төрүөтэ:",
        "tags-delete-submit": "Бу тиэги букатыннаахтык сот",
+       "tags-delete-not-found": "Маннык $1 бэлиэ суох эбит.",
+       "tags-delete-too-many-uses": "«$1» тиэк $2 торумтан ордукка туттуллар, ол аата сотуллар кыаҕа суох.",
+       "tags-delete-warnings-after-delete": "«$1» тиэк сотулунна, ол эрээри {{PLURAL:$2|маннык сэрэтии|маннык сэрэтиилэр}} көһүннүлэр:",
        "tags-activate-title": "Тиэги холбоо",
+       "tags-activate-question": "\"$1\" тиэги холбоон эрэҕин.",
        "tags-activate-reason": "Төрүөтэ:",
+       "tags-activate-not-allowed": "\"$1\" тиэги холбуур табыллыбат.",
+       "tags-activate-not-found": "Маннык $1 тиэк суох эбит.",
        "tags-activate-submit": "Холбоо",
        "tags-deactivate-title": "Тиэги араар",
        "tags-deactivate-question": "\"$1\" тиэги арааран эрэҕин.",
        "tags-deactivate-reason": "Төрүөтэ:",
        "tags-deactivate-not-allowed": "\"$1\" тиэги араарар табыллыбат.",
        "tags-deactivate-submit": "араар",
+       "tags-apply-no-permission": "Бэйэҥ уларытыыгар уларытыы тиэгин туруорар кыаҕыҥ суох эбит.",
+       "tags-apply-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
+       "tags-apply-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
+       "tags-update-add-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
+       "tags-update-add-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
+       "tags-update-remove-not-allowed-one": "«$1» тиэги сотор табыллыбат эбит.",
+       "tags-update-remove-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн сотуллубат|тиэктэр илиинэн сотуллубаттар}} эбит: $1",
        "tags-edit-title": "Тиэктэри уларытыы",
        "tags-edit-manage-link": "Тиэктэри дьаһайыы",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Талыллыбыт торума|Талыллыбыт торумнара}} [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Талыллыбыт дьайыыта|Талыллыбыт дьайыылара}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|Бу торумҥа|Бары $1 торумҥа}} тиэги угуу эбэтэр онтон сотуу",
        "tags-edit-existing-tags": "Баар тиэктэр:",
        "tags-edit-existing-tags-none": "''Суох''",
        "tags-edit-new-tags": "Саҥа тиэктэр:",
        "tags-edit-chosen-placeholder": "Биир эбэтэр хас да тиэги тал",
        "tags-edit-chosen-no-results": "Сөп түбэһэр тиэк көстүбэтэ",
        "tags-edit-reason": "Төрүөтэ:",
+       "tags-edit-success": "Уларытыы сөпкө бигэргэннэ.",
+       "tags-edit-nooldid-title": "Торум чопчу ыйыллыбата",
        "comparepages": "Сирэйдэри тэҥнииргэ",
        "compare-page1": "Бастакы сирэй",
        "compare-page2": "Иккис сирэй",
        "revdelete-uname-unhid": "кыттааччы аата көстөр буолбут",
        "revdelete-restricted": "хааччахтааһын администраатардарга сыһыаннаах",
        "revdelete-unrestricted": "хааччахтааһын админстраатардартан уһулунна",
+       "logentry-block-unblock": "$1 {{GENDER:$2|хааччаҕын суох гыммыт}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
+       "logentry-suppress-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччаҕын суох гыммыт}}",
+       "logentry-suppress-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
        "logentry-move-move": "$1 $3 сирэй аатын маннык $4 уларыппыт",
        "logentry-move-move-noredirect": "$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах",
        "logentry-move-move_redir": "$3 сирэйи $1 диэн кыттааччы манныкка $4  уларыппыт (утаарыы үрдүнэн)",
        "logentry-newusers-create2": "$3 кыттааччы аатын $1 бэлиэтээтэ",
        "logentry-newusers-byemail": "$3 бэлиэ-ааты $1 оҥорбут, киирии тыла электрон почтанан ыытыллыбыт",
        "logentry-newusers-autocreate": "$1 бэлиэ-аат аптамаатынан бэлиэтэннэ",
+       "logentry-protect-protect": "$1 {{GENDER:$2|көмүскээтэ}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|көмүскээбит}} $3 $4 [каскаадынан]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын (каскаадынан)",
        "logentry-rights-rights": "$3 бөлөхтөргө киириитин $1 уларыппыт: манныктан $4 манныкка $5",
        "logentry-rights-rights-legacy": "$3 бөлөхтөргө киириитин $1 уларыппыт",
        "logentry-rights-autopromote": "$1 мантан $4 манна $5 көһөрүллүбүт",
        "logentry-upload-upload": "$1 {{GENDER:$2|укпут}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|киллэрбит}}: $3 саҥа торумун",
+       "logentry-upload-revert": "$1 {{GENDER:$2|укпут}}: $3",
        "log-name-managetags": "Тиэктэр сурунааллара",
+       "log-description-managetags": "Бу сирэйгэ [[Special:Tags|тиэктэри]] уларытары кытта ситимнээх соруктар көстөллөр. Сурунаалга дьаһабыл илиитинэн эрэ оҥорбут дьайыылара бааллар. Тиэктэри биики бырагырааматын көмөтүнэн манна бэлиэтээбэккэ эрэ эмиэ уларытыахха сөп.",
+       "log-name-tag": "Тиэк сурунаала",
        "rightsnone": "(суох)",
        "revdelete-summary": "уларытыылар туһунан",
        "feedback-adding": "Сирэй туһунан санаа этии...",
index 1be5ee8..7cbbda8 100644 (file)
        "createaccountreason": "Raison:",
        "createacct-reason": "Raison",
        "createacct-reason-ph": "Why ar ye creating anither accoont",
-       "createacct-captcha": "Security check.",
-       "createacct-imgcaptcha-ph": "Enter the tex ye see abuin",
        "createacct-submit": "Mak yer accoont",
        "createacct-another-submit": "Mak anither accoont",
        "createacct-benefit-heading": "{{SITENAME}} is makit bi fowk like ye.",
index f81d91e..76fbc93 100644 (file)
@@ -4,32 +4,38 @@
                        "Aursani",
                        "아라",
                        "Fayazburiro",
-                       "Sindhu"
+                       "Sindhu",
+                       "Mehtab ahmed"
                ]
        },
-       "tog-underline": "هيٺان ڏنل لڪير واري لنڪ",
-       "tog-hideminor": "تازÙ\8aÙ\88Ù\86 Ù\86Ù\86Ú\8dÙ\8aÙ\88Ù\86 ØªØ¨Ø¯ليون لڪايو",
+       "tog-underline": "ڳنڍڻي هيٺان لڪير:",
+       "tog-hideminor": "تازÙ\8aÙ\88Ù\86 Ù\85عÙ\85Ù\88Ù\84Ù\8a ØªØ¨Ø¯Ù\8aليون لڪايو",
        "tog-hidepatrolled": "تازيون گھميل تبديليون لڪايو",
-       "tog-newpageshidepatrolled": "نئين صفحن تان تازي گھميل صفحي جي لسٽ لڪايو",
-       "tog-numberheadings": "خودڪار نمبرن واري هيڊنگ",
-       "tog-showtoolbar": "ايڊٽ بار ڏيکاريو",
-       "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا ايڊت ڪيو",
-       "tog-watchcreations": "منهنجا سرجيل صفحا منهنجي نهار فهرست ۾ رکو",
-       "tog-watchdefault": "منهنجا ترميميل صفحا منهنجي نهار فهرست تي رکو",
+       "tog-newpageshidepatrolled": "نَوَن صفحن واري فهرست مان تازو گھميل صفحا لڪايو",
+       "tog-hidecategorization": "صفحن جا ذمرا لڪايو",
+       "tog-extendwatchlist": "تازه ترين بدران سموريون تبديليون ڏيکارڻ لاءِ ٽيٽ لسٽ کي وسيع ڪريو.",
+       "tog-numberheadings": "سُرخين کي خودڪار طريقي سان نمبر ڏيو",
+       "tog-showtoolbar": "سنوار اوزار ڏيکاريو",
+       "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا سنواريو",
+       "tog-watchcreations": "منهنجا سرجيل صفحا منهنجي ٽيٽ فهرست ۾ رکو",
+       "tog-watchdefault": "منهنجا ترميميل صفحا منهنجي ٽيٽ فهرست تي رکو",
+       "tog-watchmoves": "جيڪي صفحا ۽ فائيلس آئون چوريان، سي منهنجي ٽيٽ لسٽ ۾ شامل ڪريو.",
        "tog-watchdeletion": "آئون جيڪي صفحا ڊاهيان، سي منهنجي ٽيٽ فهرست تي رکو",
        "tog-watchrollback": "انهن صفحن کي منهنجي ٽيٽ فهرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي.",
-       "tog-previewontop": "ترميمي باڪس مٿان پيش نگاهه ڏيکاريو",
-       "tog-previewonfirst": "پهرين ترميم تي پيش نگاهه ڏيکاريو",
+       "tog-minordefault": "سمورين تبديلين کي بنان چئي معمولي ترميم تصور ڪريو",
+       "tog-previewontop": "ترميمي باڪس مٿان پيش نگاهہ ڏيکاريو",
+       "tog-previewonfirst": "پهرين ترميم تي پيش نگاهہ ڏيکاريو",
        "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برق ٽپال اماڻيو",
        "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برق ٽپال ڪريو",
        "tog-shownumberswatching": "ٽيٽيندڙ يوزرس جو تعداد ڏيکاريو",
        "tog-oldsig": "موجوده دستخط",
+       "tog-watchlisthideown": "ٽيٽ فهرست مان منهنجون ڪيل ترميمون لڪايو",
        "tog-watchlisthideliu": "لاگ اِن ٿيل يوزرس جون ڪيل ترميمون ٽيٽ فهرست ۾ نہ ڏيکاريو",
        "tog-ccmeonemails": "ٻين يوزرس ڏانهن منهنجي موڪليل برق ٽپال جو پرت مون کي اماڻيو",
-       "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نه ڏيکاريو",
+       "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نہ ڏيکاريو",
        "tog-showhiddencats": "لڪل زمرا ڏيکاريو",
-       "underline-always": "هميشه",
-       "underline-never": "ڪڏهن به نه",
+       "underline-always": "هميشہ",
+       "underline-never": "ڪڏهن بہ نہ",
        "sunday": "آچر",
        "monday": "سومر",
        "tuesday": "اڱارو",
        "category_header": "\"$1\" زمري جا صفحا",
        "subcategories": "ذيلي زمرا",
        "category-media-header": " \"$1\" زمري اندر ذريعات",
-       "category-empty": "''في الوقت هن زمري ۾ ڪي به صفحا يا ذريعات شامل ناهن.''",
+       "category-empty": "''في‌الوقت هن زمري ۾ ڪي بہ صفحا يا ذريعات شامل ناهن.''",
        "hidden-categories": "{{PLURAL:$1|لڪيل زمرو|لڪيل زمرا}}",
        "hidden-category-category": "لڪل زمرا",
+       "category-subcat-count": "{{PLURAL:$2|هن ذمري ۾ رڳو هيٺيون ذيلي ذمرو آهي.|هن ذمري ۾ ڪل $2 مان هيٺيان {{PLURAL:$1|subcategory|$1 ذيلي ذمرا}} آهن.}}",
        "listingcontinuesabbrev": "جاري..",
+       "index-category": "ڏسڻيل صفحا",
+       "noindex-category": "غيرڏسڻيل صفحا",
+       "broken-file-category": "فائيل جي ٽٽل ڳنڍڻن وارا صفحا",
        "about": "بابت",
-       "article": "مسوَدو",
-       "newwindow": "(نئين کڙڪيءَ ۾ کلندو)",
+       "article": "موادي صفحو",
+       "newwindow": "(نئين دريءَ ۾ کلندو)",
        "cancel": "رد",
        "moredotdotdot": "اڃا...",
+       "morenotlisted": "فهرست مڪمل ڪانهي.",
        "mypage": "منهنجو صفحو",
-       "mytalk": "ڳاله ٻوله",
+       "mytalk": "ڳالهہ ٻول",
+       "anontalk": "هن آءِ پِي پتي لاءِ مباحثي صفحو",
        "navigation": "رهنمائي",
-       "and": "&#32;۽",
+       "and": "&#32؛۽",
        "qbfind": "ڳوليو",
        "qbbrowse": "جھانگيو",
        "qbedit": "سنواريو",
        "faq": "ڪپوس",
        "faqpage": "Project:ڪپوس",
        "namespaces": "نانءُ پولار:",
-       "variants": "اÙ\82ساÙ\85",
+       "variants": "بÙ\8eدÙ\8eÙ\84Ù\8e",
        "navigation-heading": "رهنما مينيو",
        "errorpagetitle": "چُڪَ",
        "returnto": "$1 ڏانهن وَرو.",
        "permalink": "مسقتل ڳنڍڻو",
        "print": "ڇاپيو",
        "view": "نگاهہ",
+       "view-foreign": "$1 تي ڏسو",
        "edit": "سنواريو",
-       "edit-local": "مقامي وضاحت کي ترميميو",
+       "edit-local": "مقامي تشريح کي ترميميو",
        "create": "سرجيو",
+       "create-local": "مقامي تشريح ڏيو",
        "editthispage": "هيءُ صفحو سنواريو",
        "create-this-page": "اهو صفحو نئين سر جوڙيو",
        "delete": "ڊاھيو",
        "protect": "تحفظيو",
        "protect_change": "تبديل ڪريو",
        "protectthispage": "هيءُ صفحو تحفظيو",
-       "unprotect": "Ø­Ù\81اظت Ù\85Ù½يو",
-       "unprotectthispage": "Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ø¬Ù\8a Ø­Ù\81اظت Ù\85Ù½يو",
+       "unprotect": "تحÙ\81ظ Ø¨Ø¯Ù\84ايو",
+       "unprotectthispage": "Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ø¬Ù\88 ØªØ­Ù\81ظ Ø¨Ø¯Ù\84ايو",
        "newpage": "نئون صفحو",
        "talkpage": "هن صفحي تي بحث ڪريو",
        "talkpagelinktext": "بحث",
        "otherlanguages": "ٻين ٻولين ۾",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
-       "redirectto": "منتقل ڪيو",
+       "redirectto": "ڏانهن چوريو",
        "lastmodifiedat": "هيءُ صفحو آخري ڀيرو $2، $1ع تي ترميميو ويو هو.",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
        "pool-errorunknown": "اڻ ڄاتل چُڪَ",
        "aboutsite": "{{SITENAME}} بابت",
        "aboutpage": "Project:بابت",
-       "copyright": "سمورو مواد $1 تحت ميسر ڪجي ٿو",
+       "copyright": "ڪجھہ ٻيو ڄاڻايل نہ هجڻ جي صورت ۾ سمورو مواد $1 تحت ميسر ڪجي ٿو.",
        "copyrightpage": "{{ns:project}}:حق ۽ واسطا",
        "currentevents": "ھاڻوڪا واقعا",
        "currentevents-url": "Project: اعداد",
        "disclaimers": "غيرجوابداريناما",
        "disclaimerpage": "Project:عام غيرجوابدارينامو",
        "edithelp": "مدد براءِ ترميم",
+       "helppage-top-gethelp": "مدد",
        "mainpage": "مُک صفحو",
        "mainpage-description": "مُک صفحو",
        "policy-url": "Project:پاليسي",
        "privacy": "ذاتيات پاليسي",
        "privacypage": "Project:ذاتيات پاليسي",
        "badaccess": "اجازتنامہ چُڪَ",
+       "versionrequired": "ذريعات‌وڪي جو ورزن $1 درڪار",
+       "versionrequiredtext": "هيءُ صفحو استعمال ڪرڻ لاءِ ذريعات‌وڪي جو ورزن $1 درڪار آهي. وڌيڪ ڄاڻڻ لاءِ [[Special:Version|ورزن بابت صفحو]] ڏسو.",
        "ok": "ٺيڪ",
        "retrievedfrom": "\"$1\" تان ورتل",
        "youhavenewmessages": "توهان لاءِ $1 ($2) آهن.",
        "toc": "فهرست",
        "showtoc": "ڏيکاريو",
        "hidetoc": "لڪايو",
+       "confirmable-confirm": "ڇا{{GENDER:$1|توهانکي}} پڪ آهي؟",
        "confirmable-yes": "ها",
-       "confirmable-no": "نه",
+       "confirmable-no": "نہ",
+       "thisisdeleted": "$1 کي ڏسڻ يا بحالڻ چاهيندا؟",
        "viewdeleted": "$1 ڏسندا؟",
+       "restorelink": "{{PLURAL:$1|هڪڙي ڊاٺل ترميم|$1 ڊاٺل ترميمون}}",
        "feedlinks": "روان رسد:",
        "site-rss-feed": "$1 آر ايس ايس روان رسد",
        "site-atom-feed": "$1 اڻو روان رسد",
        "page-rss-feed": "\"$1\" RSS برق مواد",
        "page-atom-feed": "\"$1\" اڻو روان رسد",
-       "red-link-title": "$1 (صفحو وجود نه ٿو رکي)",
+       "red-link-title": "$1 (صفحو وجود نہ ٿو رکي)",
+       "sort-descending": "لهندڙ ترتيب ڏيو",
+       "sort-ascending": "چڙهندڙ ترتيب ڏيو",
        "nstab-main": "صفحو",
        "nstab-user": "تعارفي صفحو",
        "nstab-media": "ذريعاتي صفحو",
        "nstab-template": "سانچو",
        "nstab-help": "امدادي صفحو",
        "nstab-category": "زمرو",
-       "nosuchspecialpage": "اهڙو ڪو به خاص صفحو ناهي",
+       "mainpage-nstab": "مک صفحو",
+       "nosuchspecialpage": "اهڙو ڪو بہ خاص صفحو ناهي",
        "error": "چُڪَ",
        "databaseerror": "اعدادخاني ۾ چڪ",
+       "databaseerror-textcl": "اعدادخانہ استفسار ۾ چُڪَ ٿي آهي.",
+       "databaseerror-query": "استفسار: $1",
+       "databaseerror-function": "ڪاڄ: $1",
+       "databaseerror-error": "چُڪَ: $1",
        "readonly": "اعدادخانو بنديل",
        "missingarticle-diff": "(تفاوت: $1، $2)",
+       "readonly_lag": "اعدادخانو خودڪاراً بنجي چڪو آهي، جيستائين غلام اعدادخانہ سَروَر، مالڪ سَروَر کي رسي نہ ٿو.",
        "internalerror": "اندروني خرابي",
        "internalerror_info": "داخلي چُڪَ: $1",
-       "filerenameerror": "\"$1\" نالي فائيل تي نئون نالو \"$2\" رکجي نه سگھجو.",
-       "filedeleteerror": "\"$1\" فائيل ڊهي نه سگھيو.",
-       "filenotfound": "\"$1\" نالي فائيل لڀجي نه سگھيو.",
+       "filecopyerror": "فائيل $1 جو پرت $2 تي چڙهي نہ سگھيو.",
+       "filerenameerror": "\"$1\" نالي فائيل تي نئون نالو \"$2\" رکجي نہ سگھجو.",
+       "filedeleteerror": "\"$1\" فائيل ڊهي نہ سگھيو.",
+       "directorycreateerror": "ڊائريڪٽري $1 جُڙي نہ سگھي.",
+       "directoryreadonlyerror": "ڊائريڪٽري $1 صرف پڙهي سگھجي ٿي.",
+       "directorynotreadableerror": "ڊائريڪٽري $1 پڙهي نہ ٿي سگھجي.",
+       "filenotfound": "\"$1\" نالي فائيل لڀجي نہ سگھيو.",
        "unexpected": "غير متوقع قدر: \"$1\"=\"$2\".",
+       "formerror": "چُڪَ: فارم جمع ٿي نہ سگھيو.",
+       "badarticleerror": "هن صفحي تي اهڙو عمل ڪار نہ آهي.",
+       "cannotdelete": "$1 نالي صفحو يا فائيل ڊهي نہ سگھيو. ٿي سگھي ٿو تہ ڪنهن ان کي اڳ ۾ ئي ڊاهي ڇڏيو هجي.",
+       "cannotdelete-title": "$1 نالي صفحي کي ڊاهي نہ ٿا سگھون.",
        "badtitle": "غيردرست عنوان",
+       "badtitletext": "صفحي جو گھربل عنوان ڪار ڪونهي، يا خالي آهي، يا وري غيردرست طريقي سان ڳنڍيل بين‌الزباني يا بين‌الوڪي عنوان آهي. \nان ۾ هڪ يا هڪ کان وڌيڪ اهڙا اکر موجود آهن، جيڪي عنوان ۾ استعمال ڪري نہ ٿا سگھجن.",
+       "title-invalid-utf8": "صفحي جي ڄاڻايل عنوان ۾ ناقابل ڪار يُو ٽِي ايف اکر شامل آهن.",
+       "title-invalid-interwiki": "ڄاڻايل عنوان ۾ اهڙو بين‌الوڪِي ڳنڍڻو شامل آهي، جيڪو عنوانن ۾ استعمال ڪري نہ ٿو سگھجي.",
+       "title-invalid-characters": "صفحي جي ڄاڻايل عنوان ۾ ناقابل ڪار اکر شامل آهن: $1",
+       "title-invalid-leading-colon": "صفحي جي ڄاڻايل عنوان جي ابتدا ۾ ناقابل ڪار ڪالن شامل آهي.",
        "viewsource": "ڪوڊ ڏسو",
+       "viewsource-title": "$1 جو ڪوڊ ڏسو",
        "protectedpagetext": "هيءُ صفحو ترميمن کان تحفظيل آهي.",
        "viewsourcetext": "توهان هن صفحي جو ڪوڊ ڏسي ۽ نقل ڪري سگھو ٿا:",
        "namespaceprotected": "توهان کي نانءُ پولار '''$1''' جا صفحا سنوارڻ جا اختيار ناهن.",
+       "mycustomjsprotected": "توهان کي هيءُ جاوا اسڪرپٽ صفحو سنوارڻ جي اجازت حاصل ڪانهي.",
+       "mypreferencesprotected": "توهان جي پنهنجون ترجيحات سنوارڻ جي اجات حاصل ڪانهي.",
        "ns-specialprotected": "خاص صفحا سنواري نٿا سگھجن.",
+       "exception-nologin": "لا اِن ٿيل ناهيو",
+       "virus-unknownscanner": "اڻ ڄاتل نِس وائرس:",
+       "welcomeuser": "ڀلي ڪري آيا، $1!",
        "yourname": "يُوزرنانءُ:",
+       "userlogin-yourname": "يوزرنانءُ",
+       "userlogin-yourname-ph": "پنهنجو يوزرنانءُ ڄاڻايو",
+       "createacct-another-username-ph": "يُوزرنانءُ ڄاڻايو",
        "yourpassword": "ڳجھو لفظ:",
-       "remembermypassword": "هن ڳڻپيوڪر تي مون کي ياد رکو (for a maximum of $1 {{PLURAL:$1|day|days}})",
+       "userlogin-yourpassword": "ڳجھو لفظ",
+       "userlogin-yourpassword-ph": "پنهنجو ڳجھو لفظ ڄاڻايو",
+       "createacct-yourpassword-ph": "ڳجھو لفظ ڄاڻايو",
+       "yourpasswordagain": "يُوزرنان ٻيهر ٽائيپ ڪريو:",
+       "createacct-yourpasswordagain": "ڳجھي لفظ جي خاطري ڪريو",
+       "createacct-yourpasswordagain-ph": "ٻيهر ڳجھو لفظ داخل ڪريو",
+       "remembermypassword": "هن برائوزر تي منهنجي لاگ ان کي (وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}} لاءِ) ياد رکو",
+       "userlogin-remembermypassword": "مون کي لاگ اِن رکو",
+       "yourdomainname": "توهان جو ميدان:",
+       "password-change-forbidden": "هن وڪِي تي توهان ڳجھو لفظ بدلائي نہ ٿا سگھو.",
        "login": "لاگ اِن",
        "nav-login-createaccount": "لاگ اِن ٿيو / کاتو کوليو",
        "userlogin": "لاگ اِن ٿيو / کاتو کوليو",
+       "userloginnocreate": "لاگ اِن",
        "logout": "لاگ آئوٽ",
        "userlogout": "لاگ آئوٽ",
-       "nologin": "پنهنجو کاتو نه ٿا رکو؟ '''$1'''.",
+       "notloggedin": "لاگ اِن ٿيل ناهيو",
+       "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
+       "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
+       "nologin": "پنهنجو کاتو نہ ٿا رکو؟ '''$1'''.",
        "nologinlink": "نئون کاتو کوليو",
        "createaccount": "کاتو کوليو",
        "gotaccount": "ڇا اڳي ئي کاتو رکو ٿا؟ '''$1'''.",
        "gotaccountlink": "لاگ اِن",
-       "createaccountmail": "بذريعه برق ٽپال",
+       "userlogin-resetlink": "پنهنجي لاگ اِن جا تفصيل وساري ويٺا؟",
+       "userlogin-resetpassword-link": "ڳجھو لفظ وساري ويٺا آهيو؟",
+       "userlogin-helplink2": "لاگ اِن ٿيڻ ۾ مدد",
+       "userlogin-createanother": "ٻيو کاتو کوليو",
+       "createacct-emailrequired": "برق ٽپال پتو",
+       "createacct-emailoptional": "برق ٽپال پتو (مرضيءَ موجب)",
+       "createacct-email-ph": "پنهنجو برق ٽپال پتو ڄاڻايو",
+       "createacct-another-email-ph": "برق ٽپال پتو ڄاڻايو",
+       "createaccountmail": "ڪو بہ عارضي ڳجھو لفظ استعمال ڪريو ۽ ڄاڻايل برق ٽپال پتي تي اماڻيو",
+       "createacct-realname": "اصل نالو (مرضيءَ موجب)",
+       "createaccountreason": "سبب:",
+       "createacct-reason": "سبب",
+       "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
+       "createacct-submit": "پنهنجو کاتو کوليو",
+       "createacct-another-submit": "کاتو کوليو",
+       "createacct-benefit-heading": "{{SITENAME}} توهان جهڙن سڄڻن ٺاهيو آهي.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ترميم|ترميمون}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|صفحو|صفحا}}",
+       "createacct-benefit-body3": "حاليه {{PLURAL:$1|ڀاڱيدار}}",
+       "badretype": "توهان جو ڄاڻايل ڳجھو لفظ درست نہ آهي.",
+       "usernameinprogress": "ان يُوزرنانءُ لاءِ کاتو اڳ ۾ ئي تياريءَ هيٺ آهي. مهرباني ڪري انتظار فرمايو.",
+       "userexists": "ڄاڻايل يوزرنانءُ اڳ ۾ ئي استعمال هيٺ آهي. مهرباني ڪري ڪو ٻيو يُوزرنانءُ چونڊيو.",
+       "loginerror": "لاگ اِن چُڪَ",
+       "createacct-error": "کاٿو کولڻ ۾ چُڪَ",
+       "createaccounterror": "کاتو کُلي نہ سگھيو: $1",
+       "nocookiesnew": "يُوزر کاتو کلي چڪو، پر توهان لاگ اِن نہ ٿيا آهيو. يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
+       "nocookieslogin": "يُوزرس کي لاگ اِن ڪرڻ لاءِ {{SITENAME}} ڪوڪيز استعمال ڪندي آهي. توهان ڪوڪيز کي ناڪاره بڻائي رکيو آهي. لاگ اِن ٿيڻ لاءِ ڪوڪيز کي ڪارائتو بڻايو.",
+       "noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
        "loginsuccesstitle": "لاگ اِن ڪامياب",
        "loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" لاگ اِن ٿيل آهيو.'''",
-       "nosuchuser": "\"$1\" نالي سان ڪو به يوزر نه آهي. هِجي چڪاسيو، يا نئون کاتو کوليو.",
-       "nosuchusershort": "\"$1\" نالي ڪو به يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
+       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي. يُوزرنانءُ، ننڍن وڏن اکرن ۾ امتياز ڪري ٿو. هِجي چڪاسيو، يا نئون کاتو کوليو.",
+       "nosuchusershort": "\"$1\" نالي ڪو بہ يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
        "nouserspecified": "توهان کي ڪو يوزرنانءُ ڄاڻائڻو پوندو.",
+       "login-userblocked": "هيءُ يُوزر بندشيل آهي. لاگ اِن جي اجازت نہ ٿي ڏجي.",
        "wrongpassword": "ڏنل ڳجھو لفظ غير درست آهي. مهرباني ڪري ٻيهر ڪوشش ڪندا.",
        "wrongpasswordempty": "ڏنل ڳجھو لفظ خالي هو. مهرباني ڪري وري ڪوشش ڪندا.",
-       "passwordtooshort": "توهان جو ڳجھو لفظ ناقابلڪار آهي يا تمام ننڍو آهي. اهو توهان جي يُوزرنانءُ کان لازماً مختلف ۽ {{PLURAL:$1|1 اکر|$1 اکرن}} کان ڊگھو هوڻ گھرجي.",
+       "passwordtooshort": "ڳجھي لفظ گھٽ ۾ گھٽ  {{PLURAL:$1|1 اکر|$1 اکرَن}} تي ٻڌل هوڻ گھرجي.",
+       "passwordtoolong": "ڳجھو لفظ {{PLURAL:$1|1 اکر|$1 اکرن}} کان وڏو نہ ٿو ٿي سگھي.",
+       "password-name-match": "توهان جو ڳجھو لفظ توهان جي يوزرنانءُ کان مختلف هجڻ گھرجي.",
        "mailmypassword": "ڳجھو لفظ برق ٽپاليو",
        "passwordremindertitle": "{{SITENAME}} لاءِ نئون عارضي ڳجھو لفظ",
        "passwordremindertext": "ڪنهن (شايد توهان آءِ پي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھو لفظ اماڻڻ جي گھُرَ ڪئي.\n\nهاڻي يوزر \"$2\" لاءِ ڳجھو لفظ \"$3\" آهي. توهان کي هينئر ئي لاگ اِن ٿي پنهنجو ڳجھو لفظ تبديل ڪرڻ گھرجي.\n\nجيڪڏهن اها گھُرَ اوهان نه ڪئي هئي، يا هاڻي اوهان کي پنهنجو ڳجھو لفظ ياد اچي ويو آهي ۽ توهان ان کي تبديل ڪرڻ نه ٿا چاهيو، ته توهان هن نياپي کي نظر انداز ڪندي پنهنجو پراڻو ڳجھو لفظ ئي استعمال ڪري سگھو ٿا.",
        "noemail": "يُوزر \"$1\" جي ڪو به برق ٽپال پتو درج ٿيل ناهي.",
+       "noemailcreate": "توهان کي قابل ڪار برق ٽپال پتو مهيا ڪرڻو پوندو.",
        "passwordsent": "يوزر \"$1\" لاءِ هڪ نئون ڳجھو لفظ برق ٽپال ذريعي اماڻيو ويو آهي.  مهرباني ڪري اهو حاصل ڪرڻ بعد لاگ اِن ٿيندا.",
        "mailerror": "ٽپال اماڻڻ ۾ چُڪَ: $1",
-       "acct_creation_throttle_hit": "معاف ڪجَو، اوهان اڳي ئي $1 کاتا کولي چڪا آهيو. ان کان وڌيڪ نه ٿا کولي سگھجن.",
+       "acct_creation_throttle_hit": "توهان جي آءِ پي پتي تان هن وڪيءَ تي پوئين ڏينهن $1 کاتا کلي چڪا آهن. ايتري عرصي ۾ ان کان وڌيڪ کاتا نہ ٿا کولي سگھجن. نتيجتاً ساڳي آءِ پي پتي تان في‌الوقت وڌيڪ کاتا کولي نہ ٿا سگھجن.",
+       "emailauthenticated": "توهان جي برق ٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
+       "emailnotauthenticated": "توهان جو برق ٽپال پتي جي تصديق اڃا ٿي نہ سگھي آهي.",
+       "noemailprefs": "انهن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحات ۾ برق ٽپال پتو ڄاڻايو.",
+       "emailconfirmlink": "پنهنجي برق ٽپال پتي جي پَڪَ ڪندا",
+       "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برق ٽپال پتو بدلائي نہ ٿو سگھجي.",
+       "emaildisabled": "هيءَ سرزمين برق ٽپال اماڻي نہ ٿي سگھي.",
        "accountcreated": "کاتو کلي چڪو",
        "accountcreatedtext": "$1 نالي يوزر کاتو کلي چڪو آھي.",
+       "createaccount-title": "{{SITENAME}} تي کاتو کولڻ",
+       "login-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "login-abort-generic": "توهان جو لاگ اِن ناڪام ويو.",
+       "login-migrated-generic": "توهان جو کاتو لڏي چڪو آهي، ۽ هن وڪيءَ تي توهان جو يُوزنانءُ هاڻي وجود نہ ٿو رکي.",
+       "loginlanguagelabel": "ٻولي: $1",
+       "createacct-another-realname-tip": "اصل نالو ڄاڻائڻ اختياري آهي. جيڪڏهن توهان اصل نالو ڄاڻايو ٿا، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
        "pt-login": "لاگ ان ٿيو",
+       "pt-login-button": "لاگ اِن",
        "pt-createaccount": "کاتو کوليو",
+       "pt-userlogout": "لاگ آئوٽ",
+       "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
+       "user-mail-no-addy": "برق ٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھو لفظ تبديل ڪريو",
+       "resetpass_header": "کاتي جو ڳجھو لفظ بدلايو",
+       "oldpassword": "اڳوڻو ڳجھو لفظ:",
+       "newpassword": "نئون ڳجھو لفظ:",
        "retypenew": "نئون ڳجھو لفظ ٻيهر ٽائيپ ڪندا:",
+       "resetpass_submit": "ڳجھو لفظ طَي ڪريو ۽ لاگ اِن ٿيو",
+       "changepassword-success": "توهان جو ڳجھو لفظ ڪاميابيءَ سان بدلايو ويو!",
+       "changepassword-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "resetpass_forbidden": "ڳجھو لفظ بدلائي نہ ٿو سگھجي.",
+       "resetpass-no-info": "هيءُ صفحو پڙهڻ لاءِ لاگ اِن ٿيڻ ضروري آهي.",
+       "resetpass-submit-loggedin": "ڳجھو لفظ بدلايو",
+       "resetpass-submit-cancel": "رد",
+       "resetpass-wrong-oldpass": "ناقابل ڪار هاڻوڪو يا عارضي ڳجھو لفظ. \nتوهان پنهنجو ڳجھو لفظ اڳ ۾ ئي بدلائي چڪا آهيو يا نئين ڳجھي لفظ لاءِ درخواست ڏئي چڪا آهيو.",
+       "resetpass-recycled": "مهرباني ڪري پنهنجي هاڻوڪي ڳجھي لفظ کان ڪو مختلف ڳجھو لفظ چونڊيو.",
+       "resetpass-temp-emailed": "توهان برق ٽپال ذريعي اماڻيل عارضي ڳجھي لفظ سان لاگ اِن ٿيا آهيو. لاگ اِن کي مڪمل ڪرڻ لاءِ توهان کي هتي نئون ڳجھو لفظ طَي ڪرڻو ئي پوندو:",
+       "resetpass-temp-password": "عارضي ڳجھو لفظ:",
+       "resetpass-expired-soft": "توهان جو ڳجھو لفظ مدي خارج ٿي چڪو آهي. مهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:resetpass-submit-cancel}}\" تي ڪلڪ ڪريو.",
+       "resetpass-validity-soft": "توهان جو ڳجھو لفظ ناقابل ڪار آهي: $1\nمهرباني ڪري نئون ڳجھو لفظ چونڊيو، يا ساڳيو ڪم ڪنهن ٻي وقت ڪرڻ لاءِ \"{{int:resetpass-submit-cancel}}\" تي ڪلڪ ڪريو.",
+       "passwordreset": "ڳجھو لفظ مَٽايو",
+       "passwordreset-text-one": "برق ٽپال ذريعي عارضي ڳجھو لفظ حاصل ڪرڻ لاءِ هيءُ فارم پُر ڪريو.",
+       "passwordreset-username": "يُوزرنانءُ:",
+       "passwordreset-domain": "ميدان:",
+       "passwordreset-email": "برق ٽپال پتو:",
+       "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
+       "changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
+       "changeemail-passwordrequired": "توهانکي هن تبديلي جي تصديق ڪرڻ جي لاءِ پنهنجو ڳجھو لفظ داخل ڪرڻ جي ضرورت پوندي.",
+       "changeemail-oldemail": "هاڻوڪو برق ٽپال پتو:",
+       "changeemail-newemail": "نئون برق ٽپال پتو:",
+       "changeemail-none": "(ڪو بہ نہ)",
+       "changeemail-password": "توهان جو {{SITENAME}} ڳجھو لفظ:",
+       "changeemail-submit": "برق ٽپال پتو بدلايو",
+       "changeemail-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
+       "changeemail-nochange": "مهرباني ڪري مختلف نئون برق ٽپال پتو ڄاڻايو.",
+       "resettokens-tokens": "ٽوڪنس:",
        "bold_sample": "گهري تحرير",
        "bold_tip": "گهري لکت",
        "italic_sample": "ترڇي لکت",
        "link_sample": "ڳنڍڻي جو عنوان",
        "link_tip": "داخلي ڳنڍڻو",
        "extlink_sample": "http://www.example.com ڳنڍڻي جو عنوان",
-       "extlink_tip": "خارجي ڳنڍڻو (اڳياڙي http://  نه وساريندا)",
+       "extlink_tip": "خارجي ڳنڍڻو (اڳياڙي http://  نہ وساريندا)",
        "headline_sample": "سرخي",
        "headline_tip": "سطح 2 جي سرخي",
+       "nowiki_tip": "وڪي فارميٽڱ کي نظرانداز ڪريو",
        "image_tip": "جَڙيل فائيل",
        "media_tip": "فائيل جو ڳنڍڻو",
        "sig_tip": "توهان جي صحيح بمع اوقاتي مهر",
        "hr_tip": "افقي لڪير (غيرضروري استعمال کان پاسو ڪندا)",
        "summary": "تَتُ:",
-       "subject": "موضوع/سُرخي:",
+       "subject": "موضوع:",
        "minoredit": "هيءَ هڪ معمولي ترميم آهي",
        "watchthis": "هيءُ صفحو سانڍيو",
        "savearticle": "صفحو سانڍيو",
-       "preview": "پيش نگاهه",
-       "showpreview": "پيش نگاهه",
+       "preview": "پيش نگاهہ",
+       "showpreview": "پيش نگاهہ",
        "showdiff": "تبديليون ڏيکاريو",
-       "anoneditwarning": "'''خبردار:''' توهان لاگ اِن ٿيل ناهيو.\nهن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو.",
+       "anoneditwarning": "<strong>خبردار:</strong> توهان لاگ اِن ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 لاگ اِن]</strong> ٿيو ٿا <strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سن منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
+       "anonpreviewwarning": "توهان لاگ اِن ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِ پي پتو درج ڪيو ويندو.",
        "missingcommenttext": "براءِ مهرباني هيٺ پنهنجا تاثرات درج ڪندا.",
-       "summary-preview": "تت تي پيش نگاهه:",
+       "summary-preview": "تت تي پيش نگاهہ:",
+       "subject-preview": "موضوع پيش نگاهہ:",
        "blockedtitle": "يُوزر بندشيل آهي.",
-       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن ته ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نه آهي ته توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نه ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن به پڇا ڳاڇا يا لهوچڙ  لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
+       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نہ ٿا \nYou cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن بہ پڇا ڳاڇا يا لهوچڙ لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
        "blockednoreason": "سبب اڻڄاڻايل",
+       "whitelistedittext": "صفحا سنوارڻ لاءِ مهرباني ڪري $1.",
+       "confirmedittext": "صفحا سنوارڻ کان اڳ توهان کي پنهنجو برق ٽپال پتي جي تصديق ڪرڻي پوندي. مهرباني ڪري [[Special:ترجيحات|يُوزر ترجيات]] ذريعي پنهنجو برق ٽپال پتو ڄاڻايو ۽ تصديقيو.",
+       "nosuchsectiontitle": "سيڪشن لڀجي نه سگھيو",
+       "loginreqtitle": "لاگ اِن گھربل آهي",
+       "loginreqlink": "لاگ اِن",
+       "loginreqpagetext": "ٻيا صفحا ڏسڻ لاءِ مهرباني ڪري $1",
        "accmailtitle": "ڳجھو لفظ اماڻجي چڪو.",
        "newarticle": "(نئون)",
-       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نه ٿو رکي. اهڙو صفحو جوڙڻ لاءِ هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا). جي توهان هتي غلطيءَ ۾ اچي ويا آهيو ته رڳو پنهنجي جهانگُوءَ جو '''back''' بٽڻ ڪلڪ ڪندا.",
-       "previewnote": "'''هيءَ محظ پيش نگاهه آهي، ترميمون اڃا سانڍجون ناهن!'''",
+       "newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نہ ٿو رکي. اهڙو صفحو جوڙڻ لاءِ هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا). جي توهان هتي غلطيءَ ۾ اچي ويا آهيو تہ رڳو پنهنجي جهانگُوءَ جو '''back''' بٽڻ ڪلڪ ڪندا.",
+       "noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي. توهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا.  \n\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
+       "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
+       "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
+       "previewnote": "<strong>'''هيءَ محظ پيش نگاهہ آهي.</strong> ترميمون اڃا سانڍجوين ناهن!'''",
        "editing": "زير ترميم $1",
+       "creating": "$1 سرجيندي",
        "editingsection": "زير ترميم $1 (سيڪشن)",
+       "editingcomment": "ترميم هيٺ $1 (نئون سيڪشن)",
+       "editconflict": "ترميمي تڪرار: $1",
+       "yourtext": "توهان جو ٽيڪسٽ",
+       "storedversion": "سانڍيل مسودو",
+       "yourdiff": "تفاوت",
        "copyrightwarning": "ياد رکندا ته {{SITENAME}} لاءِ سموريون ڀاڱيداريون $2 تحت پڌريون ڪجن ٿيون (تفصيلن لاءِ $1 ڏسندا). اوهان جي تحرير کي {{SITENAME}} جي قائدن تحت ترميمي سگهجي ٿو. جيڪڏهن اوهان نه ٿا چاهيو ته اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي ته پوءِ پنهنجي لکڻي هتي جمع نه ڪرايو. پنهنجو مواد هتي جمع ڪرڻ جو مطلب هوندو ته توهان کي جمع ڪرايل مواد جي مفت فراهمي ۽ کُليل تبديليءَ تي ڪو به اعتراز ناهي.<br />\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو ته توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن مفت وسيلي تان ڪاپي ڪيو آهي.\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ کان سواءِ هتي جمع نه ڪريو.'''",
-       "templatesused": "هن صفحي تي استعمال ٿيندڙ سانچا:",
-       "templatesusedpreview": "هن پيش نگاهه ۾ استعمال ٿيل سانچا:",
+       "copyrightwarning2": "ياد رکندا تہ {{SITENAME}} لاءِ سموريون ڀاڱيدارين کي ٻيا ڀاڱيدار سنواري، بدلائي، يا ڊاهي سگھن ٿا. جيڪڏهن اوهان نہ ٿا چاهيو تہ اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي تہ پوءِ پنهنجي لکڻي هتي جمع نہ ڪرايو.\n<br>\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو تہ توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن اهڙي ئي مفت عوامي وسيلي تان ڪاپي ڪيو آهي. (تفصيلن لاءِ $1 ڏسندا).\n\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ بنان هتي جمع نہ ڪريو.'''",
+       "protectedpagewarning": "<strong>چتاءُ: هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط منتظمين ئي ان کي سنواري سگھن ٿا. </strong>\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
+       "semiprotectedpagewarning": "<strong>نوٽ: هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط کاتيدار يُوزرس ئي ان کي سنواري سگھن ٿا. </strong>\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
+       "templatesused": "هن صفحي تي استعمال ٿيندڙ {{PLURAL:$1|سانچو|سانچا}}:",
+       "templatesusedpreview": "هن پيش نگاهہ ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
+       "templatesusedsection": "هن سيڪشن ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
        "template-protected": "(تحفظيل)",
        "template-semiprotected": "(نيم تحفظيل)",
+       "hiddencategories": "هيءُ صفحو  {{PLURAL:$1|1 لڪل زمري|$1 لڪل زمرن}}: جو رڪن آهي:",
        "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آهي.\nتوهان اڳي ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|لاگ اِن ٿي يا نئون کاتو کولي سگھو ٿا]].",
-       "recreate-moveddeleted-warn": "'''خبردار: توهان اهڙو صفحو نئين سر سرجي رهيا آهيو جيڪو اڳي ڊاٺو ويو آهي.'''\n\nبهتر ٿيندو ته توهان سوچي وٺو ته ڇا ان صفحي کي سنوارڻ بهتر ٿيندو.\nتوهآن جي سهوليت خاطر هتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
+       "nocreate-loggedin": "توهان کي نوان صفحا سرجڻ جي اجازت حاصل ڪانهي.",
+       "permissionserrors": "اجازتنامي جي چُڪَ",
+       "permissionserrorstext": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي اهو ڪرڻ جي اجازت حاصل ڪانهي.",
+       "permissionserrorstext-withaction": "هيٺين {{PLURAL:$1|سبب|سببن}} ڪري، توهان کي $2 جي اجازت ڪانهي.",
+       "recreate-moveddeleted-warn": "'''خبردار: توهان اهڙو صفحو نئين سِر سرجي رهيا آهيو جيڪو اڳي ڊاٺو ويو آهي.'''\n\nبهتر ٿيندو تہ توهان سوچي وٺو تہ ڇا ان صفحي کي سنوارڻ چڱو ٿيندو.\nتوهآن جي سهوليت خاطر هتي ان صفحي جو ڊاٺ لاگ ميسر ڪجي ٿو:",
+       "moveddeleted-notice": "هيءُ صفحو ڊهي چڪو آهي. \nحوالي طور ڊاٺ ۽ چور لاگ هيٺ ڏجي ٿو.",
+       "moveddeleted-notice-recent": "معاف ڪندا، هيءُ صفحو تازو ئي ڊاٺو ويو آهي (پوين 24 ڪلاڪن اندر). حوالي طور ڊاٺ ۽ چور لاگ هيٺ پيش ڪجي ٿو:",
+       "log-fulllog": "پُورو لاگ ڏسو",
+       "edit-conflict": "سنوار تڪرار",
+       "postedit-confirmation-created": "هيءُ صفحو سرجي چڪو آهي.",
+       "postedit-confirmation-restored": "هيءُ صفحو بحالجي چڪو آهي.",
+       "postedit-confirmation-saved": "توهان جي ترميم سانڍجي چڪي آهي.",
+       "edit-already-exists": "نئون صفحو سرجي نہ سگھيو. اهو اڳ ۾ ئي وجود رکي ٿو.",
+       "invalid-content-data": "ناقابل ڪار موادي اعداد",
+       "content-not-allowed-here": "\"$1\" مواد هن صفحي [[$2]] تي رکي نہ ٿو سگھجي.",
+       "content-model-wikitext": "وڪي‌ٽيڪسٽ",
+       "content-model-text": "سادو ٽيڪسٽ",
+       "content-model-javascript": "جاوا اسڪرپٽ",
+       "content-json-empty-object": "خالي آبجيڪٽ",
+       "content-json-empty-array": "خالي اري",
        "duplicate-args-warning": "وارننگ: [[:$2]]کي [[:$1]] ڪال ڪري رهيو آهي، ساڻ هڪ کان وڌيڪ قدرن لاءِ ’$3‘ پيراميٽرس لاءِ. فقط آخري قدر مهيا ڪيل استعمال ڪيو ويندو.",
+       "parser-template-loop-warning": "سانچو چڪر لڌو ويو: [[$1]]",
+       "cantcreateaccounttitle": "کاتو کولي نہ ٿو سگھجي",
+       "cantcreateaccount-text": "$3 جو ڄاڻايل سبب <em>$2</em> آهي.",
+       "cantcreateaccount-range-text": "$3 جو ڄاڻايل سبب \"$2\" آهي.",
        "viewpagelogs": "هن صفحي جا لاگ ڏسو",
        "currentrev": "هاڻوڪو مسودو",
+       "currentrev-asof": "$1 جو تازو ترين مسودو",
        "revisionasof": "$1 وارو پرت",
-       "revision-info": "$1 تي $2 جي ترميم بعد مسودو",
+       "revision-info": "$1 تي {{GENDER:$6|$2}}$7 جي ترميم بعد مسودو",
        "previousrevision": "←اڃا پراڻو پرت",
        "nextrevision": "اڃا نئون پرت→",
        "currentrevisionlink": "هاڻوڪو پرت",
        "cur": "ھاڻوڪو",
+       "next": "اڳيون",
        "last": "پويون",
        "page_first": "پهريون",
        "page_last": "آخري",
+       "history-fieldset-title": "جھانگ جي سوانح",
+       "history-show-deleted": "رڳو ڊاٺل",
        "histfirst": "اوائلي ترين",
-       "histlast": "تازوترين",
+       "histlast": "تازه ترين",
+       "historysize": "({{PLURAL:$1|1 ٻاٽڻ|$1 ٻاٽڻيون}})",
        "historyempty": "(خالي)",
+       "history-feed-title": "ترميمي سوانح",
+       "history-feed-description": "وڪي جي هن صفحي جي ترميمي سوانح",
        "history-feed-item-nocomment": "$2 تي $1",
+       "rev-deleted-user": "(يُوزرنانءُ ڊاٺو ويو)",
+       "rev-showdeleted": "ڏيکاريو",
+       "revisiondelete": "مسوادا ڊاهيو/اڻ‌ڊاهيو",
+       "revdelete-show-file-submit": "ها",
+       "revdelete-radio-set": "لڪل",
+       "revdelete-radio-unset": "ظاهر",
+       "revdelete-log": "سبب:",
        "pagehist": "صفحي جي سوانح",
-       "history-title": "\"$1\" جي سوانح",
+       "deletedhist": "ڊاٺل سوانح",
+       "revdelete-otherreason": "ٻيا/اضافي ڪارڻ:",
+       "revdelete-reasonotherlist": "ٻيو ڪارڻ",
+       "revdelete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
+       "mergehistory": "صفحن جون سوانح ضم ڪريو",
+       "mergehistory-from": "ذريعہ صفحو:",
+       "mergehistory-into": "مقصود صفحو:",
+       "mergehistory-list": "ضمائتي ترميم سوانح",
+       "mergehistory-autocomment": "[[:$1]] کي [[:$2]] ۾ ضم ڪيو ويو",
+       "mergehistory-reason": "سبب:",
+       "mergelog": "ضم لاگ",
+       "revertmerge": "اڻ ضم",
+       "history-title": "\"$1\" جي ترميمي سوانح",
+       "difference-title": "\"$1\" جي مسودن ۾ تفاوت",
+       "difference-multipage": "(صفحن درميان تفاوت)",
        "lineno": "سِٽَ $1:",
        "compareselectedversions": "چونڊيل پرت ڀيٽيو",
        "editundo": "اڻڪريو",
+       "diff-empty": "(ڪو بہ تفاوت ڪونهي)",
        "searchresults": "ڳولا نتيجا",
        "searchresults-title": "”$1“ لاءِ ڳولا نتيجا",
        "prevn": "پويان {{PLURAL:$1|$1}}",
        "nextn": "اڳيان {{PLURAL:$1|$1}}",
+       "prev-page": "اڳوڻو صفحو",
+       "next-page": "ايندڙ صفحو",
+       "prevn-title": "{{PLURAL:$1|پويون|پويان}} $1 {{PLURAL:$1|نتيجو|نتيجا}}",
+       "nextn-title": "{{PLURAL:$1|ٻيو|ٻيا}} $1 {{PLURAL:$1|نتيجو|نتيجا}}",
+       "shown-title": "$1 {{PLURAL:$1|نتيجو|نتيجا}} في صفحو ڏيکاريو",
        "viewprevnext": "ڏسو ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchprofile-articles": "موادي صفحا",
+       "searchprofile-images": "گھڻذريعات",
+       "searchprofile-everything": "هر شَي",
+       "searchprofile-advanced": "متقدم",
+       "searchprofile-articles-tooltip": "$1 ۾ ڳوليو",
+       "searchprofile-images-tooltip": "فائيلن جي ڳولا",
+       "searchprofile-everything-tooltip": "سموري مواد ۾ ڳوليو",
+       "searchprofile-advanced-tooltip": "مرضيءَ جي نانءُپولارن ۾ ڳوليو",
        "search-result-size": "$1 ({{PLURAL:$2|لفظُ|$2 لفظَ}})",
+       "search-redirect": "($1 کي چوريو)",
+       "search-section": "(سيڪشن $1)",
+       "search-category": "(ذمرو $1)",
+       "search-suggest": "ڇا توهان جو مطلب $1 آهي؟",
+       "search-interwiki-caption": "برادر رٿائون",
+       "search-interwiki-more": "(وڌيڪ)",
+       "search-relatedarticle": "لاڳاپيل",
+       "searchrelated": "لاڳاپيل",
+       "searchall": "سڀ",
+       "search-nonefound": "توهان جي ڳولا جي نتيجي ۾ ڪجھہ بہ ڪو نہ لڌو.",
+       "powersearch-togglelabel": "چڪاسيو:",
+       "powersearch-toggleall": "سڀ",
+       "powersearch-togglenone": "ڪو بہ نہ",
+       "search-external": "خارجي ڳولا",
+       "search-error": "$1 ۾ ڳولا ڪندي چُڪَ ٿي.",
        "preferences": "ترجيحات",
-       "mypreferences": "منهنجون ترجيحات",
-       "skin-preview": "پيش نگاهه",
+       "mypreferences": "ترجيحات",
+       "prefs-edits": "ترميمن جو تعداد:",
+       "prefsnologintext2": "پنهنجون ترجيحات بدلائڻ لاءِ لاگ اِن ٿيو.",
+       "prefs-skin": "چَمَ",
+       "skin-preview": "پيش نگاهہ",
        "datedefault": "بلا ترجيحا",
+       "prefs-user-pages": "يُوزر صفحو",
+       "prefs-personal": "يُوزر جو خدوخال",
+       "prefs-rc": "تازيون تبديليون",
+       "prefs-watchlist": "ٽيٽ فهرست",
+       "prefs-editwatchlist": "ٽيٽ فهرست کي سنواريو",
+       "prefs-editwatchlist-label": "پنهنجي ٽيٽ فهرست ۾ درج ٿيل شين کي سنواريو:",
+       "prefs-editwatchlist-edit": "پنهنجي ٽيٽ فهرست ۾ موجود عنوان ڏسو ۽ مٽايو",
+       "prefs-editwatchlist-raw": "ڪچي ٽيٽ فهرست سنواريو",
+       "prefs-editwatchlist-clear": "پنهنجي ٽيٽ فهرست ڊاهيو",
+       "prefs-watchlist-days": "ٽيٽ فهرست ۾ ڏيکارڻ لاءِ ڏينهن :",
+       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
+       "prefs-watchlist-edits-max": "وڌ ۾ وڌ تعداد: 1000",
+       "prefs-watchlist-token": "ٽيٽ لسٽ جو ٽوڪن:",
+       "prefs-resetpass": "ڳجھو لفظ بدلايو",
+       "prefs-changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
+       "prefs-setemail": "ڪو برق ٽپال پتو ڄاڻايو",
+       "prefs-email": "برق ٽپال چارا",
+       "prefs-rendering": "حليو",
+       "saveprefs": "سانڍيو",
+       "rows": "قطارون:",
+       "searchresultshead": "ڳولا",
+       "stub-threshold-sample-link": "نمونو",
+       "stub-threshold-disabled": "غيرفعال",
+       "recentchangesdays-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
+       "prefs-help-recentchangescount": "ان ۾ تازيون تبديليون، صفحن جي سوانح، ۽ لاگ شامل آهن.",
+       "savedprefs": "توهان جو ترجيحات سانڍجي چڪيون آهن.",
+       "savedrights": "{{GENDER:$1|$1}} نالي يوزر جا حق سانڇجي چڪا آهن.",
+       "timezonelegend": "اوقاتي زون:",
+       "localtime": "مقامي وقت:",
+       "servertime": "سَروَر پٽاندر وقت:",
+       "guesstimezone": "جھانگُوءَ مان ڀريو",
+       "timezoneregion-africa": "آفريڪا",
+       "timezoneregion-america": "آمريڪا",
+       "timezoneregion-antarctica": "اينٽارڪٽيڪا",
+       "timezoneregion-arctic": "آرڪٽڪ",
+       "timezoneregion-asia": "ايشيا",
+       "timezoneregion-atlantic": "ايٽلانٽڪ ساگر",
+       "timezoneregion-australia": "آسٽريليا",
+       "timezoneregion-europe": "يُورپ",
+       "timezoneregion-indian": "سنڌي ساگر",
+       "timezoneregion-pacific": "ماٺو ساگر",
        "allowemail": "ٻين يُوزرس کان ايندڙ برق ٽپال بحال ڪريو",
+       "prefs-searchoptions": "ڳولا",
+       "prefs-namespaces": "نانءُپولار",
+       "prefs-files": "فائيلس",
+       "prefs-emailconfirm-label": "برق ٽپال جي خاطري:",
+       "youremail": "برق ٽپال:",
+       "username": "{{GENDER:$1|يُوزرنانءُ}}",
+       "prefs-registration": "رجسٽريشن جو وقت:",
        "yourrealname": "اصل نالو:",
-       "badsiglength": "اها صحيح تمام وڏي آهي.\n$1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.",
-       "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، ته اهو توهان کي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
+       "yourlanguage": "ٻولي:",
+       "yournick": "نئين صحيح:",
+       "badsiglength": "اها صحيح هيڪاندي ڊگھي آهي.\nاها وڌ ۾ وڌ $1 {{PLURAL:$1|اکر|اکرن}} تي ٻڌل هوڻ گھرجي.",
+       "yourgender": "توهان ڪهڙو تعارف چاهيندا؟",
+       "gender-unknown": "توهان جو ذڪر ڪندي، جيترو ٿي سگھيو، منطقگري بي جنس لفظن جو استعمال ڪندي.",
+       "gender-male": "هيءُ وڪي صفحا سنواريندو آهي",
+       "gender-female": "هيءَ وڪي صفحا سنواريندي آهي",
+       "email": "برق ٽپال",
+       "prefs-help-realname": "اصل نالو اختياري آهي.\nجيڪڏهن توهان اصل نالو ڄاڻائڻ جو فيصلو ٿا ڪريو، تہ اهو توهان کي توهان جي ڪم جي مڃتا ڏيڻ لاءِ ڪم آندو ويندو.",
+       "prefs-help-email": "برق ٽپال ڄاڻائڻ اختياري آهي، پر جڏهن توهان ڳجھو لفظ وسري ويندا آهيو، تڏهن ان جو استعمال توهان کي نئون ڳجھو لفظ ڏيڻ لاءِ استعمال ڪيو ويندو آهي.",
+       "prefs-help-email-required": "برق ٽپال پتو گھربل آهي.",
+       "prefs-info": "بنيادي ڄاڻ",
+       "prefs-i18n": "بين‌الاقوامڪاري",
+       "prefs-signature": "صحيح",
+       "prefs-advancedediting": "عمومي چارا",
+       "prefs-editor": "ايڊيٽر",
+       "prefs-preview": "پيش نگاهہ",
+       "prefs-advancedrc": "متقدم چارا",
+       "prefs-advancedrendering": "متقدم چارا",
+       "prefs-advancedsearchoptions": "متقدم چارا",
+       "prefs-advancedwatchlist": "متقدم چارا",
+       "prefs-displayrc": "نماڪار چارا",
+       "prefs-displaywatchlist": "نماڪار چارا",
+       "prefs-tokenwatchlist": "ٽوڪن",
+       "prefs-diffs": "تفاوت",
+       "prefs-help-prefershttps": "هيءَ ترجيح توهان جي ايندڙ لاگ اِن تي عمل ۾ ايندي.",
+       "email-address-validity-valid": "برق ٽپال پتو قابل ڪار ڏسجي ٿو.",
+       "email-address-validity-invalid": "قابل ڪار برق ٽپال پتو ڄاڻايو",
+       "userrights": "يُوزر حقن جي انتظامڪاري",
+       "userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
+       "userrights-groupsmember": "برڪن:",
+       "userrights-groupsmember-auto": "رڪن واجبي:",
        "userrights-reason": "سبب:",
+       "userrights-no-interwiki": "توهان کي ٻين وڪيز تي يُوزر حقن ۾ ترميم ڪرڻ جو حق حاصل نہ آهي.",
+       "userrights-nodatabase": "اعداخانو $1 يا تہ وجود نہ ٿو رکي يا تہ اهو مقامي اعدادخانو نہ آهي.",
        "group": "گروپ:",
        "group-user": "يوزرس",
+       "group-all": "(سڀ)",
+       "group-user-member": "{{GENDER:$1|يُوزر}}",
+       "group-sysop-member": "{{GENDER:$1|منتظم}}",
+       "grouppage-user": "{{ns:project}}:يُوزرس",
        "grouppage-sysop": "{{ns:project}}:منتظمين",
+       "grouppage-bureaucrat": "{{ns:project}}:ڪامورا",
+       "right-read": "صفحا پڙهو",
+       "right-edit": "صفحا سنواريو",
+       "right-createpage": "صفحا سنواريو (جيڪي مباحثي صفحا نہ آهن)",
+       "right-createtalk": "مباحثي صفحا سرجيو",
+       "right-createaccount": "نوان يُوزر کاتا کوليو",
+       "right-move": "صفحا چوريو",
+       "right-move-subpages": "ذيلي صفحن سميت صفحا چوريو",
+       "right-movefile": "فائيل چوريو",
+       "right-upload": "فائيل چاڙهيو",
+       "right-upload_by_url": "ڪنهن يُو آر ايل کان فائيل چاڙهيو",
+       "right-delete": "صفحا ڊاهيو",
+       "right-bigdelete": "ڊگھيون سوانح رکندڙ صفحا ڊاهيو",
+       "right-browsearchive": "ڊاٺل صفحا ڳوليو",
        "right-undelete": "ڪو صفحو اڻڊاهيو",
+       "right-editinterface": "يُوزر باهمرُو کي سنواريو",
+       "right-viewmywatchlist": "پنهنجي ٽيٽ لسٽ ڏسو",
+       "right-editmyoptions": "پنهنجون ترجيحات سنواريو",
+       "right-import": "ٻين وڪيز کان صفحا درآمديو",
+       "right-mergehistory": "صفحن جي سوانح سنواريو",
+       "newuserlogpage": "يوزر کاتن جو لاگ",
        "rightslog": "يُوزر حق لاگ",
+       "action-move": "هيءَُ صفحو چوريو",
+       "action-move-subpages": "هيءُ صفحو، ۽ ان جا ذيلي صفحا چوريو",
+       "action-move-categorypages": "زمرن جا صفحا چوريو",
+       "action-movefile": "هيءُ فائيل چوريو",
+       "action-upload": "هيءُ فائيل چاڙهيو",
+       "action-delete": "هيءُ صفحو ڊاهيو",
+       "action-browsearchive": "ڊاٺل صفحن ۾ ڳوليو",
+       "action-undelete": "هيءُ صفحو اڻڊاهيو",
+       "action-import": "ٻي ڪنهن وڪي کان صفحا درآمد ڪريو",
+       "action-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
+       "action-mergehistory": "هن صفحي جي سوانح ضم ڪريو",
+       "action-siteadmin": "اعدادخاني کي بند ڪريو يا کوليو",
+       "action-sendemail": "برق ٽپال اماڻيو",
+       "action-editmywatchlist": "پنهنجي ٽيٽ فهرست سنواريو",
+       "action-viewmywatchlist": "پنهنجي ٽيٽ فهرست ڏسو",
        "nchanges": "$1 {{PLURAL:$1|تبديلي|تبديليون}}",
+       "enhancedrc-history": "سوانح",
        "recentchanges": "تازيون تبديليون",
+       "recentchanges-legend": "تازين تبديلين جو آپشن",
+       "recentchanges-summary": "هن صفحي تي وڪيءَ ۾ ڪيل تازيون ترين ترميمون ڏيکاريو.",
        "recentchanges-feed-description": "ۡهن روان رسد ۾ آيل تازيون تبديليون لهو",
+       "recentchanges-label-newpage": "هن ترميم سان نئون صفحو جڙيو.",
+       "recentchanges-label-minor": "هيءُ هڪ معمولي ترميم آهي.",
+       "recentchanges-label-bot": "هيءُ ترميم بوٽ عمل ۾ آندي.",
+       "recentchanges-label-plusminus": "هن صفحي جي ماپ ۾ هيترين ٻاٺڻين جو ڦير آيو آهي",
+       "recentchanges-legend-heading": "\"ڪنجي.\"",
        "rcnotefrom": "هيٺ '''$2''' کان ٿيندڙ تبديليون پيش ڪجن ٿيون ('''$1''' تائين ڏيکارجن ٿيون).",
        "rclistfrom": "$3 $2 کان شروع ٿيندڙ نيون تبديليون",
        "rcshowhideminor": "$1 معمولي ترميمون",
+       "rcshowhideminor-show": "نمايو",
+       "rcshowhideminor-hide": "لڪايو",
        "rcshowhidebots": "$1 بوٽس",
-       "rcshowhideliu": "$1 لاگ اِن ٿيل يوزرس",
+       "rcshowhidebots-show": "نمايو",
+       "rcshowhidebots-hide": "لڪايو",
+       "rcshowhideliu": "$1 کاتيدار يوزرس",
+       "rcshowhideliu-show": "ڏيکاريو",
+       "rcshowhideliu-hide": "لڪايو",
        "rcshowhideanons": "$1 نامعلوم يُوزرس",
+       "rcshowhideanons-show": "نمايو",
+       "rcshowhideanons-hide": "لڪايو",
        "rcshowhidepatr": "$1 تاڻيل ترميمون",
+       "rcshowhidepatr-show": "ڏيکاريو",
+       "rcshowhidepatr-hide": "لڪايو",
        "rcshowhidemine": "منهنجون ترميمون $1",
+       "rcshowhidemine-show": "نمايو",
+       "rcshowhidemine-hide": "لڪايو",
+       "rcshowhidecategorization-show": "ڏيکاريو",
+       "rcshowhidecategorization-hide": "لڪايو",
        "rclinks": "پوين $2 ڏينهن ۾ آيل پويون $1 تبديليون ڏيکاريو <br />$3",
        "diff": "تفاوت",
        "hist": "سوانح",
        "newpageletter": "ن",
        "boteditletter": "گ",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائيٽ|بائيٽس}} تبديليءَ کان پوءِ",
+       "rc-enhanced-expand": "تفصيل ڏيکاريو",
+       "rc-enhanced-hide": "تفصيل لڪايو",
        "recentchangeslinked": "لاڳاپيل تبديليون",
        "recentchangeslinked-feed": "لاڳاپيل تبديليون",
        "recentchangeslinked-toolbox": "لاڳاپيل تبديليون",
        "recentchangeslinked-title": "\"$1\" سان لاڳاپيل تبديليون",
+       "recentchangeslinked-page": "صفحي جو عنوان",
+       "recentchangeslinked-to": "رڳو ڄاڻايل صفحي سان ڳانڍيل صفحن ۾ ٿيل تبديليون نمايو",
        "upload": "فائيل چاڙهيو",
        "uploadbtn": "فائيل چاڙهيو",
-       "uploadlogpage": "چاڙهه لاگ",
+       "uploaderror": "چاڙهہ چُڪَ",
+       "uploadlogpage": "چاڙهہ لاگ",
+       "filename": "فائيل نانءُ",
+       "filedesc": "خلاصو",
+       "fileuploadsummary": "خلاصو:",
+       "filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
+       "savefile": "فائيل سانڍيو",
        "upload-scripted-pi-callback": "ان فائيل کي اپلوڊ نه ٿو ڪري سگهي جنهن ۾ ايڪس ايم ايل اسٽائيل شيٽ جون پراسيسنگ هدايتون شامل هجن.",
        "uploaded-script-svg": "اسڪرپٽ جوڳو ايليمينٽ ”$1” مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾.",
        "uploaded-hostile-svg": "اپلوڊ ٿيل ايس وي جي فائيل جو غير محفوظ سي ايس ايس ۾ اسٽائيل ايلمينٽ مليو",
        "uploaded-setting-handler-svg": "اهي ايس وي جي جيڪي ”هينڊل ڪندڙ“ وصفن کي رموٽ/ڊيٽا/اسڪرپٽ کي سيٽ ٿا ڪن، کي بلاڪ ڪيو ويو آهي.<code>$1=\"$2\"</code> مليو آهي اپلوڊ ٿيل ايس وي جي فائيل ۾.",
        "uploaded-remote-url-svg": "ايس وي جي جيڪا سيٽ ڪري ٿي ڪنهن اسٽائيل وصف  رموٽ يو آر ايل سان  بلاڪ ٿيل آهي.\n <code>$1=\"$2\"</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
        "uploaded-image-filter-svg": "هن يو آر ايل سان <code>&lt;$1 $2=\"$3\"&gt;</code> اميج فلٽر مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾،",
+       "uploadvirus": "هن فائيل ۾ وائرس آهي! \nتفصيل: $1",
+       "upload-description": "فائيل جي تشريح",
+       "watchthisupload": "هيءُ فائيل ٽيٽيو",
+       "upload-success-subj": "چاڙهہ ڪامياب",
+       "upload-file-error": "اندروني چُڪَ",
+       "upload-dialog-title": "فائيل چاڙهيو",
+       "upload-dialog-button-cancel": "رد",
+       "upload-dialog-button-save": "سانڍيو",
+       "upload-dialog-button-upload": "چاڙهيو",
+       "upload-form-label-select-file": "فائيل چونڊيو",
+       "upload-form-label-infoform-title": "تفصيل",
+       "upload-form-label-infoform-name": "نالو",
+       "upload-form-label-infoform-description": "تشريح",
+       "upload-form-label-usage-title": "استعمال",
+       "upload-form-label-usage-filename": "فائيل نانءُ",
+       "foreign-structured-upload-form-label-own-work": "هيءُ منهنجو پنهنجو ڪم آهي.",
+       "foreign-structured-upload-form-label-infoform-categories": "زمرا",
+       "foreign-structured-upload-form-label-infoform-date": "تاريخ",
+       "license-header": "لائيسنسڪاري",
+       "listfiles-delete": "ڊاهيو",
+       "imgfile": "فائيل",
        "listfiles": "فائيل فهرست",
+       "listfiles_name": "نالو",
+       "listfiles_user": "يُوزر",
+       "listfiles_size": "ماپَ",
+       "listfiles_description": "تشريح",
+       "listfiles-latestversion-yes": "ها",
+       "listfiles-latestversion-no": "نہ",
        "file-anchor-link": "فائيل",
        "filehist": "فائيل جي سوانح",
        "filehist-help": "ڪنهن به تاريخ/وقت تي ڪلڪ ڪري ڏسندا ته تڏڻي اهو فائيل ڪيئن هو.",
+       "filehist-deleteall": "سڀ ڊاهيو",
+       "filehist-deleteone": "ڊاهيو",
+       "filehist-revert": "واپس ورايو",
        "filehist-current": "هاڻوڪو",
        "filehist-datetime": "تاريخ/وقت",
+       "filehist-thumb": "آڱوٺي ننهن",
        "filehist-user": "يُوزر",
        "filehist-dimensions": "ماپَ",
        "filehist-filesize": "فائيل سائيز",
        "nolinkstoimage": "هن فائيل سان ڪو به صفحو ڳنڍيل ناهي.",
        "sharedupload": "هيءَ هڪ شراڪتي چاڙهه آهي، تنهنڪري ان کي ٻيون رٿائون به استعمال ڪري سگھن ٿيون.",
        "uploadnewversion-linktext": "هن فائيل جو نئون پرت چاڙهيو",
+       "shared-repo-from": "$1 کان",
+       "upload-disallowed-here": "توهان هن فائيل مٿان لکي نہ ٿا سگھو.",
+       "filerevert-comment": "سبب:",
+       "filerevert-submit": "واپس ورايو",
+       "filedelete": "$1 کي ڊاهيو",
+       "filedelete-legend": "فائيل ڊاهيو",
+       "filedelete-comment": "سبب:",
+       "filedelete-submit": "ڊاهيو",
+       "filedelete-reason-otherlist": "ٻيو سبب",
+       "filedelete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
+       "filedelete-maintenance-title": "فائيل ڊهي نہ سگھيو",
        "mimesearch": "مائيم ڳولا",
+       "download": "اتاريو",
+       "unwatchedpages": "اڻ ٽيٽيل صفحا",
        "listredirects": "چورڻن جي فهرست",
        "unusedtemplates": "اڻ استعماليل سانچا",
+       "unusedtemplateswlh": "ٻيا ڳنڍڻا",
        "randompage": "بلاترتيب صفحو",
+       "randomincategory-category": "زمرو:",
+       "randomincategory-submit": "هلو",
        "randomredirect": "بلا ترتيب چورڻو",
        "statistics": "انگ اکر",
+       "statistics-header-pages": "صفحي جا انگ اکر",
+       "statistics-header-edits": "ترميمن جا انگ اکر",
+       "statistics-header-users": "يُوزر جا انگ اکر",
+       "statistics-header-hooks": "ٻيا انگ اکر",
+       "statistics-articles": "موادي صفحا",
+       "statistics-pages": "صفحا",
+       "statistics-files": "چاڙهيل فائيل",
+       "statistics-edits-average": "سراسري ترميمون في صفحو",
+       "statistics-users": "کاتيدار [[Special:ListUsers|يُوزرس]]",
+       "statistics-users-active": "سرگرم يُوزرس",
+       "statistics-users-active-desc": "اهي يُوزرس جن پوين {{PLURAL:$1|ڏينهن|$1 ڏينهن}} ۾ ڪا سرگرمي ڏيکاري آهي.",
+       "pageswithprop-submit": "ھلو",
        "doubleredirects": "ٻٽا چورڻا",
+       "double-redirect-fixed-move": "[[$1]] چورجي چڪو آهي. ان کي خودڪاراً تجديديو ويو ۽ هاڻي اهو [[$2]] ڏانهن وٺي وڃي ٿو.",
        "brokenredirects": "ٽٽل چورڻا",
        "brokenredirects-edit": "سنواريو",
        "brokenredirects-delete": "ڊاهيو",
-       "withoutinterwiki": "ڪنهن به ٻي ٻوليءَ سان نه ڳنڍيل صفحا",
+       "withoutinterwiki": "ڪنهن بہ ٻي ٻوليءَ سان نہ ڳنڍيل صفحا",
+       "withoutinterwiki-summary": "هيٺيان صفحا ڪنهن بہ ٻي ٻوليءَ ۾ ساڳي صفحي سان ڳنڍيل نہ آهن.",
+       "withoutinterwiki-legend": "اڳياڙي",
+       "withoutinterwiki-submit": "نمايو",
        "fewestrevisions": "گھٽانگھٽ ترميميل صفحا",
        "nbytes": "$1 {{PLURAL:$1|ٻاٽڻ|ٻاٽڻيون}}",
+       "ncategories": "$1 {{PLURAL:$1|زمرو|زمرا}}",
+       "ninterwikis": "$1 {{PLURAL:$1|بين‌الوڪي}}",
        "nlinks": "$1 {{PLURAL:$1|ڳنڍڻو|ڳنڍڻا}}",
        "nmembers": "$1 {{PLURAL:$1|رڪن|رڪنَ}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|رڪن|رڪنَ}}",
+       "nimagelinks": "$1 {{PLURAL:$1|صفحي|صفحن}} ۾ استعمال ٿيل",
+       "ntransclusions": "$1 {{PLURAL:$1|صفحي|صفحن}} ۾ استعمال ٿيل",
        "lonelypages": "يتيم صفحا",
        "uncategorizedpages": "اڻ زمريل صفحا",
        "uncategorizedcategories": "اڻزمرايل زمرا",
        "unusedimages": "اڻ استعماليل فائيلس",
        "wantedcategories": "گھربل زمرا",
        "wantedpages": "گھربل صفحا",
+       "wantedtemplates": "گھربل سانچا",
        "mostlinked": "صفحن سان وڌانوڌ ڳنڍيندڙ",
        "mostlinkedcategories": "زمرن سان وڌانوڌ ڳنڍيل",
        "mostlinkedtemplates": "گھڻي کان گھڻا سانچا رکندڙ",
        "mostcategories": "گھڻي کان گھڻا زمرا رکندڙ صفحا",
        "mostimages": "وڌانوڌ ڳنڍيندڙ فائيل",
        "mostrevisions": "وڌانوڌ ترميميل صفحا",
-       "prefixindex": "اڳياڙي ڏسڻي",
+       "prefixindex": "هيءَ اڳياڙي رکندڙ سمورا صفحا",
+       "prefixindex-namespace": "سمورا صفحا جن کي هيءَ اڳياڙي آهي ($1 نانءُپولار)",
        "shortpages": "مختصر صفحا",
        "longpages": "طويل صفحا",
        "deadendpages": "اڻ ڳنڍيندڙ صفحا",
        "protectedpages": "تحفظيل صفحا",
+       "protectedpages-noredirect": "چورڻا لڪايو",
+       "protectedpages-page": "صفحو",
+       "protectedpages-reason": "سبب",
+       "protectedpages-unknown-timestamp": "اڻڄاتل",
+       "protectedpages-unknown-performer": "نامعلوم يُوزر",
+       "protectedtitles": "تحفظيل عنوان",
        "listusers": "يُوزر فهرست",
        "newpages": "نوان صفحا",
+       "newpages-username": "يُوزرنانءُ:",
        "ancientpages": "قديم ترين صفحا",
        "move": "چوريو",
        "movethispage": "هيءُ صفحو چوريو",
+       "notargettitle": "بنان هدف",
+       "pager-older-n": "{{PLURAL:$1|پراڻو 1|پراڻا $1}}",
        "booksources": "ڪتابي وسيلا",
+       "booksources-search-legend": "ڪتابي ذريعن جي ڳولا ڪريو",
+       "booksources-search": "ڳوليو",
        "specialloguserlabel": "يُوزر:",
        "speciallogtitlelabel": "عنوان:",
        "log": "لاگس",
        "prevpage": "پويون صفحو ($1)",
        "allpagesfrom": "ھتان شروع ٿيندڙ صفحا نمايو",
        "allarticles": "سمورا مضمون",
+       "allinnamespace": "سمورا صفحا ($1 نانءُپولار)",
        "allpagessubmit": "ھلو",
        "allpagesprefix": "صفحا نمايو بمع اڳياڙي:",
        "categories": "زمرا",
+       "deletedcontributions": "يُوزر جون ڊاٺل ڀاڱيداريون",
+       "deletedcontributions-title": "يُوزر جون ڊاٺل ڀاڱيداريون",
+       "sp-deletedcontributions-contribs": "ڀاڱيداريون",
+       "linksearch-ns": "نانءُپولار",
+       "linksearch-ok": "ڳوليو",
+       "listusers-submit": "نمايو",
+       "listusers-noresult": "ڪو بہ يُوزر نہ لڌو",
+       "listusers-blocked": "(بندشيل)",
+       "activeusers": "سرگرم يُوزرس جي فهرست",
+       "activeusers-hidesysops": "منتظمن کي لڪايو",
+       "activeusers-noresult": "ڪي بہ يُوزرس نہ لڌا.",
+       "listgrouprights-group": "گروهہ:",
+       "listgrouprights-rights": "حق",
+       "listgrouprights-members": "(رڪنن جي لسٽ)",
+       "listgrouprights-namespaceprotection-namespace": "نانءُ پولار:",
        "emailuser": "هن يوزر کي برق ٽپال اماڻيو",
+       "emailuser-title-notarget": "يُوزر ڏانهن برق ٽپال اماڻيو",
+       "noemailtitle": "برق ٽپال پتو نامعلوم",
+       "noemailtext": "هن يُوزر ڪو بہ قابل ڪار برق ٽپال پتو نہ ڄاڻايو آهي.",
+       "emailusername": "يُوزرنانءُ:",
+       "emailusernamesubmit": "جمع ڪرايو",
+       "emailfrom": "طرفان:",
+       "emailto": "ڏانهن:",
+       "emailsubject": "موضوع:",
+       "emailmessage": "نياپو:",
+       "emailsend": "اماڻيو",
+       "emailccme": "نياپي جو پرت مون کي برق ٽپال ڪريو.",
+       "emailsent": "برق ٽپال اماڻجي چڪي",
+       "emailsenttext": "توهان جو برق ٽپال نياپو اماڻجي چڪو آهي.",
        "watchlist": "منهنجي ٽيٽ فهرست",
-       "mywatchlist": "منهنجي ٽيٽ فهرست",
+       "mywatchlist": "ٽيٽ فهرست",
+       "addwatch": "ٽيٽ فهرست ۾ شامل ڪريو",
        "addedwatchtext": "صفحو بعنوان \"[[:$1]]\" اوهان جي [[Special:Watchlist|ٽيٽ فهرست]] ۾ شامل ٿي ويو. استقبالي تبديليون هتي درج ٿينديون وينديون. اهو صفحو [[Special:RecentChanges|تازين تبديلين]] واري صفحي تي '''گهرن''' اکرن ۾ نمايان ڪري ڏيکاريو ويندو. جيڪڏهن اوهان اهو سڀ نه ٿا چاهيو ته '''اڻ ٽيٽيو''' تي ڪلڪ ڪريو.",
-       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي ٽيٽ فهرست مان هٽي چڪو آهي.",
+       "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|ٽيٽ فهرست]] مان هٽي چڪو آهي.",
+       "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي ٽيٽ فهرست مان هٽي چڪو آهي.\"",
        "watch": "ٽيٽيو",
        "watchthispage": "هيءُ صفحو ٽيٽيو",
        "unwatch": "اڻ ٽيٽيو",
        "unwatchthispage": "ٽيٽڻ ڇڏيو",
+       "notanarticle": "غير موادي صفحو",
        "watchlist-details": "مباحثي صفحن کان سواءِ {{PLURAL:$1|$1 صفحو|$1 صفحا}} ٽيٽيل.",
        "wlshowlast": "پوين $1 ڪلاڪن $2 ڏينهن جا  ڏيکاريو",
        "watching": "ٽيٽيندي...",
        "unwatching": "اڻ ٽيٽيندي...",
+       "enotif_impersonal_salutation": "{{SITENAME}} يُوزر",
+       "enotif_anon_editor": "گمنام يُوزر $1",
        "created": "ٺهي چڪو",
        "changed": "تبديل ٿي ويو",
        "deletepage": "صفحو ڊاهيو",
        "confirm": "پڪ ڪريو",
+       "delete-confirm": "\"$1\" ڊهي چڪو",
+       "delete-legend": "ڊاهيو",
        "historywarning": "خبردار: جيڪو صفحو توهان ڊاهڻ وارا آهيو، تنهن جي هڪ سوانح آهي:",
        "confirmdeletetext": "توهان هڪ صفحي کي ان جي سموري سوانح سميت ڊاهڻ وارا آهيو. مهرباني ڪري پڪ ڪندا ته توهان اهو ئي ڪرڻ گھرو ٿا، ۽ اهو ته توهان ان جي نتيجن کان واقف آهيو، ۽ اهو پڻ ته توهان اهو ڪم [[{{MediaWiki:Policy-url}}|پاليسي]]ءَ مطابق ڪري رهيا آهيو.",
        "actioncomplete": "ڪم پُورو",
        "deletedtext": "\"$1\" ڊهي چڪو آهي.\nتازو ڊاٺل صفحن جي فهرست لاءِ $2 ڏسندا.",
        "dellogpage": "ڊاٺ لاگ",
+       "deletionlog": "ڊاٺ لاگ",
        "deletecomment": "سبب:",
        "deleteotherreason": "اڃا ڪو ٻيو سبب:",
        "deletereasonotherlist": "ٻيو سبب",
+       "delete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
+       "rollback": "ترميمن کي واپس ورايو",
        "rollbacklink": "واپس ورايو",
+       "rollbacklinkcount": "اڻ ڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
+       "changecontentmodel-title-label": "صفحي جو عنوان",
+       "changecontentmodel-reason-label": "سبب:",
        "protectlogpage": "تحفظ لاگ",
        "prot_1movedto2": "[[$1]] کي چوري [[$2]] تي رکيو ويو",
        "protect-legend": "تحفظڻ جي پڪ ڪريو",
        "protect-text": "توهان '''$1''' صفحي جي تحفظاتي سطح ڏسي ۽ بدلائي سگھو ٿا.",
        "protect-locked-access": "توهان جو کاتو صفحن جي تحفظاتي سطح تبديلي ڪرڻ جا اختيار نه ٿو رکي. هيٺ صفحي جون وقوعات (سيٽڱس) پيش ڪجن ٿيون '''$1''':",
        "protect-cascadeon": "هيءُ صفحو في الوقت تحفظيل آهي، ڇاڪاڻ ته اهو هيٺين {{PLURAL:$1|صفحي|صفحن}} جو حصو آهي، جنهن تي تحفظ در تحفظ لاڳو ٿيل آهي.",
+       "protect-default": "سمورن يُوزرس کي اجازت ڏيو",
        "protect-fallback": "\"$1\" جي اجازت گھرجي",
        "protect-level-autoconfirmed": "غيرکاتيدار يُوزرس کي بندشيو",
        "protect-level-sysop": "صرف منتظمين",
        "protect-summary-cascade": "تحفظ در تحفظ",
        "protect-cascade": "هن صفحي ۾ شامل صفحن کي تحفظيو (تحفظ در تحفظ)",
        "protect-cantedit": "توهان هن صفحي جي تحفظاتي سطح نٿا بدلائي سگھو، ڇاڪاڻ ته توهان ان کي سنوارڻ جي اجازت نٿا رکو.",
+       "protect-otherreason-op": "ٻيو سبب",
        "protect-expiry-options": "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",
        "restriction-type": "اجازتنامو:",
        "restriction-level": "روڪ سطح:",
        "pagesize": "(ٻاٽڻيون)",
+       "restriction-edit": "سنواريو",
+       "restriction-move": "چوريو",
+       "restriction-create": "سرجيو",
+       "restriction-upload": "چاڙهيو",
+       "restriction-level-sysop": "مڪمل طور تحفظيل",
+       "restriction-level-autoconfirmed": "نيم تحفظيل",
+       "viewdeletedpage": "ڊاٺل صفحا ڏسو",
        "undeletebtn": "بحاليو",
+       "undeleteviewlink": "ڏسو",
+       "undeletecomment": "سبب:",
+       "undelete-search-submit": "ڳوليو",
        "undelete-error-short": "هيءُ فائيل اڻڊاهيندي چُڪَ ٿي آهي: $1",
+       "undelete-show-file-submit": "ها",
        "namespace": "نانءُ پولار:",
        "invert": "چونڊ ابتيو",
+       "namespace_association": "منسلڪ نانءُپولار",
        "blanknamespace": "(مُک)",
-       "contributions": "يوزر جون ڀاڱيداريون",
-       "mycontris": "منهنجون ڀاڱيداريون",
+       "contributions": "{{GENDER:$1|يوزر}} جون ڀاڱيداريون",
+       "contributions-title": "يُوزر ڀاڱيداريون براءِ $1",
+       "mycontris": "ڀاڱيداريون",
        "contribsub2": "براءِ $1 ($2)",
        "uctop": "(سِرُ)",
        "month": "مهينو (۽ اڳوڻيون):",
        "sp-contributions-newbies-sub": "نون کاتن لاءِ",
        "sp-contributions-blocklog": "بنسش لاگ",
        "sp-contributions-talk": "بحث",
+       "sp-contributions-submit": "ڳوليو",
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
        "whatlinkshere-title": "$1 سان ڳنڍيل صفحا",
+       "whatlinkshere-page": "صفحو:",
        "linkshere": "هيٺيان صفحا '''[[:$1]]''' سان ڳنڍيل آهن:",
-       "nolinkshere": "'''[[:$1]]''' سان ڪو به صفحو ڳنڍيل ناهي.",
+       "nolinkshere": "'''[[:$1]]''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
        "isredirect": "چورڻو صفحو",
        "istemplate": "شموليت",
+       "isimage": "فائيل جو ڳنڍڻو",
        "whatlinkshere-prev": "{{PLURAL:$1|پويون|پويون $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|اڳيون|اڳيان $1}}",
        "whatlinkshere-links": "← ڳنڍڻا",
+       "whatlinkshere-hideredirs": "$1 چورجي ٿو",
+       "whatlinkshere-hidelinks": "$1 ڳنڍڻا",
+       "whatlinkshere-filters": "ڇاڻيون",
+       "block": "يُوزر کي بندشيو",
+       "unblock": "يُوزر کي اڻبندشيو",
        "blockip": "يُوزر کي روڪيو",
+       "blockip-legend": "يُوزر کي بندشيو",
+       "ipbexpiry": "اختتام:",
+       "ipbreason": "سبب:",
        "ipboptions": "2 ڪلاڪ:2 hours،1 ڏينهن:1 day،3 ڏينهن:3 days،1 هفتو:1 week،2 هفتا:2 weeks،1 مهينو:1 month،3 مهينا:3 months،6 مهينا:6 months،1 سال:1 year،لامحدود:infinite",
+       "ipb-confirm": "بندش جي پڪ ڪريو",
        "badipaddress": "ناقابلڪار آءِ پي پتو",
+       "blockipsuccesssub": "بندش ڪامياب ٿي",
+       "unblockip": "يُوزر کي اڻبندشيو",
+       "ipusubmit": "اها بندش هٽايو",
+       "unblocked-range": "$1 تان بندش هتي چڪي آهي.",
+       "unblocked-id": "بندش $1 هٽي چڪي آهي.",
+       "blocklist": "بندشيل يُوزرس",
        "ipblocklist": "بندشيل يوزرنانءُ ۽ آءِ پي پتا",
+       "blocklist-timestamp": "اوقاتي مهر",
+       "blocklist-target": "هدف",
+       "blocklist-reason": "سبب",
+       "ipblocklist-submit": "ڳوليو",
+       "ipblocklist-localblock": "مقامي بندش",
        "infiniteblock": "لامحدود",
        "anononlyblock": "فقط نامعلوم",
        "noautoblockblock": "خودڪار بندش روڪيل",
        "createaccountblock": "کاتو کولڻ جي روڪَ ٿيل",
+       "emailblock": "برق ٽپال غير فعال",
        "blocklink": "بندشيو",
        "unblocklink": "اڻبندشيو",
        "contribslink": "ڀاڱيداريون",
+       "emaillink": "برق ٽپال اماڻيو",
        "blocklogpage": "بندش لاگ",
        "blocklogentry": "\"[[$1]]\" کي بندشيو ويو $2 $3 جي عرصي لاء",
+       "unblocklogentry": "$1 تان بندش هٽائي وئي",
        "block-log-flags-anononly": "فقط نامعلوم يوزرس",
+       "block-log-flags-noemail": "برق ٽپال غير فعال",
+       "block-log-flags-hiddenname": "لڪل يُوزرنانءُ",
+       "ipb_already_blocked": "\"$1\" اڳ ۾ ئي بندشيل آهي.",
+       "ipbnounblockself": "توهان پنهنجو پاڻ تان بندش هٽائي نہ ٿا سگھو.",
+       "lockdb": "اعدادخاني کي بنديو",
+       "unlockdb": "اعدادخاني کي کوليو",
+       "lockbtn": "اعدادخاني کي بنديو",
+       "unlockbtn": "اعدادخاني کي کوليو",
+       "move-page": "$1 چوريو",
+       "move-page-legend": "صفحو چوريو",
        "movepagetext": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. اڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. ان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n'''خبردار!'''\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ براءِ مهرباني اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
        "movepagetalktext": "واسطيدار مباحثي صفحو پاڻهي ئي چوريو ويندو ماهسوا:\n\n*نئين عنوان سان هڪ اڻ پورو يعني غير خالي مباحثي صفحو اڳي ئي وجود رکندو هجي، يا\n*توهان هيٺين باڪس کي اڻ ٽِڪ ڪريو\n\nانهن صورتن ۾، جيڪڏهن توهان چاهيو ته صفحي کي پاڻ چوري يا ضمائي سگھو ٿا.",
-       "movearticle": "صفحو چوريو:",
+       "movenotallowed": "توهان کي صفحا چورڻ جي اجازت حاصل ڪانهي.",
+       "movenotallowedfile": "توهان کي فائيلس چورڻ جي اجازت حاصل ڪانهي.",
        "newtitle": "نئين عنوان ڏانهن:",
        "move-watch": "هيءُ صفحو ٽيٽيو",
        "movepagebtn": "صفحو چوريو",
        "movelogpage": "چورڻ لاگ",
        "movereason": "سبب:",
        "revertmove": "ورايو",
+       "delete_and_move": "ڊاهيو ۽ چوريو",
        "delete_and_move_confirm": "جي ها، صفحو ڊاهيو",
        "delete_and_move_reason": "چورڻ جو عمل ممڪن بنائڻ لاءِ ڊاٺو ويو",
        "export": "صفحا برآمديو",
+       "export-submit": "برآمديو",
+       "export-download": "بطور فائيل سانڍيو",
+       "export-templates": "سانچا شامل ڪريو",
        "allmessages": "سرشتائي نياپا",
        "allmessagesname": "نالو",
        "allmessagescurrent": "موجوده تحرير",
+       "allmessages-filter-legend": "ڇاڻي",
+       "allmessages-filter-all": "سڀ",
+       "allmessages-filter-modified": "ترميم شده",
+       "allmessages-language": "ٻولي:",
+       "allmessages-filter-submit": "ھلو",
+       "allmessages-filter-translate": "ترجمو ڪريو",
        "thumbnail-more": "وڏو ڪريو",
+       "filemissing": "فائيل کٽل",
+       "import": "صفحا درآمديو",
+       "import-upload-filename": "فائيل نانءُ:",
+       "import-comment": "تاثر:",
        "importlogpage": "درآمد لاگ",
-       "tooltip-pt-userpage": "منهنجو تعارفي صفحو",
-       "tooltip-pt-mytalk": "منهنجو مباحثي صفحو",
+       "tooltip-pt-userpage": "توهان جو تعارفي صفحو",
+       "tooltip-pt-mytalk": "توهان جو مباحثي صفحو",
        "tooltip-pt-preferences": "منهنجون ترجيحات",
        "tooltip-pt-watchlist": "توهان جي ٽيٽ فهرست ۾ شامل صفحا",
-       "tooltip-pt-mycontris": "منهنجون ڀاڱيداريون",
-       "tooltip-pt-login": "توهان کي همٿائجي ٿو ته توهان لاگ اِن ٿيو، بهرحال اهو لازمي ناهي.",
+       "tooltip-pt-mycontris": "توهان جون ڀاڱيداريون",
+       "tooltip-pt-login": "توهان کي همٿائجي ٿو تہ توهان لاگ اِن ٿيو، بهرحال اهو لازمي نہ آهي.",
        "tooltip-pt-logout": "لاگ آئوٽ",
        "tooltip-pt-createaccount": "توهان جي همٿ افزائي ڪئي وئي آهي ته هڪ کاتو کوليو ۽ لاگ ان ٿيو؛ جيتوڻيڪ، اهو ضروري نه آهي",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
-       "tooltip-ca-edit": "توهان هيءُ صفحو سنواري سگھو ٿا. مهرباني ڪري سانڍڻ کان اڳ پيش نگاهه جو اختيار استعمال ڪندا.",
-       "tooltip-ca-addsection": "Ù\87Ù\86 Ø¨Ø­Ø« ØªÙ\8a ØªØ§Ø«Ø±Ø§Øª Ø¯Ø±Ø¬ ÚªØ±Ø§يو",
+       "tooltip-ca-edit": "هيءُ صفحو سنواريو",
+       "tooltip-ca-addsection": "Ù\86ئÙ\88Ù\86 Ø³Ù\8aڪشÙ\86 Ø´Ø±Ù\88ع ÚªØ±يو",
        "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي. توهان ان جو ڪوڊ ڏسي سگھو ٿا.",
        "tooltip-ca-history": "هن صفحي جون گذريل نظرثانيون",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
        "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي ٽيٽ فهرست مان هٽايو",
        "tooltip-search": "جھڙتيو {{SITENAME}}",
-       "tooltip-search-go": "صفحي تي وڃو بلڪل هن ساڳئي نالي سان جيڪڏهن موجود آهي ته",
+       "tooltip-search-go": "صفحي تي وڃو بلڪل هن ساڳئي نالي سان جيڪڏهن موجود آهي تہ",
        "tooltip-search-fulltext": "هن متن لاءِ صفحا ڳوليو",
-       "tooltip-p-logo": "مکيه صفحو وزٽ ڪريو",
+       "tooltip-p-logo": "مک صفحو وزٽ ڪريو",
        "tooltip-n-mainpage": "مک صفحو گھمو",
        "tooltip-n-mainpage-description": "مکيه صفحو وزٽ ڪريو",
        "tooltip-n-portal": "هن رٿا بابت، توهان ڇا ٿا ڪري سگھو، ڪهڙي شَي ڪٿي ملندي",
        "tooltip-n-randompage": "بلاترتيب ڪو به صفحو اتاريو",
        "tooltip-n-help": "ڳولي لهڻ جي جاءِ.",
        "tooltip-t-whatlinkshere": "هتان ڳنڍيل سمورا وڪي صفحا",
-       "tooltip-t-recentchangeslinked": "Ù\88Ù\8aجھÚ\99ائÙ\8aØ¡Ù\8e Û¾ ØµÙ\81Ø­Ù\86 Û¾ Ù¿Ù\8aÙ\84 ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\88Ù\86 Ù\87Ù\86 ØµÙ\81Ø­Ù\8a ØªØ§Ù\86 Ú³Ù\86Ú\8dÙ\8aÙ\84 Ù\8aا Ù\84Ù\86Úª Ù¿يل آهن",
+       "tooltip-t-recentchangeslinked": "Ù\88Ù\8aجھÚ\99ائÙ\8aØ¡Ù\8e Û¾ ØµÙ\81Ø­Ù\86 Û¾ Ù¿Ù\8aÙ\84 ØªØ¨Ø¯Ù\8aÙ\84Ù\8aÙ\88Ù\86 Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ø³Ø§Ù\86 Ú³Ù\86Ú\8dيل آهن",
        "tooltip-t-contributions": "هن يُوزر جون ڀاڱيداريون ڏسو",
        "tooltip-t-emailuser": "هن يُوزر کي برق ٽپال اماڻيو",
        "tooltip-t-upload": "فائيل چاڙهيو",
        "tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
        "tooltip-t-print": "هن صفحي جو ڇاپائتو پرت",
-       "tooltip-t-permalink": "صفحي جي هن نظرثاليءَ ڏانهن مستقل لنڪ",
+       "tooltip-t-permalink": "صفحي جي ان نظرثاليءَ ڏانهن مستقل ڳنڍڻو",
        "tooltip-ca-nstab-main": "مواد جي صفحي کي ڏسو",
        "tooltip-ca-nstab-user": "هن جو يُوزر صفحو ڏسو",
-       "tooltip-ca-nstab-special": "هي خاص صفحو آهي، توهان هن صفحي کي ترميم نه ٿا ڪري سگهو.",
+       "tooltip-ca-nstab-special": "هيءُ خاص صفحو آهي، ان ۾ ترميم ڪري نہ ٿي سگھجي.",
        "tooltip-ca-nstab-project": "رٿائي صفحو ڏسو",
        "tooltip-ca-nstab-image": "هن فائيل جو صفحو ڏسو",
        "tooltip-ca-nstab-template": "سانچو ڏسو",
        "tooltip-diff": "پنهنجون ڪيل تبديليون ڏسو.",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
        "tooltip-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
+       "tooltip-rollback": "هن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم (ترميمن) کي هڪ ڪلڪ سان اڻ ڪريو.",
+       "tooltip-summary": "ننڍو خلاصو ڏيو",
        "anonymous": "{{SITENAME}} جا نامعلوم يوزرس",
        "pageinfo-toolboxlink": "صفحي جي معلومات",
-       "previousdiff": "← اڳوڻو تفاوت",
-       "nextdiff": "نئون تفاوت -->",
+       "pageinfo-contentpage-yes": "ها",
+       "pageinfo-protect-cascading-yes": "ها",
+       "pageinfo-category-total": "رڪنن جو ڪل تعداد",
+       "pageinfo-category-subcats": "ذيلي زمرن جو تعداد",
+       "pageinfo-category-files": "صفحن جو تعداد",
+       "previousdiff": "← اڳوڻي ترميم",
+       "nextdiff": "نئين ترميم-->",
        "file-info-size": "$1 × $2 عڪسلون، فائيل سائيز: $3، MIME ٽائيپ: $4",
        "file-nohires": "اڃا سنهو تحلل ميسر ناهي.",
        "svg-long-desc": "ايس وي جي فائيل، اٽڪل $1 × $2 عڪسلون، فائيل سائيز: $3",
-       "show-big-image": "سنهو ترين تحلل",
+       "show-big-image": "اصلوڪو فائيل",
+       "show-big-image-preview": "هن پيش نگاهہ جي ماپ: $1",
+       "show-big-image-other": "ٻيا {{PLURAL:$2|تحلل}}:$1",
        "show-big-image-size": "$1*$2 پڪزلس",
        "newimages": "نون فائيلن جي گيلري",
-       "noimages": "ڏسڻ لاءِ ڪجھه ناهي.",
+       "noimages": "ڏسڻ لاءِ ڪجھہ ناهي.",
+       "ilsubmit": "ڳوليو",
        "bydate": "تاريخوار",
+       "hours": "{{PLURAL:$1|$1 ڪلاڪ|$1 ڪلاڪَ}}",
+       "days": "{{PLURAL:$1|$1 ڏينهن|$1 ڏينهَن}}",
+       "weeks": "{{PLURAL:$1|$1 هفتو|$1 هفتا}}",
+       "months": "{{PLURAL:$1|$1 مهينو|$1 مهينا}}",
+       "years": "{{PLURAL:$1|$1 سال|$1 سالَ}}",
+       "ago": "$1 اڳي",
+       "just-now": "هاڻي هاڻي",
+       "hours-ago": "$1 {{PLURAL:$1|ڪلاڪ|ڪلاڪَ}} اڳ ۾",
+       "minutes-ago": "$1 {{PLURAL:$1|منٽُ|منٽَ}} اڳ ۾",
+       "seconds-ago": "$1 {{PLURAL:$1|سيڪنڊُ|سيڪنڊَ}} اڳ ۾",
+       "monday-at": "$1 بجي سومر",
+       "tuesday-at": "$1 بجي اڱارو",
+       "wednesday-at": "$1 بجي اربع",
+       "thursday-at": "$1 بجي خميس",
+       "friday-at": "$1 بجي جمعو",
+       "saturday-at": "$1 بجي ڇنڇر",
+       "sunday-at": "$1 بجي آچر",
+       "yesterday-at": "$1 بجي ڪالهہ",
        "metadata": "اعدادِ اعداد",
        "metadata-expand": "توسيعي تفصيل ڏيکاريو",
        "metadata-collapse": "توسيعي تفصيل لڪايو",
        "exif-xresolution": "افقي تحلل",
        "exif-yresolution": "عمودي تحلل",
        "exif-stripoffsets": "عڪسي اعداد جي مڪانيت",
+       "exif-datetime": "فائيل ۾ تبديليءَ جي تاريخ ۽ وقت",
        "exif-imagedescription": "عڪس عنوان",
+       "exif-model": "ڪيميرا ماڊل",
+       "exif-software": "مستعمل منتقگري",
+       "exif-artist": "ليکڪ",
+       "exif-copyright": "حق ۽ واطا رکندڙ",
+       "exif-colorspace": "رنگ پولار",
+       "exif-pixelydimension": "عڪس جي ويڪر",
+       "exif-pixelxdimension": "عڪس جي اوچائي",
+       "exif-usercomment": "يُوزر جا تاثرات",
+       "exif-relatedsoundfile": "لاڳاپيل آوازي فائيل",
+       "exif-datetimeoriginal": "اعداد جي جڙڻ جي تاريخ ۽ وقت",
+       "exif-datetimedigitized": "عددڪاريءَ جي تاريخ ۽ وقت",
        "exif-saturation": "رچاءُ",
        "exif-gpslatitude": "ويڪرائي ڦاڪَ",
        "exif-gpslongituderef": "اڀرندي يا الهندي ڊگھائي ڦاڪَ",
        "exif-gpslongitude": "ڊگھائي ڦاڪَ",
+       "exif-gpsaltitude": "اوچائي",
+       "exif-gpssatellites": "پيمائش لاءِ استعمال ٿيل اپگرهہ",
        "exif-gpstrack": "چرپر جو طرف",
+       "exif-keywords": "ڪليدي لفظ",
+       "exif-objectname": "مختصر عنوان",
+       "exif-headline": "سرخي",
+       "exif-source": "ذريعو",
+       "exif-writer": "لکندڙ",
+       "exif-languagecode": "ٻولي",
+       "exif-disclaimer": "غيرجوابدارينامو",
+       "exif-copyrighted-true": "حق ۽ واسطا محفوظيل",
        "exif-unknowndate": "نامعلوم تاريخ",
+       "exif-orientation-1": "نارمل",
        "exif-orientation-3": "180° موڙيل",
        "exif-componentsconfiguration-0": "وجود نه ٿو رکي",
+       "exif-exposureprogram-1": "دستينامو",
+       "exif-meteringmode-0": "اڻڄاتل",
+       "exif-meteringmode-1": "سراسري",
+       "exif-meteringmode-6": "جُزوي",
+       "exif-meteringmode-255": "ٻيو",
        "exif-lightsource-0": "نامعلوم",
        "exif-lightsource-255": "روشنيءَ جو ٻيو ذريعو",
        "exif-focalplaneresolutionunit-2": "انچ",
        "exif-scenecapturetype-0": "معياري",
+       "exif-gaincontrol-0": "ڪو بہ نہ",
+       "exif-contrast-0": "نارمل",
+       "exif-saturation-0": "نارمل",
+       "exif-saturation-1": "ننڍ رچاءُ",
+       "exif-saturation-2": "وَڏ رچاءُ",
+       "exif-sharpness-0": "نارمل",
        "exif-subjectdistancerange-0": "نامعلوم",
-       "exif-subjectdistancerange-3": "ڏورانهين نگاهه",
+       "exif-subjectdistancerange-3": "ڏورانهين نگاهہ",
        "exif-gpslatitude-s": "ڏاکڻي ويڪرائي ڦاڪَ",
        "exif-gpslongitude-e": "اڀرندي ڊگھائي ڦاڪَ",
+       "exif-gpslongitude-w": "الهندي ڊگھائي ڦاڪَ",
        "exif-gpsmeasuremode-2": "2-رخي ماپ",
        "exif-gpsmeasuremode-3": "3-رخي ماپ",
        "exif-gpsspeed-k": "ڪلوميٽر في ڪلاڪ",
        "exif-gpsspeed-m": "ميل في ڪلاڪ",
-       "exif-gpsspeed-n": "ڳنڍيون",
+       "exif-gpsspeed-n": "ناٽس",
+       "exif-gpsdestdistance-k": "ڪلميٽر",
+       "exif-gpsdestdistance-m": "ميل",
+       "exif-gpsdestdistance-n": "سامونڊي ميل",
+       "exif-objectcycle-p": "رڳو شام",
+       "exif-dc-contributor": "ڀاڱيدار",
+       "exif-dc-date": "تاريخون",
+       "exif-dc-relation": "لاڳاپيل ذريعات",
+       "exif-dc-rights": "حق",
+       "exif-iimcategory-clj": "جرم ۽ قانون",
+       "exif-iimcategory-dis": "آفتون ۽ حادثا",
+       "exif-iimcategory-fin": "معاشيات ۽ واپار",
+       "exif-iimcategory-edu": "تعليم",
+       "exif-iimcategory-evn": "ماحوليات",
+       "exif-iimcategory-hth": "صحت",
+       "exif-iimcategory-hum": "بشري مفاد",
+       "exif-iimcategory-lab": "پورهيو",
+       "exif-iimcategory-lif": "ذوق ۽ شوق",
+       "exif-iimcategory-pol": "سياست",
+       "exif-iimcategory-rel": "مذهب ۽ عقيدو",
+       "exif-iimcategory-sci": "سائنس ۽ ٽيڪنيڀياس",
+       "exif-iimcategory-soi": "سماجي ڳالهوڙا",
+       "exif-iimcategory-spo": "رانديون",
+       "exif-iimcategory-war": "جنگ، تڪرار، ۽ بيچيني",
+       "exif-iimcategory-wea": "موسم",
        "namespacesall": "سڀ",
        "monthsall": "سڀ",
+       "confirmemail": "برق ٽپال پتي جي پَڪَ ڪندا",
+       "confirmemail_send": "خاطري ڪوڊ اماڻيو",
+       "confirmemail_sent": "خاطري برق ٽپال اماڻي وئي.",
        "confirmemail_success": "توھان جي برق ٽپال جي پڪ ڪئي وئي آھي. ھاڻِ توھان لاگ ان ٿي وڪيءَ جو مزو وٺي سگھو ٿا",
-       "recreate": "ورسجيو",
+       "confirmemail_loggedin": "توهان جي برق ٽپال پتي جي تصديق هاڻي ٿي چڪي آهي.",
+       "confirmemail_subject": "{{SITENAME}} برق ٽپال پتي جي تصديق",
+       "recreate": "ورسرجيو",
+       "confirm-watch-button": "ٺيڪ",
+       "confirm-watch-top": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪندا؟",
+       "confirm-unwatch-button": "ٺيڪ",
+       "confirm-unwatch-top": "هيءُ صفحو پنهنجي ٽيٽ فهرست مان هٽائيندا؟",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← اڳوڻو صفحو",
+       "imgmultipagenext": "ايندڙ صفحو →",
+       "imgmultigo": "هلو!",
+       "imgmultigoto": "$1 صفحي تي هلو",
+       "img-lang-go": "ھلو",
+       "table_pager_next": "مٿيون صفحو",
+       "table_pager_prev": "پويون صفحو",
+       "table_pager_first": "پهريون صفحو",
+       "table_pager_last": "آخري صفحو",
+       "table_pager_limit_label": "وَٿُون في صفحو:",
+       "table_pager_limit_submit": "ھلو",
+       "table_pager_empty": "ڪو بہ نتيجو نہ مليو",
+       "watchlistedit-normal-title": "ٽيٽ فهرست کي سنواريو",
+       "watchlistedit-raw-titles": "عنوانَ:",
+       "watchlistedit-clear-titles": "عنوانَ:",
        "watchlisttools-view": "لاڳاپيل تبديليون ڏسو",
        "watchlisttools-edit": "ٽيٽ فهرست ڏسو ۽ سنواريو",
        "watchlisttools-raw": "ڪچي ٽيٽ فهرست سنواريو",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالهہ]])",
        "version": "ورزن",
+       "version-extensions": "تنصيب شده توسيعات",
+       "version-skins": "تنصيبشده چَمُون",
+       "version-specialpages": "خاص صفحا",
+       "version-variables": "ڦرڻا",
+       "version-other": "ٻيو",
+       "version-license": "ذريعات‌وڪي لائيسنس",
+       "version-ext-license": "لائيسنس",
+       "version-ext-colheader-name": "توسيع",
+       "version-skin-colheader-name": "چَمَ",
+       "version-ext-colheader-version": "ورزن",
+       "version-ext-colheader-license": "لائيسنس",
+       "version-ext-colheader-description": "تشريح",
+       "version-ext-colheader-credits": "ليکڪ",
+       "version-license-title": "لائيسنس براءِ $1",
+       "version-poweredby-others": "ٻيا",
+       "version-poweredby-translators": "translatewiki.net جا ترجميڪار",
+       "version-software": "تنصيب شده منطقگري",
+       "version-software-product": "پراڊڪٽ",
+       "version-software-version": "ورزن",
+       "version-libraries-library": "لائبريري",
+       "version-libraries-version": "ورزن",
+       "version-libraries-license": "لائيسنس",
+       "version-libraries-description": "تشريح",
+       "version-libraries-authors": "ليکڪ",
+       "redirect-submit": "ھلو",
+       "redirect-file": "فائيل نانءُ",
+       "fileduplicatesearch-filename": "فائيل نانءُ:",
+       "fileduplicatesearch-submit": "ڳوليو",
        "specialpages": "خاص صفحا",
+       "specialpages-note-top": "ڪنجي",
+       "specialpages-group-login": "لاگ اِن ٿيو / کاتو کوليو",
        "specialpages-group-users": "يوزرس ۽ حق",
+       "blankpage": "خالي صفحو",
+       "intentionallyblankpage": "هيءُ صفحو ڄاڻي خالي ڇڏيو ويو آهي.",
+       "tag-filter": "[[Special:Tags|ٽيگ]] ڇاڻيون:",
+       "tag-filter-submit": "ڇاڻي",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٽيگ|ٽيگز}}]]: $2)",
-       "searchsuggest-search": "ڳوليو"
+       "tags-title": "ٽيگ",
+       "tags-tag": "ٽيگ نانءُ",
+       "tags-source-header": "ذريعو",
+       "tags-active-yes": "ها",
+       "tags-active-no": "نہ",
+       "tags-edit": "سنواريو",
+       "tags-delete": "ڊاهيو",
+       "tags-activate": "موثر بڻايو",
+       "tags-deactivate": "غير موثر بڻايو",
+       "tags-create-tag-name": "ٽيگ نانءُ:",
+       "tags-create-reason": "سبب:",
+       "tags-create-submit": "سرجيو",
+       "tags-delete-title": "ٽيگ کي ڊاهيو",
+       "tags-delete-reason": "سبب:",
+       "tags-activate-reason": "سبب:",
+       "tags-activate-submit": "موثر بڻايو",
+       "tags-deactivate-title": "ٽيگ کي غيرموثر بڻايو.",
+       "tags-deactivate-reason": "سبب:",
+       "tags-edit-existing-tags-none": "\"ڪو بہ نہ\"",
+       "tags-edit-new-tags": "نوان ٽيگس:",
+       "tags-edit-reason": "سبب:",
+       "compare-page1": "صفحو 1",
+       "compare-page2": "صفحو 2",
+       "htmlform-submit": "جمع ڪرايو",
+       "htmlform-selectorother-other": "ٻيو",
+       "htmlform-no": "نہ",
+       "htmlform-yes": "ها",
+       "htmlform-cloner-create": "ٻيا بہ شامل ڪريو",
+       "htmlform-cloner-delete": "هٽايو",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ڊاٺو}} صفحو $3",
+       "revdelete-uname-hid": "لڪل يُوزرنانءُ",
+       "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|جوڙيو ويو}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
+       "rightsnone": "(ڪو بہ نہ)",
+       "revdelete-summary": "ترميمي خلاصو",
+       "feedback-back": "پوئتي",
+       "feedback-cancel": "رد",
+       "feedback-close": "ٿي ويو",
+       "feedback-error-title": "چُڪَ",
+       "feedback-message": "نياپو:",
+       "feedback-subject": "موضوع:",
+       "feedback-submit": "جمع ڪرايو",
+       "feedback-thanks-title": "توهان جي مهرباني!",
+       "searchsuggest-search": "ڳوليو",
+       "api-error-filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
+       "api-error-unclassified": "ڪا اڻجاتل چُڪَ واقع ٿي.",
+       "api-error-unknown-code": "اڻڄاتل چُڪَ: \"$1\".",
+       "api-error-unknown-warning": "اڻڄاتل چتاءُ: \"$1\".",
+       "api-error-unknownerror": "اڻڄاتل چُڪَ: \"$1\".",
+       "expand_templates_output": "نتيجو",
+       "expand_templates_ok": "ٺيڪ",
+       "expand_templates_remove_comments": "تاثرات مِٽايو",
+       "expand_templates_preview": "پيش نگاهہ",
+       "pagelang-name": "صفحو",
+       "pagelang-language": "ٻولي",
+       "pagelang-select-lang": "ٻولي چونڊيو",
+       "right-pagelang": "صفحي جي ٻولي بدلايو",
+       "action-pagelang": "صفحي جي ٻولي بدلايو",
+       "mediastatistics-header-unknown": "اڻڄاتل",
+       "mediastatistics-header-audio": "آواز",
+       "mediastatistics-header-video": "وڊيوز",
+       "mediastatistics-header-office": "دفتر",
+       "special-characters-group-latin": "لاطيني",
+       "special-characters-group-latinextended": "لاطيني توسيعي",
+       "special-characters-group-ipa": "بول",
+       "special-characters-group-symbols": "نشانيون",
+       "special-characters-group-greek": "يوناني",
+       "special-characters-group-cyrillic": "رُوسي",
+       "special-characters-group-arabic": "عربي",
+       "special-characters-group-hebrew": "ابراني",
+       "special-characters-group-bangla": "بنگالي",
+       "special-characters-group-tamil": "تامل",
+       "special-characters-group-telugu": "تيلگو",
+       "special-characters-group-sinhala": "سنهالا",
+       "special-characters-group-gujarati": "گجراتي",
+       "special-characters-group-devanagari": "ديوناگري",
+       "special-characters-group-thai": "ٿائي",
+       "mw-widgets-dateinput-no-date": "ڪا بہ تاريخ نہ چونڊيل",
+       "mw-widgets-titleinput-description-new-page": "اڃا اهو صفحو وجود نہ ٿو رکي",
+       "mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل",
+       "api-error-blacklisted": "براءِ مهرباني ڪو مختلف، وضاحتي عنوان چونڊيو."
 }
index 81ead77..ccd5e87 100644 (file)
        "qbedit": "Taisītė",
        "qbpageoptions": "Tas poslapis",
        "qbmyoptions": "Mona poslapē",
-       "faq": "DOK",
+       "faq": "TKK",
        "faqpage": "Project:DOK",
        "actions": "Vēksmā",
        "namespaces": "Vardū srėtis",
        "history": "Poslapė istuorėjė",
        "history_short": "Istuorėjė",
        "updatedmarker": "pakeist nug tada, kāp lonkiaus paskotėni sīki",
-       "printableversion": "Atmains spausdėnėmō",
+       "printableversion": "Atmains spausdėnėmou",
        "permalink": "Nūlatėnė nūruoda",
        "print": "Spausdintė",
        "view": "Veizietė",
        "nstab-template": "Šabluons",
        "nstab-help": "Pagelbuos poslapis",
        "nstab-category": "Kateguorėjė",
+       "mainpage-nstab": "Pėrms poslapis",
        "nosuchaction": "Nier tuokė vēksma",
        "nosuchspecialpage": "Nier tuokė specēlėjė poslapė",
        "nospecialpagetext": "Tamsta prašiet nelaistėna specēlė̄jė poslapė, laistėnū specēliūju poslapiu sōraša rasėt [[Special:SpecialPages|specēliūju poslapiu sārošė]].",
        "error": "Klaida",
        "databaseerror": "Doumenū bazės klaida",
        "databaseerror-error": "Klaida: $1",
-       "laggedslavemode": "Diemesė: Poslapī gal nesmatītė naujausiu pakeitėmu.",
+       "laggedslavemode": "Atėduos: Poslapie gal' nesmatītė vielībiausiu pakeitėmu.",
        "readonly": "Doumenū bazė ožrakėnta",
        "enterlockreason": "Iveskėt ožrakėnėma prižasti, tēpuogi kumet daugmaž bus atrokėnta",
        "readonlytext": "Doumenū bazė daba īr ožrakėnta naujėm irašam a kėtėm keitėmam,\nmažo doumenū bazės techninē pruofilaktėkā,\npuo tuo vėsks griš i sava viežes.\nOžrakėnusiuojo admėnėstratuoriaus pateikts rakėnima paaiškėnims: $1",
        "createacct-realname": "Tėkros vardos (nie būtėns)",
        "createaccountreason": "Dingstės:",
        "createacct-reason": "Dingstės",
-       "createacct-captcha": "Sargtėis patikrėnėms",
-       "createacct-imgcaptcha-ph": "Ožrašīkėt ženklus, katrus veizėt viršō",
        "createacct-submit": "Padėrbkat savėi paskīra",
        "createacct-another-submit": "Padėrbtė kėta paskīra",
        "createacct-benefit-heading": "{{SITENAME}} īr sokorta prietėliu, tuokiu, kāp Tamsta.",
        "newarticle": "(Naus)",
        "newarticletext": "Tamsta pakliovat poslapin, katros dā nie padėrbts.\nJēgo nuorat anon padėrbtė, rašīkat laukė, katros ī apatiuo\n(veiziekat [$1 pagelbas poslapi]).\nJēgo pakliovat čė netīčiuom, paprastiausē paspauskat naršīklės mīgtoka '''atgal'''.",
        "anontalkpagetext": "----''Tas īr anonimėnė nauduotuojė, katros nier sosėkūrės aba nenauduo paskīruos, aptarėmu poslapis.\nDielē tuo nauduojams IP adresos anuo atpažėnėmō.\nTas IP adresos gal būtė dalinams keletō nauduotuoju.\nJēgo Tamsta esat anonimėnis nauduotuos ėr veizėt, kū kuomentarā nier skėrtė Tamstā, [[Special:UserLogin/signup|sokorkėt paskīra]] aba [[Special:UserLogin|prisėjonkėt]], ė nebūsėt maišuoms so kėtās anonimėnēs nauduotuojās.''",
-       "noarticletext": "Nūnā tamė poslapī nie nė juokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė ton poslapė pavadėnėma]] terp kėtū poslapiū,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė ton poslapi]</span>.",
-       "noarticletext-nopermission": "Nūnā tamė poslapī nier anėjuokė teksta.\nTamsta galėt [[Special:Search/{{PAGENAME}}|ėiškuotė šėta poslapė pavadėnėma]] kėtūs poslapiūs,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu regėstru]</span>.",
+       "noarticletext": "Nūnā tamė poslapie nie nė juokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė ton poslapė pavadėnėma]] terp kėtū poslapiū,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė ton poslapi]</span>.",
+       "noarticletext-nopermission": "Nūnā tamė poslapie nier anėjuokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė šėtuo poslapė pavadėnėma]] kėtūs poslapiūs,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiūm ragėstru]</span>.",
        "userpage-userdoesnotexist": "Nauduotuojė paskīra „<nowiki>$1</nowiki>“ nier ožregėstrouta. Prašuom patikrėntė, a Tamsta nuorėt kortė/keistė ta poslapi.",
        "userpage-userdoesnotexist-view": "Nie nauduotuojė vardo „$1“",
        "blocked-notice-logextract": "Nauduotuos ožgints īr.\nApatiuo paruodīta kas ė kāpː",
        "next-page": "paskesnis poslapis",
        "prevn-title": "{{PLURAL:$1|Onkstesnis $1 rezoltats|Onkstesnio $1 rezoltato|Onkstesni $1 rezoltatā}}",
        "nextn-title": "{{PLURAL:$1|Kėts $1 gavėms|Kėtė $1 gavėmā|Kėtū $1 gavėmu}}",
-       "shown-title": "Ruodītė $1 {{PLURAL:$1|gavėni|gavėnius|gavėniū}} poslapī",
+       "shown-title": "Ruodītė $1 {{PLURAL:$1|gavėni|gavėnius|gavėniū}} ont poslapė",
        "viewprevnext": "Veizėtė ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
        "searchmenu-new": "<strong>Padėrbtė poslapi, katros vadėntos „[[:$1]]“</strong> {{PLURAL:$2|0=|Dā veiziekat paėiškuo rasta straipsni|Dā veiziekat paėiškuos gavėnius.}}",
        "right-read": "Skaitītė poslapius",
        "right-edit": "Keistė poslapius",
        "right-upload": "Ikeltė failus",
+       "right-writeapi": "Nauduotė API rašīmō",
        "right-delete": "Trintė poslapius",
        "newuserlogpage": "Nauduotuojė kūrėma sārošos",
        "rightslog": "Nauduotuoju teisiu istuorėjė",
        "action-read": "skaitītė ton poslapi",
        "action-edit": "redagoutė ta poslapi",
        "action-createpage": "dėrbtė poslapius",
-       "action-move": "parvadintė šėta poslapi",
+       "action-move": "parvadintė šėton poslapi",
        "action-move-subpages": "parvadintė šėta poslapi ėr anuo dalės",
        "action-move-categorypages": "parvadintė kateguorėjes",
        "action-movefile": "parvadintė šėta faila",
        "upload_directory_read_only": "Tėnklapė serveris nagal rašītė i ikielima papke ($1).",
        "uploaderror": "Ikielima soklīdims",
        "upload-recreate-warning": "<strong>Atėdės: Abruozdielis tuokio vardo bova ėštrints aba parvadints.</strong>\n\nApatiuo ėšdieta kas ė kāp:",
-       "uploadtext": "Nauduokėtės žemiau pateikta skvarma kū ikeltomėt failus.\nNuoriedamė parveizietė ar ėiškuotė unkstiau ikeltū abruozdieliu, ēkėt i [[Special:FileList|ikeltū failu saraša]], ikielėmā ėr ėštrīnėmā īr ožregėstroujamė [[Special:Log/upload|ikielėmu istuorėjuo]], trīnėmā - [[Special:Log/delete|trīnėmu istuorėjuo]].\n\nNuoriedamė panauduotė ikelta faila poslapī, nauduokėt tuokės nūoruodas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' aba\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tėisiuogėnē nūruodā i faila.",
+       "uploadtext": "Nauduokatėis apatiuo douta skvarma kū ikeltomat abruozdielius.\nNuoriedamė parveizietė ar ėiškuotė onkstiau ikeltū abruozdieliu, ēkat i [[Special:FileList|ikeltū abruozdieliu sāraša]], ikielėmā ėr ėštrīnėmā īr ožregėstroujamė [[Special:Log/upload|ikielėmu istuorėjuo]], trīnėmā - [[Special:Log/delete|trīnėmu istuorėjuo]].\n\nNuoriedamė panauduotė ikelta abruozdieli poslapie, nauduokat tuokės nūruodas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' aba\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tėisiuogėnē nūruoda i faila.",
        "upload-permitted": "{{PLURAL:$2|Galams skvarmas būds|Galamė skvarmas būdā}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Velėms skvarmas būds|Velėmė skvarmas būdā}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Nagalams skvarmas būds|Nagalamė skvarmas būdā}}: $1.",
        "upload-dialog-button-done": "Padėrbt",
        "upload-dialog-button-save": "Ėšsauguotė",
        "upload-dialog-button-upload": "Ožkrautė",
-       "upload-process-error": "Notėka klaida",
        "upload-form-label-select-file": "Rinktėis abruozdieli",
        "upload-form-label-infoform-title": "Aple",
        "upload-form-label-infoform-name": "Pavadėnėms",
        "morelinkstoimage": "Veizietė [[Special:WhatLinksHere/$1|daugiau nūruodu]] ton abruozdielėn.",
        "sharedupload": "Tas fails īr ėš $1 ė gal būtė nauduojams kėtūs pruojektūs.",
        "sharedupload-desc-here": "Tas abruozdielis īr nug $1 ė gal būtė nauduojams kėtūs poslapiūs.\nŽinės nug [$2 abruozdielė aprašīma poslapė] prėgol apatiuo.",
+       "sharedupload-desc-create": "Šėts abruozdielis īr ėš $1 ė gal būtė nauduonams kėtūs pruojektūs. \nMaž nuorat pamainītė anuo aprašīma [$2 anuo poslapie]?",
        "uploadnewversion-linktext": "Ožkrautė nauji abruozdielė atmaina",
        "shared-repo-from": "ėš $1",
        "shared-repo": "bendruos saugīklas",
        "unwatchedpages": "Nekeravuojėmė poslapē",
        "listredirects": "Paradresavėmu sārašos",
        "unusedtemplates": "Nenauduojamė šabluonā",
-       "unusedtemplatestext": "Šėts poslapis ruod sāraša poslapiu, esontiu šabluonu vardū srėtī, katrė nė iterptė i juoki kėta poslapi. Nepamėrškėt patėkrėntė kėtū nūruodu priš anūs ėštrėnont.",
+       "unusedtemplatestext": "Tas poslapis ruod sāraša poslapiu, esontiu vardū srėtie „{{ns:template}}“, katrėi nie iterptė i juoki kėta poslapi. Nepamėrškat patikrėntė kėtū nūruodu prīš anas ėštrėnont.",
        "unusedtemplateswlh": "kėtas nūruodas",
        "randompage": "Bikuoks poslapis",
        "randompage-nopages": "Šėtuo vardū srėti nier anėjuokiu poslapiu.",
        "delete-edit-reasonlist": "Mainītė trīnėma dingstis",
        "rollback": "Atmestė pakeitėmus",
        "rollbacklink": "atmestė",
-       "rollbacklinkcount": "sogrōžintė $1 {{PLURAL:$1|pakeitėms|pakeitėmo|pakeitėmus|pakeitėmu}}",
+       "rollbacklinkcount": "sogrōžintė $1 {{PLURAL:$1|pakeitėma|pakeitėmo|pakeitėmus|pakeitėmu}}",
        "rollbacklinkcount-morethan": "sogrōžintė daugiau kāp $1 {{PLURAL:$1|pakeitėma|pakeitėmus|pakeitėmu}}",
        "rollbackfailed": "Atmetėms nasėgava",
        "cantrollback": "Negalėma atmestė redagavėma; paskotinis keitės nauduotuos īr tuo poslapė autorius.",
        "undelete-show-file-submit": "Tēp",
        "namespace": "Vardū srėtės:",
        "invert": "Žīmietė prīšėngā",
+       "tooltip-invert": "Pažīmiekat ton varnalė, ka pakavuotomiet pakeitėmus pasėrinktūs poslapiūs (ė prėgolontės vardū srėtis)",
        "namespace_association": "Prėgolontė vardū srėtės",
+       "tooltip-namespace_association": "Pažīmiekat ton varnalė, ka prėgoldītomat aptarėmus, katrėi ī sosėjė so parinkta vardū srėtim",
        "blanknamespace": "(Pagrėndinė)",
        "contributions": "Nauduotuojė duovis",
        "contributions-title": "Nauduotuojė $1 duovis",
        "sp-contributions-search": "Ėiškuotė duovė",
        "sp-contributions-username": "IP adresos a nauduotuojė vards:",
        "sp-contributions-toponly": "Ruodītė tėktās paskiausius keitėmus",
+       "sp-contributions-newonly": "Ruodītė tėktās tūs keitėmus, katrās padėrbtė straipsnē",
        "sp-contributions-submit": "Ėiškuotė",
        "whatlinkshere": "Sosėjėn straipsnē",
        "whatlinkshere-title": "Poslapē, katrėi ruod i \"$1\"",
        "tooltip-t-emailuser": "Siōstė gromata šėtom prietėliō",
        "tooltip-t-upload": "Ožkrautė abruozdielius",
        "tooltip-t-specialpages": "Specēliūju poslapiu sārašos",
-       "tooltip-t-print": "Šėta poslapė atmains spausdėnėmō",
+       "tooltip-t-print": "Šėta poslapė atmains spausdėnėmou",
        "tooltip-t-permalink": "Nūlatėnė nūruoda ton poslapė atmainuō",
        "tooltip-ca-nstab-main": "Ruodītė poslapė torėni",
        "tooltip-ca-nstab-user": "Ruodītė nauduotuojė poslapi",
-       "tooltip-ca-nstab-special": "Tas poslapis īr specēlos - anuo nagalėm keistė.",
+       "tooltip-ca-nstab-special": "Tas poslapis īr specēlos - anon nagalam keistė.",
        "tooltip-ca-nstab-project": "Ruodītė pruojekta poslapi",
        "tooltip-ca-nstab-image": "Ruodītė abruozdielė poslapi",
        "tooltip-ca-nstab-mediawiki": "Veizietė sėstėmas pranešėma",
        "spambot_username": "''MediaWiki'' reklamu šalėnėms",
        "spam_reverting": "Atkoriama i onkstesne versėje, katra nator nūruodu i $1",
        "spam_blanking": "Vėsos versėjės toriejė nūruodu i $1. Ėšvaluoma",
+       "simpleantispam-label": "Patikrėnėms nug šiokšlėnėma.\n<strong>Napildėkat</strong> šėton!",
        "pageinfo-header-basic": "Poslapė žėnės",
        "pageinfo-header-edits": "Keitėma istuorėjė",
        "pageinfo-header-restrictions": "Poslapė apsauga",
        "previousdiff": "← Onkstesnis pakeitėms",
        "nextdiff": "Paskesinis pakeitėms →",
        "mediawarning": "'''Diemesė''': Šėts fails gal torietė kenksmėnga kuoda, anū palaidus Tamstas sėstėma gal būtė sogadinta.",
-       "imagemaxsize": "Rėbuotė abruozdieliu dėdoma anū aprašīma poslapī lėgė:",
+       "imagemaxsize": "Abruozdielė dėdloma apžabuojėms:<br /><em>(abruozdielė aprašīma poslapiams)</em>",
        "thumbsize": "Somažėntu pavēkslieliu didums:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|poslapis|poslapē|poslapiu}}",
        "file-info": "faila dėdoms: $1, MIME tips: $2",
        "file-info-size": "$1 × $2 taškū, abruozdielė dėdloms: $3, MIME būds: $4",
        "file-nohires": "Geresnis ėšraiškėms negalėms.",
        "svg-long-desc": "SVG skvarmou, fuormalē $1 × $2 puškiu, skvarmenė dėdloms: $3",
-       "show-big-image": "Pėrms abruozdielis",
+       "show-big-image": "Pradėnis abruozdielis",
        "show-big-image-preview": "Parvaizos dėdloms: $1.",
        "show-big-image-other": "{{PLURAL:$2|Kėts dėdloms|Kėtė dėdlomā|Kėtū dėdlomu}}: $1.",
        "show-big-image-size": "$1 × $2 pikselē",
        "exif-make": "Puortaparata dėrbies",
        "exif-model": "Puortaparata muodelis",
        "exif-artist": "Autuorios",
+       "exif-exifversion": "Exif atmains",
        "exif-colorspace": "Spalvū lauks",
        "exif-compressedbitsperpixel": "Abruozdielė sospaudėma rėžėms",
        "exif-pixelydimension": "Abruozdielė platoms",
        "external_image_whitelist": " #Palikėt ta eilotė, tuokė kāp īr <pre>\n#Īrašīkat standartėniu ėšraišku fragmentus (tėktās dali terp //)\n#Anūs bus miegėnama sotapatintė so ėšuorėniu abruozdieliu adresās\n#Tė, katrėi sotaps, bus ruodomė kāp abruozdielē, a kėtė bus ruodomė tėktās kāp nūoruodas\n#Raidiu dėdoms nier svarbos\n#Eilotės, katuos prasided # īr kuomentarā \n\n#Īterpkat vėsus standartiėniu ėšraišku fragmentus prīš šėta eilote. Palikat šėta eilote, tuokė kāp ana īr </pre>",
        "tag-filter": "[[Special:Tags|Žīmiū]] kuošeklis:",
        "tag-filter-submit": "Kuošeklis",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Žīms|Žīmā|Žīmū}}]]: $2)",
        "tags-edit": "taisītė",
        "comparepages": "Primestė poslapio",
        "logentry-delete-delete": "$1 ėštrīnė poslapi $3",
        "logentry-delete-restore": "$1 atkūrė poslapi $3",
        "revdelete-content-hid": "torėnīs pakavuots",
+       "logentry-block-block": "ožgīnė „[[$1]]“ nug dėrbėma, tas vēk ton čiesa - $2 $3",
        "logentry-move-move": "$1 {{GENDER:$2|parvadėna}} poslapi $3 i $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|parvadėna}} poslapi nug $3 i $4 nepalinkdoms nusokėma",
        "logentry-move-move_redir": "$1 {{GENDER:$2|parvadėna}} poslapi nog $3 i $4 ont bovosė nusokėma",
index 6d83b6a..52f8b6b 100644 (file)
@@ -27,6 +27,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje izmijenim u spisak praćenja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenja",
+       "tog-watchrollback": "Dodaj stranice na kojima sam vratio uređivanja na popis praćenja",
        "tog-minordefault": "Označi da su sve izmjene u pravilu manje",
        "tog-previewontop": "Prikaži pretpregled prije kutije za uređivanje",
        "tog-previewonfirst": "Prikaži pretpregled na prvoj izmjeni",
@@ -37,7 +38,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji prate",
        "tog-oldsig": "Postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
-       "tog-uselivepreview": "Koristi pretpregled uživo (eksperimentalno)",
+       "tog-uselivepreview": "Koristi pretpregled uživo",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
        "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
        "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
@@ -45,6 +46,7 @@
        "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa liste praćenja",
        "tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa liste praćenja",
        "tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja",
+       "tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica",
        "tog-ccmeonemails": "Pošalji mi kopije emailova koje šaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod prikaza razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
        "otherlanguages": "Drugi jezici / Други језици",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjeri stranicu",
+       "redirectto": "Preusmjerenje na:",
        "lastmodifiedat": "Ova stranica je posljednji put izmijenjena $1, $2.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "pool-timeout": "Zaustavi čekanje za zaključavanje",
        "pool-queuefull": "Red na pool je prenapunjen",
        "pool-errorunknown": "nepoznata greška",
+       "pool-servererror": "Usluga brojača poola nije dostupna ($1).",
+       "poolcounter-usage-error": "Greška pri upotrebi: $1",
        "aboutsite": "O projektu {{SITENAME}}",
        "aboutpage": "Project:O_projektu_{{SITENAME}}",
        "copyright": "Pod licencom / Под лиценцом: $1.",
        "disclaimers": "Odricanje odgovornosti",
        "disclaimerpage": "Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti",
        "edithelp": "Pomoć pri uređivanju",
+       "helppage-top-gethelp": "Pomoć",
        "mainpage": "Glavna stranica / Главна страница",
        "mainpage-description": "Glavna stranica / Главна страница",
        "policy-url": "Project:Pravila",
        "hidetoc": "sakrij - сакриј",
        "collapsible-collapse": "Sakrij",
        "collapsible-expand": "Proširi",
+       "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?",
+       "confirmable-yes": "Da",
+       "confirmable-no": "Ne",
        "thisisdeleted": "Pogledaj ili vrati $1?",
        "viewdeleted": "Pogledaj $1?",
        "restorelink": "{{PLURAL:$1|$1 izbrisana izmjena|$1 izbrisanih izmjena}}",
        "nstab-template": "Šablon / Шаблон",
        "nstab-help": "Pomoć / Помоћ",
        "nstab-category": "Kategorija / Категорија",
+       "mainpage-nstab": "Glavna stranica / Главна страница",
        "nosuchaction": "Nema takve akcije",
        "nosuchactiontext": "Akcija navedena u URL-u nije valjana.\nMožda ste pogriješili pri unosu URL-a ili ste slijedili pokvaren link.\nMoguće je i da je ovo greška u softveru koji koristi {{SITENAME}}.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Interna pogreška",
        "internalerror_info": "Interna greška: $1",
+       "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
+       "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
+       "directorynotreadableerror": "Direktorij \"$1\" nije čitljiv.",
        "filenotfound": "Ne može se naći datoteka \"$1\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "formerror": "Greška: ne može se poslati formular",
        "no-null-revision": "Nije se mogla stvoriti nova ništavna revizija za stranicu \"$1\"",
        "badtitle": "Loš naslov",
        "badtitletext": "Zatražena stranica je bila nevaljana, prazna ili neispravno povezana s među-jezičkim ili inter-wiki naslovom.\nMože sadržavati jedno ili više slova koja se ne mogu koristiti u naslovima.",
+       "title-invalid-empty": "Zatraženo ime stranice je prazno ili samo sadrži naziv imenskog prostora.",
+       "title-invalid-utf8": "Vaš zatraženi naziv stranice sadrži nevažeći UTF-8 znak.",
+       "title-invalid-interwiki": "Traženi naslov stranice sadrži interwiki link koji ne može biti korišten u naslovima.",
+       "title-invalid-talk-namespace": "Vaš zatraženi naslov stranice se odnosi na stranicu za razgovor koja ne može postojati.",
+       "title-invalid-characters": "Vaš zatraženi naslov stranice sadrži nevažeće znakove: \"$1\".",
+       "title-invalid-relative": "Naslov ima relativnu putanju. Relativni naslovi stranica (./, ../) nisu važeći jer će često biti nedostupni u pregledniku korisnika.",
+       "title-invalid-magic-tilde": "Zatraženi naslov stranice sadrži nevažeći slijed magičknog znaka tilda (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Zatraženi naziv stranice je predugačak. Ne smije biti duži od {{PLURAL:$1|bajta|bajtova}} u UTF-8 kodiranju.",
+       "title-invalid-leading-colon": "Zahtjevani naslov stranice sadrži nevažeću dvotačku na početku.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani, a poslednji put su ažurirani $2 u $3. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata|$4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je isključeno.\nPodaci koji se ovdje nalaze neće biti biti ažurirani.",
        "viewsource": "Pogledaj kod",
        "viewsource-title": "Prikaz izvora stranice $1",
        "actionthrottled": "Akcija je usporena",
-       "actionthrottledtext": "Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.",
+       "actionthrottledtext": "U cilju borbe protiv zloupotrebe, ograničeno vam je da u kratkom vremenskom periodu previše puta vršite ovu radnju, a upravo ste prešli to ograničenje.\nPokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana kako bi se spriječilo uređivanje ili druge akcije.",
-       "viewsourcetext": "Možete vidjeti i kopirati izvorni tekst ove stranice:",
-       "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
+       "viewsourcetext": "Možete vidjeti i kopirati izvorni kôd ove stranice.",
+       "viewyourtext": "Možete vidjeti i kopirati izvor '''vaših izmjena''' na ovoj stranici.",
        "protectedinterface": "Ova stranica sadrži tekst interfejsa za softver na ovoj wiki, pa je zaključana kako bi se spriječile zloupotrebe. Kako bi dodali ili promijenili prijevode za sve wikije, molimo koristite [//translatewiki.net/ translatewiki.net], projekt lokalizacije MediaWikija.",
-       "editinginterface": "'''Upozorenje:''' Mijenjate stranicu koja se koristi za tekst interfejsa za softver.\nPromjene na ovoj stranici će izazvati promjene korisničkog interfejsa za druge korisnike na ovoj wiki.\nZa prijevode, molimo Vas koristite [//translatewiki.net/wiki/Main_Page?setlang=bs translatewiki.net], projekt lokalizacije MediaWiki.",
-       "cascadeprotected": "Ova stranica je zaštićena od uređivanja, jer je uključena u {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja sa uključenom kaskadnom opcijom:\n$2",
+       "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
+       "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
+       "cascadeprotected": "Uređivanje ove stranice zabranjeno je jer se koristi u {{PLURAL:$1|sljedećoj stranici, koja je zaštićena|sljedećim stranicama, koje su zaštićene}} prenosivom zaštitom:\n$2",
        "namespaceprotected": "Nemate dozvolu uređivati stranice imenskog prostora '''$1'''.",
        "customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "customjsprotected": "Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“",
        "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“",
        "exception-nologin": "Niste prijavljeni",
-       "exception-nologin-text": "Molimo [[Special:Userlogin|prijavite se]] da biste pristupili ovoj stranici ili radnji.",
+       "exception-nologin-text": "Molimo prijavite se ako želite pristup ovoj stranici ili djelovanje.",
        "exception-nologin-text-manual": "Molimo $1 da biste pristupili ovoj stranici ili radnji.",
        "virus-badscanner": "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
        "virus-scanfailed": "skeniranje nije uspjelo (code $1)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate novi račun",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Stvorite svoj račun",
-       "createacct-another-submit": "Stvorite novi račun",
+       "createacct-another-submit": "Napravi korisnički račun",
        "createacct-benefit-heading": "{{SITENAME}} se stvara od ljudi poput vas.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|stranica|stranice|stranica}}",
        "createacct-benefit-body3": "nedavni {{PLURAL:$1|donator|donatora}}",
        "badretype": "Lozinke koje ste unijeli se ne poklapaju.",
+       "usernameinprogress": "Stvaranje računa za ovog korisnika je već u toku.\nMolimo sačekajte.",
        "userexists": "Uneseno korisničko ime već je u upotrebi.\nUnesite neko drugo ime.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Pogreška u stvaranju računa",
        "wrongpassword": "Šifra koju ste uneli je neodgovarajuće. Molimo, upišite je ponovo.\n\nШифра коју сте унели је неодговарајућа. Молимо, упишите је поново.",
        "wrongpasswordempty": "Unesena šifra je bila prazna.\nMolimo Vas da pokušate ponovno.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.",
+       "passwordtoolong": "Šifre/lozinke/zaporke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovog korisničkog imena i lozinke je zabranjeo.",
        "mailmypassword": "Resetiraj lozinku/zaporku",
        "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
        "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
+       "login-migrated-generic": "Vaš se korisnički račun preselio, te Vaše korisničko ime više ne postoji na ovom wikiju.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "passwordreset-emailtext-ip": "Netko (vjerovatno Vi, s IP adrese $1) je zatražio resetiranje vaše lozinke/zaporke {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše početne lozinke, a ne želite je promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio resetiranje vaše lozinke/zaporke za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše originalne lozinke, a ne želite je više promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
-       "passwordreset-emailsent": "E-mail za resetiranje lozinke/zaporke je poslan.",
+       "passwordreset-emailsent": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre/lozinke/zaporke će vam biti poslan na vašu adresu e-pošte.",
        "passwordreset-emailsent-capture": "E-mail za resetiranje lozinke/zaporke je poslan (prikazan dolje).",
        "passwordreset-emailerror-capture": "E-mail za resetiranje lozinke/zaporke, prikazan dolje, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici|korisniku}} nije uspjelo: $1",
-       "changeemail": "Promijeni e-mail adresu",
-       "changeemail-header": "Promijeni e-mail adresu korisničkog računa",
+       "changeemail": "Promeni ili ukloni e-adresu",
+       "changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
+       "changeemail-passwordrequired": "Morat ćete unijeti vašu lozinku/zaporku da potvrdite ovu promjenu.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutna e-mail adresa:",
        "changeemail-newemail": "Nova e-mail adresa:",
+       "changeemail-newemail-help": "Ovo polje treba ostaviti prazno ako želite ukloniti svoju E-mail adresu. Nećete biti u mogućnosti resetirati zaboravljenu lozinku/zaporku i nećete moći primati E-mailove sa ove wiki ukoliko je E-mail adresa uklonjena.",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
        "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "changeemail-nochange": "Molimo unesite različitu E-mail adresu.",
        "resettokens": "Resetirajte tokene",
        "resettokens-text": "Možete resetirati tokene koji dozvoljavaju pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTo možete učiniti ako ste ih slučajno podijelili sa nekim ili ako je vaš račun kompromitiran.",
        "resettokens-no-tokens": "Nema tokena za resetiranje.",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite rijetko)",
        "summary": "Sažetak:",
-       "subject": "Tema/naslov:",
+       "subject": "Tema:",
        "minoredit": "Mala izmjena - Мала измена",
        "watchthis": "Prati / Прати",
        "savearticle": "Sačuvaj - Сачувај",
        "preview": "Pretpregled / Претпреглед",
        "showpreview": "Pretpregled - Претпреглед",
        "showdiff": "Prikaži izmjene - Прикажи измене",
-       "anoneditwarning": "'''Upozorenje:''' Niste prijavljeni.\nVaša IP adresa će biti zabilježena u historiji ove stranice.",
+       "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", napravit ćete praznu stranicu bez sadržaja.",
+       "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
        "missingsummary": "'''Podsjećanje:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj/Snimi, Vaša izmjena će biti snimljena bez sažetka.",
+       "selfredirect": "<strong>Upozorenje:</strong> Preusmjeravate stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "'''Podsjetnik:''' Niste napisali temu/naslov za ovaj komentar.\nAko ponovo kliknete na '''{{int:savearticle}}''', Vaše izmjene će biti snimljene bez teme/naslova.",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pretpregled sažetka:",
-       "subject-preview": "Pretpregled teme/naslova:",
+       "subject-preview": "Pretpregled teme:",
+       "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "'''Vaše korisničko ime ili IP adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je slijedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati $1 ili nekog drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke u zahtjevu za deblokadu.",
        "autoblockedtext": "Vaša IP adresa je automatski blokirana jer je korištena od strane drugog korisnika, a blokirao ju je $1.\nNaveden je slijedeći razlog:\n\n:''$2''\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati $1 ili nekog drugog iz grupe [[{{MediaWiki:Grouppage-sysop}}|administratora]] i zahtijevati da Vas deblokira.\n\nZapamtite da ne možete koristiti opciju \"pošalji e-mail ovom korisniku\" sve dok ne unesete validnu e-mail adresu pri registraciji u Vašim [[Special:Preferences|korisničkim postavkama]] te Vas ne spriječava ga je koristite.\n\nVaša trenutna IP adresa je $3, a ID blokade je $5.\nMolimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.",
        "yourdiff": "Razlike / Разлике",
        "copyrightwarning": "Molimo da uzmete u obzir kako se smatra da su svi doprinosi u {{SITENAME}} izdani pod $2 (v. $1 za detalje).\nUkoliko ne želite da vaše pisanje bude nemilosrdno uređivano i redistribuirano po tuđoj volji, onda ga nemojte ovdje objavljivati.<br />\nTakođer obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj domeni ili sličnog slobodnog izvora.\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE!'''",
        "copyrightwarning2": "Zapamtite da svaki doprinos na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promijeniti.",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u registru je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka registra je prikazana ispod kao referenca:",
-       "cascadeprotectedwarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, lančano povezane, zaštićene stranice}}:",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
        "titleprotectedwarning": "'''UPOZORENJE: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.'''\nPosljednja stavka registra je prikazana ispod kao referenca:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} koji su upotrebljeni na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
        "permissionserrors": "Greška pri odobrenju",
        "permissionserrorstext": "Nemate dopuštenje da to uradite, iz {{PLURAL:$1|slijedećeg razloga|slijedećih razloga}}:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2, zbog {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
+       "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je model sadržaja <code>$1</code>, a trenutni model sadržaja stranice je <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Upozorenje: Postavljate stranicu koja je prethodno brisana.'''\n\nRazmotrite da li je nastavljanje uređivanja ove stranice u skladu s pravilima.\nOvdje je naveden registar brisanja i premještanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nRegistar brisanja i premještanja stranice je prikazan ispod kao referenca.",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je izbrisana u prošla 24 sata. \nNiže je navedena evidencija brisanja i premještanja.",
        "log-fulllog": "Vidi potpuni registar",
        "edit-hook-aborted": "Izmjena je poništena putem interfejsa.\nNije ponuđeno nikakvo objašnjenje.",
        "edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
        "edit-conflict": "Sukob izmjena.",
        "edit-no-change": "Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.",
+       "postedit-confirmation-created": "Stranica je stvorena.",
+       "postedit-confirmation-restored": "Stranica je obnovljena.",
        "postedit-confirmation-saved": "Vaša izmjena je snimljena.",
        "edit-already-exists": "Stranica nije mogla biti kreirana.\nIzgleda da već postoji.",
        "defaultmessagetext": "Uobičajeni tekst poruke",
        "content-model-text": "obični tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Prazan objekat",
+       "content-json-empty-array": "Prazan niz",
+       "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] sa više od jedne vrijednosti za parametar \"$3\". Koristit će se samo posljednja navedena vrijednost.",
+       "duplicate-args-category": "Stranice sa istim argumentima kod poziva šablona",
+       "duplicate-args-category-desc": "Stranica sadrži pozive šablona koji koriste argumente dvojnike, kao što su <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ili <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.\n\nTrebalo bi imati manje od $2 {{PLURAL:$2|poziv|poziva}}, a sad ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
        "expensive-parserfunction-category": "Stranice sa previše poziva parserskih funkcija",
        "post-expand-template-inclusion-warning": "'''Upozorenje:''' Šablon koji je uključen je prevelik.\nNeki šabloni neće biti uključeni.",
        "parser-template-recursion-depth-warning": "Dubina uključivanja šablona prekoračena ($1)",
        "language-converter-depth-warning": "Prekoračena granica dubine jezičkog pretvarača ($1)",
        "node-count-exceeded-category": "Stranice sa prekoračenim brojem čvorova",
-       "node-count-exceeded-warning": "Stranica u kojoj je prekoračen broj čvorova",
+       "node-count-exceeded-category-desc": "Stranica je prešla najviši broj čvorova.",
+       "node-count-exceeded-warning": "Stranica je prekoračila broj čvorova",
        "expansion-depth-exceeded-category": "Stranice koje su prekoračile dubinu proširenja",
+       "expansion-depth-exceeded-category-desc": "Stranica je prešla najveću dubinu proširenja.",
        "expansion-depth-exceeded-warning": "Na ovoj stranici dubina proširenja je prevelika",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
        "parser-unstrip-recursion-limit": "Dosegnuto je ograničenje rekurzije ($1)",
        "currentrev": "Trenutna revizija",
        "currentrev-asof": "Trenutna revizija na dan $1",
        "revisionasof": "Izmjena od $1",
-       "revision-info": "Trenutna revizija na dan $1",
+       "revision-info": "Izmjena od $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starija revizija",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
        "history-feed-description": "Historija promjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
+       "history-edit-tags": "Uredi oznake izabranih verzija",
        "rev-deleted-comment": "(komentar uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
-       "rev-deleted-event": "(stavka registra obrisana)",
+       "rev-deleted-event": "(detalji zapisa obrisani)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa uklonjeni - izmjena sakrivena u spisku doprinosa]",
        "rev-deleted-text-permission": "Revizija ove stranice je '''obrisana'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].",
+       "rev-suppressed-text-permission": "Revizija ove stranice je <strong>prekrivena</strong>.\nDetalji se mogu naći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku prekrivanja].",
        "rev-deleted-text-unhide": "Izmhena ove stranice je '''obrisana'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].\nIpak možete [$1 vidjeti ovu izmenu] ako želite nastaviti.",
        "rev-suppressed-text-unhide": "Izmjena ove stranice je '''sakrivena'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registru sakrivanja].\nIpak možete da [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
        "rev-deleted-text-view": "Izmjena ove stranice je '''obrisana'''.\nMožete je pogledati; više detalja možete naći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].",
        "rev-showdeleted": "Pokaži",
        "revisiondelete": "Obriši/vrati revizije",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
-       "revdelete-nooldid-text": "Niste precizno odredili odredišnu reviziju/revizije da se izvrši ova funkcija,\nili ta revizija ne postoji, ili pokušavate sakriti trenutnu reviziju.",
+       "revdelete-nooldid-text": "Niste odredili odredišnu verziju da se izvrši ova funkcija, ili ta verzija ne postoji, ili pokušavate sakriti trenutnu verziju.",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
        "revdelete-text-text": "Izbrisane revizije će se još pojavljivati u historiji stranice, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
        "revdelete-text-file": "Izbrisane verzije datoteke će se još pojavljivati u historiji datoteke, ali dijelovi sadržaja neće biti dostupni javnosti.",
        "logdelete-text": "Izbrisane stavke u registru događaja će se još pojavljivati u registrima, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
-       "revdelete-text-others": "Drugi administratori {{SITENAME}} će još uvijek moći pristupiti skrivenom sadržaju i mogu ga ponovno odbrisati kroz isti interfejs, ukoliko nisu postavljena dodatna ograničenja.",
+       "revdelete-text-others": "Drugi administratori će i dalje moći pristupiti sakrivenom sadržaju i vratiti ga, bez obzira na postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmjena bi se trebalo koristiti <strong>samo</strong> za sljedeće slučajeve:\n* potencijalno klevetničke informacije\n* neprimjerene lične informacije\n*: <em>kućne adrese i telefonski brojevi, matični i lični identifikacijski brojevi itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
        "revdelete-hide-text": "Tekst revizije",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij akciju i cilj",
+       "revdelete-hide-name": "Sakrij cilj i parametre",
        "revdelete-hide-comment": "Opis izmjene",
        "revdelete-hide-user": "Sakrij korisničko ime / IP adresu korisnika koji je uređivao stranicu",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "mergehistory-empty": "Nema revizija za spajanje.",
        "mergehistory-done": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice $1 uspješno spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
+       "mergehistory-fail-toobig": "Ne može se izvršiti spajanje historije jer će se više premjestiti više od ograničenja od $1 {{PLURAL:$1|revizije|revizija}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
        "mergehistory-invalid-source": "Izvorna stranica mora imati valjan naslov.",
        "notextmatches": "Tekst stranice ne odgovara",
        "prevn": "prethodna {{PLURAL:$1|$1}}",
        "nextn": "{{PLURAL:$1|slijedeći $1|slijedećih $1}}",
+       "prev-page": "prethodna stranica",
+       "next-page": "sljedeća stranica",
        "prevn-title": "{{PLURAL:$1|Prethodni $1 rezultat|Prethodna $1 rezultata|Prethodnih $1 rezultata}}",
        "nextn-title": "{{PLURAL:$1|Slijedeći $1 rezultat|Slijedeća $1 rezultata|Slijedećih $1 rezultata}}",
        "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 podkategorija|$2 podkategorije|$2 podkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(sekcija $1)",
+       "search-category": "(kategorija $1)",
        "search-file-match": "(odgovara sadržaju datoteke)",
        "search-suggest": "Da li ste mislili: $1",
+       "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "Rezultati od $1:",
        "search-interwiki-more": "(više)",
        "searchall": "sve",
        "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
+       "search-nonefound-thiswiki": "Nisu pronađeni rezultati koji odgovaraju upitu na ovom sajtu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
        "powersearch-togglelabel": "Označi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
+       "powersearch-remember": "Zapamti izbor za buduće pretrage",
        "search-external": "Vanjska/spoljna pretraga",
        "searchdisabled": "Pretraga teksta na ovoj Wiki je trenutno onemogućena.\nU međuvremenu možete pretraživati preko Googlea.\nUzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.",
        "search-error": "Dogodila se pogreška prilikom pretraživanja: $1",
        "preferences": "Postavke / Подешавања",
        "mypreferences": "Moje postavke / Моја подешавања",
        "prefs-edits": "Broj izmjena:",
-       "prefsnologintext2": "Molimo $1 kako bi promijenili vaše postavke.",
+       "prefsnologintext2": "Molimo Vas prijavite se da biste promijenili postavke.",
        "prefs-skin": "Izgled (skin)",
        "skin-preview": "Pretpregled",
        "datedefault": "Bez preferenci",
        "prefs-personal": "Korisnički profil",
        "prefs-rc": "Podešavanje nedavnih izmjena",
        "prefs-watchlist": "Praćene stranice / Списак надгледања",
+       "prefs-editwatchlist": "Uredi popis praćenja",
+       "prefs-editwatchlist-label": "Uredi unose na popisu praćenja:",
+       "prefs-editwatchlist-edit": "Vidite i uklonite naslove na vašem popisu praćenja",
+       "prefs-editwatchlist-raw": "Uredi grubi popis praćenja",
+       "prefs-editwatchlist-clear": "očisti popis praćenja",
        "prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
        "prefs-watchlist-days-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-token": "Token spiska za praćenje:",
        "prefs-misc": "Razno / Разно",
        "prefs-resetpass": "Promijeni lozinku",
-       "prefs-changeemail": "Promijeni E-mail",
+       "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "E-mail opcije",
        "prefs-rendering": "Izgled",
        "rows": "Redova:",
        "columns": "Kolona:",
        "searchresultshead": "Postavke rezultata pretrage",
-       "stub-threshold": "Formatiranje <a href=\"#\" class=\"stub\">linkova stranica u začetku</a> (bajtova):",
+       "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
+       "stub-threshold-sample-link": "uzorak",
        "stub-threshold-disabled": "Isključen/a",
        "recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
        "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i registre.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
        "savedprefs": "Vaša postavke su snimljene.",
+       "savedrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} su snimljena.",
        "timezonelegend": "Vremenska zona / Временска зона",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Preferiram da se ne odredim",
+       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Postavljanje ove preferencije nije obavezno.\nSoftver koristi ovu vrijednost kako bi vam se obratio i spomenuo vas drugima koristeći vaš gramatički rod.\nOva informacija će biti javna.",
        "email": "E-mail",
-       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.",
+       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-advancedwatchlist": "Napredne opcije",
        "prefs-displayrc": "Postavke displeja",
        "prefs-displaywatchlist": "Postavke prikaza",
+       "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod vaše sljedeće prijave.",
+       "prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: Možete koristi lijevu i desnu navigacijsku tipku kako biste se kretali između tabova u popisu tabova.",
        "email-address-validity-valid": "E-mail adresa izgleda valjano",
        "email-address-validity-invalid": "Unesite valjanu e-mail adresu",
        "userrights-lookup-user": "Menadžment korisničkih prava",
        "userrights-user-editname": "Unesi korisničko ime:",
        "editusergroup": "Menjaj Grupe Korisnika",
-       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
+       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Uredi korisničke grupe",
        "saveusergroups": "Snimi korisničke grupe",
        "userrights-groupsmember": "Član:",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzornici",
+       "group-suppress": "Skrivači",
        "group-all": "(svi)",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica|korisnik}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica|birokrat}}",
-       "group-suppress-member": "{{GENDER:$1|nadzornik|nadzornica|nadzornik}}",
+       "group-suppress-member": "{{GENDER:$1|skrivač|skrivačica}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzornici",
+       "grouppage-suppress": "{{ns:project}}:Skrivač",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
        "right-createpage": "Pravljenje stranica (ne uključujući stranice za razgovor)",
        "right-move": "Preusmjeravanje stranica",
        "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
        "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
+       "right-move-categorypages": "Pomakni stranice kategorije",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
        "right-upload": "Postavljanje datoteka",
        "right-deletedtext": "Pregled obrisanog teksta i izmjena između obrisanih revizija",
        "right-browsearchive": "Pretraživanje obrisanih stranica",
        "right-undelete": "Vraćanje obrisanih stranica",
-       "right-suppressrevision": "Pregled i povratak revizija sakrivenih od administratora",
+       "right-suppressrevision": "Pregled, sakrivanje i povratak određenih revizija stranice od svih korisnika",
+       "right-viewsuppressed": "Pregledaj izmjene skrivene od svih korisnika",
        "right-suppressionlog": "Pregled privatnih evidencija",
        "right-block": "Blokiranje uređivanja drugih korisnika",
        "right-blockemail": "Blokiranje korisnika da šalje e-mail",
        "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
        "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Uređivanje modela sadržaja stranice",
        "right-editinterface": "Uređivanje korisničkog interfejsa",
        "right-editusercssjs": "Uređivanje CSS i JS datoteka drugih korisnika",
        "right-editusercss": "Uređivanje CSS datoteka drugih korisnika",
        "right-override-export-depth": "Izvoz stranica uključujući povezane stranice do dubine od 5 linkova",
        "right-sendemail": "Slanje e-maila drugim korisnicima",
        "right-passwordreset": "Pregled e-maila za obnavljanje lozinke",
+       "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
+       "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
+       "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
        "newuserlogpage": "Registar novih korisnika",
        "newuserlogpagetext": "Ovo je evidencija registracije novih korisnika.",
        "rightslog": "Evidencija korisničkih prava",
        "action-createpage": "stvaranje stranica",
        "action-createtalk": "stvaranje stranica za razgovor",
        "action-createaccount": "stvaranje ovog korisničkog računa",
+       "action-history": "gledate historiju ove stranice",
        "action-minoredit": "označavanje ove izmjene kao manje",
        "action-move": "premještanje ove stranice",
        "action-move-subpages": "premještanje ove stranice, i njenih podstranica",
        "action-move-rootuserpages": "premještanje osnovne stranice korisnika",
+       "action-move-categorypages": "pomakni stranice kategorije",
        "action-movefile": "premjesti ovu datoteku",
        "action-upload": "postavljate ovu datoteku",
        "action-reupload": "postavljanje nove verzije datoteke",
        "action-viewmywatchlist": "pogledajte svoj spisak praćenja",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne informacije",
+       "action-editcontentmodel": "uredi model sadržaja stranice",
+       "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
+       "action-applychangetags": "dodajte oznake uz vaše izmjene",
+       "action-changetags": "dodajte ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
        "nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
-       "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
+       "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
        "rcshowhideminor-show": "Pokaži",
        "rcshowhidemine": "$1 vlastite izmjene / сопствене измене",
        "rcshowhidemine-show": "Pokaži",
        "rcshowhidemine-hide": "Sakrij",
+       "rcshowhidecategorization": "$1 kategorizacija stranice",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Sakrij",
        "rclinks": "Prikaži najskorijih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl-разл",
        "hist": "his-пов",
        "newpageletter": "N/Н",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
-       "rc_categories": "Ograniči na kategorije (razdvojene sa \"|\")",
-       "rc_categories_any": "Sve",
+       "rc_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
+       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "newsectionsummary": "/* $1 */ nova sekcija",
        "rc-enhanced-expand": "Pokaži detalje",
        "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
+       "recentchanges-page-added-to-category": "[[:$1]] pridodano kategoriji",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|pridodana|pridodane}} kategoriji",
+       "recentchanges-page-removed-from-category": "[[:$1]] uklonjeno iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|uklonjena|uklonjenne}} iz kategorije",
+       "autochange-username": "MediaWiki automatska promjena",
        "upload": "Postavi datoteku",
        "uploadbtn": "Postavi datoteku",
        "reuploaddesc": "Vratite se na upitnik za slanje",
        "uploaderror": "Greška pri slanju",
        "upload-recreate-warning": "'''Upozorenje: Datoteka s tim imenom je obrisana ili premještena.'''\n\nZapisnik brisanja i premještanja za ovu stranicu je dostupan ovdje na uvid:",
        "uploadtext": "Koristite formu ispod za postavljanje datoteka.\nDa bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|evidenciji postavljanja]], a brisanja u [[Special:Log/delete|evidenciji brisanja]].\n\nDa bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih načina:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' da upotrijebite potpunu veziju datoteke\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></code>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direkno povezivanje datoteke bez njenog prikazivanja",
-       "upload-permitted": "Podržane vrste datoteka: $1.",
-       "upload-preferred": "Preferirane vrste datoteka: $1.",
-       "upload-prohibited": "Zabranjene vrste datoteka: $1.",
+       "upload-permitted": "{{PLURAL:$2|Podržana vrsta|Podržane vrste}} datoteka: $1.",
+       "upload-preferred": "{{PLURAL:$2|Preferirana vrsta|Preferirane vrste}} datoteka: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Zabranjena vrsta|Zabranjene vrste}} datoteka: $1.",
        "uploadlogpage": "Registar postavljanja",
        "uploadlogpagetext": "Ispod je popis najnovijih postavljanja datoteka.\nVidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.",
        "filename": "Ime fajla / Име датотеке",
        "largefileserver": "Ova datoteka je veća nego što server dopušta.",
        "emptyfile": "Datoteka koju ste poslali je prazna. \nOvo je moguće zbog greške u imenu datoteke. \nMolimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.",
        "windows-nonascii-filename": "Ova wiki ne podržava imena datoteka sa posebnim znacima.",
-       "fileexists": "Datoteka sa ovim imenom već postoji.\nMolimo Vas da provjerite <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promjenite.\n[[$1|thumb]]",
+       "fileexists": "Datoteka sa ovim imenom već postoji, molimo Vas provjerite <strong>[[:$1]]</strong> ako {{GENDER:|niste}} sigurni da je želite promjeniti.\n[[$1|thumb]]",
        "filepageexists": "Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.\nSažetak koji ste naveli neće se pojaviti na stranici opisa.\nDa bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nMolimo Vas da izaberete drugačiji naziv.",
+       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nDa li možda želite koristiti drugačiji naziv?",
        "fileexists-thumbnail-yes": "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[$1|thumb]]\nMolimo provjerite datoteku <strong>[[:$1]]</strong>.\nAko je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
        "file-thumbnail-no": "Naziv datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.\nAko imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
        "fileexists-forbidden": "Datoteka sa ovim imenom već postoji i ne može biti presnimljena.\nAko i dalje želite da postavite ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. \nMolimo provjerite postavku za postavljanje datoteka.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
+       "upload-scripted-pi-callback": "Datoteka koja sadrži instrukcije za obradu XML stilskog oblika se ne može postaviti.",
+       "uploaded-script-svg": "Pronađen skriptni element \"$1\" u postavljenoj SVG datoteci.",
+       "uploaded-hostile-svg": "Pronađen nesiguran CSS u stilskom elementu postavljene SVG datoteke.",
+       "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontroliraju događaje <code>$1=\"$2\"</code> u SVG datotekama.",
+       "uploaded-href-attribute-svg": "href atributi <code>&lt;$1 $2=\"$3\"&gt;</code> sa nelokalnom metom (npr. http://, javascript:, etc) nisu dozvoljeni u SVG datotekama.",
+       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnom metom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-animate-svg": "Pronađena \"animate\" oznaka koja možda mijenja href koristeći se \"from\" atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-event-handler-svg": "Postavljanje kontrole događaja je blokirano, pronađeno <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-href-svg": "Blokirano je korištenje \"set\" oznake kako bi se dodao \"href\" atribut glavnom elementu.",
+       "uploaded-wrong-setting-svg": "Blokirano je korištenje oznake \"set\" kako bi se dodao atribut udaljenoj/podatkovnoj/skriptnoj meti. Pronađeno <code>&lt;set to=\"$1\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
        "uploadinvalidxml": "XML u postavljenoj datoteci nije mogao biti parsiran.",
        "uploadvirus": "Fajl sadrži virus!  Detalji:  $1",
        "upload-options": "Opcije postavljanja",
        "watchthisupload": "Prati ovu datoteku",
        "filewasdeleted": "Datoteka s ovim nazivom je ranije postavljana i nakon toga obrisana.\nPrije nego što nastavite da je ponovno postavite trebate provjeriti $1.",
+       "filename-thumb-name": "Ovo izgleda kao thumbnail naslov. Molimo ne postavljate thumbnaile natrag na istu wiki. Ukoliko je riječ o nečemu drugome, molimo popravite ime datoteke tako da ima više značenja i nema thumbnail prefiks.",
        "filename-bad-prefix": "Naziv datoteke koju postavljate počinje sa '''\"$1\"''', što je naziv koji obično automatski dodjeljuju digitalni fotoaparati i kamere.\nMolimo Vas da odaberete naziv datoteke koji opisuje njen sadržaj.",
        "upload-success-subj": "Uspješno slanje",
        "upload-success-msg": "Vaša datoteka iz [$2] je uspješno postavljena. Dostupna je ovdje: [[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
        "upload-http-error": "Desila se HTTP greška: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljanja nisu dostupni na ovom domenu.",
+       "upload-dialog-title": "Postavi datoteku",
+       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-done": "Urađeno",
+       "upload-dialog-button-save": "Snimi",
+       "upload-dialog-button-upload": "Postavi",
+       "upload-form-label-select-file": "Izaberi datoteku",
+       "upload-form-label-infoform-title": "Detalji",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korištenje",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "Ovo je moje djelo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potvrđujem kako postavljam ovu datoteku u skladu sa uvjetima korištenja i politikom licenciranja na {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Ukoliko niste u stanju postaviti ovu datoteku pod politikom {{SITENAME}}, molimo zatvorite ovaj dijalog i pokušajte drugom metodom.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Također možete pokušati [[Special:Upload|na standarnoj stranici za postavljanje]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Razumijem kako postavljam ovu datoteku na dijeljeno skladište. Potvrđujem kako to činim u skladu sa uvjetima korištenja i ovdašnjom politikom licenciranja.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Ukoliko niste u stanju postaviti ovu datoteku pod politikom dijeljene ostave, molimo zatvorite ovaj dijalog i pokušajte drugu metodu.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Možete također pokušati koristeći  [[Special:Upload|stranicu za postavljanje na  {{SITENAME}}]], ukoliko se ova datoteka može postaviti pod tamošnjom politikom.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava za ovu datoteku i slažem se da ću je neopozivo postaviti na Wikimedia Commons pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], te se slažem s [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjetima korištenja].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku ili je želite postaviti pod drugom licencom, imajte na umu da možete koristiti [https://commons.wikimedia.org/wiki/Special:UploadWizard čarobnjak za postavljanje datoteka na Commonsu].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na projektu {{SITENAME}}]] ako politika stranice dozvoljava postavljanje ove datoteke.",
        "backend-fail-stream": "Ne mogu da emitujem datoteku $1.",
        "backend-fail-backup": "Ne mogu da napravim rezervu datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "license": "Licenca - Лиценца",
        "license-header": "Licenciranje",
        "nolicense": "Ništa nije odabrano",
+       "licenses-edit": "Uredi izbor licenci",
        "license-nopreview": "(Pregled nije dostupan)",
-       "upload_source_url": "(valjani, javno dostupni URL)",
-       "upload_source_file": "(datoteka na Vašem kompjuteru)",
+       "upload_source_url": "(vaša izabrana datoteka od validnih, javno dostupnih URL-a)",
+       "upload_source_file": "(vaša odabrana datoteka sa Vašeg računara)",
+       "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži ime medija:",
+       "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
        "listfiles_thumb": "Smanjeni pregled",
        "filedelete-maintenance": "Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.",
        "filedelete-maintenance-title": "Ne mogu obrisati datoteku",
        "mimesearch": "MIME pretraga",
-       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/podvrsta, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/subvrsta ili vrstasadržaja/*, npr. <code>image/jpeg</code>.",
        "mimetype": "MIME tip:",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "randomincategory": "Slučajna stranica u kategoriji",
        "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Slučajna stranica u kategoriji",
+       "randomincategory-submit": "Idi",
        "randomredirect": "Slučajno preusmjerenje / Случајно преусмјерење",
        "randomredirect-nopages": "Nema preusmjerenja u imenskom prostoru \"$1\".",
        "statistics": "Statistike / Статистике",
        "unusedimages": "Neiskorišćene slike / Неискоришћене слике",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice / Тражене странице",
+       "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza ka njima. Na spisku se ne nalaze stranice do kojih vode preusmjerenja. Za spisak nepostojećih stranica na koje su povezana preumsjerenja, pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
        "wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].",
+       "wantedfiletext-cat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje. Dodatno, stranice koje ugrađuju datoteke koje ne postoje prikazane su u [[:$1]].",
        "wantedfiletext-nocat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska.",
+       "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
        "wantedtemplates": "Potrebni šabloni",
        "mostlinked": "Najviše povezanih sa člancima / Највише повезаних са чланцима",
        "mostlinkedcategories": "Najviše povezanih sa kategorijama / Највише повезаних са категоријама",
-       "mostlinkedtemplates": "Šabloni sa najviše linkova",
+       "mostlinkedtemplates": "Stranice s najviše veza",
        "mostcategories": "Stranice sa najviše kategorija",
        "mostimages": "Najviše povezanih sa slikama / Највише повезаних са сликама",
        "mostinterwikis": "Stranice s najviše međuwiki poveznica",
        "protectedpages-unknown-timestamp": "Nepoznato",
        "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
+       "protectedtitles-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih naslova. Za spisak trenutno zaštićenih stranica vidi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nema naslova zaštićenih članaka sa ovim parametrima.",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
+       "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "usercreated": "{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2",
        "newpages": "Nove stranice / Нове странице",
        "nopagetext": "Ciljna stranica koju ste naveli ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|novija 1|novije $1}}",
        "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
-       "suppress": "Nazdor",
+       "suppress": "Sakrij",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
+       "apihelp": "API pomoć",
+       "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
+       "booksources-search": "Traži",
        "booksources-text": "Ispod se nalazi spisak vanjskih linkova na ostale stranice koje prodaju nove ili korištene knjige kao i stranice koje mogu da imaju važnije podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
-       "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
+       "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Evidencije",
        "all-logs-page": "Sve evidencije - Све евиденције",
        "alllogstext": "Zajednički prikaz svih dostupnih evidencija sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
        "logempty": "Ne postoji takav zapis.",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise u evidenciji",
+       "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "allpages": "Sve stranice / Све странице",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "activeusers-noresult": "Nije pronađen korisnik.",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pravima pristupa.\nO svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
+       "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Prava",
        "listgrouprights-helppage": "Help:Grupna prava",
        "listgrouprights-removegroup-self": "Može ukloniti {{PLURAL:$2|grupu|grupe|grupa}} sa svog računa: $1",
        "listgrouprights-addgroup-self-all": "Može dodati sve grupe na svoj račun",
        "listgrouprights-removegroup-self-all": "Može ukloniti sve grupe sa svog računa",
+       "listgrouprights-namespaceprotection-header": "Ograničenja imenskog prostora",
+       "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
+       "trackingcategories": "Praćenje kategorija",
+       "trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
+       "trackingcategories-msg": "Praćenje kategorije",
+       "trackingcategories-name": "Ime poruke",
+       "trackingcategories-desc": "Kriterij uključenja kategorije",
+       "noindex-category-desc": "Roboti ne indeksiraju stranicu jer u sebi ima magičnu riječ <code><nowiki>__NOINDEX__</nowiki></code>, te je u imenskom prostoru u kome ta oznaka nije dozvoljena.",
+       "index-category-desc": "Stranica ima u sebi <code><nowiki>__INDEX__</nowiki></code> (te se nalazi u imenskom prostoru gdje je ta oznaka dozvoljena) pa je, samim tim, roboti indeksiraju.",
+       "post-expand-template-inclusion-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja svih šablona, te zbog toga neki šabloni nisu prošireni.",
+       "post-expand-template-argument-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja defincije šablona (nešto što je u trima vitičastim zagradama, poput <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Stranica koristi previše ekspenzivnih parserskih funkcija (poput <code>#ifexist</code>). Pogledajte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Stranica sadrži pokvareni link ka datoteci (link koji se nadovezuje na nepostojeću datoteku).",
+       "hidden-category-category-desc": "Kategorija u sebi sadrži <code><nowiki>__HIDDENCAT__</nowiki></code> te se samim tim ne prikazuju u odjeljku za kategoriju na stranicama.",
+       "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.",
        "emailuser": "Pošalji E-mail ovom korisniku",
        "emailccsubject": "Kopiranje Vaše poruke za $1: $2",
        "emailsent": "E-mail poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"Pošalji e-mail korisniku\" sa {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja / Списак праћења",
        "mywatchlist": "Moj popis praćenja / Списак надгледања",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.",
+       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste logovani / Нисте логовани",
        "addwatch": "Dodaj u popis praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
+       "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].",
+       "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.",
        "removewatch": "Ukloni sa spiska praćenja",
-       "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena s [[Special:Watchlist|vaše liste praćenja]].",
+       "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
+       "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
        "watch": "Prati / Прати",
        "watchthispage": "Prati / Прати",
        "unwatch": "Prekini praćenje",
        "unwatchthispage": "Ukinite praćenje",
        "notanarticle": "Nije članak",
        "notvisiblerev": "Posljednja izmjena drugog korisnika je bila izbrisana",
-       "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
+       "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
-       "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su posljednje '''$1''' izmjene|je posljednjih '''$1''' izmjena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zaključno sa $3, $4.",
+       "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-options": "Opcije liste praćenja",
        "watching": "Pratim... / Додавање на списак надгледања...",
        "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
        "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
        "enotif_anon_editor": "anonimni korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu.\nTakođer možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\n             Vaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osim ako prijavljeni ponovno posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki email obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "Napravljen - Направљен",
        "changed": "promijenjena",
        "deletepage": "Izbrišite stranicu",
        "confirm": "Potvrdi / Потврди",
        "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1', a jedini urednik '[[Special:Contributions/$2|$2]]'",
+       "excontentauthor": "sadržaj je bio: „$1“, a jedini urednik [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
+       "historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu sa svom njenom historijom.\nMolimo da potvrdite da ćete to učiniti, da razumijete posljedice te da to činite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Akcija završena\n\nАкција завршена",
        "actionfailed": "Akcija nije uspjela",
        "deletecomment": "Razlog:",
        "deleteotherreason": "Ostali/dodatni razlog/zi:",
        "deletereasonotherlist": "Ostali razlog/zi",
-       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Zahtjev autora\n** Kršenje autorskih prava\n** Vandalizam",
+       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Spam\n** Vandalizam\n** Kršenje autorskih prava\n** Zahtjev autora\n** Pokvareno preusmjerenje",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "delete-toobig": "Ova stranica ima veliku historiju promjena, preko $1 {{PLURAL:$1|revizije|revizija}}.\nBrisanje takvih stranica nije dopušteno da bi se spriječilo slučajno preopterećenje servera na kojem je {{SITENAME}}.",
        "delete-warning-toobig": "Ova stranica ima veliku historiju izmjena, preko $1 {{PLURAL:$1|izmjene|izmjena}}.\nNjeno brisanje može dovesti do opterećenja operacione baze na {{SITENAME}};\nnastavite s oprezom.",
+       "deleteprotected": "Ne možete obrisati ovu stranicu jer je zaštićena.",
+       "deleting-backlinks-warning": "'''Upozorenje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge stranice]] sadrže link ili vode na stranicu koju brišete.",
        "rollback": "Vrati izmjene",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}",
        "alreadyrolled": "Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmjenio ili vratio članak.\n\nPosljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak izmjene je bio: \"''$1''\".",
        "revertpage": "Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]",
-       "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju koju je načinio [[User:$1|$1]]",
+       "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
        "rollback-success": "Vraćene su izmjene korisnika $1;\nvraćeno na posljednju verziju koju je snimio $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
+       "changecontentmodel": "Promijeni model sadržaja stranice",
+       "changecontentmodel-legend": "Promijeni model sadržaja",
+       "changecontentmodel-title-label": "Naslov stranice",
+       "changecontentmodel-model-label": "Novi model sadržaja",
+       "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-success-title": "Model sadržaja je promijenjen",
+       "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promijenjen.",
+       "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
+       "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
+       "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
+       "logentry-contentmodel-change-revertlink": "vrati",
+       "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Evidencija zaštite",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
        "protectedarticle": "\"[[$1]]\" zaštićeno",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite se ne mogu mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' je:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
-       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu (kaskadnu) zaštitu.\nMožete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.",
+       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju}} uključenu prenosivu zaštitu.\nPromjene stepena zaštite ove stranice neće utjecati na prenosnu zaštitu.",
        "protect-default": "Dozvoli svim korisnicima",
        "protect-fallback": "Dopušteno samo korisnicima s dozvolom \"$1\"",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-othertime": "Ostali period:",
        "protect-othertime-op": "ostali period",
        "protect-existing-expiry": "Postojeće vrijeme isticanja: $3, $2",
+       "protect-existing-expiry-infinity": "Postojeće vrijeme isteka: trajno",
        "protect-otherreason": "Ostali/dodatni razlog/zi:",
        "protect-otherreason-op": "Ostali razlozi",
        "protect-dropdown": "*Uobičajeni razlozi zaštite\n** Prekomjerni vandalizam\n** Prekomjerno spamovanje\n** Kontraproduktivni uređivački rat\n** Stranica velikog prometa",
        "undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
        "undelete-fieldset-title": "Vraćanje revizija",
        "undeleteextrahelp": "Da vratite cijelu historiju članka, ostavite sve kutijice neoznačene i kliknite '''''{{int:undeletebtn}}'''''.\nDa bi izvršili selektivno vraćanje, odaberite kutijice koje odgovaraju revizijama koje želite vratiti, i kliknite '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|$1 revizija arhivirana|$1 revizije arhivirane|$1 revizija arhivirano}}",
+       "undeleterevisions": "{{PLURAL:$2|izmjena|$2 izmjena}} {{PLURAL|izbrisana|izbrisane|izbrisano}}",
        "undeletehistory": "Ako vratite stranicu, sve revizije će biti vraćene njenoj historiji.\nAko je nova stranica istog imena napravljena od brisanja, vraćene revizije će se pojaviti u njenoj ranijoj historiji.",
        "undeleterevdel": "Vraćanje obrisanog se neće izvršiti ako bi rezultiralo da zaglavlje stranice ili revizija datoteke bude djelimično obrisano.\nU takvim slučajevima, morate ukloniti označene ili otkriti sakrivene najskorije obrisane revizije.",
        "undeletehistorynoadmin": "Ova stranica je izbrisana.  \nRazlog za brisanje se nalazi ispod u sažetku, zajedno sa detaljima korisnika koji su uređivali ovu stranicu prije brisanja.  \nTekst izbrisane stranice je vidljiv samo administratorima.",
        "undeletedrevisions": "{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno",
        "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
-       "cannotundelete": "Vraćanje nije uspelo; moguće je da je neko drugi vratio stranu pre vas.",
+       "cannotundelete": "Vraćanje nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nProvjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
        "undelete-header": "Pogledajte [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "namespace": "Imenski prostor - Именски простор:",
        "invert": "Sve osim odabranog",
        "tooltip-invert": "Označite ovu kutiju za sakrivanje promjena na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima ako je označeno)",
+       "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
        "blanknamespace": "(Glavno)",
-       "contributions": "Doprinosi korisnika / Доприноси корисника",
+       "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Korisnički doprinosi od $1",
        "mycontris": "Doprinosi / Доприноси",
-       "contribsub2": "Za $1 ($2)",
+       "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
        "uctop": "(trenutno)",
        "month": "Od mjeseca (i ranije):",
        "sp-contributions-newbies-sub": "Prikaži samo doprinose novih korisnika",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
        "sp-contributions-blocklog": "registar blokiranja",
+       "sp-contributions-suppresslog": "obrisani doprinosi korisnika",
        "sp-contributions-deleted": "obrisani doprinosi korisnika",
        "sp-contributions-uploads": "postavljanja",
        "sp-contributions-logs": "registri",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Prikaži samo izmjene koje su posljednje revizije",
+       "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Što vodi ovdje / Шта води овде",
        "whatlinkshere-title": "Stranice koje vode / Странице које воде до $1",
        "autoblockid": "Automatska blokada #$1",
        "block": "Blokiraj korisnika",
        "unblock": "Odblokiraj korisnika",
-       "blockip": "Blokiraj korisnika",
+       "blockip": "Blokiraj {{GENDER:$1|korisnika|korisnicu}}",
        "blockip-legend": "Blokiranje korisnika",
        "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  \nOvo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. \nUnesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su vandalizovane).",
        "ipaddressorusername": "IP adresa ili korisničko ime:",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nBlokiranja možete da pogledate [[Special:BlockList|ovde]].",
        "ipb-blockingself": "Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?",
        "ipb-confirmhideuser": "Upravo ćete blokirati korisnika sa uključenom opcijom ''sakrij korisnika''. Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Da li ste sigurni da to želite?",
+       "ipb-confirmaction": "Ako ste sigurni da želite nastaviti, kliknite na \"{{int:ipb-confirm}}\" polje na dnu stranice.",
        "ipb-edit-dropdown": "Uredi razloge blokiranja",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Vidi postojeće blokade",
-       "ipb-blocklist-contribs": "Doprinosi za $1",
+       "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
        "unblockip": "Odblokiraj korisnika / Одблокирај корисника",
        "unblockiptext": "Upotrebite donji upitnik da bi ste vratili pravo pisanja ranije blokiranoj IP adresi ili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocked": "[[User:$1|$1]] je deblokiran",
        "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blokada ID oznake $1 je uklonjena",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.",
        "ipb_expiry_invalid": "Nevaljano vrijeme trajanja.",
        "ipb_expiry_temp": "Sakrivene blokade korisničkih imena moraju biti stalne.",
-       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; možda ima isuviše izmjena.",
+       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; on ima više od {{PLURAL:$1|jedne izmjene|$1 izmjena}}.",
        "ipb_already_blocked": "\"$1\" je već blokiran",
        "ipb-needreblock": "$1 je već blokiran. \nDa li želite promijeniti postavke?",
        "ipb-otherblocks-header": "Ostale {{PLURAL:$1|blokada|blokade}}",
        "move-page-legend": "Premjestite stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmjeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;\nMolimo dobro razmislite prije nego što preimenujete stranicu.",
        "movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
-       "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''\n*Neprazna stranica za razgovor već postoji pod novim imenom, ili\n*Odznačite donju kutiju.\n\nU tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
+       "movepagetalktext": "Ako označite ovu kutijucu, pridružena stranica za razgovor će se automatski premjestiti na novi naslov, ukoliko ne-prazna stranica razgovor sa istim imenom već postoji. U tom slučaju ćete morati, ako želite, ručno premjestiti ili spojiti stranicu.",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
+       "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
        "movenologintext": "Morate se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještate datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (osim podstranica).",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
-       "newtitle": "Novi naziv - Нови назив",
+       "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
+       "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
+       "newtitle": "Novi naslov:",
        "move-watch": "Prati ovu stranicu - Прати ову страницу",
        "movepagebtn": "Premjesti stranicu – Премјести страницу",
        "pagemovedsub": "Premještanje uspjelo",
        "thumbnail-temp-create": "Ne mogu da napravim privremenu smanjenu sliku",
        "thumbnail-dest-create": "Spremanje smanjene slike (\"thumbnail\") na ponuđeno odredište nije moguće.",
        "thumbnail_invalid_params": "Pogrešne postavke smanjenog prikaza",
+       "thumbnail_toobigimagearea": "Datoteka sa dimenzijama većim od $1",
        "thumbnail_dest_directory": "Ne može se napraviti odredišni folder",
        "thumbnail_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Čini se da datoteka nedostaje: $1",
+       "thumbnail_image-failure-limit": "Bilo je previše nedavnih greška ($1 ili više) pri pravljenju umanjene slike. Ponovo pokušajte kasnije.",
        "import": "Uvoz stranica",
-       "importinterwiki": "Transwiki uvoz",
-       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi revizije i imena urednika će biti sačuvana.\nSve akcije vezane uz transwiki uvoz su zabilježene u [[Special:Log/import|registru uvoza]].",
+       "importinterwiki": "Uvezeno sa druge wiki",
+       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi i imena autora verzija će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisniku uvoza]].",
+       "import-interwiki-sourcewiki": "Izvorna wiki:",
+       "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi - Увези",
        "tooltip-pt-mycontris": "Spisak vaših doprinosa",
        "tooltip-pt-login": "Predlažem da se prijavite; međutim, to nije obavezno",
        "tooltip-pt-logout": "Odjava sa projekta {{SITENAME}}",
+       "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite račun i prijavite se; to, međutim, nije obavezno",
        "tooltip-ca-talk": "Razgovor o sadržaju stranice",
-       "tooltip-ca-edit": "Možete da uređujete ovu stranicu.\nMolimo da prije snimanja koristite dugme za pretpregled",
+       "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Započnite novu sekciju.",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena.\nMožete vidjeti njen izvor",
        "tooltip-ca-history": "Prethodne verzije ove stranice",
        "tooltip-ca-nstab-main": "Pogledajte sadržaj stranice",
        "tooltip-ca-nstab-user": "Pogledajte korisničku stranicu",
        "tooltip-ca-nstab-media": "Pogledajte medijski fajl",
-       "tooltip-ca-nstab-special": "Ovo je posebna stranica, te je ne možete uređivati",
+       "tooltip-ca-nstab-special": "Ovo je posebna stranica, te se ne može zasebno uređivati",
        "tooltip-ca-nstab-project": "Pogledajte stranicu projekta",
        "tooltip-ca-nstab-image": "Vidi stranicu datoteke/fajla",
        "tooltip-ca-nstab-mediawiki": "Pogledajte sistemsku poruku",
        "spam_reverting": "Vraćanje na zadnju verziju koja ne sadrži linkove ka $1",
        "spam_blanking": "Sve revizije koje sadrže linkove ka $1, očisti",
        "spam_deleting": "Sve izmene sadrže veze do $1. Brišem",
+       "simpleantispam-label": "Provjera protiv spama.\n<strong>NE</strong> popunjavajte ovo!",
        "pageinfo-title": "Informacije za \"$1\"",
        "pageinfo-not-current": "Na žalost, nemoguće je pribaviti ove podatke za starije izmjene.",
        "pageinfo-header-basic": "Osnovne informacije",
        "svg-long-desc": "SVG fajl, nominalno $1 × $2 piksela, veličina fajla: $3",
        "svg-long-desc-animated": "Animirana SVG datoteka, nominalno: $1 × $2 piksela, veličina: $3",
        "svg-long-error": "Nevaljana SVG datoteka: $1",
-       "show-big-image": "Puna rezolucija",
+       "show-big-image": "Izvorna datoteka",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Druge rezolucije}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|je automatski unaprijeđen|je automatski unaprijeđena}} iz $4 u $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|postavio|postavila}} je $3",
        "rightsnone": "(nema)",
        "revdelete-summary": "sažetak izmjene",
        "feedback-adding": "Dodajem povratne informacije na stranicu...",
index 591061c..3dcd90b 100644 (file)
@@ -30,7 +30,8 @@
                        "Thirsty",
                        "Macofe",
                        "Roonyh",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "SusithCM"
                ]
        },
        "tog-underline": "සබැඳි යටීර කිරීම:",
index 0b00bdc..51d00dc 100644 (file)
@@ -18,6 +18,7 @@
        "tog-hideminor": "Skrij manjše popravke v zadnjih spremembah",
        "tog-hidepatrolled": "Skrij pregledana urejanja v zadnjih spremembah",
        "tog-newpageshidepatrolled": "Skrij pregledane strani iz seznama novih strani",
+       "tog-hidecategorization": "Skrij kategorizacijo strani",
        "tog-extendwatchlist": "Razširi spisek nadzorov, da bo prikazoval vse spremembe, ne le najnovejše",
        "tog-usenewrc": "Združi spremembe posamezne strani na zadnjih spremembah in spisku nadzorov",
        "tog-numberheadings": "Samodejno številči poglavja",
@@ -47,6 +48,7 @@
        "tog-watchlisthideliu": "Na spisku nadzorov skrij urejanja prijavljenih uporabnikov",
        "tog-watchlisthideanons": "Na spisku nadzorov skrij urejanja anonimnih uporabnikov",
        "tog-watchlisthidepatrolled": "Na spisku nadzorov skrij pregledana urejanja",
+       "tog-watchlisthidecategorization": "Skrij kategorizacijo strani",
        "tog-ccmeonemails": "Pošlji mi kopijo e-pošt, ki jih pošljem drugim uporabnikom",
        "tog-diffonly": "Pod primerjavo ne prikaži vsebine strani",
        "tog-showhiddencats": "Prikaži skrite kategorije",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zakaj ustvarjate drug račun",
-       "createacct-captcha": "Varnostno preverjanje",
-       "createacct-imgcaptcha-ph": "Vnesite zgornje besedilo",
        "createacct-submit": "Ustvarite svoj račun",
        "createacct-another-submit": "Ustvarite račun",
        "createacct-benefit-heading": "{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.",
        "permissionserrors": "Napaka dovoljenja",
        "permissionserrorstext": "Za izvedbo dejanja nimate dovoljenja zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov}}:",
        "permissionserrorstext-withaction": "Za $2 zaradi {{PLURAL:$1|naslednjega razloga|naslednjih razlogov}} nimate dovoljenja:",
+       "contentmodelediterror": "Redakcije ne morete urejati, ker je njen vsebinski model <code>$1</code>, trenutni vsebinski model strani pa je <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Opozorilo: Pišete stran, ki je bila nekoč že izbrisana.'''\n\nPremislite preden nadaljujete s pisanjem, morda bo stran zaradi istih razlogov ponovno odstranjena.\nSpodaj je prikazan dnevnik brisanja in prestavljanja:",
        "moveddeleted-notice": "Stran je bila izbrisana.\nSpodaj sta za sklicevanje na razpolago dnevnik brisanja in dnevnik prestavljanja strani.",
        "moveddeleted-notice-recent": "Oprostite, stran je bila nedavno izbrisana (v zadnjih 24 urah).\nDnevnik brisanja in prestavljanj strani je naveden spodaj.",
        "showingresultsinrange": "Spodaj prikazujem {{PLURAL:$1|1=<strong>1</strong> rezultat|<strong>$1</strong> rezultata|<strong>$1</strong> rezultate|<strong>$1</strong> rezultatov}} v razponu od št. <strong>$2</strong> do št. <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1–$2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Ni bilo zadetkov, ki ustrezajo poizvedbi.",
+       "search-nonefound-thiswiki": "Našli nismo nobenega rezultata, ki bi se ujemal s poizvedbo na tej strani.",
        "powersearch-legend": "Napredno iskanje",
        "powersearch-ns": "Iskanje v imenskih prostorih:",
        "powersearch-togglelabel": "Izberi:",
        "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.",
        "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].",
        "savedprefs": "Spremembe smo uspešno shranili.",
+       "savedrights": "Uporabniške pravice {{GENDER:$1|$1}} smo shranili.",
        "timezonelegend": "Časovni pas",
        "localtime": "Krajevni čas:",
        "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)",
        "rcshowhidemine": "$1 moja urejanja",
        "rcshowhidemine-show": "Prikaži",
        "rcshowhidemine-hide": "Skrij",
+       "rcshowhidecategorization": "$1 kategorizacijo strani",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Skrij",
        "rclinks": "Prikaži zadnjih $1 sprememb v zadnjih $2 dneh<br />$3",
        "diff": "prim",
        "hist": "zgod",
        "upload-dialog-button-done": "Končano",
        "upload-dialog-button-save": "Shrani",
        "upload-dialog-button-upload": "Naloži",
-       "upload-process-error": "Prišlo je do napake",
-       "upload-process-warning": "Pojavilo se je opozorilo",
        "upload-form-label-select-file": "Izberi datoteko",
        "upload-form-label-infoform-title": "Podrobnosti",
        "upload-form-label-infoform-name": "Ime",
index 874b020..5b7aaf8 100644 (file)
@@ -38,6 +38,7 @@
        "tog-hideminor": "Fshih redaktimet e vogla nga ndryshimet e fundit",
        "tog-hidepatrolled": "Fshih redaktimet e paturlluara nga ndryshimet e fundit",
        "tog-newpageshidepatrolled": "Fshih faqet e patrulluara nga lista e faqeve të reja",
+       "tog-hidecategorization": "Fshih kategorizimin e faqeve",
        "tog-extendwatchlist": "Zgjero listën e faqeve të vëzhguara që t'i tregojë të gjitha ndryshimet, jo vetëm më të fundit.",
        "tog-usenewrc": "Grupo ndryshimet sipas faqeve në ndryshime së fundmi dhe listën mbikqyrëse (kërkon JavaScript)",
        "tog-numberheadings": "Numëro automatikish titujt",
@@ -67,6 +68,7 @@
        "tog-watchlisthideliu": "Fshih redaktimet e përdoruesve nga lista e faqeve të vëzhguara",
        "tog-watchlisthideanons": "Fshih redaktimet përdoruesve anonim nga lista e faqeve të vëzhguara",
        "tog-watchlisthidepatrolled": "Fshih redaktimet e vrojtuara nga lista e faqeve të vëzhguara",
+       "tog-watchlisthidecategorization": "Fshih kategorizimin e faqeve",
        "tog-ccmeonemails": "Më dërgo kopje të mesazheve që u dërgoj të tjerëve",
        "tog-diffonly": "Mos trego përmbajtjen e faqes nën diff-e",
        "tog-showhiddencats": "Trego kategoritë e fshehura",
        "createaccountreason": "Arsyeja:",
        "createacct-reason": "Arsyeja",
        "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
-       "createacct-captcha": "kontroll sigurie",
-       "createacct-imgcaptcha-ph": "Shkruaj tekstin që ju shihni më lartë",
        "createacct-submit": "Krijoni llogarinë tuaj",
        "createacct-another-submit": "Krijo një llogari",
        "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
        "passwordreset-emailtext-ip": "Dikush (ndoshta ju, nga IP adresa $1) kërkoi një kujtesë për \ndetajet e llogarisë suaj {{SITENAME}} ($4).Përdoruesi në vijim {{PLURAL:$3|llogari është|llogaritë janë}} të lidhur me këtë postë elektronike:\n\n$2\n\n{{PLURAL:$3|Ky fjalëkalim i përkohshëm|Këto fjalëkalime të përkohshme}} do të përfundojë për {{PLURAL:$5|një ditë|$5 ditë}}.\n\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "passwordreset-emailtext-user": "Përdoruesi  $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL:$3 | llogaria është | llogaritë janë}} të lidhur me këtë postë elektronike: \n\n$2\n\n{{PLURAL:$3 | Ky fjalëkalim i përkohshëm | Këto fjalëkalime të përkohshme}} do të përfundojë në {{PLURAL:$5 | një ditë | $5 ditë}}.\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "passwordreset-emailelement": "Emri i përdoruesit: \n$1\n\nFjalëkalimi i përkohshëm: \n$2",
-       "passwordreset-emailsent": "Një email për rivendosjen e fjalëkalimit është dërguar.",
+       "passwordreset-emailsent": "Nëse ky është një email adresë e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
        "passwordreset-emailsent-capture": "Një email për rivendosjen e fjalëkalimit është dërguar, i cili tregohet më poshtë.",
        "passwordreset-emailerror-capture": "U dërgua një e-mail kujtesë, i cili tregohet më poshtë, por dërgesa për tek përdoruesi qe e pamundur: $1",
-       "changeemail": "Ndrysho postën elektronike",
+       "changeemail": "Ndrysho ose hiq postën elektronike",
        "changeemail-header": "Ndrysho llogarinë e adresës së postës elektronike",
        "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.",
        "changeemail-oldemail": "Adresa aktuale e emailit:",
        "clearyourcache": "''Shënim:''' Pas ruajtjes, juve mund t'iu duhet të anashkaloni \"cache-in\" e shfletuesit tuaj për të parë ndryshimet. \n* '''Firefox / Safari:''' Mbaj të shtypur ''Shift'' ndërkohë që klikon ''Reload'', ose shtyp ''Ctrl-F5'' ose ''Ctrl-R'' (''⌘-R'' në Mac)\n* '''Google Chrome:''' Shtyp ''Ctrl-Shift-R'' (''''⌘-R'''' në Mac)\n* '''Internet Explorer:''' Mbaj të shtypur ''Ctrl''  ndërkohë që klikon ''Refresh'', ose shtyp ''Ctrl-F5''\n* '''Konqueror:''' Kliko ''Reload'' ose shtyp ''F5''\n* '''Opera:''' Zbrazni \"cache-in\" tek ''Tools → Preferences''",
        "usercssyoucanpreview": "'''Këshillë:''' Përdorni butonin '{{int:showpreview}}' për të testuar CSS-në e re para se të ruani ndryshimet e kryera.",
        "userjsyoucanpreview": "'''Këshillë:''' Përdorni butonin '{{int:showpreview}}' për të testuar JavaScripting e ri para se të ruani ndryshimet e kryera.",
-       "usercsspreview": "'''Vini re! Ju jeni duke inspektuar CSS-në si përdorues!'''\n'''Nuk është ruajtur ende!'''",
+       "usercsspreview": "<strong>Vini re! Ju jeni duke inspektuar CSS-në si përdorues!\nNuk është ruajtur ende!</strong>",
        "userjspreview": "'''Vini re se kjo është vetëm një provë ose parapamje e faqes tuaj JavaScript, ajo nuk është ruajtur akoma!'''",
-       "sitecsspreview": "'''Vini re! Ju jeni duke inspektuar CSS-në !'''\n'''Nuk është ruajtur ende!'''",
-       "sitejspreview": "'''Vini re! Ju jeni duke inspektuar këtë kod JavaScript.''' \n'''Nuk është ruajtur ende!'''",
+       "sitecsspreview": "<strong>Vini re! Ju jeni duke inspektuar CSS-në!\nNuk është ruajtur ende!</strong>",
+       "sitejspreview": "<strong>Vini re! Ju jeni duke inspektuar këtë kod JavaScript. \nNuk është ruajtur ende!</strong>",
        "userinvalidcssjstitle": "'''Kujdes:''' Nuk ka pamje të quajtur \"$1\". Vini re se faqet .css dhe .js përdorin titull me gërma të vogla, p.sh. {{ns:user}}:Foo/vector.css, jo {{ns:user}}:Foo/Vector.css.",
        "updated": "(E ndryshuar)",
        "note": "'''Shënim:'''",
        "upload-dialog-button-done": "Mbyll",
        "upload-dialog-button-save": "Ruaj",
        "upload-dialog-button-upload": "Ngarko",
-       "upload-process-error": "Një gabim ka ndodhur",
        "backend-fail-stream": "Nuk mund të kalojë skedën $1.",
        "backend-fail-backup": "Nuk mund të rezervojë skedën $1.",
        "backend-fail-notexists": "Skeda $1 nuk ekziston.",
        "backend-fail-closetemp": "Nuk mund të mbyllë skedën e përkohshme.",
        "backend-fail-read": "Nuk mund të lexojë skedën $1.",
        "backend-fail-create": "Nuk mund të krijojë skedën $1.",
-       "backend-fail-maxsize": "Nuk mund të shkruante skedarin \"$1\" sepse ai është më i madh se {{SHUMËS:$2|një bajt|$2 bajtë}}",
+       "backend-fail-maxsize": "Nuk mund të shkruante skedarin \"$1\" sepse ai është më i madh se {{PLURAL:$2|një bajt|$2 bajtë}}",
        "backend-fail-readonly": "Shërbimi i depos \"$1\" është për momentin vetëm-për-lexim. Arsyeja e dhënë është: \"''$2''\"",
        "backend-fail-synced": "Skedari \"$1\" është në një gjendje të parregullt brenda proceseve të depos së brendshme",
        "backend-fail-connect": "Nuk u arrit lidhja me shërbimin e depos \"$1\".",
        "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} nën mbikqyrje duke mos numëruar faqet e diskutimit.",
        "wlheader-enotif": "Njoftimi me email është lejuar.",
        "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
-       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLUARAL:$2:orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
+       "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
        "wlshowlast": "Trego $1 orët $2 ditët",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
        "blockipsuccesssub": "Bllokimi u bë me sukses",
        "blockipsuccesstext": "Përdoruesi/IP-Adresa [[Special:Contributions/$1|$1]] u bllokua.<br />\nShiko te [[Special:BlockList|Lista e përdoruesve dhe e IP adresave të bllokuara]] për të çbllokuar Përdorues/IP.",
        "ipb-blockingself": "Ju jeni duke bllokuar vetëveten ! Jeni te sigurte qe doni te bëni këtë?",
-       "ipb-confirmhideuser": "Ju jeni gati për të bllokuar një përdorues me \"përdorues të fshehur\" të aktivizuar. Kjo do të shtypur emrin e përdoruesit në të gjitha listat dhe aktivitetet hyrëse. Jeni te sigurte qe doni ta bëni këtë ?",
+       "ipb-confirmhideuser": "Ju jeni gati për të bllokuar një përdorues që ka aktivizuar statusin \"përdorues i fshehur\". Kjo do të shtyp emrin e përdoruesit në të gjitha listat regjistrimet. Jeni të sigurtë që doni ta bëni këtë?",
        "ipb-edit-dropdown": "Redakto arsyet e bllokimit",
        "ipb-unblock-addr": "Zhblloko $1",
        "ipb-unblock": "Çblloko përdorues dhe IP të bllokuara",
        "tooltip-ca-nstab-main": "Shikoni përmbajtjen e atikullit.",
        "tooltip-ca-nstab-user": "Shfaq faqen e përdoruesit",
        "tooltip-ca-nstab-media": "Shfaq faqen e medias",
-       "tooltip-ca-nstab-special": "Kjo është një faqe speciale. Ju nuk mundeni ta redaktoni këtë faqe",
+       "tooltip-ca-nstab-special": "Kjo është një faqe speciale. dhe nuk mund të redaktohet",
        "tooltip-ca-nstab-project": "Shfaq faqen e projektit",
        "tooltip-ca-nstab-image": "Shikoni faqen e figurës",
        "tooltip-ca-nstab-mediawiki": "Shikoni mesazhet e sistemit",
index c34372f..578e39f 100644 (file)
@@ -35,8 +35,9 @@
        "tog-hideminor": "Сакриј мање измене у списку скорашњих измена",
        "tog-hidepatrolled": "Сакриј патролиране измене у списку скорашњих измена",
        "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
+       "tog-hidecategorization": "Сакриј категоризацију страница",
        "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
-       "tog-usenewrc": "Ð\9fÑ\80омене Ñ\83 Ð³Ñ\80Ñ\83пи Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\83 Ñ\81пиÑ\81кÑ\83 Ñ\81коÑ\80аÑ\88Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¸ Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ð½Ð¸Ñ\85 Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пни Ð¿Ñ\80иказ Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\81ваке Ð¿Ð¾Ñ\98единаÑ\87не Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ñ\81коÑ\80аÑ\88Ñ\9aим Ð¸Ð·Ð¼ÐµÐ½Ð°Ð¼Ð° Ð¸ Ñ\81пиÑ\81кÑ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа",
        "tog-numberheadings": "Аутоматски нумериши поднаслове",
        "tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
        "tog-editondblclick": "Уређивање страница двоструким кликом",
@@ -64,6 +65,7 @@
        "tog-watchlisthideliu": "Сакриј измене пријављених корисника са списка надгледања",
        "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
        "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
+       "tog-watchlisthidecategorization": "Сакриј категоризацију страница",
        "tog-ccmeonemails": "Пошаљи ми копије е-порука које пошаљем другим корисницима",
        "tog-diffonly": "Не приказуј садржај странице испод разлика",
        "tog-showhiddencats": "Прикажи скривене категорије",
        "createaccountreason": "Разлог:",
        "createacct-reason": "Разлог",
        "createacct-reason-ph": "Зашто правите још један налог?",
-       "createacct-captcha": "Сигурносна провера",
-       "createacct-imgcaptcha-ph": "Унесите текст који видите изнад",
        "createacct-submit": "Отвори налог",
        "createacct-another-submit": "Отвори налог",
        "createacct-benefit-heading": "{{SITENAME}} је направљен од стране људи као што сте ви.",
        "parser-template-recursion-depth-warning": "Дубина укључивања шаблона је прекорачена ($1)",
        "language-converter-depth-warning": "Прекорачена је граница дубине језичког претварача ($1)",
        "node-count-exceeded-category": "Странице у којима је прекорачен број чворова",
-       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86а Ñ\98е Ð¿Ñ\80екоÑ\80аÑ\87ила Ð±Ñ\80оÑ\98 Ñ\87воÑ\80ова.",
+       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86е Ñ\81а Ð¿Ñ\80евиÑ\88е Ñ\87воÑ\80ова (node).",
        "node-count-exceeded-warning": "Страница у којој је прекорачен број чворова",
        "expansion-depth-exceeded-category": "Странице у којима је прекорачена дубина проширења",
        "expansion-depth-exceeded-category-desc": "Страница је прекорачила највећу дубину проширења.",
        "prefs-help-recentchangescount": "Подразумева скорашње измене, историје страница и дневнике.",
        "prefs-help-watchlist-token2": "Ово је тајни кључ за веб-довод Вашег списка надгледања. \nСвако ко зна овај кључ биће у могућности да види Ваша надгледања; стога, кључ немојте одавати никоме. \nАко је потребно, кључ можете [[Special:ResetTokens|ресетовати]].",
        "savedprefs": "Ваша подешавања су сачувана.",
+       "savedrights": "Корисничка права за {{GENDER:$1|$1}} су сачувана.",
        "timezonelegend": "Временска зона:",
        "localtime": "Локално време:",
        "timezoneuseserverdefault": "подразумеване вредности ($1)",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
        "newuserlogpage": "Дневник нових корисника",
-       "newuserlogpagetext": "Ð\9eво Ñ\98е Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а нових корисника.",
+       "newuserlogpagetext": "Ð\9eво Ñ\98е Ð´Ð½ÐµÐ²Ð½Ð¸Ðº нових корисника.",
        "rightslog": "Дневник корисничких права",
        "rightslogtext": "Ово је дневник измена корисничких права.",
        "action-read": "читање ове странице",
        "rcshowhidemine": "$1 моје измене",
        "rcshowhidemine-show": "Прикажи",
        "rcshowhidemine-hide": "Сакриј",
+       "rcshowhidecategorization": "$1 категоризацију страница",
+       "rcshowhidecategorization-show": "Прикажи",
+       "rcshowhidecategorization-hide": "Сакриј",
        "rclinks": "Прикажи последњих $1 измена {{PLURAL:$2|претходни дан|у последња $2 дана|у последњих $2 дана}}<br />$3",
        "diff": "разл",
        "hist": "ист",
        "booksources-text": "Испод се налази списак веза ка сајтовима који се баве продајом нових и половних књига, а који би могли имати додатне податке о књигама које тражите:",
        "booksources-invalid-isbn": "Наведени ISBN број није исправан. Проверите да није дошло до грешке при умножавању из првобитног извора.",
        "specialloguserlabel": "Извршилац:",
-       "speciallogtitlelabel": "Циљ (наслов или корисник):",
+       "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "log": "Дневници",
        "all-logs-page": "Сви јавни дневници",
        "alllogstext": "Скупни приказ свих доступних историја овог викија.\nМожете сузити приказ одабирући врсту историје, корисничког имена или тражене странице.",
-       "logempty": "Ð\9dема Ð¿Ñ\80онаÑ\92ениÑ\85 Ñ\81Ñ\82авки Ñ\83 Ð¸Ñ\81Ñ\82оÑ\80иÑ\98и.",
+       "logempty": "Ð\9dема Ð¿Ñ\80онаÑ\92ениÑ\85 Ñ\83ноÑ\81а Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83.",
        "log-title-wildcard": "Тражи наслове који почињу с овим текстом",
        "showhideselectedlogentries": "Прикажи/сакриј изабране догађаје",
        "log-edit-tags": "Уреди ознаке изабраних уноса у дневницима",
        "listgrouprights-namespaceprotection-header": "Ограничења именских простора",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
+       "trackingcategories": "Медијавики категорије",
        "trackingcategories-name": "Име поруке",
        "trackingcategories-desc": "Које странице се налазе у категорији",
        "noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
        "creditspage": "Аутори странице",
        "nocredits": "Не постоје подаци о аутору ове странице.",
        "spamprotectiontitle": "Филтер за заштиту од непожељних порука",
-       "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано везом до спољашњег сајта који се налази на црној листи.",
+       "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано везом до спољашњег сајта који се налази на црном списку.",
        "spamprotectionmatch": "Следећи текст је активирао наш филтер за нежељене поруке: $1",
        "spambot_username": "Чишћење непожељних порука у Медијавикији",
        "spam_reverting": "Враћам на последњу измену која не садржи везе до $1",
        "svg-long-error": "Неисправна SVG датотека: $1",
        "show-big-image": "Пуна величина",
        "show-big-image-preview": "Величина овог приказа: $1.",
+       "show-big-image-preview-differ": "Величина овог $3 прегледа за ову $2 датотеку је $1.",
        "show-big-image-other": "{{PLURAL:$2|Друга резолуција|Друге резолуције}}: $1.",
        "show-big-image-size": "$1 × $2 пиксела",
        "file-info-gif-looped": "петља",
        "exif-compression-32946": "Deflate (PKZIP)",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Заштићено ауторским правом",
-       "exif-copyrighted-false": "СÑ\82аÑ\82Ñ\83Ñ\81 Ð°Ñ\83Ñ\82оÑ\80Ñ\81киÑ\85 Ð¿Ñ\80ава Ð½ије дефинисан",
+       "exif-copyrighted-false": "Ð\9dије дефинисан",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Непознат датум",
        "logentry-managetags-activate": "$1 је {{GENDER:$2|активирао|активирала}} ознаку „$4“ за употребу од стране корисника и ботова",
        "logentry-managetags-deactivate": "$1 је {{GENDER:$2|деактивирао|деактивирала}} ознаку „$4“ за употребу од стране корисника и ботова",
        "log-name-tag": "Дневник ознака",
+       "log-description-tag": "Овај дневник приказује додавање/уклањање [[Special:Tags|ознака]] на појединачне измене или уносе у дневницима. Овај дневник не приказује означавање када су она део уређивања, брисања или неке друге радње.",
        "rightsnone": "(нема)",
        "revdelete-summary": "опис измене",
        "feedback-adding": "Додајем повратну информацију на страницу…",
        "feedback-bugornote": "Ако сте спремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].\nУ супротном, послужите се једноставним обрасцем испод. Ваш коментар ће стајати на страници „[$3 $2]“, заједно с корисничким именом и прегледачем који користите.",
        "feedback-cancel": "Откажи",
        "feedback-close": "Урађено",
+       "feedback-external-bug-report-button": "Пријави баг",
        "feedback-error-title": "Грешка",
        "feedback-error1": "Грешка: непрепознат резултат од АПИ-ја",
        "feedback-error2": "Грешка: уређивање није успело",
index 4ba6ffc..6890e79 100644 (file)
@@ -27,7 +27,7 @@
        "tog-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
        "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
-       "tog-usenewrc": "Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica",
+       "tog-usenewrc": "Grupni prikaz izmena svake pojedinačne stranice u skorašnjim izmenama i spisku nadgledanja",
        "tog-numberheadings": "Automatski numeriši podnaslove",
        "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
        "tog-editondblclick": "Uređivanje stranica dvostrukim klikom",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan nalog?",
-       "createacct-captcha": "Sigurnosna provera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Otvori nalog",
        "createacct-another-submit": "Otvori nalog",
        "createacct-benefit-heading": "{{SITENAME}} je napravljen od strane ljudi kao što ste vi.",
        "right-passwordreset": "pregledanje poruka za obnavljanje lozinke",
        "right-managechangetags": "pravljenje i/ili brisanje [[Special:Tags|oznaka]] iz baze podataka",
        "newuserlogpage": "Dnevnik novih korisnika",
-       "newuserlogpagetext": "Ovo je istorija novih korisnika.",
+       "newuserlogpagetext": "Ovo je dnevnik novih korisnika.",
        "rightslog": "Dnevnik korisničkih prava",
        "rightslogtext": "Ovo je dnevnik izmena korisničkih prava.",
        "action-read": "čitanje ove stranice",
        "booksources-text": "Ispod se nalazi spisak veza ka sajtovima koji se bave prodajom novih i polovnih knjiga, a koji bi mogli imati dodatne podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije ispravan. Proverite da nije došlo do greške pri umnožavanju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
-       "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
+       "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Dnevnici",
        "all-logs-page": "Svi javni dnevnici",
        "alllogstext": "Skupni prikaz svih dostupnih istorija ovog vikija.\nMožete suziti prikaz odabirući vrstu istorije, korisničkog imena ili tražene stranice.",
-       "logempty": "Nema pronađenih stavki u istoriji.",
+       "logempty": "Nema pronađenih unosa u dnevniku.",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane događaje",
        "allpages": "Sve stranice",
        "listgrouprights-namespaceprotection-header": "Ograničenja imenskih prostora",
        "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
        "listgrouprights-namespaceprotection-restrictedto": "Prava potrebna za uređivanje",
+       "trackingcategories": "Medijaviki kategorije",
        "trackingcategories-name": "Ime poruke",
        "trackingcategories-desc": "Koje stranice se nalaze u kategoriji",
        "noindex-category-desc": "Stranice koje u sebi imaju magičnu reč <code><nowiki>__NOINDEX__</nowiki></code>.",
        "creditspage": "Autori stranice",
        "nocredits": "Ne postoje podaci o autoru ove stranice.",
        "spamprotectiontitle": "Filter za zaštitu od nepoželjnih poruka",
-       "spamprotectiontext": "Filtera protiv neželjenih poruka je blokirao čuvanje ove stranice.\nOvo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj listi.",
+       "spamprotectiontext": "Filtera protiv neželjenih poruka je blokirao čuvanje ove stranice.\nOvo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnom spisku.",
        "spamprotectionmatch": "Sledeći tekst je aktivirao naš filter za neželjene poruke: $1",
        "spambot_username": "Čišćenje nepoželjnih poruka u Medijavikiji",
        "spam_reverting": "Vraćam na poslednju izmenu koja ne sadrži veze do $1",
        "exif-compression-32946": "Deflate (PKZIP)",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Zaštićeno autorskim pravom",
-       "exif-copyrighted-false": "Status autorskih prava nije definisan",
+       "exif-copyrighted-false": "Nije definisan",
        "exif-photometricinterpretation-2": "RGB",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Nepoznat datum",
index 1c631ec..033a66c 100644 (file)
                        "Marfuas",
                        "Macofe",
                        "Aaoo",
-                       "Josve05a"
+                       "Josve05a",
+                       "Pipetricker"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "tog-hideminor": "Dölj mindre redigeringar i senaste ändringar",
        "tog-hidepatrolled": "Dölj patrullerade redigeringar i senaste ändringar",
        "tog-newpageshidepatrolled": "Dölj patrullerade sidor i listan över nya sidor",
+       "tog-hidecategorization": "Dölj kategorisering av sidor",
        "tog-extendwatchlist": "Utöka bevakningslistan till att visa alla ändringar, inte bara den senaste",
        "tog-usenewrc": "Gruppera ändringar efter sida i senaste ändringar och bevakningslistan",
        "tog-numberheadings": "Automatisk numrerade rubriker",
        "tog-watchlisthideliu": "Visa inte redigeringar av inloggade användare i bevakningslistan",
        "tog-watchlisthideanons": "Dölj redigeringar av anonyma användare i bevakningslistan",
        "tog-watchlisthidepatrolled": "Dölj patrullerade redigeringar i bevakningslistan",
+       "tog-watchlisthidecategorization": "Dölj kategorisering av sidor",
        "tog-ccmeonemails": "Skicka kopior till mig av e-post jag skickar till andra användare",
        "tog-diffonly": "Visa inte sidinnehåll under diffar",
        "tog-showhiddencats": "Visa dolda kategorier",
        "createaccountreason": "Orsak:",
        "createacct-reason": "Orsak",
        "createacct-reason-ph": "Varför du skapar ett annat konto",
-       "createacct-captcha": "Säkerhetskontroll",
-       "createacct-imgcaptcha-ph": "Fyll i texten du ser ovan",
        "createacct-submit": "Skapa ditt konto",
        "createacct-another-submit": "Skapa konto",
        "createacct-benefit-heading": "{{SITENAME}} är skapad av människor som dig.",
        "sig_tip": "Din signatur med tidsstämpel",
        "hr_tip": "Horisontell linje (använd sparsamt)",
        "summary": "Sammanfattning:",
-       "subject": "Ämne/rubrik:",
+       "subject": "Ämne:",
        "minoredit": "Mindre ändring (m)",
        "watchthis": "Bevaka denna sida",
        "savearticle": "Spara sidan",
        "missingsummary": "<strong>Påminnelse:</strong> Du har inte skrivit någon redigeringskommentar.\nOm du klickar på \"{{int:savearticle}}\" igen kommer din redigering att sparas utan en sådan.",
        "selfredirect": "<strong>Varning:</strong> Du omdirigerar denna sida till sig själv.\nDu kanske angav fel mål för din omdirigering, eller redigerar fel sida.\nOm du klickar på \"{{int:savearticle}}\" igen kommer omdirigeringen att skapas trots detta.",
        "missingcommenttext": "Var god och skriv in en kommentar nedan.",
-       "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne/rubrik för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
+       "missingcommentheader": "<strong>Påminnelse:</strong> Du har inte skrivit något ämne för den här kommentaren.\nOm du trycker på \"{{int:savearticle}}\" igen kommer din redigering sparas utan rubrik.",
        "summary-preview": "Förhandsgranskning av sammanfattning:",
        "subject-preview": "Rubrikförhandsgranskning:",
        "previewerrortext": "Ett fel uppstod när dina ändringar skulle förhandsgranskas.",
        "permissionserrors": "Behörighetsfel",
        "permissionserrorstext": "Du har inte behörighet att göra det du försöker göra, av följande {{PLURAL:$1|anledning|anledningar}}:",
        "permissionserrorstext-withaction": "Du har inte behörighet att $2, av följande {{PLURAL:$1|anledning|anledningar}}:",
+       "contentmodelediterror": "Du kan inte redigera denna sidversion eftersom dess innehållsmodell är <code>$1</code> och sidans aktuella innehållsmodell är <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Varning: Du återskapar en sida som tidigare raderats.'''\n\nDu bör överväga om det är lämpligt att fortsätta redigera den här sidan.\nRaderings- och sidflyttningsloggen för den här sidan visas här som hjälp:",
        "moveddeleted-notice": "Den här sidan har raderats.\nRaderings- och sidflyttningsloggen för sidan visas nedan som referens.",
        "moveddeleted-notice-recent": "Tyvärr, denna sida raderades nyligen (inom de senaste 24 timmarna).\nLoggen för radering och flyttning av sidan visas nedan som referens.",
        "showingresultsinrange": "Nedan visas upp till {{PLURAL:$3|<strong>1</strong> resultat|<strong>$1</strong> resultat}} mellan nummer <strong>$2</strong> och nummer <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> av <strong>$3</strong>|Resultat <strong>$1 – $2</strong> av <strong>$3</strong>}}",
        "search-nonefound": "Inga resultat matchade frågan.",
+       "search-nonefound-thiswiki": "Inga resultat matchade frågan på denna webbplats.",
        "powersearch-legend": "Avancerad sökning",
        "powersearch-ns": "Sök i namnrymderna:",
        "powersearch-togglelabel": "Kryssa:",
        "prefs-help-recentchangescount": "Detta inkluderar senaste ändringarna, sidhistorik och loggar.",
        "prefs-help-watchlist-token2": "Detta är den hemliga nyckeln till webbflödet i din bevakningslista.\nNågon som vet den kommer att kunna läsa din bevakningslista, så dela inte ut den.\n[[Special:ResetTokens|Klicka här om du behöver återställa den]].",
        "savedprefs": "Dina inställningar har sparats",
+       "savedrights": "Användarrättigheterna för {{GENDER:$1|$1}} har sparats.",
        "timezonelegend": "Tidszon:",
        "localtime": "Lokal tid:",
        "timezoneuseserverdefault": "Använd wikins standard ($1)",
        "rcshowhidemine": "$1 mina ändringar",
        "rcshowhidemine-show": "Visa",
        "rcshowhidemine-hide": "Dölj",
+       "rcshowhidecategorization": "$1 kategorisering av sidor",
+       "rcshowhidecategorization-show": "Visa",
+       "rcshowhidecategorization-hide": "Dölj",
        "rclinks": "Visa senaste $1 ändringar under de senaste $2 dygnen<br />$3",
        "diff": "skillnad",
        "hist": "historik",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} lades till i kategorin",
        "recentchanges-page-removed-from-category": "[[:$1]] togs bort från kategorin",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} togs bort från kategorin",
-       "autochange-username": "MediaWiki automatisk ändring",
+       "autochange-username": "Automatisk MediaWiki-ändring",
        "upload": "Ladda upp fil",
        "uploadbtn": "Ladda upp fil",
        "reuploaddesc": "Avbryt uppladdningen och gå tillbaka till uppladdningsformuläret.",
        "upload-dialog-button-done": "Klar",
        "upload-dialog-button-save": "Spara",
        "upload-dialog-button-upload": "Ladda upp",
-       "upload-process-error": "Ett fel uppstod",
-       "upload-process-warning": "En varning uppstod",
        "upload-form-label-select-file": "Välj fil",
        "upload-form-label-infoform-title": "Detaljer",
        "upload-form-label-infoform-name": "Namn",
        "svg-long-error": "Felaktig SVG-fil: $1",
        "show-big-image": "Originalfil",
        "show-big-image-preview": "Storlek på förhandsvisningen: $1.",
+       "show-big-image-preview-differ": "Storleken för denna $3-förhandsvisning av denna $2-fil: $1.",
        "show-big-image-other": "{{PLURAL:$2|Annan upplösning|Andra upplösningar}}: $1.",
        "show-big-image-size": "$1 × $2 pixlar",
        "file-info-gif-looped": "upprepad",
        "logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laddade upp}} en ny version av $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
-       "log-name-managetags": "Tagghanterings logg",
+       "log-name-managetags": "Märkeshanteringslogg",
        "log-description-managetags": "Denna sida innehåller administrativa [[Special:Tags|märke]]srelaterade uppgifter. Loggen innehåller bara åtgärder som utförts manuellt av en administratör; märken kan skapas eller raderas av wikins mjukvara utan att en post registreras i loggen.",
        "logentry-managetags-create": "$1 {{GENDER:$2|skapade}} taggen \"$4\"",
        "logentry-managetags-delete": "$1 {{GENDER:$2|raderade}} taggen \"$4\" (borttagen från $5 {{PLURAL:$5|version eller loggpost|versioner och/eller loggposter}})",
index 73b3b6a..d964299 100644 (file)
@@ -5,7 +5,10 @@
                        "VASANTH S.N.",
                        "VinodSBangera",
                        "아라",
-                       "Vishwanatha Badikana"
+                       "Vishwanatha Badikana",
+                       "Bharathesha Alasandemajalu",
+                       "Soundarya shetty s",
+                       "రహ్మానుద్దీన్"
                ]
        },
        "tog-underline": "ಲಿಂಕ್’ಲೆದ ತಿರ್ತ್ ಗೆರೆ(ಅಂಡರ್ ಲೈನ್) ಪಾಡ್’ಲೆ",
        "editfont-default": "ಬ್ರೌಸರ್’ದ ಯಥಾಸ್ಥಿತಿ",
        "editfont-sansserif": "ಸಾನ್ಸ್-ಸೆರಿಫ್ ಲಿಪಿ",
        "editfont-serif": "ಸೆರಿಫ್ ಲಿಪಿ",
-       "sunday": "ಐತಾರ",
-       "monday": "ಸà³\8bಮವಾರ",
-       "tuesday": "ಅಂಗರೆ",
-       "wednesday": "ಬà³\81ಧವಾರ",
-       "thursday": "à²\97à³\81ರà³\81ವಾರ",
-       "friday": "ಶà³\81à²\95à³\8dರವಾರ",
-       "saturday": "ಶನಿವಾರ",
-       "sun": "ರವಿ",
+       "sunday": "ಐತಾರ",
+       "monday": "ಸà³\8bಮಾರà³\8a",
+       "tuesday": "à²\85à²\82à²\97ಾರà³\86",
+       "wednesday": "ಬà³\81ದಾರà³\8a",
+       "thursday": "à²\97à³\81ರà³\8dವಾರà³\8a",
+       "friday": "ಶà³\81à²\95à³\8dರಾರà³\8a",
+       "saturday": "ಸನಿಯಾರà³\8a",
+       "sun": "à²\90ತಾರà³\8a",
        "mon": "ಸೋಮ",
-       "tue": "ಮà²\82à²\97ಳ",
-       "wed": "ಬà³\81ಧ",
+       "tue": "à²\87ತà³\8dತà³\86ದ",
+       "wed": "ಬà³\81ದ",
        "thu": "ಗುರು",
-       "fri": "ಶುಕ್ರ",
-       "sat": "à²ನಿ",
+       "fri": "ಶುಕ್ರ",
+       "sat": "ಸನಿ",
        "january": "ಜನವರಿ",
-       "february": "ಫೆಬ್ರವರಿ",
-       "march": "ಮಾರà³\8dà²\9aà³\8d",
-       "april": "à²\8fಪ್ರಿಲ್",
+       "february": "ಪೆಬ್ರವರಿ",
+       "march": "ಮಾರà³\8dà²\9aಿ",
+       "april": "à²\8eಪ್ರಿಲ್",
        "may_long": "ಮೇ",
        "june": "ಜೂನ್",
-       "july": "à²\9cà³\81ಲà³\88",
-       "august": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "september": "ಸà³\86ಪà³\8dà²\9fà²\82ಬರà³\8d",
-       "october": "ಅಕ್ಟೋಬರ",
-       "november": "ನವà²\82ಬರà³\8d",
-       "december": "ಡಿಸà²\82ಬರà³\8d",
+       "july": "à²\9cà³\81ಲಾಯಿ",
+       "august": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "september": "ಸಪà³\8dà²\9fà²\82ಬರ",
+       "october": "ಅಕ್ಟೋಬರ",
+       "november": "ನವà²\82ಬರà³\8a",
+       "december": "ದಸà²\82ಬರà³\8a",
        "january-gen": "ಜನವರಿ",
-       "february-gen": "ಫà³\8dರೆಬ್ರವರಿ",
-       "march-gen": "ಮಾರà³\8dà²\9aà³\8d",
-       "april-gen": "à²\8fಪ್ರಿಲ್",
+       "february-gen": "ಪೆಬ್ರವರಿ",
+       "march-gen": "ಮಾರà³\8dà²\9aಿ",
+       "april-gen": "à²\8eಪ್ರಿಲ್",
        "may-gen": "ಮೇ",
        "june-gen": "ಜೂನ್",
-       "july-gen": "à²\9cà³\81ಲà³\88",
-       "august-gen": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "september-gen": "ಸಪà³\8dà²\9fà²\82ಬರà³\8d",
-       "october-gen": "ಅಕ್ಟೋಬರ",
-       "november-gen": "ನವಂಬರ",
-       "december-gen": "ಡಿಸà³\86à²\82ಬರà³\8d",
+       "july-gen": "à²\9cà³\81ಲಾಯಿ",
+       "august-gen": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "september-gen": "ಸಪà³\8dà²\9fà²\82ಬರà³\8a",
+       "october-gen": "ಅಕ್ಟೋಬರ",
+       "november-gen": "ನವಂಬರ",
+       "december-gen": "ದಸà²\82ಬರà³\8a",
        "jan": "ಜನವರಿ",
-       "feb": "ಫೆಬ್ರವರಿ",
-       "mar": "ಮಾರà³\8dà²\9aà³\8d",
-       "apr": "à²\8fಪ್ರಿಲ್",
+       "feb": "ಪೆಬ್ರವರಿ",
+       "mar": "ಮಾರà³\8dà²\9aಿ",
+       "apr": "à²\8eಪ್ರಿಲ್",
        "may": "ಮೇ",
        "jun": "ಜೂನ್",
-       "jul": "à²\9cà³\81ಲà³\88",
-       "aug": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "sep": "ಸಪ್ಟಂಬರ",
-       "oct": "ಅಕ್ಟೋಬರ",
-       "nov": "ನವà²\82ಬರà³\8d",
-       "dec": "ಡಿಸà³\86à²\82ಬರà³\8d",
-       "pagecategories": "{{PLURAL:$1|ವರ್ಗ|ವರ್ಗೊಲು}}",
-       "category_header": "\"$1\" à²µà²°à³\8dà²\97ಡà³\81ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²²à³\87à²\96ನೊಲು",
-       "subcategories": "ಉಪವರ್ಗೊಲು",
-       "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರ/ಶಬ್ಧ ಫೈಲ್’ಲು",
+       "jul": "à²\9cà³\81ಲಾಯಿ",
+       "aug": "à²\85à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "sep": "ಸಪ್ಟಂಬರ",
+       "oct": "ಅಕ್ಟೋಬರ",
+       "nov": "ನವà²\82ಬರà³\8a",
+       "dec": "ದಸà²\82ಬರà³\8a",
+       "pagecategories": "{{PLURAL:$1|ವರ್ಗ|ವರ್ಗೊಲು}}",
+       "category_header": "\"$1\" à²µà²°à³\8dà²\97ಡà³\81ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²²à³\87à²\95ನೊಲು",
+       "subcategories": "ಉಪ ವರ್ಗೊಲು",
+       "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರೊ/ಶಬ್ಧೊ ಕಡತೊಲು",
        "category-empty": "''ಈ ವರ್ಗೊಡು ಸದ್ಯಗ್ ಓವುಲ ಪುಟೊಲಾವಡ್ ಅತ್ತ್’ನ್ಡ ಚಿತ್ರೊಲಾವಡ್ ಇಜ್ಜಿ.''",
-       "hidden-categories": "{{PLURAL:$1|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ತಿನ à²µà²°à³\8dà²\97|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ತಿನ ವರ್ಗೊಲು}}",
+       "hidden-categories": "{{PLURAL:$1|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ಡà³\8dâ\80\8dನ à²µà²°à³\8dà²\97à³\8a|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ಡà³\8dâ\80\8dನ ವರ್ಗೊಲು}}",
        "hidden-category-category": "ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು",
-       "category-subcat-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\89ಪವರà³\8dà²\97 à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-subcat-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\89ಪವರà³\8dà²\97 à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-subcat-count-limited": "ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ತೊಜ್ಪಾದಿನ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗೊಲು}} ಉಂಡು.",
-       "category-article-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²ªà³\81à²\9f à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
+       "category-article-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²ªà³\81à²\9fà³\8a à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
        "category-article-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಪುಟ ಉಂಡು|$1 ಪುಟೊಲು ಉಂಡು}}.",
-       "category-file-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²«à³\88ಲà³\8d à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಫà³\88ಲà³\8dâ\80\99ನà³\8d|$1 à²«à³\88ಲà³\8dâ\80\99ಲà³\86ನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-file-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\95ಾಲಿ à²\92à²\82à²\9cಿ à²\95ಡತà³\8a à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|à²\95ಡತà³\8aನà³\8d|$1 à²\95ಡತà³\8aನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-file-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಫೈಲ್ ಉಂಡು|$1 ಫೈಲ್’ಲು ಉಂಡು}}.",
-       "listingcontinuesabbrev": "ಮà³\81à²\82ದು.",
+       "listingcontinuesabbrev": "ದà³\81à²\82ಬು.",
        "index-category": "ವಿಷಯ ಸೂಚಿ ಪುಟಕ್‘ಲು",
        "noindex-category": "ವಿಷಯಸೂಚಿ ಇಜ್ಜಾಂದಿನ ಪುಟಕ್‘ಲು",
        "broken-file-category": "ಪುಟಡ್ ಇಜ್ಜಂದಿನ ಕಡತದ ಕೊಂಡಿಲು",
        "about": "ಎಂಕ್ಲೆನ ಬಗ್ಗೆ",
        "article": "ಲೇಖನ ಪುಟ",
-       "newwindow": "(ಪà³\8aಸ à²\95à²\82ಡಿನà³\8d à²\93ಪನà³\8d à²®à²²à³\8dಪà³\81à²\82ಡà³\81)",
-       "cancel": "ವà²\9cಾ à²®à²¨್ಪುಲೆ",
+       "newwindow": "(ಪà³\8aಸ à²\95ಿà²\9fಿà²\95à³\86ನà³\8d à²¦à³\86ಪà³\8dಪà³\81ಲà³\86)",
+       "cancel": "ವà²\9cಾ à²®à²²್ಪುಲೆ",
        "moredotdotdot": "ನನಲ...",
        "mypage": "ಎನ್ನ ಪುಟ",
        "mytalk": "ಎನ್ನ ಚರ್ಚೆ",
        "anontalk": "ಈ ಐ.ಪಿ ಗ್ ಪಾತೆರ್’ಲೆ",
-       "navigation": "ಸಂಚಾರ",
+       "navigation": "ಸಂಚಾರ",
        "and": "&#32;ಬೊಕ್ಕ",
        "qbfind": "ನಾಡ್’ಲೆ",
        "qbbrowse": "ಬ್ರೌಸ್",
        "faq": "ಸಾಮಾನ್ಯವಾದ್ ಕೇನುನ ಪ್ರಶ್ನೆಲು",
        "faqpage": "Project:ಸಾಮಾನ್ಯವಾದ್ ಕೇನುನ ಪ್ರಶ್ನೆಲು",
        "actions": "ಕ್ರಿಯೆಕ್ಕುಲು",
-       "namespaces": "ಪುದರ್ ದ ವರ್ಗೊಲು",
-       "variants": "ರà³\82ಪಾà²\82ತರ à²¹à³\8aà²\82ದà³\8dâ\80\98ನ",
-       "navigation-heading": "ಸà²\82à²\9aರಣà³\86 à²®à³\86ನà³\81",
+       "namespaces": "ಪುದರ್ದ ವರ್ಗೊಲು",
+       "variants": "ಬà³\87ತà³\86 à²¬à³\87ತà³\86 à²°à³\82ಪà³\8a",
+       "navigation-heading": "ಸà²\82à²\9aಾರà³\8aದ à²ªà²°à²¿à²µà²¿à²¡à²¿",
        "errorpagetitle": "ದೋಷ",
-       "returnto": "$1 ಗ್ ಪಿರ ಪೋಲೆ.",
-       "tagline": "{{SITENAME}} ರ್ದ್",
-       "help": "ಸಹಾಯ",
+       "returnto": "$1ಗ್ ಪಿರಪೋಲೆ.",
+       "tagline": "{{SITENAME}}ರ್ದ್",
+       "help": "ಸà²\95ಾಯà³\8a",
        "search": "ನಾಡ್",
        "searchbutton": "ನಾಡ್",
        "go": "ಪೋ",
-       "searcharticle": "ಪೋ",
+       "searcharticle": "ಪೋಲೆ",
        "history": "ಪುಟೊತ ಚರಿತ್ರೆ",
-       "history_short": "ಇತಿಹಾಸ",
+       "history_short": "ಇತಿಹಾಸ",
        "updatedmarker": "ಎನ್ನ ಅಕೇರಿದ ವೀಕ್ಷಣೆ ಡ್ದ್ ಬುಕ್ಕ ಆಯಿನ ಬದಲಾವಣೆಲು",
        "printableversion": "ಪ್ರಿಂಟ್ ಆವೃತ್ತಿ",
-       "permalink": "ಸà³\8dಥಿರ à²¸à²\82ಪರà³\8dà²\95",
+       "permalink": "ಸà³\8dತಿರà³\8a à²\95à³\8aà²\82ಡಿ",
        "print": "ಪ್ರಿ೦ಟ್ ಮನ್ಪುಲೆ",
        "view": "ತೂಲೆ",
-       "view-foreign": "$1ಡ್ ತೂಲೆ",
-       "edit": "ಸà²\82ಪಾದನà³\86 à²®à²²à³\8dಪà³\81ಲà³\86(Edit this page)",
+       "view-foreign": "$1ಡà³\8d à²®à²¿à²¤à³\8dತà³\8d à²¤à³\82ಲà³\86",
+       "edit": "ಸà²\82ಪದನà³\86 à²®à²²à³\8dಪà³\81ಲà³\86",
        "create": "ಸೃಷ್ಟಿಸಾಲೆ",
        "create-local": "ಸ್ಥಳೀಯ ವಿವರಣೆ ಸೇರಾಲೆ",
        "editthispage": "ಈ ಪುಟೊನು ಬದಲಾಯಿಸಾಲೆ",
        "unprotectthispage": "ಈ ಪುಟೊತ ಸ೦ರಕ್ಷಣೆನ್ ದೆಪ್ಲೆ",
        "newpage": "ಪೊಸ ಪುಟೊ",
        "talkpage": "ಪುಟದ ಬಗ್ಗೆ ಚರ್ಚೆ ಮನ್ಪುಲೆ",
-       "talkpagelinktext": "ಪಾತೆರ",
+       "talkpagelinktext": "ಪಾತೆರ್ಲೆ",
        "specialpage": "ವಿಶೇಷ ಪುಟ",
-       "personaltools": "ವà³\88ಯà²\95à³\8dತಿà²\95 à²\89ಪà²\95ರಣಲು",
+       "personaltools": "ಸà³\8dವà²\82ತà³\8a à²\89ಪà²\95ರಣà³\8aಲು",
        "articlepage": "ಲೇಖನ ಪುಟೊನು ತೂಲೆ",
        "talk": "ಚರ್ಚೆ",
-       "views": "ನà³\8bà²\9fಲು",
+       "views": "à²\85ಬಿಪà³\8dರಾಯà³\8aಲು",
        "toolbox": "ಉಪಕರಣೊಲು",
        "userpage": "ಸದಸ್ಯೆರ್ನ ಪುಟೊನು ತೂಲೆ",
        "projectpage": "ಪ್ರೊಜೆಕ್ಟ್ ಪುಟೊನು ತೂಲೆ",
        "viewhelppage": "ಸಹಾಯ ಪುಟೊನು ತೂಲೆ",
        "categorypage": "ವರ್ಗ ಪುಟೊನು ತೂಲೆ",
        "viewtalkpage": "ಚರ್ಚೆನ್ ತೂಲೆ",
-       "otherlanguages": "ಬà³\87ತà³\86 à²­à²¾à²·ೆಲೆಡ್",
-       "redirectedfrom": "($1 à²°à³\8dದà³\8d à²ªà³\81ನರà³\8dನಿರà³\8dದà³\87ಶಿತ)",
+       "otherlanguages": "ಬà³\87ತà³\86 à²¬à²¾à²¸ೆಲೆಡ್",
+       "redirectedfrom": "($1 à²°à³\8dದà³\8d à²ªà²¿à²° à²¨à²¿à²°à³\8dದà³\87ಸನà³\8aದ)",
        "redirectpagesub": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ",
-       "lastmodifiedat": "ಈ ಪುಟ ಇಂದೆತ ದುಂಬು $2, $1 ಕ್ ಬದಲಾತ್’ನ್ಡ್.",
+       "redirectto": "ಪಿರ ಕಡಪುಡ್ಲೆ:",
+       "lastmodifiedat": "ಈ ಪುಟೊ ಇಂದೆತ ದುಂಬು $2, $1 ಗ್ ಬದಲಾತ್ಂಡ್.",
        "viewcount": "ಈ ಪುಟೊನು {{PLURAL:$1|1 ಸರಿ|$1 ಸರಿ}} ತೂತೆರ್.",
        "protectedpage": "ಸಂರಕ್ಷಿತ ಪುಟ",
-       "jumpto": "ಇಡೆ ಪೋಲೆ:",
-       "jumptonavigation": "ಸಂಚಾರ",
-       "jumptosearch": "ನಾಡà³\8dâ\80\99ಲೆ",
+       "jumpto": "ಇಡೆಗ್ ಪೋಲೆ:",
+       "jumptonavigation": "ಸಂಚಾರ",
+       "jumptosearch": "ನಾಡà³\8dâ\80\8dಲೆ",
        "pool-errorunknown": "ಗೊತ್ತಿಂಜಂದಿನ  ದೋಷ",
-       "aboutsite": "{{SITENAME}} à²¦ à²¬à²\97à³\8dà²\97à³\86",
-       "aboutpage": "Project:ನಮà³\8dಮ à²¬à²\97à³\8dà²\97à³\86",
+       "aboutsite": "{{SITENAME}} à²¦ à²¬à²\97à³\86à²\9fà³\8d",
+       "aboutpage": "Project:ಬà²\97à³\86à²\9fà³\8d",
        "copyright": "ಉಂದು ಈ ಕಾಪಿರೈಟ್‌ಡ್ ಲಭ್ಯವುಂಡು $1.",
-       "copyrightpage": "{{ns:project}}:ಕೃತಿಸ್ವಾಮ್ಯತೆಲು",
+       "copyrightpage": "{{ns:project}}:ಕೃತಿ ಸ್ವಾಮ್ಯತೆಲು",
        "currentevents": "ಇತ್ತೆದ ಸಂಗತಿಲು",
        "currentevents-url": "Project:ಇತ್ತೆದ ಸಂಗತಿಲು",
-       "disclaimers": "à²\85ಬಾಧà³\8dಯತà³\86ಲು",
-       "disclaimerpage": "Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಲು",
-       "edithelp": "ಸಂಪಾದನೆ(ಎಡಿಟ್) ಮಲ್ಪೆರೆ ಸಹಾಯ",
-       "mainpage": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9f",
-       "mainpage-description": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9f",
+       "disclaimers": "ಹà²\95à³\8dà²\95à³\8dâ\80\8cದಾà²\82ತಿನà²\95à³\81ಲು",
+       "disclaimerpage": "Project:ಸಾಮಾನ್ಯೊ ಹಕ್ಕ್‌ದಾಂತಿನಕುಲು",
+       "edithelp": "ಸಂಪಾದನೆಗ್ ಸಹಾಯೊ",
+       "mainpage": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8a",
+       "mainpage-description": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8a",
        "policy-url": "Project:ನಿಯಮಾವಳಿ",
-       "portal": "ಸಮುದಾಯ ಪುಟ",
-       "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
-       "privacy": "à²\96ಾಸà²\97ಿ à²¨à²¿à²¯à²®à²¾à²µà²³ಿ",
-       "privacypage": "Project:à²\96ಾಸà²\97ಿಮಾಹಿತಿ à²¨à²¿à²¯à²®",
+       "portal": "ಸಮುದಾಯೊ ಪುಟೊ",
+       "portal-url": "Project:ಸಮುದಾಯೊ ಪುಟೊ",
+       "privacy": "ಸà³\8dವà²\82ತà³\8a à²\95ಾರà³\8dಯà³\8aನà³\80ತಿ",
+       "privacypage": "Project:ಸà³\8dವà²\82ತà³\8a à²\95ಾರà³\8dಯà³\8aನà³\80ತಿ",
        "badaccess": "ಅನುಮತಿ ದೋಷ",
        "badaccess-group0": "ಈರ್ ಕೇನಿನ ಬೇಲೆನ್ ಮಲ್ಪೆರೆ ಇರೆಗ್ ಅನುಮತಿ ಇಜ್ಜಿ.",
        "badaccess-groups": "ಈರ್ ಕೇನಿನಂಚಿನ ಕ್ರಿಯೆ ಖಾಲಿ $1 ಗುಂಪುಲೆಡ್ ಒಂಜೆಕ್ ಸೇರ್ದುಪ್ಪುನ ಬಳಕೆದಾರೆರೆಗ್ ಮಾತ್ರ.",
        "versionrequired": "ಮೀಡಿಯವಿಕಿಯದ $1 ನೇ ಅವೃತ್ತಿ ಬೋಡು",
        "versionrequiredtext": "ಈ ಪುಟೊನು ತೂಯೆರೆ ಮೀಡಿಯವಿಕಿಯದ $1 ನೇ ಆವೃತ್ತಿ ಬೋಡು.\n[[Special:Version|ಆವೃತ್ತಿ]] ಪುಟನು ತೂಲೆ.",
        "ok": "ಸರಿ",
-       "retrievedfrom": "\"$1\" ರ್ದ್ ದೆತ್ತಿನಂಚಿನ",
+       "retrievedfrom": "\"$1\"ರ್ದ್ ದೆತೊನ್ನಂಚಿನ",
        "youhavenewmessages": "ಇರೆಗ್ $1 ಉಂಡು ($2).",
        "youhavenewmessagesmulti": "$1 ಡ್ ಇರೆಗ್ ಪೊಸ ಸಂದೇಶೊಲು ಉಂಡು",
        "editsection": "ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
        "editold": "ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
        "viewsourceold": "ಮೂಲೊನು ತೂಲೆ",
-       "editlink": "à²\8eಡಿà²\9fà³\8d ಮಲ್ಪುಲೆ",
+       "editlink": "ಸà²\82ಪದನà³\86 ಮಲ್ಪುಲೆ",
        "viewsourcelink": "ಮೂಲೊನು ತೂಲೆ",
-       "editsectionhint": "$1 à²µà²¿à²­à²¾à²\97ದ à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dಪà³\81ಲೆ",
+       "editsectionhint": "$1 à²µà²¿à²¬à²¾à²\97à³\8aನà³\81 à²¸à²\82ಪಾದಿಸಲೆ",
        "toc": "ಪರಿವಿಡಿ",
        "showtoc": "ತೊಜ್ಪಾವು",
        "hidetoc": "ದೆಂಗಾವು",
        "site-rss-feed": "$1 RSS ಫೀಡ್",
        "site-atom-feed": "$1 ಆಟಮ್ ಫೀಡ್",
        "page-rss-feed": "\"$1\" RSS ಫೀಡ್",
-       "page-atom-feed": "\"$1\" à²ªà³\81à²\9fà³\8aತ Atom à²«ೀಡ್",
+       "page-atom-feed": "\"$1\" à²ªà³\81à²\9fà³\8aತ Atom à²ªೀಡ್",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (ಈ ಪುಟ ನನಲ ಅಸ್ತಿತ್ವಡ್ ಇಜ್ಜಿ)",
+       "red-link-title": "$1 (ಈ ಪುಟೊ ನನಲ ಅಸ್ತಿತ್ವಡ್ ಇದ್ದಿ)",
        "sort-descending": "ಇಳಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
        "sort-ascending": "ಏರಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
-       "nstab-main": "ಪುಟ",
-       "nstab-user": "ಸದಸà³\8dಯà³\86ರà³\8dನ à²ªà³\81à²\9f",
+       "nstab-main": "ಪುಟ",
+       "nstab-user": "ಸದಸà³\8dಯà³\86ರà³\86ನ à²ªà³\81à²\9fà³\8a",
        "nstab-media": "ಮೀಡಿಯ ಪುಟ",
-       "nstab-special": "ವಿಶà³\87ಷ à²ªà³\81à²\9f",
-       "nstab-project": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8d à²ªà³\81à²\9f",
-       "nstab-image": "ಫà³\88ಲà³\8d",
+       "nstab-special": "ವಿಸà³\87ಸà³\8a à²ªà³\81à²\9fà³\8a",
+       "nstab-project": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8a",
+       "nstab-image": "à²\95ಡತà³\8a",
        "nstab-mediawiki": "ಸಂದೇಶ",
-       "nstab-template": "ಫಲà²\95",
+       "nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\86à²\9fà³\8d",
        "nstab-help": "ಸಹಾಯ ಪುಟ",
-       "nstab-category": "ವರ್ಗ",
+       "nstab-category": "ವರ್ಗೊ",
+       "mainpage-nstab": "ಮುಕ್ಯೊ ಪುಟೊ",
        "nosuchaction": "ಈ ರೀತಿದ ಓವು ಕ್ರಿಯೆಲಾ(ಆಕ್ಶನ್) ಇಜ್ಜಿ",
        "nosuchactiontext": "ಈ URLದ ಒಟ್ಟಿಗೆ ಉಪ್ಪುನ ಕ್ರಿಯೆನ್ ವಿಕಿ ಗುರ್ತ ಪತ್ತುಜಿ",
        "nosuchspecialpage": "ಈ ಪುದರ್’ದ ಒವುಲಾ ವಿಷೇಶ ಪುಟ ಇಜ್ಜಿ",
        "badarticleerror": "ಈ ಪುಟಡ್ ಈರ್ ಪ್ರಯತ್ನಿಸಾನ ಕಾರ್ಯ ಸಾದ್ಯ ಇಜ್ಜಿ",
        "cannotdelete": "ಪುಟ ಅಥವಾ ಹೊತ್ತಗೆ \"$1\" ನ್ ಮಾಜಾವರ ಆಪುಜ್ಜಿ.(ಬೇತೆ ಎರೋ ಮಾಜಾದಿಪ್ಪೆರ್)",
        "cannotdelete-title": "\"$1\" ಮಾಜಾವರೆ ಆಪುಜ್ಜಿ",
-       "badtitle": "ಸರಿ à²\87à²\9cà³\8dà²\9cಾಂದಿನ ಪುದರ್",
-       "badtitletext": "à²\88ರà³\8d à²\95à³\8bರಿನ à²ªà³\81à²\9fದ à²¶à³\80ರà³\8dಷಿà²\95à³\86 à²¸à²¿à²\82ಧà³\81 à²\85ತà³\8dತà³\8d à²\85ಥವಾ à²\96ಾಲಿ à²\85ಥವಾ à²¸à²°à²¿à²¯à²¾à²¤à³\8dâ\80\98ನ à²\95à³\8aà²\82ಡಿಯತà³\8dತಾà²\82ದಿನ à²\85à²\82ತರ à²­à²¾à²·à³\86/à²\85à²\82ತರ à²µà²¿à²\95ಿ à²¸à²\82ಪರà³\8dà²\95.\nà²\90à²\9fà³\8d à²\92à²\82à²\9cಿ à²\85ಥವಾ à²¹à³\86à²\9aà³\8dà²\9aಿ à²¶à³\80ರà³\8dಷಿà²\95à³\86ಡà³\8d à²¬à²³à²\95à³\86 à²®à²²à³\8dಪರ à²¨à²¿à²·à²¿à²¦à³\8dದà³\8dà²\9cವಾಯಿನ à²\85à²\95à³\8dಷರಳು ಇಪ್ಪು.",
+       "badtitle": "ಸರಿ à²\87ದà³\8dಯಾಂದಿನ ಪುದರ್",
+       "badtitletext": "à²\88ರà³\8d à²\95à³\8bರಿನ à²ªà³\81à²\9fದ à²¶à³\80ರà³\8dಷಿà²\95à³\86 à²¸à²¿à²\82ಧà³\81 à²\85ತà³\8dತà³\8d à²\85ಥವಾ à²\96ಾಲಿ à²\85ಥವಾ à²¸à²°à²¿à²¯à²¾à²¤à³\8dâ\80\8dನ à²\95à³\8aà²\82ಡಿಯತà³\8dತಾà²\82ದಿನ à²\85à²\82ತರ à²¬à²¾à²¸à³\86/à²\85à²\82ತರ à²µà²¿à²\95ಿ à²¸à²\82ಪರà³\8dà²\95à³\8a.\nà²\85ಯಿà²\9fà³\8d à²\92à²\82à²\9cಿ à²\85ತà³\8dತà²\82ಡ à²¹à³\86à²\9aà³\8dà²\9aಿದ à²¤à²°à³\86ಬರವà³\81ಡà³\81 à²¬à²³à²\95à³\86 à²®à²²à³\8dಪರà³\86 à²¨à²¿à²¸à³\87ದà³\8a à²\86ಯಿನ à²\85à²\95à³\8dಷರà³\8aಲು ಇಪ್ಪು.",
        "perfcached": "ಈ ಮಾಹಿತಿಲು ಕಂಪ್ಯುಟರ್‘ದ ತಾತ್ಕಾಲಿಕ ನೆನೆಪುಡ್‘ದ್ ಬತ್ತ್‘ದ್‘ನ ಬೊಕ್ಕ ಸರಿಯಾನ ಸ್ಥಿತಿ ಆದಿಪ್ಪಾಂದ್ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "ಈ ತಿರ್ತ ಮಾಹಿತಿ ಕಂಪ್ಯೂಟರ್‘ದ ತಾತ್ಕಾಲಿಕ ನೆನಪುಡ್ ಉಂಡು. ದೆತ್ತ ಕಡೆತ ಬದಲಾವಣೆ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "ಈ ಪುಟೊತ್ತ ಆಧುನಿಕ ಮಲ್ಪುನ ಕ್ರಿಯೆನ್ ಸದ್ಯಗ್ ಉಂತಾದ್ಂಡ್. ಮುಲ್ಪ ಉಪ್ಪುನ ಮಾಹಿತಿನ್ ನವೀಕರಣ ಮಲ್ಪರಾಪುಜಿ",
-       "viewsource": "ಮೂಲ ಬರಹೊನು ತೂಲೆ",
+       "viewsource": "ಮೂಲ ಬರಹೊನು ತೂಲೆ",
        "viewsource-title": " $1 ಮೂಲ ಬರಹ ತೂಲೆ",
        "actionthrottled": "ಕಾರ್ಯನ್ ದೆಂಗಾದುಂಡು",
        "protectedpagetext": "ಈ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪಂದಿಲೆಕ್ಕ ಸಂರಕ್ಷಣೆ ಮಲ್ತ್‘ಂಡ್",
        "logouttext": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಔಟ್ ಆತರ್.\nಈರ್ {{SITENAME}} ನ್ ಅನಾಮಧೇಯರಾತ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ,ಅಥವಾ ಕೂಡ ಉಂದುವೇ ಪುದರ್‘ಡ್ ಯಾ ಬೇತೆ ಪುದರ್‘ಡ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ.\nಗಮನಿಸಾಲೆ: ಈರೆನ ಬ್ರೌಸರ್‘ಡ್ ಮಾಜುನಾಡೆ ಮುಟ್ಟ ಕೆಲವು ಪುಟಕ್‘ಲು ಈರ್ ಇತ್ತೆಲಾ ಲಾಗ್ ಇನ್ ಆಯಿಲೆಕ್ಕನೇ ತೋಜಾವು.",
        "yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "userlogin-yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್",
-       "userlogin-yourname-ph": "ಈರೆನೆ ಸದಸ್ಯನಾಮ ಬರೆಲೆ",
+       "userlogin-yourname-ph": "ಈರೆನೆ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "yourpassword": "ಪಾಸ್-ವರ್ಡ್:",
-       "userlogin-yourpassword": "ಪà³\8dರವà³\87à²ಪದೊ",
-       "userlogin-yourpassword-ph": "ಪà³\8dರವà³\87ಶ à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ",
-       "createacct-yourpassword-ph": "ಪà³\8dರವà³\87ಶ à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ",
+       "userlogin-yourpassword": "ಪà³\8dರವà³\87ಸà³\8aಪದೊ",
+       "userlogin-yourpassword-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ",
+       "createacct-yourpassword-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ",
        "yourpasswordagain": "ಪಾಸ್ವರ್ಡ್ ಪಿರ ಟೈಪ್ ಮಲ್ಪುಲೆ",
-       "createacct-yourpasswordagain": "ಪà³\8dರವà³\87ಶಪದà³\8aನà³\8d à²§à³\83ಡà³\80à²\95ರಣ ಮಲ್ಪುಲೆ",
-       "createacct-yourpasswordagain-ph": "ಪà³\8dರವà³\87ಶಪದà³\8aನà³\81 à²¨à²¨ à²\92ರ à²¨à²®à³\82ದಿಸಾಲೆ",
+       "createacct-yourpasswordagain": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\81 à²¦à³\83ಡà³\8a ಮಲ್ಪುಲೆ",
+       "createacct-yourpasswordagain-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\81 à²¨à²¨ à²\92ರ à²¨à²®à³\82ದಿಸಲೆ",
        "remembermypassword": "ಈ ಕಂಪ್ಯೂಟರ್’ಡ್ ಎನ್ನ ಪ್ರವೇಶ ಪದೊನು ನೆನಪು ದೀಲ",
        "userlogin-remembermypassword": "ಎನನ್ ಲಾಗಿನ್ ಆತೇ ದೀಡ್ಲೆ",
        "yourdomainname": "ಈರೆನ ಕಾರ್ಯಕ್ಷೇತ್ರ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
-       "userlogin-noaccount": "à²\88ರà³\86ನ à²\96ಾತà³\86 à²\87à²\9cà³\8dà²\9cà³\87?",
+       "userlogin-noaccount": "à²\88ರà³\86ನ à²\95ಾತà³\86 à²\87ದà³\8dದಿಯಾ?",
        "userlogin-joinproject": "{{SITENAME}}ಗ್ ಸೇರ್ಲೆ",
        "nologin": "ಈರೆನ ಖಾತೆ ಇಜ್ಜೇ?'''$1'''",
        "nologinlink": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "gotaccount": "ಈರೆನ ಖಾತೆ ಉಂಡೇ?'''$1'''",
        "gotaccountlink": "ಲಾಗಿನ್ ಆಲೆ",
        "userlogin-resetlink": "ಈರೆನ ಲಾಗಿನ್ ವಿವರ ಮರತ್ತ್ಂಡೇ?",
-       "userlogin-resetpassword-link": "à²\88ರà³\86ನà³\86 à²ªà³\8dರವà³\87ಶಪದà³\8a à²®à²°à²¤à³\8dತà³\8dâ\80\8dಂಡಾ?",
-       "userlogin-helplink2": "ಲಾà²\97ಿನà³\8d à²\86ವà³\8aರà³\86 à²¸à²¹à²¾à²¯",
-       "createacct-emailoptional": "ಮಿà²\82à²\9aà²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸à³\8a (à²\90à²\9aà³\8dà²\9bಿà²\95)",
-       "createacct-email-ph": "à²\87ರà³\86ನ à²\87-à²\85à²\82à²\9aà³\86 à²µà²¿à²³à²¾à²¸à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ.",
+       "userlogin-resetpassword-link": "à²\88ರà³\86ನà³\86 à²ªà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8a à²®à²°à²¤à³\8dತà³\8dâ\80\8cಂಡಾ?",
+       "userlogin-helplink2": "ಲಾà²\97ಿನà³\8d à²\86ಯರ à²¸à²\95ಾಯà³\8a",
+       "createacct-emailoptional": "ಮಿà²\82à²\9aà²\82à²\9aà³\86 à²µà²¿à²²à²¾à²¸à³\8a(à²\90à²\9aà³\8dà²\9bಿà²\95à³\8a)",
+       "createacct-email-ph": "à²\87ರà³\86ನ à²®à²¿à²\82à²\9aà²\82à²\9aà³\86 à²µà²¿à²²à²¾à²¸à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ.",
        "createaccountmail": "ಇ ಮೈಲ್ ಮೂಲಕ",
        "createaccountreason": "ಕಾರಣ",
-       "createacct-submit": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
-       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪಾದನೆ|ಸಂಪಾದನೆಲು}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟ|ಪುಟಕ್ಕುಲು}}",
+       "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "createacct-benefit-heading": "{{SITENAME}}ನಿಕ್ಲೆನಂಚಿತ್ತಿನ ಜನೊಕ್ಲೆಡ್ದ್ ಉಂಡಾಪುಂಡು.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪದನೆ|ಸಂಪದನೆಲು}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
        "createacct-benefit-body3": "{{PLURAL:$1|ಕೊಡುಗೆ|ಕೊಡುಗೆಲು}}",
        "badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
        "userexists": "ಈರ್ ಕೊರ್ನ ಸದಸ್ಯರ ಪುದರ್ ಬಳಕೆಡ್ ಉಂಡು. ದಯದೀದ್ ಬೇತೆ ಪುದರ್ ಕೊರ್ಲೆ",
        "emailconfirmlink": "ಇರೆನ ಇ-ಅಂಚೆ ವಿಳಾಸೊನ್ ದೃಡೀಕರಣ ಮಲ್ಪುಲೆ.",
        "accountcreated": "ಖಾತೆ ಸೃಷ್ಟಿಯಾತ್‘ಂಡ್.",
        "login-abort-generic": "ಇರೆನ ಲಾಗ್ ಇನ್ ವಿಫಲ ವಾತ್‘ಂಡ್",
-       "loginlanguagelabel": "ಭಾಷೆ: $1",
-       "pt-login": "ಲಾà²\97ಿನà³\8d",
-       "pt-login-button": "ಲಾà²\97ಿನà³\8d à²\86ಲೆ",
-       "pt-createaccount": "ಪà³\8aಸ à²\96ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "loginlanguagelabel": "ಬಾಸೆ: $1",
+       "pt-login": "à²\89ಲಯಿ à²ªà³\8bಲà³\86",
+       "pt-login-button": "à²\89ಲಯಿ à²ªà³\8bಲೆ",
+       "pt-createaccount": "ಪà³\8aಸ à²\95ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "pt-userlogout": "ಲಾಗ್ ಔಟ್",
        "changepassword": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass_header": "ಈ ಖಾತೆದ ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass-submit-loggedin": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass-submit-cancel": "ವಜಾ ಮಲ್ಪುಲೆ",
        "resetpass-temp-password": "ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶಪದ:",
-       "passwordreset": "ಪà³\8dರವà³\87ಶ à²ªà²¦à²¨à³\8d à²°à²¿à²¸à³\86à²\9fà³\8d ಮಲ್ಪುಲೆ",
+       "passwordreset": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²ªà²¿à²° à²¸à³\8dತಾಪನà³\86 ಮಲ್ಪುಲೆ",
        "passwordreset-username": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "passwordreset-email": "ಇ-ಅಂಚೆ ವಿಳಾಸೊ",
        "changeemail-submit": "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
-       "bold_sample": "ದಪ್ಪ ಅಕ್ಷರ",
-       "bold_tip": "ದಪ್ಪ ಅಕ್ಷರೊಲು",
+       "bold_sample": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
+       "bold_tip": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
        "italic_sample": "ಓರೆ ಅಕ್ಷರೊಲು",
        "italic_tip": "ಓರೆ ಅಕ್ಷರೊಲು",
-       "link_sample": "ಲಿà²\82à²\95à³\8dâ\80\99ದ à²ªà³\81ದರà³\8d",
-       "link_tip": "à²\89ಲಯಿದ à²²à²¿à²\82à²\95à³\8d",
-       "extlink_sample": "http://www.example.com à²²à²¿à²\82à²\95à³\8dâ\80\99ದ ಪುದರ್",
-       "extlink_tip": "ಪಿದಯಿದ à²²à²¿à²\82à²\95à³\8d (http:// à²°à³\8dದà³\8d à²¶à³\81ರà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²®à²°à²ªà³\8aಚಿ)",
-       "headline_sample": "ಹà³\86ಡà³\8d-ಲà³\88ನà³\8dâ\80\99ದ à²¬à²°à²¹",
-       "headline_tip": "2ನà³\87 à²²à³\86ವà³\86ಲà³\8dದ à²¹à³\86ಡà³\8d-ಲà³\88ನà³\8d",
-       "nowiki_sample": "à²\88 à²\9cಾà²\97à³\86ಡà³\8d à²¬à²°à³\86ತಿನà²\82à²\9aಿನ à²¬à²°à²¹ à²µà²¿à²\95à³\80à²\95ರಣ à²\86ಪà³\81à²\9cಿ",
-       "nowiki_tip": "ವಿà²\95ಿ à²°à²\9aನಾà²\95à³\8dರಮà³\8aನà³\81(ಫà³\8bರà³\8dಮà³\8dಯಾà²\9fà³\8d) à²\85ಳವಡಿಸà³\8aà²\9aಿ",
-       "image_tip": "à²\8e೦ಬà³\86ಡà³\8d à²®à²²à³\8dತಿನ à²«à³\88ಲà³\8d",
-       "media_tip": "ಫà³\88ಲà³\8d à²¦ à²²à²¿à³¦à²\95à³\8d",
-       "sig_tip": "ಸಮಯಮುದ್ರೆದೊಟ್ಟಿಗೆ ಇರ್ನ ಸಹಿ",
-       "hr_tip": "ಅಡ್ಡ ಗೆರೆ(ಆಯಿನಾತ್ ಕಮ್ಮಿ ಉಪಯೋಗಿಸಾಲೆ)",
-       "summary": "ಸಾರಾà²\82à²:",
+       "link_sample": "à²\95à³\8aà²\82ಡಿದ à²ªà³\81ದರà³\8dâ\80\8d",
+       "link_tip": "à²\89ಲಯಿದ à²\95à³\8aà²\82ಡಿ",
+       "extlink_sample": "http://www.example.com à²\95à³\8aà²\82ಡಿದ ಪುದರ್",
+       "extlink_tip": "ಪಿದಯಿದ à²\95à³\8aà²\82ಡಿ(http://ರà³\8dದà³\8d à²¸à³\81ರà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²®à²°à²ªà³\8aಡà³\8dಚಿ)",
+       "headline_sample": "ತರà³\86ಬರವà³\81ದ à²ªà²\9fà³\8dಯà³\8a",
+       "headline_tip": "2ನà³\87 à²®à²\9fà³\8dà²\9fà³\8aದ à²¤à²°à³\86ಬರವà³\81",
+       "nowiki_sample": "ಮà³\81ಲà³\8dಪ à²«à²¾à²°à³\8dಮà³\87à²\9fà³\8d à²\86ವà²\82ದಿನà²\82à²\9aಿನ à²ªà²\9fà³\8dಯà³\8aನà³\81 à²¸à³\87ರಲà³\86",
+       "nowiki_tip": "ವಿà²\95ಿ à²«à²¾à²°à³\8dಮà³\8dಯಾà²\9fಿà²\82à²\97à³\8dâ\80\8dನà³\8d à²\95ಡà³\86à²\97ಣಿಸಲà³\86",
+       "image_tip": "ಸà³\87ರà³\8dಪಾಯಿನ à²\95ಡತà³\8a",
+       "media_tip": "à²\95ಡತà³\8aದ à²\95à³\8aà²\82ಡಿ",
+       "sig_tip": "ಸಮಯà³\8a à²®à³\81ದà³\8dರà³\86ದà³\8aà²\9fà³\8dà²\9fಿà²\97à³\86 à²\87ರà³\8dನ à²¸à²¹à²¿",
+       "hr_tip": "ಅಡ್ಡೊ ಗೆರೆ(ಆಯಿನಾತ್ ಕಮ್ಮಿ ಉಪಯೋಗಿಸಲೆ)",
+       "summary": "ಸಾರಾà²\82ಸà³\8a:",
        "subject": "ವಿಷಯ/ಮುಖ್ಯಾ೦ಶ:",
        "minoredit": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
        "watchthis": "ಈ ಪುಟೊನು ತೂಲೆ",
        "savearticle": "ಪುಟೊನು ಒರಿಪಾಲೆ",
        "preview": "ಮುನ್ನೋಟ",
-       "showpreview": "ಮುನ್ನೋಟ ತೊಜ್ಪಾವ್",
-       "showdiff": "ಬದಲಾವಣà³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವ್",
-       "anoneditwarning": "'''ಜಾಗ್ರತೆ:''' ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್.\nಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು.",
+       "showpreview": "ಮುನ್ನೋಟೊ ತೋಜಾವು",
+       "showdiff": "ಬದಲಾವಣà³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವ್",
+       "anoneditwarning": "<strong>ಜಾಗ್‍ರ್ತೆ:</strong> ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತ್‍ಜರ್. ಈರ್ ಸಂಪೊಲಿತರ್ಂಡ ಈರೆನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಮಾಂತೆರೆಗ್ಲಾ ತೆರಿವುಂಡು. ಒಂಜೇಲ್ಯೆ <strong>[$1 ಲಾಗಿನ್ ಆಯರ್ಂದಾಂಡ]</strong> ಅತ್ತಂಡ <strong>[$2 ಈ ಅಕೌಂಟ್ ಮಲ್ತರ್ಂಡ]</strong>, ಈರ ಸಂಪೊಲ್ತಿನ ಪೂರ ಬೇತೆ ಲಾಬೊದೊಟ್ಟುಗು ಈರೆನ ಪುದರ್‍ಗ್ ಸೇರುಂಡು.'",
        "anonpreviewwarning": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್. ಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು",
        "missingsummary": "'''ಗಮನಿಸಾಲೆ:''' ಈರ್ ಬದಲಾವಣೆದ ಸಾರಾ೦ಶನ್ ಕೊರ್ತಿಜರ್.\nಈರ್ ಪಿರ 'ಒರಿಪಾಲೆ' ಬಟನ್ ನ್ ಒತ್ತ್೦ಡ ಸಾರಾ೦ಶ ಇಜ್ಜ೦ದೆನೇ ಈರ್ನ ಬದಲಾವಣೆ ದಾಖಲಾಪು೦ಡು.",
        "missingcommenttext": "ದಯ ಮಲ್ತ್ ದ ಈರ್ನ ಅಭಿಪ್ರಾಯನ್ ತಿರ್ತ್ ಕೊರ್ಲೆ",
        "loginreqlink": "ಲಾಗಿನ್ ಆಲೆ",
        "accmailtitle": "ಪ್ರವೇಶಪದ ಕಡಪುಡ್‘ದುಂಡು",
        "newarticle": "(ಪೊಸತ್)",
-       "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸೃಷ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್’ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್’ನ್ಡ ಇರೆನ ಬ್ರೌಸರ್’ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
-       "noarticletext": "ಈ ಪುಟೊಟು ಸದ್ಯಗ್ ಓ ಬರಹಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪೂಟೊಲೆಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಖನೊನು ನಾಡೊಲಿ]] ಅತ್ತ್’ನ್ಡ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪಾದನೆ ಮಲ್ಪೊಲಿ].",
+       "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸ್ರಿಸ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್ಂಡ ಇರೆನ ಬ್ರೌಸರ್‍ದ '''ಪಿರವು''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
+       "noarticletext": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇದ್ದಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತಿನ ಲಾಗ್ಸ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
+       "noarticletext-nopermission": "ಈ ಪುಟೊಡ್ ಸದ್ಯಗ್ ಒವ್ವೇ ಬರವುಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪುಟೊಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಕನೊನು ನಾಡೊಲಿ]] <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್ಸ್‍ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
-       "editing": "$1 à²²à³\87à²\96ನà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
-       "creating": "$1 à²¨à³\8dನà³\81 à²¸à³\83ಷà³\8dà²\9fಿಸಾವà³\8aದುಂಡು",
-       "editingsection": "$1 (ವಿಭಾಗೊನು) ಸಂಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
+       "editing": "$1 à²²à³\87à²\95ನà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
+       "creating": "$1 à²¨à³\8dನà³\81 à²¸à³\8dರಿಸà³\8dà²\9fಿಸವà³\8aà²\82ದುಂಡು",
+       "editingsection": "$1(ವಿಬಾಗೊನು) ಸಂಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
        "yourtext": "ಇರೆನ ಸಂಪಾದನೆ",
        "yourdiff": "ವ್ಯತ್ಯಾಸೊಲು",
        "copyrightwarning": "ದಯಮಲ್ತ್’ದ್ ಗಮನಿಸ್’ಲೆ: {{SITENAME}} ಸೈಟ್’ಡ್ ಇರೆನ ಪೂರಾ ಕಾಣಿಕೆಲುಲಾ $2 ಅಡಿಟ್ ಬಿಡುಗಡೆ ಆಪುಂಡು (ಮಾಹಿತಿಗ್ $1 ನ್ ತೂಲೆ). ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಬೇತೆಕುಲು ನಿರ್ಧಾಕ್ಷಿಣ್ಯವಾದ್ ಬದಲ್ ಮಲ್ತ್’ದ್ ಬೇತೆ ಕಡೆಲೆಡ್ ಪಟ್ಟೆರ್. ಇಂದೆಕ್ ಇರೆನ ಒಪ್ಪಿಗೆ ಇತ್ತ್’ನ್ಡ ಮಾತ್ರ ಮುಲ್ಪ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ.<br />\nಅತ್ತಂದೆ ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಈರ್ ಸ್ವತಃ ಬರೆತರ್, ಅತ್ತ್’ನ್ಡ ಕೃತಿಸ್ವಾಮ್ಯತೆ ಇಜ್ಜಂದಿನ ಕಡೆರ್ದ್ ದೆತೊನ್ದರ್ ಪಂಡ್’ದ್ ಪ್ರಮಾಣಿಸೊಂದುಲ್ಲರ್.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆದ ಅಡಿಟುಪ್ಪುನಂಚಿನ ಕೃತಿಲೆನ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಂದೆ ಮುಲ್ಪ ಪಾಡೊಚಿ!'''",
        "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}:",
        "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ ಟೆಂಪ್ಲೇಟ್’ಲು:",
-       "template-protected": "(ಸಂರಕ್ಷಿತ)",
-       "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತ)",
-       "hiddencategories": "ಈ ಪುಟ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್’ನ್ಡ್:",
-       "permissionserrorstext-withaction": "$2 à²\97à³\8d à²\87ರà³\86à²\97à³\8d à²\85ನà³\81ಮತಿ à²\87à²\9cà³\8dà²\9cಿ, à²\90à²\95à³\8d {{PLURAL:$1|à²\95ಾರಣ|ಕಾರಣೊಲು}}:",
-       "moveddeleted-notice": "à²\88 à²ªà³\87à²\9cà³\8d à²\85ಸà³\8dತಿತà³\8dವಡà³\8d à²\87à²\9cà³\8dà²\9cಿ.\nಪà³\82à²\9fà³\8aತ à²¡à²¿à²²à³\80ಶನà³\8d à²²à²¾à²\97à³\8dâ\80\99ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²\95à³\8aರà³\8dತà³\81à²\82ಡà³\81.",
-       "viewpagelogs": "à²\88 à²ªà³\81à²\9fà³\8aತ à²¦à²¾à²\96ಲೆಲೆನ್ ತೂಲೆ",
+       "template-protected": "(ಸಂರಕ್ಷಿತ)",
+       "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತ)",
+       "hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
+       "permissionserrorstext-withaction": "$2 à²\97à³\8d à²\87ರà³\86à²\97à³\8d à²\85ನà³\81ಮತಿ à²\87ದà³\8dದಿ, à²\85ಯಿà²\95à³\8d {{PLURAL:$1|à²\95ಾರಣà³\8a|ಕಾರಣೊಲು}}:",
+       "moveddeleted-notice": "à²\88 à²ªà³\81à²\9fà³\8a à²\85ಸà³\8dತಿತà³\8dವà³\8aಡà³\8d à²\87ದà³\8dದಿ.\nಪà³\81à²\9fà³\8aದ à²¡à²¿à²²à³\80ಶನà³\8d à²\85ತà³\8dತà³\8dà²\82ಡà³\8d à²\95ಡಪà³\8dಪà³\81ಡà³\81ನà³\86 à²²à²¾à²\97à³\8dâ\80\8dನà³\8d à²¤à³\82ಯರà³\86 à²¤à²¿à²°à³\8dತà³\8d à²\95à³\8aರà³\8dತà³\8dà²\82ಡà³\8d.",
+       "viewpagelogs": "à²\88 à²ªà³\81à²\9fà³\8aತ à²¦à²¾à²\95ಲೆಲೆನ್ ತೂಲೆ",
        "nohistory": "ಈ ಪುಟಕ್ ಬದಲಾವಣೆದ ಇತಿಹಾಸ ಇಜ್ಜಿ",
        "currentrev": "ಇತ್ತೆದ ಆವೃತ್ತಿ",
-       "currentrev-asof": "$1 ದ ಮುಟ್ಟ ಇತ್ತೆದ ಆವೃತ್ತಿ",
-       "revisionasof": "$1 ದಿನೊತ ಆವೃತ್ತಿ",
-       "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್‍ದ್$7",
-       "previousrevision": "â\86\90ದà³\81à²\82ಬà³\81ದ à²\86ವà³\83ತà³\8dತಿ",
-       "nextrevision": "ಪà³\8aಸ à²®à²°à³\81-à²\86ವà³\83ತà³\8dತಿ",
-       "currentrevisionlink": "à²\87ತà³\8dತà³\86ದ à²\86ವà³\83ತà³\8dತಿ",
-       "cur": "ಸದà³\8dಯದ",
+       "currentrev-asof": "$1ದ ಮುಟ್ಟ ಇತ್ತೆದ ಆವೃತ್ತಿ",
+       "revisionasof": "$1ದಿನೊತ ಆವೃತ್ತಿ",
+       "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್ದ್ $7",
+       "previousrevision": "â\86\90ದà³\81à²\82ಬà³\8aರà³\8a à²¤à³\82ಯಿನ",
+       "nextrevision": "ದà³\81à²\82ಬà³\81ದ à²¤à²¿à²¦à³\8dದà³\81ಪಡಿ",
+       "currentrevisionlink": "à²\87ತà³\8dತà³\86ದ à²¤à²¿à²¦à³\8dದà³\81ಪಡಿ",
+       "cur": "ಸದà³\8dಯà³\8a",
        "next": "ಬೊಕ್ಕದ",
-       "last": "à²\95ಡà³\86ತ",
+       "last": "ಪಿರವà³\81",
        "page_first": "ಸುರುತ",
        "page_last": "ಕಡೆತ",
        "history-fieldset-title": "ಇತಿಹಾಸಡ್ ನಾಡ್ಲೆ",
        "histlast": "ಇಂಚಿಪ್ಪದ",
        "historyempty": "(ಖಾಲಿ)",
        "history-feed-title": "ಬದಲಾವಣೆಲೆನ ಇತಿಹಾಸೊ",
-       "rev-delundel": "ತà³\8aà²\9cà³\8dಪಾವà³\8d/ದà³\86à²\82à²\97ಾವà³\8d",
+       "rev-delundel": "ತà³\8bà²\9cà³\81ನà³\86ನà³\8d à²¦à³\86à²\82à²\97ಲ",
        "rev-showdeleted": "ತೊಜಾವು",
        "revisiondelete": "ಮಾಜಾಯಿನ/ಮಾಜಾವಂದಿನ ಬದಲಾವಣೆಲು",
        "revdelete-show-file-submit": "ಅಂದ್",
        "mergehistory-reason": "ಕಾರಣ:",
        "revertmerge": "ಅನ್-ಮರ್ಜ್ ಮಲ್ಪುಲೆ",
        "history-title": "\"$1\" ಪುಟೊತ ಆವೃತ್ತಿ ಇತಿಹಾಸೊ",
-       "lineno": "$1 ನೇ ಸಾಲ್:",
+       "difference-title": "ಪಿರ ಪರಿಸೀಲನೆದ ನಡುತ ವ್ಯತ್ವಾಸೊ \"$1\"",
+       "lineno": "$1ನೇ ಸಾಲ್:",
        "compareselectedversions": "ಆಯ್ಕೆ ಮಲ್ತಿನ ಆವೃತ್ತಿಲೆನ್ ಹೊಂದಾಣಿಕೆ ಮಲ್ತ್ ತೂಲೆ",
-       "editundo": "ದುಂಬುದಲೆಕ",
-       "searchresults": "ನಾಡಟದ ಫಲಿತಾಂಶೊಲು",
-       "searchresults-title": "\"$1\" ಕ್ ನಾಡಟದ ಫಲಿತಾಂಶೊಲು",
+       "editundo": "ದುಂಬುದಲೆಕೊ",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions }} ಅವ್ವೇ ಬಳಕೆದಾರೆರೆನ್ ತೋಜಾದ್‍ಜಿ)",
+       "searchresults": "ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
+       "searchresults-title": "\"$1\"ಕ್ ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
-       "prevn": "ದುಂಬುದ {{PLURAL:$1|$1}}",
-       "nextn": "ಬೊಕ್ಕದ {{PLURAL:$1|$1}}",
+       "prevn": "ದುಂಬು {{PLURAL:$1|$1}}",
+       "nextn": "ಬೊಕ್ಕೊ {{PLURAL:$1|$1}}",
+       "nextn-title": "ದುಂಬುದ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊಲು}}",
        "shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|results}} ತೋಜಿಪಾವು",
-       "viewprevnext": "ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchprofile-articles": "ಲೇಖನ ಪುಟೊ",
-       "searchprofile-images": "ಬಹುಮಾಧ್ಯಮ",
-       "searchprofile-everything": "ಪ್ರತಿಯೊಂಜಿ",
-       "searchprofile-advanced": "ಪರಿಣತ",
-       "searchprofile-articles-tooltip": "$1 ಟ್ ನಾಡ್ಲೆ",
-       "searchprofile-images-tooltip": "ಫೈಲ್ ನಾಡ್ಲೆ",
-       "searchprofile-everything-tooltip": "ಮಾತಾ ಪುಟಕ್ಕುಲೆಡ್ ನಾಡ್ಲೆ (ಪಾತೆರದ ಪುತಲ ಸೇರ್ದ್)",
-       "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದ|$2 ಪದೊಲು}})",
-       "search-redirect": "(ಪುನರ್ನಿರ್ದೇಶನ $1)",
-       "search-section": "(ವಿಭಾಗ $1)",
+       "viewprevnext": "ತೂಲೆ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>ಈ ಪುಟೊನು ರಚಿಸಲೆ \"[[:$1]]\" ಈ ವಿಕಿಡ್!</strong> {{PLURAL:$2|0=|See also the page found with your search.|See also the search results found.}}",
+       "searchprofile-articles": "ಲೇಕನೊ ಪುಟೊ",
+       "searchprofile-images": "ಬಹು ಮಾಧ್ಯಮೊ",
+       "searchprofile-everything": "ಪ್ರತಿ ವಿಸಯೊ",
+       "searchprofile-advanced": "ಮಲ್ಲ ಮಟ್ಟ್",
+       "searchprofile-articles-tooltip": "$1ಟ್ ನಾಡ್‍ಲೆ",
+       "searchprofile-images-tooltip": "ಕಡತೊ ನಾಡ್‍ಲೆ",
+       "searchprofile-everything-tooltip": "ಮಾಂತಾ ಪುಟೊಕ್ಕ್‌ಲೆಡ್ ನಾಡ್‍ಲೆ (ಪಾತೆರದ ಪುಟೊಲ ಸೇರ್ದ್)",
+       "searchprofile-advanced-tooltip": "ಪುದರ್‍ದ ಕ್ರಮೊನು ನಾಡ್‍ಲೆ",
+       "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದೊ|$2 ಪದೊಕುಲು}})",
+       "search-redirect": "(ಪಿರ ನಿರ್ದೇಸನೊ $1)",
+       "search-section": "(ವಿಬಾಗೊ $1)",
        "search-suggest": "ಇಂದೆನ್ ನಾಡೊಂದುಲ್ಲರೆ: $1",
        "search-interwiki-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಲು",
        "search-interwiki-default": "$1 ಫಲಿತಾಂಶೊಲು:",
        "search-interwiki-more": "(ಮಸ್ತ್)",
        "searchrelated": "ಸ೦ಬ೦ಧ ಇತ್ತಿನ",
-       "searchall": "ಮಾತಾ",
-       "search-nonefound": "ಈರೆನ ವಿಚಾರಣೆಗ್ ತಕ್ಕುದಾಯಿನ ಪಲಿತಾಂಶೊಲು ಇಜ್ಜಿ.",
+       "searchall": "ಮಾಂತಾ",
+       "search-showingresults": "{{PLURAL:$4|ಫಲಿತಾಂಸೊ<strong>$1</strong> of <strong>$3</strong>|ಫಲಿತಾಂಸೊ <strong>$1 - $2</strong> of <strong>$3</strong>}}",
+       "search-nonefound": "ಈರೆನ ವಿಚಾರಣೆಗ್ ತಕ್ಕಂದಿನ ಪಲಿತಾಂಸೊಲು ಇದ್ದಿ.",
+       "search-nonefound-thiswiki": "ಈ ಸೈಟ್‍ಡ್ ಪ್ರಶ್ನೆದ ಫಲಿತಾಂಶ ಕೂಡೊಂದಿಜ್ಜಿ",
        "powersearch-legend": "ಅಡ್ವಾನ್ಸ್’ಡ್ ಸರ್ಚ್",
        "powersearch-ns": "ನೇಮ್-ಸ್ಪೇಸ್’ಲೆಡ್ ನಾಡ್ಲೆ",
        "powersearch-toggleall": "ಮಾತಾ",
        "preferences": "ಪ್ರಾಶಸ್ತ್ಯೊಲು",
-       "mypreferences": "ಪà³\8dರಾà²ಸ್ತ್ಯೊಲು",
+       "mypreferences": "ಪà³\8dರಾಸಸ್ತ್ಯೊಲು",
        "prefs-rc": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
        "prefs-resetpass": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "prefs-changeemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "grouppage-sysop": "{{ns:project}}:ನಿರ್ವಾಹಕೆರ್",
        "right-read": "ಪುಟಕ್‍ಲೆನ್ ಓದುಲೆ",
        "right-edit": "ಪುಟೊನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
+       "right-writeapi": "ಬರೆಯಿನ ಎಪಿಐದ ಬಳಕೆ",
        "right-delete": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ",
        "right-undelete": "ಪುಟೊನ್ ಮಾಜಾವಡೆ",
-       "newuserlogpage": "ಸದಸ್ಯ ರಚನೆ ಲಾಗ್",
+       "newuserlogpage": "ಸದಸ್ಯೆರೆ ಸ್ರಿಸ್ಟಿದ ಲಾಗ್",
        "rightslog": "ಸದಸ್ಯೆರ್ನ ಹಕ್ಕು ದಾಖಲೆ",
        "action-read": "ಈ ಪುಟೊನು ಓದುಲೆ",
        "action-edit": "ಈ ಪುಟೊನು ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
        "action-sendemail": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
        "nchanges": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}}",
        "enhancedrc-history": "ಇತಿಹಾಸೊ",
-       "recentchanges": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
-       "recentchanges-legend": "à²\87à²\82à²\9aಿಪದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81 ಆಯ್ಕೆಲು",
-       "recentchanges-summary": "à²\88 à²µà²¿à²\95ಿà²\9fà³\8d à²\87à²\82à²\9aಿಪà³\8dಪ à²\86ತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ನà³\8d à²\9fà³\8dರಾà²\95à³\8d à²®à²²à³\8dಪà³\81ಲà³\86",
+       "recentchanges": "à²\87à²\82à²\9aಿಪà³\8aದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81",
+       "recentchanges-legend": "à²\87à²\82à²\9aಿಪà³\8aದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86 ಆಯ್ಕೆಲು",
+       "recentchanges-summary": "à²\88 à²µà²¿à²\95ಿà²\9fà³\8d à²\87à²\82à²\9aಿಪà³\8dಪ à²®à²¾à²\82ತà³\8dâ\80\8dನ à²¬à²¦à²²à²¾à²µà²£à³\86ನà³\8d à²¤à³\82ವà³\8aಲಿ",
        "recentchanges-feed-description": "ಈ ಫೀಡ್’ಡ್ ವಿಕಿಕ್ ಇಂಚಿಪ್ಪ ಆತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ಟ್ರ್ಯಾಕ್ ಮಲ್ಪುಲೆ.",
        "recentchanges-label-newpage": "ಇರ್ನ ಈ ಬದಲಾವಣೆ ಪೊಸ ಪುಟೊನು ಸುರು ಮಲ್ಪುಂಡು",
        "recentchanges-label-minor": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
-       "recentchanges-label-bot": "ಈ ಸಂಪಾದನೆನ್ ಒಂಜಿ ಬಾಟ್ ಮಲ್ತ್‍ದುಂಡು",
-       "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‍ದಿಜ್ಜಿ.",
-       "rclistfrom": "$3 $2 ರ್ದ್ ಶುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
+       "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬೋಟ್‍ಡ್ ಆತ್ಂಡ್",
+       "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
+       "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
+       "recentchanges-legend-heading": "'''ಟಿಪ್ಪಣಿ:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
+       "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
        "rcshowhideminor-hide": "ದೆಂಗಾವು",
-       "rcshowhidebots": "$1 ಬಾಟ್",
+       "rcshowhidebots": "$1ಬೋಟ್‍ಲು",
        "rcshowhidebots-show": "ತೊಜಾವು",
        "rcshowhidebots-hide": "ದೆಂಗಾಲೆ",
-       "rcshowhideliu": "ಲಾà²\97à³\8d-à²\87ನà³\8d ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhideliu": "ನà³\8bà²\82ದವಣà³\86 ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
        "rcshowhideliu-hide": "ದೆಂಗಾವು",
-       "rcshowhideanons": "à²\85ನಾಮಧà³\87ಯ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhideanons": "ಪà³\81ದರà³\8d à²\87ದà³\8dಯಾà²\82ದಿನ ಸದಸ್ಯೆರ್ $1",
        "rcshowhideanons-show": "ತೋಜಾಲೆ",
        "rcshowhideanons-hide": "ದೆಂಗಾವು",
        "rcshowhidepatr": "$1 ಪರೀಕ್ಷಿಸಾದಿನ ಸಂಪಾದನೆಲು",
        "rcshowhidemine": "ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ $1",
        "rcshowhidemine-show": "ತೋಜಾಲೆ",
        "rcshowhidemine-hide": "ದೆಂಗಾವು",
-       "rclinks": "ದà³\81à²\82ಬà³\81ದ $2 à²¦à²¿à²¨à³\8aಲà³\86ಡà³\8d à²®à²²à³\8dತಿನ $1 à²\95ಡà³\86ತ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
-       "diff": "ವ್ಯತ್ಯಾಸ",
-       "hist": "ಇತಿಹಾಸ",
+       "rclinks": "ದà³\81à²\82ಬà³\81ದ $2 à²¦à²¿à²¨à³\8aಲà³\86ಡà³\8d à²®à²²à³\8dತಿನ $1 à²ªà²¿à²°à²µà³\81ದ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
+       "diff": "ವ್ಯತ್ಯಾಸ",
+       "hist": "ಇತಿಹಾಸ",
        "hide": "ದೆಂಗಾವು",
-       "show": "ತà³\8aà²\9cà³\8dಪಾವು",
+       "show": "ತà³\8bà²\9cಾವು",
        "minoreditletter": "ಚು",
        "newpageletter": "ಪೊ",
        "boteditletter": "ಬಾ",
        "rc_categories_any": "ಒವ್ವೇ",
-       "rc-change-size-new": "$1 {{ಬಹುವಚನೊ:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆದ ಬುಕ್ಕೊ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆಡ್ದ್ ಬುಕ್ಕೊ",
        "newsectionsummary": "\n/* $1 */ಪೊಸ ವಿಭಾಗ",
        "rc-enhanced-expand": "ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು (ಜಾವ ಸ್ಕ್ರಿಪ್ಟ್ ಬೋಡಾಪುಂಡು)",
        "rc-enhanced-hide": "ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
-       "recentchangeslinked": "ಸà²\82ಬà²\82ಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
+       "recentchangeslinked": "ಸà²\82ಬà²\82ದà³\8a ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
        "recentchangeslinked-feed": "ಸಂಬಂಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
-       "recentchangeslinked-toolbox": "ಸà²\82ಬà²\82ಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
-       "recentchangeslinked-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\9fà³\81 à²\86ತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81",
-       "recentchangeslinked-summary": "à²\92à²\82à²\9cಿ à²¨à²¿à²°à³\8dದಿಷà³\8dà²\9f à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 (à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¨à²¿à²°à³\8dದಿಷà³\8dà²\9f à²µà²°à³\8dà²\97à³\8aà²\97à³\81 à²¸à³\87ರà³\8dದಿನ à²ªà³\81à²\9fà³\8aಲà³\86ರà³\8dದà³\8d) à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪ à²®à²²à³\8dತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dಪà³\86ರಾತà³\8dâ\80\99ನà³\8dಡà³\8d.\n[[Special:Watchlist|à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣಾಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಲು '''ದಪ್ಪ ಅಕ್ಷರೊಡು''' ಉಂಡು.",
+       "recentchangeslinked-toolbox": "ಸà²\82ಬà²\82ದà³\8a ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
+       "recentchangeslinked-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\9fà³\81 à²\86ಯಿನ à²¬à²¦à²²à²¾à²µà²£à³\86à²\97à³\8d à²¸à²\82ಬà²\82ದಿಸದà³\8d",
+       "recentchangeslinked-summary": "à²\92à²\82à²\9cಿ à²¨à²¿à²°à³\8dದಿಸà³\8dà²\9fà³\8a à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 (à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¨à²¿à²°à³\8dದಿಸà³\8dà²\9fà³\8a à²µà²°à³\8dà²\97à³\8aà²\97à³\81 à²¸à³\87ರà³\8dದಿನ à²ªà³\81à²\9fà³\8aಲà³\86ರà³\8dದà³\8d) à²¸à²\82ಪರà³\8dà²\95à³\8a à²\89ಪà³\8dಪà³\81ನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪ à²®à²²à³\8dತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dಪà³\86ರಾತà³\8dà²\82ಡà³\8d.\n[[Special:Watchlist|à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣà³\86 ಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಲು '''ದಪ್ಪ ಅಕ್ಷರೊಡು''' ಉಂಡು.",
        "recentchangeslinked-page": "ಪುಟೊತ ಪುದರ್:",
-       "recentchangeslinked-to": "à²\87à²\82ದà³\86ತ à²¬à²¦à²²à²¿à²\97à³\8d à²\95à³\8aರà³\8dತಿನ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²²à²¿à²\82à²\95à³\8d à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವು",
-       "upload": "ಫà³\88ಲà³\8d ಅಪ್ಲೋಡ್",
+       "recentchangeslinked-to": "à²\87à²\82ದà³\86ತ à²¬à²¦à²²à³\8dâ\80\8dà²\97à³\8d à²\95à³\8aರà³\8dತà³\8dâ\80\8dನ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²\95à³\8aà²\82ಡಿ à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವು",
+       "upload": "à²\95ಡತà³\8a ಅಪ್ಲೋಡ್",
        "uploadbtn": "ಫೈಲ್’ನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
        "uploadnologin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
        "uploadlogpage": "ಅಪ್ಲೋಡ್ ದಾಖಲೆ",
        "filename": "ಕಡತದ ಪುದರ್",
-       "filedesc": "ಸಾರಾà²\82à²",
+       "filedesc": "ಸಾರಾà²\82ಸà³\8a",
        "filesource": "ಮೂಲ",
        "savefile": "ಕಡತನ್ ಒರಿಪಾಲೆ",
        "upload-source": "ಮೂಲ ಕಡತ",
-       "license-header": "ಲà³\88ಸà³\86ನà³\8dಸಿà²\82à²\97à³\8d",
-       "imgfile": "ಫà³\88ಲà³\8d",
-       "file-anchor-link": "ಫà³\88ಲà³\8d",
-       "filehist": "ಫà³\88ಲà³\8dâ\80\99ದ à²\87ತಿಹಾಸ",
-       "filehist-help": "ಫà³\88ಲà³\8d à²\86 à²¦à²¿à²¨à³\8aà²\9fà³\81 à²\8eà²\82à²\9a à²\87ತà³\8dತà³\8dâ\80\99ನà³\8dಡà³\8dâ\80\99ನ್ದ್ ತೂಯೆರೆ ಆ ದಿನ/ಪೊರ್ತುದ ಮಿತ್ತ್ ಕ್ಲಿಕ್ ಮಲ್ಪುಲೆ.",
+       "license-header": "ಪರವಾನಿà²\97à³\86",
+       "imgfile": "à²\95ಡತà³\8a",
+       "file-anchor-link": "à²\95ಡತà³\8a",
+       "filehist": "à²\95ಡತà³\8aದ à²\87ತಿಹಾಸà³\8a",
+       "filehist-help": "à²\95ಡತà³\8a à²\86 à²¦à²¿à²¨à³\8aà²\9fà³\81 à²\8eà²\82à²\9a à²\87ತà³\8dತà³\8dâ\80\8cನà³\86ಡ್ದ್ ತೂಯೆರೆ ಆ ದಿನ/ಪೊರ್ತುದ ಮಿತ್ತ್ ಕ್ಲಿಕ್ ಮಲ್ಪುಲೆ.",
        "filehist-deleteall": "ಮಾತಾ ಮಾಜಾಲೆ",
        "filehist-deleteone": "ಮಾಜಾಲೆ",
-       "filehist-current": "ಪà³\8dರಸà²\95à³\8dತ",
+       "filehist-current": "à²\87ತà³\8dತà³\86",
        "filehist-datetime": "ದಿನ/ಪೊರ್ತು",
-       "filehist-thumb": "ಥà²\82ಬà³\8d-ನà³\88ಲà³\8d",
-       "filehist-thumbtext": "$1 ತ ಲೆಕ್ಕ ಆವೃತ್ತಿದ ತಂಬ್-ನೈಲ್",
-       "filehist-user": "ಸದಸà³\8dಯà³\86",
+       "filehist-thumb": "à²\8eಲà³\8dಯà²\9aಿತà³\8dರà³\8a",
+       "filehist-thumbtext": "$1ತ ಆವೃತ್ತಿದ ಎಲ್ಯಚಿತ್ರೊ",
+       "filehist-user": "ಬಳà²\95à³\86ದಾರà³\86ರà³\8d",
        "filehist-dimensions": "ಆಯಾಮೊಲು",
        "filehist-filesize": "ಫೈಲ್’ದ ಗಾತ್ರ",
        "filehist-comment": "ಕಮೆಂಟ್",
-       "imagelinks": "ಫà³\88ಲà³\8d à²²à²¿à²\82à²\95à³\8dâ\80\99ಲà³\81",
-       "linkstoimage": "à²\88 à²«à³\88ಲà³\8dâ\80\99à²\97à³\8d à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ ಈ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲು}} ಲಿಂಕ್ ಕೊರ್ಪುಂಡು.",
-       "nolinkstoimage": "à²\88 à²«à³\88ಲà³\8dâ\80\8dà²\97à³\8d à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನ à²µà²¾ à²ªà³\81à²\9fಲಾ à²\87à²\9cà³\8dà²\9cಿ.",
+       "imagelinks": "à²\95à³\8aà²\82ಡಿದ à²¬à²³à²\95à³\86",
+       "linkstoimage": "à²\88 à²\95ಡತà³\8aà²\97à³\8d à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ ಈ {{PLURAL:$1|ಪುಟ|$1 ಪುಟೊಲು}} ಲಿಂಕ್ ಕೊರ್ಪುಂಡು.",
+       "nolinkstoimage": "à²\88 à²\95ಡತà²\97à³\8d à²¸à²\82ಪರà³\8dà²\95à³\8a à²\89ಪà³\8dಪà³\81ನ à²µà²¾ à²ªà³\81à²\9fà³\8aಲಾ à²\87ದà³\8dದಿ.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಡುಪ್ಪು.",
-       "upload-disallowed-here": "ಈರ್ ಈ ಕಡತನ್ ಕುಡ ಬರೆವರೆ ಸಾದ್ಯ ಇಜ್ಜಿ.",
+       "sharedupload-desc-here": "ಈ ಪುಟೊ $1ಡ್ದ್ ಬೊಕ್ಕ ಬೇತೆ ಯೋಜನೆಡ್ದ್ ಗಳಸೊಲಿ.\nಈ ಪುಟೊತ ವಿವರೊ [$2 ಪುಟೊತ ವಿವರೊ] ತಿರ್ತ ಸಾಲ್‍ಡ್ ತೋಜಾದ್ಂಡ್",
+       "upload-disallowed-here": "ಈರ್ ಈ ಕಡತೊನ್ ಕುಡೊರೊ ಬರೆವರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "filedelete-comment": "ಕಾರಣ",
        "filedelete-submit": "ಮಾಜಾಲೆ",
-       "randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 à²ªà³\81à²\9f",
+       "randompage": "à²\87à²\9aà³\8dà²\9aà³\86ದ à²ªà³\81à²\9fà³\8a",
        "statistics": "ಅಂಕಿ ಅಂಶೊಲು",
        "statistics-header-pages": "ಪುಟೊತ ಅಂಕಿ ಅಂಶಲು",
        "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}",
        "movethispage": "ಈ ಪುಟೊನು ಮೂವ್ ಮಲ್ಪುಲೆ",
        "pager-newer-n": "{{PLURAL:$1|ಪೊಸ ೧|ಪೊಸ $1}}",
        "pager-older-n": "{{PLURAL:$1|ಪರತ್ತ್ ೧|ಪರತ್ತ್ $1}}",
-       "booksources": "ಪà³\81ಸà³\8dತà²\95à³\8aಲà³\8dದ à²®à³\82ಲ",
-       "booksources-search-legend": "ಪà³\81ಸà³\8dತà²\95à³\8aದ à²®à³\82ಲà³\8aನà³\81 à²¨à²¾à²¡à³\8dಲ",
-       "booksources-search": "ನಾಡà³\8dâ\80\98ಲೆ",
-       "log": "ದಾà²\96ಲೆಲು",
+       "booksources": "ಬà³\82à²\95à³\81ದ à²®à³\82ಲà³\8a",
+       "booksources-search-legend": "ಬà³\82à²\95à³\81ದ à²®à³\82ಲà³\8aನà³\81 à²¨à²¾à²¡à³\8dಲà³\86",
+       "booksources-search": "ನಾಡà³\8dâ\80\8dಲೆ",
+       "log": "ದಾà²\95ಲೆಲು",
        "allpages": "ಪೂರಾ ಪೂಟೊಲು",
        "allpagesfrom": "ಇಂದೆರ್ದ್ ಶುರುವಾಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
        "allpagesto": "ಇಂದೆರ್ದ್ ಅಂತ್ಯ ಆಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
-       "allarticles": "ಪà³\82ರಾ à²²à³\87à²\96ನೊಲು",
-       "allpagessubmit": "ಪೋ",
+       "allarticles": "ಮಾà²\82ತ à²ªà³\81à²\9fೊಲು",
+       "allpagessubmit": "ಪೋಲೆ",
        "categories": "ವರ್ಗೊಲು",
        "listgrouprights-members": "(ಸದಸ್ಯೆರ್ನ ಪಟ್ಟಿ)",
        "emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೈಲ್ ಕಡಪುಡ್ಲೆ",
        "watching": "ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾವೊಂದುಂಡು...",
        "unwatching": "ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆತ್ತೊಂದುಂಡು...",
        "actioncomplete": "ಕಾರ್ಯ ಸಂಪೂರ್ಣ",
-       "dellogpage": "ಡಿಲೀಟ್ ಮಲ್ತಿನ ಫೈಲ್’ಲೆದ ದಾಖಲೆ",
-       "rollbacklink": "ಪಿರ ಪೋಲೆ",
-       "protectlogpage": "ಸಂರಕ್ಷಣೆ ದಿನಚರಿ",
+       "dellogpage": "ಡಿಲೀಟ್ ಮಲ್ತಿನ ಕಡತೊದ ದಾಕಲೆ",
+       "rollbacklink": "ಪುಡತ್ತ್ ಪಾಡ್",
+       "rollbacklinkcount": "ಪಿರ ದೆತೊನ್ಲೆ $1 {{PLURAL:$1|edit|ಸಂಪದನೆಲು}}",
+       "protectlogpage": "ಸೇರಾಯಿನ ದಾಕಲೆ",
        "protectedarticle": "\"[[$1]]\" ಸಂರಕ್ಷಿತವಾದುಂಡು.",
        "modifiedarticleprotection": "\"[[$1]]\" ಪುಟೊತ ಸಂರಕ್ಷಣೆ ಮಟ್ಟ ಬದಲಾಂಡ್",
        "undeletelink": "ದುಂಬುದ ಆವೃತ್ತಿಗ್ ಪೋಲೆ",
        "undeleteviewlink": "ತೂಲೆ",
-       "namespace": "ನà³\87ಮà³\8d-ಸà³\8dಪà³\87ಸà³\8d:",
+       "namespace": "ಪà³\81ದರà³\8dâ\80\8dದ à²¬à²\97à³\86:",
        "invert": "ಆಯ್ಕೆನ್ ತಿರ್ಗಾಲೆ",
-       "blanknamespace": "(ಮುಖ್ಯ)",
-       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}} ಕಾಣಿಕೆಲು",
+       "tooltip-invert": "ಈ ಚೌಕೊದುಲಯಿಡ್ ಅಡೆಂಗಿನ ಪುದರ್‍ನ್ ಈ ಚೌಕೊಡೆ ಪರೀಕ್ಷಿಸಲೆಲೆ(ಬೊಕ್ಕೊ ಒಟ್ಟುಗಿತ್ತಿನ ಪುದರ್‍ನ್ಲಾ ಪರೀಕ್ಷಿಸವೊಲಿ)",
+       "namespace_association": "ಜತೆಟಿತ್ತಿನ ಪುದರ್",
+       "tooltip-namespace_association": "ಈ ಚೌಕೊನು ಚರ್ಚೆನ್ ಸೇರಾದ್ ಪರೀಕ್ಷಿಸಲೆ ಅತ್ತ್ಂಡ ವಿಸಯೊಗು ಸರಿಯಾಯಿನ ಪುದರ್ದ ಜತೆಟ್ ಸೇರಾಲೆ",
+       "blanknamespace": "(ಮುಕ್ಯೊ)",
+       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}}ಕಾಣಿಕೆಲು",
        "contributions-title": "$1 ಗ್ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆ",
        "mycontris": "ಎನ್ನ ಕಾಣಿಕೆಲು",
        "contribsub2": "$1 ($2) ಗ್",
        "uctop": " (ಮಿತ್ತ್)",
        "month": "ಈ ತಿಂಗೊಲುರ್ದ್ (ಬೊಕ್ಕ ದುಂಬುದ):",
-       "year": "à²\88 à²µà²°à³\8dಷà³\8aರà³\8dದà³\81 (ಬೊಕ್ಕ ದುಂಬುದ):",
+       "year": "à²\88 à²\92ರà³\8dಸà³\8aರà³\8dದà³\81(ಬೊಕ್ಕ ದುಂಬುದ):",
        "sp-contributions-newbies": "ಪೊಸ ಖಾತೆಲೆದ ಕಾಣಿಕೆಲೆನ್ ಮಾತ್ರ ತೊಜ್ಪಾವು",
        "sp-contributions-blocklog": "ತಡೆಪತ್ತುನ ದಾಖಲೆ",
        "sp-contributions-logs": "ದಾಖಲೆಲು",
        "sp-contributions-search": "ಕಾಣಿಕೆಲೆನ್ ನಾಡ್ಲೆ",
        "sp-contributions-username": "ಐ.ಪಿ ವಿಳಾಸ ಅತ್ತ್’ನ್ಡ ಬಳಕೆದ ಪುದರ್:",
        "sp-contributions-submit": "ನಾಡ್",
-       "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊಲು ಲಿಂಕ್ ಕೊರ್ಪುಂಡು",
+       "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊ ಕೊಂಡಿ ಕೊರ್ಪುಂಡು",
        "whatlinkshere-title": "\"$1\" ಪುಟೊಗು ಲಿಂಕ್ ಕೊರ್ಪುನ ಪುಟೊಲು",
-       "whatlinkshere-page": "ಪುಟ:",
-       "linkshere": "'''[[:$1]]'''à²\97à³\8d à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²ªà³\81à²\9fà³\8aಲà³\81 à²²à²¿à²\82à²\95à³\8d ಕೊರ್ಪುಂಡು.",
+       "whatlinkshere-page": "ಪುಟ:",
+       "linkshere": "'''[[:$1]]'''à²\97à³\8d à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²\95à³\8aà²\82ಡಿ ಕೊರ್ಪುಂಡು.",
        "nolinkshere": "'''[[:$1]]''' ಗ್ ವಾ ಪುಟೊಲುಲಾ ಲಿಂಕ್ ಕೊರ್ಪುಜಿ.",
-       "isredirect": "ಪà³\81ನರà³\8dನಿರà³\8dದà³\87ಶನ à²ªà³\81à²\9f",
-       "istemplate": "ಸà³\87ರà³\8dಪಡೆ",
-       "isimage": "ಫà³\88ಲà³\8dâ\80\8dದ ಲಿ೦ಕ್",
+       "isredirect": "ಪಿರ à²¨à²¿à²°à³\8dದà³\87ಸನà³\8aದ à²ªà³\81à²\9fà³\8a",
+       "istemplate": "ಸà³\87ರಾವà³\81ನೆ",
+       "isimage": "à²\95ಡತà³\8aದ ಲಿ೦ಕ್",
        "whatlinkshere-prev": "{{PLURAL:$1|ದುಂಬುದ|ದುಂಬುದ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|ಬೊಕ್ಕದ|ಬೊಕ್ಕದ $1}}",
-       "whatlinkshere-links": "â\86\90 à²²à²¿à²\82à²\95à³\8dâ\80\99ಲು",
-       "whatlinkshere-hideredirs": "$1 à²ªà³\81ನರà³\8dನಿರà³\8dದà³\87ಶನà²\97ಳು",
-       "whatlinkshere-hidetrans": "$1 à²\9fà³\8dರಾನà³\8dಸà³\8dâ\80\99à²\95à³\8dಲà³\82ಶನà³\8dಸà³\8d",
+       "whatlinkshere-links": "â\86\90 à²\95à³\8aà²\82ಡಿಲು",
+       "whatlinkshere-hideredirs": "$1 à²ªà²¿à²° à²¨à²¿à²°à³\8dದà³\87ಸನà³\8aಲು",
+       "whatlinkshere-hidetrans": "$1 à²¸à³\87ರಾವà³\81ನà³\86",
        "whatlinkshere-hidelinks": "$1 ಕೊಂಡಿಲು",
        "whatlinkshere-filters": "ಅರಿಪೆಲು",
        "blockip": "ಈ ಸದಸ್ಯೆರೆನ್ ಬ್ಲಾಕ್ ಮಲ್ಪುಲೆ",
        "ipboptions": "2 ಗಂಟೆಲು:2 hours,1 ದಿನ:1 day,3 ದಿನೊಲು:3 days,1 ವಾರ:1 week,2 ವಾರೊಲು:2 weeks,1 ತಿಂಗೊಲು:1 month,3 ತಿಂಗೊಲು:3 months,6 ತಿಂಗೊಲು:6 months,1 ವರ್ಷ:1 year,ಅನಿರ್ಧಿಷ್ಟ:infinite",
        "ipblocklist": "ತಡೆಪತ್ತ್’ದಿನ ಐ.ಪಿ ವಿಳಾಸೊಲು ಅಂಚೆನೆ ಬಳಕೆದ ಪುದರ್’ಲು",
-       "blocklink": "à²\85ಡà³\8dಡ à²ªà²¤à³\8dತà³\8dâ\80\99ಲೆ",
+       "blocklink": "à²\85ಡà³\8dಡ à²ªà²¤à³\8dತà³\8dâ\80\8cಲೆ",
        "unblocklink": "ಅಡ್ಡನ್ ದೆಪ್ಪುಲೆ",
        "change-blocklink": "ಬ್ಲಾಕ್’ನ್ ಬದಲಾಲೆ",
        "contribslink": "ಕಾಣಿಕೆಲು",
        "blocklogentry": "[[$1]] ಖಾತೆನ್ $2 $3 ಮುಟ್ಟ ತಡೆಪತ್ತ್’ದ್’ನ್ಡ್",
        "unblocklogentry": "$1 ಖಾತೆನ್ ಅನ್-ಬ್ಲಾಕ್ ಮಲ್ತ್’ನ್ಡ್",
        "block-log-flags-nocreate": "ಖಾತೆ ಸೃಷ್ಟಿನ್ ತಡೆಪತ್ತ್’ದ್’ನ್ಡ್",
-       "movelogpage": "ಸà³\8dಥಳಾà²\82ತರಿà²\95à³\86 à²¦à²¾à²\96ಲೆ",
+       "movelogpage": "ಸà³\8dತಲಾà²\82ತರà³\8aದ à²¦à²¾à²\95ಲೆ",
        "revertmove": "ದುಂಬುದ ಲೆಕೆ ಮಲ್ಪುಲೆ",
-       "export": "ಪುಟಲೆನ್ ರಫ್ತು ಮಲ್ಪುಲೆ",
+       "export": "ಪà³\81à²\9fà³\8aಲà³\86ನà³\8d à²°à²«à³\8dತà³\81 à²®à²²à³\8dಪà³\81ಲà³\86",
        "allmessagesname": "ಪುದರ್",
-       "thumbnail-more": "ಮಲ್ಲ ಮಲ್ಪುಲೆ",
+       "thumbnail-more": "ಮಲ್ಲ ಮಲ್ಪುಲೆ",
        "thumbnail_error": "ಮುನ್ನೋಟ ಚಿತ್ರೊನು ಸೃಷ್ಟಿ ಮನ್ಪುನಗ ದೋಷ: $1",
-       "tooltip-pt-userpage": "ಎನ್ನ ಸದಸ್ಯ ಪುಟ",
-       "tooltip-pt-mytalk": "ಎನ್ನ ಚರ್ಚೆ ಪುಟ",
+       "tooltip-pt-userpage": "ಎನ್ನ ಸದಸ್ಯ ಪುಟ",
+       "tooltip-pt-mytalk": "ಎನ್ನ ಚರ್ಚೆ ಪುಟ",
        "tooltip-pt-preferences": "ಎನ್ನ ಇಷ್ಟೊಲು",
-       "tooltip-pt-watchlist": "à²\88ರà³\8d à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಾದà³\8d à²¨à²¿à²\97ಾ à²¦à³\80ತಿನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-pt-mycontris": "à²\8eನà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-pt-login": "à²\88ರà³\8d à²²à²¾à²\97à³\8d à²\87ನà³\8d à²\86ವà³\8aಡà³\81à²\82ದà³\81 à²\95à³\8bರà³\8aà²\82ದà³\81ಲà³\8dಲ, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-pt-watchlist": "à²\88ರà³\8d à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಾದà³\8d à²¨à²¿à²\97ಾ à²¦à³\80ತಿನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನ ಪಟ್ಟಿ",
+       "tooltip-pt-mycontris": "à²\8eನà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\86 ಪಟ್ಟಿ",
+       "tooltip-pt-login": "à²\88ರà³\8d à²\89ಲಯಿ à²ªà³\8bವà³\8aಡà³\81à²\82ದà³\81 à²\95à³\87ನà³\8aà²\82ದà³\81ಲà³\8dಲà³\8a, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
-       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಲà³\8dತà³\8dâ\80\8dದà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²¸à³\8dವಾà²\97ತ à²®à²²à³\8dಪà³\81ವೊ, ಆಂಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
-       "tooltip-ca-talk": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aತ à²¬à²\97à³\8dà²\97à³\86 ಚರ್ಚೆ",
-       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dಪà³\8aಲಿ. à²¸à³\87ವà³\8d à²®à²²à³\8dಪà³\81ನ à²¦à³\81à²\82ಬà³\81 à²®à³\81ನà³\8dನà³\8bà²\9fದ à²\89ಪಯà³\8aà²\97 à²®à²¨à³\8dತà³\8aನà³\8dಲà³\86.",
-       "tooltip-ca-addsection": "ಪà³\8aಸ à²¸à³\86ಶನà³\8dನà³\8d à²¶ರು ಮಲ್ಪುಲೆ",
-       "tooltip-ca-viewsource": "ಉಂದೊಂಜಿ ಸಂರಕ್ಷಿತ ಪುಟ.\nಇಂದೆತ ಮೂಲೊನು ಈರ್ ತೂವೊಲಿ.",
-       "tooltip-ca-history": "à²\88 à²ªà³\81à²\9fà³\8aತ ಪರತ್ತ್ ಆವೃತ್ತಿಲು",
+       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d à²\89ಲಯಿ à²ªà³\8bಪà³\81ನà³\88ನà³\8d à²ªà³\8dರà³\8bತà³\8dಸಾಹಿಸವೊ, ಆಂಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-ca-talk": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aತ à²¬à²\97à³\86à²\9fà³\8d ಚರ್ಚೆ",
+       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fà³\8aನà³\8d à²¸à²\82ಪà³\8aಲಿಪà³\81ಲà³\86",
+       "tooltip-ca-addsection": "ಪà³\8aಸ à²µà²¿à²¬à²¾à²\97à³\8aನà³\81 à²¸à³\81ರು ಮಲ್ಪುಲೆ",
+       "tooltip-ca-viewsource": "ಉಂದೊಂಜಿ ಸಂರಕ್ಷಿತ ಪುಟ.\nಇಂದೆತ ಮೂಲೊನು ಈರ್ ತೂವೊಲಿ.",
+       "tooltip-ca-history": "à²\88 à²ªà³\81à²\9fà³\8aದ ಪರತ್ತ್ ಆವೃತ್ತಿಲು",
        "tooltip-ca-protect": "ಈ ಪುಟೊನು ಸಂರಕ್ಷಣೆ ಮಲ್ಪುಲೆ",
        "tooltip-ca-delete": "ಈ ಪುಟೊನು ಡಿಲೀಟ್ ಮಲ್ಪುಲೆ",
-       "tooltip-ca-move": "à²\88 à²ªà³\82à²\9fà³\8aನà³\81 à²®à³\82ವà³\8d(ಸà³\8dಥಳಾà²\82ತರ) à²®à²²à³\8dಪà³\81ಲೆ",
-       "tooltip-ca-watch": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣಾಪಟ್ಟಿಗ್ ಸೆರ್ಪಾಲೆ",
+       "tooltip-ca-move": "à²\88 à²ªà³\82à²\9fà³\8aನà³\81 à²¬à³\87ತà³\86 à²\95ಡà³\86à²\95à³\8d à²ªà²¾à²¡à³\8dಲೆ",
+       "tooltip-ca-watch": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\88ರà³\86ನ à²µà³\80à²\95à³\8dಷಿಪà³\81ನಪಟ್ಟಿಗ್ ಸೆರ್ಪಾಲೆ",
        "tooltip-ca-unwatch": "ಈ ಪುಟೊನು ಇರೆನ ವೀಕ್ಷಣಾ ಪಟ್ಟಿರ್ದ್ ದೆಪ್ಪುಲೆ",
-       "tooltip-search": "{{SITENAME}}ನà³\8d à²¨à²¾à²¡à³\8dâ\80\99ಲೆ",
-       "tooltip-search-go": "ಉಂದುವೇ ಪುದರ್ದ ಪುಟ ಇತ್ತ್’ನ್ಡ ಅಡೆ ಪೋಲ",
-       "tooltip-search-fulltext": "à²\88 à²ªà² à³\8dಯ à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\99ಲ",
-       "tooltip-p-logo": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9fà³\8aನà³\81 à²¤à³\82ಲೆ",
-       "tooltip-n-mainpage": "ಮà³\81à²\96à³\8dಯ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-n-mainpage-description": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9fà³\8aನà³\81 ತೂಲೆ",
-       "tooltip-n-portal": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8dâ\80\99ದ à²¬à²\97à³\8dà²\97à³\86, à²\88ರà³\8d à²¦à²¾à²¦ à²®à²²à³\8dಪà³\8aಲಿ, à²\93ಲà³\81 à²\87à²\82ದà³\86ತ à²¬à²\97à³\8dà²\97à³\86 ತೆರಿಯೊನೊಲಿ",
-       "tooltip-n-currentevents": "ಪà³\8dರಸà²\95à³\8dತ à²\98à²\9fನà³\86ಲà³\8dದ à²¬à²\97à³\8dà²\97à³\86 à²¹à²¿à²¨à³\8dನà³\86ಲà³\86 à²®à²¾à²¹à²¿à²¤à²¿ à²¤à³\86ರಿಯೊನ್ಲೆ",
-       "tooltip-n-recentchanges": "ವಿà²\95ಿಡà³\8d à²¦à³\81à²\82ಬà³\81ದ à²\92à²\82ತà³\86 à²¸à²®à²¯à²¡à³\8d à²\86ತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-n-randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 à²ªà³\81à²\9fವà³\8aà²\82à²\9cà³\87ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವà³\8d",
-       "tooltip-n-help": "ತà³\86ರಿತà³\8aನà³\86ರà³\86 à²\9cಾà²\97",
-       "tooltip-t-whatlinkshere": "ಇಡೆ ಲಿಂಕ್ ಕೊರ್ಪುನಂಚಿನ ಪೂರ ವಿಕಿ ಪುಟೊಲ್ದ ಪಟ್ಟಿ",
-       "tooltip-t-recentchangeslinked": "à²\88 à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪದ ಬದಲಾವಣೆಲು",
+       "tooltip-search": "{{SITENAME}}ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8dಲೆ",
+       "tooltip-search-go": "ಉಂದುವೇ ಪುದರ್ದ ಪುಟೊ ಇತ್ತ್‌ಂಡ ಅಡೆ ಪೋಲೆ",
+       "tooltip-search-fulltext": "à²\88 à²ªà²\9fà³\8dಯà³\8aಡà³\8d à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8cಲ",
+       "tooltip-p-logo": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8aà²\97à³\81 à²ªà³\8bಲೆ",
+       "tooltip-n-mainpage": "ಮà³\81à²\95à³\8dಯà³\8a ಪುಟೊನು ತೂಲೆ",
+       "tooltip-n-mainpage-description": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8aನà³\8d ತೂಲೆ",
+       "tooltip-n-portal": "ಯà³\8bà²\9cನà³\86ದ à²¬à²\97à³\86à²\9fà³\8d, à²\88ರà³\8d à²¦à²¾à²¦ à²®à²²à³\8dಪà³\8aಲಿ, à²\93ಲà³\81 à²\87à²\82ದà³\86ತ à²¬à²\97à³\86à²\9fà³\8d ತೆರಿಯೊನೊಲಿ",
+       "tooltip-n-currentevents": "à²\87ತà³\8dತà³\86ದ à²\86ಪà³\81ಪà³\8bಪà³\81ನ à²¬à²\97à³\86à²\9fà³\8d à²¦à³\81à²\82ಬà³\81ದ à²®à²¾à²¹à²¿à²¤à²¿ à²¦à³\86ತೊನ್ಲೆ",
+       "tooltip-n-recentchanges": "ವಿà²\95ಿಡà³\8d à²¦à³\81à²\82ಬà³\81ದ à²\92à²\82ತà³\86 à²¸à²®à²¯à³\8aಡà³\8d à²\86ತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ದ ಪಟ್ಟಿ",
+       "tooltip-n-randompage": "à²\87à²\9aà³\8dà²\9aà³\86ದ à²ªà³\81à²\9fà³\8a à²\92à²\82à²\9cà³\86ನà³\8d à²¤à³\8bà²\9cಾವà³\81",
+       "tooltip-n-help": "à²\87à²\82ದà³\86ತ à²¬à²\97à³\86à²\9fà³\8d à²¤à³\86ರà³\86ಯà³\8aನà³\81ನ à²\9cಾà²\97à³\86",
+       "tooltip-t-whatlinkshere": "ಇಡೆಗ್ ಕೊಂಡಿ ಕೊರ್ಪುನಂಚಿನ ಪೂರ ವಿಕಿ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
+       "tooltip-t-recentchangeslinked": "à²\88 à²ªà³\81à²\9fà³\8aಡà³\8dದà³\8d à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಡà³\8d à²\87à²\82à²\9aಿಪà³\8aದ ಬದಲಾವಣೆಲು",
        "tooltip-feed-rss": "ಈ ಪುಟೊಗು ಆರ್.ಎಸ್.ಎಸ್ ಫೀಡ್",
-       "tooltip-feed-atom": "ಈ ಪುಟೊಗು Atom ಫೀಡ್",
-       "tooltip-t-contributions": "à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\8dದ à²ªà²\9fà³\8dà²\9fಿನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವು",
+       "tooltip-feed-atom": "ಈ ಪುಟೊಗು ಆಟಮ್ ಫೀಡ್ ಮಲ್ಪುಲೆ",
+       "tooltip-t-contributions": "à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ à²\95ಾಣಿà²\95à³\86ದ à²ªà²\9fà³\8dà²\9fಿನà³\8d à²¤à³\8bà²\9cಾವು",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
-       "tooltip-t-upload": "ಫà³\88ಲà³\8dâ\80\99ನà³\8d ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
-       "tooltip-t-specialpages": "ಪà³\82ರ à²µà²¿à²·à³\87ಶ à²ªà³\81à²\9fà³\8aಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-t-print": "à²\88 à²ªà³\81à²\9fà³\8aತ à²ªà³\8dರಿà²\82à²\9fà³\8d ಆವೃತ್ತಿ",
-       "tooltip-t-permalink": "ಪà³\81à²\9fà³\8aತ à²\88 à²\86ವà³\83ತà³\8dತಿà²\97à³\8d à²¶à²¾à²¶à³\8dವತ à²²à²¿à²\82à²\95à³\8d",
-       "tooltip-ca-nstab-main": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aನà³\81 ತೂಲೆ",
+       "tooltip-t-upload": "à²\95ಡತà³\8aನà³\81 ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
+       "tooltip-t-specialpages": "ಪà³\82ರ à²ªà³\81à²\9fà³\8aಲà³\86ನ à²µà²¿à²¸à³\87ಸà³\8a ಪಟ್ಟಿ",
+       "tooltip-t-print": "à²\88 à²ªà³\81à²\9fà³\8aದ à²®à³\81ದà³\8dರಣà³\8a à²®à²²à³\8dಪà³\81ನ ಆವೃತ್ತಿ",
+       "tooltip-t-permalink": "ಪà³\81à²\9fà³\8aದ à²\88 à²\86ವà³\83ತà³\8dತಿà²\97à³\8d à²¸à²¾à²¸à²¿à²¤à³\8a à²\95à³\8aà²\82ಡಿ",
+       "tooltip-ca-nstab-main": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aನà³\8d ತೂಲೆ",
        "tooltip-ca-nstab-user": "ಸದಸ್ಯೆರ್ನ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-special": "à²\89à²\82ದà³\8aà²\82à²\9cಿ à²µà²¿à²¶à³\87ಷ à²ªà³\81à²\9f, à²\87à²\82ದà³\86ನà³\8d à²\88ರà³\8d à²\8eಡಿà²\9fà³\8d à²®à²²à³\8dಪೆರೆ ಆಪುಜಿ",
-       "tooltip-ca-nstab-project": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8d ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-image": "ಫà³\88ಲà³\8dâ\80\99ದ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\87à²\9fà³\8dâ\80\99ನ್ ತೂಲೆ",
+       "tooltip-ca-nstab-special": "à²\89à²\82ದà³\8aà²\82à²\9cಿ à²µà²¿à²¸à³\87ಸ à²ªà³\81à²\9fà³\8a, à²\87à²\82ದà³\86ನà³\8d à²\88ರà³\8d à²¸à²\82ಪà³\8aಲಿಪೆರೆ ಆಪುಜಿ",
+       "tooltip-ca-nstab-project": "ಮಾಹಿತಿ ಪುಟೊನು ತೂಲೆ",
+       "tooltip-ca-nstab-image": "à²\95ಡತà³\8aದ ಪುಟೊನು ತೂಲೆ",
+       "tooltip-ca-nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\87à²\9fà³\8dâ\80\8dನ್ ತೂಲೆ",
        "tooltip-ca-nstab-category": "ವರ್ಗೊದ ಪುಟೊನು ತೂಲೆ",
        "tooltip-minoredit": "ಇಂದೆನ್ ಎಲ್ಯ ಬದಲಾವಣೆ ಪಂಡ್ದ್ ಗುರ್ತ ಮಲ್ಪುಲೆ",
-       "tooltip-save": "à²\88ರà³\8d à²®à²²à³\8dತà³\8dâ\80\99ದಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²\92ರಿಪà³\81ಲೆ",
-       "tooltip-preview": "ಈರ್ ಮಲ್ತಿನ ಬದಲಾವಣೆತ ಮುನ್ನೋಟ - ಈ ಪುಟನ್ ಒರಿಪಾವುನ ದು೦ಬು ನೇನ್ ತೂಲೆ",
-       "tooltip-diff": "à²\88 à²²à³\87à²\96ನà³\8aà²\97à³\8d à²®à²²à³\8dತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವ್",
+       "tooltip-save": "à²\88ರà³\8d à²®à²²à³\8dತà³\8dâ\80\8cನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²\92ರಿಪà³\8dಪಾಲೆ",
+       "tooltip-preview": "ಈರ್ ಮಲ್ತ‍್‌ನ ಬದಲಾವಣೆತ ಮುನ್ನೋಟ - ಈ ಪುಟನ್ ಒರಿಪಾವುನ ದು೦ಬು ಉಂದೆನ್ ತೂಲೆ",
+       "tooltip-diff": "à²\88 à²²à³\87à²\95ನà³\8aà²\97à³\8d à²®à²²à³\8dತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವ್",
        "tooltip-compareselectedversions": "ಈ ಪುಟತ ಆಯ್ಕೆ ಮಲ್ತಿನ ರಡ್ಡ್ ಆವೃತ್ತಿದ ವ್ಯತ್ಯಾಸನ್ ತೂಲೆ",
        "tooltip-watch": "ಈ ಪುಟನ್ ಈರ್ನ ತೂಪುನ ಪಟ್ಟಿಗ್ ಸೇರ್ಸಾಲೆ",
        "tooltip-recreate": "ಈ ಪುಟ ಇತ್ತೆ ಇಜ್ಜ೦ಡಲಾ ಐನ್ ಪಿರ ಮಲ್ಪ್",
        "tooltip-upload": "ಅಪ್ಲೋಡ್ ಸುರು ಮಲ್ಪು",
-       "tooltip-rollback": "\"Rollback\", ಈ ಪುಟದ ಕರಿನ ಬದಾಲವಣೆಗ್ ಒ೦ಜಿ ಕ್ಲಿಕ್ ಡ್ ಕೊನೊಪು೦ಡು",
-       "tooltip-undo": "\"Undo\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ ಪ್ರಿವ್ಯೂ ಮೋಡ್ ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಮ್ಮರಿ ಡ್ ಬದಲಾವಣೆ ಗ್ ಕಾರಣ ಕೊರ್ರ್‍ಎ ಆಪು೦ಡು.",
-       "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಶ ಕೊರ್ಲೆ",
-       "pageinfo-toolboxlink": "ಪುಟೊತ ಮಾಹಿತಿ",
-       "previousdiff": "← ದುಂಬುದ ಸಂಪಾದನೆ",
-       "nextdiff": "ಪೊಸ ಎಡಿಟ್ →",
-       "file-info-size": "$1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3, MIME ಪ್ರಕಾರ: $4",
-       "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ವಿವರವಾಯಿನ ನೋಟ ಇಜ್ಜಿ.",
-       "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3",
-       "show-big-image": "ಮೂಲ ಕಡತ",
-       "show-big-image-size": "$1 × $2 ಪಿಕ್ಸೆಲ್‌ಸ್",
+       "tooltip-rollback": "ಅಕೇರಿದ ಸಂಪಾದಕೆರೆ ಮಾಂತ ಸಂಪದನೆನ್ಲಾ ಮಾಜದ್ ಪಾಡುಂಡು",
+       "tooltip-undo": "\"ವಜಾ ಮಲ್ಪುಲೆ\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ ಪ್ರಿವ್ಯೂ ಮೋಡ್‍ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಾರಾಂಸೊಡು ಬದಲಾವಣೆಗ್ ಕಾರಣ ಸೇರಾಯರ ಆಪು೦ಡು.",
+       "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಸೊ ಕೊರ್ಲೆ",
+       "simpleantispam-label": "ಯಾಂಟಿ-ಸ್ಪಾಮ್ ಚೆಕ್.\nಮುಲ್ಪ <strong>ದಿಂಜಾವೊಡ್ಚಿ</strong>",
+       "pageinfo-toolboxlink": "ಪುಟೊದ ಮಾಹಿತಿ",
+       "previousdiff": "← ದುಂಬುದ ಸಂಪದನೆ",
+       "nextdiff": "ಬುಕ್ಕೊದ ಸಂಪದನೆ →",
+       "file-info-size": "$1 × $2 ಚಿತ್ರಬಿಂದುಲು, ಕಡತೊದ ಗಾತ್ರೊ: $3, MIME ಪ್ರಕಾರೊ: $4",
+       "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ವಿವರವಾಯಿನ ನೋಟ ಇದ್ದಿ,",
+       "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಕಡತೊ, ಸುಮಾರಾದ್ $1 × $2 ಚಿತ್ರೊಬಿಂದು, ಕಡತೊದ ಗಾತ್ರ: $3",
+       "show-big-image": "ನಿಜಾವಾಯಿನ ಕಡತೊ",
+       "show-big-image-preview": "ಪಿರವುದ ಪುಟೊದ ಗಾತ್ರೊ: $1.",
+       "show-big-image-other": "ಬೇತೆ{{PLURAL:$2|resolution|ನಿರ್ನಯೊಲು}}: $1.",
+       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊಬಿಂದುಲು",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
-       "metadata": "ಮà³\87ಲà³\8dದರà³\8dà²\9cà³\86 à²®à²¾à²¹à²¿à²¤à²¿",
-       "metadata-help": "à²\88 à²«à³\88ಲà³\8dâ\80\99ಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²ªà³\8dರಾಯಶà²\83 à²«à³\88ಲà³\8dâ\80\99ನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8d à²°à³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à³\88ದà³\8dâ\80\99ನà³\8dಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²«à³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dâ\80\99ನà³\8dಡ, à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²«à³\88ಲà³\8dâ\80\99ದ ವಿವರೊಲೆಗ್ ಸರಿಯಾದ್ ಹೊಂದಂದೆ ಉಪ್ಪು.",
+       "metadata": "ಮà³\86à²\9fಾಡà³\87à²\9fಾ",
+       "metadata-help": "à²\88 à²ªà³\88ಲà³\8dâ\80\8dಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²¬à³\81ವà³\81ಸà³\8a à²ªà³\88ಲà³\8dâ\80\8dನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dà²\82ಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8dâ\80\8cರà³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¤à³\8dತà³\8dà²\82ಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²ªà³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dà²\82ಡà³\8d, à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²ªà³\88ಲà³\8dâ\80\8dದ ವಿವರೊಲೆಗ್ ಸರಿಯಾದ್ ಹೊಂದಂದೆ ಉಪ್ಪು.",
        "metadata-expand": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು",
        "metadata-collapse": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
-       "metadata-fields": "ಈ ಸಂದೇಶೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲಸ್ಥಿತಿಟ್ ಅಗೋಚರವಾದುಪ್ಪುಂಡು.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude \n* gpsaltitude",
-       "exif-datetime": "ಕಡೊತೊನು ಬದಲಾವಣೆ ಮಲ್ತ್‍ನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
-       "exif-make": "ಕ್ಯಾಮೆರಾದ ತಯಾರೆಕೆರ್",
-       "exif-model": "ಕ್ಯಾಮೆರಾ ಮಾದರಿ",
-       "exif-software": "ಉಪಯೋಗ ಮಲ್ತಿನ ತಂತ್ರಾಂಶ",
+       "metadata-fields": "ಈ ಸಂದೇಸೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರೊ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲೊ ಸ್ಥಿತಿಟ್ ಅಡೆಂಗ್‍ದುಂಡು.\n*ಮಲ್ಪೆರೆ\n*ಮಾದರಿ\n*ದಿನೊ ಪೊರ್ತು ಮೂಲೊ\n*ಮಾನಾದಿಗೆದ ಸಮಯೊ\n*ಎಫ್ ಸಂಖ್ಯೆ\n*ಐಎಸ್ಒ ವೇಗೊದ ರೇಟಿಂಗ್\n*ತೂಪಿನ ಜಾಗೆದ ದೂರ\n*ಕಲಾವಿದೆ\n*ಕೃತಿಸ್ವಾಮ್ಯೊ\n*ಚಿತ್ರೊ ವಿವರಣೆ\n*ಜಿಪಿಎಸ್ ಅಕ್ಷಾಂಸೊ\n*ಜಿಪಿಎಸ್ ರೇಖಾಂಸೊ\n*ಜಿಪಿಎಸ್ ಎತ್ತರೊ",
+       "exif-orientation": "ದಿಕ್ಕ್ ದಿಸೆ",
+       "exif-xresolution": "ಅಡ್ಡಗಲೊದ ರೆಜ಼ಲ್ಯೂಶನ್",
+       "exif-yresolution": "ಉದ್ದೊದ ರೆಜ಼ಲ್ಯೂಶನ್",
+       "exif-datetime": "ಕಡೊತೊನು ಬದಲಾವಣೆ ಮಲ್ತ್‌ನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-make": "ಕೆಮರೊ ತಯಾರೆಕೆರ್",
+       "exif-model": "ಕೆಮರೊದ ಮಾದರಿ",
+       "exif-software": "ಉಪಯೋಗೊ ಮಲ್ತಿನ ತಂತ್ರಾಂಸೊ",
        "exif-exifversion": "Exif ಆವೃತ್ತಿ",
-       "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸೃಷ್ಟಿಯಾಯಿನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯ",
-       "exif-datetimedigitized": "ಗಣಕೀಕರಣದ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
-       "exif-orientation-1": "ಸಾಧಾರಣ",
-       "namespacesall": "ಪೂರಾ",
-       "monthsall": "ಪೂರಾ",
+       "exif-colorspace": "ಬಣ್ಣೊದ ಜಾಗೆ",
+       "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸ್ರಿಸ್ಟಿಸಯಿನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-datetimedigitized": "ಗಣಕೀಕರಣೊದ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-orientation-1": "ಸಾದಾರಣೊ",
+       "namespacesall": "ಮಾಂತಾ",
+       "monthsall": "ಮಾಂತ",
        "watchlisttools-view": "ಪ್ರಸ್ತುತ ಬದಲಾವಣೆಲ್ ತೋಜಾಲೆ",
        "watchlisttools-edit": "ವೀಕ್ಷಣಾಪಟ್ಟಿನ್ ತೂಲೆ ಬೊಕ್ಕ ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
-       "specialpages": "ವಿಷೇಶ ಪುಟೊಲು",
-       "tag-list-wrapper": "([[ವಿಸೇಸೊ:ಟ್ಯಾಗುಲು|{{ಬಹುವಚನೊ:$1|ಟ್ಯಾಗ್|ಟ್ಯಾಗುಲು}}]]:$2)",
-       "logentry-delete-delete": "$1 {{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}} ಪುಟ $3",
-       "logentry-newusers-create": "ಬಳಕೆದಾರ ಖಾತೆ $1 ನ್ನು {{GENDER:$2|ಸೃಷ್ಟಿ ಮಲ್ತ್‍ದುಂಡು}}",
-       "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‍ದೆರ್}} $3",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ಪಾತೆರ್ಲೆ]])",
+       "specialpages": "ವಿಸೇಸೊ ಪುಟೊಲು",
+       "tag-filter": "[[Special:Tags|ಟ್ಯಾಗ್]]ಅರಿಪೆ:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|ಟ್ಯಾಗುಲು}}]]:$2)",
+       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}}ಪುಟೊ $3",
+       "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
+       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತ್‌ದ್ಂಡ್}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "ನಾಡ್‍ಲೆ"
 }
index 3e406c9..3ac1f1e 100644 (file)
        "upload-dialog-button-done": "เสร็จสิ้น",
        "upload-dialog-button-save": "บันทึก",
        "upload-dialog-button-upload": "อัปโหลด",
-       "upload-process-error": "เกิดข้อผิดพลาด",
-       "upload-process-warning": "เกิดคำเตือน",
        "upload-form-label-select-file": "เลือกไฟล์",
        "upload-form-label-infoform-title": "รายละเอียด",
        "upload-form-label-infoform-name": "ชื่อ",
index 0b89257..44d65fb 100644 (file)
        "nstab-template": "Şablon",
        "nstab-help": "Yardım sayfası",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Ana sayfa",
        "nosuchaction": "Böyle bir eylem yok",
        "nosuchactiontext": "URL tarafından tanımlanan eylem geçersiz.\nURL'yi yanlış yazmış olabilir, ya da doğru olmayan bir bağlantıyı takip etmiş olabilirsiniz.\nBu, {{SITENAME}} sitesindeki bir hatayı da belirtebilir.",
        "nosuchspecialpage": "Böyle bir özel sayfa yok",
        "createaccountreason": "Sebep:",
        "createacct-reason": "Gerekçe",
        "createacct-reason-ph": "Neden başka bir hesap oluşturuyorsunuz",
-       "createacct-captcha": "Güvenlik kontrolü",
-       "createacct-imgcaptcha-ph": "Yukarıda gördüğünüz metni girin",
        "createacct-submit": "Hesabınızı oluşturun",
-       "createacct-another-submit": "Başka bir hesap oluşturun",
+       "createacct-another-submit": "Hesap oluşturun",
        "createacct-benefit-heading": "{{SITENAME}} sizin gibi insanlar tarafından geliştirilir.",
        "createacct-benefit-body1": "{{PLURAL:$1|düzenleme|düzenleme}}",
        "createacct-benefit-body2": "{{PLURAL:$1|madde|madde}}",
        "createacct-benefit-body3": "en son {{PLURAL:$1|katkıda bulunan|katkıda bulunan}} kişi sayısı",
        "badretype": "Girdiğiniz şifreler birbirleriyle uyuşmuyor.",
+       "usernameinprogress": "Bu kullanıcı adı için bir hesap oluşturma zaten sürüyor. Lütfen bekleyin.",
        "userexists": "Girdiğiniz kullanıcı adı zaten kullanımda.\nLütfen farklı bir kullanıcı adı seçiniz.",
        "loginerror": "Oturum açma hatası.",
        "createacct-error": "Hesap oluşturma hatası",
        "passwordreset-emailtext-ip": "Birisi, (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için hesap bilgilerinizin \nhatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Şifre değişimini siz istemediyseniz veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
        "passwordreset-emailtext-user": "$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
        "passwordreset-emailelement": "Kullanıcı adı: \n$1\n\nGeçici şifre: \n$2",
-       "passwordreset-emailsent": "Parola sıfırlama e-postası gönderildi.",
+       "passwordreset-emailsent": "Eğer bu hesabınız için kayıtlı bir e-posta adresi ise, bir parola sıfırlama e-postası gönderilecektir.",
        "passwordreset-emailsent-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.",
        "passwordreset-emailerror-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1",
-       "changeemail": "E-posta adresini değiştir",
+       "changeemail": "E-posta adresini değiştir veya çıkar",
        "changeemail-header": "Hesabın e-posta adresini değiştirin",
+       "changeemail-passwordrequired": "Bu değişikliği onaylamak için şifrenizi girmeniz gerekir.",
        "changeemail-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "changeemail-oldemail": "Mevcut E-posta adresi:",
        "changeemail-newemail": "Yeni E-posta adresi:",
        "changeemail-password": "{{SITENAME}} parolanız:",
        "changeemail-submit": "E-posta'yı değiştir",
        "changeemail-throttled": "Çok fazla oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
+       "changeemail-nochange": "Lütfen farklı bir yeni e-posta adresi giriniz.",
        "resettokens": "Anahtarları sıfırla",
        "resettokens-text": "Burada hesabınızla ilişkili bazı özel verilere erişim izin anahtarları sıfırlayabilirsiniz.\n\n\nSiz yanlışlıkla bunları paylaştıysanız veya hesabınızda bir bozulma varsa bunu yapmalısınız.",
        "resettokens-no-tokens": "Sıfırlamak için hiç bir belirteç bulunmuyor.",
        "sig_tip": "İmzanız ve zaman",
        "hr_tip": "Yatay çizgi (çok sık kullanmayın)",
        "summary": "Özet:",
-       "subject": "Konu/başlık:",
+       "subject": "Konu:",
        "minoredit": "Bu küçük bir değişiklik",
        "watchthis": "Bu sayfayı izle",
        "savearticle": "Sayfayı kaydet",
        "missingsummary": "'''Uyarı:''' Herhangi bir özet yazmadın.\nKaydet tuşuna tekrar basarsan sayfa özetsiz kaydedilecek.",
        "selfredirect": "<strong>Uyarı:</strong> Bu sayfanın kendisine yönlendirme vardır.\nYönlendirme için yanlış hedef belirtmiş olabilirsiniz, ya da yanlış sayfa düzenlemeye çalışmış olabilirsiniz.\n\n\"{{int:savearticle}}\" sayfasına tıklayarak, yönlendirmeyi zaten oluşturabilirsiniz.",
        "missingcommenttext": "Lütfen aşağıda bir açıklama yazınız.",
-       "missingcommentheader": "'''Hatırlatma:''' Bu yorum için bir konu/başlık sunmadınız. Eğer \"{{int: savearticle}}\" tuşuna tekrar basarsanız, değişikliğiniz konu/başlık olmadan kaydedilecektir.",
+       "missingcommentheader": "<strong>Hatırlatma:</strong> Bu yorum için bir konu girmediniz.\nEğer \"{{int: savearticle}}\" tuşuna tekrar basarsanız, değişikliğiniz konu olmadan kaydedilecektir.",
        "summary-preview": "Ön izleme özeti:",
-       "subject-preview": "Konu/Başlık ön izlemesi:",
+       "subject-preview": "Konu ön izlemesi:",
        "previewerrortext": "Yaptığınız değişikliklerin önizlemesi sırasında bir hata oluştu.",
        "blockedtitle": "Kullanıcı erişimi engellendi.",
        "blockedtext": "'''Kullanıcı adı veya IP adresiniz engellenmiştir.'''\n\nSizi engelleyen hizmetli: $1.<br />\nEngelleme sebebi: ''$2''.\n\n* Engellenmenin başlangıcı: $8\n* Engellenmenin bitişi: $6\n* Engellenme süresi: $7\n\nBelirtilen nedene göre engellenmenizin uygun olmadığını düşünüyorsanız, $1 ya da başka bir [[{{MediaWiki:Grouppage-sysop}}|hizmetli]] ile bu durumu görüşebilirsiniz. [[Special:Preferences|Tercihlerim]] kısmında geçerli bir e-posta adresi girmediyseniz \"Kullanıcıya e-posta gönder\" özelliğini kullanamazsınız, tercihlerinize e-posta adresinizi eklediğinizde e-posta gönderme hakkına sahip olacaksınız.\n<br />Şu anki IP adresiniz $3, engellenme numaranız #$5.\n<br />Bir hizmetliden durumunuz hakkında bilgi almak istediğinizde veya herhangi bir sorguda bu bilgiler gerekecektir, lütfen not ediniz.",
        "yourdiff": "Karşılaştırma",
        "copyrightwarning": "'''Lütfen dikkat:''' {{SITENAME}} sitesine yapılan bütün katkılar $2 sözleşmesi kapsamındadır (ayrıntılar için $1'a bakınız).\nYaptığınız katkının başka katılımcılar tarafından acımasızca değiştirilmesini ve sınırsızca başka yerlere dağıtılmasını istemiyorsanız, katkıda bulunmayınız.<br />\nAyrıca buraya katkıda bulunarak, bu katkının kendiniz tarafından yazıldığına ya da kamuya açık bir kaynaktan ya da başka bir özgür/ücretsiz kaynaktan kopyalandığına güvence vermiş oluyorsunuz. '''Buraya, telif sahibinin izni olmadan telif hakkı ile korunan eserleri eklemeyiz! '''",
        "copyrightwarning2": "Lütfen, {{SITENAME}} sitesine bulunacağınız tüm katkıların diğer üyeler tarafından düzenlenebileceğini, değiştirilebileceğini ya da silinebileceğini hatırlayın. Yazılarınızın merhametsizce değiştirilebilmesine rıza göstermiyorsanız buraya katkıda bulunmayın. <br />\nAyrıca bu ekleyeceğiniz yazıyı sizin yazdığınızı ya da serbest kopyalama izni veren bir kaynaktan kopyaladığınızı bize taahhüt etmektesiniz (ayrıntılar için referans: $1).",
+       "editpage-cannot-use-custom-model": "Bu sayfanın içerik modeli değiştirilemez.",
        "longpageerror": "'''Hata: Girdiğiniz metnin uzunluğu kabul edilebilir en fazla uzunluk olan {{PLURAL:$2|bir kilobayt|$2 kilobayt}}tan fazladır ve {{PLURAL:$1|bir kilobayt|$1 kilobayt}} büyüklüğündedir.'''\nDeğişikliğiniz kaydedilemez.",
        "readonlywarning": "'''Uyarı: Bakım nedeniyle veritabanı şu anda kilitlenmiştir. Bu yüzden şu anda düzenlemelerinizi kaydetmek mümkün değildir.''' \nYaptığınız düzenlemeleri daha sonra kaydetmek isterseniz, yaptığınız düzenlemeleri bir metin dosyasına ya da herhangi bir şeye kopyala yapıştır yaparak saklayınız.\n\nKilitlemeyi yapan yetkili şu açıklamayı eklemiştir: $1",
        "protectedpagewarning": "'''Uyarı: Bu sayfa koruma altına alınmıştır ve yalnızca hizmetli olanlar tarafından değiştirilebilir.'''\nSon günlük girdisi referans amaçlı aşağıda verilmiştir:",
        "columns": "Sütun",
        "searchresultshead": "Arama",
        "stub-threshold": "<a href=\"#\" class=\"stub\">Taslak bağlantısı</a> formatı için baraj (bayt):",
+       "stub-threshold-sample-link": "örnek",
        "stub-threshold-disabled": "Devre dışı",
        "recentchangesdays": "Son değişikliklerde gösterilecek günler:",
        "recentchangesdays-max": "(en fazla $1 {{PLURAL:$1|gün|gün}})",
        "rcshowhidemine": "Benim değişikliklerimi $1",
        "rcshowhidemine-show": "göster",
        "rcshowhidemine-hide": "gizle",
+       "rcshowhidecategorization-show": "Göster",
+       "rcshowhidecategorization-hide": "Gizle",
        "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
        "diff": "fark",
        "hist": "geçmiş",
        "api-error-badaccess-groups": "Bu wiki için dosya yüklemenize izin verilmiyor.",
        "api-error-badtoken": "İç hata: Bozuk anahtar.",
        "api-error-copyuploaddisabled": "URL ile yükleme bu sunucuda devre dışı bırakılmıştır.",
-       "api-error-duplicate": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} var.",
+       "api-error-duplicate": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} mevcut.",
        "api-error-duplicate-archive": "Sitede zaten aynı içerikte başka {{PLURAL:$1|bir dosya|dosyalar}} vardı, ama {{PLURAL:$1|silindi|silindiler}}.",
        "api-error-empty-file": "Gönderdiğiniz dosya boş.",
        "api-error-emptypage": "Yeni, boş bir sayfa oluşturmaya izin verilmez.",
index e87ef3b..60fddad 100644 (file)
        "nstab-template": "Калып",
        "nstab-help": "Ярдәм",
        "nstab-category": "Төркем",
+       "mainpage-nstab": "Баш бит",
        "nosuchaction": "Мондый гамәл юк",
        "nosuchactiontext": "URLда күрсәтелгән гамәл хаталы.\nСез URLны хаталы җыйган яисә хаталы сылтамадан күчкән булырга мөмкинсез.\nБу шулай ук {{SITENAME}} проектындагы хата сәбәпле дә булырга мөмкин.",
        "nosuchspecialpage": "Мондый махсус бит юк",
        "createacct-email-ph": "Электрон почта юлламагызны языгыз",
        "createaccountmail": "электрон почта аша",
        "createaccountreason": "Сәбәп:",
-       "createacct-captcha": "Саклыкны тикшерү",
-       "createacct-imgcaptcha-ph": "Өстә күрсәтелгән текстны кертегез",
        "createacct-submit": "Хисап язмасы төзү",
        "createacct-benefit-heading": "{{SITENAME}} — сезнең шикелле кешеләрнең хезмәте.",
        "createacct-benefit-body1": "{{PLURAL:$1|төзәтмә}}",
        "passwordreset-emailsent-capture": "Җибәрелгән хат-искәртү түбәндә китерелә",
        "passwordreset-emailerror-capture": "Түбәндә язылган хат-искәртү китерелгән, аны җибәрмәүнең сәбәбе:$1",
        "changeemail": "Электрон әрҗә адресын үзгәртү",
-       "changeemail-text": "Электрон әрҗә адресын үзгәртү өчен, бу кырларны тутырыгыз. Үзгәртүне раслау өчен, сезгә серсүзне җыярга кирәк булыр",
+       "changeemail-header": "Электрон әрҗә адресын үзгәртү",
        "changeemail-no-info": "Бу сәхифәгә турыдан-туры мөрәҗәгать итәр өчен, сез системага керергә тиешсез",
        "changeemail-oldemail": "Хәзерге электрон әрҗә адресы:",
        "changeemail-newemail": "Яңа электрон почта адресы:",
index 6676160..a623dcb 100644 (file)
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Зберегти",
        "upload-dialog-button-upload": "Завантажити",
-       "upload-process-error": "Сталася помилка",
-       "upload-process-warning": "З'явилось попередження",
        "upload-form-label-select-file": "Обрати файл",
        "upload-form-label-infoform-title": "Деталі",
        "upload-form-label-infoform-name": "Назва",
index e835306..0592cb5 100644 (file)
        "november-date": "Noyabr $1",
        "december-date": "Dekabr $1",
        "pagecategories": "{{PLURAL:$1|Turkum}}",
-       "category_header": "\"$1\" turkumidagi sahifalar",
+       "category_header": "„$1“ turkumidagi sahifalar",
        "subcategories": "Ostturkumlar",
-       "category-media-header": "\"$1\" turkumidagi fayllar",
+       "category-media-header": "„$1“ turkumidagi fayllar",
        "category-empty": "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
        "hidden-categories": "{{PLURAL:$1|Yashirin turkum}}",
        "hidden-category-category": "Yashirin turkumlar",
        "portal-url": "Project:Jamoa portali",
        "privacy": "Maxfiylik siyosati",
        "privacypage": "Project:Maxfiylik siyosati",
-       "badaccess": "Ruxsatlilik xatosi",
+       "badaccess": "Ruxsat yoʻq",
        "badaccess-group0": "Sizda soʻralgan amallarni bajarish huquqi yoʻq.",
-       "badaccess-groups": "Soʻralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilari amalga oshirishi mumkin.",
+       "badaccess-groups": "Soʻralgan amallarni kamida «$1» {{PLURAL:$2|guruhi|guruhlari}} aʼzosi amalga oshirishi mumkin.",
        "versionrequired": "$1 versiyasidagi MediaWiki talab etiladi",
        "versionrequiredtext": "Bu sahifada ishlash uchun MediaWikining $1-versiyasi talab etiladi.\n[[Special:Version|Dasturiy taʼminot haqida axborot]]ni koʻring.",
        "ok": "OK",
        "retrievedfrom": " \"$1\" dan olindi",
-       "youhavenewmessages": "Sizga $1 keldi ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Sizga}} $1 keldi ($2).",
        "youhavenewmessagesfromusers": "Siz {{PLURAL:$3|boshqa foydalanuvchidan|$3 ta foydalanuvchidan}} $1 oldingiz ($2).",
        "youhavenewmessagesmanyusers": "Siz ko'p foydalanuvchilardan $1 oldingiz ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|yangi xabar|999=yangi xabarlar}}",
        "newmessagesdifflinkplural": "oxirgi {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
-       "youhavenewmessagesmulti": "Siz $1ga yangi xat oldingiz",
+       "youhavenewmessagesmulti": "Sizga $1da yangi xat keldi",
        "editsection": "tahrirlash",
        "editold": "tahrirlash",
        "viewsourceold": "manbasini koʻrish",
        "protectedpagetext": "Bu sahifa tahrirlash va boshqa oʻzgarishlar kiritishdan himoyalangan.",
        "viewsourcetext": "Siz bu sahifaning manbasini koʻrishingiz va uni nusxasini olishingiz mumkin:",
        "protectedinterface": "Ushbu sahifada dasturiy taʼminot interfeysi xabari mavjud. Bezoriliklardan saqlash uchun uni oʻzgartirish taʼqiqlangan.\nUshbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
-       "editinginterface": "'''Diqqat:''' Siz dasturiy taʼminot interfeysi matni mavjud boʻlgan sahifani tahrirlamoqdasiz.\nUning oʻzgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.\nUshbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
+       "editinginterface": "<strong>Eʼtibor bering:</strong> Siz interfeys matnini aks ettiruvchi sahifani tahrirlamoqdasiz.\nUning oʻzgartirilishi barcha ushbu vikidan foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.",
+       "translateinterface": "Ushbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
        "namespaceprotected": "Sizda '''$1''' nomfazosi sahifalarini tahrirlash huquqi yoʻq",
        "customcssprotected": "Sizda uchbu CSS sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
        "customjsprotected": "Sizda uchbu JavaScript sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
        "createaccountreason": "Sabab:",
        "createacct-reason": "Sabab",
        "createacct-reason-ph": "Nimaga yana boshqa hisob yaratyapsiz",
-       "createacct-captcha": "Xavfsizlik tekshiruvi",
-       "createacct-imgcaptcha-ph": "Yuqoridagi yozuvni bu yerga kiriting",
        "createacct-submit": "Hisob yaratish",
        "createacct-another-submit": "Boshqa hisob yaratish",
        "createacct-benefit-heading": "{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi",
-       "createacct-benefit-body1": "tahrirlar soni",
+       "createacct-benefit-body1": "{{PLURAL:$1|tahrirlar soni}}",
        "createacct-benefit-body2": "sahifalar soni",
        "createacct-benefit-body3": "soʻnggi paytdagi ishtirokchilar soni",
        "badretype": "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
        "passwordreset-email": "Elektron pochta manzilingiz:",
        "passwordreset-emailelement": "Foydalanuvchi ismi: \n$1\n\nVaqtinchalik maxfiy so'z: \n$2",
        "changeemail": "Elektron pochta manzilini oʻzgartirish",
+       "changeemail-header": "Elektron pochta manzilini o'zgaritish",
        "changeemail-oldemail": "Joriy elektron pochta manzili",
        "changeemail-newemail": "Elektron pochtaning yangi manzili",
        "changeemail-none": "(yoʻq)",
        "whitelistedittext": "Siz sahifalarni oʻzgartirish uchun $1.",
        "nosuchsectiontitle": "Boʻlimni topishni iloji yoʻq",
        "nosuchsectiontext": "Siz mavjud boʻlmagan boʻlimni tahrirlamoqchi boʻldingiz. Ushbu boʻlim sahifani koʻrayotganingizda oʻchirilgan yoki koʻchirilgan boʻlishi mumkin.",
-       "loginreqtitle": "Shaxsiyatni aniqlash talab etiladi",
+       "loginreqtitle": "Tizimga kirish talab etiladi",
        "loginreqlink": "Kirish",
        "loginreqpagetext": "Boshqa sahifalarni koʻrish uchun $1",
        "accmailtitle": "Maxfiy soʻz joʻnatildi",
        "nocreate-loggedin": "Sizda yangi sahifalar yaratishga ruxsat yoʻq.",
        "sectioneditnotsupported-title": "Boʻlimlarni tahrirlash imkoniyati yoʻq",
        "sectioneditnotsupported-text": "Ushbu sahifada boʻlimlarni tahrirlash imkoniyati yoʻq.",
-       "permissionserrors": "Ruxsat huquqida xato",
+       "permissionserrors": "Ruxsat yoʻq",
        "permissionserrorstext-withaction": "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga koʻra '''$2'''ga ruxsat mavjud emas:",
        "recreate-moveddeleted-warn": "<strong>Diqqat: Siz avval oʻchirilgan sahifani qaytadan yaratmoqchisiz.</strong>\n\nU avval nega oʻchirilgani bilan qiziqib koʻring.\nQuyida ushbu sahifaga oid oʻchirish va koʻchirish qaydlari keltirilgan:",
        "moveddeleted-notice": "Bu sahifa oʻchirilgan.\nMaʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.",
        "prefs-displayrc": "Tasvirlash moslamalari",
        "prefs-displaywatchlist": "Tasvirlash moslamalari",
        "prefs-diffs": "Versiyalar farqi",
-       "userrights": "Foydalanuvchi huquqlarini oʻzgartirish",
+       "userrights": "Huquqlarini oʻzgartirish",
+       "userrights-lookup-user": "Foydalanuvchini tanlash",
        "userrights-user-editname": "Foydalanuvchi nomi:",
-       "editusergroup": "Guruhlardagi aʼzoligini oʻzgartirish",
-       "userrights-groupsmember": "Aʼzolik:",
-       "userrights-groupsmember-auto": "Quyidagi guruhlarga kiradi:",
+       "editusergroup": "Shu foydalanuvchi huquqlarini oʻzgartirish",
+       "editinguser": "{{GENDER:$1|Foydalanuvchi}} <strong>[[User:$1|$1]]</strong> $2 huquqlarini oʻzgartirish",
+       "userrights-editusergroup": "Guruhlardagi aʼzoligini oʻzgartirish",
+       "saveusergroups": "Oʻzgarishlarni saqlash",
+       "userrights-groupsmember": "Ushbu guruhlar aʼzosi:",
+       "userrights-groupsmember-auto": "Shuningdek, ushbu texnik guruhlar aʼzosi:",
+       "userrights-groups-help": "Ushbu foydalanuvchining guruhlardagi aʼzoligini oʻzgartirishingiz mumkin:\n* Guruh nomi yonida belgi turgan boʻlsa, demak foydalanuvchi ushbu guruh aʼzosidir\n* Guruh nomi yonida belgi yoʻq boʻlsa, demak foydalanuvchi ushbu guruh aʼzosi emas\n* * (yulduzcha) belgisi foydalanuvchini guruhga qoʻshsangiz, qaytarib chiqarib tashlay olmasligingizni (yoki chiqarib tashlasangiz, qaytarib qoʻsha olmasligingizni) anglatadi",
        "userrights-reason": "Sabab:",
-       "userrights-changeable-col": "Siz o'zgartirishingiz mumkin bo'lgan guruhlar",
-       "userrights-unchangeable-col": "Siz o'zgartira olmaydigan guruhlar",
+       "userrights-changeable-col": "Quyidagi guruhlarga qoʻsha olasiz",
+       "userrights-unchangeable-col": "Quyidagi guruhlarga qoʻsha olmaysiz",
        "group": "Guruh",
        "group-user": "Foydalanuvchilar",
        "group-autoconfirmed": "Tasdiqlangan foydalanuvchilar",
        "action-move": "bu sahifani koʻchirish",
        "action-move-subpages": "Bu sahifani va uning ostsahifalarini koʻchirish",
        "action-deletedhistory": "ushbu sahifaning oʻchirilgan tarixini koʻrish",
+       "action-block": "ushbu foydalanuvchining tahrirlash imkoniyatlarini cheklash",
        "action-sendemail": "elektron xatlar jo'natish",
        "nchanges": "$1 {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
        "enhancedrc-history": "tarix",
        "statistics-users-active-desc": "Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar",
        "pageswithprop-prop": "Xossa nomi:",
        "pageswithprop-submit": "Oʻtish",
+       "brokenredirects-edit": "tahrirlash",
        "nbytes": "$1 {{PLURAL:$1|bayt}}",
        "ncategories": "$1 {{PLURAL:$1|turkum|turkumlar}}",
        "nmembers": "$1 {{PLURAL:$1|ta a'zo}}",
        "wantedcategories": "Talab qilinayotgan turkumlar",
        "mostcategories": "Eng koʻp turkumli sahifalar",
        "prefixindex": "Prefiksli barcha sahifalar",
+       "prefixindex-strip": "Natijalar roʻyxatida prefiks koʻrsatilmasin",
        "protectedpages": "Himoyalangan sahifalar",
        "listusers": "Foydalanuvchilar roʻyxati",
        "usercreated": "$1, $2 da {{GENDER:$3|roʻyxatdan oʻtgan}}",
        "prevpage": "Avvalgi sahifa ($1)",
        "allpagesfrom": "Quyidagidan boshlanuvchi sahifalarni koʻrsatish:",
        "allarticles": "Barcha sahifalar",
+       "allinnamespace": "$1 nomfazosidagi barcha sahifalar",
        "allpagessubmit": "Oʻtish",
        "allpagesprefix": "Shunday prefiksli sahifalarni koʻrsatish:",
        "allpages-hide-redirects": "Yoʻnaltirishlarni yashirish",
        "listgrouprights-rights": "Huquqlar",
        "listgrouprights-helppage": "Help:Guruhlar huquqlari",
        "listgrouprights-members": "(a’zolar ro‘yxati)",
-       "emailuser": "Foydalanuvchiga maktub",
+       "emailuser": "Maktub yuborish",
        "emailuser-title-target": "Ushbu {{GENDER:$1|foydalanuvchi}}ga maktub joʻnatish",
        "emailuser-title-notarget": "Foydalanuvchiga elektron maktub yozish",
        "defemailsubject": "{{SITENAME}} — $1 tomonidan maktub",
        "usermaildisabled": "Foydalanuvchi elektron pochtasi o‘chirilgan",
        "noemailtitle": "Elektron pochta manzili mavjud emas",
        "noemailtext": "Bu foydalanuvchi e-mail manzil koʻrsatgani yoʻq.",
-       "emailtarget": "Oluvchi ishtirokchining ismini kiriting",
+       "emailtarget": "Kimga xat joʻnatmoqchisiz?",
        "emailusername": "Foydalanuvchi nomi:",
-       "emailusernamesubmit": "Jo'natish",
-       "email-legend": "Boshqa {{SITENAME}} ishtirokchisiga xat jo'natish",
+       "emailusernamesubmit": "Joʻnatish",
+       "email-legend": "{{SITENAME}} loyihasining boshqa bir foydalanuvchisiga xat joʻnatish",
        "emailfrom": "Kimdan:",
        "emailto": "Kimga:",
        "emailsubject": "Sarlavha:",
        "emailsend": "Joʻnatish",
        "emailccme": "Maktub nusxasi mening elektron pochtamga joʻnatilsin",
        "emailccsubject": "$1ga maktubingizning nusxasi: $2",
-       "emailsent": "Xat jo'natildi",
+       "emailsent": "Xat joʻnatildi",
        "emailsenttext": "Sizning elektron maktubingiz jo'natildi.",
        "usermessage-summary": "Tizimli xabar qoldirish.",
        "usermessage-editor": "Tizimli etkazish",
        "nowatchlist": "Kuzatuv roʻyxatingizda hech nima yoʻq.",
        "watchnologin": "Siz tizimda o'zingizni tanishtirmadingiz",
        "addwatch": "Kuzatuv ro'yxatiga qo'shish",
-       "addedwatchtext": "\"[[:$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi. Bu sahifada va uning munozara sahifasida boʻladigan oʻzgarishlar u yerda koʻrsatiladi.",
+       "addedwatchtext": "„[[:$1]]“ sahifasi (va uning munozara sahifasi) [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi.",
        "removewatch": "Kuzatuv roʻyxatidan oʻchirish",
-       "removedwatchtext": "\"[[:$1]]\" sahifasi [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.",
+       "removedwatchtext": "„[[:$1]]“ sahifasi (va uning munozara sahifasi) [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.",
        "watch": "Kuzatish",
        "watchthispage": "Sahifani kuzatish",
        "unwatch": "Kuzatmaslik",
        "undeleteviewlink": "koʻrib chiqish",
        "undeleteinvert": "Tanlash tartibini almashtirish",
        "undeletecomment": "Sababi:",
+       "undeletedrevisions": "{{PLURAL:$1|1 ta oʻzgarish|$1 ta tahrirlar}} tiklandi",
+       "undeletedfiles": "$1 ta fayl tiklandi",
        "undelete-search-title": "O'chirilgan sahifalarni qidirish",
        "undelete-search-box": "O'chirilgan sahifalarni qidirish",
        "undelete-search-prefix": "Bundan boshlangan sahifalarni koʻrsatish:",
        "sp-contributions-toponly": "Faqat oxirgi deb hisoblangan tahrirlarni koʻrsat",
        "sp-contributions-submit": "Qidirish",
        "whatlinkshere": "Bogʻliq sahifalar",
-       "whatlinkshere-title": "\"$1\"ga bogʻlangan sahifalar",
+       "whatlinkshere-title": "„$1“ga bogʻlangan sahifalar",
        "whatlinkshere-page": "Sahifa:",
        "linkshere": "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bogʻlangan:",
        "nolinkshere": "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
        "autoblockid": "Avtochetlashtirish #$1",
        "block": "Foydalanuvchini chetlashtirish",
        "unblock": "Foydalanuvchiga yo'l ochish",
-       "blockip": "{{GENDER:$1|Foydalanuvchini}} chetlashtirish",
+       "blockip": "Chetlashtirish",
        "blockip-legend": "Foydalanuvchini chetlashtirish",
        "ipaddressorusername": "IP-manzil yoki foydalanuvchi nomi:",
        "ipbexpiry": "Tugash muddati:",
        "ipbreason": "Sabab:",
        "ipbreason-dropdown": "* Chetlashtirishning odatiy sabablari\n** Yolgʻon maʼlumot kiritish\n** Sahifa matnini toʻliq oʻchirish\n** Tashqi saytlarga spam-havolalar\n** Maʼnosiz matn/axlat qoʻshish\n** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish\n** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish\n** Nomaqbul foydalanuvchi nomi",
+       "ipb-hardblock": "Tasdiqlangan foydalanuvchilarga ham ushbu IP-manzildan tahrirlashni taʼqiqlash",
+       "ipbcreateaccount": "Yangi hisob yozuvlari yaratishni taʼqiqlash",
+       "ipbemailban": "Elektron pochta orqali maktub joʻnatishni taʼqiqlash",
+       "ipbenableautoblock": "Foydalanuvchiga tegishli boʻlgan va unga aloqasi bor IP-manzillarni avtomatik chetlashtirish",
        "ipbsubmit": "Ushbu foydalanuvchini chetlashtirish",
        "ipbother": "Boshqa muddat:",
        "ipboptions": "2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite",
+       "ipbwatchuser": "Foydalanuvchining shaxsiy sahifasini va munozara sahifasini kuzatuv roʻyxatimga qoʻshish",
+       "ipb-disableusertalk": "Oʻz munozara sahifasini tahrirlashni ham taʼqiqlash (chetlatish muddati davomida)",
        "ipb-edit-dropdown": "Sabablar ro‘yxatini tahrirlash",
        "ipb-unblock-addr": "$1dan toʻsiqni olish",
+       "ipb-unblock": "Foydalanuvchidan (yoki IP-manzildan) toʻsiqni olib tashlash",
+       "ipb-blocklist": "Mavjud chetlatishlarni koʻrsat",
        "unblockip": "Foydalanuvchidan to‘siqni olib tashlash",
        "ipusubmit": "Ushbu chetlashtirishni olib tashlash",
        "unblocked": "[[User:$1|$1]]dan to‘siq olib tashlandi",
        "unblocked-range": "$1dan to‘siq olib tashlandi",
        "blocklist": "Chetlashtirilgan foydalanuvchilar",
        "ipblocklist": "Chetlashtirilgan foydalanuvchilar",
+       "ipblocklist-legend": "Chetlatilgan foydalanuvchini qidirish",
        "blocklist-timestamp": "Sana/vaqt",
-       "blocklist-target": "Maqsad",
+       "blocklist-target": "Chetlatiluvchi",
        "blocklist-expiry": "Tugaydi",
-       "blocklist-by": "Chetlashtirgan maʻmur",
+       "blocklist-by": "Chetlashtirgan administrator",
        "blocklist-params": "Chetlashtirish moslamalari",
        "blocklist-reason": "Sabab",
        "ipblocklist-submit": "Qidiruv",
        "block-log-flags-nousertalk": "o'zining munozara sahifasini tahrirlay olmaydi",
        "move-page": "$1 — qayta nomlash",
        "move-page-legend": "Sahifani qayta nomlash",
-       "movearticle": "Hozirgi nomi:",
        "newtitle": "Yangi nom:",
        "move-watch": "Ushbu sahifani kuzatuv roʻyxatingizga qoʻshish",
        "movepagebtn": "Sahifani koʻchirish",
        "thumbnail_error": "Tasvir yaratishda xatolik: $1",
        "importlogpage": "Import qilish qaydlari",
        "tooltip-pt-userpage": "Foydalanuvchi sahifangiz",
-       "tooltip-pt-anonuserpage": "Siznig ip manzilingiz foydalanuvchi sahifasi",
+       "tooltip-pt-anonuserpage": "Siznig IP-manzilingiz uchun foydalanuvchi sahifasi",
        "tooltip-pt-mytalk": "Suhbat sahifangiz",
        "tooltip-pt-anontalk": "Bu ip manzildan amalga oshirilgan tahrirlar munozarasi",
        "tooltip-pt-preferences": "Moslamalaringiz",
        "tooltip-feed-rss": "Bu sahifa uchun RSS ta'minot",
        "tooltip-feed-atom": "Bu sahifa uchun Atom ta'minot",
        "tooltip-t-contributions": "Ushbu foydalanuvchi qoʻshgan hissasini koʻrish",
-       "tooltip-t-emailuser": "Ushbu foydalanuvchiga xat jo‘natish",
+       "tooltip-t-emailuser": "Ushbu foydalanuvchiga elektron maktub yozish",
        "tooltip-t-upload": "Rasmlar yoki media fayllar yuklash",
        "tooltip-t-specialpages": "Maxsus sahifalar ro‘yxati",
        "tooltip-t-print": "Ushbu sahifaning bosma uchun versiyasi",
        "pageinfo-redirectsto": "Qayta yoʻnaltirish",
        "markaspatrolledtext": "Bu sahifani tekshirilgan deb belgilash",
        "markedaspatrolledtext": "[[:$1]] sahifasining ushbu versiyasi tekshirilgan deb belgilandi.",
-       "markedaspatrollednotify": "[[:$1]] sahifasidagi ushbu oʻzgarish tekshirilgan deb belgilandi.",
+       "markedaspatrollednotify": "„$1“ sahifasidagi ushbu oʻzgarish tekshirilgan deb belgilandi.",
+       "markedaspatrollederrornotify": "Oʻzgarishni tekshirilgan deb belgilab boʻlmadi.",
        "patrol-log-page": "Patrullash qaydlari",
        "previousdiff": "← Avvalgi tahrir",
        "nextdiff": "Keyingi tahrir →",
        "table_pager_first": "Birinchi sahifa",
        "table_pager_last": "Oxirgi sahifa",
        "table_pager_limit_label": "Bir sahifadagi yozuvlar soni:",
-       "autosumm-blank": "Sahifa tozalandi",
+       "autosumm-blank": "Sahifadagi barcha matn oʻchirib tashlandi",
        "autoredircomment": "[[$1]]ga yoʻnaltirildi",
-       "autosumm-new": "\"$1\" yozuvi orqali yangi sahifa yaratildi",
+       "autosumm-new": "„$1“ yozuvi orqali yangi sahifa yaratildi",
        "size-bytes": "$1 bayt",
        "watchlisttools-view": "Mos oʻzgarishlar",
        "watchlisttools-edit": "Kuzatuv roʻyxatimni koʻrish/oʻzgartirish",
        "htmlform-reset": "Oʻzgarishlarni bekor qilish",
        "htmlform-selectorother-other": "Boshqa",
        "logentry-delete-delete": "$1 $3 sahifasini {{GENDER:$2|oʻchirdi}}",
+       "logentry-delete-restore": "$1 $3 sahifasini {{GENDER:$2|tikladi}}",
        "logentry-move-move": "$1 $3 sahifasini $4ga koʻchirdi",
        "logentry-move-move-noredirect": "$1 $3 sahifasini $4ga {{GENDER:$2|koʻchirdi}}",
        "logentry-move-move_redir": "$1 sahifa nomini $3dan $4ga yoʻnaltirish ustidan {{GENDER:$2|koʻchirdi}}",
index 7ce35cd..8703ea8 100644 (file)
        "upload-dialog-button-done": "Xong",
        "upload-dialog-button-save": "Lưu",
        "upload-dialog-button-upload": "Tải lên",
-       "upload-process-error": "Đã xuất hiện lỗi",
-       "upload-process-warning": "Đã xuất hiện cảnh báo",
        "upload-form-label-select-file": "Chọn tập tin",
        "upload-form-label-infoform-title": "Chi tiết",
        "upload-form-label-infoform-name": "Tên",
index cf2158e..25e2a0b 100644 (file)
@@ -17,6 +17,7 @@
        "tog-hideminor": "Tago-a an mga gagmay nga pagliwat ha mga bag-o pa la nga mga kabag-ohan",
        "tog-hidepatrolled": "Tago-a in mga gin-patrol o binantayan nga mga pagliwat ha mga dipala naiha nga mga kabag-ohan",
        "tog-newpageshidepatrolled": "Tago-a an mga gin-patrol o binantayan nga mga pakli tikang han talaan hin bag-o nga pakli",
+       "tog-hidecategorization": "Igtago an kategorisasyon han mga pakli",
        "tog-extendwatchlist": "Padako-a an angay timan-an agod makita an tanan nga kabag-ohan, diri la an gibag-ohi",
        "tog-usenewrc": "Grupo nga mga pagbag-o kada pakli ha kababag-o pala ngan mga barantayon nga talaan",
        "tog-numberheadings": "Auto-nga-ihap nga mga pagngaran",
@@ -27,6 +28,7 @@
        "tog-watchdefault": "Igdugang in mga pakli ngan mga paypay nga akon ginliwat ngadto han akon angay timan-an",
        "tog-watchmoves": "Igdugang in mga pakli nga mga paypay nga akon ginpamalhin ngadto han akon angay timan-an",
        "tog-watchdeletion": "Igdugang in mga pakli ngan mga paypay nga akon ginpamara ngadto han akon angay timan-an",
+       "tog-watchrollback": "Igdugang an mga pakli ha akon watchlist an ak mga gin-rollback",
        "tog-minordefault": "Tigamni an ngatanan nga mga pagliwat nga gudti hin default",
        "tog-previewontop": "Igpakita in prevista o pan-ugsa-nga-lantaw ugsa hiton pagliwat nga kahon",
        "tog-previewonfirst": "Igpakita in prevista o pan-ugsa-nga-lantaw ha syahan nga pagliwat",
@@ -37,7 +39,7 @@
        "tog-shownumberswatching": "Igpakita an ihap han mga nangingita nga mga nagamit",
        "tog-oldsig": "Aada nga pirma:",
        "tog-fancysig": "Tratuha it pirma komo uska wikitext (nga waray automatiko nga sumpay)",
-       "tog-uselivepreview": "Gamita an buhi nga pahiuna nga pagawas (eksperimental)",
+       "tog-uselivepreview": "Gamita an buhi nga pahiuna nga pagawas",
        "tog-forceeditsummary": "Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)",
        "tog-watchlisthideown": "Tago-a an akon mga ginliwat tikang han angay timan-an",
        "tog-watchlisthidebots": "Tago-a an ginliwat hin bot tikang han angay timan-an",
@@ -45,6 +47,7 @@
        "tog-watchlisthideliu": "Igatag an mga ginliwat han naka log-in nga mga gumaramit tikang ha gintitiman-an",
        "tog-watchlisthideanons": "Igtago an mga ginliwat han mga waray nagpakilala nga nagamit tikang ha gintitiman-an",
        "tog-watchlisthidepatrolled": "Igatag an mga pinatrolya nga mga pagliwat tikang ha angay timan-an",
+       "tog-watchlisthidecategorization": "Igtago an kategorisasyon han mga pakli",
        "tog-ccmeonemails": "Padad-i ak hin mga kopya hin mga email nga akon ginpapadara ha iba nga mga gumaramit",
        "tog-diffonly": "Ayaw igpakita an sulod han pakli ha ilarom han pagkakaiba",
        "tog-showhiddencats": "Igpakita an mga tinago nga mga kaarangay",
        "pool-queuefull": "Puno an katitirok nga pila",
        "pool-errorunknown": "Waray kasabti nga kasaypanan",
        "pool-servererror": "An pool nga pag-ihap nga serbisyo diri yanâ magagamit ($)",
+       "poolcounter-usage-error": "Sayop ha paggamit: $1",
        "aboutsite": "Mahitungod han {{SITENAME}}",
        "aboutpage": "Project:Mahitungod han",
        "copyright": "An sulod mabiblingan ha ilarom han $1 antes may-ada pasabot.",
        "disclaimers": "Mga Disclaimer",
        "disclaimerpage": "Project:Kasahiran nga disclaimer",
        "edithelp": "Bulig hin pagliwat",
+       "helppage-top-gethelp": "Bulig",
        "mainpage": "Syahan nga Pakli",
        "mainpage-description": "Syahan nga Pakli",
        "policy-url": "Project:Polisiya",
        "hidetoc": "tago-a",
        "collapsible-collapse": "Rumpag",
        "collapsible-expand": "Latag",
+       "confirmable-confirm": "Sigurado {{GENDER:$1|ka}}?",
+       "confirmable-yes": "Oo",
+       "confirmable-no": "Diri",
        "thisisdeleted": "¿Kitaa o balika in $1?",
        "viewdeleted": "¿Kitaa in $1?",
        "restorelink": "{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}",
        "nstab-template": "Batakan",
        "nstab-help": "Pakli hin bulig",
        "nstab-category": "Kaarangay",
+       "mainpage-nstab": "Panguna nga pakli",
        "nosuchaction": "Waray sugad nga buhat",
        "nosuchactiontext": "An buhat nga gin-ispisipikar han URL diri puyde.\nBangin la, nagsayop ka pagmakinilya han URL, o sinmunod hin sayop nga sumpay.\nBangin liwat ini usa nga bug dida han software nga ginagamit han {{SITENAME}}.",
        "nosuchspecialpage": "Waray sugad nga pinaurog nga pakli",
        "readonly_lag": "Ginlugaring pagtranka han database samtang an mga nasunod nga mga database nga server naglalanat pa han agaron",
        "internalerror": "Sayop ha sulod",
        "internalerror_info": "Sayop ha sulod: $1",
+       "internalerror-fatal-exception": "Fatal exception han klase \"$1\"",
        "filecopyerror": "Diri nakokopya an paypay nga ''$1'' ha ''$2''.",
        "filerenameerror": "Diri nababalyuan an ngaran han paypay nga ''$1'' ha ''$2''.",
        "filedeleteerror": "Diri napapara an paypay nga ''$1''.",
        "directorycreateerror": "Waray makahimo han direktoryo nga \"$1\".",
+       "directoryreadonlyerror": "Direktorya \"$1\" in pagbasa la.",
+       "directorynotreadableerror": "Direktorya \"$1\" in diri nababasahan.",
        "filenotfound": "Diri nabibilngan an paypay nga \"$1\"",
        "unexpected": "Diri ginlalauman nga balor: \"$1\"=\"$2\".",
        "formerror": "Sayop: Diri nasusumite an porma.",
        "no-null-revision": "Diri nakakahimo hin bag-o nga null rebisyon para han pakli \"$1\"",
        "badtitle": "Maraot nga titulo",
        "badtitletext": "An ginhangyo nga pakli diri puyde, waray sulod, o sayop nga nasumpay nga inter-pinunongan o inter-wiki nga titulo.\nBangin mayda usa o damo nga mga agi nga diri puyde magamit ha mga titulo.",
+       "title-invalid-empty": "An ginhangyo nga titulo han pakli in waray sulod o nagsusulod la han ngaran han uska ngaran-latáng.",
+       "title-invalid-utf8": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid UTF-8 sequence.",
+       "title-invalid-interwiki": "An ginhangyo nga titulo han pakli in nagsusulod hin uska interwiki nga sumpay nga diri magagamitan ha mga titulo.",
+       "title-invalid-talk-namespace": "An ginhangyo nga titulo hin pakli in natudlok ha hiruhimangraw nga pakli nga waray pa.",
+       "title-invalid-characters": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid characters: \"$1\".",
+       "title-invalid-relative": "An titulo in may-ada relative path. An mga relative page title (./, ../) in diri gintutugotan, tungod nga hira in agsob diri maaabtan kun gamiton han kanan gumaramit browser.",
+       "title-invalid-magic-tilde": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid magic tilde sequence (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "An ginhangyo nga titulo han pakli in halaba hin duro. Diri dapat mas halaba kaysa $1 {{PLURAL:$1|ka byte|ka mga byte}} ha UTF-8 encoding.",
+       "title-invalid-leading-colon": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid colon ha katikangan.",
        "perfcached": "An nasunod nga data gin-cache ngan bangin diri amo an yana. In maximum hin {{PLURAL:$1|usa ka resulta|$1 ka mga resulta}} aada hit cache.",
        "perfcachedts": "An nasunod nga data gin-cache, ngan kataposan ginbag-o dida han $1. In maximum hin {{PLURAL:$4|usa ka resulta|$4 ka resulta}} aada hit cache.",
        "querypage-no-updates": "An mga kabag-ohan para hini nga pakli ha yana diri mahihimo.\nAn data dini diri mahihimo nga bag-o.",
        "viewsource": "Kitaa an ginkuhaan",
        "viewsource-title": "Kitaa an tinikangan para han $1",
        "actionthrottled": "Ginpahinay an ginbuhat",
-       "actionthrottledtext": "Komo uska pangontra ha spam, ikaw in ginlilimitaran paghimo hini nga pagbuhat hin sobra kadamo ha sulod hin gutiay nga oras, ngan ikaw in naglapos hini nga katubtuban.\nAlayon pagutro kahuman hin pipira ka mga minuto.",
+       "actionthrottledtext": "Komo uska pangontra han abuso, ikaw in ginlilimitahan paghimo hini nga pagbuhat hin sobra kadamo ha sulod hin gutiay nga panahon, ngan ikaw in naglapos hini nga katubtuban.\nAlayon pagutro kahuman hin pipira ka mga minuto.",
        "protectedpagetext": "Ginpanalipdan ini nga pakli basi mapugngan an pagliwat o iba pa nga mga maburuhat.",
-       "viewsourcetext": "Puydi ka kinmita ngan kinmopya han gintikangan han pakli:",
-       "viewyourtext": "Puydi nim makit-an ngan makopya an tinikangan han '''imo mga pagliwat''' ha dinhi nga pakli:",
+       "viewsourcetext": "Puydi ka kumita ngan kumopya han gintikangan han pakli.",
+       "viewyourtext": "Puydi nim makit-an ngan makopya an tinikangan <strong>imo mga pagliwat</strong> dinhi nga pakli:",
        "protectedinterface": "Ini nga pakli in nahatag hin teksto hit interface para han software han hin nga wiki, ngan in pinasasaliporan para makalikay hit pag-abuso.\nPara makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an kanan MediaWiki proyekto hin lokalisasyon.",
        "editinginterface": "'''Pahimatngon:''' Imo ginliliwat an pakli nga gingagamit paghatag hin interface text para han software.\nAn mga pagbag-o hini nga pakli in makakaapekto han user interface han iba nga mga gumaramit hini nga wiki.\nPara makadugang o makabag-o han mga paghubad para han ngatanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an lokalisasyon nga proyekto han MediaWiki.",
        "cascadeprotected": "Ini nga pakli in pinapasaliporan hin pagliwat tungod ini in nalalakip ha masunod nga {{PLURAL:$1|pakli, kun diin |mga pakli, kun diin}} pinapasaliporan hit \"cascading\" nga pagpili nga pinaandar:\n$2",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Kay ano nahimo ka hin usa pa nga akawnt",
-       "createacct-captcha": "Pagkita han seguridad",
-       "createacct-imgcaptcha-ph": "Igbutang an sinurat nga nakikita mo ha igbaw",
        "createacct-submit": "Ighimo an im akawnt",
-       "createacct-another-submit": "Paghimo hin lain nga akant",
+       "createacct-another-submit": "Paghimo hin account",
        "createacct-benefit-heading": "{{SITENAME}} in ginhimo hin tawo nga sugad ha imo.",
        "createacct-benefit-body1": "{{PLURAL:$1|pagliwat|mga pagliwat}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ka pakli|ka mga pakli}}",
        "createacct-benefit-body3": "bag-o pala nga {{PLURAL:$1|mag-aramot|mga mag-aramot}}",
        "badretype": "Diri naangay an mga tigaman-pagsulod nga im ginbutang",
+       "usernameinprogress": "An paghimo hin account para hinin nga ngaran hit gumaramit in ginpoproseso na. Alayon paghulat.",
        "userexists": "An agnay hiton gumaramit nga im ginbutang in gingamit na.\nAlayon pagpili hin lain nga ngaran.",
        "loginerror": "Sayop hin pagsakob",
        "createacct-error": "Pakyas an paghimo han akawnt",
        "wrongpassword": "Sayop nga tigaman-pagsulod an nahibutang.\nAlayon pagutro pagbutang.",
        "wrongpasswordempty": "An tigaman-pagsulod nga ginbutang in waray sulod.\nAlayon pagutro pagbutang.",
        "passwordtooshort": "An tigaman-pagsulod dapat diri maubos hit {{PLURAL:$1|1 nga agi|$1 nga agi}}.",
+       "passwordtoolong": "It mga password in diri puydi mas huruhilaba hin {{PLURAL:$1|1 ka karakter|$1 ka mga karakter}}.",
        "password-name-match": "An imo tigaman-pagsulod in kinahanglan iba ha imo agnay-hiton-gumaramit.",
        "password-login-forbidden": "An paggamit hini nga agnay-hit-gumaramit ngan tigaman-pagsulod in diri gintutugotan.",
        "mailmypassword": "Ig-reset an tigaman-pagsulod",
        "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 ha  {{GENDER:$2|gumaramit}}: $1",
-       "changeemail": "Igliwan an e-mail address",
+       "changeemail": "Igliwat o igtanggal an e-mail address",
        "changeemail-header": "Igliwan an e-mail address akawnt",
+       "changeemail-passwordrequired": "Kinahanglan nim igbutang an imo password para igkompirma inin nga pagbag-o.",
        "changeemail-no-info": "Kinahanglanon mo mag-log-in para ka direkta makasakob hini nga pakli.",
        "changeemail-oldemail": "Yana nga e-mail address:",
        "changeemail-newemail": "Bag-o nga e-mail address:",
        "log-fulllog": "Kitaa an bug-os nga taramdan",
        "edit-conflict": "Diri pagkakauroyon han pagliwat.",
        "edit-no-change": "Ginpabay-an an im pagliwat, mahitungod nga waray pagbalyo nga nabuhat ha nakasurat.",
+       "postedit-confirmation-created": "Nahimo an pakli.",
        "postedit-confirmation-saved": "Natipig an imo ginliwat.",
        "edit-already-exists": "Diri nakakahimo hin bag-o nga pakli.\nAada na ito.",
        "defaultmessagetext": "Aada-nga-daan nga teksto han mensahe",
        "compareselectedversions": "Igkumpara an mga pinili nga pagbabag-o",
        "editundo": "Igpawara an ginbuhat",
        "diff-empty": "(Waray pagkakaiba)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Usa nga intermediate revision|$1 mga intermediate revision}} han pareho nga gumaramit nga waray ginpakita)",
        "diff-multi-manyusers": "({{PLURAL:$1|Uska sapit-nahiuna nga rebisyon|$1 nga mga sapit-nanhiuna nga rebisyon}} nga may labaw nga $2 {{PLURAL:$2|gumaramit|mga gumaramit}} in diri ginpapakita)",
        "searchresults": "Mga nabilingan han pagbiling",
        "searchresults-title": "Mga nabilngan han pagbiling para han \"$1\"",
        "search-relatedarticle": "kasumapy",
        "searchrelated": "kadugtong",
        "searchall": "ngatanan",
+       "search-showingresults": "{{PLURAL:$4|Resulta <strong>$1</strong> han <strong>$3</strong>|Mga resulta <strong>$1 - $2</strong> han <strong>$3</strong>}}",
        "search-nonefound": "Waray resulta an nakakabaton han pakiana.",
        "powersearch-legend": "Abansado nga pagbiling",
        "powersearch-ns": "Pamiling ha mga ngaran-lat'ang:",
        "right-upload_by_url": "Igkarga paigbaw an mga paypay tikang ha uska URL",
        "right-autoconfirmed": "Diri malalalbtan hin IP-nga-nahibasi nga mga rate hin paglimit",
        "right-bot": "Igtrato komo uska naglulugaring nga proseso",
+       "right-writeapi": "Paggamit han write API",
        "right-delete": "Igpara an mga pakli",
        "right-bigdelete": "Igpara an mga pakli nga may-ada dagko nga mga kaagi",
        "right-browsearchive": "Pamiling hin mga ginpara nga mga pakli",
        "recentchanges-label-unpatrolled": "Ini nga pagliwat in diri pa nakapatrol",
        "recentchanges-label-plusminus": "An kadako han pakli in nabag-o hin ini nga numero nga mga byte",
        "recentchanges-legend-heading": "'''Leyenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaa gihapon [[Special:NewPages|talaan han mga bag-o nga pakli]])",
        "rcnotefrom": "An ha ubos in mga pagbabag-o tikang han <strong>$2</strong> (kutob ngadto ha <strong>$1</strong> nga ginpakita).",
        "rclistfrom": "Pakit-a an mga ginbag-ohan tikang han $3 $2",
        "rcshowhideminor": "$1 gudti nga mga pagliwat",
        "upload-file-error": "Sayop ha sulod",
        "upload-misc-error": "Waray kasasabti nga sayop hin pagkarga-paigbaw",
        "upload-http-error": "Mayda nahitabo nga sayop hin HTTP: $1",
+       "upload-dialog-button-cancel": "Pasagda",
+       "upload-dialog-button-done": "Tima na",
+       "upload-dialog-button-save": "Igtipig",
+       "upload-dialog-button-upload": "Upload",
+       "upload-form-label-select-file": "Pagpili hin file",
+       "upload-form-label-infoform-title": "Mga detalye",
+       "upload-form-label-infoform-name": "Ngaran",
+       "upload-form-label-usage-title": "Paggamit",
+       "upload-form-label-usage-filename": "Ngaran han file",
+       "foreign-structured-upload-form-label-own-work": "Buhat ko ini",
+       "foreign-structured-upload-form-label-infoform-categories": "Mga kategorya",
+       "foreign-structured-upload-form-label-infoform-date": "Petsa",
        "backend-fail-notexists": "Waray ngada an paypay nga $1.",
        "backend-fail-delete": "Diri nakakapara han paypay nga \"$1\".",
        "backend-fail-alreadyexists": "May-ada na paypay nga \"$1\".",
        "undelete-show-file-submit": "Oo",
        "namespace": "Ngaran-lat'ang",
        "invert": "Baliskara an pirilion",
+       "tooltip-invert": "Ig-check inin nga kahon para igtago an mga pagbag-o han mga pakli ha sulod han pipira nga ngaran-latáng (ngan an may pagkahisumpay nga ngaran-latáng kun gin-check)",
        "namespace_association": "Kasumpay nga mga ngaran-lat'ang",
+       "tooltip-namespace_association": "Igcheck inin nga kahon para liwat iglakip an hiruhimangraw o himangrawon nga ngaran-latáng nga may pagkahisumpay ha pinili nga ngaran-lat'ang",
        "blanknamespace": "(Panguna)",
        "contributions": "Mga ámot ni {{GENDER:$1|User}}",
        "contributions-title": "Mga amot han gumaramit para ha $1",
        "tooltip-ca-nstab-main": "Kitaa an sulod nga pakli",
        "tooltip-ca-nstab-user": "Kitaa an pakli han gumaramit",
        "tooltip-ca-nstab-media": "Kitaa an pakli hin media",
-       "tooltip-ca-nstab-special": "Pinaurog nga pakli ini, diri ka ngahaw makakapagliwat han pakli",
+       "tooltip-ca-nstab-special": "Pinaurog ini nga pakli, ngan diri ini maililiwat",
        "tooltip-ca-nstab-project": "Kitaa an pakli han proyekto",
        "tooltip-ca-nstab-image": "Kitaa an pakli han fayl",
        "tooltip-ca-nstab-mediawiki": "Kitaa an mensahe han sistema",
        "othercontribs": "Ginbasihan ha binuhat ni $1.",
        "others": "mga iba",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|gumaramit|mga gumaramit}} $1",
+       "simpleantispam-label": "Anti-spam check.\n<strong>Ayaw</strong> pagbinutangi dinhi!",
        "pageinfo-title": "Impormasyon para \"$1\"",
        "pageinfo-header-basic": "Panguna nga pananabotan",
        "pageinfo-header-edits": "Kaagi han pagliwat",
        "metadata-fields": "An mga rumbay han hulagway han metadato nga nakatala dinhi nga mensahe in iglalakip ha padayag hin hulagway nga pakli kun an taramdan metadato in nakalukot.\nAn iba in daan nakatago.\n* make\n* modelo\n* pitsaorasorihinal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpsngalatitud\n* gpsngalongitud\n* gpsngaaltitud",
        "exif-imagewidth": "Kahaluag",
        "exif-imagelength": "Kahitaas",
+       "exif-orientation": "Orientation",
        "exif-ycbcrpositioning": "Pagpoposisyon han Y ngan C",
        "exif-xresolution": "Resolusyon horizontal",
        "exif-yresolution": "Resolusyon vertical",
        "external_image_whitelist": "#Pabay-i ini nga linea nga sugad gud la <pre>\n#Igbutang in mga regular nga expresyon nga mga fragment (iton bahin nga ada ha butnga han //) ha ubos\n#Ini igpapadis han mga URL han mga ha gawas (gin-hotlink) nga mga hulagway\n#An mga nasakto igpapakita nga mga hulagway, kon diri, sumpay la ngadto han hulagway an igpapakita\n#Mga linea nga natikang hin  # ginta-tratar nga mga komento\n# Case-insensitive ini\n\n#Igbutang an mga regex nga fragment ha igbaw hini nga linea. Pabay-i ini nga linea nga sugad gud la</pre>",
        "tag-filter": "[[Special:Tags|Tag]] panara:",
        "tag-filter-submit": "Panara",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ka tag|ka mga tag}}]]: $2)",
        "tags-edit": "igliwat",
        "tags-hitcount": "$1 {{PLURAL:$1|nga pagbag-o|nga mga pagbag-o}}",
        "comparepages": "Igkumpara an mga pakli",
index 80de25e..288734a 100644 (file)
        "editfont-monospace": "Dayoob mbind genn dig-digal",
        "editfont-sansserif": "Dayoob mbind bu amul-dig",
        "editfont-serif": "Dayoob mbind bu am-dig",
-       "sunday": "dibéer",
-       "monday": "altine",
-       "tuesday": "talaata",
+       "sunday": "Dibéer",
+       "monday": "Altine",
+       "tuesday": "Talaata",
        "wednesday": "àllarba",
        "thursday": "alxamis",
-       "friday": "àjjuma",
-       "saturday": "gaawu",
+       "friday": "Ã\80jjuma",
+       "saturday": "Gaawu",
        "sun": "dib",
        "mon": "alt",
-       "tue": "tal",
+       "tue": "Tal",
        "wed": "àll",
        "thu": "alx",
        "fri": "àjj",
        "sat": "gaa",
-       "january": "Semwiyee",
+       "january": "Samwiyee",
        "february": "Fewriyee",
        "march": "Maars",
        "april": "Awril",
@@ -79,7 +79,7 @@
        "september": "Sattumbar",
        "october": "Oktoobar",
        "november": "Nowembar",
-       "december": "Deesàmbar",
+       "december": "Samwiye",
        "january-gen": "Samwie",
        "february-gen": "Fewirie",
        "march-gen": "Maars",
        "actions": "Jëf",
        "namespaces": "Barabu tur",
        "variants": "Wuute",
-       "navigation-heading": "Njëlul joowiin",
+       "navigation-heading": "Njëlu joowiin",
        "errorpagetitle": "Njuumte",
        "returnto": "Dellu ci wii xët $1.",
        "tagline": "Jóge  {{SITENAME}}.",
        "unprotectthispage": "Aaradil wii xët",
        "newpage": "Xët wu bees",
        "talkpage": "Xëtu waxtaanuwaay",
-       "talkpagelinktext": "Diisoo",
+       "talkpagelinktext": "Waxtaan",
        "specialpage": "Xëtu jagleel",
        "personaltools": "Samay jumtukaay",
        "articlepage": "Gis jukki bi",
        "talk": "Waxtaan",
-       "views": "Xool yo",
-       "toolbox": "Boyotu jumtukaay yi",
+       "views": "Wone yi",
+       "toolbox": "Boyotu jumtukaay",
        "userpage": "Xëtu jëfandikukat",
        "projectpage": "Wone xëtu sémb wi",
        "imagepage": "Wone xëtu dencukaay bi",
        "redirectedfrom": "(Yoonalaat gu jóge $1)",
        "redirectpagesub": "Xëtu yoonalaat",
        "redirectto": "Jëmalewaat:",
-       "lastmodifiedat": "Coppite bu mujj bu xët wii $1 ci $2.<br />",
+       "lastmodifiedat": "Coppite gu mujj gu xët wii $1 ci $2.<br />",
        "viewcount": "Xët wii nemmeeku nañ ko {{PLURAL:$1|$1 yoon|$1 yoon}}.",
        "protectedpage": "Xët wees aar",
-       "jumpto": "Dem :",
+       "jumpto": "Dem:",
        "jumptonavigation": "Joowiin",
        "jumptosearch": "Seet",
        "view-pool-error": "jéggalu, joxekaay yi dañoo xat nii-nii.\nJëfandikukat yiy jéem a ubbi xët wii dañoo bari.\nTaaxiirlul ba ci kanam nga jéemaat.\n\n$1",
        "aboutpage": "Project:Ci mbiri",
        "copyright": "Ëmbit laa ngi  jàppandi ci $1.",
        "copyrightpage": "{{ns:project}}:Copyright",
-       "currentevents": "Luy xew",
-       "currentevents-url": "Project:Luy xew",
+       "currentevents": "Liy xew",
+       "currentevents-url": "Project:Liy xew",
        "disclaimers": "Ay aartu",
        "disclaimerpage": "Project:Aartu yu daj",
        "edithelp": "Ndimbal",
        "editlink": "soppi",
        "viewsourcelink": "xool gongikuwaayam",
        "editsectionhint": "Soppi bii xaaj : $1",
-       "toc": "Tëraliin",
+       "toc": "Ëmbiit",
        "showtoc": "Wone",
        "hidetoc": "Nëbb",
        "thisisdeleted": "Da ngaa bëgg a wone walla delloowaat $1 ?",
        "createacct-emailoptional": "Màkkaanu m-bataaxal (mu-neex-la)",
        "createacct-email-ph": "Duggalal sa màkkaanu m-bataaxal",
        "createaccountmail": "Jaare ko ci m-bataaxal",
-       "createacct-captcha": "Caytug kaaraange",
-       "createacct-imgcaptcha-ph": "Duggalal mbind  miy toftal mi ngay gis",
        "createacct-submit": "Sos sa sàq",
        "createacct-benefit-heading": "{{SITENAME}} ñu mel ni yaw a koy toppatoo.",
        "createacct-benefit-body1": "{{PLURAL:$1|Coppite}}",
        "templatesused": "{{PLURAL:$1| Royuwaay bi| Royuwaay yi}} nekk ci wii xët :",
        "templatesusedpreview": "{{PLURAL:$1| Royuwaay  bi|Royuwaay yi}} nekk ci gii wonendi :",
        "templatesusedsection": "Royuwaay yi ne ci bii xaaj:",
-       "template-protected": "(aar)",
+       "template-protected": "(aarees)",
        "template-semiprotected": "(aar-diggu)",
        "hiddencategories": "{{PLURAL:$1|wàll bu nëbbu bu|wàll yu nëbbu yu }} xët wii bokk :",
        "nocreatetext": "Jëfandikukat yi bindu rekk a man a sosi xët ci {{SITENAME}}. Man nga dellu ginnaaw walla soppi aw xët wu am ba noppi, [[Special:UserLogin|duggu walla sos am sàq]].",
        "rcshowhidemine-hide": "Nëbb",
        "rclinks": "Wone $1 coppite yi mujj ci $2  fan yi mujj <br />$3.",
        "diff": "wuute",
-       "hist": "Jaar",
+       "hist": "jaar",
        "hide": "Nëbb",
        "show": "Wone",
        "minoreditletter": "m",
        "filehist-current": "teew",
        "filehist-datetime": "Taariix ak Waxtu",
        "filehist-thumb": "Tuutal",
-       "filehist-thumbtext": "Tuutal gu  sumb bu $1",
+       "filehist-thumbtext": "Tuutal gu sumb bu $1",
        "filehist-user": "Jëfandikukat",
        "filehist-dimensions": "Dayoo",
        "filehist-filesize": "Dayoo ŋara wi",
        "tooltip-pt-preferences": "Say tànneef",
        "tooltip-pt-watchlist": "Limu xët yi ngay topp",
        "tooltip-pt-mycontris": "Limu say cëru",
-       "tooltip-pt-login": "Woo nan la ngir nga xammeku, waaye doonul lu manuta ñakk.",
+       "tooltip-pt-login": "Woo nan la ngir nga xammeku, waaye doonul lu manul-ñàkk.",
        "tooltip-pt-logout": "Génn",
        "tooltip-pt-createaccount": "Dees na la digal nga bindu te dugg, donte doonul lu manul-ñàkk",
        "tooltip-ca-talk": "Waxtaan yi ñeel xët wii",
        "tooltip-ca-move": "Tuddewaatal xët wii",
        "tooltip-ca-watch": "Yokk xët wii ci sa limu toppte",
        "tooltip-ca-unwatch": "Jële xët wii ci sa limu toppte",
-       "tooltip-search": "Seet ci biir {{SITENAME}}",
+       "tooltip-search": "Seet ci {{SITENAME}}",
        "tooltip-search-go": "Dem ci xët wi tudd ni nga wax, su dee am na.",
-       "tooltip-search-fulltext": "Seet xët yi ëmb kàddu gi",
+       "tooltip-search-fulltext": "Seet mbind mi ci biir xët yi",
        "tooltip-p-logo": "Xët wu njëkk",
-       "tooltip-n-mainpage": "Nemmeeku xëtu njëlbéen",
-       "tooltip-n-mainpage-description": "Nemmeku xët wu njëkk wi",
-       "tooltip-n-portal": "Ngir xam dara ci mbiri sémb bi, noo ci mana jàppe",
+       "tooltip-n-mainpage": "Nemmeeku xët wu njëkk wi",
+       "tooltip-n-mainpage-description": "Nemmeeku xët wu njëkk wi",
+       "tooltip-n-portal": "Ngir xam dara ci mbiri sémb bi, noo ci man a jàppe",
        "tooltip-n-currentevents": "Xibaar ci xew-xew yu teew yi",
        "tooltip-n-recentchanges": "Limu coppite yi mujj ci wiki bi",
        "tooltip-n-randompage": "Wone aw xët ci mbetteel",
-       "tooltip-n-help": "Xëtu ndimbal wi",
-       "tooltip-t-whatlinkshere": "limu xët yi ci wiki bi yi lëkkalook wii",
+       "tooltip-n-help": "Xëtu ndimbal",
+       "tooltip-t-whatlinkshere": "Limu xët yi ci wiki bi te lëkkalook wii",
        "tooltip-t-recentchangeslinked": "Limu coppite yu mujj yu xët yi lëkkalook wii",
        "tooltip-feed-rss": "Walug RSS ngir wii xët",
        "tooltip-feed-atom": "Walug Atom ngir wii xët",
        "tooltip-t-emailuser": "Yónne ab m-bataaxal bii jëfandikukat",
        "tooltip-t-upload": "Yeb ay dencukaay",
        "tooltip-t-specialpages": "Limu xëti jagleel yépp",
-       "tooltip-t-print": "Sumb bu móolu bu xët wii",
+       "tooltip-t-print": "Sumb bu móolu bu wii xët",
        "tooltip-t-permalink": "Lëkkalekaay bu sax buy jëme ci bii sumb bu xët wi",
        "tooltip-ca-nstab-main": "Xool jukki bi",
        "tooltip-ca-nstab-user": "Xool xëtu jëfandikukat wi",
        "tooltip-ca-nstab-media": "Xool xëtu dencukaay wi",
-       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu kaa soppi.",
+       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu koo soppi.",
        "tooltip-ca-nstab-project": "Xool xëtu sémb wi",
        "tooltip-ca-nstab-image": "Xool xëtu dencukaay wi",
        "tooltip-ca-nstab-mediawiki": "Xool bataaxalu noste bi",
        "tooltip-watch": "Yokk xët wii ci sa limu toppte",
        "tooltip-recreate": "Sosaat xët wi donte dañ kaa faroon",
        "tooltip-upload": "Door yeb gi",
-       "tooltip-rollback": "\"Delloowaat\" dafay neenal coppitey cërukat bi mujj ci xët wii ci benn cuq.",
+       "tooltip-rollback": "\"Delloowaat\" dafay neenal coppitey cërukat bi mujj ci xët wii ci benn kilig.",
        "tooltip-undo": "\"Neenal\" dafay far coppite yi te ubbi palanteeru coppite bi ci anamug wonendi.\nDafay tax nga man a bind ngirte li ci boyotu tënk bi.",
        "tooltip-summary": "Def ci ab tënk",
        "common.css": "/* CSS yiñ def fii dañuy am ay njeexit ci col yépp  */",
index ec163d9..fbae18a 100644 (file)
@@ -23,6 +23,7 @@
        "tog-hideminor": "באַהאַלטן מינערדיקע רעדאַקטירונגען אין לעצטע ענדערונגען",
        "tog-hidepatrolled": "באַהאַלטן פאַטראלירטע רעדאַקטירונגען אין לעצטע ענדערונגען",
        "tog-newpageshidepatrolled": "באַהאַלטן פאַטראלירטע בלעטער פון דער ליסטע פון נײַע בלעטער",
+       "tog-hidecategorization": "באהאלטן קאעגאריזירן בלעטער",
        "tog-extendwatchlist": "פארברייטערן די אויפפאסן ליסטע צו צייגן אלע פאסנדע ענדערונגען (אנדערשט: בלויז די לעצטע ענדערונג פון יעדן בלאט)",
        "tog-usenewrc": "גרופירן ענדערונגען לויטן בלאט אין \"לעצטע ענדערונגען\" און אויפֿפאסן ליסטע",
        "tog-numberheadings": "נומערירן קעפּלעך אויטאָמאַטיש",
@@ -52,6 +53,7 @@
        "tog-watchlisthideliu": "באהאלטן רעדאקטירונגען פון איינלאגירטע באניצערס פון דער אויפֿפאסונג ליסטע",
        "tog-watchlisthideanons": "באהאלטן רעדאקטירונגען פון אנאנימע באניצערס פון דער אויפֿפאסונג ליסטע",
        "tog-watchlisthidepatrolled": "באַהאַלטן פאַטראלירטע רעדאַקטירונגען פֿון דער אויפֿפאַסונג ליסטע",
+       "tog-watchlisthidecategorization": "באהאלטן קאעגאריזירן בלעטער",
        "tog-ccmeonemails": "שיק מיר קאפיעס פון בליצבריוו וואס איך שיק צו אנדערע באַניצער",
        "tog-diffonly": "ווייז נישט אינהאלט אונטער די דיפערענץ",
        "tog-showhiddencats": "ווײַזן באהאלטענע קאטעגאריעס",
        "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
-       "createacct-captcha": "פארזיכערן קאנטראל",
-       "createacct-imgcaptcha-ph": "קלאפט ארײַן דעם טעקסט איר זעט אויבן",
        "createacct-submit": "שאפֿט אײַער קאנטע",
        "createacct-another-submit": "שאַפֿן קאנטע",
        "createacct-benefit-heading": "{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.",
        "permissionserrorstext-withaction": "איר זענט נישט ערלויבט צו $2, וועגן {{PLURAL:$1|דער פֿאלגנדער סיבה| די פֿאלגנדע סיבות}}:",
        "recreate-moveddeleted-warn": "'''ווארענונג: איר שאפט א נייעם בלאט וואס איז שוין איינמאל  געווארן אויסגעמעקט.'''\n\nאיר זאלט איבערטראכטן צי עס פאַסט רעדאַקטירן דעם בלאַט ווײַטער.\nדי אויסמעקן און באַוועגן לאגביכער ווערן געוויזן דא:",
        "moveddeleted-notice": "דער בלאט איז געווארן אויסגעמעקט.\nדי אויסמעקן און באַוועגן לאגביכער פונעם בלאט ווערן געוויזן דא אונטן.",
+       "moveddeleted-notice-recent": "ליידער האט מען דעם בלאט לעצטנס אויסגעמעקט (אינערהאלב די לעצטע 24 שעה).\nדי אויסמעקונג און באוועגונג אינפארמאציע פארן בלאט ווערן פארזארגט אונטן.",
        "log-fulllog": "באַקוקן פֿולן לאגבוך",
        "edit-hook-aborted": "רעדאַקטירונג אַנולירט דורך Hook.\nנישטא קיין הסבר.",
        "edit-gone-missing": "נישט מעגלעך צו דערהיינטיגן דעם בלאט.\nס'ווייזט אויס אז ער איז אויסגעמעקט.",
        "rcshowhidemine": "$1 מײַנע רעדאַקטירוננגען",
        "rcshowhidemine-show": "ווײַזן",
        "rcshowhidemine-hide": "באַהאַלטן",
+       "rcshowhidecategorization": "$1 בלאט קאטעגאריזירונג",
+       "rcshowhidecategorization-show": "ווײַזן",
+       "rcshowhidecategorization-hide": "באַהאַלטן",
        "rclinks": "װײַזן די לעצטע $1 ענדערונגען אין די לעצטע $2 טעג.<br />$3",
        "diff": "אונטערשייד",
        "hist": "היסטאריע",
        "upload-dialog-button-done": "ערליידיקט",
        "upload-dialog-button-save": "אויפֿהיטן",
        "upload-dialog-button-upload": "אַרויפֿלאָדן",
-       "upload-process-error": "א גרײַז האט פאסירט",
-       "upload-process-warning": "א ווארענונג האט פאסירט",
        "upload-form-label-select-file": "קלויבן טעקע",
        "upload-form-label-infoform-title": "פרטים",
        "upload-form-label-infoform-name": "נאָמען",
        "deletepage": "מעק אויס בלאט",
        "confirm": "באַשטעטיגן",
        "excontent": "אינהאלט געווען: \"$1\"",
-       "excontentauthor": "אינהאלט געווען: \"$1\", און דער איינציגסטער באארבעטער איז געווען '[[Special:Contributions/$2|$2]]' ([[User talk|שמועס]])",
+       "excontentauthor": "אינהאלט געווען: \"$1\" און דער איינציגסטער באארבעטער איז געווען '[[Special:Contributions/$2|$2]]' ([[User talk:$2|שמועס]])",
        "exbeforeblank": "אינהאַלט בעפֿאַרן אויסליידיגן איז געווען: \"$1\"",
        "delete-confirm": "אויסמעקן $1",
        "delete-legend": "אויסמעקן",
        "rollback-success": "צוריקגעדרייט רעדאַקטירונגען פֿון $1 צו דער לעצטע ווערסיע פֿון $2",
        "sessionfailure-title": "זיצונג דורכפֿאַל",
        "sessionfailure": "ווײַזט אויס אז ס'איז דא א פראבלעם מיט אייער ארײַנלאגירן; די פעולה איז געווארן אנולירט צו פֿאַרהיטן קעגן פֿאַרשטעלן אייער סעסיע. זייט אזוי גוט און גייט צוריק צום פֿריערדיקן בלאט, און פרובירט נאכאַמאָל.",
+       "changecontentmodel": "ענדערן אינהאלט־מאדעל פון א בלאט",
+       "changecontentmodel-legend": "ענדערן אינהאלט מאדעל",
+       "changecontentmodel-title-label": "בלאט־טיטל",
+       "changecontentmodel-model-label": "נייער אינהאלט מאדעל",
+       "changecontentmodel-reason-label": "אורזאַך:",
+       "logentry-contentmodel-change-revertlink": "צוריקשטעלן",
+       "logentry-contentmodel-change-revert": "צוריקשטעלן",
        "protectlogpage": "באשיצונג לאָג-בוך",
        "protectedarticle": "געשיצט [[$1]]",
        "modifiedarticleprotection": "געענדערט באשיצונג שטאפל פון [[$1]]",
        "move-page-legend": "באַוועגן בלאַט",
        "movepagetext": "זיך באניצן מיט דעם פֿארעם וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירונג בלאט צום נייעם קעפל.\n\nאיר קענט דערהיינטיגן ווייטערפֿירונגען צום אלטן נאמען אויטאמאטיש.\n\nטאמער נישט, טוט פֿארזיכערן אז עס איז נישטא קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע ווייטערפֿירונגען]].\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.\n\nדער בלאט וועט '''נישט''' ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.\n\n'''ווארענונג!'''\n אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;\nביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
        "movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט '''נישט''' ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז ליידיג. אדער ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n'''ווארענונג:''' אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
-       "movepagetalktext": "×\93ער ×¨×¢×\93×\9f ×\91×\9c×\90×\98 ×\95×\95×¢×\98 ×\95×\95ער×\9f ×\91×\90Ö·×\95×\95×¢×\92×\98 ×\90×\95×\99×\98×\90×\9e×\90Öµ×\98×\99ש ×\9e×\99×\98 ×\90×\99×\9d, '''×\90×\97×\95×¥:'''\n* ×¡'×\90×\99×\96 ×©×\95×\99×\9f ×\93×\90 ×\90 × ×\99ש×\98\9c×\99×\99×\93×\99×\92ער ×\91×\9c×\90×\98 ×\9e×\99×\98×\9f × ×\99×\99×¢×\9d × ×\90×\9e×¢×\9f, ×\90×\93ער.\n* ×\90×\99ר × ×¢×\9e×\98  ×\90ר×\90פ ×\93×¢×\9d ×¦×\99×\99×\9b×\9f ×¤×\95× ×¢×\9d ×§×¢×¡×\98×\9c ×\90×\95× ×\98×\9f.\n\n×\90×\99×\9f ×\93×\99 ×¤Ö¿×¢×\9cער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
+       "movepagetalktext": "×\98×\90×\9eער ×¦×\99×\99×\9bנס ×\90×\99ר ×\93×\90ס ×§×¢×¡×\98×\9c, ×\95×\95×¢×\98 ×\93ער ×\90ס×\90ס×\99צ×\99×\90×\99ר×\98ער ×¨×¢×\93×\9f ×\91×\9c×\90×\98 ×\95×\95ער×\9f ×\91×\90Ö·×\95×\95×¢×\92×\98 ×\90×\95×\99×\98×\90×\9e×\90Öµ×\98×\99ש ×¦×\95×\9d × ×²Ö·×¢×\9d ×§×¢×¤×\9c, ×\90×\97×\95×¥ ×\95×\95×¢×\9f ×¡'×\90×\99×\96 ×©×\95×\99×\9f ×\93×\90 ×\90 × ×\99ש×\98\9c×\99×\99×\93×\99×\92ער ×¨×¢×\93×\9fÖ¾×\91×\9c×\90×\98.\n\n×\90×\99×\9f ×\93×¢×\9d ×¤Ö¿×\90×\9c, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
        "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "movenologintext": "איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.",
index 17c8519..8ef6803 100644 (file)
@@ -93,6 +93,7 @@
        "tog-hideminor": "隐藏最近更改中的小编辑",
        "tog-hidepatrolled": "隐藏最近更改中的已巡查编辑",
        "tog-newpageshidepatrolled": "隐藏新页面列表中的已巡查页面",
+       "tog-hidecategorization": "隐藏对页面的分类",
        "tog-extendwatchlist": "扩展监视列表以显示所有更改,而不仅是最近的更改",
        "tog-usenewrc": "按页面合并最近更改和监视列表中的更改",
        "tog-numberheadings": "自动将标题编号",
        "tog-watchlisthideliu": "隐藏监视列表中的登录用户的编辑",
        "tog-watchlisthideanons": "隐藏监视列表中的匿名用户的编辑",
        "tog-watchlisthidepatrolled": "隐藏监视列表中的已巡查编辑",
+       "tog-watchlisthidecategorization": "隐藏对页面的分类",
        "tog-ccmeonemails": "把我给其他用户发送的电子邮件的副本发送给我",
        "tog-diffonly": "不在差异下面显示页面内容",
        "tog-showhiddencats": "显示隐藏分类",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您为什么要创建另一个账户",
-       "createacct-captcha": "安全检查",
-       "createacct-imgcaptcha-ph": "请输入上图中的文字",
        "createacct-submit": "创建您的账户",
        "createacct-another-submit": "创建账户",
        "createacct-benefit-heading": "{{SITENAME}}是由同你一样的人们构筑的。",
        "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
        "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
        "changeemail": "更改或移除电子邮件地址",
-       "changeemail-header": "更改账户电子邮件地址",
+       "changeemail-header": "完成此表格以更改您的电子邮件地址。如果您希望从您的账户中移除任何关联的电子邮件地址,请在提交表格时将新电子邮件地址留空。",
+       "changeemail-passwordrequired": "您需要输入您的密码以确认此次更改。",
        "changeemail-no-info": "\n您必须登录以直接访问本页。",
        "changeemail-oldemail": "当前电子邮件地址:",
        "changeemail-newemail": "新的电子邮件地址:",
        "sig_tip": "带时间戳的签名",
        "hr_tip": "水平线(请小心使用)",
        "summary": "摘要:",
-       "subject": "题:",
+       "subject": "题:",
        "minoredit": "标记为小编辑",
        "watchthis": "监视本页",
        "savearticle": "保存页面",
        "missingsummary": "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
        "selfredirect": "<strong>警告:</strong>您正在将此页面重定向至它自己。\n您可能指定了错误的重定向目标,或者您正在编辑错误的页面。\n如果您再次点击“{{int:savearticle}}”,重定向将无论如何被创建。",
        "missingcommenttext": "请在下面输入评论。",
-       "missingcommentheader": "'''提示:''' 您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
+       "missingcommentheader": "<strong>提示:</strong>您还没有为此评论提供一个标题。如果您再次点击“{{int:savearticle}}”,您的编辑将不带标题保存。",
        "summary-preview": "摘要预览:",
-       "subject-preview": "题预览:",
+       "subject-preview": "题预览:",
        "previewerrortext": "尝试预览您的更改时发生未知错误。",
        "blockedtitle": "用户被封禁",
        "blockedtext": "<strong>你的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n你可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当你在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“电邮联系”功能时,才可以使用它。你当前的IP地址是$3,该封禁ID是#$5。请在你的询问中包含上面的所有信息。",
        "permissionserrors": "权限错误",
        "permissionserrorstext": "因为以下{{PLURAL:$1|原因}},你没有权限进行该操作:",
        "permissionserrorstext-withaction": "因为以下{{PLURAL:$1|原因}},你没有权限$2:",
+       "contentmodelediterror": "您不能编辑此修订版本,因为它的内容模型是<code>$1</code>,并且页面目前的内容模型是<code>$2</code>。",
        "recreate-moveddeleted-warn": "'''警告:你正在重新创建曾经被删除的页面。'''\n\n你应该考虑继续编辑本页是否合适。这里提供本页的删除和移动日志以供参考:",
        "moveddeleted-notice": "本页面已被删除。下面提供本页的删除和移动日志以供参考。",
        "moveddeleted-notice-recent": "抱歉,此页面刚刚被删除(在最近24小时内)。\n页面的删除和移动日志在下方提供以供参考。",
        "showingresultsinrange": "下面显示区间#<strong>$2</strong>至#<strong>$3</strong>的<strong>$1</strong>条结果。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>条结果中的<strong>$1</strong>条|<strong>$3</strong>条结果中的<strong>$1~$2</strong>条}}",
        "search-nonefound": "找不到和查询相匹配的结果。",
+       "search-nonefound-thiswiki": "在此网站找不到匹配查询的结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "搜索名字空间:",
        "powersearch-togglelabel": "选择:",
        "prefs-help-recentchangescount": "这包括最近更改、页面历史和日志。",
        "prefs-help-watchlist-token2": "这是您的监视列表的网络feed密钥。\n任何拥有者均可以浏览您的监视列表,因此不要公开该密钥。\n如果有需要,[[Special:ResetTokens|您可以重置密钥]]。",
        "savedprefs": "您的系统设置已保存。",
+       "savedrights": "{{GENDER:$1|$1}}的用户权限已被保存。",
        "timezonelegend": "时区:",
        "localtime": "当地时间:",
        "timezoneuseserverdefault": "使用wiki默认值($1)",
        "rcshowhidemine": "$1我的编辑",
        "rcshowhidemine-show": "显示",
        "rcshowhidemine-hide": "隐藏",
+       "rcshowhidecategorization": "$1页面分类",
+       "rcshowhidecategorization-show": "显示",
+       "rcshowhidecategorization-hide": "隐藏",
        "rclinks": "显示过去$2天的最后$1个更改<br />$3",
        "diff": "差异",
        "hist": "历史",
        "upload-dialog-button-done": "完成",
        "upload-dialog-button-save": "保存",
        "upload-dialog-button-upload": "上传",
-       "upload-process-error": "发生错误",
-       "upload-process-warning": "发生一条警告",
        "upload-form-label-select-file": "选择文件",
        "upload-form-label-infoform-title": "详细信息",
        "upload-form-label-infoform-name": "名称",
        "foreign-structured-upload-form-label-own-work": "这是我的作品",
        "foreign-structured-upload-form-label-infoform-categories": "分类",
        "foreign-structured-upload-form-label-infoform-date": "日期",
+       "foreign-structured-upload-form-label-own-work-message-local": "我确认我正在依据{{SITENAME}}上的服务条款和许可协议方针上传文件。",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "如果您无法依据{{SITENAME}}的方针上传此文件,请关闭此对话框并尝试其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "您也可以尝试[[Special:Upload|默认上传页面]]。",
        "foreign-structured-upload-form-label-own-work-message-default": "我知道我正在上传此文件至一个共享的存储库。我确认我依据这里的服务条款和许可方针做此事。",
        "foreign-structured-upload-form-label-not-own-work-message-default": "如果您无法依据分享存储库的方针上传此文件,请关闭此对话框并尝试其他方法。",
        "foreign-structured-upload-form-label-not-own-work-local-default": "如果此文件可以依据他们的方针上传的话,您也可以尝试使用[[Special:Upload|{{SITENAME}}上的上传页面]]。",
        "svg-long-error": "无效的SVG文件:$1",
        "show-big-image": "原始文件",
        "show-big-image-preview": "本预览的尺寸:$1。",
+       "show-big-image-preview-differ": "此$2文件的$3预览的大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2|分辨率}}:$1。",
        "show-big-image-size": "$1×$2像素",
        "file-info-gif-looped": "循环",
        "feedback-submit": "提交",
        "feedback-terms": "我理解我的用户代理信息包括有关我确切使用的浏览器和操作系统版本,并将在我的反馈旁公开分享。",
        "feedback-termsofuse": "我同意依照使用条款提供反馈。",
-       "feedback-thanks": "谢谢!的反馈已发布至页面“[$2 $1]”。",
+       "feedback-thanks": "谢谢!的反馈已发布至页面“[$2 $1]”。",
        "feedback-thanks-title": "谢谢您!",
        "feedback-useragent": "用户代理:",
        "searchsuggest-search": "搜索",
index efa51b1..fa14510 100644 (file)
@@ -72,6 +72,7 @@
        "tog-hideminor": "隱藏近期變更中的小修訂",
        "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
+       "tog-hidecategorization": "隱藏頁面分類",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
        "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
+       "tog-watchlisthidecategorization": "隱藏頁面分類",
        "tog-ccmeonemails": "我給他人寄出郵件時,也寄出一份副本到我的電子郵件信箱",
        "tog-diffonly": "比對差異時下方不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
-       "createacct-captcha": "安全驗證",
-       "createacct-imgcaptcha-ph": "輸入您在上方看到的文字",
        "createacct-submit": "建立您的帳號",
        "createacct-another-submit": "建立帳號",
        "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
        "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
        "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
        "changeemail": "變更或移除電子郵件地址",
-       "changeemail-header": "變更帳號的電子郵箱地址",
+       "changeemail-header": "請填寫此表單來變更您的電子郵件地址,若您想要移除您帳號所連結的所有電子郵件地址,請於新電子郵件地址欄位留空。",
+       "changeemail-passwordrequired": "您須要輸入您的密碼來確認此次變更。",
        "changeemail-no-info": "您必須登入方可直接存取此頁面。",
        "changeemail-oldemail": "目前的電子郵件地址:",
        "changeemail-newemail": "新的電子郵件地址:",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
-       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨/標題。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
+       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
        "summary-preview": "摘要預覽:",
        "subject-preview": "主旨預覽:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "permissionserrors": "權限錯誤",
        "permissionserrorstext": "由於下列{{PLURAL:$1|原因}},您沒有權限進行目前的動作:",
        "permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
+       "contentmodelediterror": "您無法編輯此修訂,因此修訂使用的內容模型為 <code>$1</code> 而目前使用的頁面內容模型為 <code>$2</code>。",
        "recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
        "moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除和移動日誌以便參考。",
        "moveddeleted-notice-recent": "抱歉,此頁面最近被刪除 (24 小時內)。\n以下提供此頁面的刪除與移動日誌做為參考。",
        "showingresultsinrange": "以下顯示從第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆中的 {{PLURAL:$1|<strong>$1</strong> 筆結果}}:",
        "search-showingresults": "{{PLURAL:$4|第 <strong>$1</strong> 筆結果,共 <strong>$3</strong> 筆|第 <strong>$1 - $2</strong> 筆結果,共 <strong>$3</strong> 筆}}",
        "search-nonefound": "無符合查詢條件的結果。",
+       "search-nonefound-thiswiki": "在本站沒有符合此查詢條件的結果。",
        "powersearch-legend": "進階搜尋",
        "powersearch-ns": "搜尋以下命名空間:",
        "powersearch-togglelabel": "請選擇:",
        "prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "已儲存您的偏好設定。",
+       "savedrights": "已儲存 {{GENDER:$1|$1}} 的使用者權限。",
        "timezonelegend": "時區:",
        "localtime": "當地時間:",
        "timezoneuseserverdefault": "使用 Wiki 預設值 ($1)",
        "grouppage-bot": "{{ns:project}}:機器人",
        "grouppage-sysop": "{{ns:project}}:管理員",
        "grouppage-bureaucrat": "{{ns:project}}:行政員",
-       "grouppage-suppress": "{{ns:project}}:監督",
+       "grouppage-suppress": "{{ns:project}}:監督",
        "right-read": "閱讀頁面",
        "right-edit": "編輯頁面",
        "right-createpage": "建立頁面 (不含討論頁面)",
        "rcshowhidemine": "$1 我的編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "隱藏",
+       "rcshowhidecategorization": "$1 頁面分類",
+       "rcshowhidecategorization-show": "顯示",
+       "rcshowhidecategorization-hide": "隱藏",
        "rclinks": "顯示近期 $2 天內的 $1 次變更。<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "upload-options": "上傳選項",
        "watchthisupload": "監視此檔案",
        "filewasdeleted": "先前已有同樣名稱的檔案上傳,後來被刪除。\n您應在上傳此檔案前檢查 $1。",
+       "filename-thumb-name": "此檔名似乎為縮圖檔名,請不要重新上傳縮圖回相同 wiki。 否則請先修正為更具意義的檔案名稱並且去除縮圖的檔名字首。",
        "filename-bad-prefix": "您上傳的檔案名稱以 <strong>\"$1\"</strong> 開頭,是不具任何描述意義的名稱,通常由數位相機自動產生。\n請替您的檔案使用一個更具描述意義的名稱。",
        "upload-success-subj": "成功上傳",
        "upload-success-msg": "您已成功使用 [$2] 上傳檔案,可於此處取得檔案:[[:{{ns:file}}:$1]]",
        "upload-dialog-button-done": "完成",
        "upload-dialog-button-save": "儲存",
        "upload-dialog-button-upload": "上傳",
-       "upload-process-error": "發生錯誤",
-       "upload-process-warning": "發生警告",
        "upload-form-label-select-file": "選擇檔案",
        "upload-form-label-infoform-title": "詳細資訊",
        "upload-form-label-infoform-name": "名稱",
        "upload-form-label-infoform-description": "描述",
        "upload-form-label-usage-title": "用法",
        "upload-form-label-usage-filename": "檔案名稱",
+       "foreign-structured-upload-form-label-own-work": "這是我的作品",
        "foreign-structured-upload-form-label-infoform-categories": "分類",
        "foreign-structured-upload-form-label-infoform-date": "日期",
+       "foreign-structured-upload-form-label-own-work-message-local": "我確定我上傳的檔案已遵守下列 {{SITENAME}} 的服務條款與授權條款。",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "若您無法同意遵守 {{SITENAME}} 的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "您也可嘗試[[Special:Upload|預設的上傳頁面]]。",
+       "foreign-structured-upload-form-label-own-work-message-default": "我明白我將上傳此檔案到一個共享的儲存庫,我確認已遵守本站的服務條款與授權政策。",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "若您無法同意遵守共享儲存庫的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "若此檔案可遵守該站的授權政策上傳檔案,您可能會希望直接嘗試使用 [[Special:Upload|{{SITENAME}} 的上傳頁面]]。",
+       "foreign-structured-upload-form-label-own-work-message-shared": "我保証我擁有此檔案的版權,並且不反悔同意使用 [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] 授權條款發佈此檔案到維基媒體共享資源,並且我同意 [https://wikimediafoundation.org/wiki/Terms_of_Use 使用條款]。",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "若您並未擁有此檔案的版權,或者您希望使用其他的授權條款發佈此檔案,請考慮使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 通用上傳精靈]。",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "若該站的授權政策允許上傳此檔案,您可能會希望直接嘗試使用 [[Special:Upload|{{SITENAME}} 的上傳頁面]]。",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
        "filerevert-legend": "還原檔案",
        "filerevert-intro": "您現正在還原檔案 <strong>[[Media:$1|$1]]</strong> 至 [$4 於 $2 $3 的版本]。",
        "filerevert-comment": "原因:",
-       "filerevert-defaultcomment": "已還原到於 $1 $2 的版本",
+       "filerevert-defaultcomment": "已還原到於 $1 $2 ($3) 的版本",
        "filerevert-submit": "還原",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> 已經還原到 [$4 於 $2 $3 的版本]。",
        "filerevert-badversion": "查無此檔案先前於指定時間的本地版本。",
        "nopagetext": "您所指定的目標頁面並不存在。",
        "pager-newer-n": "較新 $1 筆",
        "pager-older-n": "較舊 $1 筆",
-       "suppress": "ç\9b£ç\9d£",
+       "suppress": "ç¦\81æ­¢",
        "querypage-disabled": "此特殊頁面因考量效能問題已被停用。",
        "apihelp": "API 說明",
        "apihelp-no-such-module": "查無模組 \"$1\"。",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能寄給 $2。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能{{GENDER:$1|寄給}} {{GENDER:$1|$2}}。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "deletepage": "刪除頁面",
        "confirm": "確認",
        "excontent": "內容為:\"$1\"",
-       "excontentauthor": "內容為:\"$1\" (且僅有一位貢獻者 \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "內容為:\"$1\",且僅有一位貢獻者 \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|對話]])",
        "exbeforeblank": "被清空前的內容為:\"$1\"",
        "delete-confirm": "刪除 \"$1\"",
        "delete-legend": "刪除",
        "move-page-legend": "移動頁面",
        "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetext-noredirectfixer": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
-       "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
+       "movepagetalktext": "若勾選此方塊,相關的對話頁面會自動與此頁面一起移動至新的位置,除非新的名稱已有一個存在的對話頁面。\n在此情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
        "movecategorypage-warning": "<strong>警告:</strong>您正要移動分類頁面。請注意此操作只會移動頁面,在舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "import-mapping-namespace": "匯入至命名空間:",
        "import-mapping-subpage": "匯入做為以下頁面的子頁面:",
        "import-upload-filename": "檔案名稱:",
-       "import-comment": "è©\95è«\96:",
+       "import-comment": "註解:",
        "importtext": "請使用 [[Special:Export|匯出工具]] 從來源 Wiki 匯出檔案,\n儲存至您的電腦後再上傳到這裡。",
        "importstart": "正在匯入頁面...",
        "import-revision-count": "$1 個修訂",
        "svg-long-error": "無效的 SVG 檔案:$1",
        "show-big-image": "原始檔案",
        "show-big-image-preview": "預覽大小:$1。",
+       "show-big-image-preview-differ": "此 $2 檔案的 $3 預覽的大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2||}}解析度:$1。",
        "show-big-image-size": "$1 × $2 像素",
        "file-info-gif-looped": "循環",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|已建立}}使用者帳號 $3 並且以電子郵件通知密碼",
        "logentry-newusers-autocreate": "已自動{{GENDER:$2|建立}}使用者帳號 $1",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|已移動}}保護設定從 $4 至 $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|已移除}} $3 的保護",
+       "logentry-protect-protect": "$1 {{GENDER:$2|已保護}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|已保護}} $3 $4 [連鎖]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4 [連鎖]",
        "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",
index 22f62fe..e65b09e 100644 (file)
--- a/load.php
+++ b/load.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * This file is the entry point for the resource loader.
+ * This file is the entry point for ResourceLoader.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9fa05d2..b0bbdd0 100644 (file)
@@ -1,4 +1,4 @@
--- Table for storing JSON message blobs for the resource loader
+-- Table for storing JSON message blobs for ResourceLoader
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource varbinary(255) NOT NULL,
index 11a0590..0ed584c 100644 (file)
@@ -699,7 +699,6 @@ class TextPassDumper extends BackupDumper {
                $this->progress( "Spawning database subprocess: $cmd" );
                $this->spawnProc = proc_open( $cmd, $spec, $pipes );
                if ( !$this->spawnProc ) {
-                       // shit
                        $this->progress( "Subprocess spawn failed." );
 
                        return false;
index 861b364..c1a2022 100644 (file)
@@ -106,6 +106,12 @@ class CreateAndPromote extends Maintenance {
                        }
                }
 
+               if ( !$exists ) {
+                       # Insert the account into the database
+                       $user->addToDatabase();
+                       $user->saveSettings();
+               }
+
                if ( $password ) {
                        # Try to set the password
                        try {
@@ -119,12 +125,6 @@ class CreateAndPromote extends Maintenance {
                        }
                }
 
-               if ( !$exists ) {
-                       # Insert the account into the database
-                       $user->addToDatabase();
-                       $user->saveSettings();
-               }
-
                # Promote user
                array_map( array( $user, 'addGroup' ), $promotions );
 
index 8e4e531..2322909 100644 (file)
@@ -433,7 +433,6 @@ aiff
 aiprop
 airtel
 aisort
-ajaxwatch
 al
 alefsym
 algo
index 4b9ad9c..e66b729 100644 (file)
@@ -106,7 +106,7 @@ $maintenance->execute();
 $maintenance->globals();
 
 // Perform deferred updates.
-DeferredUpdates::doUpdates( 'commit' );
+DeferredUpdates::doUpdates();
 
 // log profiling info
 wfLogProfilingData();
diff --git a/maintenance/findOrphanedFiles.php b/maintenance/findOrphanedFiles.php
new file mode 100644 (file)
index 0000000..2ee406f
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+class FindOrphanedFiles extends Maintenance {
+       function __construct() {
+               parent::__construct();
+
+               $this->mDescription = "Find unregistered files in the 'public' repo zone.";
+               $this->addOption( 'subdir',
+                       'Only scan files in this subdirectory (e.g. "a/a0")', false, true );
+               $this->addOption( 'verbose', "Mention file paths checked" );
+               $this->setBatchSize( 500 );
+       }
+
+       function execute() {
+               $subdir = $this->getOption( 'subdir', '' );
+               $verbose = $this->hasOption( 'verbose' );
+
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               if ( $repo->hasSha1Storage() ) {
+                       $this->error( "Local repo uses SHA-1 file storage names; aborting.", 1 );
+               }
+
+               $directory = $repo->getZonePath( 'public' );
+               if ( $subdir != '' ) {
+                       $directory .= "/$subdir/";
+               }
+
+               if ( $verbose ) {
+                       $this->output( "Scanning files under $directory:\n" );
+               }
+
+               $list = $repo->getBackend()->getFileList( array( 'dir' => $directory ) );
+               if ( $list === null ) {
+                       $this->error( "Could not get file listing.", 1 );
+               }
+
+               $nameBatch = array();
+               foreach ( $list as $path ) {
+                       if ( preg_match( '#^(thumb|deleted)/#', $path ) ) {
+                               continue; // handle ugly nested containers on stock installs
+                       }
+
+                       $nameBatch[] = basename( $path );
+                       if ( count( $nameBatch ) >= $this->mBatchSize ) {
+                               $this->checkFiles( $repo, $nameBatch, $verbose );
+                               $nameBatch = array();
+                       }
+               }
+               $this->checkFiles( $repo, $nameBatch, $verbose );
+       }
+
+       protected function checkFiles( LocalRepo $repo, array $names, $verbose ) {
+               if ( !count( $names ) ) {
+                       return;
+               }
+
+               $dbr = $repo->getSlaveDB();
+
+               $imgIN = array();
+               $oiWheres = array();
+               foreach ( $names as $name ) {
+                       if ( strpos( $name, '!' ) !== false ) {
+                               if ( $verbose ) {
+                                       $this->output( "Checking old file $name\n" );
+                               }
+
+                               list( , $base ) = explode( '!', $name ); // <TS_MW>!<img_name>
+                               $oiWheres[] = $dbr->makeList(
+                                       array( 'oi_name' => $base, 'oi_archive_name' => $name ),
+                                       LIST_AND
+                               );
+                       } else {
+                               if ( $verbose ) {
+                                       $this->output( "Checking current file $name\n" );
+                               }
+
+                               $imgIN[] = $name;
+                       }
+               }
+
+               $res = $dbr->query(
+                       $dbr->unionQueries(
+                               array(
+                                       $dbr->selectSQLText(
+                                               'image',
+                                               array( 'name' => 'img_name' ),
+                                               array( 'img_name' => $imgIN )
+                                       ),
+                                       $dbr->selectSQLText(
+                                               'oldimage',
+                                               array( 'name' => 'oi_archive_name' ),
+                                               $dbr->makeList( $oiWheres, LIST_OR )
+                                       )
+                               ),
+                               true // UNION ALL (performance)
+                       ),
+                       __METHOD__
+               );
+
+               $namesFound = array();
+               foreach ( $res as $row ) {
+                       $namesFound[] = $row->name;
+               }
+
+               $namesOrphans = array_diff( $names, $namesFound );
+               foreach ( $namesOrphans as $name ) {
+                       // Print name and public URL to ease recovery
+                       if ( strpos( $name, '!' ) !== false ) {
+                               list( , $base ) = explode( '!', $name ); // <TS_MW>!<img_name>
+                               $file = $repo->newFromArchiveName( Title::makeTitle( NS_FILE, $base ), $name );
+                       } else {
+                               $file = $repo->newFile( $name );
+                       }
+                       $this->output( $name . "\n" . $file->getUrl() . "\n\n" );
+               }
+       }
+}
+
+$maintClass = 'FindOrphanedFiles';
+require_once RUN_MAINTENANCE_IF_MAIN;
index ea8c84b..8cea5a2 100644 (file)
@@ -119,7 +119,8 @@ TEXT;
 
        private function getNsIndex( $namespace ) {
                global $wgContLang;
-               if ( ( $result = $wgContLang->getNsIndex( $namespace ) ) !== false ) {
+               $result = $wgContLang->getNsIndex( $namespace );
+               if ( $result !== false ) {
                        return $result;
                }
                $ns = intval( $namespace );
@@ -235,8 +236,6 @@ TEXT;
                        }
                }
                wfWaitForSlaves();
-               // XXX: Don't let deferred jobs array get absurdly large (bug 24375)
-               DeferredUpdates::doUpdates( 'commit' );
        }
 
        function progress( $string ) {
index 0037ea8..212e42a 100644 (file)
@@ -43,7 +43,7 @@ class CommandLineInstaller extends Maintenance {
                global $IP;
 
                $this->addDescription( "CLI-based MediaWiki installation and configuration.\n" .
-                       "Defaut options are indicated in parenthesis." );
+                       "Default options are indicated in parentheses." );
 
                $this->addArg( 'name', 'The name of the wiki (MediaWiki)', false );
 
index 4ab57d4..5924c66 100755 (executable)
@@ -1,9 +1,13 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # @author Philip
-import tarfile as tf
-import zipfile as zf
-import os, re, shutil, sys, platform
+import os
+import platform
+import re
+import shutil
+import sys
+import tarfile
+import zipfile
 
 pyversion = platform.python_version()
 islinux = platform.system().lower() == 'linux'
@@ -18,16 +22,18 @@ if pyversion[:3] in ['2.6', '2.7']:
             if i < 0x10000:
                 return _unichr(i)
             else:
-                return _unichr( 0xD7C0 + ( i>>10 ) ) + _unichr( 0xDC00 + ( i & 0x3FF ) )
+                return _unichr(0xD7C0 + (i >> 10)) + _unichr(0xDC00 + (i & 0x3FF))
 elif pyversion[:2] == '3.':
     import urllib.request as urllib_request
     unichr = chr
 
-def unichr2( *args ):
-    return [unichr( int( i.split('<')[0][2:], 16 ) ) for i in args]
 
-def unichr3( *args ):
-    return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]]
+def unichr2(*args):
+    return [unichr(int(i.split('<')[0][2:], 16)) for i in args]
+
+
+def unichr3(*args):
+    return [unichr(int(i[2:7], 16)) for i in args if i[2:7]]
 
 # DEFINE
 UNIHAN_VER = '6.3.0'
@@ -37,189 +43,201 @@ SCIM_PINYIN_VER = '0.5.92'
 LIBTABE_VER = '0.2.3'
 # END OF DEFINE
 
-def download( url, dest ):
-    if os.path.isfile( dest ):
-        print( 'File %s is up to date.' % dest )
+
+def download(url, dest):
+    if os.path.isfile(dest):
+        print('File %s is up to date.' % dest)
         return
     global islinux
     if islinux:
-        # we use wget instead urlretrieve under Linux, 
+        # we use wget instead urlretrieve under Linux,
         # because wget could display details like download progress
-        os.system( 'wget %s -O %s' % ( url, dest ) )
+        os.system('wget %s -O %s' % (url, dest))
     else:
-        print( 'Downloading from [%s] ...' % url )
-        urllib_request.urlretrieve( url, dest )
-        print( 'Download complete.\n' )
+        print('Downloading from [%s] ...' % url)
+        urllib_request.urlretrieve(url, dest)
+        print('Download complete.\n')
     return
 
-def uncompress( fp, member, encoding = 'U8' ):
-    name = member.rsplit( '/', 1 )[-1]
-    print( 'Extracting %s ...' % name )
-    fp.extract( member )
-    shutil.move( member, name )
+
+def uncompress(fp, member, encoding='U8'):
+    name = member.rsplit('/', 1)[-1]
+    print('Extracting %s ...' % name)
+    fp.extract(member)
+    shutil.move(member, name)
     if '/' in member:
-        shutil.rmtree( member.split( '/', 1 )[0] )
+        shutil.rmtree(member.split('/', 1)[0])
     if pyversion[:1] in ['2']:
-        fc = open( name, 'rb', encoding, 'ignore' )
+        fc = open(name, 'rb', encoding, 'ignore')
     else:
-        fc = open( name, 'r', encoding = encoding, errors = 'ignore' )
+        fc = open(name, 'r', encoding=encoding, errors='ignore')
     return fc
 
 unzip = lambda path, member, encoding = 'U8': \
-        uncompress( zf.ZipFile( path ), member, encoding )
+        uncompress(zipfile.ZipFile(path), member, encoding)
 
 untargz = lambda path, member, encoding = 'U8': \
-        uncompress( tf.open( path, 'r:gz' ), member, encoding )
+        uncompress(tarfile.open(path, 'r:gz'), member, encoding)
+
 
-def parserCore( fp, pos, beginmark = None, endmark = None ):
+def parserCore(fp, pos, beginmark=None, endmark=None):
     if beginmark and endmark:
         start = False
-    else: start = True
+    else:
+        start = True
     mlist = set()
     for line in fp:
-        if beginmark and line.startswith( beginmark ):
+        if beginmark and line.startswith(beginmark):
             start = True
             continue
-        elif endmark and line.startswith( endmark ):
+        elif endmark and line.startswith(endmark):
             break
-        if start and not line.startswith( '#' ):
+        if start and not line.startswith('#'):
             elems = line.split()
-            if len( elems ) < 2:
+            if len(elems) < 2:
                 continue
-            elif len( elems[0] ) > 1 and \
-                len( elems[pos] ) > 1: # words only
-                mlist.add( elems[pos] )
+            elif len(elems[0]) > 1 and len(elems[pos]) > 1:  # words only
+                mlist.add(elems[pos])
     return mlist
 
-def tablesParser( path, name ):
+
+def tablesParser(path, name):
     """ Read file from scim-tables and parse it. """
     global SCIM_TABLES_VER
-    src = 'scim-tables-%s/tables/zh/%s' % ( SCIM_TABLES_VER, name )
-    fp = untargz( path, src, 'U8' )
-    return parserCore( fp, 1, 'BEGIN_TABLE', 'END_TABLE' )
+    src = 'scim-tables-%s/tables/zh/%s' % (SCIM_TABLES_VER, name)
+    fp = untargz(path, src, 'U8')
+    return parserCore(fp, 1, 'BEGIN_TABLE', 'END_TABLE')
+
+ezbigParser = lambda path: tablesParser(path, 'EZ-Big.txt.in')
+wubiParser = lambda path: tablesParser(path, 'Wubi.txt.in')
+zrmParser = lambda path: tablesParser(path, 'Ziranma.txt.in')
 
-ezbigParser = lambda path: tablesParser( path, 'EZ-Big.txt.in' )
-wubiParser = lambda path: tablesParser( path, 'Wubi.txt.in' )
-zrmParser = lambda path: tablesParser( path, 'Ziranma.txt.in' )
 
-def phraseParser( path ):
+def phraseParser(path):
     """ Read phrase_lib.txt and parse it. """
     global SCIM_PINYIN_VER
     src = 'scim-pinyin-%s/data/phrase_lib.txt' % SCIM_PINYIN_VER
-    dst = 'phrase_lib.txt'
-    fp = untargz( path, src, 'U8' )
-    return parserCore( fp, 0 )
+    fp = untargz(path, src, 'U8')
+    return parserCore(fp, 0)
 
-def tsiParser( path ):
+
+def tsiParser(path):
     """ Read tsi.src and parse it. """
     src = 'libtabe/tsi-src/tsi.src'
-    dst = 'tsi.src'
-    fp = untargz( path, src, 'big5hkscs' )
-    return parserCore( fp, 0 )
+    fp = untargz(path, src, 'big5hkscs')
+    return parserCore(fp, 0)
+
 
-def unihanParser( path ):
+def unihanParser(path):
     """ Read Unihan_Variants.txt and parse it. """
-    fp = unzip( path, 'Unihan_Variants.txt', 'U8' )
+    fp = unzip(path, 'Unihan_Variants.txt', 'U8')
     t2s = dict()
     s2t = dict()
     for line in fp:
-        if line.startswith( '#' ):
+        if line.startswith('#'):
             continue
         else:
             elems = line.split()
-            if len( elems ) < 3:
+            if len(elems) < 3:
                 continue
-            type = elems.pop( 1 )
-            elems = unichr2( *elems )
+            type = elems.pop(1)
+            elems = unichr2(*elems)
             if type == 'kTraditionalVariant':
                 s2t[elems[0]] = elems[1:]
             elif type == 'kSimplifiedVariant':
                 t2s[elems[0]] = elems[1:]
     fp.close()
-    return ( t2s, s2t )
+    return (t2s, s2t)
 
-def applyExcludes( mlist, path ):
+
+def applyExcludes(mlist, path):
     """ Apply exclude rules from path to mlist. """
     if pyversion[:1] in ['2']:
-        excludes = open( path, 'rb', 'U8' ).read().split()
+        excludes = open(path, 'rb', 'U8').read().split()
     else:
-        excludes = open( path, 'r', encoding = 'U8' ).read().split()
-    excludes = [word.split( '#' )[0].strip() for word in excludes]
-    excludes = '|'.join( excludes )
-    excptn = re.compile( '.*(?:%s).*' % excludes )
-    diff = [mword for mword in mlist if excptn.search( mword )]
-    mlist.difference_update( diff )
+        excludes = open(path, 'r', encoding='U8').read().split()
+    excludes = [word.split('#')[0].strip() for word in excludes]
+    excludes = '|'.join(excludes)
+    excptn = re.compile('.*(?:%s).*' % excludes)
+    diff = [mword for mword in mlist if excptn.search(mword)]
+    mlist.difference_update(diff)
     return mlist
 
-def charManualTable( path ):
-   fp = open( path, 'r', encoding = 'U8' )
-   for line in fp:
-       elems = line.split( '#' )[0].split( '|' )
-       elems = unichr3( *elems )
-       if len( elems ) > 1:
-           yield elems[0], elems[1:]
-        
-def toManyRules( src_table ):
+
+def charManualTable(path):
+    fp = open(path, 'r', encoding='U8')
+    for line in fp:
+        elems = line.split('#')[0].split('|')
+        elems = unichr3(*elems)
+        if len(elems) > 1:
+            yield elems[0], elems[1:]
+
+
+def toManyRules(src_table):
     tomany = set()
     if pyversion[:1] in ['2']:
-        for ( f, t ) in src_table.iteritems():
-            for i in range( 1, len( t ) ):
-                tomany.add( t[i] )
+        for (f, t) in src_table.iteritems():
+            for i in range(1, len(t)):
+                tomany.add(t[i])
     else:
-        for ( f, t ) in src_table.items():
-            for i in range( 1, len( t ) ):
-                tomany.add( t[i] )
+        for (f, t) in src_table.items():
+            for i in range(1, len(t)):
+                tomany.add(t[i])
     return tomany
 
-def removeRules( path, table ):
-    fp = open( path, 'r', encoding = 'U8' )
+
+def removeRules(path, table):
+    fp = open(path, 'r', encoding='U8')
     texc = list()
     for line in fp:
-        elems = line.split( '=>' )
+        elems = line.split('=>')
         f = t = elems[0].strip()
-        if len( elems ) == 2:
+        if len(elems) == 2:
             t = elems[1].strip()
         f = f.strip('"').strip("'")
         t = t.strip('"').strip("'")
         if f:
             try:
-                table.pop( f )
+                table.pop(f)
             except:
                 pass
         if t:
-            texc.append( t )
-    texcptn = re.compile( '^(?:%s)$' % '|'.join( texc ) )
+            texc.append(t)
+    texcptn = re.compile('^(?:%s)$' % '|'.join(texc))
     if pyversion[:1] in ['2']:
         for (tmp_f, tmp_t) in table.copy().iteritems():
-            if texcptn.match( tmp_t ):
-                table.pop( tmp_f )
+            if texcptn.match(tmp_t):
+                table.pop(tmp_f)
     else:
         for (tmp_f, tmp_t) in table.copy().items():
-            if texcptn.match( tmp_t ):
-                table.pop( tmp_f )
+            if texcptn.match(tmp_t):
+                table.pop(tmp_f)
     return table
 
-def customRules( path ):
-    fp = open( path, 'r', encoding = 'U8' )
+
+def customRules(path):
+    fp = open(path, 'r', encoding='U8')
     ret = dict()
     for line in fp:
-        line = line.rstrip( '\r\n' )
+        line = line.rstrip('\r\n')
         if '#' in line:
-            line = line.split( '#' )[0].rstrip()
-        elems = line.split( '\t' )
-        if len( elems ) > 1:
+            line = line.split('#')[0].rstrip()
+        elems = line.split('\t')
+        if len(elems) > 1:
             ret[elems[0]] = elems[1]
     return ret
 
-def dictToSortedList( src_table, pos ):
-    return sorted( src_table.items(), key = lambda m: ( m[pos], m[1 - pos] ) )
 
-def translate( text, conv_table ):
+def dictToSortedList(src_table, pos):
+    return sorted(src_table.items(), key=lambda m: (m[pos], m[1 - pos]))
+
+
+def translate(text, conv_table):
     i = 0
-    while i < len( text ):
-        for j in range( len( text ) - i, 0, -1 ):
+    while i < len(text):
+        for j in range(len(text) - i, 0, -1):
             f = text[i:][:j]
-            t = conv_table.get( f )
+            t = conv_table.get(f)
             if t:
                 text = text[:i] + t + text[i:][j:]
                 i += len(t) - 1
@@ -227,42 +245,44 @@ def translate( text, conv_table ):
         i += 1
     return text
 
-def manualWordsTable( path, conv_table, reconv_table ):
-    fp = open( path, 'r', encoding = 'U8' )
+
+def manualWordsTable(path, conv_table, reconv_table):
+    fp = open(path, 'r', encoding='U8')
     reconv_table = {}
-    wordlist = [line.split( '#' )[0].strip() for line in fp]
-    wordlist = list( set( wordlist ) )
-    wordlist.sort( key = lambda w: ( len(w), w ), reverse = True )
+    wordlist = [line.split('#')[0].strip() for line in fp]
+    wordlist = list(set(wordlist))
+    wordlist.sort(key=lambda w: (len(w), w), reverse=True)
     while wordlist:
         word = wordlist.pop()
-        new_word = translate( word, conv_table )
-        rcv_word = translate( word, reconv_table )
+        new_word = translate(word, conv_table)
+        rcv_word = translate(word, reconv_table)
         if word != rcv_word:
             reconv_table[word] = word
         reconv_table[new_word] = word
     return reconv_table
 
-def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_table ):
-    wordlist = list( src_wordlist )
-    wordlist.sort( key = lambda w: ( len(w), w ), reverse = True )
+
+def defaultWordsTable(src_wordlist, src_tomany, char_conv_table,
+                      char_reconv_table):
+    wordlist = list(src_wordlist)
+    wordlist.sort(key=lambda w: (len(w), w), reverse=True)
     word_conv_table = {}
     word_reconv_table = {}
     conv_table = char_conv_table.copy()
     reconv_table = char_reconv_table.copy()
-    tomanyptn = re.compile( '(?:%s)' % '|'.join( src_tomany ) )
+    tomanyptn = re.compile('(?:%s)' % '|'.join(src_tomany))
     while wordlist:
-        conv_table.update( word_conv_table )
-        reconv_table.update( word_reconv_table )
+        conv_table.update(word_conv_table)
+        reconv_table.update(word_reconv_table)
         word = wordlist.pop()
-        new_word_len = word_len = len( word )
+        new_word_len = word_len = len(word)
         while new_word_len == word_len:
-            add = False
-            test_word = translate( word, reconv_table )
-            new_word = translate( word, conv_table )
-            if not reconv_table.get( new_word ) \
-               and ( test_word != word \
-               or ( tomanyptn.search( word ) \
-               and word != translate( new_word, reconv_table ) ) ):
+            test_word = translate(word, reconv_table)
+            new_word = translate(word, conv_table)
+            if not reconv_table.get(new_word) and \
+               (test_word != word or
+                (tomanyptn.search(word) and
+                 word != translate(new_word, reconv_table))):
                 word_conv_table[word] = new_word
                 word_reconv_table[new_word] = word
             try:
@@ -272,109 +292,117 @@ def defaultWordsTable( src_wordlist, src_tomany, char_conv_table, char_reconv_ta
             new_word_len = len(word)
     return word_reconv_table
 
-def PHPArray( table ):
+
+def PHPArray(table):
     lines = ['\'%s\' => \'%s\',' % (f, t) for (f, t) in table if f and t]
     return '\n'.join(lines)
 
+
 def main():
-    #Get Unihan.zip:
+    # Get Unihan.zip:
     url = 'http://www.unicode.org/Public/%s/ucd/Unihan.zip' % UNIHAN_VER
     han_dest = 'Unihan-%s.zip' % UNIHAN_VER
-    download( url, han_dest )
-    
+    download(url, han_dest)
+
+    sfurlbase = 'http://%s.dl.sourceforge.net/sourceforge/' % SF_MIRROR
+
     # Get scim-tables-$(SCIM_TABLES_VER).tar.gz:
-    url  = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-tables-%s.tar.gz' % ( SF_MIRROR, SCIM_TABLES_VER )
+    url = sfurlbase + 'scim/scim-tables-%s.tar.gz' % SCIM_TABLES_VER
     tbe_dest = 'scim-tables-%s.tar.gz' % SCIM_TABLES_VER
-    download( url, tbe_dest )
-    
+    download(url, tbe_dest)
+
     # Get scim-pinyin-$(SCIM_PINYIN_VER).tar.gz:
-    url  = 'http://%s.dl.sourceforge.net/sourceforge/scim/scim-pinyin-%s.tar.gz' % ( SF_MIRROR, SCIM_PINYIN_VER )
+    url = sfurlbase + 'scim/scim-pinyin-%s.tar.gz' % SCIM_PINYIN_VER
     pyn_dest = 'scim-pinyin-%s.tar.gz' % SCIM_PINYIN_VER
-    download( url, pyn_dest )
-    
+    download(url, pyn_dest)
+
     # Get libtabe-$(LIBTABE_VER).tgz:
-    url  = 'http://%s.dl.sourceforge.net/sourceforge/libtabe/libtabe-%s.tgz' % ( SF_MIRROR, LIBTABE_VER )
+    url = sfurlbase + 'libtabe/libtabe-%s.tgz' % LIBTABE_VER
     lbt_dest = 'libtabe-%s.tgz' % LIBTABE_VER
-    download( url, lbt_dest )
-    
+    download(url, lbt_dest)
+
     # Unihan.txt
-    ( t2s_1tomany, s2t_1tomany ) = unihanParser( han_dest )
+    (t2s_1tomany, s2t_1tomany) = unihanParser(han_dest)
+
+    t2s_1tomany.update(charManualTable('symme_supp.manual'))
+    t2s_1tomany.update(charManualTable('trad2simp.manual'))
+    s2t_1tomany.update((t[0], [f]) for (f, t) in charManualTable('symme_supp.manual'))
+    s2t_1tomany.update(charManualTable('simp2trad.manual'))
 
-    t2s_1tomany.update( charManualTable( 'symme_supp.manual' ) )
-    t2s_1tomany.update( charManualTable( 'trad2simp.manual' ) )
-    s2t_1tomany.update( ( t[0], [f] ) for ( f, t ) in charManualTable( 'symme_supp.manual' ) )
-    s2t_1tomany.update( charManualTable( 'simp2trad.manual' ) )
-    
     if pyversion[:1] in ['2']:
-      t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.iteritems()] )
-      s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.iteritems()] )
+        t2s_1to1 = dict([(f, t[0]) for (f, t) in t2s_1tomany.iteritems()])
+        s2t_1to1 = dict([(f, t[0]) for (f, t) in s2t_1tomany.iteritems()])
     else:
-      t2s_1to1 = dict( [( f, t[0] ) for ( f, t ) in t2s_1tomany.items()] )
-      s2t_1to1 = dict( [( f, t[0] ) for ( f, t ) in s2t_1tomany.items()] )
-    
-    s_tomany = toManyRules( t2s_1tomany )
-    t_tomany = toManyRules( s2t_1tomany )
+        t2s_1to1 = dict([(f, t[0]) for (f, t) in t2s_1tomany.items()])
+        s2t_1to1 = dict([(f, t[0]) for (f, t) in s2t_1tomany.items()])
+
+    s_tomany = toManyRules(t2s_1tomany)
+    t_tomany = toManyRules(s2t_1tomany)
 
     # noconvert rules
-    t2s_1to1 = removeRules( 'trad2simp_noconvert.manual', t2s_1to1 )
-    s2t_1to1 = removeRules( 'simp2trad_noconvert.manual', s2t_1to1 )
-    
+    t2s_1to1 = removeRules('trad2simp_noconvert.manual', t2s_1to1)
+    s2t_1to1 = removeRules('simp2trad_noconvert.manual', s2t_1to1)
+
     # the supper set for word to word conversion
     t2s_1to1_supp = t2s_1to1.copy()
     s2t_1to1_supp = s2t_1to1.copy()
-    t2s_1to1_supp.update( customRules( 'trad2simp_supp_set.manual' ) )
-    s2t_1to1_supp.update( customRules( 'simp2trad_supp_set.manual' ) )
-    
+    t2s_1to1_supp.update(customRules('trad2simp_supp_set.manual'))
+    s2t_1to1_supp.update(customRules('simp2trad_supp_set.manual'))
+
     # word to word manual rules
-    t2s_word2word_manual = manualWordsTable( 'simpphrases.manual', s2t_1to1_supp, t2s_1to1_supp )
-    t2s_word2word_manual.update( customRules( 'toSimp.manual' ) )
-    s2t_word2word_manual = manualWordsTable( 'tradphrases.manual', t2s_1to1_supp, s2t_1to1_supp )
-    s2t_word2word_manual.update( customRules( 'toTrad.manual' ) )
+    t2s_word2word_manual = manualWordsTable('simpphrases.manual',
+                                            s2t_1to1_supp, t2s_1to1_supp)
+    t2s_word2word_manual.update(customRules('toSimp.manual'))
+    s2t_word2word_manual = manualWordsTable('tradphrases.manual',
+                                            t2s_1to1_supp, s2t_1to1_supp)
+    s2t_word2word_manual.update(customRules('toTrad.manual'))
 
     # word to word rules from input methods
     t_wordlist = set()
     s_wordlist = set()
-    t_wordlist.update( ezbigParser( tbe_dest ),
-                       tsiParser( lbt_dest ) )
-    s_wordlist.update( wubiParser( tbe_dest ),
-                       zrmParser( tbe_dest ),
-                       phraseParser( pyn_dest ) )
+    t_wordlist.update(ezbigParser(tbe_dest),
+                      tsiParser(lbt_dest))
+    s_wordlist.update(wubiParser(tbe_dest),
+                      zrmParser(tbe_dest),
+                      phraseParser(pyn_dest))
 
     # exclude
-    s_wordlist = applyExcludes( s_wordlist, 'simpphrases_exclude.manual' )
-    t_wordlist = applyExcludes( t_wordlist, 'tradphrases_exclude.manual' )
+    s_wordlist = applyExcludes(s_wordlist, 'simpphrases_exclude.manual')
+    t_wordlist = applyExcludes(t_wordlist, 'tradphrases_exclude.manual')
 
     s2t_supp = s2t_1to1_supp.copy()
-    s2t_supp.update( s2t_word2word_manual )
+    s2t_supp.update(s2t_word2word_manual)
     t2s_supp = t2s_1to1_supp.copy()
-    t2s_supp.update( t2s_word2word_manual )
+    t2s_supp.update(t2s_word2word_manual)
 
     # parse list to dict
-    t2s_word2word = defaultWordsTable( s_wordlist, s_tomany, s2t_1to1_supp, t2s_supp )
-    t2s_word2word.update( t2s_word2word_manual )
-    s2t_word2word = defaultWordsTable( t_wordlist, t_tomany, t2s_1to1_supp, s2t_supp )
-    s2t_word2word.update( s2t_word2word_manual )
-    
+    t2s_word2word = defaultWordsTable(s_wordlist, s_tomany,
+                                      s2t_1to1_supp, t2s_supp)
+    t2s_word2word.update(t2s_word2word_manual)
+    s2t_word2word = defaultWordsTable(t_wordlist, t_tomany,
+                                      t2s_1to1_supp, s2t_supp)
+    s2t_word2word.update(s2t_word2word_manual)
+
     # Final tables
     # sorted list toHans
     if pyversion[:1] in ['2']:
-        t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.iteritems() if f != t] )
+        t2s_1to1 = dict([(f, t) for (f, t) in t2s_1to1.iteritems() if f != t])
     else:
-        t2s_1to1 = dict( [( f, t ) for ( f, t ) in t2s_1to1.items() if f != t] )
-    toHans = dictToSortedList( t2s_1to1, 0 ) + dictToSortedList( t2s_word2word, 1 )
+        t2s_1to1 = dict([(f, t) for (f, t) in t2s_1to1.items() if f != t])
+    toHans = dictToSortedList(t2s_1to1, 0) + dictToSortedList(t2s_word2word, 1)
     # sorted list toHant
     if pyversion[:1] in ['2']:
-        s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.iteritems() if f != t] )
+        s2t_1to1 = dict([(f, t) for (f, t) in s2t_1to1.iteritems() if f != t])
     else:
-        s2t_1to1 = dict( [( f, t ) for ( f, t ) in s2t_1to1.items() if f != t] )
-    toHant = dictToSortedList( s2t_1to1, 0 ) + dictToSortedList( s2t_word2word, 1 )
+        s2t_1to1 = dict([(f, t) for (f, t) in s2t_1to1.items() if f != t])
+    toHant = dictToSortedList(s2t_1to1, 0) + dictToSortedList(s2t_word2word, 1)
     # sorted list toCN
-    toCN = dictToSortedList( customRules( 'toCN.manual' ), 1 )
+    toCN = dictToSortedList(customRules('toCN.manual'), 1)
     # sorted list toHK
-    toHK = dictToSortedList( customRules( 'toHK.manual' ), 1 )
+    toHK = dictToSortedList(customRules('toHK.manual'), 1)
     # sorted list toTW
-    toTW = dictToSortedList( customRules( 'toTW.manual' ), 1 )
-    
+    toTW = dictToSortedList(customRules('toTW.manual'), 1)
+
     # Get PHP Array
     php = '''<?php
 /**
@@ -387,25 +415,25 @@ def main():
  */
 
 $zh2Hant = array(\n'''
-    php += PHPArray( toHant ) \
-        +  '\n);\n\n$zh2Hans = array(\n' \
-        +  PHPArray( toHans ) \
-        +  '\n);\n\n$zh2TW = array(\n' \
-        +  PHPArray( toTW ) \
-        +  '\n);\n\n$zh2HK = array(\n' \
-        +  PHPArray( toHK ) \
-        +  '\n);\n\n$zh2CN = array(\n' \
-        +  PHPArray( toCN ) \
-        +  '\n);\n'
-    
+    php += PHPArray(toHant) \
+        + '\n);\n\n$zh2Hans = array(\n' \
+        + PHPArray(toHans) \
+        + '\n);\n\n$zh2TW = array(\n' \
+        + PHPArray(toTW) \
+        + '\n);\n\n$zh2HK = array(\n' \
+        + PHPArray(toHK) \
+        + '\n);\n\n$zh2CN = array(\n' \
+        + PHPArray(toCN) \
+        + '\n);\n'
+
     if pyversion[:1] in ['2']:
-        f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'wb', encoding = 'utf8' )
+        f = open(os.path.join('..', '..', '..', 'includes', 'ZhConversion.php'), 'wb', encoding='utf8')
     else:
-        f = open( os.path.join( '..', '..', '..', 'includes', 'ZhConversion.php' ), 'w', buffering = 4096, encoding = 'utf8' )
+        f = open(os.path.join('..', '..', '..', 'includes', 'ZhConversion.php'), 'w', buffering=4096, encoding='utf8')
     print ('Writing ZhConversion.php ... ')
-    f.write( php )
+    f.write(php)
     f.close()
-    
+
     # Remove temporary files
     print ('Deleting temporary files ... ')
     os.remove('EZ-Big.txt.in')
@@ -414,7 +442,7 @@ $zh2Hant = array(\n'''
     os.remove('Unihan_Variants.txt')
     os.remove('Wubi.txt.in')
     os.remove('Ziranma.txt.in')
-    
+
 
 if __name__ == '__main__':
     main()
index 5b09ffd..a192db7 100644 (file)
@@ -1224,7 +1224,7 @@ CREATE TABLE /*_*/l10n_cache (
 );
 CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
 
--- Table for caching JSON message texts for the resource loader
+-- Table for caching JSON message texts for ResourceLoader
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource nvarchar(255) NOT NULL,
index 088f677..184cba8 100644 (file)
@@ -179,22 +179,22 @@ class NamespaceConflictChecker extends Maintenance {
 
                foreach ( $spaces as $name => $ns ) {
                        if ( $ns != 0 ) {
-                               // Fix up link destinations for non-interwiki links only.
-                               //
-                               // For example if a page has [[Foo:Bar]] and then a Foo namespace
-                               // is introduced, pagelinks needs to be updated to have
-                               // page_namespace = NS_FOO.
-                               //
-                               // If instead an interwiki prefix was introduced called "Foo",
-                               // the link should instead be moved to the iwlinks table. If a new
-                               // language is introduced called "Foo", or if there is a pagelink
-                               // [[fr:Bar]] when interlanguage magic links are turned on, the
-                               // link would have to be moved to the langlinks table. Let's put
-                               // those cases in the too-hard basket for now. The consequences are
-                               // not especially severe.
-                               //
-                               // @fixme Handle interwiki links, and pagelinks to Category:, File:
-                               // which probably need reparsing.
+                               /* Fix up link destinations for non-interwiki links only.
+                                *
+                                * For example if a page has [[Foo:Bar]] and then a Foo namespace
+                                * is introduced, pagelinks needs to be updated to have
+                                * page_namespace = NS_FOO.
+                                *
+                                * If instead an interwiki prefix was introduced called "Foo",
+                                * the link should instead be moved to the iwlinks table. If a new
+                                * language is introduced called "Foo", or if there is a pagelink
+                                * [[fr:Bar]] when interlanguage magic links are turned on, the
+                                * link would have to be moved to the langlinks table. Let's put
+                                * those cases in the too-hard basket for now. The consequences are
+                                * not especially severe.
+                                * @fixme Handle interwiki links, and pagelinks to Category:, File:
+                                * which probably need reparsing.
+                                */
 
                                $this->checkLinkTable( 'pagelinks', 'pl', $ns, $name, $options );
                                $this->checkLinkTable( 'templatelinks', 'tl', $ns, $name, $options );
@@ -592,14 +592,15 @@ class NamespaceConflictChecker extends Maintenance {
 
                $this->db->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
 
-               // Call LinksDeletionUpdate to delete outgoing links from the old title,
-               // and update category counts.
-               //
-               // Calling external code with a fake broken Title is a fairly dubious
-               // idea. It's necessary because it's quite a lot of code to duplicate,
-               // but that also makes it fragile since it would be easy for someone to
-               // accidentally introduce an assumption of title validity to the code we
-               // are calling.
+               /* Call LinksDeletionUpdate to delete outgoing links from the old title,
+                * and update category counts.
+                *
+                * Calling external code with a fake broken Title is a fairly dubious
+                * idea. It's necessary because it's quite a lot of code to duplicate,
+                * but that also makes it fragile since it would be easy for someone to
+                * accidentally introduce an assumption of title validity to the code we
+                * are calling.
+                */
                $update = new LinksDeletionUpdate( $wikiPage );
                $update->doUpdate();
                $this->db->commit( __METHOD__ );
index 66553bc..65d272b 100644 (file)
@@ -25,7 +25,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Mainteance script to populate the category table.
+ * Maintenance script to populate the category table.
  *
  * @ingroup Maintenance
  */
index 06e1449..ed16805 100644 (file)
@@ -242,13 +242,8 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-
                $updates = $content->getSecondaryDataUpdates( $page->getTitle() );
                DataUpdate::runUpdates( $updates );
-
-               $dbw->commit( __METHOD__ );
        }
 
        /**
index 120ccb6..f7907ad 100644 (file)
@@ -757,13 +757,14 @@ class CgzCopyTransaction {
                        return;
                }
 
-               // Check to see if the target text_ids have been moved already.
-               //
-               // We originally read from the slave, so this can happen when a single
-               // text_id is shared between multiple pages. It's rare, but possible
-               // if a delete/move/undelete cycle splits up a null edit.
-               //
-               // We do a locking read to prevent closer-run race conditions.
+               /* Check to see if the target text_ids have been moved already.
+                *
+                * We originally read from the slave, so this can happen when a single
+                * text_id is shared between multiple pages. It's rare, but possible
+                * if a delete/move/undelete cycle splits up a null edit.
+                *
+                * We do a locking read to prevent closer-run race conditions.
+                */
                $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
                $res = $dbw->select( 'blob_tracking',
index 638b99d..35e7ec2 100644 (file)
@@ -1496,7 +1496,7 @@ CREATE TABLE /*_*/l10n_cache (
 ) /*$wgDBTableOptions*/;
 CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
 
--- Table for caching JSON message blobs for the resource loader
+-- Table for caching JSON message blobs for ResourceLoader
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource varbinary(255) NOT NULL,
index d67ef6b..c800664 100644 (file)
@@ -71,11 +71,9 @@ class UpdateSpecialPages extends Maintenance {
                        if ( $specialObj instanceof QueryPage ) {
                                $queryPage = $specialObj;
                        } else {
-                               if ( !class_exists( $class ) ) {
-                                       $file = $specialObj->getFile();
-                                       require_once $file;
-                               }
-                               $queryPage = new $class;
+                               $class = get_class( $specialObj );
+                               $this->error( "$class is not an instance of QueryPage.\n", 1 );
+                               die;
                        }
 
                        if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
index 99ba3b8..f4ffbd0 100644 (file)
@@ -105,7 +105,9 @@ class UserOptions {
                return true;
        }
 
-       // Dumb stuff to run a mode.
+       /**
+        * Dumb stuff to run a mode.
+        */
        public function run() {
                if ( !$this->mReady ) {
                        return false;
@@ -116,11 +118,9 @@ class UserOptions {
                return true;
        }
 
-       #
-       # Modes.
-       #
-
-       /** List default options and their value */
+       /**
+        * List default options and their value
+        */
        private function LISTER() {
                $def = User::getDefaultOptions();
                ksort( $def );
@@ -133,7 +133,9 @@ class UserOptions {
                }
        }
 
-       /** List options usage */
+       /**
+        * List options usage
+        */
        private function USAGER() {
                $ret = array();
                $defaultOptions = User::getDefaultOptions();
@@ -186,7 +188,9 @@ class UserOptions {
                }
        }
 
-       /** Change our users options */
+       /**
+        * Change our users options
+        */
        private function CHANGER() {
                $this->warn();
 
@@ -242,10 +246,6 @@ class UserOptions {
                return $ret;
        }
 
-       #
-       # Helper methods
-       #
-
        public static function showUsageAndExit() {
                print <<<USAGE
 
index fb637f7..8b2d6e5 100644 (file)
@@ -96,9 +96,9 @@
                $( '#config_wgSitename' ).on( 'keyup change', syncText ).each( syncText );
 
                // Show/Hide memcached servers when needed
-               $( 'input[name$="config_wgMainCacheType"]' ).change( function () {
+               $( 'input[name$="config__MainCacheType"]' ).change( function () {
                        var $memc = $( '#config-memcachewrapper' );
-                       if ( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
+                       if ( $( 'input[name$="config__MainCacheType"]:checked' ).val() === 'memcached' ) {
                                $memc.show( 'slow' );
                        } else {
                                $memc.hide( 'slow' );
index 0b56972..0d6a76c 100644 (file)
@@ -44,16 +44,17 @@ print Xml::openElement( 'OpenSearchDescription',
                'xmlns' => 'http://a9.com/-/spec/opensearch/1.1/',
                'xmlns:moz' => 'http://www.mozilla.org/2006/browser/search/' ) );
 
-// The spec says the ShortName must be no longer than 16 characters,
-// but 16 is *realllly* short. In practice, browsers don't appear to care
-// when we give them a longer string, so we're no longer attempting to trim.
-//
-// Note: ShortName and the <link title=""> need to match; they are used as
-// a key for identifying if the search engine has been added already, *and*
-// as the display name presented to the end-user.
-//
-// Behavior seems about the same between Firefox and IE 7/8 here.
-// 'Description' doesn't appear to be used by either.
+/* The spec says the ShortName must be no longer than 16 characters,
+ * but 16 is *realllly* short. In practice, browsers don't appear to care
+ * when we give them a longer string, so we're no longer attempting to trim.
+ *
+ * Note: ShortName and the <link title=""> need to match; they are used as
+ * a key for identifying if the search engine has been added already, *and*
+ * as the display name presented to the end-user.
+ *
+ * Behavior seems about the same between Firefox and IE 7/8 here.
+ * 'Description' doesn't appear to be used by either.
+ */
 $fullName = wfMessage( 'opensearch-desc' )->inContentLanguage()->text();
 print Xml::element( 'ShortName', null, $fullName );
 print Xml::element( 'Description', null, $fullName );
index 3ae7b78..209d325 100644 (file)
@@ -13,7 +13,7 @@
     "grunt-contrib-jshint": "0.11.3",
     "grunt-contrib-watch": "0.6.1",
     "grunt-jscs": "2.1.0",
-    "grunt-jsonlint": "1.0.4",
+    "grunt-jsonlint": "1.0.5",
     "grunt-karma": "0.12.1",
     "karma": "0.13.10",
     "karma-chrome-launcher": "0.2.0",
index ccc7b42..376e582 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -1,9 +1,6 @@
 <?xml version="1.0"?>
 <ruleset name="MediaWiki">
-       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
-               <!-- Disable failing rules -->
-               <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.EmptyComment"/>
-       </rule>
+       <rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki" />
        <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
                <properties>
                        <property name="ignoreList" type="array" value="bfNormalizeTitleStrReplace,bfNormalizeTitleStrTr,cdbShowHelp,codepointToUtf8,compare_point,cssfilter,escapeSingleString,findAuxFile,findFiles,getEscapedProfileUrl,getFileCommentFromSourceWiki,getFileUserFromSourceWiki,hexSequenceToUtf8,mccGetHelp,mccShowUsage,mimeTypeMatch,moveToExternal,NothingFunction,NothingFunctionData,resolveStub,resolveStubs,showUsage,splitFilename,utf8ToCodepoint,utf8ToHexSequence" />
index fee1e7c..b1b1541 100644 (file)
@@ -1238,6 +1238,7 @@ return array(
        ),
        'mediawiki.ForeignStructuredUpload.BookletLayout' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js',
+               'styles' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css',
                'dependencies' => array(
                        'mediawiki.ForeignStructuredUpload',
                        'mediawiki.Upload.BookletLayout',
@@ -1317,6 +1318,9 @@ return array(
                'scripts' => 'resources/src/mediawiki/mediawiki.experiments.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.raggett' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.raggett.css'
+       ),
 
        /* MediaWiki Action */
 
@@ -2031,6 +2035,8 @@ return array(
                'dependencies' => array(
                        'oojs-ui',
                        'mediawiki.api',
+                       'mediawiki.ForeignApi',
+                       'mediawiki.Title',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
index d6f61ae..162790e 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "DzWiki",
-                       "Semso98"
+                       "Semso98",
+                       "Srdjan m"
                ]
        },
        "ooui-outline-control-move-down": "Premjesti stavku dolje",
@@ -16,5 +17,6 @@
        "ooui-dialog-process-error": "Nešto je pošlo naopako",
        "ooui-dialog-process-dismiss": "Odbaci",
        "ooui-dialog-process-retry": "Pokušajte ponovo",
-       "ooui-dialog-process-continue": "Nastavi"
+       "ooui-dialog-process-continue": "Nastavi",
+       "ooui-selectfile-placeholder": "Nijedna datoteka nije izabrana"
 }
index 0d86aa6..fb93e3a 100644 (file)
@@ -26,6 +26,7 @@
        "ooui-dialog-process-dismiss": "Zavřít",
        "ooui-dialog-process-retry": "Zkusit znovu",
        "ooui-dialog-process-continue": "Pokračovat",
+       "ooui-selectfile-button-select": "Vybrat soubor",
        "ooui-selectfile-not-supported": "Výběr souboru není podporován",
        "ooui-selectfile-placeholder": "Nebyl vybrán žádný soubor"
 }
index bdf015f..0b9e149 100644 (file)
@@ -29,7 +29,8 @@
        "ooui-dialog-process-dismiss": "Hylkää",
        "ooui-dialog-process-retry": "Yritä uudelleen",
        "ooui-dialog-process-continue": "Jatka",
+       "ooui-selectfile-button-select": "Valitse tiedosto",
        "ooui-selectfile-not-supported": "Tiedoston valitsemista ei tueta",
        "ooui-selectfile-placeholder": "Tiedostoa ei ole valittu",
-       "ooui-selectfile-dragdrop-placeholder": "Pudota tiedosto (tai selaa tiedostoja napsauttamalla)"
+       "ooui-selectfile-dragdrop-placeholder": "Pudota tiedosto tähän"
 }
index 515eada..d222d1c 100644 (file)
@@ -32,6 +32,8 @@
        "ooui-dialog-process-dismiss": "Sluiten",
        "ooui-dialog-process-retry": "Opnieuw proberen",
        "ooui-dialog-process-continue": "Doorgaan",
+       "ooui-selectfile-button-select": "Selecteer een bestand",
        "ooui-selectfile-not-supported": "Selectie van een bestand wordt niet ondersteund",
-       "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd"
+       "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd",
+       "ooui-selectfile-dragdrop-placeholder": "Sleep hier een bestand heen"
 }
index 5012934..131413e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.13.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:26Z
+ * Date: 2015-10-27T17:53:00Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        width: 1.875em;
        height: 1.875em;
 }
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity @medium-ease);*/
-}
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
        outline: none;
        border: 1px #c9c9c9 solid;
        -webkit-transition: border-color 100ms ease;
           -moz-transition: border-color 100ms ease;
-           -ms-transition: border-color 100ms ease;
-            -o-transition: border-color 100ms ease;
                transition: border-color 100ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        margin-right: 0.3em;
 }
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       /* -0.5 - 0.475 */
        margin-left: -0.005em;
        margin-right: -0.005em;
 }
 }
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
 }
 .oo-ui-draggableElement-dragging {
        cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
        position: absolute;
        -webkit-transition: all 200ms ease;
           -moz-transition: all 200ms ease;
-           -ms-transition: all 200ms ease;
-            -o-transition: all 200ms ease;
                transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
        border: 1px solid transparent;
        -webkit-transition: border-color 250ms ease;
           -moz-transition: border-color 250ms ease;
-           -ms-transition: border-color 250ms ease;
-            -o-transition: border-color 250ms ease;
                transition: border-color 250ms ease;
 }
 .oo-ui-toolGroup-empty {
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/apex/images/icons/check.png");
+       background-size: contain;
+       background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #e1f3ff;
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless:last-child.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin: 0 1em;
        line-height: 3.40625em;
-       /* 43/12.8 */
 }
 .oo-ui-toolbar-shadow {
        background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
        opacity: 0.5;
        -webkit-transition: opacity 500ms ease;
           -moz-transition: opacity 500ms ease;
-           -ms-transition: opacity 500ms ease;
-            -o-transition: opacity 500ms ease;
                transition: opacity 500ms ease;
 }
 .oo-ui-optionWidget {
        -webkit-transform: translateZ(0px);
           -moz-transform: translateZ(0px);
            -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
                transform: translateZ(0px);
        height: 2em;
        width: 4em;
        border: 1px #c9c9c9 solid;
        -webkit-transition: left 250ms ease, margin-left 250ms ease;
           -moz-transition: left 250ms ease, margin-left 250ms ease;
-           -ms-transition: left 250ms ease, margin-left 250ms ease;
-            -o-transition: left 250ms ease, margin-left 250ms ease;
                transition: left 250ms ease, margin-left 250ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
        -webkit-transition: opacity 250ms ease;
           -moz-transition: opacity 250ms ease;
-           -ms-transition: opacity 250ms ease;
-            -o-transition: opacity 250ms ease;
                transition: opacity 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
        border-right: 1px solid #cccccc;
        -webkit-transition: width 250ms ease, margin-left 250ms ease;
           -moz-transition: width 250ms ease, margin-left 250ms ease;
-           -ms-transition: width 250ms ease, margin-left 250ms ease;
-            -o-transition: width 250ms ease, margin-left 250ms ease;
                transition: width 250ms ease, margin-left 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
        -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
                animation: oo-ui-progressBarWidget-slide 2s infinite linear;
        width: 40%;
        margin-left: -10%;
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
        -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
           -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-           -ms-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-            -o-transition: width 100ms ease, height 100ms ease, left 100ms ease;
                transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget textarea {
+       overflow: auto;
+}
 .oo-ui-textInputWidget input[type="search"] {
        -webkit-appearance: none;
 }
        border-radius: 0.25em;
        -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
           -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
-           -ms-transition: border-color 250ms ease, box-shadow 250ms ease;
-            -o-transition: border-color 250ms ease, box-shadow 250ms ease;
                transition: border-color 250ms ease, box-shadow 250ms ease;
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
        opacity: 0;
        z-index: 1;
        cursor: pointer;
-       /* Push the button part of the native control out of view, as it changes the cursor */
        padding-top: 100px;
 }
 .oo-ui-selectFileWidget-selectButton.oo-ui-widget-disabled > .oo-ui-buttonElement-button > input[type="file"] {
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        padding: 0 1em;
        vertical-align: middle;
-       /* Adjust for border so text aligns with title */
        margin: -1px;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
        opacity: 0;
        -webkit-transition: opacity 250ms ease;
           -moz-transition: opacity 250ms ease;
-           -ms-transition: opacity 250ms ease;
-            -o-transition: opacity 250ms ease;
                transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        -webkit-transform: scale(0.5);
           -moz-transform: scale(0.5);
            -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
                transform: scale(0.5);
        -webkit-transition: all 250ms ease;
           -moz-transition: all 250ms ease;
-           -ms-transition: all 250ms ease;
-            -o-transition: all 250ms ease;
                transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-       /* Fade window overlay */
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-       /* Fade frame */
        opacity: 1;
        -webkit-transform: scale(1);
           -moz-transform: scale(1);
            -ms-transform: scale(1);
-            -o-transform: scale(1);
                transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
index dab3c78..3158bfe 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.13.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:18Z
+ * Date: 2015-10-27T17:52:51Z
  */
 /**
  * @class
index a19ebea..96ba45c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.13.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:26Z
+ * Date: 2015-10-27T17:53:00Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        position: relative;
        -webkit-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
           -moz-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
-           -ms-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
-            -o-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
                transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 }
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
 }
 .oo-ui-draggableElement-dragging {
        cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
        position: absolute;
        -webkit-transition: all 200ms ease;
           -moz-transition: all 200ms ease;
-           -ms-transition: all 200ms ease;
-            -o-transition: all 200ms ease;
                transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
 .oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin: 0 1em;
        line-height: 3.125em;
-       /* 40/12.8 */
 }
 .oo-ui-optionWidget {
        position: relative;
        -webkit-transform: translateZ(0px);
           -moz-transform: translateZ(0px);
            -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
                transform: translateZ(0px);
        height: 2em;
        width: 3.5em;
+       border: 1px solid #777777;
        border-radius: 1em;
-       border: 1px #555555 solid;
-       background: #ffffff;
-       -webkit-transition: background-color 100ms ease;
-          -moz-transition: background-color 100ms ease;
-           -ms-transition: background-color 100ms ease;
-            -o-transition: background-color 100ms ease;
-               transition: background-color 100ms ease;
+       background-color: #ffffff;
        margin-right: 0.5em;
+       -webkit-transition: background-color 100ms ease, border-color 100ms ease;
+          -moz-transition: background-color 100ms ease, border-color 100ms ease;
+               transition: background-color 100ms ease, border-color 100ms ease;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        cursor: default;
 .oo-ui-toggleSwitchWidget:last-child {
        margin-right: 0;
 }
-.oo-ui-toggleSwitchWidget-grip {
-       top: 0.5em;
-       left: 0.5em;
-       width: 1em;
-       height: 1em;
-       margin-top: -1px;
+.oo-ui-toggleSwitchWidget:before {
+       content: "";
+       display: block;
+       position: absolute;
+       top: 0;
+       left: 0;
+       bottom: 0;
+       right: 0;
+       border: 1px solid transparent;
        border-radius: 1em;
-       background: #555555;
+       z-index: 1;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.35em;
+       width: 1.2em;
+       height: 1.2em;
+       border-radius: 1.2em;
+       background-color: #555555;
        -webkit-transition: left 100ms ease, margin-left 100ms ease;
           -moz-transition: left 100ms ease, margin-left 100ms ease;
-           -ms-transition: left 100ms ease, margin-left 100ms ease;
-            -o-transition: left 100ms ease, margin-left 100ms ease;
                transition: left 100ms ease, margin-left 100ms ease;
 }
 .oo-ui-toggleSwitchWidget-glow {
        display: none;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2em;
+       left: 1.9em;
        margin-left: -2px;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.5em;
+       left: 0.4em;
        margin-left: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
-       outline: none;
-       border-color: #347bff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
-       border-color: #ffffff;
-       box-shadow: 0 0 0 1px #347bff;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
        border-color: #2962cc;
-       box-shadow: 0 0 0 1px #2962cc;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover.oo-ui-toggleWidget-on {
        background: #2962cc;
        border-color: #2962cc;
 }
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
+       border-color: #347bff;
+       outline: none;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
+       border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on:before {
+       border-color: #ffffff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover {
+       background-color: #347bff;
+       border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active .oo-ui-toggleSwitchWidget-grip,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        background: #dddddd;
        background: #dddddd;
        -webkit-transition: width 200ms, margin-left 200ms;
           -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
                transition: width 200ms, margin-left 200ms;
 }
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
        -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
                animation: oo-ui-progressBarWidget-slide 2s infinite linear;
        width: 40%;
        margin-left: -10%;
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
        -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
           -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-           -ms-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-            -o-transition: width 100ms ease, height 100ms ease, left 100ms ease;
                transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
        -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
                transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
 .oo-ui-checkboxInputWidget input[type="checkbox"]:hover + span {
        border-bottom-width: 3px;
 }
-.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled {
        cursor: default;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
        background-color: #eeeeee;
        border-color: #eeeeee;
 }
 .oo-ui-radioInputWidget input[type="radio"] + span {
        -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
                transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
 .oo-ui-radioInputWidget input[type="radio"]:hover + span {
        border-bottom-width: 3px;
 }
-.oo-ui-radioInputWidget input[type="radio"]:disabled + span {
+.oo-ui-radioInputWidget input[type="radio"]:disabled {
        cursor: default;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled + span {
        background-color: #eeeeee;
        border-color: #eeeeee;
 }
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget textarea {
+       overflow: auto;
+}
 .oo-ui-textInputWidget input[type="search"] {
        -webkit-appearance: none;
 }
        border-radius: 0.1em;
        -webkit-transition: box-shadow 100ms ease;
           -moz-transition: box-shadow 100ms ease;
-           -ms-transition: box-shadow 100ms ease;
-            -o-transition: box-shadow 100ms ease;
                transition: box-shadow 100ms ease;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
        -webkit-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
           -moz-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-           -ms-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-            -o-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
                transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
        opacity: 0;
        z-index: 1;
        cursor: pointer;
-       /* Push the button part of the native control out of view, as it changes the cursor */
        padding-top: 100px;
 }
 .oo-ui-selectFileWidget-selectButton.oo-ui-widget-disabled > .oo-ui-buttonElement-button > input[type="file"] {
        opacity: 0;
        -webkit-transition: opacity 250ms ease;
           -moz-transition: opacity 250ms ease;
-           -ms-transition: opacity 250ms ease;
-            -o-transition: opacity 250ms ease;
                transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        -webkit-transform: scale(0.5);
           -moz-transform: scale(0.5);
            -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
                transform: scale(0.5);
        -webkit-transition: all 250ms ease;
           -moz-transition: all 250ms ease;
-           -ms-transition: all 250ms ease;
-            -o-transition: all 250ms ease;
                transition: all 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-       /* Fade window overlay */
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-       /* Fade frame */
        opacity: 1;
        -webkit-transform: scale(1);
           -moz-transform: scale(1);
            -ms-transform: scale(1);
-            -o-transform: scale(1);
                transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
index e6344f2..95e8b47 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.13.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:18Z
+ * Date: 2015-10-27T17:52:51Z
  */
 /**
  * @class
index aeff69e..fbffe09 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.13.0
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:18Z
+ * Date: 2015-10-27T17:52:51Z
  */
 ( function ( OO ) {
 
@@ -1289,10 +1289,10 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                        }
                }
        } );
+       // pick up dynamic state, like focus, value of form inputs, scroll position, etc.
+       state = cls.static.gatherPreInfuseState( $elem, data );
        // jscs:disable requireCapitalizedConstructors
        obj = new cls( data ); // rebuild widget
-       // pick up dynamic state, like focus, value of form inputs, scroll position, etc.
-       state = obj.gatherPreInfuseState( $elem );
        // now replace old DOM with this new DOM.
        if ( top ) {
                $elem.replaceWith( obj.$element );
@@ -1310,6 +1310,24 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        return obj;
 };
 
+/**
+ * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
+ * (and its children) that represent an Element of the same class and the given configuration,
+ * generated by the PHP implementation.
+ *
+ * This method is called just before `node` is detached from the DOM. The return value of this
+ * function will be passed to #restorePreInfuseState after the newly created widget's #$element
+ * is inserted into DOM to replace `node`.
+ *
+ * @protected
+ * @param {HTMLElement} node
+ * @param {Object} config
+ * @return {Object}
+ */
+OO.ui.Element.static.gatherPreInfuseState = function () {
+       return {};
+};
+
 /**
  * Get a jQuery function within a specific document.
  *
@@ -1888,23 +1906,6 @@ OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
        return OO.ui.Element.static.scrollIntoView( this.$element[ 0 ], config );
 };
 
-/**
- * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
- * (and its children) that represent an Element of the same type and configuration as the current
- * one, generated by the PHP implementation.
- *
- * This method is called just before `node` is detached from the DOM. The return value of this
- * function will be passed to #restorePreInfuseState after this widget's #$element is inserted into
- * DOM to replace `node`.
- *
- * @protected
- * @param {HTMLElement} node
- * @return {Object}
- */
-OO.ui.Element.prototype.gatherPreInfuseState = function () {
-       return {};
-};
-
 /**
  * Restore the pre-infusion dynamic state for this widget.
  *
@@ -9730,6 +9731,8 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
        if ( this.outlined ) {
                this.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );
+               this.scrolling = false;
+               this.stackLayout.connect( this, { visibleItemChange: 'onStackLayoutVisibleItemChange' } );
        }
        if ( this.autoFocus ) {
                // Event 'focus' does not bubble, but 'focusin' does
@@ -9801,6 +9804,22 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
        }
 };
 
+/**
+ * Handle visibleItemChange events from the stackLayout
+ *
+ * The next visible page is set as the current page by selecting it
+ * in the outline
+ *
+ * @param {OO.ui.PageLayout} page The next visible page in the layout
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page ) {
+       // Set a flag to so that the resulting call to #onStackLayoutSet doesn't
+       // try and scroll the item into view again.
+       this.scrolling = true;
+       this.outlineSelectWidget.selectItemByData( page.getName() );
+       this.scrolling = false;
+};
+
 /**
  * Handle stack layout set events.
  *
@@ -9809,7 +9828,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
  */
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        var layout = this;
-       if ( page ) {
+       if ( !this.scrolling && page ) {
                page.scrollElementIntoView( { complete: function () {
                        if ( layout.autoFocus ) {
                                layout.focus();
@@ -11020,6 +11039,7 @@ OO.ui.StackLayout = function OoUiStackLayout( config ) {
        this.$element.addClass( 'oo-ui-stackLayout' );
        if ( this.continuous ) {
                this.$element.addClass( 'oo-ui-stackLayout-continuous' );
+               this.$element.on( 'scroll', OO.ui.debounce( this.onScroll.bind( this ), 250 ) );
        }
        if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
@@ -11041,8 +11061,66 @@ OO.mixinClass( OO.ui.StackLayout, OO.ui.mixin.GroupElement );
  * @param {OO.ui.Layout|null} item Current panel or `null` if no panel is shown
  */
 
+/**
+ * When used in continuous mode, this event is emitted when the user scrolls down
+ * far enough such that currentItem is no longer visible.
+ *
+ * @event visibleItemChange
+ * @param {OO.ui.PanelLayout} panel The next visible item in the layout
+ */
+
 /* Methods */
 
+/**
+ * Handle scroll events from the layout element
+ *
+ * @param {jQuery.Event} e
+ * @fires visibleItemChange
+ */
+OO.ui.StackLayout.prototype.onScroll = function () {
+       var currentRect,
+               len = this.items.length,
+               currentIndex = this.items.indexOf( this.currentItem ),
+               newIndex = currentIndex,
+               containerRect = this.$element[ 0 ].getBoundingClientRect();
+
+       if ( !containerRect || ( !containerRect.top && !containerRect.bottom ) ) {
+               // Can't get bounding rect, possibly not attached.
+               return;
+       }
+
+       function getRect( item ) {
+               return item.$element[ 0 ].getBoundingClientRect();
+       }
+
+       function isVisible( item ) {
+               var rect = getRect( item );
+               return rect.bottom > containerRect.top && rect.top < containerRect.bottom;
+       }
+
+       currentRect = getRect( this.currentItem );
+
+       if ( currentRect.bottom < containerRect.top ) {
+               // Scrolled down past current item
+               while ( ++newIndex < len ) {
+                       if ( isVisible( this.items[ newIndex ] ) ) {
+                               break;
+                       }
+               }
+       } else if ( currentRect.top > containerRect.bottom ) {
+               // Scrolled up past current item
+               while ( --newIndex >= 0 ) {
+                       if ( isVisible( this.items[ newIndex ] ) ) {
+                               break;
+                       }
+               }
+       }
+
+       if ( newIndex !== currentIndex ) {
+               this.emit( 'visibleItemChange', this.items[ newIndex ] );
+       }
+};
+
 /**
  * Get the current panel.
  *
@@ -14540,6 +14618,21 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );
 
 OO.ui.InputWidget.static.supportsSimpleLabel = true;
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var
+               state = OO.ui.InputWidget.parent.static.gatherPreInfuseState( node, config ),
+               $input = state.$input || $( node ).find( '.oo-ui-inputWidget-input' );
+       state.value = $input.val();
+       // Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward
+       state.focus = $input.is( ':focus' );
+       return state;
+};
+
 /* Events */
 
 /**
@@ -14718,19 +14811,6 @@ OO.ui.InputWidget.prototype.blur = function () {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.InputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.InputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = state.$input || $( node ).find( '.oo-ui-inputWidget-input' );
-       state.value = $input.val();
-       // Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward
-       state.focus = $input.is( ':focus' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -14936,6 +15016,20 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
 
 OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var
+               state = OO.ui.CheckboxInputWidget.parent.static.gatherPreInfuseState( node, config ),
+               $input = $( node ).find( '.oo-ui-inputWidget-input' );
+       state.$input = $input; // shortcut for performance, used in InputWidget
+       state.checked = $input.prop( 'checked' );
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -14990,18 +15084,6 @@ OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
        return this.selected;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.CheckboxInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.CheckboxInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -15225,6 +15307,20 @@ OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
 
 OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var
+               state = OO.ui.RadioInputWidget.parent.static.gatherPreInfuseState( node, config ),
+               $input = $( node ).find( '.oo-ui-inputWidget-input' );
+       state.$input = $input; // shortcut for performance, used in InputWidget
+       state.checked = $input.prop( 'checked' );
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -15263,18 +15359,6 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
        return this.$input.prop( 'checked' );
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.RadioInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.RadioInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -15341,6 +15425,17 @@ OO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );
 
 OO.ui.RadioSelectInputWidget.static.supportsSimpleLabel = false;
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioSelectInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.RadioSelectInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.value = $( node ).find( '.oo-ui-radioInputWidget .oo-ui-inputWidget-input:checked' ).val();
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -15416,15 +15511,6 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.RadioSelectInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var state = OO.ui.RadioSelectInputWidget.parent.prototype.gatherPreInfuseState.call( this, node );
-       state.value = $( node ).find( '.oo-ui-radioInputWidget .oo-ui-inputWidget-input:checked' ).val();
-       return state;
-};
-
 /**
  * TextInputWidgets, like HTML text inputs, can be configured with options that customize the
  * size of the field as well as its presentation. In addition, these widgets can be configured
@@ -15517,6 +15603,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.minRows = config.rows !== undefined ? config.rows : '';
        this.maxRows = config.maxRows || Math.max( 2 * ( this.minRows || 0 ), 10 );
        this.validate = null;
+       this.styleHeight = null;
 
        // Clone for resizing
        if ( this.autosize ) {
@@ -15603,6 +15690,22 @@ OO.ui.TextInputWidget.static.validationPatterns = {
        integer: /^\d+$/
 };
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.TextInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var
+               state = OO.ui.TextInputWidget.parent.static.gatherPreInfuseState( node, config ),
+               $input = $( node ).find( '.oo-ui-inputWidget-input' );
+       state.$input = $input; // shortcut for performance, used in InputWidget
+       if ( config.multiline ) {
+               state.scrollTop = $input.scrollTop();
+       }
+       return state;
+};
+
 /* Events */
 
 /**
@@ -15613,6 +15716,12 @@ OO.ui.TextInputWidget.static.validationPatterns = {
  * @event enter
  */
 
+/**
+ * A `resize` event is emitted when autosize is set and the widget resizes
+ *
+ * @event resize
+ */
+
 /* Methods */
 
 /**
@@ -15802,9 +15911,10 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
  * This only affects #multiline inputs that are {@link #autosize autosized}.
  *
  * @chainable
+ * @fires resize
  */
 OO.ui.TextInputWidget.prototype.adjustSize = function () {
-       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError, idealHeight;
+       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError, idealHeight, newHeight;
 
        if ( this.multiline && this.autosize && this.$input.val() !== this.valCache ) {
                this.$clone
@@ -15839,11 +15949,12 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
                this.$clone.addClass( 'oo-ui-element-hidden' );
 
                // Only apply inline height when expansion beyond natural height is needed
-               if ( idealHeight > innerHeight ) {
-                       // Use the difference between the inner and outer height as a buffer
-                       this.$input.css( 'height', idealHeight + ( outerHeight - innerHeight ) );
-               } else {
-                       this.$input.css( 'height', '' );
+               // Use the difference between the inner and outer height as a buffer
+               newHeight = idealHeight > innerHeight ? idealHeight + ( outerHeight - innerHeight ) : '';
+               if ( newHeight !== this.styleHeight ) {
+                       this.$input.css( 'height', newHeight );
+                       this.styleHeight = newHeight;
+                       this.emit( 'resize' );
                }
        }
        return this;
@@ -15892,30 +16003,74 @@ OO.ui.TextInputWidget.prototype.isAutosizing = function () {
 };
 
 /**
- * Select the entire text of the input.
+ * Focus the input and select a specified range within the text.
  *
+ * @param {number} from Select from offset
+ * @param {number} [to] Select to offset, defaults to from
  * @chainable
  */
-OO.ui.TextInputWidget.prototype.select = function () {
-       this.$input.select();
-       return this;
-};
-
-/**
- * Focus the input and move the cursor to the end.
- */
-OO.ui.TextInputWidget.prototype.moveCursorToEnd = function () {
-       var textRange,
+OO.ui.TextInputWidget.prototype.selectRange = function ( from, to ) {
+       var textRange, isBackwards, start, end,
                element = this.$input[ 0 ];
+
+       to = to || from;
+
+       isBackwards = to < from;
+       start = isBackwards ? to : from;
+       end = isBackwards ? from : to;
+
        this.focus();
-       if ( element.selectionStart !== undefined ) {
-               element.selectionStart = element.selectionEnd = element.value.length;
+
+       if ( element.setSelectionRange ) {
+               element.setSelectionRange( start, end, isBackwards ? 'backward' : 'forward' );
        } else if ( element.createTextRange ) {
                // IE 8 and below
                textRange = element.createTextRange();
-               textRange.collapse( false );
+               textRange.collapse( true );
+               textRange.moveStart( 'character', start );
+               textRange.moveEnd( 'character', end - start );
                textRange.select();
        }
+       return this;
+};
+
+/**
+ * Get the length of the text input value.
+ *
+ * This could differ from the length of #getValue if the
+ * value gets filtered
+ *
+ * @return {number} Input length
+ */
+OO.ui.TextInputWidget.prototype.getInputLength = function () {
+       return this.$input[ 0 ].value.length;
+};
+
+/**
+ * Focus the input and select the entire text.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.select = function () {
+       return this.selectRange( 0, this.getInputLength() );
+};
+
+/**
+ * Focus the input and move the cursor to the start.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.moveCursorToStart = function () {
+       return this.selectRange( 0 );
+};
+
+/**
+ * Focus the input and move the cursor to the end.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.moveCursorToEnd = function () {
+       return this.selectRange( this.getInputLength() );
 };
 
 /**
@@ -16117,20 +16272,6 @@ OO.ui.TextInputWidget.prototype.positionLabel = function () {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.TextInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.TextInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       if ( this.multiline ) {
-               state.scrollTop = $input.scrollTop();
-       }
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -19612,104 +19753,4 @@ OO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {
        }
 };
 
-/*!
- * Deprecated aliases for classes in the `OO.ui.mixin` namespace.
- */
-
-/**
- * @inheritdoc OO.ui.mixin.ButtonElement
- * @deprecated Use {@link OO.ui.mixin.ButtonElement} instead.
- */
-OO.ui.ButtonElement = OO.ui.mixin.ButtonElement;
-
-/**
- * @inheritdoc OO.ui.mixin.ClippableElement
- * @deprecated Use {@link OO.ui.mixin.ClippableElement} instead.
- */
-OO.ui.ClippableElement = OO.ui.mixin.ClippableElement;
-
-/**
- * @inheritdoc OO.ui.mixin.DraggableElement
- * @deprecated Use {@link OO.ui.mixin.DraggableElement} instead.
- */
-OO.ui.DraggableElement = OO.ui.mixin.DraggableElement;
-
-/**
- * @inheritdoc OO.ui.mixin.DraggableGroupElement
- * @deprecated Use {@link OO.ui.mixin.DraggableGroupElement} instead.
- */
-OO.ui.DraggableGroupElement = OO.ui.mixin.DraggableGroupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.FlaggedElement
- * @deprecated Use {@link OO.ui.mixin.FlaggedElement} instead.
- */
-OO.ui.FlaggedElement = OO.ui.mixin.FlaggedElement;
-
-/**
- * @inheritdoc OO.ui.mixin.GroupElement
- * @deprecated Use {@link OO.ui.mixin.GroupElement} instead.
- */
-OO.ui.GroupElement = OO.ui.mixin.GroupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.GroupWidget
- * @deprecated Use {@link OO.ui.mixin.GroupWidget} instead.
- */
-OO.ui.GroupWidget = OO.ui.mixin.GroupWidget;
-
-/**
- * @inheritdoc OO.ui.mixin.IconElement
- * @deprecated Use {@link OO.ui.mixin.IconElement} instead.
- */
-OO.ui.IconElement = OO.ui.mixin.IconElement;
-
-/**
- * @inheritdoc OO.ui.mixin.IndicatorElement
- * @deprecated Use {@link OO.ui.mixin.IndicatorElement} instead.
- */
-OO.ui.IndicatorElement = OO.ui.mixin.IndicatorElement;
-
-/**
- * @inheritdoc OO.ui.mixin.ItemWidget
- * @deprecated Use {@link OO.ui.mixin.ItemWidget} instead.
- */
-OO.ui.ItemWidget = OO.ui.mixin.ItemWidget;
-
-/**
- * @inheritdoc OO.ui.mixin.LabelElement
- * @deprecated Use {@link OO.ui.mixin.LabelElement} instead.
- */
-OO.ui.LabelElement = OO.ui.mixin.LabelElement;
-
-/**
- * @inheritdoc OO.ui.mixin.LookupElement
- * @deprecated Use {@link OO.ui.mixin.LookupElement} instead.
- */
-OO.ui.LookupElement = OO.ui.mixin.LookupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.PendingElement
- * @deprecated Use {@link OO.ui.mixin.PendingElement} instead.
- */
-OO.ui.PendingElement = OO.ui.mixin.PendingElement;
-
-/**
- * @inheritdoc OO.ui.mixin.PopupElement
- * @deprecated Use {@link OO.ui.mixin.PopupElement} instead.
- */
-OO.ui.PopupElement = OO.ui.mixin.PopupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.TabIndexedElement
- * @deprecated Use {@link OO.ui.mixin.TabIndexedElement} instead.
- */
-OO.ui.TabIndexedElement = OO.ui.mixin.TabIndexedElement;
-
-/**
- * @inheritdoc OO.ui.mixin.TitledElement
- * @deprecated Use {@link OO.ui.mixin.TitledElement} instead.
- */
-OO.ui.TitledElement = OO.ui.mixin.TitledElement;
-
 }( OO ) );
index f8216c9..c39dc55 100644 (file)
  */
 
 ( function ( $, mw ) {
-       /* Local scope */
-
        var ts,
                parsers = [];
 
        /* Parser utility functions */
 
        function getParserById( name ) {
-               var i,
-                       len = parsers.length;
-               for ( i = 0; i < len; i++ ) {
+               var i;
+               for ( i = 0; i < parsers.length; i++ ) {
                        if ( parsers[ i ].id.toLowerCase() === name.toLowerCase() ) {
                                return parsers[ i ];
                        }
                        // Cast any numbers or other stuff to a string, methods
                        // like charAt, toLowerCase and split are expected.
                        return String( data );
-               } else {
-                       if ( !node ) {
-                               return $node.text();
-                       } else if ( node.tagName.toLowerCase() === 'img' ) {
-                               return $node.attr( 'alt' ) || ''; // handle undefined alt
-                       } else {
-                               return $.map( $.makeArray( node.childNodes ), function ( elem ) {
-                                       if ( elem.nodeType === Node.ELEMENT_NODE ) {
-                                               return getElementSortKey( elem );
-                                       } else {
-                                               return $.text( elem );
-                                       }
-                               } ).join( '' );
-                       }
                }
+               if ( !node ) {
+                       return $node.text();
+               }
+               if ( node.tagName.toLowerCase() === 'img' ) {
+                       return $node.attr( 'alt' ) || ''; // handle undefined alt
+               }
+               return $.map( $.makeArray( node.childNodes ), function ( elem ) {
+                       if ( elem.nodeType === Node.ELEMENT_NODE ) {
+                               return getElementSortKey( elem );
+                       }
+                       return $.text( elem );
+               } ).join( '' );
        }
 
        function detectParserForColumn( table, rows, column ) {
                        pos = normalized[ i ][ checkCell ];
 
                        l = row[ pos ].length;
-
                        for ( j = 0; j < l; j++ ) {
                                fragment.appendChild( row[ pos ][ j ] );
                        }
 
        function uniqueElements( array ) {
                var uniques = [];
-               $.each( array, function ( index, elem ) {
+               $.each( array, function ( i, elem ) {
                        if ( elem !== undefined && $.inArray( elem, uniques ) === -1 ) {
                                uniques.push( elem );
                        }
                        exploded,
                        $tableHeaders = $( [] ),
                        $tableRows = $( 'thead:eq(0) > tr', table );
+
                if ( $tableRows.length <= 1 ) {
                        $tableHeaders = $tableRows.children( 'th' );
                } else {
        }
 
        function isValueInArray( v, a ) {
-               var i,
-                               len = a.length;
-               for ( i = 0; i < len; i++ ) {
+               var i;
+               for ( i = 0; i < a.length; i++ ) {
                        if ( a[ i ][ 0 ] === v ) {
                                return true;
                        }
                $headers.removeClass( css[ 0 ] ).removeClass( css[ 1 ] ).attr( 'title', msg[ 1 ] );
 
                for ( var i = 0; i < list.length; i++ ) {
-                       $headers.eq( columnToHeader[ list[ i ][ 0 ] ] )
+                       $headers
+                               .eq( columnToHeader[ list[ i ][ 0 ] ] )
                                .addClass( css[ list[ i ][ 1 ] ] )
                                .attr( 'title', msg[ list[ i ][ 1 ] ] );
                }
 
        function multisort( table, sortList, cache ) {
                var i,
-                       sortFn = [],
-                       len = sortList.length;
-               for ( i = 0; i < len; i++ ) {
+                       sortFn = [];
+
+               for ( i = 0; i < sortList.length; i++ ) {
                        sortFn[ i ] = ( sortList[ i ][ 1 ] ) ? sortTextDesc : sortText;
                }
                cache.normalized.sort( function ( array1, array2 ) {
                        var i, col, ret;
-                       for ( i = 0; i < len; i++ ) {
+                       for ( i = 0; i < sortList.length; i++ ) {
                                col = sortList[ i ][ 0 ];
                                ret = sortFn[ i ].call( this, array1[ col ], array2[ col ] );
                                if ( ret !== 0 ) {
                        ascii = separatorTransformTable[ 0 ].split( '\t' ).concat( digitTransformTable[ 0 ].split( '\t' ) );
                        localised = separatorTransformTable[ 1 ].split( '\t' ).concat( digitTransformTable[ 1 ].split( '\t' ) );
 
-                       // Construct regex for number identification
+                       // Construct regexes for number identification
                        for ( i = 0; i < ascii.length; i++ ) {
                                ts.transformTable[ localised[ i ] ] = ascii[ i ];
                                digits.push( mw.RegExp.escape( localised[ i ] ) );
                $table.find( '> tbody > tr' ).each( function () {
                        var i,
                                col = 0,
-                               l = this.cells.length;
-                       for ( i = 0; i < l; i++ ) {
+                               len = this.cells.length;
+                       for ( i = 0; i < len; i++ ) {
                                $( this.cells[ i ] ).data( 'tablesorter', {
                                        realCellIndex: col,
                                        realRowIndex: this.rowIndex
         * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
         * structure [ [ Integer , Integer ], ... ]
         *
-        * @param sortObjects {Array} List of sort objects.
+        * @param {Array} sortObjects List of sort objects.
         * @return {Array} List of internal sort definitions.
         */
-
        function convertSortList( sortObjects ) {
                var sortList = [];
                $.each( sortObjects, function ( i, sortObject ) {
                        },
 
                        addParser: function ( parser ) {
-                               var i,
-                                       len = parsers.length,
-                                       a = true;
-                               for ( i = 0; i < len; i++ ) {
-                                       if ( parsers[ i ].id.toLowerCase() === parser.id.toLowerCase() ) {
-                                               a = false;
-                                       }
-                               }
-                               if ( a ) {
+                               if ( !getParserById( parser.id ) ) {
                                        parsers.push( parser );
                                }
                        },
                format: function ( s ) {
                        var i, item,
                                a = s.split( '.' ),
-                               r = '',
-                               len = a.length;
-                       for ( i = 0; i < len; i++ ) {
+                               r = '';
+                       for ( i = 0; i < a.length; i++ ) {
                                item = a[ i ];
                                if ( item.length === 1 ) {
                                        r += '00' + item;
                        return ts.rgx.isoDate[ 0 ].test( s );
                },
                format: function ( s ) {
-                       var isodate,
-                               matches;
+                       var isodate, matches;
                        if ( !Date.prototype.toISOString ) {
                                // Old browsers don't understand iso, Fallback to US date parsing and ignore the time part.
                                matches = $.trim( s ).match( ts.rgx.isoDate[ 1 ] );
-                               if ( matches ) {
-                                       isodate = new Date( matches[ 2 ]  + '/' + matches[ 3 ] + '/' + matches[ 1 ] );
-                               } else {
+                               if ( !matches ) {
                                        return $.tablesorter.formatFloat( 0 );
                                }
+                               isodate = new Date( matches[ 2 ]  + '/' + matches[ 3 ] + '/' + matches[ 1 ] );
                        } else {
                                matches = s.match( ts.rgx.isoDate[ 0 ] );
-                               if ( matches ) {
-                                       isodate = new Date( $.trim( matches[ 0 ] ) );
-                               } else {
+                               if ( !matches ) {
                                        return $.tablesorter.formatFloat( 0 );
                                }
+                               isodate = new Date( $.trim( matches[ 0 ] ) );
                        }
                        return $.tablesorter.formatFloat( ( isodate !== undefined ) ? isodate.getTime() : 0 );
                },
index 6d0175e..125b1b3 100644 (file)
@@ -8,7 +8,7 @@
         * @param {jQuery.Event} e
         */
        function doLivePreview( e ) {
-               var isDiff, api, request, postData, copySelectors, section,
+               var isDiff, api, parseRequest, diffRequest, postData, copySelectors, section,
                        $wikiPreview, $wikiDiff, $editform, $textbox, $summary, $copyElements, $spinner, $errorBox;
 
                isDiff = ( e.target.name === 'wpDiff' );
                api = new mw.Api();
                postData = {
                        action: 'parse',
-                       uselang: mw.config.get( 'wgUserLanguage' ),
                        title: mw.config.get( 'wgPageName' ),
-                       text: $textbox.textSelection( 'getContents' ),
                        summary: $summary.textSelection( 'getContents' ),
-                       sectionpreview: section !== ''
+                       prop: ''
                };
 
-               if ( section === 'new' ) {
-                       postData.section = 'new';
-                       postData.sectiontitle = postData.summary;
-               }
-
                if ( isDiff ) {
                        $wikiPreview.hide();
 
-                       // First PST the input, then diff it
-                       postData.onlypst = true;
-                       request = api.post( postData );
-                       request.done( function ( response ) {
-                               api.post( {
-                                       action: 'query',
-                                       indexpageids: true,
-                                       prop: 'revisions',
-                                       titles: mw.config.get( 'wgPageName' ),
-                                       rvdifftotext: response.parse.text[ '*' ],
-                                       rvprop: [],
-                                       rvsection: section === '' ? undefined : section
-                               } ).done( function ( response ) {
-                                       try {
-                                               var diffHtml = response.query.pages[ response.query.pageids[ 0 ] ]
-                                                       .revisions[ 0 ].diff[ '*' ];
-                                               $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
-                                       } catch ( e ) {
-                                               // "result.blah is undefined" error, ignore
-                                               mw.log.warn( e );
-                                       }
-                                       $wikiDiff.show();
-                               } );
+                       if ( postData.summary ) {
+                               parseRequest = api.post( postData );
+                       }
+
+                       diffRequest = api.post( {
+                               action: 'query',
+                               indexpageids: true,
+                               prop: 'revisions',
+                               titles: mw.config.get( 'wgPageName' ),
+                               rvdifftotext: $textbox.textSelection( 'getContents' ),
+                               rvdifftotextpst: true,
+                               rvprop: '',
+                               rvsection: section === '' ? undefined : section
+                       } );
+
+                       // Wait for the summary before showing the diff so the page doesn't jump twice
+                       $.when( diffRequest, parseRequest ).done( function ( response ) {
+                               var diffHtml,
+                                       query = response[ 0 ].query;
+                               try {
+                                       diffHtml = query.pages[ query.pageids[ 0 ] ]
+                                               .revisions[ 0 ].diff[ '*' ];
+                                       $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
+                               } catch ( e ) {
+                                       // "result.blah is undefined" error, ignore
+                                       mw.log.warn( e );
+                               }
+                               $wikiDiff.show();
                        } );
                } else {
                        $wikiDiff.hide();
+
                        $.extend( postData, {
+                               prop: 'text|displaytitle|modules|jsconfigvars|categorieshtml|templates|langlinks|limitreporthtml',
+                               text: $textbox.textSelection( 'getContents' ),
                                pst: true,
                                preview: true,
-                               prop: 'text|displaytitle|modules|jsconfigvars|categorieshtml|templates|langlinks|limitreporthtml',
-                               disableeditsection: true
+                               sectionpreview: section !== '',
+                               disableeditsection: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
                        } );
-                       request = api.post( postData );
-                       request.done( function ( response ) {
+                       if ( section === 'new' ) {
+                               postData.section = 'new';
+                               postData.sectiontitle = postData.summary;
+                       }
+
+                       parseRequest = api.post( postData );
+                       parseRequest.done( function ( response ) {
                                var li, newList, $displaytitle, $content, $parent, $list;
                                if ( response.parse.jsconfigvars ) {
                                        mw.config.set( response.parse.jsconfigvars );
                                        $wikiPreview.append( $content );
 
                                        $wikiPreview.show();
-
                                }
                        } );
                }
-               request.done( function ( response ) {
-                       var isSubject = ( section === 'new' ),
+               $.when( parseRequest, diffRequest ).done( function ( parseResp ) {
+                       var parse = parseResp && parseResp[ 0 ].parse,
+                               isSubject = ( section === 'new' ),
                                summaryMsg = isSubject ? 'subject-preview' : 'summary-preview',
                                $summaryPreview = $editform.find( '.mw-summary-preview' ).empty();
-                       if ( response.parse.parsedsummary && response.parse.parsedsummary[ '*' ] !== '' ) {
+                       if ( parse && parse.parsedsummary && parse.parsedsummary[ '*' ] !== '' ) {
                                $summaryPreview.append(
                                        mw.message( summaryMsg ).parse(),
                                        ' ',
                                        $( '<span>' ).addClass( 'comment' ).html(
                                                // There is no equivalent to rawParams
                                                mw.message( 'parentheses' ).escaped()
-                                                       .replace( '$1', response.parse.parsedsummary[ '*' ] )
+                                                       .replace( '$1', parse.parsedsummary[ '*' ] )
                                        )
                                );
                        }
                        mw.hook( 'wikipage.editform' ).fire( $editform );
-               } );
-               request.always( function () {
+               } ).always( function () {
                        $spinner.hide();
                        $copyElements.animate( {
                                opacity: 1
                        }, 'fast' );
-               } );
-               request.fail( function ( code, result ) {
-                       var errorMsg = 'API error: ' +  code;
+               } ).fail( function ( code, result ) {
+                       // This just shows the error for whatever request failed first
+                       var errorMsg = 'API error: ' + code;
                        if ( code === 'http' ) {
                                errorMsg = 'HTTP error: ';
                                if ( result.exception ) {
index 77fa753..8807616 100644 (file)
@@ -126,6 +126,20 @@ pre, .mw-code {
        *display: inline;
 }
 
+/* Separate columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber,
+.toctext {
+       display: table-cell;
+}
+
+/* Space between the columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber:after {
+       content: "";
+       padding-right: 0.5em;
+}
+
 #footer {
        background: white;
        color: black;
index f8143fa..59f5592 100644 (file)
@@ -284,15 +284,11 @@ input#wpSummary {
 }
 
 /**
- * Convenience links to edit block, delete and protect reasons
- * and upload licenses
+ * Convenience links to edit delete and protect reasons
  */
-p.mw-ipb-conveniencelinks,
 p.mw-protect-editreasons,
 p.mw-filedelete-editreasons,
-p.mw-delete-editreasons,
-p.mw-revdel-editreasons,
-p.mw-upload-editlicenses {
+p.mw-delete-editreasons {
        font-size: 90%;
        text-align: right;
 }
@@ -318,7 +314,7 @@ p.mw-upload-editlicenses {
        border: 1px dashed #aaa;
 }
 
-.mw-history-revisionactions, #mw-fileduplicatesearch-icon {
+.mw-history-revisionactions {
        float: right;
 }
 
index 454fe58..a5dd692 100644 (file)
@@ -87,6 +87,20 @@ table.toc td {
        font-size: 94%;
 }
 
+/* Separate columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber,
+.toctext {
+       display: table-cell;
+}
+
+/* Space between the columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber:after {
+       content: "";
+       padding-right: 0.5em;
+}
+
 /* Warning */
 .mw-warning {
        margin-left: 50px;
index 60544d3..15f4e4d 100644 (file)
        background-color: #b1ffb1;
 }
 
-/* Special:Allpages */
-table.mw-allpages-table-form {
-       width: 100%;
-}
-table.mw-allpages-table-form tr {
-       vertical-align: top;
-}
-.mw-allpages-nav {
-       text-align: right;
-       margin-bottom: 1em;
-}
-
-ul.mw-allpages-chunk {
-       margin: 0;
-       padding: 0;
-}
-ul.mw-allpages-chunk li {
-       border-top: 1px solid #ccc;
-       display: inline-block;
-       margin: 0 1% 0 0;
-       padding: .2em 0;
-       vertical-align: top;
-       width: 31%;
+/* Common for Special:Allpages and Special:PrefixIndex */
+.mw-allpages-body, .mw-prefixindex-body {
+       columns: 22em 3;
+       -moz-columns: 22em 3;
+       -webkit-columns: 22em 3;
+       break-inside: avoid-column;
+       page-break-inside: avoid;
+       -webkit-column-break-inside: avoid;
 }
 .allpagesredirect {
        font-style: italic;
 }
 
+/* Special:Block */
+p.mw-ipb-conveniencelinks {
+       font-size: 90%;
+       text-align: right;
+}
+
 /* Special:BlockList */
 table.mw-blocklist span.mw-usertoollinks,
 span.mw-blocklist-actions {
@@ -54,6 +45,9 @@ span.mw-blocklist-actions {
 .mw-uctop {
        font-weight: bold;
 }
+.mw-contributions-form select {
+       vertical-align: middle;
+}
 
 /* Special:EditWatchlist */
 .watchlistredir {
@@ -66,6 +60,11 @@ td#mw-emailuser-recipient {
        font-weight: bold;
 }
 
+/* Special:FileDuplicateSearch */
+#mw-fileduplicatesearch-icon {
+       float: right;
+}
+
 /* Special:ListGroupRights */
 table.mw-listgrouprights-table tr {
        vertical-align: top;
@@ -74,16 +73,9 @@ table.mw-listgrouprights-table tr {
        text-decoration: line-through;
 }
 
-/* Special:Prefixindex */
-table.mw-prefixindex-list-table,
-table#mw-prefixindex-nav-table {
-       width: 100%;
-}
-td#mw-prefixindex-nav-form {
-       margin-bottom: 1em;
-       vertical-align: top;
-}
-.mw-prefixindex-nav {
+/* Special:RevisionDelete */
+p.mw-revdel-editreasons {
+       font-size: 90%;
        text-align: right;
 }
 
@@ -124,7 +116,8 @@ table.mw-userrights-groups * th {
        padding-right: 1.5em;
 }
 
-/* Special:Contributions */
-.mw-contributions-form select {
-       vertical-align: middle;
+/* Special:Upload */
+p.mw-upload-editlicenses {
+       font-size: 90%;
+       text-align: right;
 }
index 9b790e0..9ab47b3 100644 (file)
 /*!
  * JavaScript for Special:Preferences
  */
-jQuery( function ( $ ) {
-       var $preftoc, $preferences, $fieldsets, $legends,
-               hash, labelFunc,
-               $tzSelect, $tzTextbox, $localtimeHolder, servertime,
-               $checkBoxes, allowCloseWindow,
-               notif;
-
-       labelFunc = function () {
-               return this.id.replace( /^mw-prefsection/g, 'preftab' );
-       };
-
-       $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-       $preftoc = $( '<ul>' )
-               .attr( {
-                       id: 'preftoc',
-                       role: 'tablist'
-               } );
-       $preferences = $( '#preferences' )
-               .addClass( 'jsprefs' )
-               .before( $preftoc );
-       $fieldsets = $preferences.children( 'fieldset' )
-               .hide()
-               .attr( {
-                       role: 'tabpanel',
-                       'aria-hidden': 'true',
-                       'aria-labelledby': labelFunc
-               } )
-               .addClass( 'prefsection' );
-       $legends = $fieldsets
-               .children( 'legend' )
-               .addClass( 'mainLegend' );
-
-       // Make sure the accessibility tip is selectable so that screen reader users take notice,
-       // but hide it per default to reduce interface clutter. Also make sure it becomes visible
-       // when selected. Similar to jquery.mw-jump
-       $( '<div>' ).addClass( 'mw-navigation-hint' )
-               .text( mediaWiki.msg( 'prefs-tabs-navigation-hint' ) )
-               .attr( 'tabIndex', 0 )
-               .on( 'focus blur', function ( e ) {
-                       if ( e.type === 'blur' || e.type === 'focusout' ) {
-                               $( this ).css( 'height', '0' );
-                       } else {
-                               $( this ).css( 'height', 'auto' );
-                       }
-               } ).insertBefore( $preftoc );
-
-       /**
-        * It uses document.getElementById for security reasons (HTML injections in $()).
-        *
-        * @ignore
-        * @param {string} name the name of a tab without the prefix ("mw-prefsection-")
-        * @param {string} [mode] A hash will be set according to the current
-        *  open section. Set mode 'noHash' to surpress this.
-        */
-       function switchPrefTab( name, mode ) {
-               var $tab, scrollTop;
-               // Handle hash manually to prevent jumping,
-               // therefore save and restore scrollTop to prevent jumping.
-               scrollTop = $( window ).scrollTop();
-               if ( mode !== 'noHash' ) {
-                       location.hash = '#mw-prefsection-' + name;
-               }
-               $( window ).scrollTop( scrollTop );
-
-               $preftoc.find( 'li' ).removeClass( 'selected' )
-                       .find( 'a' ).attr( {
-                               tabIndex: -1,
-                               'aria-selected': 'false'
+( function ( mw, $ ) {
+       $( function () {
+               var $preftoc, $preferences, $fieldsets, $legends,
+                       hash, labelFunc,
+                       $tzSelect, $tzTextbox, $localtimeHolder, servertime,
+                       allowCloseWindow, notif;
+
+               labelFunc = function () {
+                       return this.id.replace( /^mw-prefsection/g, 'preftab' );
+               };
+
+               $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+               $preftoc = $( '<ul>' )
+                       .attr( {
+                               id: 'preftoc',
+                               role: 'tablist'
                        } );
-
-               $tab = $( document.getElementById( 'preftab-' + name ) );
-               if ( $tab.length ) {
-                       $tab.attr( {
-                               tabIndex: 0,
-                               'aria-selected': 'true'
+               $preferences = $( '#preferences' )
+                       .addClass( 'jsprefs' )
+                       .before( $preftoc );
+               $fieldsets = $preferences.children( 'fieldset' )
+                       .hide()
+                       .attr( {
+                               role: 'tabpanel',
+                               'aria-hidden': 'true',
+                               'aria-labelledby': labelFunc
                        } )
-                       .focus()
-                               .parent().addClass( 'selected' );
-
-                       $preferences.children( 'fieldset' ).hide().attr( 'aria-hidden', 'true' );
-                       $( document.getElementById( 'mw-prefsection-' + name ) ).show().attr( 'aria-hidden', 'false' );
-               }
-       }
-
-       // Check for messageboxes (.successbox, .warningbox, .errorbox) to replace with notifications
-       if ( $( '.mw-preferences-messagebox' ).length ) {
-               // If there is a #mw-preferences-success box and javascript is enabled, use a slick notification instead!
-               if ( $( '#mw-preferences-success' ).length ) {
-                       notif = mediaWiki.notification.notify( mediaWiki.message( 'savedprefs' ), { autoHide: false } );
-                       // 'change' event not reliable!
-                       $( '#preftoc, .prefsection' ).one( 'change keydown mousedown', function () {
-                               if ( notif ) {
-                                       notif.close();
-                                       notif = null;
+                       .addClass( 'prefsection' );
+               $legends = $fieldsets
+                       .children( 'legend' )
+                       .addClass( 'mainLegend' );
+
+               // Make sure the accessibility tip is selectable so that screen reader users take notice,
+               // but hide it per default to reduce interface clutter. Also make sure it becomes visible
+               // when selected. Similar to jquery.mw-jump
+               $( '<div>' ).addClass( 'mw-navigation-hint' )
+                       .text( mw.msg( 'prefs-tabs-navigation-hint' ) )
+                       .attr( 'tabIndex', 0 )
+                       .on( 'focus blur', function ( e ) {
+                               if ( e.type === 'blur' || e.type === 'focusout' ) {
+                                       $( this ).css( 'height', '0' );
+                               } else {
+                                       $( this ).css( 'height', 'auto' );
                                }
-                       } );
-
-                       // Remove now-unnecessary success=1 querystring to prevent reappearance of notification on reload
-                       if ( history.replaceState ) {
-                               history.replaceState( {}, document.title, location.href.replace( /&?success=1/, '' ) );
+                       } ).insertBefore( $preftoc );
+
+               /**
+                * It uses document.getElementById for security reasons (HTML injections in $()).
+                *
+                * @ignore
+                * @param {string} name the name of a tab without the prefix ("mw-prefsection-")
+                * @param {string} [mode] A hash will be set according to the current
+                *  open section. Set mode 'noHash' to surpress this.
+                */
+               function switchPrefTab( name, mode ) {
+                       var $tab, scrollTop;
+                       // Handle hash manually to prevent jumping,
+                       // therefore save and restore scrollTop to prevent jumping.
+                       scrollTop = $( window ).scrollTop();
+                       if ( mode !== 'noHash' ) {
+                               location.hash = '#mw-prefsection-' + name;
+                       }
+                       $( window ).scrollTop( scrollTop );
+
+                       $preftoc.find( 'li' ).removeClass( 'selected' )
+                               .find( 'a' ).attr( {
+                                       tabIndex: -1,
+                                       'aria-selected': 'false'
+                               } );
+
+                       $tab = $( document.getElementById( 'preftab-' + name ) );
+                       if ( $tab.length ) {
+                               $tab.attr( {
+                                       tabIndex: 0,
+                                       'aria-selected': 'true'
+                               } )
+                               .focus()
+                                       .parent().addClass( 'selected' );
+
+                               $preferences.children( 'fieldset' ).hide().attr( 'aria-hidden', 'true' );
+                               $( document.getElementById( 'mw-prefsection-' + name ) ).show().attr( 'aria-hidden', 'false' );
                        }
                }
-       }
-
-       // Populate the prefToc
-       $legends.each( function ( i, legend ) {
-               var $legend = $( legend ),
-                       ident, $li, $a;
-               if ( i === 0 ) {
-                       $legend.parent().show();
-               }
-               ident = $legend.parent().attr( 'id' );
 
-               $li = $( '<li>' )
-                       .attr( 'role', 'presentation' )
-                       .addClass( i === 0 ? 'selected' : '' );
-               $a = $( '<a>' )
-                       .attr( {
-                               id: ident.replace( 'mw-prefsection', 'preftab' ),
-                               href: '#' + ident,
-                               role: 'tab',
-                               tabIndex: i === 0 ? 0 : -1,
-                               'aria-selected': i === 0 ? 'true' : 'false',
-                               'aria-controls': ident
-                       } )
-                       .text( $legend.text() );
-               $li.append( $a );
-               $preftoc.append( $li );
-       } );
+               // Check for messageboxes (.successbox, .warningbox, .errorbox) to replace with notifications
+               if ( $( '.mw-preferences-messagebox' ).length ) {
+                       // If there is a #mw-preferences-success box and javascript is enabled, use a slick notification instead!
+                       if ( $( '#mw-preferences-success' ).length ) {
+                               notif = mw.notification.notify( mw.message( 'savedprefs' ), { autoHide: false } );
+                               // 'change' event not reliable!
+                               $( '#preftoc, .prefsection' ).one( 'change keydown mousedown', function () {
+                                       if ( notif ) {
+                                               notif.close();
+                                               notif = null;
+                                       }
+                               } );
+
+                               // Remove now-unnecessary success=1 querystring to prevent reappearance of notification on reload
+                               if ( history.replaceState ) {
+                                       history.replaceState( {}, document.title, location.href.replace( /&?success=1/, '' ) );
+                               }
+                       }
+               }
 
-       // Disable the button to save preferences unless preferences have changed
-       $( '#prefcontrol' ).prop( 'disabled', true );
-       $( '.prefsection' ).one( 'change keydown mousedown', function () {
-               $( '#prefcontrol' ).prop( 'disabled', false );
-       } );
+               // Populate the prefToc
+               $legends.each( function ( i, legend ) {
+                       var $legend = $( legend ),
+                               ident, $li, $a;
+                       if ( i === 0 ) {
+                               $legend.parent().show();
+                       }
+                       ident = $legend.parent().attr( 'id' );
+
+                       $li = $( '<li>' )
+                               .attr( 'role', 'presentation' )
+                               .addClass( i === 0 ? 'selected' : '' );
+                       $a = $( '<a>' )
+                               .attr( {
+                                       id: ident.replace( 'mw-prefsection', 'preftab' ),
+                                       href: '#' + ident,
+                                       role: 'tab',
+                                       tabIndex: i === 0 ? 0 : -1,
+                                       'aria-selected': i === 0 ? 'true' : 'false',
+                                       'aria-controls': ident
+                               } )
+                               .text( $legend.text() );
+                       $li.append( $a );
+                       $preftoc.append( $li );
+               } );
 
-       // Enable keyboard users to use left and right keys to switch tabs
-       $preftoc.on( 'keydown', function ( event ) {
-               var keyLeft = 37,
-                       keyRight = 39,
-                       $el;
+               // Disable the button to save preferences unless preferences have changed
+               $( '#prefcontrol' ).prop( 'disabled', true );
+               $( '.prefsection' ).one( 'change keydown mousedown', function () {
+                       $( '#prefcontrol' ).prop( 'disabled', false );
+               } );
 
-               if ( event.keyCode === keyLeft ) {
-                       $el = $( '#preftoc li.selected' ).prev().find( 'a' );
-               } else if ( event.keyCode === keyRight ) {
-                       $el = $( '#preftoc li.selected' ).next().find( 'a' );
-               } else {
-                       return;
-               }
-               if ( $el.length > 0 ) {
-                       switchPrefTab( $el.attr( 'href' ).replace( '#mw-prefsection-', '' ) );
-               }
-       } );
+               // Enable keyboard users to use left and right keys to switch tabs
+               $preftoc.on( 'keydown', function ( event ) {
+                       var keyLeft = 37,
+                               keyRight = 39,
+                               $el;
 
-       // If we've reloaded the page or followed an open-in-new-window,
-       // make the selected tab visible.
-       hash = location.hash;
-       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
-               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
-       }
-
-       // In browsers that support the onhashchange event we will not bind click
-       // handlers and instead let the browser do the default behavior (clicking the
-       // <a href="#.."> will naturally set the hash, handled by onhashchange.
-       // But other things that change the hash will also be catched (e.g. using
-       // the Back and Forward browser navigation).
-       // Note the special check for IE "compatibility" mode.
-       if ( 'onhashchange' in window &&
-               ( document.documentMode === undefined || document.documentMode >= 8 )
-       ) {
-               $( window ).on( 'hashchange', function () {
-                       var hash = location.hash;
-                       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
-                               switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
-                       } else if ( hash === '' ) {
-                               switchPrefTab( 'personal', 'noHash' );
+                       if ( event.keyCode === keyLeft ) {
+                               $el = $( '#preftoc li.selected' ).prev().find( 'a' );
+                       } else if ( event.keyCode === keyRight ) {
+                               $el = $( '#preftoc li.selected' ).next().find( 'a' );
+                       } else {
+                               return;
+                       }
+                       if ( $el.length > 0 ) {
+                               switchPrefTab( $el.attr( 'href' ).replace( '#mw-prefsection-', '' ) );
                        }
                } );
-       // In older browsers we'll bind a click handler as fallback.
-       // We must not have onhashchange *and* the click handlers, other wise
-       // the click handler calls switchPrefTab() which sets the hash value,
-       // which triggers onhashcange and calls switchPrefTab() again.
-       } else {
-               $preftoc.on( 'click', 'li a', function ( e ) {
-                       switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
-                       e.preventDefault();
-               } );
-       }
 
-       // Timezone functions.
-       // Guesses Timezone from browser and updates fields onchange.
+               // If we've reloaded the page or followed an open-in-new-window,
+               // make the selected tab visible.
+               hash = location.hash;
+               if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+                       switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+               }
 
-       $tzSelect = $( '#mw-input-wptimecorrection' );
-       $tzTextbox = $( '#mw-input-wptimecorrection-other' );
-       $localtimeHolder = $( '#wpLocalTime' );
-       servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
+               // In browsers that support the onhashchange event we will not bind click
+               // handlers and instead let the browser do the default behavior (clicking the
+               // <a href="#.."> will naturally set the hash, handled by onhashchange.
+               // But other things that change the hash will also be catched (e.g. using
+               // the Back and Forward browser navigation).
+               // Note the special check for IE "compatibility" mode.
+               if ( 'onhashchange' in window &&
+                       ( document.documentMode === undefined || document.documentMode >= 8 )
+               ) {
+                       $( window ).on( 'hashchange', function () {
+                               var hash = location.hash;
+                               if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+                                       switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
+                               } else if ( hash === '' ) {
+                                       switchPrefTab( 'personal', 'noHash' );
+                               }
+                       } );
+               // In older browsers we'll bind a click handler as fallback.
+               // We must not have onhashchange *and* the click handlers, other wise
+               // the click handler calls switchPrefTab() which sets the hash value,
+               // which triggers onhashcange and calls switchPrefTab() again.
+               } else {
+                       $preftoc.on( 'click', 'li a', function ( e ) {
+                               switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+                               e.preventDefault();
+                       } );
+               }
 
-       function minutesToHours( min ) {
-               var tzHour = Math.floor( Math.abs( min ) / 60 ),
-                       tzMin = Math.abs( min ) % 60,
-                       tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
-                               ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
-               return tzString;
-       }
+               // Timezone functions.
+               // Guesses Timezone from browser and updates fields onchange.
 
-       function hoursToMinutes( hour ) {
-               var minutes,
-                       arr = hour.split( ':' );
+               $tzSelect = $( '#mw-input-wptimecorrection' );
+               $tzTextbox = $( '#mw-input-wptimecorrection-other' );
+               $localtimeHolder = $( '#wpLocalTime' );
+               servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
 
-               arr[ 0 ] = parseInt( arr[ 0 ], 10 );
+               function minutesToHours( min ) {
+                       var tzHour = Math.floor( Math.abs( min ) / 60 ),
+                               tzMin = Math.abs( min ) % 60,
+                               tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
+                                       ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
+                       return tzString;
+               }
 
-               if ( arr.length === 1 ) {
-                       // Specification is of the form [-]XX
-                       minutes = arr[ 0 ] * 60;
-               } else {
-                       // Specification is of the form [-]XX:XX
-                       minutes = Math.abs( arr[ 0 ] ) * 60 + parseInt( arr[ 1 ], 10 );
-                       if ( arr[ 0 ] < 0 ) {
-                               minutes *= -1;
+               function hoursToMinutes( hour ) {
+                       var minutes,
+                               arr = hour.split( ':' );
+
+                       arr[ 0 ] = parseInt( arr[ 0 ], 10 );
+
+                       if ( arr.length === 1 ) {
+                               // Specification is of the form [-]XX
+                               minutes = arr[ 0 ] * 60;
+                       } else {
+                               // Specification is of the form [-]XX:XX
+                               minutes = Math.abs( arr[ 0 ] ) * 60 + parseInt( arr[ 1 ], 10 );
+                               if ( arr[ 0 ] < 0 ) {
+                                       minutes *= -1;
+                               }
+                       }
+                       // Gracefully handle non-numbers.
+                       if ( isNaN( minutes ) ) {
+                               return 0;
+                       } else {
+                               return minutes;
                        }
-               }
-               // Gracefully handle non-numbers.
-               if ( isNaN( minutes ) ) {
-                       return 0;
-               } else {
-                       return minutes;
-               }
-       }
-
-       function updateTimezoneSelection() {
-               var minuteDiff, localTime,
-                       type = $tzSelect.val();
-
-               if ( type === 'guess' ) {
-                       // Get browser timezone & fill it in
-                       minuteDiff = -( new Date().getTimezoneOffset() );
-                       $tzTextbox.val( minutesToHours( minuteDiff ) );
-                       $tzSelect.val( 'other' );
-                       $tzTextbox.prop( 'disabled', false );
-               } else if ( type === 'other' ) {
-                       // Grab data from the textbox, parse it.
-                       minuteDiff = hoursToMinutes( $tzTextbox.val() );
-               } else {
-                       // Grab data from the $tzSelect value
-                       minuteDiff = parseInt( type.split( '|' )[ 1 ], 10 ) || 0;
-                       $tzTextbox.val( minutesToHours( minuteDiff ) );
                }
 
-               // Determine local time from server time and minutes difference, for display.
-               localTime = servertime + minuteDiff;
+               function updateTimezoneSelection() {
+                       var minuteDiff, localTime,
+                               type = $tzSelect.val();
+
+                       if ( type === 'guess' ) {
+                               // Get browser timezone & fill it in
+                               minuteDiff = -( new Date().getTimezoneOffset() );
+                               $tzTextbox.val( minutesToHours( minuteDiff ) );
+                               $tzSelect.val( 'other' );
+                               $tzTextbox.prop( 'disabled', false );
+                       } else if ( type === 'other' ) {
+                               // Grab data from the textbox, parse it.
+                               minuteDiff = hoursToMinutes( $tzTextbox.val() );
+                       } else {
+                               // Grab data from the $tzSelect value
+                               minuteDiff = parseInt( type.split( '|' )[ 1 ], 10 ) || 0;
+                               $tzTextbox.val( minutesToHours( minuteDiff ) );
+                       }
 
-               // Bring time within the [0,1440) range.
-               localTime = ( ( localTime % 1440 ) + 1440 ) % 1440;
+                       // Determine local time from server time and minutes difference, for display.
+                       localTime = servertime + minuteDiff;
 
-               $localtimeHolder.text( mediaWiki.language.convertNumber( minutesToHours( localTime ) ) );
-       }
+                       // Bring time within the [0,1440) range.
+                       localTime = ( ( localTime % 1440 ) + 1440 ) % 1440;
 
-       if ( $tzSelect.length && $tzTextbox.length ) {
-               $tzSelect.change( updateTimezoneSelection );
-               $tzTextbox.blur( updateTimezoneSelection );
-               updateTimezoneSelection();
-       }
+                       $localtimeHolder.text( mw.language.convertNumber( minutesToHours( localTime ) ) );
+               }
 
-       // Preserve the tab after saving the preferences
-       // Not using cookies, because their deletion results are inconsistent.
-       // Not using jStorage due to its enormous size (for this feature)
-       if ( window.sessionStorage ) {
-               if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
-                       switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
+               if ( $tzSelect.length && $tzTextbox.length ) {
+                       $tzSelect.change( updateTimezoneSelection );
+                       $tzTextbox.blur( updateTimezoneSelection );
+                       updateTimezoneSelection();
                }
-               // Deleting the key, the tab states should be reset until we press Save
-               sessionStorage.removeItem( 'mediawikiPreferencesTab' );
 
-               $( '#mw-prefs-form' ).submit( function () {
-                       var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
-                       sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
-               } );
-       }
-
-       // To disable all 'namespace' checkboxes in Search preferences
-       // when 'Search in all namespaces' checkbox is ticked.
-       $checkBoxes = $( '#mw-htmlform-advancedsearchoptions input[id^=mw-input-wpsearchnamespaces]' );
-       if ( $( '#mw-input-wpsearcheverything' ).prop( 'checked' ) ) {
-               $checkBoxes.prop( 'disabled', true );
-       }
-       $( '#mw-input-wpsearcheverything' ).change( function () {
-               $checkBoxes.prop( 'disabled', $( this ).prop( 'checked' ) );
-       } );
+               // Preserve the tab after saving the preferences
+               // Not using cookies, because their deletion results are inconsistent.
+               // Not using jStorage due to its enormous size (for this feature)
+               if ( window.sessionStorage ) {
+                       if ( sessionStorage.getItem( 'mediawikiPreferencesTab' ) !== null ) {
+                               switchPrefTab( sessionStorage.getItem( 'mediawikiPreferencesTab' ), 'noHash' );
+                       }
+                       // Deleting the key, the tab states should be reset until we press Save
+                       sessionStorage.removeItem( 'mediawikiPreferencesTab' );
 
-       // Set up a message to notify users if they try to leave the page without
-       // saving.
-       $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() );
-       allowCloseWindow = mediaWiki.confirmCloseWindow( {
-               test: function () {
-                       return $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' );
-               },
+                       $( '#mw-prefs-form' ).submit( function () {
+                               var storageData = $( $preftoc ).find( 'li.selected a' ).attr( 'id' ).replace( 'preftab-', '' );
+                               sessionStorage.setItem( 'mediawikiPreferencesTab', storageData );
+                       } );
+               }
+
+               // Set up a message to notify users if they try to leave the page without
+               // saving.
+               $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() );
+               allowCloseWindow = mw.confirmCloseWindow( {
+                       test: function () {
+                               return $( '#mw-prefs-form' ).serialize() !== $( '#mw-prefs-form' ).data( 'origdata' );
+                       },
 
-               message: mediaWiki.msg( 'prefswarning-warning', mediaWiki.msg( 'saveprefs' ) ),
-               namespace: 'prefswarning'
+                       message: mw.msg( 'prefswarning-warning', mw.msg( 'saveprefs' ) ),
+                       namespace: 'prefswarning'
+               } );
+               $( '#mw-prefs-form' ).submit( $.proxy( allowCloseWindow, 'release' ) );
+               $( '#mw-prefs-restoreprefs' ).click( $.proxy( allowCloseWindow, 'release' ) );
        } );
-       $( '#mw-prefs-form' ).submit( $.proxy( allowCloseWindow, 'release' ) );
-       $( '#mw-prefs-restoreprefs' ).click( $.proxy( allowCloseWindow, 'release' ) );
-} );
+}( mediaWiki, jQuery ) );
old mode 100644 (file)
new mode 100755 (executable)
index b869314..1ce9569
        display: inline !ie;
 }
 .searchresults {
+       margin: 1em 0 1em .4em;
 }
-.searchresults p {
-       margin-left: 0.4em;
-       margin-top: 1em;
-       margin-bottom: 1.2em;
+/* needs extra specificity to override `.mw-body p` selector */
+.mw-body p.mw-search-nonefound {
+       margin: 0;
+}
+.mw-search-interwiki-header {
+       font-weight: bold;
+}
+.mw-search-nonefound + .mw-search-interwiki-header {
+       margin-top: 0;
 }
 div.searchresult {
        font-size: 95%;
        width: 38em;
 }
 .mw-search-results {
-       margin-left: 0.4em;
+       margin-left: 0;
        float: left;
 }
 .mw-search-results li {
@@ -51,9 +57,9 @@ div.searchresult {
        padding-left: 0.25em;
 }
 .mw-search-profile-tabs div.search-types ul {
-       margin: 0 !important;
-       padding: 0 !important;
-       list-style: none !important;
+       margin: 0;
+       padding: 0;
+       list-style: none;
 }
 .mw-search-profile-tabs div.search-types ul li {
        float: left;
@@ -81,11 +87,11 @@ div.searchresult {
 
 fieldset#mw-searchoptions {
        margin: 0;
-       padding: 0.5em 0.75em 0.75em 0.75em !important;
+       padding: 0.5em 0.75em 0.75em 0.75em;
        border: none;
        background-color: #f9f9f9;
-       border: 1px solid silver !important;
-       border-top-width: 0 !important;
+       border: 1px solid silver;
+       border-top-width: 0;
 }
 fieldset#mw-searchoptions legend {
        display: none;
index 9fcec02..8c89ed9 100644 (file)
@@ -85,7 +85,9 @@
                },
 
                setWarning: function ( warning ) {
-                       $( '#wpDestFile-warning' ).html( warning );
+                       var $warning = $( $.parseHTML( warning ) );
+                       mw.hook( 'wikipage.content' ).fire( $warning );
+                       $( '#wpDestFile-warning' ).empty().append( $warning );
 
                        // Set a value in the form indicating that the warning is acknowledged and
                        // doesn't need to be redisplayed post-upload
index 30f000b..831ba8c 100644 (file)
@@ -38,7 +38,7 @@ section.mw-form-header {
        margin-top: 6px;
 }
 
-.mw-createacct-captcha-container {
+.fancycaptcha-captcha-container {
        background-color: #f8f8f8;
        border: 1px solid #c9c9c9;
        padding: 10px;
@@ -52,7 +52,7 @@ section.mw-form-header {
 }
 
 /* Put a border around the fancycaptcha-image-container. */
-.mw-createacct-captcha-and-reload {
+.fancycaptcha-captcha-and-reload {
        border: 1px solid #c9c9c9;
        /* Other display formats end up too wide */
        display: table-cell;
index 77b3f9d..600b771 100644 (file)
@@ -12,9 +12,6 @@
 //
 // Styleguide 2.
 
-@transitionDuration: .1s;
-@transitionFunction: ease-in-out;
-
 // Neutral button styling
 //
 // These are the main actions on the page/workflow. The page should have only one of progressive, constructive and desctructive buttons, the rest being quiet.
@@ -66,8 +63,6 @@
                cursor: default;
        }
 
-       .transition(background @transitionDuration @transitionFunction, color @transitionDuration @transitionFunction, box-shadow @transitionDuration @transitionFunction;);
-
        // Styling for specific button types
        // -----------------------------------------
 
@@ -243,6 +238,12 @@ a.mw-ui-button {
        &:focus {
                text-decoration: none;
        }
+
+       // a-tags behave different to inputs if the line-height attribute is inherited
+       // from another element (e.g. mw-body-content). They appear bigger as input
+       // tags. See Bug T116427. To fix that, apply the correct line-height (used
+       // for inputs) to a-tags, too.
+       line-height: normal;
 }
 
 // Button groups
index ac5becb..bd5dd4a 100644 (file)
@@ -72,7 +72,6 @@
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
                & + label::before {
-                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
index 2f76131..62f0e83 100644 (file)
@@ -39,7 +39,6 @@
        font-family: inherit;
        font-size: inherit;
        line-height: inherit;
-       .transition(~"border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1)");
 
        // Placeholder text styling must be set individually for each browser @winter
        &::-webkit-input-placeholder { // webkit
index 1928699..52effd6 100644 (file)
@@ -63,7 +63,6 @@
 
                // the pseudo before element of the label after the radio now looks like a radio
                & + label::before {
-                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
index 10064b2..f723a02 100644 (file)
@@ -6,5 +6,5 @@ Ed Sanders <esanders@wikimedia.org>
 James D. Forrester <jforrester@wikimedia.org>
 Roan Kattouw <roan@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
-Timo Tijhof <timo@wikimedia.org>
+Timo Tijhof <krinklemail@gmail.com>
 Trevor Parscal <trevor@wikimedia.org>
index f1c4f6f..24b0e72 100644 (file)
@@ -7,42 +7,45 @@
 ( function ( $, mw ) {
 
        /**
-        * @class mw.widgets.CategoryCapsuleItemWidget
+        * @class mw.widgets.PageExistenceCache
+        * @private
+        * @param {mw.Api} [api]
         */
-
-       var processExistenceCheckQueueDebounced,
-               api = new mw.Api(),
-               currentRequest = null,
-               existenceCache = {},
-               existenceCheckQueue = {};
-
-       // The existence checking code really could be refactored into a separate class.
+       function PageExistenceCache( api ) {
+               this.api = api || new mw.Api();
+               this.processExistenceCheckQueueDebounced = OO.ui.debounce( this.processExistenceCheckQueue );
+               this.currentRequest = null;
+               this.existenceCache = {};
+               this.existenceCheckQueue = {};
+       }
 
        /**
+        * Check for existence of pages in the queue.
+        *
         * @private
         */
-       function processExistenceCheckQueue() {
+       PageExistenceCache.prototype.processExistenceCheckQueue = function () {
                var queue, titles;
-               if ( currentRequest ) {
+               if ( this.currentRequest ) {
                        // Don't fire off a million requests at the same time
-                       currentRequest.always( function () {
-                               currentRequest = null;
-                               processExistenceCheckQueueDebounced();
-                       } );
+                       this.currentRequest.always( function () {
+                               this.currentRequest = null;
+                               this.processExistenceCheckQueueDebounced();
+                       }.bind( this ) );
                        return;
                }
-               queue = existenceCheckQueue;
-               existenceCheckQueue = {};
+               queue = this.existenceCheckQueue;
+               this.existenceCheckQueue = {};
                titles = Object.keys( queue ).filter( function ( title ) {
-                       if ( existenceCache.hasOwnProperty( title ) ) {
-                               queue[ title ].resolve( existenceCache[ title ] );
+                       if ( this.existenceCache.hasOwnProperty( title ) ) {
+                               queue[ title ].resolve( this.existenceCache[ title ] );
                        }
-                       return !existenceCache.hasOwnProperty( title );
-               } );
+                       return !this.existenceCache.hasOwnProperty( title );
+               }.bind( this ) );
                if ( !titles.length ) {
                        return;
                }
-               currentRequest = api.get( {
+               this.currentRequest = this.api.get( {
                        action: 'query',
                        prop: [ 'info' ],
                        titles: titles
                        var index, curr, title;
                        for ( index in response.query.pages ) {
                                curr = response.query.pages[ index ];
-                               title = mw.Title.newFromText( curr.title ).getPrefixedText();
-                               existenceCache[ title ] = curr.missing === undefined;
-                               queue[ title ].resolve( existenceCache[ title ] );
+                               title = new ForeignTitle( curr.title ).getPrefixedText();
+                               this.existenceCache[ title ] = curr.missing === undefined;
+                               queue[ title ].resolve( this.existenceCache[ title ] );
                        }
-               } );
-       }
-
-       processExistenceCheckQueueDebounced = OO.ui.debounce( processExistenceCheckQueue );
+               }.bind( this ) );
+       };
 
        /**
         * Register a request to check whether a page exists.
         * @param {mw.Title} title
         * @return {jQuery.Promise} Promise resolved with true if the page exists or false otherwise
         */
-       function checkPageExistence( title ) {
+       PageExistenceCache.prototype.checkPageExistence = function ( title ) {
                var key = title.getPrefixedText();
-               if ( !existenceCheckQueue[ key ] ) {
-                       existenceCheckQueue[ key ] = $.Deferred();
+               if ( !this.existenceCheckQueue[ key ] ) {
+                       this.existenceCheckQueue[ key ] = $.Deferred();
                }
-               processExistenceCheckQueueDebounced();
-               return existenceCheckQueue[ key ].promise();
+               this.processExistenceCheckQueueDebounced();
+               return this.existenceCheckQueue[ key ].promise();
+       };
+
+       /**
+        * @class mw.widgets.ForeignTitle
+        * @private
+        * @extends mw.Title
+        *
+        * @constructor
+        * @inheritdoc
+        */
+       function ForeignTitle() {
+               ForeignTitle.parent.apply( this, arguments );
        }
+       OO.inheritClass( ForeignTitle, mw.Title );
+       ForeignTitle.prototype.getNamespacePrefix = function () {
+               // We only need to handle categories here...
+               return 'Category:'; // HACK
+       };
 
        /**
+        * @class mw.widgets.CategoryCapsuleItemWidget
+        *
         * Category selector capsule item widget. Extends OO.ui.CapsuleItemWidget with the ability to link
         * to the given page, and to show its existence status (i.e., whether it is a redlink).
         *
         * @constructor
         * @param {Object} config Configuration options
         * @cfg {mw.Title} title Page title to use (required)
+        * @cfg {string} [apiUrl] API URL, if not the current wiki's API
         */
        mw.widgets.CategoryCapsuleItemWidget = function MWWCategoryCapsuleItemWidget( config ) {
                // Parent constructor
 
                // Properties
                this.title = config.title;
+               this.apiUrl = config.apiUrl || '';
                this.$link = $( '<a>' )
                        .text( this.label )
                        .attr( 'target', '_blank' )
                this.setMissing( false );
                this.$label.replaceWith( this.$link );
                this.setLabelElement( this.$link );
-               checkPageExistence( this.title ).done( function ( exists ) {
-                       this.setMissing( !exists );
-               }.bind( this ) );
+
+               /*jshint -W024*/
+               if ( !this.constructor.static.pageExistenceCaches[ this.apiUrl ] ) {
+                       this.constructor.static.pageExistenceCaches[ this.apiUrl ] =
+                               new PageExistenceCache( new mw.ForeignApi( this.apiUrl ) );
+               }
+               this.constructor.static.pageExistenceCaches[ this.apiUrl ]
+                       .checkPageExistence( new ForeignTitle( this.title.getPrefixedText() ) )
+                       .done( function ( exists ) {
+                               this.setMissing( !exists );
+                       }.bind( this ) );
+               /*jshint +W024*/
        };
 
        /* Setup */
 
        OO.inheritClass( mw.widgets.CategoryCapsuleItemWidget, OO.ui.CapsuleItemWidget );
 
+       /* Static Properties */
+
+       /*jshint -W024*/
+       /**
+        * Map of API URLs to PageExistenceCache objects.
+        *
+        * @static
+        * @inheritable
+        * @property {Object}
+        */
+       mw.widgets.CategoryCapsuleItemWidget.static.pageExistenceCaches = {
+               '': new PageExistenceCache()
+       };
+       /*jshint +W024*/
+
        /* Methods */
 
        /**
         * @param {boolean} missing Whether the page is missing (does not exist)
         */
        mw.widgets.CategoryCapsuleItemWidget.prototype.setMissing = function ( missing ) {
+               var
+                       title = new ForeignTitle( this.title.getPrefixedText() ), // HACK
+                       prefix = this.apiUrl.replace( '/w/api.php', '' ); // HACK
+
                if ( !missing ) {
                        this.$link
-                               .attr( 'href', this.title.getUrl() )
+                               .attr( 'href', prefix + title.getUrl() )
                                .removeClass( 'new' );
                } else {
                        this.$link
-                               .attr( 'href', this.title.getUrl( { action: 'edit', redlink: 1 } ) )
+                               .attr( 'href', prefix + title.getUrl( { action: 'edit', redlink: 1 } ) )
                                .addClass( 'new' );
                }
        };
index 89fcc0b..59f1d50 100644 (file)
@@ -30,6 +30,7 @@
         *
         * @constructor
         * @param {Object} [config] Configuration options
+        * @cfg {mw.Api} [api] Instance of mw.Api (or subclass thereof) to use for queries
         * @cfg {number} [limit=10] Maximum number of results to load
         * @cfg {mw.widgets.CategorySelector.SearchType[]} [searchTypes=[mw.widgets.CategorySelector.SearchType.OpenSearch]]
         *   Default search API to use when searching.
@@ -61,7 +62,7 @@
                this.$input.on( 'change input cut paste', OO.ui.debounce( this.updateMenuItems.bind( this ), 100 ) );
 
                // Initialize
-               this.api = new mw.Api();
+               this.api = config.api || new mw.Api();
        }
 
        /* Setup */
         */
        CSP.createItemWidget = function ( data ) {
                return new mw.widgets.CategoryCapsuleItemWidget( {
+                       apiUrl: this.api.apiUrl || undefined,
                        title: mw.Title.newFromText( data, NS_CATEGORY )
                } );
        };
index 0ef5095..76fe959 100644 (file)
@@ -17,7 +17,7 @@
         * @cfg {number} [limit=10] Number of results to show
         * @cfg {number} [namespace] Namespace to prepend to queries
         * @cfg {number} [maxLength=255] Maximum query length
-        * @cfg {boolean} [relative=true] If a namespace is set, return a title relative to it
+        * @cfg {boolean} [relative=true] If a namespace is set, display titles relative to it
         * @cfg {boolean} [suggestions=true] Display search suggestions
         * @cfg {boolean} [showRedirectTargets=true] Show the targets of redirects
         * @cfg {boolean} [showRedlink] Show red link to exact match if it doesn't exist
                                redirect: suggestionPage.redirect !== undefined,
                                disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
                                imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
-                               description: OO.getProp( suggestionPage, 'terms', 'description' )
+                               description: OO.getProp( suggestionPage, 'terms', 'description' ),
+                               // sort index
+                               index: suggestionPage.index
                        };
 
                        // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
                        }
                }
 
+               titles.sort( function ( a, b ) {
+                       return pageData[ a ].index - pageData[ b ].index;
+               } );
+
                // If not found, run value through mw.Title to avoid treating a match as a
                // mismatch where normalisation would make them matching (bug 48476)
 
index 2eb8c55..86d4cfe 100644 (file)
@@ -22,7 +22,7 @@
                        min-height: 3.75em;
                        padding-left: 4.75em;
 
-                       &:not(:last-child) {
+                       &:not( :last-child ) {
                                margin-bottom: 2px;
                        }
 
                        }
 
                        &.oo-ui-iconElement {
-                               >.oo-ui-iconElement-icon {
+                               > .oo-ui-iconElement-icon {
                                        display: block;
                                        width: 3.75em;
                                        height: 3.75em;
                                        left: 0;
-                                       background-color: #ccc;
-                                       opacity: 0.4;
-                               }
-
-                               > .mw-widget-titleOptionWidget-hasImage {
-                                       border: 0;
-                                       background-size: cover;
-                                       opacity: 0.7;
+                                       &:not( .mw-widget-titleOptionWidget-hasImage ) {
+                                               background-color: #ccc;
+                                               opacity: 0.4;
+                                       }
+                                       &.mw-widget-titleOptionWidget-hasImage {
+                                               border: 0;
+                                               background-size: cover;
+                                               opacity: 0.7;
+                                       }
                                }
                        }
-               }
 
-               &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
-                       &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
-                               opacity: 1;
+                       &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
+                               &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
+                                       opacity: 1;
+                               }
                        }
                }
        }
index 79aba77..5f82b18 100644 (file)
@@ -67,7 +67,6 @@
         *  each individual request by passing them to #get or #post (or directly #ajax) later on.
         */
        mw.Api = function ( options ) {
-               // TODO: Share API objects with exact same config.
                options = options || {};
 
                // Force a string if we got a mw.Uri object
@@ -90,7 +89,9 @@
                 */
                abort: function () {
                        $.each( this.requests, function ( index, request ) {
-                               request.abort();
+                               if ( request ) {
+                                       request.abort();
+                               }
                        } );
                },
 
                /**
                 * Perform API post request
                 *
-                * TODO: Post actions for non-local hostnames will need proxy.
-                *
                 * @param {Object} parameters
                 * @param {Object} [ajaxOptions]
                 * @return {jQuery.Promise}
                 *  Fail: Error code
                 */
                ajax: function ( parameters, ajaxOptions ) {
-                       var token,
+                       var token, requestIndex,
+                               api = this,
                                apiDeferred = $.Deferred(),
                                xhr, key, formData;
 
                                        }
                                } );
 
+                       requestIndex = this.requests.length;
                        this.requests.push( xhr );
+                       xhr.always( function () {
+                               api.requests[ requestIndex ] = null;
+                       } );
                        // Return the Promise
                        return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
                                if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css
new file mode 100644 (file)
index 0000000..4143520
--- /dev/null
@@ -0,0 +1,5 @@
+.mw-foreignStructuredUpload-bookletLayout-license {
+       font-size: 90%;
+       line-height: 1.4em;
+       color: #555;
+}
index c8877fd..717e2ec 100644 (file)
 
        /* Uploading */
 
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.initialize = function () {
+               var deferred = $.Deferred();
+               mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this )
+                       .done( function () {
+                               // Point the CategorySelector to the right wiki
+                               this.upload.apiPromise.done( function ( api ) {
+                                       // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
+                                       if ( api.apiUrl ) {
+                                               // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
+                                               this.categoriesWidget.api = new mw.ForeignApi( api.apiUrl );
+                                       }
+                                       deferred.resolve();
+                               }.bind( this ) );
+                       }.bind( this ) );
+               return deferred.promise();
+       };
+
        /**
         * Returns a {@link mw.ForeignStructuredUpload mw.ForeignStructuredUpload}
         * with the {@link #cfg-target target} specified in config.
@@ -78,7 +98,8 @@
                        notOwnWorkLocal = mw.message( 'foreign-structured-upload-form-label-not-own-work-local-default' );
                }
 
-               $ownWorkMessage = $( '<p>' ).html( ownWorkMessage.parse() );
+               $ownWorkMessage = $( '<p>' ).html( ownWorkMessage.parse() )
+                       .addClass( 'mw-foreignStructuredUpload-bookletLayout-license' );
                $notOwnWorkMessage = $( '<div>' ).append(
                        $( '<p>' ).html( notOwnWorkMessage.parse() ),
                        $( '<p>' ).html( notOwnWorkLocal.parse() )
                        label: $notOwnWorkMessage
                } );
                this.ownWorkCheckbox = new OO.ui.CheckboxInputWidget().on( 'change', function ( on ) {
-                       if ( on ) {
-                               layout.messageLabel.setLabel( $ownWorkMessage );
-                       } else {
-                               layout.messageLabel.setLabel( $notOwnWorkMessage );
-                       }
+                       layout.messageLabel.toggle( !on );
                } );
 
                fieldset = new OO.ui.FieldsetLayout();
                        } ),
                        new OO.ui.FieldLayout( this.ownWorkCheckbox, {
                                align: 'inline',
-                               label: mw.msg( 'foreign-structured-upload-form-label-own-work' )
+                               label: $( '<div>' ).append(
+                                       $( '<p>' ).text( mw.msg( 'foreign-structured-upload-form-label-own-work' ) ),
+                                       $ownWorkMessage
+                               )
                        } ),
-                       this.messageLabel
+                       new OO.ui.FieldLayout( this.messageLabel, {
+                               align: 'top'
+                       } )
                ] );
                this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
 
                        mustBeBefore: moment().add( 1, 'day' ).locale( 'en' ).format( 'YYYY-MM-DD' ) // Tomorrow
                } );
                this.categoriesWidget = new mw.widgets.CategorySelector( {
+                       // Can't be done here because we don't know the target wiki yet... done in #initialize.
+                       // api: new mw.ForeignApi( ... ),
                        $overlay: this.$overlay
                } );
 
                                label: mw.msg( 'upload-form-label-infoform-name' ),
                                align: 'top'
                        } ),
-                       new OO.ui.FieldLayout( this.categoriesWidget, {
-                               label: mw.msg( 'foreign-structured-upload-form-label-infoform-categories' ),
-                               align: 'top'
-                       } ),
                        new OO.ui.FieldLayout( this.descriptionWidget, {
                                label: mw.msg( 'upload-form-label-infoform-description' ),
                                align: 'top'
                        } ),
+                       new OO.ui.FieldLayout( this.categoriesWidget, {
+                               label: mw.msg( 'foreign-structured-upload-form-label-infoform-categories' ),
+                               align: 'top'
+                       } ),
                        new OO.ui.FieldLayout( this.dateWidget, {
                                label: mw.msg( 'foreign-structured-upload-form-label-infoform-date' ),
                                align: 'top'
         * @inheritdoc
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.getText = function () {
-               this.upload.addDescription( 'en', this.descriptionWidget.getValue() );
+               var language = mw.config.get( 'wgContentLanguage' );
+               this.upload.addDescription( language, this.descriptionWidget.getValue() );
                this.upload.setDate( this.dateWidget.getValue() );
                this.upload.addCategories( this.categoriesWidget.getItemsData() );
                return this.upload.getText();
index 7b307ee..c616829 100644 (file)
         * The file has been saved to the database
         *
         * @event fileSaved
+        * @param {Object} imageInfo See mw.Upload#getImageInfo
         */
 
        /**
 
        /**
         * Initialize for a new upload
+        *
+        * @return {jQuery.Promise} Promise resolved when everything is initialized
         */
        mw.Upload.BookletLayout.prototype.initialize = function () {
                this.clear();
                this.upload = this.createUpload();
                this.setPage( 'upload' );
+               return $.Deferred().resolve().promise();
        };
 
        /**
                                layout.setPage( 'insert' );
 
                                deferred.resolve();
-                               layout.emit( 'fileSaved' );
+                               layout.emit( 'fileSaved', layout.upload.getImageInfo() );
                        }, function () {
                                var errorMessage = layout.getErrorMessageForStateDetails();
                                deferred.reject( errorMessage );
index 03e3971..53afca8 100644 (file)
         *
         * The dialog's closing promise can be used to get details of the upload.
         *
+        * If you want to use a different OO.ui.BookletLayout, for example the
+        * mw.ForeignStructuredUpload.BookletLayout, like in the case of of the upload
+        * interface in VisualEditor, you can pass it in the {@link #cfg-bookletClass}:
+        *
+        *     var uploadDialog = new mw.Upload.Dialog( {
+        *         bookletClass: mw.ForeignStructuredUpload.BookletLayout
+        *     } );
+        *
+        *
         * @class mw.Upload.Dialog
         * @uses mw.Upload
+        * @uses mw.Upload.BookletLayout
         * @extends OO.ui.ProcessDialog
         * @cfg {Function} [bookletClass=mw.Upload.BookletLayout] Booklet class to be
         *     used for the steps
        mw.Upload.Dialog.prototype.getSetupProcess = function ( data ) {
                return mw.Upload.Dialog.parent.prototype.getSetupProcess.call( this, data )
                        .next( function () {
-                               this.uploadBooklet.initialize();
+                               return this.uploadBooklet.initialize();
                        }, this );
        };
 
index 1432912..4f8789d 100644 (file)
         */
        UP.setFilenameFromFile = function () {
                var file = this.getFile();
+               if ( !file ) {
+                       return;
+               }
                if ( file.nodeType && file.nodeType === Node.ELEMENT_NODE ) {
                        // File input element, use getBasename to cut out the path
                        this.setFilename( this.getBasename( file.value ) );
-               } else if ( file.name && file.lastModified ) {
+               } else if ( file.name ) {
                        // HTML5 FileAPI File object, but use getBasename to be safe
                        this.setFilename( this.getBasename( file.name ) );
+               } else {
+                       // If we ever implement uploading files from clipboard, they might not have a name
+                       this.setFilename( '?' );
                }
        };
 
index de63a18..2e89f6b 100644 (file)
         * @return {string} return.return Rendered HTML.
         */
        mw.jqueryMsg.getMessageFunction = function ( options ) {
-               var failableParserFn = getFailableParserFn( options ),
-                       format;
+               var failableParserFn, format;
 
                if ( options && options.format !== undefined ) {
                        format = options.format;
                }
 
                return function () {
+                       if ( !failableParserFn ) {
+                               failableParserFn = getFailableParserFn( options );
+                       }
                        var failableResult = failableParserFn( arguments );
                        if ( format === 'text' || format === 'escaped' ) {
                                return failableResult.text();
         * @return {jQuery} return.return
         */
        mw.jqueryMsg.getPlugin = function ( options ) {
-               var failableParserFn = getFailableParserFn( options );
+               var failableParserFn;
 
                return function () {
+                       if ( !failableParserFn ) {
+                               failableParserFn = getFailableParserFn( options );
+                       }
                        var $target = this.empty();
                        appendWithoutParsing( $target, failableParserFn( arguments ) );
                        return $target;
        };
 
        mw.jqueryMsg.parser.prototype = {
-               /**
-                * Cache mapping MediaWiki message keys and the value onlyCurlyBraceTransform, to the AST of the message.
-                *
-                * In most cases, the message is a string so this is identical.
-                * (This is why we would like to move this functionality server-side).
-                *
-                * The two parts of the key are separated by colon.  For example:
-                *
-                *     "message-key:true": ast
-                *
-                * if they key is "message-key" and onlyCurlyBraceTransform is true.
-                *
-                * This cache is shared by all instances of mw.jqueryMsg.parser.
-                *
-                * NOTE: We promise, it's static - when you create this empty object
-                * in the prototype, each new instance of the class gets a reference
-                * to the same object.
-                *
-                * @static
-                * @property {Object}
-                */
-               astCache: {},
-
                /**
                 * Where the magic happens.
                 * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
                 * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
                getAst: function ( key ) {
-                       var wikiText,
-                               cacheKey = [ key, this.settings.onlyCurlyBraceTransform ].join( ':' );
-
-                       if ( this.astCache[ cacheKey ] === undefined ) {
-                               wikiText = this.settings.messages.get( key );
-                               if ( typeof wikiText !== 'string' ) {
-                                       wikiText = '\\[' + key + '\\]';
-                               }
-                               this.astCache[ cacheKey ] = this.wikiTextToAst( wikiText );
+                       var wikiText = this.settings.messages.get( key );
+                       if ( typeof wikiText !== 'string' ) {
+                               wikiText = '\\[' + key + '\\]';
                        }
-                       return this.astCache[ cacheKey ];
+                       return this.wikiTextToAst( wikiText );
                },
 
                /**
                        // I am deferring the work of turning it into prototypes & objects. It's quite fast enough
                        // finally let's do some actual work...
 
-                       // If you add another possible rootExpression, you must update the astCache key scheme.
                        result = start( this.settings.onlyCurlyBraceTransform ? curlyBraceTransformExpression : expression );
 
                        /*
index 12d698b..3ffe55f 100644 (file)
                log: ( function () {
                        // Also update the restoration of methods in mediawiki.log.js
                        // when adding or removing methods here.
-                       var log = function () {};
+                       var log = function () {},
+                               console = window.console;
 
                        /**
                         * @class mw.log
                         *
                         * @param {...string} msg Messages to output to console
                         */
-                       log.warn = function () {
-                               var console = window.console;
-                               if ( console && console.warn && console.warn.apply ) {
-                                       console.warn.apply( console, arguments );
-                               }
-                       };
+                       log.warn = console && console.warn && Function.prototype.bind ?
+                               Function.prototype.bind.call( console.warn, console ) :
+                               $.noop;
 
                        /**
                         * Write a message the console's error channel.
                         * @since 1.26
                         * @param {Error|...string} msg Messages to output to console
                         */
-                       log.error = function () {
-                               var console = window.console;
-                               if ( console && console.error && console.error.apply ) {
-                                       console.error.apply( console, arguments );
-                               }
-                       };
+                       log.error = console && console.error && Function.prototype.bind ?
+                               Function.prototype.bind.call( console.error, console ) :
+                               $.noop;
 
                        /**
                         * Create a property in a host object that, when accessed, will produce
                                 * Create an HTML element string, with safe escaping.
                                 *
                                 * @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:
+                                * @param {Object} [attrs] An object with members mapping element names to values
+                                * @param {string|mw.html.Raw|mw.html.Cdata|null} [contents=null] The contents of the element.
                                 *
-                                *  - 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.
-                                *  - this.Cdata: The value attribute is included, and an exception is
-                                *    thrown if it contains an illegal ETAGO delimiter.
-                                *    See <http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2>.
+                                *  - string: Text to be escaped.
+                                *  - null: The element is treated as void with short closing form, e.g. `<br/>`.
+                                *  - this.Raw: The raw value is directly included.
+                                *  - this.Cdata: The raw value is directly included. An exception is
+                                *    thrown if it contains any illegal ETAGO delimiter.
+                                *    See <http://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
                                 * @return {string} HTML
                                 */
                                element: function ( name, attrs, contents ) {
                                        var v, attrName, s = '<' + name;
 
-                                       for ( attrName in attrs ) {
-                                               v = attrs[ attrName ];
-                                               // Convert name=true, to name=name
-                                               if ( v === true ) {
-                                                       v = attrName;
-                                               // Skip name=false
-                                               } else if ( v === false ) {
-                                                       continue;
+                                       if ( attrs ) {
+                                               for ( attrName in attrs ) {
+                                                       v = attrs[ attrName ];
+                                                       // Convert name=true, to name=name
+                                                       if ( v === true ) {
+                                                               v = attrName;
+                                                       // Skip name=false
+                                                       } else if ( v === false ) {
+                                                               continue;
+                                                       }
+                                                       s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
                                                }
-                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
                                        }
                                        if ( contents === undefined || contents === null ) {
                                                // Self close tag
index 632ae82..188af6a 100644 (file)
@@ -5,6 +5,8 @@
        width: 20em;
        line-height: 1.35;
        z-index: 10000;
+       /* Avoid horizontal scrollbar on fade in and on fade out */
+       overflow: hidden;
 }
 
 .mw-notification {
        margin-bottom: 0.5em;
        border: solid 1px #ddd;
        background-color: #fcfcfc;
-       /* Message hides on-click */
-       /* See also mediawiki.notification.js */
+       /* Click handler in mediawiki.notification.js */
        cursor: pointer;
+
+       opacity: 0;
+       -webkit-transform: translateX(35px);
+       transform: translateX(35px);
+       -webkit-transition: opacity 0.35s ease-in-out, -webkit-transform 0.35s ease-in-out;
+       transition: opacity 0.35s ease-in-out, transform 0.35s ease-in-out;
+}
+
+.mw-notification-visible {
+       opacity: 1;
+       -webkit-transform: translateX(0);
+       transform: translateX(0);
+}
+
+.mw-notification-replaced {
+       opacity: 0;
+       -webkit-transform: translateY(-35px);
+       transform: translateY(-35px);
+       pointer-events: none;
 }
 
 .mw-notification-title {
index f361ec8..3f7b8fd 100644 (file)
@@ -7,7 +7,8 @@
                // Number of open notification boxes at any time
                openNotificationCount = 0,
                isPageReady = false,
-               preReadyNotifQueue = [];
+               preReadyNotifQueue = [],
+               rAF = window.requestAnimationFrame || setTimeout;
 
        /**
         * A Notification object for 1 message.
         * @private
         */
        Notification.prototype.start = function () {
-               var
-                       // Local references
-                       $notification, options,
-                       // Original opacity so that we can animate back to it later
-                       opacity,
-                       // Other notification elements matching the same tag
-                       $tagMatches,
-                       outerHeight,
-                       placeholderHeight,
-                       autohideCount,
-                       notif;
+               var options, $notification, $tagMatches, autohideCount;
 
                $area.show();
 
                options = this.options;
                $notification = this.$notification;
 
-               opacity = this.$notification.css( 'opacity' );
-
-               // Set the opacity to 0 so we can fade in later.
-               $notification.css( 'opacity', 0 );
-
                if ( options.tag ) {
-                       // Check to see if there are any tagged notifications with the same tag as the new one
+                       // Find notifications with the same tag
                        $tagMatches = $area.find( '.mw-notification-tag-' + options.tag );
                }
 
-               // If we found a tagged notification use the replacement pattern instead of the new
-               // notification fade-in pattern.
+               // If we found existing notification with the same tag, replace them
                if ( options.tag && $tagMatches.length ) {
 
-                       // Iterate over the tag matches to find the outerHeight we should use
-                       // for the placeholder.
-                       outerHeight = 0;
+                       // While there can be only one "open" notif with a given tag, there can be several
+                       // matches here because they remain in the DOM until the animation is finished.
                        $tagMatches.each( function () {
                                var notif = $( this ).data( 'mw.notification' );
-                               if ( notif ) {
-                                       // Use the notification's height + padding + border + margins
-                                       // as the placeholder height.
-                                       outerHeight = notif.$notification.outerHeight( true );
-                                       if ( notif.$replacementPlaceholder ) {
-                                               // Grab the height of a placeholder that has not finished animating.
-                                               placeholderHeight = notif.$replacementPlaceholder.height();
-                                               // Remove any placeholders added by a previous tagged
-                                               // notification that was in the middle of replacing another.
-                                               // This also makes sure that we only grab the placeholderHeight
-                                               // for the most recent notification.
-                                               notif.$replacementPlaceholder.remove();
-                                               delete notif.$replacementPlaceholder;
-                                       }
-                                       // Close the previous tagged notification
-                                       // Since we're replacing it do this with a fast speed and don't output a placeholder
-                                       // since we're taking care of that transition ourselves.
-                                       notif.close( { speed: 'fast', placeholder: false } );
+                               if ( notif && notif.isOpen ) {
+                                       // Detach from render flow with position absolute so that the new tag can
+                                       // occupy its space instead.
+                                       notif.$notification
+                                               .css( {
+                                                       position: 'absolute',
+                                                       width: notif.$notification.width()
+                                               } )
+                                               .css( notif.$notification.position() )
+                                               .addClass( 'mw-notification-replaced' );
+                                       notif.close();
                                }
                        } );
-                       if ( placeholderHeight !== undefined ) {
-                               // If the other tagged notification was in the middle of replacing another
-                               // tagged notification, continue from the placeholder's height instead of
-                               // using the outerHeight of the notification.
-                               outerHeight = placeholderHeight;
-                       }
 
                        $notification
-                               // Insert the new notification before the tagged notification(s)
                                .insertBefore( $tagMatches.first() )
-                               .css( {
-                                       // Use an absolute position so that we can use a placeholder to gracefully push other notifications
-                                       // into the right spot.
-                                       position: 'absolute',
-                                       width: $notification.width()
-                               } )
-                               // Fade-in the notification
-                               .animate( { opacity: opacity },
-                                       {
-                                               duration: 'slow',
-                                               complete: function () {
-                                                       // After we've faded in clear the opacity and let css take over
-                                                       $( this ).css( { opacity: '' } );
-                                               }
-                                       } );
-
-                       notif = this;
-
-                       // Create a clear placeholder we can use to make the notifications around the notification that is being
-                       // replaced expand or contract gracefully to fit the height of the new notification.
-                       notif.$replacementPlaceholder = $( '<div>' )
-                               // Set the height to the space the previous notification or placeholder took
-                               .css( 'height', outerHeight )
-                               // Make sure that this placeholder is at the very end of this tagged notification group
-                               .insertAfter( $tagMatches.eq( -1 ) )
-                               // Animate the placeholder height to the space that this new notification will take up
-                               .animate( { height: $notification.outerHeight( true ) },
-                                       {
-                                               // Do space animations fast
-                                               speed: 'fast',
-                                               complete: function () {
-                                                       // Reset the notification position after we've finished the space animation
-                                                       // However do not do it if the placeholder was removed because another tagged
-                                                       // notification went and closed this one.
-                                                       if ( notif.$replacementPlaceholder ) {
-                                                               $notification.css( 'position', '' );
-                                                       }
-                                                       // Finally, remove the placeholder from the DOM
-                                                       $( this ).remove();
-                                               }
-                                       } );
+                               .addClass( 'mw-notification-visible' );
                } else {
-                       // Append to the notification area and fade in to the original opacity.
-                       $notification
-                               .appendTo( $area )
-                               .animate( { opacity: opacity },
-                                       {
-                                               duration: 'fast',
-                                               complete: function () {
-                                                       // After we've faded in clear the opacity and let css take over
-                                                       $( this ).css( 'opacity', '' );
-                                               }
-                                       }
-                               );
+                       $area.append( $notification );
+                       rAF( function () {
+                               // This frame renders the element in the area (invisible)
+                               rAF( function () {
+                                       $notification.addClass( 'mw-notification-visible' );
+                               } );
+                       } );
                }
 
                // By default a notification is paused.
        };
 
        /**
-        * Close/hide the notification.
-        *
-        * @param {Object} options An object containing options for the closing of the notification.
-        *
-        *  - speed: Use a close speed different than the default 'slow'.
-        *  - placeholder: Set to false to disable the placeholder transition.
+        * Close the notification.
         */
-       Notification.prototype.close = function ( options ) {
+       Notification.prototype.close = function () {
+               var notif = this;
+
                if ( !this.isOpen ) {
                        return;
                }
+
                this.isOpen = false;
                openNotificationCount--;
+
                // Clear any remaining timeout on close
                this.pause();
 
-               options = $.extend( {
-                       speed: 'slow',
-                       placeholder: true
-               }, options );
-
                // Remove the mw-notification-autohide class from the notification to avoid
                // having a half-closed notification counted as a notification to resume
                // when handling {autoHideLimit}.
                // notification that has now become one of the first {autoHideLimit} notifications.
                notification.resume();
 
-               this.$notification
-                       .css( {
-                               // Don't trigger any mouse events while fading out, just in case the cursor
-                               // happens to be right above us when we transition upwards.
-                               pointerEvents: 'none',
-                               // Set an absolute position so we can move upwards in the animation.
-                               // Notification replacement doesn't look right unless we use an animation like this.
-                               position: 'absolute',
-                               // We must fix the width to avoid it shrinking horizontally.
-                               width: this.$notification.width()
-                       } )
-                       // Fix the top/left position to the current computed position from which we
-                       // can animate upwards.
-                       .css( this.$notification.position() );
-
-               // This needs to be done *after* notification's position has been made absolute.
-               if ( options.placeholder ) {
-                       // Insert a placeholder with a height equal to the height of the
-                       // notification plus it's vertical margins in place of the notification
-                       var $placeholder = $( '<div>' )
-                               .css( 'height', this.$notification.outerHeight( true ) )
-                               .insertBefore( this.$notification );
-               }
-
-               // Animate opacity and top to create fade upwards animation for notification closing
-               this.$notification
-                       .animate( {
-                               opacity: 0,
-                               top: '-=35'
-                       }, {
-                               duration: options.speed,
-                               complete: function () {
-                                       // Remove the notification
-                                       $( this ).remove();
-                                       // Hide the area manually after closing the last notification, since it has padding,
-                                       // causing it to obscure whatever is behind it in spite of being invisible (bug 52659).
-                                       // It's okay to do this before getting rid of the placeholder, as it's invisible as well.
-                                       if ( openNotificationCount === 0 ) {
-                                               $area.hide();
-                                       }
-                                       if ( options.placeholder ) {
-                                               // Use a fast slide up animation after closing to make it look like the notifications
-                                               // below slide up into place when the notification disappears
-                                               $placeholder.slideUp( 'fast', function () {
-                                                       // Remove the placeholder
-                                                       $( this ).remove();
-                                               } );
-                                       }
+               rAF( function () {
+                       notif.$notification.removeClass( 'mw-notification-visible' );
+
+                       setTimeout( function () {
+                               if ( openNotificationCount === 0 ) {
+                                       // Hide the area after the last notification closes. Otherwise, the padding on
+                                       // the area can be obscure content, despite the area being empty/invisible (T54659). // FIXME
+                                       $area.hide();
+                                       notif.$notification.remove();
+                               } else {
+                                       notif.$notification.slideUp( 'fast',  function () {
+                                               $( this ).remove();
+                                       } );
                                }
-                       } );
+                       }, 500 );
+               } );
        };
 
        /**
                        // on links from hiding a notification.
                        .on( 'click', 'a', function ( e ) {
                                e.stopPropagation();
-                       } )
-                       .hide();
+                       } );
 
                // Prepend the notification area to the content area and save it's object.
                mw.util.$content.prepend( $area );
                offset = $area.offset();
+               $area.hide();
 
                function updateAreaMode() {
                        var isFloating = $window.scrollTop() > offset.top;
diff --git a/resources/src/mediawiki/mediawiki.raggett.css b/resources/src/mediawiki/mediawiki.raggett.css
new file mode 100644 (file)
index 0000000..1e1e973
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-empty-li {
+       display: none;
+}
index dfccf21..79937e5 100644 (file)
@@ -25,7 +25,7 @@
                        rows = [],
                        $gallery = $( this );
 
-               $gallery.children( 'li' ).each( function () {
+               $gallery.children( 'li.gallerybox' ).each( function () {
                        // Math.floor to be paranoid if things are off by 0.00000000001
                        var top = Math.floor( $( this ).position().top ),
                                $this = $( this );
        }
 
        function handleResizeStart() {
-               $galleries.children( 'li' ).each( function () {
+               $galleries.children( 'li.gallerybox' ).each( function () {
                        var imgWidth = $( this ).data( 'imgWidth' ),
                                imgHeight = $( this ).data( 'imgHeight' ),
                                width = $( this ).data( 'width' ),
index 093748d..1c48515 100644 (file)
@@ -77,9 +77,6 @@ $wgAutoloadClasses += array(
        'WikitextContentTest' => "$testDir/phpunit/includes/content/WikitextContentTest.php",
 
        # tests/phpunit/includes/db
-       'ORMRowTest' => "$testDir/phpunit/includes/db/ORMRowTest.php",
-       'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-       'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
        'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
        # tests/phpunit/includes/diff
index 7719a28..4e6c591 100644 (file)
@@ -14,7 +14,9 @@
 # Plus any combination of these:
 #
 # cat           add category links
+#               (ignored by Parsoid, since it emits <link>s)
 # ill           add inter-language links
+#               (ignored by Parsoid, since it emits <links>s)
 # subpage       enable subpages (disabled by default)
 # noxml         don't check for XML well-formedness
 # title=[[XXX]] run test using article title XXX
@@ -3328,14 +3330,18 @@ parsoid=wt2html,wt2wt
 <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre&#x2D;wrapping -->
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 7b. Indent-pre and category links
 !! options
-parsoid=wt2html,wt2wt
+parsoid=wt2html
 !! wikitext
  [[Category:foo]] a
  [[Category:foo]] {{echo|b}}
-!! html
+!! html/parsoid
 <pre><link rel="mw:PageProp/Category" href="./Category:Foo"> a
  <link rel="mw:PageProp/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
 !! end
@@ -4687,12 +4693,43 @@ http://example.com/url_with_entity&#60;
 <a rel="mw:ExtLink" href="http://example.com">http://example.com</a>)
 <a rel="mw:ExtLink" href="http://example.com/url_with_(brackets)">http://example.com/url_with_(brackets)</a>
 (<a rel="mw:ExtLink" href="http://example.com/url_without_brackets">http://example.com/url_without_brackets</a>)
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity ">http://example.com/url_with_entity </a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity">&lt;</span>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity&lt;">http://example.com/url_with_entity&lt;</a>
-<a rel="mw:ExtLink" href="http://example.com/url_with_entity&lt;">http://example.com/url_with_entity&lt;</a></p>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;">http://example.com/url_with_entity&amp;</a>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#xA0;","srcContent":" "}'> </span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#160;","srcContent":" "}'> </span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;lt;","srcContent":"&lt;"}'>&lt;</span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#x3C;","srcContent":"&lt;"}'>&lt;</span>
+<a rel="mw:ExtLink" href="http://example.com/url_with_entity">http://example.com/url_with_entity</a><span typeof="mw:Entity" data-parsoid='{"src":"&amp;#60;","srcContent":"&lt;"}'>&lt;</span></p>
+!! end
+
+!! test
+External links: tricky Parsoid html2html case
+!! options
+parsoid=wt2html,wt2wt,html2html
+!! wikitext
+http://example.com/url_with_entity&amp;amp;
+!! html/php
+<p><a rel="nofollow" class="external free" href="http://example.com/url_with_entity&amp;amp">http://example.com/url_with_entity&amp;amp</a>;
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/url_with_entity&amp;amp">http://example.com/url_with_entity&amp;amp</a>;</p>
+!! end
+
+!! test
+External links: Free with trailing quotes (T113666)
+!! wikitext
+'''News:''' Stuff here
+
+news:'a'b''c''d e
+!! html/php
+<p><b>News:</b> Stuff here
+</p><p><a rel="nofollow" class="external free" href="news:'a'b">news:'a'b</a><i>c</i>d e
+</p>
+!! html/parsoid
+<p><b>News:</b> Stuff here</p>
+<p><a rel="mw:ExtLink" href="news:'a'b">news:'a'b</a><i>c</i>d e</p>
 !! end
 
 !! test
@@ -5076,6 +5113,8 @@ External links: link text with spaces
 
 !! test
 External links: wiki links within external link (Bug 3695)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 [http://example.com [[wikilink]] embedded in ext link]
 !! html/php
@@ -5596,7 +5635,7 @@ Parenthesis in external links, w/ transclusion or comment
 !! test
 Serialize <a> tags with invalid link targets as plain text
 !! options
-parsoid=html2wt
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
 !! html/parsoid
 <a rel="mw:WikiLink" href="[[foo]]">text</a>
 <a rel="mw:WikiLink" href="[[foo]]">*text</a>
@@ -10088,6 +10127,23 @@ PMID
 1234</p>
 !! end
 
+# <nowiki> nodes shouldn't be inserted during html2wt by Parsoid,
+# since these are ExtLinkText, not MagicLinkText
+!! test
+Magic links: use appropriate serialization for "almost" magic links.
+!! wikitext
+X[[Special:BookSources/0978739256|foo]]
+
+X[//tools.ietf.org/html/rfc1234 foo]
+!! html/php
+<p>X<a href="/wiki/Special:BookSources/0978739256" title="Special:BookSources/0978739256">foo</a>
+</p><p>X<a rel="nofollow" class="external text" href="//tools.ietf.org/html/rfc1234">foo</a>
+</p>
+!! html/parsoid
+<p>X<a rel="mw:WikiLink" href="./Special:BookSources/0978739256" title="Special:BookSources/0978739256">foo</a></p>
+<p>X<a rel="mw:ExtLink" href="//tools.ietf.org/html/rfc1234">foo</a></p>
+!! end
+
 ###
 ### Templates
 ####
@@ -10809,8 +10865,14 @@ Un-closed <includeonly>
 !! html
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize the include directives to serialize on their own line.
+## Selser will take care of preserving formatting in scenarios where they
+## intermingled with other wikitext.
 !! test
 Includes and comments at SOL
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 <!-- comment --><noinclude><!-- comment --></noinclude><!-- comment -->== hu ==
 
@@ -10991,10 +11053,14 @@ parsoid=wt2html,wt2wt
 </tbody></table>
 !!end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize the include directives to serialize on their own line.
+## Selser will take care of preserving formatting in scenarios where they
+## intermingled with other wikitext.
 !!test
 2. Table tag in SOL posn. should get reparsed correctly with valid TSR
 !!options
-parsoid=wt2html,wt2wt
+parsoid=wt2html
 !!wikitext
 <includeonly>a</includeonly>{| {{{b}}}
 |c
@@ -12913,13 +12979,14 @@ parsoid={
 [[Image:Foobar.jpg|<nowiki>|</nowiki>]]
 !! end
 
+# wgExternalLinkTarget not supported by Parsoid
 !! test
 Image with link parameter, wgExternalLinkTarget
 !! wikitext
 [[Image:foobar.jpg|link=http://example.com/]]
 !! config
 wgExternalLinkTarget='foobar'
-!! html
+!! html/php
 <p><a href="http://example.com/" target="foobar" rel="nofollow"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
@@ -12946,13 +13013,14 @@ wgNoFollowDomainExceptions='example.com'
 </p>
 !! end
 
+# wgExternalLinkTarget not supported by Parsoid
 !! test
 Image with link parameter, wgExternalLinkTarget, unnamed parameter
 !! wikitext
 [[Image:foobar.jpg|link=http://example.com/|Title]]
 !! config
 wgExternalLinkTarget='foobar'
-!! html
+!! html/php
 <p><a href="http://example.com/" title="Title" target="foobar" rel="nofollow"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
@@ -14207,15 +14275,22 @@ pst
 [[Category:Foo (bar)|Foo]]
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 Category with link tail
 !! options
 cat
 pst
+parsoid=wt2html
 !! wikitext
 123[[Category:Foo]]456
-!! html
+!! html/php
 123[[Category:Foo]]456
+!! html/parsoid
+<p>123<link rel="mw:PageProp/Category" href="Category:Foo"/>456</p>
 !! end
 
 !! test
@@ -14251,8 +14326,14 @@ pst
 [[Category:{{echo|Foo}}|{{echo|Bar}}]]
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 Category / paragraph interactions
+!! options
+parsoid=wt2html
 !! wikitext
 Foo [[Category:Baz]] Bar
 
@@ -14279,7 +14360,7 @@ Bar
 [[Category:Baz]]
  {{echo|[[Category:Baz]]}}
 [[Category:Baz]]
-!! html
+!! html/php
 <p>Foo Bar
 </p><p>Foo
 Bar
@@ -14289,20 +14370,32 @@ Bar
 </p><p>Foo
 Bar
 </p>
+!! html/parsoid
+<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
+<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Baz]]"}},"i":0}}]}'/></p>
+<link rel="mw:PageProp/Category" href="Category:Baz"/>
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
+##
 ## The whitespace on the empty line is part of the test. Please do not delete
 !! test
 1. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
 !! options
-parsoid=wt2html,wt2wt
+parsoid=wt2html
 !! wikitext
 This
    
 [[Category:Foo]] and this should be part of same paragraph (not an indent-pre)
    
 {{echo|[[Category:Foo]] and so should this!}}
-!! html
+!! html/php
 <p>This and this should be part of same paragraph (not an indent-pre) and so should this!
 </p>
 !! html/parsoid
@@ -14400,8 +14493,14 @@ parsoid=wt2html
 <link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/>
 !! end
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 6. Categories and newlines: migrateTrailingCategories dom pass should not migrate categories not preceded by newlines
+!! options
+parsoid=wt2html
 !! wikitext
 * a [[Category:Foo]]
 !! html/parsoid
@@ -14452,13 +14551,20 @@ parsoid
 </p>
 !! end
 
-# html2wt localizes the "Category" namespace.
-# XXX the <link> element needs an empty data-parsoid attribute, or
-# else the html2html test fails because spaces are inserted.
+# We used to, but no longer wt2wt this test since the default serializer
+# will normalize all categories to serialize on their own line.
+# This wikitext usage is going to be fairly uncommon in production and
+# selser will take care of preventing whitespace insertion if this
+# occurs in an article.
+#
+# html2html disabled for the same reason (whitespace insertion between
+# x and y).
+#
+# html2wt disabled because it localizes the "Category" namespace.
 !! test
 Link prefix/suffixes aren't applied to category links
 !! options
-parsoid=wt2html,wt2wt,html2html
+parsoid=wt2html
 language=is
 !! wikitext
 x[[Category:Foo]]y
@@ -17067,7 +17173,8 @@ Special page transclusion
 !! wikitext
 {{Special:Prefixindex/Xyzzyx}}
 !! html
-<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
+</ul></div>
 
 !! end
 
@@ -17078,8 +17185,10 @@ Special page transclusion twice (bug 5021)
 {{Special:Prefixindex/Xyzzyx}}
 {{Special:Prefixindex/Xyzzyx}}
 !! html
-<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<table class="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
+</ul></div>
+<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
+</ul></div>
 
 !! end
 
@@ -19155,17 +19264,25 @@ Category:分類
 blah
 !! endarticle
 
+## We used to, but no longer wt2wt this test since the default serializer
+## will normalize all categories to serialize on their own line.
+## This wikitext usage is going to be fairly uncommon in production and
+## selser will take care of preserving formatting in those scenarios.
 !! test
 Don't convert blue categorylinks to another variant (bug 33210)
 !! options
-language=zh cat
+cat
+language=zh
+parsoid=wt2html
 !! wikitext
 [[A]][[Category:分类]]
-!! html
+!! html/php
 <a href="/wiki/Category:%E5%88%86%E7%B1%BB" title="Category:分类">分类</a>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="A" title="A">A</a></p>
+<link rel="mw:PageProp/Category" href="Category:分类"/>
 !! end
 
-
 !! test
 Stripping -{}- tags (language variants)
 !! options
@@ -23509,7 +23626,8 @@ parsoid=html2wt
 
  __TOC__ foo
 
-__TOC__ bar
+__TOC__
+ bar
 !! end
 
 #### --------------- HTML tags ---------------
@@ -25255,11 +25373,11 @@ parsoid=html2wt
 <p><b><a href="http://cscott.net">http://cscott.net</a>x</b></p>
 <p><a href="http://cscott.net">http://cscott.net</a>x</p>
 !! wikitext
-http://cscott.net<nowiki/>'''foo'''
+http://cscott.net'''foo'''
 
 http://cscott.net<b>foo</b>
 
-'''http://cscott.net<nowiki/>'''
+'''http://cscott.net'''
 
 '''http://cscott.net '''
 
@@ -25427,7 +25545,7 @@ parsoid=html2wt
 !! test
 T75121: Infer extension name from typeOf if data-mw is not present
 !! options
-parsoid=html2wt
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
 !! html/parsoid
 <div typeOf="mw:Extension/foo"></div>
 !! wikitext
@@ -25530,7 +25648,7 @@ parsoid={
 !! test
 Never serialize a-tag as html, regardless of what data-parsoid has to say
 !! options
-parsoid=html2wt
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
 !! html/parsoid
 <a rel="mw:WikiLink" href="./Foo" title="Foo" data-parsoid='{"stx":"html"}'>Foo</a>
 !! wikitext
@@ -25544,7 +25662,7 @@ parsoid=html2wt
 !! test
 Never serialize a-tag as html, no matter what attributes it has
 !! options
-parsoid=html2wt
+parsoid={ "modes": ["html2wt"], "suppressErrors": true }
 !! html/parsoid
 <a bad='true' href='http://boo.org'><img src='http://boohoo.org' /></a>
 !! wikitext
@@ -25568,6 +25686,26 @@ parsoid=html2wt
 # Tests spec'ing wikitext serialization norms |
 # --------------------------------------------
 
+!! test
+1. Categories should always be serialized on their own line
+!! options
+parsoid=html2wt
+!! html/parsoid
+foo<link rel="mw:PageProp/Category" href="./Category:Foo">bar
+!! wikitext
+foo
+[[Category:Foo]]
+bar
+!! end
+
+!! test
+2. Categories that are part of templates should not introduce a line break
+!! wikitext
+foo {{echo|<span>bar</span> [[Category:baz]]}} bar
+!! html/parsoid
+<p>foo <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;span>bar&lt;/span> [[Category:baz]]"}},"i":0}}]}'>bar</span><span about="#mwt1"> </span><link rel="mw:PageProp/Category" href="./Category:Baz" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Baz"},"sa":{"href":"Category:baz"}}'/> bar</p>
+!! end
+
 !! test
 Lists: Add space after bullets
 !! options
@@ -26267,3 +26405,19 @@ B <ref group="X" name="b" />
 <ref name="b"><span id="Z">foo</span>bar</ref>
 </references>
 !! end
+
+!! test
+Empty LI (T49673)
+!! wikitext
+* a
+* 
+*
+* b
+!! html/php+tidy
+<ul>
+<li>a</li>
+<li class="mw-empty-li"></li>
+<li class="mw-empty-li"></li>
+<li>b</li>
+</ul>
+!! end
index 90d40a5..9e4a984 100644 (file)
@@ -181,7 +181,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $fileName = $this->getNewTempFile();
 
                // Converting the temporary /file/ to a /directory/
-               //
                // The following is not atomic, but at least we now have a single place,
                // where temporary directory creation is bundled and can be improved
                unlink( $fileName );
@@ -208,7 +207,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( $this->needsDB() && $this->db ) {
                        // Clean up open transactions
                        while ( $this->db->trxLevel() > 0 ) {
-                               $this->db->rollback();
+                               $this->db->rollback( __METHOD__, 'flush' );
                        }
                }
 
@@ -242,7 +241,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                if ( $this->needsDB() && $this->db ) {
                        // Clean up open transactions
                        while ( $this->db->trxLevel() > 0 ) {
-                               $this->db->rollback();
+                               $this->db->rollback( __METHOD__, 'flush' );
                        }
                }
 
index e39e02f..56f9746 100644 (file)
@@ -583,7 +583,6 @@ class GlobalTest extends MediaWikiTestCase {
                        // if you hack it just right are kinda pathological,
                        // and unreliable cross-platform or on IE which means they're
                        // unlikely to appear on intranets.
-                       //
                        // Those will survive the algorithm but with results that
                        // are less consistent.
 
@@ -708,81 +707,27 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        public function testWfMemcKey() {
-               // Just assert the exact output so we can catch unintentional changes to key
-               // construction, which would effectively invalidate all existing cache.
-
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => false,
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => '',
-               ) );
-               $this->assertEquals(
-                       wfMemcKey( 'foo', '123', 'bar' ),
-                       'example:foo:123:bar'
-               );
-
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => false,
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => 'mw_',
-               ) );
-               $this->assertEquals(
-                       wfMemcKey( 'foo', '123', 'bar' ),
-                       'example-mw_:foo:123:bar'
-               );
-
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => 'custom',
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => 'mw_',
-               ) );
+               $cache = ObjectCache::getLocalClusterInstance();
                $this->assertEquals(
-                       wfMemcKey( 'foo', '123', 'bar' ),
-                       'custom:foo:123:bar'
+                       $cache->makeKey( 'foo', 123, 'bar' ),
+                       wfMemcKey( 'foo', 123, 'bar' )
                );
        }
 
        public function testWfForeignMemcKey() {
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => false,
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => '',
-               ) );
-               $local = wfMemcKey( 'foo', 'bar' );
-
-               $this->setMwGlobals( array(
-                       'wgDBname' => 'other',
-                       'wgDBprefix' => 'mw_',
-               ) );
+               $cache = ObjectCache::getLocalClusterInstance();
+               $keyspace = $this->readAttribute( $cache, 'keyspace' );
                $this->assertEquals(
-                       wfForeignMemcKey( 'example', '', 'foo', 'bar' ),
-                       $local,
-                       'Match output of wfMemcKey from local wiki'
+                       wfForeignMemcKey( $keyspace, '', 'foo', 'bar' ),
+                       $cache->makeKey( 'foo', 'bar' )
                );
        }
 
        public function testWfGlobalCacheKey() {
-               $this->setMwGlobals( array(
-                       'wgCachePrefix' => 'ignored',
-                       'wgDBname' => 'example',
-                       'wgDBprefix' => ''
-               ) );
-               $one = wfGlobalCacheKey( 'some', 'thing' );
-               $this->assertEquals(
-                       $one,
-                       'global:some:thing'
-               );
-
-               $this->setMwGlobals( array(
-                       'wgDBname' => 'other',
-                       'wgDBprefix' => 'mw_'
-               ) );
-               $two = wfGlobalCacheKey( 'some', 'thing' );
-
+               $cache = ObjectCache::getLocalClusterInstance();
                $this->assertEquals(
-                       $one,
-                       $two,
-                       'Not fragmented by wiki id'
+                       $cache->makeGlobalKey( 'foo', 123, 'bar' ),
+                       wfGlobalCacheKey( 'foo', 123, 'bar' )
                );
        }
 
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
deleted file mode 100644 (file)
index 9d55e85..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-/**
- * @group GlobalFunctions
- * @covers ::wfBaseConvert
- */
-class WfBaseConvertTest extends MediaWikiTestCase {
-       public static function provideSingleDigitConversions() {
-               return array(
-                       //      2    3    5    8   10   16   36
-                       array( '0', '0', '0', '0', '0', '0', '0' ),
-                       array( '1', '1', '1', '1', '1', '1', '1' ),
-                       array( '10', '2', '2', '2', '2', '2', '2' ),
-                       array( '11', '10', '3', '3', '3', '3', '3' ),
-                       array( '100', '11', '4', '4', '4', '4', '4' ),
-                       array( '101', '12', '10', '5', '5', '5', '5' ),
-                       array( '110', '20', '11', '6', '6', '6', '6' ),
-                       array( '111', '21', '12', '7', '7', '7', '7' ),
-                       array( '1000', '22', '13', '10', '8', '8', '8' ),
-                       array( '1001', '100', '14', '11', '9', '9', '9' ),
-                       array( '1010', '101', '20', '12', '10', 'a', 'a' ),
-                       array( '1011', '102', '21', '13', '11', 'b', 'b' ),
-                       array( '1100', '110', '22', '14', '12', 'c', 'c' ),
-                       array( '1101', '111', '23', '15', '13', 'd', 'd' ),
-                       array( '1110', '112', '24', '16', '14', 'e', 'e' ),
-                       array( '1111', '120', '30', '17', '15', 'f', 'f' ),
-                       array( '10000', '121', '31', '20', '16', '10', 'g' ),
-                       array( '10001', '122', '32', '21', '17', '11', 'h' ),
-                       array( '10010', '200', '33', '22', '18', '12', 'i' ),
-                       array( '10011', '201', '34', '23', '19', '13', 'j' ),
-                       array( '10100', '202', '40', '24', '20', '14', 'k' ),
-                       array( '10101', '210', '41', '25', '21', '15', 'l' ),
-                       array( '10110', '211', '42', '26', '22', '16', 'm' ),
-                       array( '10111', '212', '43', '27', '23', '17', 'n' ),
-                       array( '11000', '220', '44', '30', '24', '18', 'o' ),
-                       array( '11001', '221', '100', '31', '25', '19', 'p' ),
-                       array( '11010', '222', '101', '32', '26', '1a', 'q' ),
-                       array( '11011', '1000', '102', '33', '27', '1b', 'r' ),
-                       array( '11100', '1001', '103', '34', '28', '1c', 's' ),
-                       array( '11101', '1002', '104', '35', '29', '1d', 't' ),
-                       array( '11110', '1010', '110', '36', '30', '1e', 'u' ),
-                       array( '11111', '1011', '111', '37', '31', '1f', 'v' ),
-                       array( '100000', '1012', '112', '40', '32', '20', 'w' ),
-                       array( '100001', '1020', '113', '41', '33', '21', 'x' ),
-                       array( '100010', '1021', '114', '42', '34', '22', 'y' ),
-                       array( '100011', '1022', '120', '43', '35', '23', 'z' )
-               );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase2( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base2, wfBaseConvert( $base3, '3', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base5, '5', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base8, '8', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base10, '10', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base16, '16', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base36, '36', '2' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase3( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base3, wfBaseConvert( $base2, '2', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base5, '5', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base8, '8', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base10, '10', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base16, '16', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base36, '36', '3' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase5( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base5, wfBaseConvert( $base2, '2', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base3, '3', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base8, '8', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base10, '10', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base16, '16', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base36, '36', '5' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase8( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base8, wfBaseConvert( $base2, '2', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base3, '3', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base5, '5', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base10, '10', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base16, '16', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base36, '36', '8' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase10( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base10, wfBaseConvert( $base2, '2', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base3, '3', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base5, '5', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base8, '8', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base16, '16', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base36, '36', '10' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase16( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base16, wfBaseConvert( $base2, '2', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base3, '3', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base5, '5', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base8, '8', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base10, '10', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base36, '36', '16' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase36( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base36, wfBaseConvert( $base2, '2', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base3, '3', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base5, '5', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base8, '8', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base10, '10', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base16, '16', '36' ) );
-       }
-
-       public function testLargeNumber() {
-               $this->assertSame( '1100110001111010000000101110100', wfBaseConvert( 'sd89ys', 36, 2 ) );
-               $this->assertSame( '11102112120221201101', wfBaseConvert( 'sd89ys', 36, 3 ) );
-               $this->assertSame( '12003102232400', wfBaseConvert( 'sd89ys', 36, 5 ) );
-               $this->assertSame( '14617200564', wfBaseConvert( 'sd89ys', 36, 8 ) );
-               $this->assertSame( '1715274100', wfBaseConvert( 'sd89ys', 36, 10 ) );
-               $this->assertSame( '663d0174', wfBaseConvert( 'sd89ys', 36, 16 ) );
-       }
-
-       public static function provideNumbers() {
-               $x = array();
-               $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
-               for ( $i = 0; $i < 50; $i++ ) {
-                       $base = mt_rand( 2, 36 );
-                       $len = mt_rand( 10, 100 );
-
-                       $str = '';
-                       for ( $j = 0; $j < $len; $j++ ) {
-                               $str .= $chars[mt_rand( 0, $base - 1 )];
-                       }
-
-                       $x[] = array( $base, $str );
-               }
-
-               return $x;
-       }
-
-       /**
-        * @dataProvider provideNumbers
-        */
-       public function testIdentity( $base, $number ) {
-               $this->assertSame( $number, wfBaseConvert( $number, $base, $base, strlen( $number ) ) );
-       }
-
-       public function testInvalid() {
-               $this->assertFalse( wfBaseConvert( '101', 1, 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 1 ) );
-               $this->assertFalse( wfBaseConvert( '101', 37, 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 37 ) );
-               $this->assertFalse( wfBaseConvert( 'abcde', 10, 11 ) );
-               $this->assertFalse( wfBaseConvert( '12930', 2, 10 ) );
-               $this->assertFalse( wfBaseConvert( '101', 'abc', 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 'abc' ) );
-       }
-
-       public function testPadding() {
-               $number = "10101010101";
-               $this->assertSame(
-                       strlen( $number ) + 5,
-                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) )
-               );
-               $this->assertSame(
-                       strlen( $number ),
-                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
-               );
-       }
-
-       public function testLeadingZero() {
-               $this->assertSame( '24', wfBaseConvert( '010', 36, 16 ) );
-               $this->assertSame( '37d4', wfBaseConvert( '0b10', 36, 16 ) );
-               $this->assertSame( 'a734', wfBaseConvert( '0x10', 36, 16 ) );
-       }
-}
index bb2b33f..8a7bfa5 100644 (file)
@@ -6,7 +6,7 @@
  */
 class WfGetCallerTest extends MediaWikiTestCase {
        public function testZero() {
-               $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
+               $this->assertEquals( 'WfGetCallerTest->testZero', wfGetCaller( 1 ) );
        }
 
        function callerOne() {
@@ -14,10 +14,10 @@ class WfGetCallerTest extends MediaWikiTestCase {
        }
 
        public function testOne() {
-               $this->assertEquals( 'WfGetCallerTest::testOne', self::callerOne() );
+               $this->assertEquals( 'WfGetCallerTest->testOne', self::callerOne() );
        }
 
-       function intermediateFunction( $level = 2, $n = 0 ) {
+       static function intermediateFunction( $level = 2, $n = 0 ) {
                if ( $n > 0 ) {
                        return self::intermediateFunction( $level, $n - 1 );
                }
@@ -26,11 +26,11 @@ class WfGetCallerTest extends MediaWikiTestCase {
        }
 
        public function testTwo() {
-               $this->assertEquals( 'WfGetCallerTest::testTwo', self::intermediateFunction() );
+               $this->assertEquals( 'WfGetCallerTest->testTwo', self::intermediateFunction() );
        }
 
        public function testN() {
-               $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
+               $this->assertEquals( 'WfGetCallerTest->testN', self::intermediateFunction( 2, 0 ) );
                $this->assertEquals(
                        'WfGetCallerTest::intermediateFunction',
                        self::intermediateFunction( 1, 0 )
index 4ce51c6..a5b65f2 100644 (file)
@@ -149,9 +149,6 @@ class WfTimestampTest extends MediaWikiTestCase {
        }
 
        /**
-        * The Resource Loader uses wfTimestamp() to convert timestamps
-        * from If-Modified-Since header. Thus it must be able to parse all
-        * rfc2616 date formats
         * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
         * @dataProvider provideHttpDates
         */
index 8ee2ad5..9c22430 100644 (file)
@@ -9,16 +9,8 @@
  */
 class ImportTest extends MediaWikiLangTestCase {
 
-       private function getInputStreamSource( $xml ) {
-               if ( ini_get( 'allow_url_fopen' ) != 1 ) {
-                       $this->markTestSkipped( 'bug 73283: this test needs allow_url_fopen to be enabled' );
-               }
-               $file = 'data:application/xml,' . $xml;
-               $status = ImportStreamSource::newFromFile( $file );
-               if ( !$status->isGood() ) {
-                       throw new MWException( "Cannot create InputStreamSource." );
-               }
-               return $status->value;
+       private function getDataSource( $xml ) {
+               return new ImportStringSource( $xml );
        }
 
        /**
@@ -28,7 +20,7 @@ class ImportTest extends MediaWikiLangTestCase {
         * @param string|null $redirectTitle
         */
        public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
-               $source = $this->getInputStreamSource( $xml );
+               $source = $this->getDataSource( $xml );
 
                $redirect = null;
                $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
@@ -114,7 +106,7 @@ EOF
         * @param array|null $namespaces
         */
        public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
-               $source = $this->getInputStreamSource( $xml );
+               $source = $this->getDataSource( $xml );
 
                $importNamespaces = null;
                $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
index f011f47..9093564 100644 (file)
@@ -125,21 +125,16 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        array( '', 'gopher://*.test.com/', 'gopher://gopher.test.com/0/v2/vstat' ),
                        array( 'telnet://', '*.test.com', 'telnet://shell.test.com/~home/' ),
 
-                       //
                        // The following only work in PHP >= 5.3.7, due to a bug in parse_url which eats
                        // the path from the url (https://bugs.php.net/bug.php?id=54180)
-                       //
                        // array( '', 'http://test.com', 'http://test.com/index?arg=1' ),
                        // array( 'http://', '*.test.com', 'http://www.test.com/index?arg=1' ),
                        // array( '' ,
                        //    'http://xx23124:__ffdfdef__@www.test.com:12345/dir' ,
                        //    'http://name:pass@www.test.com:12345/dir/dir/file.xyz.php#__se__?arg1=_&arg2[]=4rtg'
                        // ),
-                       //
 
-                       //
                        // Tests for false positives
-                       //
                        array( 'http://', 'test.com', 'http://www.test.com', false ),
                        array( 'http://', 'www1.test.com', 'http://www.test.com', false ),
                        array( 'http://', '*.test.com', 'http://www.test.t.com', false ),
@@ -166,10 +161,8 @@ class LinkFilterTest extends MediaWikiLangTestCase {
                        array( '', 'http://test.com:8080/dir/', 'http://test.com:808/dir/', false ),
                        array( '', 'http://test.com/dir/index.html', 'http://test.com/dir/index.php', false ),
 
-                       //
                        // These are false positives too and ideally shouldn't match, but that
                        // would require using regexes and RLIKE instead of LIKE
-                       //
                        // array( null, 'http://*.test.com', 'http://www.test.com:80', false ),
                        // array( '', 'https://*.wikimedia.org/r/#/q/status:open,n,z',
                        //      'https://gerrit.wikimedia.org/XXX/r/#/q/status:open,n,z', false ),
index a14a50d..01e221f 100644 (file)
@@ -74,6 +74,20 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                $this->assertEquals( '', $html );
        }
 
+       public function testCategorizationLineFormatting() {
+               $html = $this->createCategorizationLine(
+                       $this->getCategorizationChange( '20150629191735', 0, 0 )
+               );
+               $this->assertNotContains( '(diff | hist)', strip_tags( $html ) );
+       }
+
+       public function testCategorizationLineFormattingWithRevision() {
+               $html = $this->createCategorizationLine(
+                       $this->getCategorizationChange( '20150629191735', 1025, 1024 )
+               );
+               $this->assertContains( '(diff | hist)', strip_tags( $html ) );
+       }
+
        /**
         * @todo more tests for actual formatting, this is more of a smoke test
         */
@@ -115,6 +129,24 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                return $recentChange;
        }
 
+       /**
+        * @return RecentChange
+        */
+       private function getCategorizationChange( $timestamp, $thisId, $lastId ) {
+               $wikiPage = new WikiPage( Title::newFromText( 'Testpage' ) );
+               $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'page created' );
+
+               $wikiPage = new WikiPage( Title::newFromText( 'Category:Foo' ) );
+               $wikiPage->doEditContent( new WikitextContent( 'Some random text' ), 'category page created' );
+
+               $user = $this->getTestUser();
+               $recentChange = $this->testRecentChangesHelper->makeCategorizationRecentChange(
+                       $user, 'Category:Foo', $wikiPage->getId(), $thisId, $lastId, $timestamp
+               );
+
+               return $recentChange;
+       }
+
        /**
         * @return User
         */
@@ -128,4 +160,15 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                return $user;
        }
 
+       private function createCategorizationLine( $recentChange ) {
+               $enhancedChangesList = $this->newEnhancedChangesList();
+               $cacheEntry = $this->testRecentChangesHelper->getCacheEntry( $recentChange );
+
+               $reflection = new \ReflectionClass( get_class( $enhancedChangesList ) );
+               $method = $reflection->getMethod( 'recentChangesBlockLine' );
+               $method->setAccessible( true );
+
+               return $method->invokeArgs( $enhancedChangesList, array( $cacheEntry ) );
+       }
+
 }
index fe5bdd2..10d4c6e 100644 (file)
@@ -97,6 +97,36 @@ class TestRecentChangesHelper {
                return $change;
        }
 
+       public function getCacheEntry( $recentChange ) {
+               $rcCacheFactory = new RCCacheEntryFactory(
+                       new RequestContext(),
+                       array( 'diff' => 'diff', 'cur' => 'cur', 'last' => 'last' )
+               );
+               return $rcCacheFactory->newFromRecentChange( $recentChange, false );
+       }
+
+       public function makeCategorizationRecentChange(
+               User $user, $titleText, $curid, $thisid, $lastid, $timestamp
+       ) {
+
+               $attribs = array_merge(
+                       $this->getDefaultAttributes( $titleText, $timestamp ),
+                       array(
+                               'rc_type' => RC_CATEGORIZE,
+                               'rc_user' => $user->getId(),
+                               'rc_user_text' => $user->getName(),
+                               'rc_this_oldid' => $thisid,
+                               'rc_last_oldid' => $lastid,
+                               'rc_cur_id' => $curid,
+                               'rc_comment' => '[[:Testpage]] added to category',
+                               'rc_old_len' => 0,
+                               'rc_new_len' => 0,
+                       )
+               );
+
+               return $this->makeRecentChange( $attribs, 0, 0 );
+       }
+
        private function getDefaultAttributes( $titleText, $timestamp ) {
                return array(
                        'rc_id' => 545,
index b97842c..a636e56 100644 (file)
@@ -258,7 +258,9 @@ class JavaScriptContentTest extends TextContentTest {
        public function testUpdateRedirect( $oldText, $expectedText ) {
                $this->setMwGlobals( array(
                        'wgServer' => '//example.org',
-                       'wgScriptPath' => '/w/index.php',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+                       'wgResourceBasePath' => '/w',
                ) );
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -317,7 +319,9 @@ class JavaScriptContentTest extends TextContentTest {
        public function testGetRedirectTarget( $title, $text ) {
                $this->setMwGlobals( array(
                        'wgServer' => '//example.org',
-                       'wgScriptPath' => '/w/index.php',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+                       'wgResourceBasePath' => '/w',
                ) );
                $content = new JavaScriptContent( $text );
                $target = $content->getRedirectTarget();
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
deleted file mode 100644 (file)
index 807bd14..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-<?php
-
-/**
- * Abstract class to construct tests for ORMRow deriving classes.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.20
- *
- * @ingroup Test
- *
- * @group ORM
- *
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- * @group Database
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- * @group medium
- *
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class ORMRowTest extends \MediaWikiTestCase {
-
-       /**
-        * @since 1.20
-        * @return string
-        */
-       abstract protected function getRowClass();
-
-       /**
-        * @since 1.20
-        * @return IORMTable
-        */
-       abstract protected function getTableInstance();
-
-       /**
-        * @since 1.20
-        * @return array
-        */
-       abstract public function constructorTestProvider();
-
-       /**
-        * @since 1.20
-        * @param IORMRow $row
-        * @param array $data
-        */
-       protected function verifyFields( IORMRow $row, array $data ) {
-               foreach ( array_keys( $data ) as $fieldName ) {
-                       $this->assertEquals( $data[$fieldName], $row->getField( $fieldName ) );
-               }
-       }
-
-       /**
-        * @since 1.20
-        * @param array $data
-        * @param bool $loadDefaults
-        * @return IORMRow
-        */
-       protected function getRowInstance( array $data, $loadDefaults ) {
-               $class = $this->getRowClass();
-
-               return new $class( $this->getTableInstance(), $data, $loadDefaults );
-       }
-
-       /**
-        * @since 1.20
-        * @return array
-        */
-       protected function getMockValues() {
-               return array(
-                       'id' => 1,
-                       'str' => 'foobar4645645',
-                       'int' => 42,
-                       'float' => 4.2,
-                       'bool' => true,
-                       'array' => array( 42, 'foobar' ),
-                       'blob' => new stdClass()
-               );
-       }
-
-       /**
-        * @since 1.20
-        * @return array
-        */
-       protected function getMockFields() {
-               $mockValues = $this->getMockValues();
-               $mockFields = array();
-
-               foreach ( $this->getTableInstance()->getFields() as $name => $type ) {
-                       if ( $name !== 'id' ) {
-                               $mockFields[$name] = $mockValues[$type];
-                       }
-               }
-
-               return $mockFields;
-       }
-
-       /**
-        * @since 1.20
-        * @return array Array of IORMRow
-        */
-       public function instanceProvider() {
-               $instances = array();
-
-               foreach ( $this->constructorTestProvider() as $arguments ) {
-                       $instances[] = array( call_user_func_array( array( $this, 'getRowInstance' ), $arguments ) );
-               }
-
-               return $instances;
-       }
-
-       /**
-        * @dataProvider constructorTestProvider
-        */
-       public function testConstructor( array $data, $loadDefaults ) {
-               $this->verifyFields( $this->getRowInstance( $data, $loadDefaults ), $data );
-       }
-
-       /**
-        * @dataProvider constructorTestProvider
-        */
-       public function testSaveAndRemove( array $data, $loadDefaults ) {
-               $item = $this->getRowInstance( $data, $loadDefaults );
-
-               $this->assertTrue( $item->save() );
-
-               $this->assertTrue( $item->hasIdField() );
-               $this->assertTrue( is_integer( $item->getId() ) );
-
-               $id = $item->getId();
-
-               $this->assertTrue( $item->save() );
-
-               $this->assertEquals( $id, $item->getId() );
-
-               $this->verifyFields( $item, $data );
-
-               $this->assertTrue( $item->remove() );
-
-               $this->assertFalse( $item->hasIdField() );
-
-               $this->assertTrue( $item->save() );
-
-               $this->verifyFields( $item, $data );
-
-               $this->assertTrue( $item->remove() );
-
-               $this->assertFalse( $item->hasIdField() );
-
-               $this->verifyFields( $item, $data );
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        */
-       public function testSetField( IORMRow $item ) {
-               foreach ( $this->getMockFields() as $name => $value ) {
-                       $item->setField( $name, $value );
-                       $this->assertEquals( $value, $item->getField( $name ) );
-               }
-       }
-
-       /**
-        * @since 1.20
-        * @param array $expected
-        * @param IORMRow $item
-        */
-       protected function assertFieldValues( array $expected, IORMRow $item ) {
-               foreach ( $expected as $name => $type ) {
-                       if ( $name !== 'id' ) {
-                               $this->assertEquals( $expected[$name], $item->getField( $name ) );
-                       }
-               }
-       }
-
-       /**
-        * @dataProvider instanceProvider
-        */
-       public function testSetFields( IORMRow $item ) {
-               $originalValues = $item->getFields();
-
-               $item->setFields( array(), false );
-
-               foreach ( $item->getTable()->getFields() as $name => $type ) {
-                       $originalHas = array_key_exists( $name, $originalValues );
-                       $newHas = $item->hasField( $name );
-
-                       $this->assertEquals( $originalHas, $newHas );
-
-                       if ( $originalHas && $newHas ) {
-                               $this->assertEquals( $originalValues[$name], $item->getField( $name ) );
-                       }
-               }
-
-               $mockFields = $this->getMockFields();
-
-               $item->setFields( $mockFields, false );
-
-               $this->assertFieldValues( $originalValues, $item );
-
-               $item->setFields( $mockFields, true );
-
-               $this->assertFieldValues( $mockFields, $item );
-       }
-
-       // TODO: test all of the methods!
-
-}
diff --git a/tests/phpunit/includes/db/ORMTableTest.php b/tests/phpunit/includes/db/ORMTableTest.php
deleted file mode 100644 (file)
index 764560d..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-/**
- * Abstract class to construct tests for ORMTable deriving classes.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @since 1.21
- *
- * @ingroup Test
- *
- * @group ORM
- * @group Database
- *
- * @covers PageORMTableForTesting
- *
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- * @author Daniel Kinzler
- */
-
-class ORMTableTest extends MediaWikiTestCase {
-
-       /**
-        * @since 1.21
-        * @return string
-        */
-       protected function getTableClass() {
-               return 'PageORMTableForTesting';
-       }
-
-       /**
-        * @since 1.21
-        * @return IORMTable
-        */
-       public function getTable() {
-               $class = $this->getTableClass();
-
-               return $class::singleton();
-       }
-
-       /**
-        * @since 1.21
-        * @return string
-        */
-       public function getRowClass() {
-               return $this->getTable()->getRowClass();
-       }
-
-       /**
-        * @since 1.21
-        */
-       public function testSingleton() {
-               $class = $this->getTableClass();
-
-               $this->assertInstanceOf( $class, $class::singleton() );
-               $this->assertTrue( $class::singleton() === $class::singleton() );
-       }
-}
-
-/**
- * Dummy ORM table for testing, reading Title objects from the page table.
- *
- * @since 1.21
- */
-
-class PageORMTableForTesting extends ORMTable {
-
-       public function __construct() {
-               $this->fieldPrefix = 'page_';
-       }
-
-       /**
-        * @see ORMTable::getName
-        *
-        * @return string
-        */
-       public function getName() {
-               return 'page';
-       }
-
-       /**
-        * @see ORMTable::getRowClass
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return 'Title';
-       }
-
-       /**
-        * @see ORMTable::newRow
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $data, $loadDefaults = false ) {
-               return Title::makeTitle( $data['namespace'], $data['title'] );
-       }
-
-       /**
-        * @see ORMTable::getFields
-        *
-        * @return array
-        */
-       public function getFields() {
-               return array(
-                       'id' => 'int',
-                       'namespace' => 'int',
-                       'title' => 'str',
-               );
-       }
-}
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
deleted file mode 100644 (file)
index 04bb9f3..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-
-/**
- * Tests for the TestORMRow class.
- * TestORMRow is a dummy class to be able to test the abstract ORMRow class.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Test
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-/**
- * The database group has as a side effect that temporal database tables are created. This makes
- * it possible to test without poisoning a production database.
- *
- * Some of the tests takes more time, and needs therefor longer time before they can be aborted
- * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
- * that hold the first tests in a pending state awaiting access to the database.
- *
- * @since 1.20
- *
- * @group ORM
- * @group Database
- * @group medium
- * @covers TestORMRow
- */
-class TestORMRowTest extends ORMRowTest {
-
-       /**
-        * @since 1.20
-        * @return string
-        */
-       protected function getRowClass() {
-               return 'TestORMRow';
-       }
-
-       /**
-        * @since 1.20
-        * @return IORMTable
-        */
-       protected function getTableInstance() {
-               return TestORMTable::singleton();
-       }
-
-       protected function setUp() {
-               parent::setUp();
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
-               $isPostgres = $GLOBALS['wgDBtype'] === 'postgres';
-
-               $idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
-               $primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
-
-               if ( $isPostgres ) {
-                       $dbw->query(
-                               'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . "(
-                                       test_id serial PRIMARY KEY,
-                                       test_name TEXT NOT NULL DEFAULT '',
-                                       test_age INTEGER NOT NULL DEFAULT 0,
-                                       test_height REAL NOT NULL DEFAULT 0,
-                                       test_awesome INTEGER NOT NULL DEFAULT 0,
-                                       test_stuff BYTEA,
-                                       test_moarstuff BYTEA,
-                                       test_time TIMESTAMPTZ
-                                       );",
-                                       __METHOD__
-                               );
-               } else {
-                       $dbw->query(
-                               'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
-                                       test_id                    ' . $idField . '        NOT NULL ' . $primaryKey . ',
-                                       test_name                  VARCHAR(255)        NOT NULL,
-                                       test_age                   TINYINT unsigned    NOT NULL,
-                                       test_height                FLOAT               NOT NULL,
-                                       test_awesome               TINYINT unsigned    NOT NULL,
-                                       test_stuff                 BLOB                NOT NULL,
-                                       test_moarstuff             BLOB                NOT NULL,
-                                       test_time                  varbinary(14)       NOT NULL
-                               );',
-                               __METHOD__
-                       );
-               }
-       }
-
-       protected function tearDown() {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->dropTable( 'orm_test', __METHOD__ );
-
-               parent::tearDown();
-       }
-
-       public function constructorTestProvider() {
-               $dbw = wfGetDB( DB_MASTER );
-               return array(
-                       array(
-                               array(
-                                       'name' => 'Foobar',
-                                       'time' => $dbw->timestamp( '20120101020202' ),
-                                       'age' => 42,
-                                       'height' => 9000.1,
-                                       'awesome' => true,
-                                       'stuff' => array( 13, 11, 7, 5, 3, 2 ),
-                                       'moarstuff' => (object)array( 'foo' => 'bar', 'bar' => array( 4, 2 ), 'baz' => true )
-                               ),
-                               true
-                       ),
-               );
-       }
-
-       /**
-        * @since 1.21
-        * @return array
-        */
-       protected function getMockValues() {
-               return array(
-                       'id' => 1,
-                       'str' => 'foobar4645645',
-                       'int' => 42,
-                       'float' => 4.2,
-                       'bool' => '',
-                       'array' => array( 42, 'foobar' ),
-                       'blob' => new stdClass()
-               );
-       }
-}
-
-class TestORMRow extends ORMRow {
-}
-
-class TestORMTable extends ORMTable {
-
-       public function __construct() {
-               $this->fieldPrefix = 'test_';
-       }
-
-       /**
-        * Returns the name of the database table objects of this type are stored in.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getName() {
-               return 'orm_test';
-       }
-
-       /**
-        * Returns the name of a IORMRow implementing class that
-        * represents single rows in this table.
-        *
-        * @since 1.20
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return 'TestORMRow';
-       }
-
-       /**
-        * Returns an array with the fields and their types this object contains.
-        * This corresponds directly to the fields in the database, without prefix.
-        *
-        * field name => type
-        *
-        * Allowed types:
-        * * id
-        * * str
-        * * int
-        * * float
-        * * bool
-        * * array
-        * * blob
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getFields() {
-               return array(
-                       'id' => 'id',
-                       'name' => 'str',
-                       'age' => 'int',
-                       'height' => 'float',
-                       'awesome' => 'bool',
-                       'stuff' => 'array',
-                       'moarstuff' => 'blob',
-                       'time' => 'str', // TS_MW
-               );
-       }
-}
index 7280a97..3497c88 100644 (file)
@@ -29,7 +29,7 @@ class MWDebugTest extends MediaWikiTestCase {
                        array( array(
                                'msg' => 'logging a string',
                                'type' => 'log',
-                               'caller' => __METHOD__,
+                               'caller' => 'MWDebugTest->testAddLog',
                        ) ),
                        MWDebug::getLog()
                );
index bbd196d..25ee5ec 100644 (file)
@@ -19,7 +19,8 @@ class LinksUpdateTest extends MediaWikiTestCase {
                                'externallinks',
                                'imagelinks',
                                'templatelinks',
-                               'iwlinks'
+                               'iwlinks',
+                               'recentchanges',
                        )
                );
        }
@@ -39,6 +40,13 @@ class LinksUpdateTest extends MediaWikiTestCase {
                                'iw_wikiid' => 'linksupdatetest',
                        )
                );
+               $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+       }
+
+       public function addDBData() {
+               $this->insertPage( 'Testing' );
+               $this->insertPage( 'Some_other_page' );
+               $this->insertPage( 'Template:TestingTemplate' );
        }
 
        protected function makeTitleAndParserOutput( $name, $id ) {
@@ -133,6 +141,61 @@ class LinksUpdateTest extends MediaWikiTestCase {
                ) );
        }
 
+       public function testOnAddingAndRemovingCategory_recentChangesRowIsAdded() {
+               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
+               $title = Title::newFromText( 'Testing' );
+               $wikiPage = new WikiPage( $title );
+               $wikiPage->doEditContent( new WikitextContent( '[[Category:Foo]]' ), 'added category' );
+
+               $this->assertRecentChangeByCategorization(
+                       $title,
+                       $wikiPage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Category:Foo' ),
+                       array( array( 'Foo', '[[:Testing]] added to category' ) )
+               );
+
+               $wikiPage->doEditContent( new WikitextContent( '[[Category:Bar]]' ), 'added category' );
+               $this->assertRecentChangeByCategorization(
+                       $title,
+                       $wikiPage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Category:Foo' ),
+                       array(
+                               array( 'Foo', '[[:Testing]] added to category' ),
+                               array( 'Foo', '[[:Testing]] removed from category' ),
+                       )
+               );
+
+               $this->assertRecentChangeByCategorization(
+                       $title,
+                       $wikiPage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Category:Bar' ),
+                       array(
+                               array( 'Bar', '[[:Testing]] added to category' ),
+                       )
+               );
+       }
+
+       public function testOnAddingAndRemovingCategoryToTemplates_embeddingPagesAreIgnored() {
+               $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
+
+               $templateTitle = Title::newFromText( 'Template:TestingTemplate' );
+               $templatePage = new WikiPage( $templateTitle );
+
+               $wikiPage = new WikiPage( Title::newFromText( 'Testing' ) );
+               $wikiPage->doEditContent( new WikitextContent( '{{TestingTemplate}}' ), 'added template' );
+               $otherWikiPage = new WikiPage( Title::newFromText( 'Some_other_page' ) );
+               $otherWikiPage->doEditContent( new WikitextContent( '{{TestingTemplate}}' ), 'added template' );
+               $templatePage->doEditContent( new WikitextContent( '[[Category:Foo]]' ), 'added category' );
+
+               $this->assertRecentChangeByCategorization(
+                       $templateTitle,
+                       $templatePage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Foo' ),
+                       array( array( 'Foo', '[[:Template:TestingTemplate]] and 2 pages added to category' ) )
+               );
+       }
+
        /**
         * @covers ParserOutput::addInterwikiLink
         */
@@ -263,4 +326,26 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $this->assertSelect( $table, $fields, $condition, $expectedRows );
                return $update;
        }
+
+       protected function assertRecentChangeByCategorization(
+               Title $pageTitle, ParserOutput $parserOutput, Title $categoryTitle, $expectedRows
+       ) {
+               $update = new LinksUpdate( $pageTitle, $parserOutput );
+               $revision = Revision::newFromTitle( $pageTitle );
+               $update->setRevision( $revision );
+               $update->beginTransaction();
+               $update->doUpdate();
+               $update->commitTransaction();
+
+               $this->assertSelect(
+                       'recentchanges',
+                       'rc_title, rc_comment',
+                       array(
+                               'rc_type' => RC_CATEGORIZE,
+                               'rc_namespace' => NS_CATEGORY,
+                               'rc_title' => $categoryTitle->getDBkey()
+                       ),
+                       $expectedRows
+               );
+       }
 }
index 0d15b75..95c6092 100644 (file)
@@ -2397,6 +2397,42 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Scoped unlocking of files succeeded with OK status ($backendName)." );
        }
 
+       /**
+        * @dataProvider provider_testGetContentType
+        */
+       public function testGetContentType( $mimeCallback, $mimeFromString ) {
+               global $IP;
+
+               $be = TestingAccessWrapper::newFromObject( new MemoryFileBackend(
+                       array(
+                               'name' => 'testing',
+                               'class' => 'MemoryFileBackend',
+                               'wikiId' => 'meow',
+                               'mimeCallback' => $mimeCallback
+                       )
+               ) );
+
+               $dst = 'mwstore://testing/container/path/to/file_no_ext';
+               $src = "$IP/tests/phpunit/data/media/srgb.jpg";
+               $this->assertEquals( 'image/jpeg', $be->getContentType( $dst, null, $src ) );
+               $this->assertEquals(
+                       $mimeFromString ? 'image/jpeg' : 'unknown/unknown',
+                       $be->getContentType( $dst, file_get_contents( $src ), null ) );
+
+               $src = "$IP/tests/phpunit/data/media/Png-native-test.png";
+               $this->assertEquals( 'image/png', $be->getContentType( $dst, null, $src ) );
+               $this->assertEquals(
+                       $mimeFromString ? 'image/png' : 'unknown/unknown',
+                       $be->getContentType( $dst, file_get_contents( $src ), null ) );
+       }
+
+       public static function provider_testGetContentType() {
+               return array(
+                       array( null, false ),
+                       array( array( FileBackendGroup::singleton(), 'guessMimeInternal' ), true )
+               );
+       }
+
        public function testReadAffinity() {
                $be = TestingAccessWrapper::newFromObject(
                        new FileBackendMultiWrite( array(
@@ -2495,6 +2531,37 @@ class FileBackendTest extends MediaWikiTestCase {
                );
        }
 
+       public function testSanitizeOpHeaders() {
+               $be = TestingAccessWrapper::newFromObject( new MemoryFileBackend( array(
+                       'name' => 'localtesting',
+                       'wikiId' => wfWikiID()
+               ) ) );
+
+               $name = wfRandomString( 300 );
+
+               $input = array(
+                       'headers' => array(
+                               'content-Disposition' => FileBackend::makeContentDisposition( 'inline', $name ),
+                               'Content-dUration' => 25.6,
+                               'X-LONG-VALUE' => str_pad( '0', 300 ),
+                               'CONTENT-LENGTH' => 855055,
+                       )
+               );
+               $expected = array(
+                       'headers' => array(
+                               'content-disposition' => FileBackend::makeContentDisposition( 'inline', $name ),
+                               'content-duration' => 25.6,
+                               'content-length' => 855055
+                       )
+               );
+
+               MediaWiki\suppressWarnings();
+               $actual = $be->sanitizeOpHeaders( $input );
+               MediaWiki\restoreWarnings();
+
+               $this->assertEquals( $expected, $actual, "Header sanitized properly" );
+       }
+
        // helper function
        private function listToArray( $iter ) {
                return is_array( $iter ) ? $iter : iterator_to_array( $iter );
index 577dc3c..622fce2 100644 (file)
@@ -79,6 +79,35 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $this->assertInternalType( 'string', $obj->setterArgs[0] );
                $this->assertSame( 'unwrapped', $obj->setterArgs[0] );
        }
+
+       /**
+        * @covers ObjectFactory::constructClassInstance
+        * @dataProvider provideConstructClassInstance
+        */
+       public function testConstructClassInstance( $args ) {
+               $obj = ObjectFactory::constructClassInstance(
+                       'ObjectFactoryTestFixture', $args
+               );
+               $this->assertSame( $args, $obj->args );
+       }
+
+       public function provideConstructClassInstance() {
+               // These args go to 11. I thought about making 10 one louder, but 11!
+               return array(
+                       '0 args' => array( array() ),
+                       '1 args' => array( array( 1, ) ),
+                       '2 args' => array( array( 1, 2, ) ),
+                       '3 args' => array( array( 1, 2, 3, ) ),
+                       '4 args' => array( array( 1, 2, 3, 4, ) ),
+                       '5 args' => array( array( 1, 2, 3, 4, 5, ) ),
+                       '6 args' => array( array( 1, 2, 3, 4, 5, 6, ) ),
+                       '7 args' => array( array( 1, 2, 3, 4, 5, 6, 7, ) ),
+                       '8 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, ) ),
+                       '9 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, ) ),
+                       '10 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) ),
+                       '11 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) ),
+               );
+       }
 }
 
 class ObjectFactoryTestFixture {
diff --git a/tests/phpunit/includes/libs/RunningStatTest.php b/tests/phpunit/includes/libs/RunningStatTest.php
deleted file mode 100644 (file)
index 35a8e4f..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * PHP Unit tests for RunningStat class.
- * @covers RunningStat
- */
-class RunningStatTest extends PHPUnit_Framework_TestCase {
-
-       public $points = array(
-               49.7168, 74.3804,  7.0115, 96.5769, 34.9458,
-               36.9947, 33.8926, 89.0774, 23.7745, 73.5154,
-               86.1322, 53.2124, 16.2046, 73.5130, 10.4209,
-               42.7299, 49.3330, 47.0215, 34.9950, 18.2914,
-       );
-
-       /**
-        * Verify that the statistical moments and extrema computed by RunningStat
-        * match expected values.
-        * @covers RunningStat::push
-        * @covers RunningStat::count
-        * @covers RunningStat::getMean
-        * @covers RunningStat::getVariance
-        * @covers RunningStat::getStdDev
-        */
-       public function testRunningStatAccuracy() {
-               $rstat = new RunningStat();
-               foreach ( $this->points as $point ) {
-                       $rstat->push( $point );
-               }
-
-               $mean = array_sum( $this->points ) / count( $this->points );
-               $variance = array_sum( array_map( function ( $x ) use ( $mean ) {
-                       return pow( $mean - $x, 2 );
-               }, $this->points ) ) / ( count( $rstat ) - 1 );
-               $stddev = sqrt( $variance );
-
-               $this->assertEquals( count( $rstat ), count( $this->points ) );
-               $this->assertEquals( $rstat->min, min( $this->points ) );
-               $this->assertEquals( $rstat->max, max( $this->points ) );
-               $this->assertEquals( $rstat->getMean(), $mean );
-               $this->assertEquals( $rstat->getVariance(), $variance );
-               $this->assertEquals( $rstat->getStdDev(), $stddev );
-       }
-
-       /**
-        * When one RunningStat instance is merged into another, the state of the
-        * target RunningInstance should have the state that it would have had if
-        * all the data had been accumulated by it alone.
-        * @covers RunningStat::merge
-        * @covers RunningStat::count
-        */
-       public function testRunningStatMerge() {
-               $expected = new RunningStat();
-
-               foreach ( $this->points as $point ) {
-                       $expected->push( $point );
-               }
-
-               // Split the data into two sets
-               $sets = array_chunk( $this->points, floor( count( $this->points ) / 2 ) );
-
-               // Accumulate the first half into one RunningStat object
-               $first = new RunningStat();
-               foreach ( $sets[0] as $point ) {
-                       $first->push( $point );
-               }
-
-               // Accumulate the second half into another RunningStat object
-               $second = new RunningStat();
-               foreach ( $sets[1] as $point ) {
-                       $second->push( $point );
-               }
-
-               // Merge the second RunningStat object into the first
-               $first->merge( $second );
-
-               $this->assertEquals( count( $first ), count( $this->points ) );
-               $this->assertEquals( $first, $expected );
-       }
-}
diff --git a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
new file mode 100644 (file)
index 0000000..94b74cb
--- /dev/null
@@ -0,0 +1,243 @@
+<?php
+/**
+ * @author Matthias Mullie <mmullie@wikimedia.org>
+ * @group BagOStuff
+ */
+class BagOStuffTest extends MediaWikiTestCase {
+       /** @var BagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               // type defined through parameter
+               if ( $this->getCliArg( 'use-bagostuff' ) ) {
+                       $name = $this->getCliArg( 'use-bagostuff' );
+
+                       $this->cache = ObjectCache::newFromId( $name );
+               } else {
+                       // no type defined - use simple hash
+                       $this->cache = new HashBagOStuff;
+               }
+
+               $this->cache->delete( wfMemcKey( 'test' ) );
+       }
+
+       /**
+        * @covers BagOStuff::makeGlobalKey
+        * @covers BagOStuff::makeKeyInternal
+        */
+       public function testMakeKey() {
+               $cache = ObjectCache::newFromId( 'hash' );
+
+               $localKey = $cache->makeKey( 'first', 'second', 'third' );
+               $globalKey = $cache->makeGlobalKey( 'first', 'second', 'third' );
+
+               $this->assertStringMatchesFormat(
+                       '%Sfirst%Ssecond%Sthird%S',
+                       $localKey,
+                       'Local key interpolates parameters'
+               );
+
+               $this->assertStringMatchesFormat(
+                       'global%Sfirst%Ssecond%Sthird%S',
+                       $globalKey,
+                       'Global key interpolates parameters and contains global prefix'
+               );
+
+               $this->assertNotEquals(
+                       $localKey,
+                       $globalKey,
+                       'Local key and global key with same parameters should not be equal'
+               );
+
+               $this->assertNotEquals(
+                       $cache->makeKeyInternal( 'prefix', array( 'a', 'bc:', 'de' ) ),
+                       $cache->makeKeyInternal( 'prefix', array( 'a', 'bc', ':de' ) )
+               );
+       }
+
+       /**
+        * @covers BagOStuff::merge
+        * @covers BagOStuff::mergeViaLock
+        */
+       public function testMerge() {
+               $key = wfMemcKey( 'test' );
+
+               $usleep = 0;
+
+               /**
+                * Callback method: append "merged" to whatever is in cache.
+                *
+                * @param BagOStuff $cache
+                * @param string $key
+                * @param int $existingValue
+                * @use int $usleep
+                * @return int
+                */
+               $callback = function ( BagOStuff $cache, $key, $existingValue ) use ( &$usleep ) {
+                       // let's pretend this is an expensive callback to test concurrent merge attempts
+                       usleep( $usleep );
+
+                       if ( $existingValue === false ) {
+                               return 'merged';
+                       }
+
+                       return $existingValue . 'merged';
+               };
+
+               // merge on non-existing value
+               $merged = $this->cache->merge( $key, $callback, 0 );
+               $this->assertTrue( $merged );
+               $this->assertEquals( $this->cache->get( $key ), 'merged' );
+
+               // merge on existing value
+               $merged = $this->cache->merge( $key, $callback, 0 );
+               $this->assertTrue( $merged );
+               $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
+
+               /*
+                * Test concurrent merges by forking this process, if:
+                * - not manually called with --use-bagostuff
+                * - pcntl_fork is supported by the system
+                * - cache type will correctly support calls over forks
+                */
+               $fork = (bool)$this->getCliArg( 'use-bagostuff' );
+               $fork &= function_exists( 'pcntl_fork' );
+               $fork &= !$this->cache instanceof HashBagOStuff;
+               $fork &= !$this->cache instanceof EmptyBagOStuff;
+               $fork &= !$this->cache instanceof MultiWriteBagOStuff;
+               if ( $fork ) {
+                       // callback should take awhile now so that we can test concurrent merge attempts
+                       $pid = pcntl_fork();
+                       if ( $pid == -1 ) {
+                               // can't fork, ignore this test...
+                       } elseif ( $pid ) {
+                               // wait a little, making sure that the child process is calling merge
+                               usleep( 3000 );
+
+                               // attempt a merge - this should fail
+                               $merged = $this->cache->merge( $key, $callback, 0, 1 );
+
+                               // merge has failed because child process was merging (and we only attempted once)
+                               $this->assertFalse( $merged );
+
+                               // make sure the child's merge is completed and verify
+                               usleep( 3000 );
+                               $this->assertEquals( $this->cache->get( $key ), 'mergedmergedmerged' );
+                       } else {
+                               $this->cache->merge( $key, $callback, 0, 1 );
+
+                               // Note: I'm not even going to check if the merge worked, I'll
+                               // compare values in the parent process to test if this merge worked.
+                               // I'm just going to exit this child process, since I don't want the
+                               // child to output any test results (would be rather confusing to
+                               // have test output twice)
+                               exit;
+                       }
+               }
+       }
+
+       /**
+        * @covers BagOStuff::add
+        */
+       public function testAdd() {
+               $key = wfMemcKey( 'test' );
+               $this->assertTrue( $this->cache->add( $key, 'test' ) );
+       }
+
+       public function testGet() {
+               $value = array( 'this' => 'is', 'a' => 'test' );
+
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, $value );
+               $this->assertEquals( $this->cache->get( $key ), $value );
+       }
+
+       /**
+        * @covers BagOStuff::getWithSetCallback
+        */
+       public function testGetWithSetCallback() {
+               $key = wfMemcKey( 'test' );
+               $value = $this->cache->getWithSetCallback(
+                       $key,
+                       30,
+                       function () {
+                               return 'hello kitty';
+                       }
+               );
+
+               $this->assertEquals( 'hello kitty', $value );
+               $this->assertEquals( $value, $this->cache->get( $key ) );
+       }
+
+       /**
+        * @covers BagOStuff::incr
+        */
+       public function testIncr() {
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, 0 );
+               $this->cache->incr( $key );
+               $expectedValue = 1;
+               $actualValue = $this->cache->get( $key );
+               $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
+       }
+
+       /**
+        * @covers BagOStuff::getMulti
+        */
+       public function testGetMulti() {
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+               $value3 = array( 'testing a key that may be encoded when sent to cache backend' );
+               $value4 = array( 'another test where chars in key will be encoded' );
+
+               $key1 = wfMemcKey( 'test1' );
+               $key2 = wfMemcKey( 'test2' );
+               // internally, MemcachedBagOStuffs will encode to will-%25-encode
+               $key3 = wfMemcKey( 'will-%-encode' );
+               $key4 = wfMemcKey(
+                       'flowdb:flow_ref:wiki:by-source:v3:Parser\'s_"broken"_+_(page)_&_grill:testwiki:1:4.7'
+               );
+
+               $this->cache->add( $key1, $value1 );
+               $this->cache->add( $key2, $value2 );
+               $this->cache->add( $key3, $value3 );
+               $this->cache->add( $key4, $value4 );
+
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2, $key3 => $value3, $key4 => $value4 ),
+                       $this->cache->getMulti( array( $key1, $key2, $key3, $key4 ) )
+               );
+
+               // cleanup
+               $this->cache->delete( $key1 );
+               $this->cache->delete( $key2 );
+               $this->cache->delete( $key3 );
+               $this->cache->delete( $key4 );
+       }
+
+       /**
+        * @covers BagOStuff::getScopedLock
+        */
+       public function testGetScopedLock() {
+               $key = wfMemcKey( 'test' );
+               $value1 = $this->cache->getScopedLock( $key, 0 );
+               $value2 = $this->cache->getScopedLock( $key, 0 );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First call returned lock' );
+               $this->assertNull( $value2, 'Duplicate call returned no lock' );
+
+               unset( $value1 );
+
+               $value3 = $this->cache->getScopedLock( $key, 0 );
+               $this->assertType( 'ScopedCallback', $value3, 'Lock returned callback after release' );
+               unset( $value3 );
+
+               $value1 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+               $value2 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First reentrant call returned lock' );
+               $this->assertType( 'ScopedCallback', $value1, 'Second reentrant call returned lock' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
new file mode 100644 (file)
index 0000000..39b84e1
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @group BagOStuff
+ */
+class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
+
+       public function testDelete() {
+               $cache = new HashBagOStuff();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+                       $cache->delete( "key$i" );
+                       $this->assertEquals( false, $cache->get( "key$i" ) );
+               }
+       }
+
+       public function testClear() {
+               $cache = new HashBagOStuff();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+               }
+               $cache->clear();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $this->assertEquals( false, $cache->get( "key$i" ) );
+               }
+       }
+
+       public function testEvictionOrder() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 10 ) );
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+               }
+               for ( $i = 10; $i < 20; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+                       $this->assertEquals( false, $cache->get( "key" . $i - 10 ) );
+               }
+       }
+
+       public function testExpire() {
+               $cache = new HashBagOStuff();
+               $cacheInternal = TestingAccessWrapper::newFromObject( $cache );
+               $cache->set( 'foo', 1 );
+               $cache->set( 'bar', 1, 10 );
+               $cache->set( 'baz', 1, -10 );
+
+               $this->assertEquals( 0, $cacheInternal->bag['foo'][$cache::KEY_EXP], 'Indefinite' );
+               // 2 seconds tolerance
+               $this->assertEquals( time() + 10, $cacheInternal->bag['bar'][$cache::KEY_EXP], 'Future', 2 );
+               $this->assertEquals( time() - 10, $cacheInternal->bag['baz'][$cache::KEY_EXP], 'Past', 2 );
+
+               $this->assertEquals( 1, $cache->get( 'bar' ), 'Key not expired' );
+               $this->assertEquals( false, $cache->get( 'baz' ), 'Key expired' );
+       }
+
+       public function testKeyOrder() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 3 ) );
+
+               foreach ( array( 'foo', 'bar', 'baz' ) as $key ) {
+                       $cache->set( $key, 1 );
+               }
+
+               // Set existing key
+               $cache->set( 'foo', 1 );
+
+               // Add a 4th key (beyond the allowed maximum)
+               $cache->set( 'quux', 1 );
+
+               // Foo's life should have been extended over Bar
+               foreach ( array( 'foo', 'baz', 'quux' ) as $key ) {
+                       $this->assertEquals( 1, $cache->get( $key ), "Kept $key" );
+               }
+               $this->assertEquals( false, $cache->get( 'bar' ), 'Evicted bar' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php
new file mode 100644 (file)
index 0000000..1d8f43a
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * @group Database
+ */
+class MultiWriteBagOStuffTest extends MediaWikiTestCase {
+       /** @var HashBagOStuff */
+       private $cache1;
+       /** @var HashBagOStuff */
+       private $cache2;
+       /** @var MultiWriteBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->cache1 = new HashBagOStuff();
+               $this->cache2 = new HashBagOStuff();
+               $this->cache = new MultiWriteBagOStuff( array(
+                       'caches' => array( $this->cache1, $this->cache2 ),
+                       'replication' => 'async',
+                       'asyncHandler' => 'DeferredUpdates::addCallableUpdate'
+               ) );
+       }
+
+       public function testSetImmediate() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+       }
+
+       public function testSyncMerge() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $func = function () use ( $value ) {
+                       return $value;
+               };
+
+               // XXX: DeferredUpdates bound to transactions in CLI mode
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+               $this->cache->merge( $key, $func );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Not yet set in tier 2
+               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
+
+               $dbw->commit();
+
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+
+               $key = wfRandomString();
+
+               $dbw->begin();
+               $this->cache->merge( $key, $func, 0, 1, BagOStuff::WRITE_SYNC );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Also set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+
+               $dbw->commit();
+       }
+
+       public function testSetDelayed() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               // XXX: DeferredUpdates bound to transactions in CLI mode
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+               $this->cache->set( $key, $value );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Not yet set in tier 2
+               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
+
+               $dbw->commit();
+
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php
new file mode 100644 (file)
index 0000000..a419f5b
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+class ReplicatedBagOStuffTest extends MediaWikiTestCase {
+       /** @var HashBagOStuff */
+       private $writeCache;
+       /** @var HashBagOStuff */
+       private $readCache;
+       /** @var ReplicatedBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->writeCache = new HashBagOStuff();
+               $this->readCache = new HashBagOStuff();
+               $this->cache = new ReplicatedBagOStuff( array(
+                       'writeFactory' => $this->writeCache,
+                       'readFactory' => $this->readCache,
+               ) );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::set
+        */
+       public function testSet() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               // Write to master.
+               $this->assertEquals( $this->writeCache->get( $key ), $value );
+               // Don't write to slave. Replication is deferred to backend.
+               $this->assertEquals( $this->readCache->get( $key ), false );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::get
+        */
+       public function testGet() {
+               $key = wfRandomString();
+
+               $write = wfRandomString();
+               $this->writeCache->set( $key, $write );
+               $read = wfRandomString();
+               $this->readCache->set( $key, $read );
+
+               // Read from slave.
+               $this->assertEquals( $this->cache->get( $key ), $read );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::get
+        */
+       public function testGetAbsent() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->writeCache->set( $key, $value );
+
+               // Don't read from master. No failover if value is absent.
+               $this->assertEquals( $this->cache->get( $key ), false );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
new file mode 100644 (file)
index 0000000..a1fdd91
--- /dev/null
@@ -0,0 +1,373 @@
+<?php
+
+class WANObjectCacheTest extends MediaWikiTestCase {
+       /** @var WANObjectCache */
+       private $cache;
+       /**@var BagOStuff */
+       private $internalCache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               if ( $this->getCliArg( 'use-wanobjectcache' ) ) {
+                       $name = $this->getCliArg( 'use-wanobjectcache' );
+
+                       $this->cache = ObjectCache::getWANInstance( $name );
+               } else {
+                       $this->cache = new WANObjectCache( array(
+                               'cache' => new HashBagOStuff(),
+                               'pool' => 'testcache-hash',
+                               'relayer' => new EventRelayerNull( array() )
+                       ) );
+               }
+
+               $wanCache = TestingAccessWrapper::newFromObject( $this->cache );
+               $this->internalCache = $wanCache->cache;
+       }
+
+       /**
+        * @dataProvider provider_testSetAndGet
+        * @covers WANObjectCache::set()
+        * @covers WANObjectCache::get()
+        * @param mixed $value
+        * @param integer $ttl
+        */
+       public function testSetAndGet( $value, $ttl ) {
+               $key = wfRandomString();
+               $this->cache->set( $key, $value, $ttl );
+
+               $curTTL = null;
+               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
+               if ( is_infinite( $ttl ) || $ttl == 0 ) {
+                       $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
+               } else {
+                       $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
+                       $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
+               }
+       }
+
+       public static function provider_testSetAndGet() {
+               return array(
+                       array( 14141, 3 ),
+                       array( 3535.666, 3 ),
+                       array( array(), 3 ),
+                       array( null, 3 ),
+                       array( '0', 3 ),
+                       array( (object)array( 'meow' ), 3 ),
+                       array( INF, 3 ),
+                       array( '', 3 ),
+                       array( 'pizzacat', INF ),
+               );
+       }
+
+       public function testGetNotExists() {
+               $key = wfRandomString();
+               $curTTL = null;
+               $value = $this->cache->get( $key, $curTTL );
+
+               $this->assertFalse( $value, "Non-existing key has false value" );
+               $this->assertNull( $curTTL, "Non-existing key has null current TTL" );
+       }
+
+       public function testSetOver() {
+               $key = wfRandomString();
+               for ( $i = 0; $i < 3; ++$i ) {
+                       $value = wfRandomString();
+                       $this->cache->set( $key, $value, 3 );
+
+                       $this->assertEquals( $this->cache->get( $key ), $value );
+               }
+       }
+
+       public function testStaleSet() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value, 3, array( 'since' => microtime( true ) - 30 ) );
+
+               $this->assertFalse( $this->cache->get( $key ), "Stale set() value ignored" );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testGetWithSetCallback() {
+               $cache = $this->cache;
+
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+
+               $wasSet = 0;
+               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
+                       ++$wasSet;
+                       $ttl = 20; // override with another value
+                       return $value;
+               };
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated" );
+
+               $curTTL = null;
+               $cache->get( $key, $curTTL );
+               $this->assertLessThanOrEqual( 20, $curTTL, 'Current TTL between 19-20 (overriden)' );
+               $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func, array(
+                       'lowTTL' => 0,
+                       'lockTSE' => 5,
+               ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func,
+                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
+
+               $priorTime = microtime( true );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func,
+                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertLessThanOrEqual( $priorTime, $t2, 'Check keys did not change again' );
+
+               $curTTL = null;
+               $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
+
+               $wasSet = 0;
+               $key = wfRandomString();
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $cache->delete( $key );
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value still returned after deleted" );
+               $this->assertEquals( 1, $wasSet, "Value process cached while deleted" );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testLockTSE() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $calls = 0;
+               $func = function() use ( &$calls, $value ) {
+                       ++$calls;
+                       return $value;
+               };
+
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Value was populated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Callback was not used' );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testLockTSESlow() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $calls = 0;
+               $func = function( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value ) {
+                       ++$calls;
+                       $setOpts['since'] = microtime( true ) - 10;
+                       return $value;
+               };
+
+               // Value should be marked as stale due to snapshot lag
+               $curTTL = null;
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( $value, $cache->get( $key, $curTTL ), 'Value was populated' );
+               $this->assertLessThan( 0, $curTTL, 'Value has negative curTTL' );
+               $this->assertEquals( 1, $calls, 'Value was generated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Callback was not used' );
+       }
+
+       /**
+        * @covers WANObjectCache::getMulti()
+        */
+       public function testGetMulti() {
+               $cache = $this->cache;
+
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+
+               $key1 = wfRandomString();
+               $key2 = wfRandomString();
+               $key3 = wfRandomString();
+
+               $cache->set( $key1, $value1, 5 );
+               $cache->set( $key2, $value2, 10 );
+
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs )
+               );
+
+               $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
+               $this->assertGreaterThan( 0, $curTTLs[$key1], "Key 1 has current TTL > 0" );
+               $this->assertGreaterThan( 0, $curTTLs[$key2], "Key 2 has current TTL > 0" );
+
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
+                       'Result array populated'
+               );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array populated even with new check keys"
+               );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key 1 generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check key 2 generated on miss' );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs array set" );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
+
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array still populated even with new check keys"
+               );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs still array set" );
+               $this->assertLessThan( 0, $curTTLs[$key1], 'Key 1 has negative current TTL' );
+               $this->assertLessThan( 0, $curTTLs[$key2], 'Key 2 has negative current TTL' );
+       }
+
+       /**
+        * @covers WANObjectCache::delete()
+        */
+       public function testDelete() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertEquals( $value, $v, "Key was created with value" );
+               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
+
+               $this->cache->delete( $key );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertFalse( $v, "Deleted key has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key has current TTL < 0" );
+
+               $this->cache->set( $key, $value . 'more' );
+               $this->assertFalse( $v, "Deleted key is tombstoned and has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
+       }
+
+       /**
+        * @covers WANObjectCache::touchCheckKey()
+        * @covers WANObjectCache::resetCheckKey()
+        * @covers WANObjectCache::getCheckKeyTime()
+        */
+       public function testTouchKeys() {
+               $key = wfRandomString();
+
+               $priorTime = microtime( true );
+               usleep( 100 );
+               $t0 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
+
+               $priorTime = microtime( true );
+               usleep( 100 );
+               $this->cache->touchCheckKey( $key );
+               $t1 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
+
+               $t2 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t1, $t2, 'Check key time did not change' );
+
+               usleep( 100 );
+               $this->cache->touchCheckKey( $key );
+               $t3 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
+
+               $t4 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t3, $t4, 'Check key time did not change' );
+
+               usleep( 100 );
+               $this->cache->resetCheckKey( $key );
+               $t5 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
+
+               $t6 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t5, $t6, 'Check key time did not change' );
+       }
+
+       public function testSetWithLag() {
+               $value = 1;
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 300, 'since' => microtime( true ) );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( $value, $this->cache->get( $key ), "Rep-lagged value written." );
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 0, 'since' => microtime( true ) - 300 );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Trx-lagged value not written." );
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 5, 'since' => microtime( true ) - 5 );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Lagged value not written." );
+       }
+
+       public function testWritePending() {
+               $value = 1;
+
+               $key = wfRandomString();
+               $opts = array( 'pending' => true );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Pending value not written." );
+       }
+}
diff --git a/tests/phpunit/includes/objectcache/BagOStuffTest.php b/tests/phpunit/includes/objectcache/BagOStuffTest.php
deleted file mode 100644 (file)
index b9fe490..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-<?php
-/**
- * @author Matthias Mullie <mmullie@wikimedia.org>
- * @group BagOStuff
- */
-class BagOStuffTest extends MediaWikiTestCase {
-       /** @var BagOStuff */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               // type defined through parameter
-               if ( $this->getCliArg( 'use-bagostuff' ) ) {
-                       $name = $this->getCliArg( 'use-bagostuff' );
-
-                       $this->cache = ObjectCache::newFromId( $name );
-               } else {
-                       // no type defined - use simple hash
-                       $this->cache = new HashBagOStuff;
-               }
-
-               $this->cache->delete( wfMemcKey( 'test' ) );
-       }
-
-       /**
-        * @covers BagOStuff::merge
-        * @covers BagOStuff::mergeViaLock
-        */
-       public function testMerge() {
-               $key = wfMemcKey( 'test' );
-
-               $usleep = 0;
-
-               /**
-                * Callback method: append "merged" to whatever is in cache.
-                *
-                * @param BagOStuff $cache
-                * @param string $key
-                * @param int $existingValue
-                * @use int $usleep
-                * @return int
-                */
-               $callback = function ( BagOStuff $cache, $key, $existingValue ) use ( &$usleep ) {
-                       // let's pretend this is an expensive callback to test concurrent merge attempts
-                       usleep( $usleep );
-
-                       if ( $existingValue === false ) {
-                               return 'merged';
-                       }
-
-                       return $existingValue . 'merged';
-               };
-
-               // merge on non-existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
-               $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'merged' );
-
-               // merge on existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
-               $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
-
-               /*
-                * Test concurrent merges by forking this process, if:
-                * - not manually called with --use-bagostuff
-                * - pcntl_fork is supported by the system
-                * - cache type will correctly support calls over forks
-                */
-               $fork = (bool)$this->getCliArg( 'use-bagostuff' );
-               $fork &= function_exists( 'pcntl_fork' );
-               $fork &= !$this->cache instanceof HashBagOStuff;
-               $fork &= !$this->cache instanceof EmptyBagOStuff;
-               $fork &= !$this->cache instanceof MultiWriteBagOStuff;
-               if ( $fork ) {
-                       // callback should take awhile now so that we can test concurrent merge attempts
-                       $pid = pcntl_fork();
-                       if ( $pid == -1 ) {
-                               // can't fork, ignore this test...
-                       } elseif ( $pid ) {
-                               // wait a little, making sure that the child process is calling merge
-                               usleep( 3000 );
-
-                               // attempt a merge - this should fail
-                               $merged = $this->cache->merge( $key, $callback, 0, 1 );
-
-                               // merge has failed because child process was merging (and we only attempted once)
-                               $this->assertFalse( $merged );
-
-                               // make sure the child's merge is completed and verify
-                               usleep( 3000 );
-                               $this->assertEquals( $this->cache->get( $key ), 'mergedmergedmerged' );
-                       } else {
-                               $this->cache->merge( $key, $callback, 0, 1 );
-
-                               // Note: I'm not even going to check if the merge worked, I'll
-                               // compare values in the parent process to test if this merge worked.
-                               // I'm just going to exit this child process, since I don't want the
-                               // child to output any test results (would be rather confusing to
-                               // have test output twice)
-                               exit;
-                       }
-               }
-       }
-
-       /**
-        * @covers BagOStuff::add
-        */
-       public function testAdd() {
-               $key = wfMemcKey( 'test' );
-               $this->assertTrue( $this->cache->add( $key, 'test' ) );
-       }
-
-       public function testGet() {
-               $value = array( 'this' => 'is', 'a' => 'test' );
-
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, $value );
-               $this->assertEquals( $this->cache->get( $key ), $value );
-       }
-
-       /**
-        * @covers BagOStuff::getWithSetCallback
-        */
-       public function testGetWithSetCallback() {
-               $key = wfMemcKey( 'test' );
-               $value = $this->cache->getWithSetCallback(
-                       $key,
-                       30,
-                       function () {
-                               return 'hello kitty';
-                       }
-               );
-
-               $this->assertEquals( 'hello kitty', $value );
-               $this->assertEquals( $value, $this->cache->get( $key ) );
-       }
-
-       /**
-        * @covers BagOStuff::incr
-        */
-       public function testIncr() {
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, 0 );
-               $this->cache->incr( $key );
-               $expectedValue = 1;
-               $actualValue = $this->cache->get( $key );
-               $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
-       }
-
-       /**
-        * @covers BagOStuff::getMulti
-        */
-       public function testGetMulti() {
-               $value1 = array( 'this' => 'is', 'a' => 'test' );
-               $value2 = array( 'this' => 'is', 'another' => 'test' );
-               $value3 = array( 'testing a key that may be encoded when sent to cache backend' );
-               $value4 = array( 'another test where chars in key will be encoded' );
-
-               $key1 = wfMemcKey( 'test1' );
-               $key2 = wfMemcKey( 'test2' );
-               // internally, MemcachedBagOStuffs will encode to will-%25-encode
-               $key3 = wfMemcKey( 'will-%-encode' );
-               $key4 = wfMemcKey(
-                       'flowdb:flow_ref:wiki:by-source:v3:Parser\'s_"broken"_+_(page)_&_grill:testwiki:1:4.7'
-               );
-
-               $this->cache->add( $key1, $value1 );
-               $this->cache->add( $key2, $value2 );
-               $this->cache->add( $key3, $value3 );
-               $this->cache->add( $key4, $value4 );
-
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2, $key3 => $value3, $key4 => $value4 ),
-                       $this->cache->getMulti( array( $key1, $key2, $key3, $key4 ) )
-               );
-
-               // cleanup
-               $this->cache->delete( $key1 );
-               $this->cache->delete( $key2 );
-               $this->cache->delete( $key3 );
-               $this->cache->delete( $key4 );
-       }
-
-       /**
-        * @covers BagOStuff::getScopedLock
-        */
-       public function testGetScopedLock() {
-               $key = wfMemcKey( 'test' );
-               $value1 = $this->cache->getScopedLock( $key, 0 );
-               $value2 = $this->cache->getScopedLock( $key, 0 );
-
-               $this->assertType( 'ScopedCallback', $value1, 'First call returned lock' );
-               $this->assertNull( $value2, 'Duplicate call returned no lock' );
-
-               unset( $value1 );
-
-               $value3 = $this->cache->getScopedLock( $key, 0 );
-               $this->assertType( 'ScopedCallback', $value3, 'Lock returned callback after release' );
-               unset( $value3 );
-
-               $value1 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
-               $value2 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
-
-               $this->assertType( 'ScopedCallback', $value1, 'First reentrant call returned lock' );
-               $this->assertType( 'ScopedCallback', $value1, 'Second reentrant call returned lock' );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php b/tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php
new file mode 100644 (file)
index 0000000..904ddbb
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+/**
+ * @group BagOStuff
+ */
+class MemcachedBagOStuffTest extends MediaWikiTestCase {
+       /** @var MemcachedBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->cache = new MemcachedBagOStuff( array( 'keyspace' => 'test' ) );
+       }
+
+       /**
+        * @covers MemcachedBagOStuff::makeKey
+        */
+       public function testKeyNormalization() {
+               $this->assertEquals(
+                       'test:vanilla',
+                       $this->cache->makeKey( 'vanilla' )
+               );
+
+               $this->assertEquals(
+                       'test:punctuation_marks_are_ok:!@$^&*()',
+                       $this->cache->makeKey( 'punctuation_marks_are_ok', '!@$^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:but_spaces:hashes%23:and%0Anewlines:are_not',
+                       $this->cache->makeKey( 'but spaces', 'hashes#', "and\nnewlines", 'are_not' )
+               );
+
+               $this->assertEquals(
+                       'test:this:key:contains:%F0%9D%95%9E%F0%9D%95%A6%F0%9D%95%9D%F0%9D%95%A5%F0%9' .
+                               'D%95%9A%F0%9D%95%93%F0%9D%95%AA%F0%9D%95%A5%F0%9D%95%96:characters',
+                       $this->cache->makeKey( 'this', 'key', 'contains', '𝕞𝕦𝕝𝕥𝕚𝕓𝕪𝕥𝕖', 'characters' )
+               );
+
+               $this->assertEquals(
+                       'test:this:key:contains:#c118f92685a635cb843039de50014c9c',
+                       $this->cache->makeKey( 'this', 'key', 'contains', '𝕥𝕠𝕠 𝕞𝕒𝕟𝕪 𝕞𝕦𝕝𝕥𝕚𝕓𝕪𝕥𝕖 𝕔𝕙𝕒𝕣𝕒𝕔𝕥𝕖𝕣𝕤' )
+               );
+
+               $this->assertEquals(
+                       'test:##dc89dcb43b28614da27660240af478b5',
+                       $this->cache->makeKey( '𝕖𝕧𝕖𝕟', '𝕚𝕗', '𝕨𝕖', '𝕄𝔻𝟝', '𝕖𝕒𝕔𝕙',
+                               '𝕒𝕣𝕘𝕦𝕞𝕖𝕟𝕥', '𝕥𝕙𝕚𝕤', '𝕜𝕖𝕪', '𝕨𝕠𝕦𝕝𝕕', '𝕤𝕥𝕚𝕝𝕝', '𝕓𝕖', '𝕥𝕠𝕠', '𝕝𝕠𝕟𝕘' )
+               );
+
+               $this->assertEquals(
+                       'test:%23%235820ad1d105aa4dc698585c39df73e19',
+                       $this->cache->makeKey( '##5820ad1d105aa4dc698585c39df73e19' )
+               );
+
+               $this->assertEquals(
+                       'test:percent_is_escaped:!@$%25^&*()',
+                       $this->cache->makeKey( 'percent_is_escaped', '!@$%^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:colon_is_escaped:!@$%3A^&*()',
+                       $this->cache->makeKey( 'colon_is_escaped', '!@$:^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:long_key_part_hashed:#0244f7b1811d982dd932dd7de01465ac',
+                       $this->cache->makeKey( 'long_key_part_hashed', str_repeat( 'y', 500 ) )
+               );
+       }
+
+       /**
+        * @dataProvider validKeyProvider
+        */
+       public function testValidateKeyEncoding( $key ) {
+               $this->assertSame( $key, $this->cache->validateKeyEncoding( $key ) );
+       }
+
+       public function validKeyProvider() {
+               return array(
+                       'empty' => array( '' ),
+                       'digits' => array( '09' ),
+                       'letters' => array( 'AZaz' ),
+                       'ASCII special characters' => array( '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' ),
+               );
+       }
+
+       /**
+        * @dataProvider invalidKeyProvider
+        */
+       public function testValidateKeyEncodingThrowsException( $key ) {
+               $this->setExpectedException( 'Exception' );
+               $this->cache->validateKeyEncoding( $key );
+       }
+
+       public function invalidKeyProvider() {
+               return array(
+                       array( "\x00" ),
+                       array( ' ' ),
+                       array( "\x1F" ),
+                       array( "\x7F" ),
+                       array( "\x80" ),
+                       array( "\xFF" ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/objectcache/MultiWriteBagOStuffTest.php b/tests/phpunit/includes/objectcache/MultiWriteBagOStuffTest.php
deleted file mode 100644 (file)
index 2b66181..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-class MultiWriteBagOStuffTest extends MediaWikiTestCase {
-       /** @var HashBagOStuff */
-       private $cache1;
-       /** @var HashBagOStuff */
-       private $cache2;
-       /** @var MultiWriteBagOStuff */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->cache1 = new HashBagOStuff();
-               $this->cache2 = new HashBagOStuff();
-               $this->cache = new MultiWriteBagOStuff( array(
-                       'caches' => array( $this->cache1, $this->cache2 ),
-                       'replication' => 'async'
-               ) );
-       }
-
-       public function testSetImmediate() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               // Set in tier 1
-               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
-               // Set in tier 2
-               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
-       }
-
-       public function testSetDelayed() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-
-               // XXX: DeferredUpdates bound to transactions in CLI mode
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin();
-               $this->cache->set( $key, $value );
-
-               // Set in tier 1
-               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
-               // Not yet set in tier 2
-               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
-
-               $dbw->commit();
-
-               // Set in tier 2
-               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php b/tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php
deleted file mode 100644 (file)
index a419f5b..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-class ReplicatedBagOStuffTest extends MediaWikiTestCase {
-       /** @var HashBagOStuff */
-       private $writeCache;
-       /** @var HashBagOStuff */
-       private $readCache;
-       /** @var ReplicatedBagOStuff */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->writeCache = new HashBagOStuff();
-               $this->readCache = new HashBagOStuff();
-               $this->cache = new ReplicatedBagOStuff( array(
-                       'writeFactory' => $this->writeCache,
-                       'readFactory' => $this->readCache,
-               ) );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::set
-        */
-       public function testSet() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               // Write to master.
-               $this->assertEquals( $this->writeCache->get( $key ), $value );
-               // Don't write to slave. Replication is deferred to backend.
-               $this->assertEquals( $this->readCache->get( $key ), false );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::get
-        */
-       public function testGet() {
-               $key = wfRandomString();
-
-               $write = wfRandomString();
-               $this->writeCache->set( $key, $write );
-               $read = wfRandomString();
-               $this->readCache->set( $key, $read );
-
-               // Read from slave.
-               $this->assertEquals( $this->cache->get( $key ), $read );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::get
-        */
-       public function testGetAbsent() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->writeCache->set( $key, $value );
-
-               // Don't read from master. No failover if value is absent.
-               $this->assertEquals( $this->cache->get( $key ), false );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/objectcache/WANObjectCacheTest.php
deleted file mode 100644 (file)
index 8981f2f..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-<?php
-
-class WANObjectCacheTest extends MediaWikiTestCase {
-       /** @var WANObjectCache */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               if ( $this->getCliArg( 'use-wanobjectcache' ) ) {
-                       $name = $this->getCliArg( 'use-wanobjectcache' );
-
-                       $this->cache = ObjectCache::getWANInstance( $name );
-               } else {
-                       $this->cache = new WANObjectCache( array(
-                               'cache' => new HashBagOStuff(),
-                               'pool' => 'testcache-hash',
-                               'relayer' => new EventRelayerNull( array() )
-                       ) );
-               }
-
-               $wanCache = TestingAccessWrapper::newFromObject( $this->cache );
-               $this->internalCache = $wanCache->cache;
-       }
-
-       /**
-        * @dataProvider provider_testSetAndGet
-        * @covers WANObjectCache::set()
-        * @covers WANObjectCache::get()
-        * @param mixed $value
-        * @param integer $ttl
-        */
-       public function testSetAndGet( $value, $ttl ) {
-               $key = wfRandomString();
-               $this->cache->set( $key, $value, $ttl );
-
-               $curTTL = null;
-               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
-               if ( is_infinite( $ttl ) || $ttl == 0 ) {
-                       $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
-               } else {
-                       $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
-                       $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
-               }
-       }
-
-       public static function provider_testSetAndGet() {
-               return array(
-                       array( 14141, 3 ),
-                       array( 3535.666, 3 ),
-                       array( array(), 3 ),
-                       array( null, 3 ),
-                       array( '0', 3 ),
-                       array( (object)array( 'meow' ), 3 ),
-                       array( INF, 3 ),
-                       array( '', 3 ),
-                       array( 'pizzacat', INF ),
-               );
-       }
-
-       public function testGetNotExists() {
-               $key = wfRandomString();
-               $curTTL = null;
-               $value = $this->cache->get( $key, $curTTL );
-
-               $this->assertFalse( $value, "Non-existing key has false value" );
-               $this->assertNull( $curTTL, "Non-existing key has null current TTL" );
-       }
-
-       public function testSetOver() {
-               $key = wfRandomString();
-               for ( $i = 0; $i < 3; ++$i ) {
-                       $value = wfRandomString();
-                       $this->cache->set( $key, $value, 3 );
-
-                       $this->assertEquals( $this->cache->get( $key ), $value );
-               }
-       }
-
-       public function testStaleSet() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value, 3, array( 'since' => microtime( true ) - 30 ) );
-
-               $this->assertFalse( $this->cache->get( $key ), "Stale set() value ignored" );
-       }
-
-       /**
-        * @covers WANObjectCache::getWithSetCallback()
-        */
-       public function testGetWithSetCallback() {
-               $cache = $this->cache;
-
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $cKey1 = wfRandomString();
-               $cKey2 = wfRandomString();
-
-               $wasSet = 0;
-               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
-                       ++$wasSet;
-                       $ttl = 20; // override with another value
-                       return $value;
-               };
-
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 1, $wasSet, "Value regenerated" );
-
-               $curTTL = null;
-               $cache->get( $key, $curTTL );
-               $this->assertLessThanOrEqual( 20, $curTTL, 'Current TTL between 19-20 (overriden)' );
-               $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
-
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array(
-                       'lowTTL' => 0,
-                       'lockTSE' => 5,
-               ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
-
-               $priorTime = microtime( true );
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertLessThanOrEqual( $priorTime, $t2, 'Check keys did not change again' );
-
-               $curTTL = null;
-               $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
-
-               $wasSet = 0;
-               $key = wfRandomString();
-               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'pcTTL' => 5 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $cache->delete( $key );
-               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'pcTTL' => 5 ) );
-               $this->assertEquals( $value, $v, "Value still returned after deleted" );
-               $this->assertEquals( 1, $wasSet, "Value process cached while deleted" );
-       }
-
-       /**
-        * @covers WANObjectCache::getWithSetCallback()
-        */
-       public function testLockTSE() {
-               $cache = $this->cache;
-               $key = wfRandomString();
-               $value = wfRandomString();
-
-               $calls = 0;
-               $func = function() use ( &$calls, $value ) {
-                       ++$calls;
-                       return $value;
-               };
-
-               $cache->delete( $key );
-               $ret = $cache->getWithSetCallback( $key, 30, $func, array(), array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $value, $ret );
-               $this->assertEquals( 1, $calls, 'Value was populated' );
-
-               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
-               $this->internalCache->lock( $key, 0 );
-               $ret = $cache->getWithSetCallback( $key, 30, $func, array(), array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $value, $ret );
-               $this->assertEquals( 1, $calls, 'Callback was not used' );
-       }
-
-       /**
-        * @covers WANObjectCache::getMulti()
-        */
-       public function testGetMulti() {
-               $cache = $this->cache;
-
-               $value1 = array( 'this' => 'is', 'a' => 'test' );
-               $value2 = array( 'this' => 'is', 'another' => 'test' );
-
-               $key1 = wfRandomString();
-               $key2 = wfRandomString();
-               $key3 = wfRandomString();
-
-               $cache->set( $key1, $value1, 5 );
-               $cache->set( $key2, $value2, 10 );
-
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs )
-               );
-
-               $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
-               $this->assertGreaterThan( 0, $curTTLs[$key1], "Key 1 has current TTL > 0" );
-               $this->assertGreaterThan( 0, $curTTLs[$key2], "Key 2 has current TTL > 0" );
-
-               $cKey1 = wfRandomString();
-               $cKey2 = wfRandomString();
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
-                       'Result array populated'
-               );
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
-                       "Result array populated even with new check keys"
-               );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key 1 generated on miss' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check key 2 generated on miss' );
-               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs array set" );
-               $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
-               $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
-
-               usleep( 1 );
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
-                       "Result array still populated even with new check keys"
-               );
-               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs still array set" );
-               $this->assertLessThan( 0, $curTTLs[$key1], 'Key 1 has negative current TTL' );
-               $this->assertLessThan( 0, $curTTLs[$key2], 'Key 2 has negative current TTL' );
-       }
-
-       /**
-        * @covers WANObjectCache::delete()
-        */
-       public function testDelete() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               $curTTL = null;
-               $v = $this->cache->get( $key, $curTTL );
-               $this->assertEquals( $value, $v, "Key was created with value" );
-               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
-
-               $this->cache->delete( $key );
-
-               $curTTL = null;
-               $v = $this->cache->get( $key, $curTTL );
-               $this->assertFalse( $v, "Deleted key has false value" );
-               $this->assertLessThan( 0, $curTTL, "Deleted key has current TTL < 0" );
-
-               $this->cache->set( $key, $value . 'more' );
-               $this->assertFalse( $v, "Deleted key is tombstoned and has false value" );
-               $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
-       }
-
-       /**
-        * @covers WANObjectCache::touchCheckKey()
-        * @covers WANObjectCache::resetCheckKey()
-        * @covers WANObjectCache::getCheckKeyTime()
-        */
-       public function testTouchKeys() {
-               $key = wfRandomString();
-
-               $priorTime = microtime( true );
-               usleep( 100 );
-               $t0 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
-
-               $priorTime = microtime( true );
-               usleep( 100 );
-               $this->cache->touchCheckKey( $key );
-               $t1 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
-
-               $t2 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t1, $t2, 'Check key time did not change' );
-
-               usleep( 100 );
-               $this->cache->touchCheckKey( $key );
-               $t3 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
-
-               $t4 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t3, $t4, 'Check key time did not change' );
-
-               usleep( 100 );
-               $this->cache->resetCheckKey( $key );
-               $t5 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
-
-               $t6 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t5, $t6, 'Check key time did not change' );
-       }
-}
index 145698c..f700348 100644 (file)
@@ -4,6 +4,7 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
        /**
         * @covers ResourceLoaderModule::getVersionHash
+        * @group Broken
         */
        public function testGetVersionHash() {
                $context = $this->getResourceLoaderContext();
index 0a6336f..384b000 100644 (file)
  */
 class SpecialRecentchangesTest extends MediaWikiTestCase {
 
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgRCWatchCategoryMembership', true );
+       }
+
        /**
         * @var SpecialRecentChanges
         */
@@ -50,7 +55,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => "rc_namespace = '0'",
+                               0 => "rc_type != '6'",
+                               1 => "rc_namespace = '0'",
                        ),
                        array(
                                'namespace' => NS_MAIN,
@@ -63,7 +69,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
+                               0 => "rc_type != '6'",
+                               1 => sprintf( "rc_namespace != '%s'", NS_MAIN ),
                        ),
                        array(
                                'namespace' => NS_MAIN,
@@ -81,7 +88,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
+                               0 => "rc_type != '6'",
+                               1 => sprintf( "(rc_namespace = '%s' OR rc_namespace = '%s')", $ns1, $ns2 ),
                        ),
                        array(
                                'namespace' => $ns1,
@@ -99,7 +107,8 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                $this->assertConditions(
                        array( # expected
                                'rc_bot' => 0,
-                               0 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
+                               0 => "rc_type != '6'",
+                               1 => sprintf( "(rc_namespace != '%s' AND rc_namespace != '%s')", $ns1, $ns2 ),
                        ),
                        array(
                                'namespace' => $ns1,
index 4fca002..77c3c02 100644 (file)
@@ -261,6 +261,16 @@ class LanguageTest extends LanguageClassesTestCase {
                        $this->getLang()->truncate( "1234567890", 5, 'XXX', false ),
                        'truncate without adjustment'
                );
+               $this->assertEquals(
+                       "泰乐菌...",
+                       $this->getLang()->truncate( "泰乐菌素123456789", 11, '...', false ),
+                       'truncate does not chop Unicode characters in half'
+               );
+               $this->assertEquals(
+                       "\n泰乐菌...",
+                       $this->getLang()->truncate( "\n泰乐菌素123456789", 12, '...', false ),
+                       'truncate does not chop Unicode characters in half if there is a preceding newline'
+               );
        }
 
        /**
index 8c76397..c846c06 100644 (file)
@@ -102,7 +102,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                // expectOutput[...] functions. However, the PHPUnit shipped prediactes
                // do not allow to check /each/ line of the output using /readable/ REs.
                // So we ...
-               //
+
                // 1. ... add a dummy output checking to make PHPUnit not complain
                //    about unchecked test output
                $this->expectOutputRegex( '//' );
index 454e9c1..5c6a6cd 100644 (file)
@@ -4,7 +4,6 @@
 // instead of the MaintenanceFixup hack below. However, we cannot do
 // without changing the visibility and without working around hacks in
 // Maintenance.php
-//
 // For the same reason, we cannot just use FakeMaintenance.
 
 /**
index c216864..f5dd98b 100644 (file)
@@ -301,7 +301,6 @@ class TextPassDumperDatabaseTest extends DumpTestCase {
 
                // The dump (hopefully) did take long enough to produce more than one
                // checkpoint file.
-               //
                // We now check all the checkpoint files for validity.
 
                $files = scandir( $nameOutputDir );
index 0cb0cdb..8b6221b 100644 (file)
@@ -288,17 +288,18 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpEnd();
        }
 
+       /**
+        * xmldumps-backup typically performs a single dump that that writes
+        * out three files
+        * - gzipped stubs of everything (meta-history)
+        * - gzipped stubs of latest revisions of all pages (meta-current)
+        * - gzipped stubs of latest revisions of all pages of namespage 0
+        *   (articles)
+        *
+        * We reproduce such a setup with our mini fixture, although we omit
+        * chunks, and all the other gimmicks of xmldumps-backup.
+        */
        function testXmlDumpsBackupUseCase() {
-               // xmldumps-backup typically performs a single dump that that writes
-               // out three files
-               // * gzipped stubs of everything (meta-history)
-               // * gzipped stubs of latest revisions of all pages (meta-current)
-               // * gzipped stubs of latest revisions of all pages of namespage 0
-               //   (articles)
-               //
-               // We reproduce such a setup with our mini fixture, although we omit
-               // chunks, and all the other gimmicks of xmldumps-backup.
-               //
                $this->checkHasGzip();
 
                $fnameMetaHistory = $this->getNewTempFile();
index 49b91c3..aaa7751 100755 (executable)
@@ -113,6 +113,11 @@ class PHPUnitMaintClass extends Maintenance {
                );
                // xdebug's default of 100 is too low for MediaWiki
                ini_set( 'xdebug.max_nesting_level', 1000 );
+
+               // Bug T116683 serialize_precision of 100
+               // may break testing against floating point values
+               // treated with PHP's serialize()
+               ini_set( 'serialize_precision', 17 );
        }
 
        public function execute() {
index ae0d325..3282665 100644 (file)
@@ -232,7 +232,6 @@ class ResourcesTest extends MediaWikiTestCase {
                        'lists' => array(
                                'scripts',
                                'debugScripts',
-                               'loaderScripts',
                                'styles',
                        ),
 
index f9ddcf2..26c4e08 100644 (file)
@@ -71,6 +71,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js',
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js
new file mode 100644 (file)
index 0000000..b4028ec
--- /dev/null
@@ -0,0 +1,105 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.html' );
+
+       QUnit.test( 'escape', 2, function ( assert ) {
+               assert.throws(
+                       function () {
+                               mw.html.escape();
+                       },
+                       TypeError,
+                       'throw a TypeError if argument is not a string'
+               );
+
+               assert.equal(
+                       mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
+                       '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;',
+                       'Escape special characters to html entities'
+               );
+       } );
+
+       QUnit.test( 'element()', 1, function ( assert ) {
+               assert.equal(
+                       mw.html.element(),
+                       '<undefined/>',
+                       'return valid html even without arguments'
+               );
+       } );
+
+       QUnit.test( 'element( tagName )', 1, function ( assert ) {
+               assert.equal( mw.html.element( 'div' ), '<div/>', 'DIV' );
+       } );
+
+       QUnit.test( 'element( tagName, attrs )', 2, function ( assert ) {
+               assert.equal( mw.html.element( 'div', {} ), '<div/>', 'DIV' );
+
+               assert.equal(
+                       mw.html.element(
+                               'div', {
+                                       id: 'foobar'
+                               }
+                       ),
+                       '<div id="foobar"/>',
+                       'DIV with attribs'
+               );
+       } );
+
+       QUnit.test( 'element( tagName, attrs, content )', 8, function ( assert ) {
+
+               assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'DIV with empty attributes and content' );
+
+               assert.equal( mw.html.element( 'p', {}, 12 ), '<p>12</p>', 'numbers as content cast to strings' );
+
+               assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'number as attribute value' );
+
+               assert.equal(
+                       mw.html.element(
+                               'div',
+                               {},
+                               new mw.html.Raw(
+                                       mw.html.element( 'img', { src: '<' } )
+                               )
+                       ),
+                       '<div><img src="&lt;"/></div>',
+                       'unescaped content with mw.html.Raw'
+               );
+
+               assert.equal(
+                       mw.html.element(
+                               'option',
+                               {
+                                       selected: true
+                               },
+                               'Foo'
+                       ),
+                       '<option selected="selected">Foo</option>',
+                       'boolean true attribute value'
+               );
+
+               assert.equal(
+                       mw.html.element(
+                               'option',
+                               {
+                                       value: 'foo',
+                                       selected: false
+                               },
+                               'Foo'
+                       ),
+                       '<option value="foo">Foo</option>',
+                       'boolean false attribute value'
+               );
+
+               assert.equal(
+                       mw.html.element( 'div', null, 'a' ),
+                       '<div>a</div>',
+                       'Skip attributes with null' );
+
+               assert.equal(
+                       mw.html.element( 'a', {
+                               href: 'http://mediawiki.org/w/index.php?title=RL&action=history'
+                       }, 'a' ),
+                       '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
+                       'Andhor tag with attributes and content'
+               );
+       } );
+
+}( mediaWiki ) );
index 4f273bc..24528bb 100644 (file)
                assert.equal( logSpy.callCount, 2, 'mw.log.warn calls' );
        } );
 
+       QUnit.test( 'Integration', 4, function ( assert ) {
+               var expected, logSpy;
+
+               expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
+               mw.messages.set( 'integration-test', '<b>[[Bold]]!</b>' );
+
+               this.suppressWarnings();
+               logSpy = this.sandbox.spy( mw.log, 'warn' );
+               assert.equal(
+                       window.gM( 'integration-test' ),
+                       expected,
+                       'Global function gM() works correctly'
+               );
+               assert.equal( logSpy.callCount, 1, 'mw.log.warn called' );
+               this.restoreWarnings();
+
+               assert.equal(
+                       mw.message( 'integration-test' ).parse(),
+                       expected,
+                       'mw.message().parse() works correctly'
+               );
+
+               assert.equal(
+                       $( '<span>' ).msg( 'integration-test' ).html(),
+                       expected,
+                       'jQuery plugin $.fn.msg() works correctly'
+               );
+       } );
+
 }( mediaWiki, jQuery ) );
index ac4f16c..d205ba7 100644 (file)
                } ).always( QUnit.start );
        } );
 
-       QUnit.test( 'mw.html', 13, function ( assert ) {
-               assert.throws( function () {
-                       mw.html.escape();
-               }, TypeError, 'html.escape throws a TypeError if argument given is not a string' );
-
-               assert.equal( mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
-                       '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;', 'escape() escapes special characters to html entities' );
-
-               assert.equal( mw.html.element(),
-                       '<undefined/>', 'element() always returns a valid html string (even without arguments)' );
-
-               assert.equal( mw.html.element( 'div' ), '<div/>', 'element() Plain DIV (simple)' );
-
-               assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'element() Basic DIV (simple)' );
-
-               assert.equal(
-                       mw.html.element(
-                               'div', {
-                                       id: 'foobar'
-                               }
-                       ),
-                       '<div id="foobar"/>',
-                       'html.element DIV (attribs)' );
-
-               assert.equal( mw.html.element( 'p', null, 12 ), '<p>12</p>', 'Numbers are valid content and should be casted to a string' );
-
-               assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'Numbers are valid attribute values' );
-
-               // Example from https://www.mediawiki.org/wiki/ResourceLoader/Default_modules#mediaWiki.html
-               assert.equal(
-                       mw.html.element(
-                               'div',
-                               {},
-                               new mw.html.Raw(
-                                       mw.html.element( 'img', { src: '<' } )
-                               )
-                       ),
-                       '<div><img src="&lt;"/></div>',
-                       'Raw inclusion of another element'
-               );
-
-               assert.equal(
-                       mw.html.element(
-                               'option', {
-                                       selected: true
-                               }, 'Foo'
-                       ),
-                       '<option selected="selected">Foo</option>',
-                       'Attributes may have boolean values. True copies the attribute name to the value.'
-               );
-
-               assert.equal(
-                       mw.html.element(
-                               'option', {
-                                       value: 'foo',
-                                       selected: false
-                               }, 'Foo'
-                       ),
-                       '<option value="foo">Foo</option>',
-                       'Attributes may have boolean values. False keeps the attribute from output.'
-               );
-
-               assert.equal( mw.html.element( 'div',
-                       null, 'a' ),
-                       '<div>a</div>',
-                       'html.element DIV (content)' );
-
-               assert.equal( mw.html.element( 'a',
-                       { href: 'http://mediawiki.org/w/index.php?title=RL&action=history' }, 'a' ),
-                       '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
-                       'html.element DIV (attribs + content)' );
-
-       } );
-
        QUnit.test( 'mw.hook', 13, function ( assert ) {
                var hook, add, fire, chars, callback;
 
index bd14e41..c699bb1 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -376,23 +376,28 @@ function wfStreamThumb( array $params ) {
  * @return array (MediaTransformOutput|bool, string|bool error message HTML)
  */
 function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath ) {
-       global $wgMemc, $wgAttemptFailureEpoch;
+       global $wgAttemptFailureEpoch;
 
-       $key = wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
-               $file->getRepo()->getName(), $file->getSha1(), md5( $thumbName ) );
+       $cache = ObjectCache::getLocalClusterInstance();
+       $key = $cache->makeKey(
+               'attempt-failures',
+               $wgAttemptFailureEpoch,
+               $file->getRepo()->getName(),
+               $file->getSha1(),
+               md5( $thumbName )
+       );
 
        // Check if this file keeps failing to render
-       if ( $wgMemc->get( $key ) >= 4 ) {
+       if ( $cache->get( $key ) >= 4 ) {
                return array( false, wfMessage( 'thumbnail_image-failure-limit', 4 ) );
        }
 
        $done = false;
        // Record failures on PHP fatals in addition to caching exceptions
-       register_shutdown_function( function () use ( &$done, $key ) {
+       register_shutdown_function( function () use ( $cache, &$done, $key ) {
                if ( !$done ) { // transform() gave a fatal
-                       global $wgMemc;
                        // Randomize TTL to reduce stampedes
-                       $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+                       $cache->incrWithInit( $key, $cache::TTL_HOUR + mt_rand( 0, 300 ) );
                }
        } );
 
@@ -445,7 +450,7 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
 
        if ( !$thumb || $thumb->isError() ) {
                // Randomize TTL to reduce stampedes
-               $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+               $cache->incrWithInit( $key, $cache::TTL_HOUR + mt_rand( 0, 300 ) );
        }
 
        return array( $thumb, $errorHtml );