Merge "Introduce ApiMaxLagInfo hook"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 5 Jun 2018 18:01:49 +0000 (18:01 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 5 Jun 2018 18:01:49 +0000 (18:01 +0000)
757 files changed:
.phpcs.xml
RELEASE-NOTES-1.31
RELEASE-NOTES-1.32
autoload.php
composer.json
docs/globals.txt
docs/memcached.txt
includes/AjaxDispatcher.php
includes/Block.php
includes/CommentStore.php
includes/DefaultSettings.php
includes/EditPage.php
includes/FauxRequest.php
includes/GlobalFunctions.php
includes/Html.php
includes/LinkFilter.php
includes/Linker.php
includes/MWNamespace.php
includes/MagicWord.php
includes/MediaWiki.php
includes/NoLocalSettings.php
includes/OutputPage.php
includes/PrefixSearch.php
includes/Revision.php
includes/ServiceWiring.php
includes/Setup.php
includes/Storage/RevisionStore.php
includes/Title.php
includes/WebRequest.php
includes/WikiMap.php
includes/actions/HistoryAction.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiCSPReport.php
includes/api/ApiErrorFormatter.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatXml.php
includes/api/ApiHelp.php
includes/api/ApiModuleManager.php
includes/api/ApiOptions.php
includes/api/ApiParamInfo.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContribs.php
includes/api/ApiResult.php
includes/api/ApiRsd.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/SearchApi.php
includes/api/i18n/ar.json
includes/api/i18n/zh-hans.json
includes/auth/AuthManager.php
includes/auth/ResetPasswordSecondaryAuthenticationProvider.php
includes/auth/ThrottlePreAuthenticationProvider.php
includes/cache/GenderCache.php
includes/cache/MessageCache.php
includes/cache/UserCache.php
includes/changes/ChangesList.php
includes/changes/ChangesListFilterGroup.php
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/clientpool/SquidPurgeClient.php
includes/collation/IcuCollation.php
includes/compat/ScopedCallback.php [deleted file]
includes/compat/XMPReader.php [new file with mode: 0644]
includes/debug/logger/MonologSpi.php
includes/debug/logger/monolog/LineFormatter.php
includes/externalstore/ExternalStoreDB.php
includes/externalstore/ExternalStoreMwstore.php
includes/filebackend/FileBackendGroup.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/LocalFile.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormElement.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLExpiryField.php
includes/htmlform/fields/HTMLFloatField.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLSelectAndOtherField.php
includes/htmlform/fields/HTMLSelectOrOtherField.php
includes/htmlform/fields/HTMLSizeFilterField.php
includes/htmlform/fields/HTMLTextAreaField.php
includes/htmlform/fields/HTMLTextField.php
includes/import/WikiImporter.php
includes/installer/CliInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstallerExistingWiki.php
includes/installer/i18n/af.json
includes/installer/i18n/ar.json
includes/installer/i18n/ast.json
includes/installer/i18n/ba.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bg.json
includes/installer/i18n/bn.json
includes/installer/i18n/br.json
includes/installer/i18n/bs.json
includes/installer/i18n/bto.json
includes/installer/i18n/ca.json
includes/installer/i18n/ce.json
includes/installer/i18n/cs.json
includes/installer/i18n/csb.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/el.json
includes/installer/i18n/en.json
includes/installer/i18n/eo.json
includes/installer/i18n/es.json
includes/installer/i18n/eu.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/frc.json
includes/installer/i18n/frp.json
includes/installer/i18n/gl.json
includes/installer/i18n/haw.json
includes/installer/i18n/he.json
includes/installer/i18n/hi.json
includes/installer/i18n/hrx.json
includes/installer/i18n/hsb.json
includes/installer/i18n/hu.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/is.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ka.json
includes/installer/i18n/ko.json
includes/installer/i18n/ksh.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lb.json
includes/installer/i18n/lij.json
includes/installer/i18n/lt.json
includes/installer/i18n/lv.json
includes/installer/i18n/mk.json
includes/installer/i18n/ml.json
includes/installer/i18n/ms.json
includes/installer/i18n/mt.json
includes/installer/i18n/mzn.json
includes/installer/i18n/nap.json
includes/installer/i18n/nb.json
includes/installer/i18n/ne.json
includes/installer/i18n/nl-informal.json
includes/installer/i18n/nl.json
includes/installer/i18n/oc.json
includes/installer/i18n/olo.json
includes/installer/i18n/pl.json
includes/installer/i18n/pms.json
includes/installer/i18n/ps.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/pt.json
includes/installer/i18n/qqq.json
includes/installer/i18n/ro.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/ru.json
includes/installer/i18n/sco.json
includes/installer/i18n/si.json
includes/installer/i18n/sl.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/sv.json
includes/installer/i18n/ta.json
includes/installer/i18n/te.json
includes/installer/i18n/th.json
includes/installer/i18n/tl.json
includes/installer/i18n/tr.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/uk.json
includes/installer/i18n/vi.json
includes/installer/i18n/war.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobQueueSecondTestQueue.php
includes/jobqueue/JobRunner.php
includes/jobqueue/JobSpecification.php
includes/jobqueue/aggregator/JobQueueAggregatorRedis.php
includes/jobqueue/jobs/DeleteLinksJob.php
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/json/FormatJson.php
includes/libs/CSSMin.php
includes/libs/HttpStatus.php
includes/libs/JavaScriptMinifier.php
includes/libs/MappedIterator.php
includes/libs/MultiHttpClient.php
includes/libs/Timing.php
includes/libs/UDPTransport.php
includes/libs/XhprofData.php
includes/libs/composer/ComposerInstalled.php
includes/libs/composer/ComposerLock.php
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackend.php
includes/libs/filebackend/FileBackendMultiWrite.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/FileOpBatch.php
includes/libs/filebackend/HTTPFileStreamer.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/filejournal/FileJournal.php
includes/libs/filebackend/fileop/FileOp.php
includes/libs/lockmanager/DBLockManager.php
includes/libs/lockmanager/LockManager.php
includes/libs/lockmanager/MemcLockManager.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/HashBagOStuff.php
includes/libs/objectcache/MemcachedClient.php
includes/libs/objectcache/MemcachedPeclBagOStuff.php
includes/libs/objectcache/MemcachedPhpBagOStuff.php
includes/libs/objectcache/RedisBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WANObjectCacheReaper.php
includes/libs/rdbms/ChronologyProtector.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseDomain.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/field/MySQLField.php
includes/libs/rdbms/lbfactory/ILBFactory.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/lbfactory/LBFactorySimple.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php
includes/libs/rdbms/loadmonitor/LoadMonitor.php
includes/libs/rdbms/loadmonitor/LoadMonitorMySQL.php
includes/libs/redis/RedisConnRef.php
includes/libs/redis/RedisConnectionPool.php
includes/libs/virtualrest/VirtualRESTService.php
includes/libs/virtualrest/VirtualRESTServiceClient.php
includes/libs/xmp/XMP.php [deleted file]
includes/libs/xmp/XMPInfo.php [deleted file]
includes/libs/xmp/XMPValidate.php [deleted file]
includes/logging/LogFormatter.php
includes/logging/RightsLogFormatter.php
includes/mail/UserMailer.php
includes/media/BitmapMetadataHandler.php
includes/media/DjVuHandler.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaTransformOutput.php
includes/media/SvgHandler.php
includes/media/TransformationalImageHandler.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/pager/TablePager.php
includes/parser/CoreParserFunctions.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Sanitizer.php
includes/password/Pbkdf2Password.php
includes/poolcounter/PoolCounterWork.php
includes/preferences/DefaultPreferencesFactory.php
includes/profiler/ProfilerSectionOnly.php
includes/profiler/ProfilerXhprof.php
includes/profiler/output/ProfilerOutputStats.php
includes/profiler/output/ProfilerOutputText.php
includes/registration/ExtensionProcessor.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderOOUIImageModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelList.php
includes/services/ServiceContainer.php
includes/session/ImmutableSessionProviderWithCookie.php
includes/session/PHPSessionHandler.php
includes/session/SessionInfo.php
includes/session/SessionManager.php
includes/shell/FirejailCommand.php
includes/shell/Shell.php
includes/skins/BaseTemplate.php
includes/skins/Skin.php
includes/specialpage/AuthManagerSpecialPage.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/QueryPage.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialMediaStatistics.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedcategories.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/formfields/Licenses.php
includes/specials/formfields/UploadSourceField.php
includes/specials/forms/EditWatchlistNormalHTMLForm.php
includes/specials/forms/PreferencesFormLegacy.php
includes/specials/forms/PreferencesFormOOUI.php
includes/specials/forms/UploadForm.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/UsersPager.php
includes/tidy/RemexCompatFormatter.php
includes/title/MediaWikiTitleCodec.php
includes/upload/UploadBase.php
includes/user/BotPassword.php
includes/user/ExternalUserNames.php
includes/user/User.php
includes/watcheditem/WatchedItemQueryService.php
includes/widget/ComplexTitleInputWidget.php
includes/widget/ExpiryInputWidget.php
includes/widget/NamespaceInputWidget.php
languages/Language.php
languages/data/Names.php
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/ang.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arn.json
languages/i18n/arq.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/atj.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/bpy.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/btm.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ch.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/cps.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de-ch.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/dty.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gag.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gcr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/glk.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/got.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/ha.json
languages/i18n/hak.json
languages/i18n/haw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/ht.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ig.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kbd-cyrl.json
languages/i18n/kbp.json
languages/i18n/khw.json
languages/i18n/kiu.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/krl.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kum.json
languages/i18n/kw.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lmo.json
languages/i18n/lo.json
languages/i18n/loz.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lus.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/lzz.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/mwl.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/mzn.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/nso.json
languages/i18n/nys.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pcd.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/pnt.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/qug.json
languages/i18n/rif.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/sdh.json
languages/i18n/se.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/shn.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/so.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/srn.json
languages/i18n/stq.json
languages/i18n/sty.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tay.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tly.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vo.json
languages/i18n/vro.json
languages/i18n/wo.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAf.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBr.php
languages/messages/MessagesBtm.php [new file with mode: 0644]
languages/messages/MessagesCs.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFur.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesIt.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKsh.php
languages/messages/MessagesLa.php
languages/messages/MessagesLbe.php
languages/messages/MessagesLn.php
languages/messages/MessagesLt.php
languages/messages/MessagesLv.php
languages/messages/MessagesMr.php
languages/messages/MessagesNb.php
languages/messages/MessagesNn.php
languages/messages/MessagesOc.php
languages/messages/MessagesPl.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesRu.php
languages/messages/MessagesSe.php
languages/messages/MessagesSk.php
languages/messages/MessagesSv.php
languages/messages/MessagesTa.php
languages/messages/MessagesTe.php
languages/messages/MessagesUdm.php
languages/messages/MessagesUk.php
languages/messages/MessagesUz.php
languages/messages/MessagesWa.php
maintenance/Maintenance.php
maintenance/archives/patch-archive-ar_rev_id-unique.sql [new file with mode: 0644]
maintenance/cleanupInvalidDbKeys.php
maintenance/cleanupSpam.php
maintenance/copyFileBackend.php
maintenance/doMaintenance.php
maintenance/findDeprecated.php
maintenance/generateSitemap.php
maintenance/language/languages.inc
maintenance/mcc.php
maintenance/mssql/tables.sql
maintenance/mysql.php [new file with mode: 0644]
maintenance/namespaceDupes.php
maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/postgres/tables.sql
maintenance/renameDbPrefix.php
maintenance/sqlite/archives/patch-archive-ar_rev_id-unique.sql [new file with mode: 0644]
maintenance/storage/moveToExternal.php
maintenance/storage/testCompression.php
maintenance/storage/trackBlobs.php
maintenance/tables.sql
maintenance/updateSpecialPages.php
profileinfo.php
resources/src/jquery/jquery.makeCollapsible.js
resources/src/mediawiki.Title/Title.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less
tests/parser/ParserTestRunner.php
tests/parser/parserTests.txt
tests/phan/config.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/xmp/1.result.php [deleted file]
tests/phpunit/data/xmp/1.xmp [deleted file]
tests/phpunit/data/xmp/2.result.php [deleted file]
tests/phpunit/data/xmp/2.xmp [deleted file]
tests/phpunit/data/xmp/3-invalid.result.php [deleted file]
tests/phpunit/data/xmp/3-invalid.xmp [deleted file]
tests/phpunit/data/xmp/3.result.php [deleted file]
tests/phpunit/data/xmp/3.xmp [deleted file]
tests/phpunit/data/xmp/4.result.php [deleted file]
tests/phpunit/data/xmp/4.xmp [deleted file]
tests/phpunit/data/xmp/5.result.php [deleted file]
tests/phpunit/data/xmp/5.xmp [deleted file]
tests/phpunit/data/xmp/6.result.php [deleted file]
tests/phpunit/data/xmp/6.xmp [deleted file]
tests/phpunit/data/xmp/7.result.php [deleted file]
tests/phpunit/data/xmp/7.xmp [deleted file]
tests/phpunit/data/xmp/README [deleted file]
tests/phpunit/data/xmp/bag-for-seq.result.php [deleted file]
tests/phpunit/data/xmp/bag-for-seq.xmp [deleted file]
tests/phpunit/data/xmp/doctype-included.result.php [deleted file]
tests/phpunit/data/xmp/doctype-included.xmp [deleted file]
tests/phpunit/data/xmp/doctype-not-included.xmp [deleted file]
tests/phpunit/data/xmp/flash.result.php [deleted file]
tests/phpunit/data/xmp/flash.xmp [deleted file]
tests/phpunit/data/xmp/gps.result.php [deleted file]
tests/phpunit/data/xmp/gps.xmp [deleted file]
tests/phpunit/data/xmp/invalid-child-not-struct.result.php [deleted file]
tests/phpunit/data/xmp/invalid-child-not-struct.xmp [deleted file]
tests/phpunit/data/xmp/no-namespace.result.php [deleted file]
tests/phpunit/data/xmp/no-namespace.xmp [deleted file]
tests/phpunit/data/xmp/no-recognized-props.result.php [deleted file]
tests/phpunit/data/xmp/no-recognized-props.xmp [deleted file]
tests/phpunit/data/xmp/utf16BE.result.php [deleted file]
tests/phpunit/data/xmp/utf16BE.xmp [deleted file]
tests/phpunit/data/xmp/utf16LE.result.php [deleted file]
tests/phpunit/data/xmp/utf16LE.xmp [deleted file]
tests/phpunit/data/xmp/utf32BE.result.php [deleted file]
tests/phpunit/data/xmp/utf32BE.xmp [deleted file]
tests/phpunit/data/xmp/utf32LE.result.php [deleted file]
tests/phpunit/data/xmp/utf32LE.xmp [deleted file]
tests/phpunit/data/xmp/xmpExt.result.php [deleted file]
tests/phpunit/data/xmp/xmpExt.xmp [deleted file]
tests/phpunit/data/xmp/xmpExt2.xmp [deleted file]
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/PrefixSearchTest.php
tests/phpunit/includes/TestUserRegistry.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiComparePagesTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/format/ApiFormatBaseTest.php
tests/phpunit/includes/api/format/ApiFormatTestBase.php
tests/phpunit/includes/api/generateRandomImages.php
tests/phpunit/includes/api/query/ApiQueryUserContribsTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/collation/CustomUppercaseCollationTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php
tests/phpunit/includes/libs/xmp/XMPTest.php [deleted file]
tests/phpunit/includes/libs/xmp/XMPValidateTest.php [deleted file]
tests/phpunit/includes/logging/LogFormatterTestCase.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/languages/LanguageTest.php
tests/qunit/data/styleTest.css.php
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
thumb.php

index 14bb494..e15eca0 100644 (file)
@@ -7,7 +7,9 @@
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" />
                <exclude name="MediaWiki.Commenting.FunctionComment.ExtraParamComment" />
+               <exclude name="MediaWiki.Commenting.FunctionComment.DefaultNullTypeParam" />
                <exclude name="MediaWiki.Commenting.FunctionComment.WrongStyle" />
+               <exclude name="MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait" />
                <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentStart" />
                <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentEnd" />
                <exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
@@ -61,7 +63,7 @@
        </rule>
        <rule ref="MediaWiki.NamingConventions.ValidGlobalName">
                <properties>
-                       <property name="ignoreList" type="array" value="$IP,$messageMemc,$parserMemc" />
+                       <property name="ignoreList" type="array" value="$IP,$messageMemc" />
                </properties>
        </rule>
        <rule ref="Generic.Files.LineLength">
@@ -82,6 +84,7 @@
                <exclude-pattern>*/includes/specials/SpecialMostinterwikis\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheHelper\.php</exclude-pattern>
+               <exclude-pattern>*/includes/compat/XMPReader\.php</exclude-pattern>
                <exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
                <exclude-pattern>*/includes/specials/SpecialAncientpages\.php</exclude-pattern>
                <exclude-pattern>*/includes/specials/SpecialBrokenRedirects\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/language/date-formats\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/language/languages.inc</exclude-pattern>
                <exclude-pattern>*/maintenance/minify\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/mysql\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/parse\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/preprocessorFuzzTest\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/rebuildImages\.php</exclude-pattern>
                <exclude-pattern>*/includes/AuthPlugin\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
                <exclude-pattern>*/includes/cache/CacheHelper\.php</exclude-pattern>
+               <exclude-pattern>*/includes/compat/XMPReader\.php</exclude-pattern>
                <exclude-pattern>*/includes/deferred/CdnCacheUpdate\.php</exclude-pattern>
                <exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
                <exclude-pattern>*/includes/diff/DiffEngine\.php</exclude-pattern>
        <rule ref="MediaWiki.Usage.AssignmentInReturn.AssignmentInReturn">
                <exclude-pattern>*/tests/phpunit/*\.php</exclude-pattern>
        </rule>
+       <rule ref="MediaWiki.Usage.ForbiddenFunctions.escapeshellarg">
+               <!--
+                       Whitelist existing violations, but enable the sniff to prevent
+                       any new occurrences.
+               -->
+               <exclude-pattern>*/includes/libs/filebackend/FSFileBackend\.php</exclude-pattern>
+               <exclude-pattern>*/includes/shell/Command\.php</exclude-pattern>
+               <exclude-pattern>*/includes/shell/Shell\.php</exclude-pattern>
+               <exclude-pattern>*/tests/phpunit/structure/StructureTest\.php</exclude-pattern>
+       </rule>
+       <rule ref="MediaWiki.Usage.ForbiddenFunctions.exec">
+               <!--
+                       Whitelist existing violations, but enable the sniff to prevent
+                       any new occurrences.
+               -->
+               <exclude-pattern>*/tests/phpunit/structure/StructureTest\.php</exclude-pattern>
+       </rule>
+       <rule ref="MediaWiki.Usage.ForbiddenFunctions.popen">
+               <!--
+                       Whitelist existing violations, but enable the sniff to prevent
+                       any new occurrences.
+               -->
+               <exclude-pattern>*/includes/GlobalFunctions\.php</exclude-pattern>
+               <exclude-pattern>*/includes/libs/filebackend/FSFileBackend\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/7zip\.inc</exclude-pattern>
+               <exclude-pattern>*/maintenance/populateImageSha1\.php</exclude-pattern>
+       </rule>
+       <rule ref="MediaWiki.Usage.ForbiddenFunctions.proc_open">
+               <!--
+                       Whitelist existing violations, but enable the sniff to prevent
+                       any new occurrences.
+               -->
+               <exclude-pattern>includes/export/DumpPipeOutput\.php</exclude-pattern>
+               <exclude-pattern>includes/resourceloader/ResourceLoaderImage\.php</exclude-pattern>
+               <exclude-pattern>includes/shell/Command\.php</exclude-pattern>
+               <exclude-pattern>includes/tidy/RaggettExternal\.php</exclude-pattern>
+               <exclude-pattern>maintenance/dumpTextPass\.php</exclude-pattern>
+               <exclude-pattern>maintenance/mysql\.php</exclude-pattern>
+               <exclude-pattern>maintenance/storage/recompressTracked\.php</exclude-pattern>
+               <exclude-pattern>tests/parser/editTests\.php</exclude-pattern>
+       </rule>
+       <rule ref="MediaWiki.Usage.ForbiddenFunctions.shell_exec">
+               <!--
+                       Whitelist existing violations, but enable the sniff to prevent
+                       any new occurrences.
+               -->
+               <exclude-pattern>*/maintenance/mwdocgen\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/updateCredits\.php</exclude-pattern>
+       </rule>
+       <rule ref="MediaWiki.Usage.ForbiddenFunctions.system">
+               <!--
+                       Whitelist existing violations, but enable the sniff to prevent
+                       any new occurrences.
+               -->
+               <exclude-pattern>*/maintenance/mwdocgen\.php</exclude-pattern>
+       </rule>
        <file>.</file>
        <arg name="encoding" value="UTF-8"/>
        <arg name="extensions" value="php,php5,inc,sample"/>
index bf038a7..d369ac6 100644 (file)
@@ -5,6 +5,14 @@ THIS IS NOT A RELEASE YET
 MediaWiki 1.31 is an alpha-quality branch and is not recommended for use in
 production.
 
+=== Important pre-upgrade notes for 1.31 ===
+* If you're using MySQL, SQLite, or MSSQL, are not using update.php to apply
+  schema changes, and cannot have downtime to run migrateArchiveText.php and
+  apply patch-drop-ar_text.sql manually, you'll have to apply a default value
+  to the ar_text and ar_flags columns of the archive table or make those
+  columns nullable before upgrading to MediaWiki 1.31.
+  maintenance/archives/patch-nullable-ar_text.sql shows how to do this for MySQL.
+
 === Configuration changes in 1.31 ===
 * $wgEnableAPI and $wgEnableWriteAPI are now deprecated and will be removed in
   a future version. The API is now considered to be stable, secure and
@@ -43,6 +51,9 @@ production.
   framework that it enables. Some extensions mistakenly used this to check
   whether any AJAX functionality at all should be enabled, further making this
   problematic to retain.
+* Add default edit rate limit of 90 edits/minute for all users.
+* $wgDBmysql5 is now deprecated, and will be removed in a future version. It
+  has been marked as experimental ever since it was introduced.
 
 === New features in 1.31 ===
 * (T76554) User sub-pages named ….json are now protected in the same way that
@@ -137,6 +148,7 @@ production.
 * (T2087, T10897, T87753, T174639) Whitespace created by category and language
   links is now stripped rather than leaving blank lines in odd places.
 * (T3780) Uploads with UTF-8 names now work on PHP7.1+ on Windows servers.
+* (T186565) Fix PHP Notice from `ob_end_flush()` in `FileRepo::streamFile()`.
 
 === Action API changes in 1.31 ===
 * (T185058) The 'name' value to tgprop for action=query&list=tags has been
index e363c7e..702b289 100644 (file)
@@ -24,10 +24,13 @@ production.
 * New configuration variable has been added: $wgCookieSetOnIpBlock.
   This determines whether to set a cookie when an IP user is blocked. Doing so means
   that a blocked user, even after moving to a new IP address, will still be blocked.
+* The archive table's ar_rev_id field is now unique.
 
 === New features in 1.32 ===
 * (T112474) Generalized the ResourceLoader mechanism for overriding modules
   using a particular page during edit previews.
+* (T12331) You can now log page creation events by setting $wgPageCreationLog
+  to true.
 * Added 'ApiParseMakeOutputPage' hook.
 * (T174313) Added checkbox on Special:ListUsers to display only users in
   temporary user groups.
@@ -40,8 +43,11 @@ production.
 
 ==== Upgraded external libraries ====
 * Updated QUnit from 2.4.0 to 2.6.0.
+* Updated wikimedia/scoped-callback from 1.0.0 to 2.0.0.
+** ScopedCallback objects can no longer be serialized.
 
 ==== New external libraries ====
+* Added wikimedia/xmp-reader 0.5.1
 * …
 
 ==== Removed and replaced external libraries ====
@@ -76,6 +82,7 @@ because of Phabricator reports.
 
 * (T193566) Added language support for Ambonese Malay (abs).
 * (T194047) Added language support for Shawiya, Latin script (shy-latn).
+* (T195940) Added language support for Batak Mandailing (btm).
 
 === Breaking changes in 1.32 ===
 * $wgRequestTime, deprecated in 1.25, was removed. Use
@@ -131,6 +138,12 @@ because of Phabricator reports.
 * The protected methods PHPSessionHandler::returnSuccess() and returnFailure(),
   only needed for PHP5 compatibility, have been removed. It now uses the boolean
   values `true` and `false` respectively.
+* The $parserMemc global and wfGetParserCacheStorage(), deprecated since 1.30,
+  were removed. Use the ParserCache class instead.
+* ScopedCallback (deprecated in 1.28) was removed. Use Wikimedia\ScopedCallback
+  instead.
+* Support for ResourceLoaderModule::getModifiedTime() and getModifiedHash(),
+  deprecated since 1.26, was removed. Use getDefinitionSummary() instead.
 
 === Deprecations in 1.32 ===
 * Use of a StartProfiler.php file is deprecated in favour of placing
@@ -159,12 +172,10 @@ because of Phabricator reports.
   constant INTL_ICU_VERSION directly in all versions that MediaWiki supports.
 * Parser::fetchFile() is deprecated. Use ::fetchFileAndTitle() instead.
 * The ApiQueryContributions class has been renamed to ApiQueryUserContribs.
+* The XMPInfo, XMPReader, and XMPValidate classes have been deprecated in favor
+  of the namespaced classes provided by the wikimedia/xmp-reader library.
 
 === Other changes in 1.32 ===
-* Soft hyphens (U+00AD) are now automatically removed from titles; these
-  characters can accidentally end up in copy-and-pasted titles.
-* Strip Unicode 6.3.0 directional formatting characters (U+061C, U+2066,
-  U+2067, U+2068, U+2069) from the title.
 * …
 
 == Compatibility ==
index 77144df..67cd3b9 100644 (file)
@@ -994,6 +994,7 @@ $wgAutoloadLocalClasses = [
        'MwSql' => __DIR__ . '/maintenance/sql.php',
        'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MySqlLockManager.php',
        'MysqlInstaller' => __DIR__ . '/includes/installer/MysqlInstaller.php',
+       'MysqlMaintenance' => __DIR__ . '/maintenance/mysql.php',
        'MysqlUpdater' => __DIR__ . '/includes/installer/MysqlUpdater.php',
        'NaiveForeignTitleFactory' => __DIR__ . '/includes/title/NaiveForeignTitleFactory.php',
        'NaiveImportTitleFactory' => __DIR__ . '/includes/title/NaiveImportTitleFactory.php',
@@ -1278,7 +1279,6 @@ $wgAutoloadLocalClasses = [
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SamplingStatsdClient' => __DIR__ . '/includes/libs/stats/SamplingStatsdClient.php',
        'Sanitizer' => __DIR__ . '/includes/parser/Sanitizer.php',
-       'ScopedCallback' => __DIR__ . '/includes/compat/ScopedCallback.php',
        'ScopedLock' => __DIR__ . '/includes/libs/lockmanager/ScopedLock.php',
        'SearchApi' => __DIR__ . '/includes/api/SearchApi.php',
        'SearchDatabase' => __DIR__ . '/includes/search/SearchDatabase.php',
@@ -1680,9 +1680,9 @@ $wgAutoloadLocalClasses = [
        'WrapOldPasswords' => __DIR__ . '/maintenance/wrapOldPasswords.php',
        'XCFHandler' => __DIR__ . '/includes/media/XCF.php',
        'XMLRCFeedFormatter' => __DIR__ . '/includes/rcfeed/XMLRCFeedFormatter.php',
-       'XMPInfo' => __DIR__ . '/includes/libs/xmp/XMPInfo.php',
-       'XMPReader' => __DIR__ . '/includes/libs/xmp/XMP.php',
-       'XMPValidate' => __DIR__ . '/includes/libs/xmp/XMPValidate.php',
+       'XMPInfo' => __DIR__ . '/includes/compat/XMPReader.php',
+       'XMPReader' => __DIR__ . '/includes/compat/XMPReader.php',
+       'XMPValidate' => __DIR__ . '/includes/compat/XMPReader.php',
        'Xhprof' => __DIR__ . '/includes/libs/Xhprof.php',
        'XhprofData' => __DIR__ . '/includes/libs/XhprofData.php',
        'Xml' => __DIR__ . '/includes/Xml.php',
index b572c81..669007c 100644 (file)
                "wikimedia/relpath": "2.1.1",
                "wikimedia/remex-html": "1.0.3",
                "wikimedia/running-stat": "1.2.1",
-               "wikimedia/scoped-callback": "1.0.0",
+               "wikimedia/scoped-callback": "2.0.0",
                "wikimedia/utfnormal": "2.0.0",
                "wikimedia/timestamp": "1.0.0",
                "wikimedia/wait-condition-loop": "1.0.1",
                "wikimedia/wrappedstring": "3.0.0",
+               "wikimedia/xmp-reader": "0.5.1",
                "zordius/lightncandy": "0.23"
        },
        "require-dev": {
@@ -59,7 +60,7 @@
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "jetbrains/phpstorm-stubs": "dev-master#1b9906084d6635456fcf3f3a01f0d7d5b99a578a",
                "justinrainbow/json-schema": "~5.2",
-               "mediawiki/mediawiki-codesniffer": "18.0.0",
+               "mediawiki/mediawiki-codesniffer": "20.0.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.3",
                "nmred/kafka-php": "0.1.5",
index 5bdb31c..be887a6 100644 (file)
@@ -63,5 +63,5 @@ $wgParser
 $wgRequest
        WebRequest object, to get request data
 
-$wgMemc, $messageMemc, $parserMemc
+$wgMemc, $messageMemc
        Object caches
index 8c59e72..1e68fb7 100644 (file)
@@ -80,18 +80,15 @@ usage evenly), make its entry a subarray:
 MediaWiki uses a fork of Ryan T. Dean's pure-PHP memcached client.
 It also supports the PECL PHP extension for memcached.
 
-MediaWiki uses three object for object caching:
-* $wgMemc, controlled by $wgMainCacheType
-* $parserMemc, controlled by $wgParserCacheType
-* $messageMemc, controlled by $wgMessageCacheType
-If you set CACHE_NONE to one of the three control variable, (default
-value for $wgMainCacheType), MediaWiki still create a MemCacheClient,
-but requests to it are no-ops and we always fall through to the
-database. If the cache daemon can't be contacted, it should also
-disable itself fairly smoothly.
-
-By default, $wgMemc is used but when it is $parserMemc or $messageMemc
-this is mentioned below.
+MediaWiki uses the ObjectCache class to retrieve instances of
+BagOStuff by purpose, controlled by the following variables:
+* $wgMainCacheType
+* $wgParserCacheType
+* $wgMessageCacheType
+
+If you set one of these to CACHE_NONE, MediaWiki still creates a
+BagOStuff object, but calls it to it are no-ops. If the cache daemon
+can't be contacted, it should also disable itself fairly smoothly.
 
 == Keys used ==
 
@@ -134,7 +131,7 @@ Localisation:
        cleared by: Language::loadLocalisation()
 
 Message Cache:
-       stored in: $messageMemc
+       backend: $wgMessageCacheType
        key: $wgDBname:messages, $wgDBname:messages-hash, $wgDBname:messages-status
        ex: wikidb:messages, wikidb:messages-hash, wikidb:messages-status
        stores: an array where the keys are DB keys and the values are messages
@@ -151,7 +148,8 @@ Newtalk:
        expiry: 30 minutes
 
 Parser Cache:
-       stored in: $parserMemc
+       access: ParserCache
+       backend: $wgParserCacheType
        key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash
                $pageid: id of the page
                $renderkey: 1 if action=render, 0 otherwise
@@ -205,7 +203,7 @@ Sessions:
        cleared by: session_destroy()
 
 Sidebar:
-       stored in: $parserMemc
+       access: WANObjectCache
        controlled by: $wgEnableSidebarCache
        key: $wgDBname:sidebar
        ex: wikidb:sidebar
@@ -221,7 +219,7 @@ Special:Allpages:
        cleared by: nothing
 
 Special:Recentchanges (feed):
-       stored in: $messageMemc
+       backend: $wgMessageCacheType
        key: $wgDBname:rcfeed:$format:$limit:$hideminor:$target and
                rcfeed:$format:timestamp
        ex: wikidb:rcfeed:rss:50:: and rcfeed:rss:timestamp
index 35b556d..5f825c8 100644 (file)
@@ -76,7 +76,7 @@ class AjaxDispatcher {
 
                switch ( $this->mode ) {
                        case 'get':
-                               $this->func_name = isset( $_GET["rs"] ) ? $_GET["rs"] : '';
+                               $this->func_name = $_GET["rs"] ?? '';
                                if ( !empty( $_GET["rsargs"] ) ) {
                                        $this->args = $_GET["rsargs"];
                                } else {
@@ -84,7 +84,7 @@ class AjaxDispatcher {
                                }
                                break;
                        case 'post':
-                               $this->func_name = isset( $_POST["rs"] ) ? $_POST["rs"] : '';
+                               $this->func_name = $_POST["rs"] ?? '';
                                if ( !empty( $_POST["rsargs"] ) ) {
                                        $this->args = $_POST["rsargs"];
                                } else {
index 2ce1f3e..9567b06 100644 (file)
@@ -458,7 +458,7 @@ class Block {
        protected function initFromRow( $row ) {
                $this->setTarget( $row->ipb_address );
                $this->setBlocker( User::newFromAnyId(
-                       $row->ipb_by, $row->ipb_by_text, isset( $row->ipb_by_actor ) ? $row->ipb_by_actor : null
+                       $row->ipb_by, $row->ipb_by_text, $row->ipb_by_actor ?? null
                ) );
 
                $this->mTimestamp = wfTimestamp( TS_MW, $row->ipb_timestamp );
index e9b08e8..6b94d58 100644 (file)
@@ -261,7 +261,7 @@ class CommentStore {
        private function getCommentInternal( IDatabase $db = null, $key, $row, $fallback = false ) {
                $row = (array)$row;
                if ( array_key_exists( "{$key}_text", $row ) && array_key_exists( "{$key}_data", $row ) ) {
-                       $cid = isset( $row["{$key}_cid"] ) ? $row["{$key}_cid"] : null;
+                       $cid = $row["{$key}_cid"] ?? null;
                        $text = $row["{$key}_text"];
                        $data = $row["{$key}_data"];
                } elseif ( $this->stage === MIGRATION_OLD ) {
index 562d887..f8a4e81 100644 (file)
@@ -2059,6 +2059,8 @@ $wgDBerrorLogTZ = false;
  * Even correct usage may cause failures with Unicode supplementary
  * characters (those not in the Basic Multilingual Plane) unless MySQL
  * has enhanced their Unicode support.
+ *
+ * @deprecated since 1.31
  */
 $wgDBmysql5 = false;
 
@@ -4877,6 +4879,7 @@ $wgDefaultUserOptions = [
        'watchlistunwatchlinks' => 0,
        'watchmoves' => 0,
        'watchrollback' => 0,
+       'wlenhancedfilters-disable' => 0,
        'wllimit' => 250,
        'useeditwarning' => 1,
        'prefershttps' => 1,
@@ -6871,6 +6874,15 @@ $wgUseRCPatrol = true;
  */
 $wgStructuredChangeFiltersShowPreference = false;
 
+/**
+ * Whether a preference is displayed for structured change filters on watchlist.
+ * Works just like $wgStructuredChangeFiltersShowPreference.
+ *
+ * Temporary variable during development and will be removed
+ * @since 1.32
+ */
+$wgStructuredChangeFiltersShowWatchlistPreference = false;
+
 /**
  * Whether to enable RCFilters app on Special:Watchlist
  *
@@ -7869,10 +7881,16 @@ $wgActionFilteredLogs = [
 ];
 
 /**
- * Maintain a log of newusers at Log/newusers?
+ * Maintain a log of newusers at Special:Log/newusers?
  */
 $wgNewUserLog = true;
 
+/**
+ * Maintain a log of page creations at Special:Log/create?
+ * @since 1.32
+ */
+$wgPageCreationLog = false;
+
 /** @} */ # end logging }
 
 /*************************************************************************//**
index bd44cf7..13d1623 100644 (file)
@@ -1578,7 +1578,7 @@ class EditPage {
                                                $query = $query . '&' . $extraQueryRedirect;
                                        }
                                }
-                               $anchor = isset( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
+                               $anchor = $resultDetails['sectionanchor'] ?? '';
                                $out->redirect( $this->mTitle->getFullURL( $query ) . $anchor );
                                return false;
 
@@ -4195,7 +4195,7 @@ ERROR;
                $checkboxesDef = $this->getCheckboxesDefinition( $checked );
 
                foreach ( $checkboxesDef as $name => $options ) {
-                       $legacyName = isset( $options['legacy-name'] ) ? $options['legacy-name'] : $name;
+                       $legacyName = $options['legacy-name'] ?? $name;
 
                        $title = null;
                        $accesskey = null;
@@ -4221,7 +4221,7 @@ ERROR;
                                        'align' => 'inline',
                                        'label' => new OOUI\HtmlSnippet( $this->context->msg( $options['label-message'] )->parse() ),
                                        'title' => $title,
-                                       'id' => isset( $options['label-id'] ) ? $options['label-id'] : null,
+                                       'id' => $options['label-id'] ?? null,
                                ]
                        );
                }
index 2f7f75b..ecbc6e3 100644 (file)
@@ -121,7 +121,7 @@ class FauxRequest extends WebRequest {
                        $prefix = $wgCookiePrefix;
                }
                $name = $prefix . $key;
-               return isset( $this->cookies[$name] ) ? $this->cookies[$name] : $default;
+               return $this->cookies[$name] ?? $default;
        }
 
        /**
index 6f49a14..ae09602 100644 (file)
@@ -121,7 +121,7 @@ function wfArrayDiff2_cmp( $a, $b ) {
        if ( is_string( $a ) && is_string( $b ) ) {
                return strcmp( $a, $b );
        } elseif ( count( $a ) !== count( $b ) ) {
-               return count( $a ) < count( $b ) ? -1 : 1;
+               return count( $a ) <=> count( $b );
        } else {
                reset( $a );
                reset( $b );
@@ -1336,21 +1336,19 @@ function wfGetLangObj( $langcode = false ) {
  * This function replaces all old wfMsg* functions.
  *
  * @param string|string[]|MessageSpecifier $key Message key, or array of keys, or a MessageSpecifier
- * @param mixed $params,... Normal message parameters
+ * @param string ...$params Normal message parameters
  * @return Message
  *
  * @since 1.17
  *
  * @see Message::__construct
  */
-function wfMessage( $key /*...*/ ) {
+function wfMessage( $key, ...$params ) {
        $message = new Message( $key );
 
        // We call Message::params() to reduce code duplication
-       $params = func_get_args();
-       array_shift( $params );
        if ( $params ) {
-               call_user_func_array( [ $message, 'params' ], $params );
+               $message->params( ...$params );
        }
 
        return $message;
@@ -1361,16 +1359,15 @@ function wfMessage( $key /*...*/ ) {
  * for the first message which is non-empty. If all messages are empty then an
  * instance of the first message key is returned.
  *
- * @param string|string[] $keys,... Message keys
+ * @param string|string[] ...$keys Message keys
  * @return Message
  *
  * @since 1.18
  *
  * @see Message::newFallbackSequence
  */
-function wfMessageFallback( /*...*/ ) {
-       $args = func_get_args();
-       return call_user_func_array( 'Message::newFallbackSequence', $args );
+function wfMessageFallback( ...$keys ) {
+       return Message::newFallbackSequence( ...$keys );
 }
 
 /**
@@ -1516,7 +1513,7 @@ function wfBacktrace( $raw = null ) {
 
        $frames = array_map( function ( $frame ) use ( $frameFormat ) {
                $file = !empty( $frame['file'] ) ? basename( $frame['file'] ) : '-';
-               $line = isset( $frame['line'] ) ? $frame['line'] : '-';
+               $line = $frame['line'] ?? '-';
                $call = $frame['function'];
                if ( !empty( $frame['class'] ) ) {
                        $call = $frame['class'] . $frame['type'] . $call;
@@ -2241,7 +2238,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = [],
        }
 
        $includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr'];
-       $profileMethod = isset( $options['profileMethod'] ) ? $options['profileMethod'] : wfGetCaller();
+       $profileMethod = $options['profileMethod'] ?? wfGetCaller();
 
        try {
                $result = Shell::command( [] )
@@ -3150,17 +3147,6 @@ function wfGetMessageCacheStorage() {
        return ObjectCache::getInstance( $wgMessageCacheType );
 }
 
-/**
- * Get the cache object used by the parser cache
- *
- * @deprecated since 1.30, use MediaWikiServices::getParserCache()->getCacheStorage()
- * @return BagOStuff
- */
-function wfGetParserCacheStorage() {
-       global $wgParserCacheType;
-       return ObjectCache::getInstance( $wgParserCacheType );
-}
-
 /**
  * Call hook functions defined in $wgHooks
  *
index 019e078..2ca5229 100644 (file)
@@ -391,8 +391,8 @@ class Html {
                        unset( $attribs['type'] );
                }
                if ( $element === 'input' ) {
-                       $type = isset( $attribs['type'] ) ? $attribs['type'] : null;
-                       $value = isset( $attribs['value'] ) ? $attribs['value'] : null;
+                       $type = $attribs['type'] ?? null;
+                       $value = $attribs['value'] ?? null;
                        if ( $type === 'checkbox' || $type === 'radio' ) {
                                // The default value for checkboxes and radio buttons is 'on'
                                // not ''. By stripping value="" we break radio boxes that
@@ -925,7 +925,7 @@ class Html {
                if ( isset( $params['label'] ) ) {
                        $ret .= self::element(
                                'label', [
-                                       'for' => isset( $selectAttribs['id'] ) ? $selectAttribs['id'] : null,
+                                       'for' => $selectAttribs['id'] ?? null,
                                ], $params['label']
                        ) . '&#160;';
                }
index 790e2be..17b4d56 100644 (file)
@@ -38,9 +38,10 @@ class LinkFilter {
         *
         * @param Content $content Content to check
         * @param string $filterEntry Domainparts, see makeRegex() for more details
+        * @param string $protocol 'http://' or 'https://'
         * @return int 0 if no match or 1 if there's at least one match
         */
-       static function matchEntry( Content $content, $filterEntry ) {
+       public static function matchEntry( Content $content, $filterEntry, $protocol = 'http://' ) {
                if ( !( $content instanceof TextContent ) ) {
                        // TODO: handle other types of content too.
                        //      Maybe create ContentHandler::matchFilter( LinkFilter ).
@@ -50,7 +51,7 @@ class LinkFilter {
 
                $text = $content->getNativeData();
 
-               $regex = self::makeRegex( $filterEntry );
+               $regex = self::makeRegex( $filterEntry, $protocol );
                return preg_match( $regex, $text );
        }
 
@@ -59,10 +60,12 @@ class LinkFilter {
         *
         * @param string $filterEntry URL, if it begins with "*.", it'll be
         *        replaced to match any subdomain
+        * @param string $protocol 'http://' or 'https://'
+        *
         * @return string Regex pattern, for preg_match()
         */
-       private static function makeRegex( $filterEntry ) {
-               $regex = '!http://';
+       private static function makeRegex( $filterEntry, $protocol ) {
+               $regex = '!' . preg_quote( $protocol );
                if ( substr( $filterEntry, 0, 2 ) == '*.' ) {
                        $regex .= '(?:[A-Za-z0-9.-]+\.|)';
                        $filterEntry = substr( $filterEntry, 2 );
index 5cdbfee..3ee442d 100644 (file)
@@ -338,7 +338,7 @@ class Linker {
                }
 
                // Clean up parameters
-               $page = isset( $handlerParams['page'] ) ? $handlerParams['page'] : false;
+               $page = $handlerParams['page'] ?? false;
                if ( !isset( $frameParams['align'] ) ) {
                        $frameParams['align'] = '';
                }
@@ -442,7 +442,7 @@ class Linker {
                        $params = [
                                'alt' => $frameParams['alt'],
                                'title' => $frameParams['title'],
-                               'valign' => isset( $frameParams['valign'] ) ? $frameParams['valign'] : false,
+                               'valign' => $frameParams['valign'] ?? false,
                                'img-class' => $frameParams['class'] ];
                        if ( isset( $frameParams['border'] ) ) {
                                $params['img-class'] .= ( $params['img-class'] !== '' ? ' ' : '' ) . 'thumbborder';
@@ -535,7 +535,7 @@ class Linker {
        ) {
                $exists = $file && $file->exists();
 
-               $page = isset( $handlerParams['page'] ) ? $handlerParams['page'] : false;
+               $page = $handlerParams['page'] ?? false;
                if ( !isset( $frameParams['align'] ) ) {
                        $frameParams['align'] = 'right';
                }
index f2f98ba..bfbd557 100644 (file)
@@ -472,9 +472,7 @@ class MWNamespace {
         */
        public static function getNamespaceContentModel( $index ) {
                global $wgNamespaceContentModels;
-               return isset( $wgNamespaceContentModels[$index] )
-                       ? $wgNamespaceContentModels[$index]
-                       : null;
+               return $wgNamespaceContentModels[$index] ?? null;
        }
 
        /**
index 93c8a71..17a4a0f 100644 (file)
@@ -395,13 +395,7 @@ class MagicWord {
        public function compareStringLength( $s1, $s2 ) {
                $l1 = strlen( $s1 );
                $l2 = strlen( $s2 );
-               if ( $l1 < $l2 ) {
-                       return 1;
-               } elseif ( $l1 > $l2 ) {
-                       return -1;
-               } else {
-                       return 0;
-               }
+               return $l2 <=> $l1; // descending
        }
 
        /**
index 459a7e1..7978727 100644 (file)
@@ -631,7 +631,8 @@ class MediaWiki {
 
                // Record ChronologyProtector positions for DBs affected in this request at this point
                $cpIndex = null;
-               $lbFactory->shutdown( $flags, $postCommitWork, $cpIndex );
+               $cpClientId = null;
+               $lbFactory->shutdown( $flags, $postCommitWork, $cpIndex, $cpClientId );
                wfDebug( __METHOD__ . ': LBFactory shutdown completed' );
 
                if ( $cpIndex > 0 ) {
@@ -639,7 +640,7 @@ class MediaWiki {
                                $now = time();
                                $expires = $now + ChronologyProtector::POSITION_COOKIE_TTL;
                                $options = [ 'prefix' => '' ];
-                               $value = LBFactory::makeCookieValueFromCPIndex( $cpIndex, $now ); // T190082
+                               $value = LBFactory::makeCookieValueFromCPIndex( $cpIndex, $now, $cpClientId );
                                $request->response()->setCookie( 'cpPosIndex', $value, $expires, $options );
                        }
 
@@ -939,7 +940,7 @@ class MediaWiki {
                        try {
                                $statsdServer = explode( ':', $config->get( 'StatsdServer' ) );
                                $statsdHost = $statsdServer[0];
-                               $statsdPort = isset( $statsdServer[1] ) ? $statsdServer[1] : 8125;
+                               $statsdPort = $statsdServer[1] ?? 8125;
                                $statsdSender = new SocketSender( $statsdHost, $statsdPort );
                                $statsdClient = new SamplingStatsdClient( $statsdSender, true, false );
                                $statsdClient->setSamplingRates( $config->get( 'StatsdSamplingRates' ) );
index 46e9630..f6f4cd3 100644 (file)
@@ -52,7 +52,7 @@ try {
        echo $templateParser->processTemplate(
                'NoLocalSettings',
                [
-                       'wgVersion' => ( isset( $wgVersion ) ? $wgVersion : 'VERSION' ),
+                       'wgVersion' => ( $wgVersion ?? 'VERSION' ),
                        'path' => $path,
                        'localSettingsExists' => file_exists( MW_CONFIG_FILE ),
                        'installerStarted' => $installerStarted
index 564641a..c51f6f8 100644 (file)
@@ -642,9 +642,7 @@ class OutputPage extends ContextSource {
                        // Register a callback for $this->contentOverrides on the first call
                        $this->addContentOverrideCallback( function ( LinkTarget $target ) {
                                $key = $target->getNamespace() . ':' . $target->getDBkey();
-                               return isset( $this->contentOverrides[$key] )
-                                       ? $this->contentOverrides[$key]
-                                       : null;
+                               return $this->contentOverrides[$key] ?? null;
                        } );
                }
 
@@ -1516,9 +1514,7 @@ class OutputPage extends ContextSource {
                if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
                        return min( array_values( $this->mAllowedModules ) );
                } else {
-                       return isset( $this->mAllowedModules[$type] )
-                               ? $this->mAllowedModules[$type]
-                               : ResourceLoaderModule::ORIGIN_ALL;
+                       return $this->mAllowedModules[$type] ?? ResourceLoaderModule::ORIGIN_ALL;
                }
        }
 
@@ -3904,7 +3900,7 @@ class OutputPage extends ContextSource {
         */
        public static function setupOOUI( $skinName = 'default', $dir = 'ltr' ) {
                $themes = ResourceLoaderOOUIModule::getSkinThemeMap();
-               $theme = isset( $themes[$skinName] ) ? $themes[$skinName] : $themes['default'];
+               $theme = $themes[$skinName] ?? $themes['default'];
                // For example, 'OOUI\WikimediaUITheme'.
                $themeClass = "OOUI\\{$theme}Theme";
                OOUI\Theme::setSingleton( new $themeClass() );
@@ -3968,12 +3964,8 @@ class OutputPage extends ContextSource {
                uksort( $logosPerDppx, function ( $a , $b ) {
                        $a = floatval( $a );
                        $b = floatval( $b );
-
-                       if ( $a == $b ) {
-                               return 0;
-                       }
                        // Sort from smallest to largest (e.g. 1x, 1.5x, 2x)
-                       return ( $a < $b ) ? -1 : 1;
+                       return $a <=> $b;
                } );
 
                foreach ( $logosPerDppx as $dppx => $src ) {
index 62ee5c6..5127158 100644 (file)
@@ -211,7 +211,7 @@ abstract class PrefixSearch {
 
                $searchParts = explode( '/', $search, 2 );
                $searchKey = $searchParts[0];
-               $subpageSearch = isset( $searchParts[1] ) ? $searchParts[1] : null;
+               $subpageSearch = $searchParts[1] ?? null;
 
                // Handle subpage search separately.
                if ( $subpageSearch !== null ) {
index 548ef8d..213abbe 100644 (file)
@@ -581,11 +581,11 @@ class Revision implements IDBAccessObject {
                                return $row['title'];
                        }
 
-                       $pageId = isset( $row['page'] ) ? $row['page'] : 0;
-                       $revId = isset( $row['id'] ) ? $row['id'] : 0;
+                       $pageId = $row['page'] ?? 0;
+                       $revId = $row['id'] ?? 0;
                } else {
-                       $pageId = isset( $row->rev_page ) ? $row->rev_page : 0;
-                       $revId = isset( $row->rev_id ) ? $row->rev_id : 0;
+                       $pageId = $row->rev_page ?? 0;
+                       $revId = $row->rev_id ?? 0;
                }
 
                try {
index ee92cbf..ace64ab 100644 (file)
@@ -415,9 +415,7 @@ return [
                foreach ( $config['paths'] as $prefix => $serviceConfig ) {
                        $class = $serviceConfig['class'];
                        // Merge in the global defaults
-                       $constructArg = isset( $serviceConfig['options'] )
-                               ? $serviceConfig['options']
-                               : [];
+                       $constructArg = $serviceConfig['options'] ?? [];
                        $constructArg += $config['global'];
                        // Make the VRS service available at the mount point
                        $vrsClient->mount( $prefix, [ 'class' => $class, 'config' => $constructArg ] );
index f73e686..e2fab45 100644 (file)
@@ -533,7 +533,7 @@ if ( $wgInvalidateCacheOnLocalSettingsChange ) {
 }
 
 if ( $wgNewUserLog ) {
-       // Add a new log type
+       // Add new user log type
        $wgLogTypes[] = 'newusers';
        $wgLogNames['newusers'] = 'newuserlogpage';
        $wgLogHeaders['newusers'] = 'newuserlogpagetext';
@@ -544,6 +544,12 @@ if ( $wgNewUserLog ) {
        $wgLogActionsHandlers['newusers/autocreate'] = NewUsersLogFormatter::class;
 }
 
+if ( $wgPageCreationLog ) {
+       // Add page creation log type
+       $wgLogTypes[] = 'create';
+       $wgLogActionsHandlers['create/create'] = LogFormatter::class;
+}
+
 if ( $wgPageLanguageUseDB ) {
        $wgLogTypes[] = 'pagelang';
        $wgLogActionsHandlers['pagelang/pagelang'] = PageLangLogFormatter::class;
@@ -730,20 +736,20 @@ if ( !$wgDBerrorLogTZ ) {
 // Initialize the request object in $wgRequest
 $wgRequest = RequestContext::getMain()->getRequest(); // BackCompat
 // Set user IP/agent information for agent session consistency purposes
+$cpPosInfo = LBFactory::getCPInfoFromCookieValue(
+       // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
+       $wgRequest->getCookie( 'cpPosIndex', '' ),
+       // Mitigate broken client-side cookie expiration handling (T190082)
+       time() - ChronologyProtector::POSITION_COOKIE_TTL
+);
 MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->setRequestInfo( [
        'IPAddress' => $wgRequest->getIP(),
        'UserAgent' => $wgRequest->getHeader( 'User-Agent' ),
        'ChronologyProtection' => $wgRequest->getHeader( 'ChronologyProtection' ),
-       'ChronologyPositionIndex' => $wgRequest->getInt(
-               'cpPosIndex',
-               LBFactory::getCPIndexFromCookieValue(
-                       // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
-                       $wgRequest->getCookie( 'cpPosIndex', '' ),
-                       // Mitigate broken client-side cookie expiration handling (T190082)
-                       time() - ChronologyProtector::POSITION_COOKIE_TTL
-               )
-       )
+       'ChronologyPositionIndex' => $wgRequest->getInt( 'cpPosIndex', $cpPosInfo['index'] ),
+       'ChronologyClientId' => $cpPosInfo['clientId']
 ] );
+unset( $cpPosInfo );
 // Make sure that object caching does not undermine the ChronologyProtector improvements
 if ( $wgRequest->getCookie( 'UseDC', '' ) === 'master' ) {
        // The user is pinned to the primary DC, meaning that they made recent changes which should
@@ -771,13 +777,6 @@ if ( $wgCommandLineMode ) {
 $wgMemc = wfGetMainCache();
 $messageMemc = wfGetMessageCacheStorage();
 
-/**
- * @deprecated since 1.30
- */
-$parserMemc = new DeprecatedGlobal( 'parserMemc', function () {
-       return MediaWikiServices::getInstance()->getParserCache()->getCacheStorage();
-}, '1.30' );
-
 wfDebugLog( 'caches',
        'cluster: ' . get_class( $wgMemc ) .
        ', WAN: ' . ( $wgMainWANCache === CACHE_NONE ? 'CACHE_NONE' : $wgMainWANCache ) .
index 5b3daf4..36af6cd 100644 (file)
@@ -1117,9 +1117,9 @@ class RevisionStore
 
                try {
                        $user = User::newFromAnyId(
-                               isset( $row->ar_user ) ? $row->ar_user : null,
-                               isset( $row->ar_user_text ) ? $row->ar_user_text : null,
-                               isset( $row->ar_actor ) ? $row->ar_actor : null
+                               $row->ar_user ?? null,
+                               $row->ar_user_text ?? null,
+                               $row->ar_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
                        wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
@@ -1153,8 +1153,8 @@ class RevisionStore
                Assert::parameterType( 'object', $row, '$row' );
 
                if ( !$title ) {
-                       $pageId = isset( $row->rev_page ) ? $row->rev_page : 0; // XXX: also check page_id?
-                       $revId = isset( $row->rev_id ) ? $row->rev_id : 0;
+                       $pageId = $row->rev_page ?? 0; // XXX: also check page_id?
+                       $revId = $row->rev_id ?? 0;
 
                        $title = $this->getTitle( $pageId, $revId, $queryFlags );
                }
@@ -1168,9 +1168,9 @@ class RevisionStore
 
                try {
                        $user = User::newFromAnyId(
-                               isset( $row->rev_user ) ? $row->rev_user : null,
-                               isset( $row->rev_user_text ) ? $row->rev_user_text : null,
-                               isset( $row->rev_actor ) ? $row->rev_actor : null
+                               $row->rev_user ?? null,
+                               $row->rev_user_text ?? null,
+                               $row->rev_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
                        wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
@@ -1230,8 +1230,8 @@ class RevisionStore
                }
 
                if ( !$title ) {
-                       $pageId = isset( $fields['page'] ) ? $fields['page'] : 0;
-                       $revId = isset( $fields['id'] ) ? $fields['id'] : 0;
+                       $pageId = $fields['page'] ?? 0;
+                       $revId = $fields['id'] ?? 0;
 
                        $title = $this->getTitle( $pageId, $revId, $queryFlags );
                }
@@ -1258,7 +1258,7 @@ class RevisionStore
                        isset( $fields['comment'] )
                        && !( $fields['comment'] instanceof CommentStoreComment )
                ) {
-                       $commentData = isset( $fields['comment_data'] ) ? $fields['comment_data'] : null;
+                       $commentData = $fields['comment_data'] ?? null;
 
                        if ( $fields['comment'] instanceof Message ) {
                                $fields['comment'] = CommentStoreComment::newUnsavedComment(
@@ -1299,9 +1299,9 @@ class RevisionStore
                } else {
                        try {
                                $user = User::newFromAnyId(
-                                       isset( $fields['user'] ) ? $fields['user'] : null,
-                                       isset( $fields['user_text'] ) ? $fields['user_text'] : null,
-                                       isset( $fields['actor'] ) ? $fields['actor'] : null
+                                       $fields['user'] ?? null,
+                                       $fields['user_text'] ?? null,
+                                       $fields['actor'] ?? null
                                );
                        } catch ( InvalidArgumentException $ex ) {
                                $user = null;
index fd7451c..9711749 100644 (file)
@@ -784,11 +784,8 @@ class Title implements LinkTarget {
         * @return int Result of string comparison, or namespace comparison
         */
        public static function compare( LinkTarget $a, LinkTarget $b ) {
-               if ( $a->getNamespace() == $b->getNamespace() ) {
-                       return strcmp( $a->getText(), $b->getText() );
-               } else {
-                       return $a->getNamespace() - $b->getNamespace();
-               }
+               return $a->getNamespace() <=> $b->getNamespace()
+                       ?: strcmp( $a->getText(), $b->getText() );
        }
 
        /**
@@ -3089,9 +3086,7 @@ class Title implements LinkTarget {
                if ( !$this->mRestrictionsLoaded ) {
                        $this->loadRestrictions();
                }
-               return isset( $this->mRestrictions[$action] )
-                               ? $this->mRestrictions[$action]
-                               : [];
+               return $this->mRestrictions[$action] ?? [];
        }
 
        /**
@@ -3119,7 +3114,7 @@ class Title implements LinkTarget {
                if ( !$this->mRestrictionsLoaded ) {
                        $this->loadRestrictions();
                }
-               return isset( $this->mRestrictionsExpiry[$action] ) ? $this->mRestrictionsExpiry[$action] : false;
+               return $this->mRestrictionsExpiry[$action] ?? false;
        }
 
        /**
index e0b8de7..b499d86 100644 (file)
@@ -129,7 +129,7 @@ class WebRequest {
                        $a = parse_url( $url );
                        Wikimedia\restoreWarnings();
                        if ( $a ) {
-                               $path = isset( $a['path'] ) ? $a['path'] : '';
+                               $path = $a['path'] ?? '';
 
                                global $wgScript;
                                if ( $path == $wgScript && $want !== 'all' ) {
@@ -275,8 +275,7 @@ class WebRequest {
                // This method is called from various error handlers and should be kept simple.
 
                if ( !self::$reqId ) {
-                       self::$reqId = isset( $_SERVER['UNIQUE_ID'] )
-                               ? $_SERVER['UNIQUE_ID'] : wfRandomString( 24 );
+                       self::$reqId = $_SERVER['UNIQUE_ID'] ?? wfRandomString( 24 );
                }
 
                return self::$reqId;
@@ -458,7 +457,7 @@ class WebRequest {
         * @return mixed Old value if one was present, null otherwise
         */
        public function setVal( $key, $value ) {
-               $ret = isset( $this->data[$key] ) ? $this->data[$key] : null;
+               $ret = $this->data[$key] ?? null;
                $this->data[$key] = $value;
                return $ret;
        }
@@ -714,7 +713,7 @@ class WebRequest {
         * @return string
         */
        public function getMethod() {
-               return isset( $_SERVER['REQUEST_METHOD'] ) ? $_SERVER['REQUEST_METHOD'] : 'GET';
+               return $_SERVER['REQUEST_METHOD'] ?? 'GET';
        }
 
        /**
index 8bb37b5..90ebc4b 100644 (file)
@@ -104,7 +104,7 @@ class WikiMap {
                        $path .= '?' . $urlParts['query'];
                }
 
-               $canonicalServer = isset( $urlParts['scheme'] ) ? $urlParts['scheme'] : 'http';
+               $canonicalServer = $urlParts['scheme'] ?? 'http';
                $canonicalServer .= '://' . $urlParts['host'];
 
                return new WikiReference( $canonicalServer, $path );
index f7ac21b..ad26256 100644 (file)
@@ -711,9 +711,7 @@ class HistoryPager extends ReverseChronologicalPager {
                # Sometimes rev_len isn't populated
                if ( $rev->getSize() !== null ) {
                        # Size is always public data
-                       $prevSize = isset( $this->parentLens[$row->rev_parent_id] )
-                               ? $this->parentLens[$row->rev_parent_id]
-                               : 0;
+                       $prevSize = $this->parentLens[$row->rev_parent_id] ?? 0;
                        $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
                        $fSize = Linker::formatRevisionSize( $rev->getSize() );
                        $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
index d6b9f76..e37b4d4 100644 (file)
@@ -48,7 +48,7 @@ class ApiAuthManagerHelper {
                $this->module = $module;
 
                $params = $module->extractRequestParams();
-               $this->messageFormat = isset( $params['messageformat'] ) ? $params['messageformat'] : 'wikitext';
+               $this->messageFormat = $params['messageformat'] ?? 'wikitext';
        }
 
        /**
index 02a635a..8a99e6a 100644 (file)
@@ -1156,36 +1156,16 @@ abstract class ApiBase extends ContextSource {
                        ];
                }
 
-               $default = isset( $paramSettings[self::PARAM_DFLT] )
-                       ? $paramSettings[self::PARAM_DFLT]
-                       : null;
-               $multi = isset( $paramSettings[self::PARAM_ISMULTI] )
-                       ? $paramSettings[self::PARAM_ISMULTI]
-                       : false;
-               $multiLimit1 = isset( $paramSettings[self::PARAM_ISMULTI_LIMIT1] )
-                       ? $paramSettings[self::PARAM_ISMULTI_LIMIT1]
-                       : null;
-               $multiLimit2 = isset( $paramSettings[self::PARAM_ISMULTI_LIMIT2] )
-                       ? $paramSettings[self::PARAM_ISMULTI_LIMIT2]
-                       : null;
-               $type = isset( $paramSettings[self::PARAM_TYPE] )
-                       ? $paramSettings[self::PARAM_TYPE]
-                       : null;
-               $dupes = isset( $paramSettings[self::PARAM_ALLOW_DUPLICATES] )
-                       ? $paramSettings[self::PARAM_ALLOW_DUPLICATES]
-                       : false;
-               $deprecated = isset( $paramSettings[self::PARAM_DEPRECATED] )
-                       ? $paramSettings[self::PARAM_DEPRECATED]
-                       : false;
-               $deprecatedValues = isset( $paramSettings[self::PARAM_DEPRECATED_VALUES] )
-                       ? $paramSettings[self::PARAM_DEPRECATED_VALUES]
-                       : [];
-               $required = isset( $paramSettings[self::PARAM_REQUIRED] )
-                       ? $paramSettings[self::PARAM_REQUIRED]
-                       : false;
-               $allowAll = isset( $paramSettings[self::PARAM_ALL] )
-                       ? $paramSettings[self::PARAM_ALL]
-                       : false;
+               $default = $paramSettings[self::PARAM_DFLT] ?? null;
+               $multi = $paramSettings[self::PARAM_ISMULTI] ?? false;
+               $multiLimit1 = $paramSettings[self::PARAM_ISMULTI_LIMIT1] ?? null;
+               $multiLimit2 = $paramSettings[self::PARAM_ISMULTI_LIMIT2] ?? null;
+               $type = $paramSettings[self::PARAM_TYPE] ?? null;
+               $dupes = $paramSettings[self::PARAM_ALLOW_DUPLICATES] ?? false;
+               $deprecated = $paramSettings[self::PARAM_DEPRECATED] ?? false;
+               $deprecatedValues = $paramSettings[self::PARAM_DEPRECATED_VALUES] ?? [];
+               $required = $paramSettings[self::PARAM_REQUIRED] ?? false;
+               $allowAll = $paramSettings[self::PARAM_ALL] ?? false;
 
                // When type is not given, and no choices, the type is the same as $default
                if ( !isset( $type ) ) {
@@ -1313,10 +1293,9 @@ abstract class ApiBase extends ContextSource {
                                                }
                                                break;
                                        case 'integer': // Force everything using intval() and optionally validate limits
-                                               $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : null;
-                                               $max = isset( $paramSettings[self::PARAM_MAX] ) ? $paramSettings[self::PARAM_MAX] : null;
-                                               $enforceLimits = isset( $paramSettings[self::PARAM_RANGE_ENFORCE] )
-                                                       ? $paramSettings[self::PARAM_RANGE_ENFORCE] : false;
+                                               $min = $paramSettings[self::PARAM_MIN] ?? null;
+                                               $max = $paramSettings[self::PARAM_MAX] ?? null;
+                                               $enforceLimits = $paramSettings[self::PARAM_RANGE_ENFORCE] ?? false;
 
                                                if ( is_array( $value ) ) {
                                                        $value = array_map( 'intval', $value );
@@ -1348,7 +1327,7 @@ abstract class ApiBase extends ContextSource {
                                                if ( $multi ) {
                                                        self::dieDebug( __METHOD__, "Multi-values not supported for $encParamName" );
                                                }
-                                               $min = isset( $paramSettings[self::PARAM_MIN] ) ? $paramSettings[self::PARAM_MIN] : 0;
+                                               $min = $paramSettings[self::PARAM_MIN] ?? 0;
                                                if ( $value == 'max' ) {
                                                        $value = $this->getMain()->canApiHighLimits()
                                                                ? $paramSettings[self::PARAM_MAX2]
@@ -2335,7 +2314,7 @@ abstract class ApiBase extends ContextSource {
                                        'api-help-param-token',
                                        $this->needsToken(),
                                ],
-                       ] + ( isset( $params['token'] ) ? $params['token'] : [] );
+                       ] + ( $params['token'] ?? [] );
                }
 
                // Avoid PHP 7.1 warning of passing $this by reference
@@ -2375,7 +2354,7 @@ abstract class ApiBase extends ContextSource {
                                $settings = [];
                        }
 
-                       $d = isset( $desc[$param] ) ? $desc[$param] : '';
+                       $d = $desc[$param] ?? '';
                        if ( is_array( $d ) ) {
                                // Special handling for prop parameters
                                $d = array_map( function ( $line ) {
@@ -2457,9 +2436,7 @@ abstract class ApiBase extends ContextSource {
                                }
 
                                $valueMsgs = $settings[self::PARAM_HELP_MSG_PER_VALUE];
-                               $deprecatedValues = isset( $settings[self::PARAM_DEPRECATED_VALUES] )
-                                       ? $settings[self::PARAM_DEPRECATED_VALUES]
-                                       : [];
+                               $deprecatedValues = $settings[self::PARAM_DEPRECATED_VALUES] ?? [];
 
                                foreach ( $settings[self::PARAM_TYPE] as $value ) {
                                        if ( isset( $valueMsgs[$value] ) ) {
@@ -2811,7 +2788,7 @@ abstract class ApiBase extends ContextSource {
                if ( !$msg instanceof IApiMessage ) {
                        $key = $msg->getKey();
                        $params = $msg->getParams();
-                       array_unshift( $params, isset( self::$messageMap[$key] ) ? self::$messageMap[$key] : $key );
+                       array_unshift( $params, self::$messageMap[$key] ?? $key );
                        $msg = ApiMessage::create( $params );
                }
 
index 82a7cce..6271128 100644 (file)
@@ -176,8 +176,8 @@ class ApiCSPReport extends ApiBase {
                        $flagText = '[' . implode( ', ', $flags ) . ']';
                }
 
-               $blockedFile = isset( $report['blocked-uri'] ) ? $report['blocked-uri'] : 'n/a';
-               $page = isset( $report['document-uri'] ) ? $report['document-uri'] : 'n/a';
+               $blockedFile = $report['blocked-uri'] ?? 'n/a';
+               $page = $report['document-uri'] ?? 'n/a';
                $line = isset( $report['line-number'] ) ? ':' . $report['line-number'] : '';
                $warningText = $flagText .
                        ' Received CSP report: <' . $blockedFile .
index c637752..af23f95 100644 (file)
@@ -203,7 +203,7 @@ class ApiErrorFormatter {
        public function formatException( $exception, array $options = [] ) {
                return $this->formatMessage(
                        $this->getMessageFromException( $exception, $options ),
-                       isset( $options['format'] ) ? $options['format'] : null
+                       $options['format'] ?? null
                );
        }
 
index 393e536..c21ac12 100644 (file)
@@ -144,7 +144,7 @@ class ApiFeedWatchlist extends ApiBase {
                                ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
 
-                       $feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss';
+                       $feedFormat = $params['feedformat'] ?? 'rss';
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
                        $feed = new $feedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
 
@@ -201,7 +201,7 @@ class ApiFeedWatchlist extends ApiBase {
                } else {
                        $titleUrl = $title->getFullURL( $curidParam );
                }
-               $comment = isset( $info['comment'] ) ? $info['comment'] : null;
+               $comment = $info['comment'] ?? null;
 
                // Create an anchor to section.
                // The anchor won't work for sections that have dupes on page
index cc1bd82..73e9e58 100644 (file)
@@ -104,26 +104,18 @@ class ApiFormatXml extends ApiFormatBase {
                        $value = (array)$value;
                }
                if ( is_array( $value ) ) {
-                       $contentKey = isset( $value[ApiResult::META_CONTENT] )
-                               ? $value[ApiResult::META_CONTENT]
-                               : '*';
-                       $subelementKeys = isset( $value[ApiResult::META_SUBELEMENTS] )
-                               ? $value[ApiResult::META_SUBELEMENTS]
-                               : [];
+                       $contentKey = $value[ApiResult::META_CONTENT] ?? '*';
+                       $subelementKeys = $value[ApiResult::META_SUBELEMENTS] ?? [];
                        if ( isset( $value[ApiResult::META_BC_SUBELEMENTS] ) ) {
                                $subelementKeys = array_merge(
                                        $subelementKeys, $value[ApiResult::META_BC_SUBELEMENTS]
                                );
                        }
-                       $preserveKeys = isset( $value[ApiResult::META_PRESERVE_KEYS] )
-                               ? $value[ApiResult::META_PRESERVE_KEYS]
-                               : [];
+                       $preserveKeys = $value[ApiResult::META_PRESERVE_KEYS] ?? [];
                        $indexedTagName = isset( $value[ApiResult::META_INDEXED_TAG_NAME] )
                                ? self::mangleName( $value[ApiResult::META_INDEXED_TAG_NAME], $preserveKeys )
                                : '_v';
-                       $bcBools = isset( $value[ApiResult::META_BC_BOOLS] )
-                               ? $value[ApiResult::META_BC_BOOLS]
-                               : [];
+                       $bcBools = $value[ApiResult::META_BC_BOOLS] ?? [];
                        $indexSubelements = isset( $value[ApiResult::META_TYPE] )
                                ? $value[ApiResult::META_TYPE] !== 'array'
                                : false;
index bccb338..8b0204c 100644 (file)
@@ -149,7 +149,7 @@ class ApiHelp extends ApiBase {
                }
                $out->addHTML( $html );
 
-               $helptitle = isset( $options['helptitle'] ) ? $options['helptitle'] : null;
+               $helptitle = $options['helptitle'] ?? null;
                $html = self::fixHelpLinks( $out->getHTML(), $helptitle, $haveModules );
                $out->clearHTML();
                $out->addHTML( $html );
@@ -482,9 +482,7 @@ class ApiHelp extends ApiBase {
 
                                        // Type documentation
                                        if ( !isset( $settings[ApiBase::PARAM_TYPE] ) ) {
-                                               $dflt = isset( $settings[ApiBase::PARAM_DFLT] )
-                                                       ? $settings[ApiBase::PARAM_DFLT]
-                                                       : null;
+                                               $dflt = $settings[ApiBase::PARAM_DFLT] ?? null;
                                                if ( is_bool( $dflt ) ) {
                                                        $settings[ApiBase::PARAM_TYPE] = 'boolean';
                                                } elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
@@ -503,12 +501,8 @@ class ApiHelp extends ApiBase {
 
                                                if ( is_array( $type ) ) {
                                                        $count = count( $type );
-                                                       $deprecatedValues = isset( $settings[ApiBase::PARAM_DEPRECATED_VALUES] )
-                                                               ? $settings[ApiBase::PARAM_DEPRECATED_VALUES]
-                                                               : [];
-                                                       $links = isset( $settings[ApiBase::PARAM_VALUE_LINKS] )
-                                                               ? $settings[ApiBase::PARAM_VALUE_LINKS]
-                                                               : [];
+                                                       $deprecatedValues = $settings[ApiBase::PARAM_DEPRECATED_VALUES] ?? [];
+                                                       $links = $settings[ApiBase::PARAM_VALUE_LINKS] ?? [];
                                                        $values = array_map( function ( $v ) use ( $links, $deprecatedValues ) {
                                                                $attr = [];
                                                                if ( $v !== '' ) {
@@ -707,9 +701,7 @@ class ApiHelp extends ApiBase {
                                                                $info[] = implode( ' ', $extra );
                                                        }
 
-                                                       $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
-                                                               ? $settings[ApiBase::PARAM_ALL]
-                                                               : false;
+                                                       $allowAll = $settings[ApiBase::PARAM_ALL] ?? false;
                                                        if ( $allowAll || $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
                                                                if ( $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
                                                                        $allSpecifier = ApiBase::ALL_DEFAULT_STRING;
@@ -733,9 +725,7 @@ class ApiHelp extends ApiBase {
                                        }
 
                                        // Add default
-                                       $default = isset( $settings[ApiBase::PARAM_DFLT] )
-                                               ? $settings[ApiBase::PARAM_DFLT]
-                                               : null;
+                                       $default = $settings[ApiBase::PARAM_DFLT] ?? null;
                                        if ( $default === '' ) {
                                                $info[] = $context->msg( 'api-help-param-default-empty' )
                                                        ->parse();
index e02c862..fec55aa 100644 (file)
@@ -96,7 +96,7 @@ class ApiModuleManager extends ContextSource {
                foreach ( $modules as $name => $moduleSpec ) {
                        if ( is_array( $moduleSpec ) ) {
                                $class = $moduleSpec['class'];
-                               $factory = ( isset( $moduleSpec['factory'] ) ? $moduleSpec['factory'] : null );
+                               $factory = ( $moduleSpec['factory'] ?? null );
                        } else {
                                $class = $moduleSpec;
                                $factory = null;
index 4b76906..f30b44c 100644 (file)
@@ -65,11 +65,11 @@ class ApiOptions extends ApiBase {
                if ( $params['change'] ) {
                        foreach ( $params['change'] as $entry ) {
                                $array = explode( '=', $entry, 2 );
-                               $changes[$array[0]] = isset( $array[1] ) ? $array[1] : null;
+                               $changes[$array[0]] = $array[1] ?? null;
                        }
                }
                if ( isset( $params['optionname'] ) ) {
-                       $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
+                       $newValue = $params['optionvalue'] ?? null;
                        $changes[$params['optionname']] = $newValue;
                }
                if ( !$changed && !count( $changes ) ) {
index b8a32ae..c81cf7e 100644 (file)
@@ -339,9 +339,7 @@ class ApiParamInfo extends ApiBase {
                        }
 
                        if ( !isset( $settings[ApiBase::PARAM_TYPE] ) ) {
-                               $dflt = isset( $settings[ApiBase::PARAM_DFLT] )
-                                       ? $settings[ApiBase::PARAM_DFLT]
-                                       : null;
+                               $dflt = $settings[ApiBase::PARAM_DFLT] ?? null;
                                if ( is_bool( $dflt ) ) {
                                        $settings[ApiBase::PARAM_TYPE] = 'boolean';
                                } elseif ( is_string( $dflt ) || is_null( $dflt ) ) {
@@ -445,9 +443,7 @@ class ApiParamInfo extends ApiBase {
                                        $allowAll = true;
                                        $allSpecifier = ApiBase::ALL_DEFAULT_STRING;
                                } else {
-                                       $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
-                                               ? $settings[ApiBase::PARAM_ALL]
-                                               : false;
+                                       $allowAll = $settings[ApiBase::PARAM_ALL] ?? false;
                                        $allSpecifier = ( is_string( $allowAll ) ? $allowAll : ApiBase::ALL_DEFAULT_STRING );
                                }
                                if ( $allowAll && $item['multi'] &&
index fb90e25..b338ed6 100644 (file)
@@ -419,7 +419,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                $settings = self::$settings[$this->getModuleName()];
                $name = $this->getModuleName();
                $path = $this->getModulePath();
-               $title = isset( $settings['exampletitle'] ) ? $settings['exampletitle'] : 'Main Page';
+               $title = $settings['exampletitle'] ?? 'Main Page';
                $etitle = rawurlencode( $title );
 
                return [
index fd196aa..6c219d4 100644 (file)
@@ -66,7 +66,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                }
 
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
-               $offset = isset( $params['offset'] ) ? $params['offset'] : 0;
+               $offset = $params['offset'] ?? 0;
                if ( $offset ) {
                        $this->addOption( 'OFFSET', $params['offset'] );
                }
index 3f2d510..4b408fc 100644 (file)
@@ -54,7 +54,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        $fit = $this->appendMagicWords( $p );
                                        break;
                                case 'interwikimap':
-                                       $filteriw = isset( $params['filteriw'] ) ? $params['filteriw'] : false;
+                                       $filteriw = $params['filteriw'] ?? false;
                                        $fit = $this->appendInterwikiMap( $p, $filteriw );
                                        break;
                                case 'dbrepllag':
@@ -387,7 +387,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
 
                $params = $this->extractRequestParams();
-               $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
+               $langCode = $params['inlanguagecode'] ?? '';
                $langNames = Language::fetchLanguageNames( $langCode );
 
                $getPrefixes = MediaWikiServices::getInstance()->getInterwikiLookup()->getAllPrefixes( $local );
@@ -629,7 +629,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        }
 
                                        if ( SpecialVersion::getExtLicenseFileName( $extensionPath ) ) {
-                                               $ret['license-name'] = isset( $ext['license-name'] ) ? $ext['license-name'] : '';
+                                               $ret['license-name'] = $ext['license-name'] ?? '';
                                                $ret['license'] = SpecialPage::getTitleFor(
                                                        'Version',
                                                        "License/{$ext['name']}"
@@ -699,7 +699,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        public function appendLanguages( $property ) {
                $params = $this->extractRequestParams();
-               $langCode = isset( $params['inlanguagecode'] ) ? $params['inlanguagecode'] : '';
+               $langCode = $params['inlanguagecode'] ?? '';
                $langNames = Language::fetchLanguageNames( $langCode );
 
                $data = [];
index 140ff6d..420d138 100644 (file)
@@ -367,11 +367,11 @@ class ApiQueryUserContribs extends ApiQueryBase {
                                if ( $batchSize === 1 ) { // One user, can't be different
                                        $ret = 0;
                                } elseif ( $this->orderBy === 'id' ) {
-                                       $ret = $a[0]->rev_user - $b[0]->rev_user;
+                                       $ret = $a[0]->rev_user <=> $b[0]->rev_user;
                                } elseif ( $this->orderBy === 'name' ) {
                                        $ret = strcmp( $a[0]->rev_user_text, $b[0]->rev_user_text );
                                } else {
-                                       $ret = $a[0]->rev_actor - $b[0]->rev_actor;
+                                       $ret = $a[0]->rev_actor <=> $b[0]->rev_actor;
                                }
 
                                if ( !$ret ) {
@@ -382,7 +382,7 @@ class ApiQueryUserContribs extends ApiQueryBase {
                                }
 
                                if ( !$ret ) {
-                                       $ret = $a[0]->rev_id - $b[0]->rev_id;
+                                       $ret = $a[0]->rev_id <=> $b[0]->rev_id;
                                }
 
                                return $neg * $ret;
@@ -691,9 +691,7 @@ class ApiQueryUserContribs extends ApiQueryBase {
                        && !is_null( $row->rev_len )
                        && !is_null( $row->rev_parent_id )
                ) {
-                       $parentLen = isset( $this->parentLens[$row->rev_parent_id] )
-                               ? $this->parentLens[$row->rev_parent_id]
-                               : 0;
+                       $parentLen = $this->parentLens[$row->rev_parent_id] ?? 0;
                        $vals['sizediff'] = intval( $row->rev_len - $parentLen );
                }
 
index 1afacaf..df71830 100644 (file)
@@ -804,11 +804,11 @@ class ApiResult implements ApiSerializable {
         * @return array|object
         */
        protected static function applyTransformations( array $dataIn, array $transforms ) {
-               $strip = isset( $transforms['Strip'] ) ? $transforms['Strip'] : 'none';
+               $strip = $transforms['Strip'] ?? 'none';
                if ( $strip === 'base' ) {
                        $transforms['Strip'] = 'none';
                }
-               $transformTypes = isset( $transforms['Types'] ) ? $transforms['Types'] : null;
+               $transformTypes = $transforms['Types'] ?? null;
                if ( $transformTypes !== null && !is_array( $transformTypes ) ) {
                        throw new InvalidArgumentException( __METHOD__ . ':Value for "Types" must be an array' );
                }
@@ -954,9 +954,7 @@ class ApiResult implements ApiSerializable {
 
                                case 'kvp':
                                case 'BCkvp':
-                                       $key = isset( $metadata[self::META_KVP_KEY_NAME] )
-                                               ? $metadata[self::META_KVP_KEY_NAME]
-                                               : $transformTypes['ArmorKVP'];
+                                       $key = $metadata[self::META_KVP_KEY_NAME] ?? $transformTypes['ArmorKVP'];
                                        $valKey = isset( $transforms['BC'] ) ? '*' : 'value';
                                        $assocAsObject = !empty( $transformTypes['AssocAsObject'] );
                                        $merge = !empty( $metadata[self::META_KVP_MERGE] );
index f20d1c6..71bab36 100644 (file)
@@ -120,7 +120,7 @@ class ApiRsd extends ApiBase {
                                'name' => $name,
                                'preferred' => wfBoolToStr( $name == 'MediaWiki' ),
                                'apiLink' => $info['apiLink'],
-                               'blogID' => isset( $info['blogID'] ) ? $info['blogID'] : '',
+                               'blogID' => $info['blogID'] ?? '',
                        ];
                        $settings = [];
                        if ( isset( $info['docs'] ) ) {
index ee5c3a2..840ef1b 100644 (file)
@@ -65,7 +65,7 @@ class ApiUndelete extends ApiBase {
 
                $pa = new PageArchive( $titleObj, $this->getConfig() );
                $retval = $pa->undelete(
-                       ( isset( $params['timestamps'] ) ? $params['timestamps'] : [] ),
+                       ( $params['timestamps'] ?? [] ),
                        $params['reason'],
                        $params['fileids'],
                        false,
index 93e432b..2c5b583 100644 (file)
@@ -682,9 +682,7 @@ class ApiUpload extends ApiBase {
                                $warning = $warnings['exists'];
                                unset( $warnings['exists'] );
                                /** @var LocalFile $localFile */
-                               $localFile = isset( $warning['normalizedFile'] )
-                                       ? $warning['normalizedFile']
-                                       : $warning['file'];
+                               $localFile = $warning['normalizedFile'] ?? $warning['file'];
                                $warnings[$warning['warning']] = $localFile->getName();
                        }
 
index 47f3bc5..e251fe6 100644 (file)
@@ -134,7 +134,7 @@ class ApiUserrights extends ApiBase {
 
                $this->requireOnlyOneParameter( $params, 'user', 'userid' );
 
-               $user = isset( $params['user'] ) ? $params['user'] : '#' . $params['userid'];
+               $user = $params['user'] ?? '#' . $params['userid'];
 
                $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
index f7c6471..40d4778 100644 (file)
@@ -150,7 +150,7 @@ trait SearchApi {
         */
        public function buildSearchEngine( array $params = null ) {
                if ( $params != null ) {
-                       $type = isset( $params['backend'] ) ? $params['backend'] : null;
+                       $type = $params['backend'] ?? null;
                        if ( $type === self::$BACKEND_NULL_PARAM ) {
                                $type = null;
                        }
index dece40e..159861a 100644 (file)
@@ -14,7 +14,7 @@
                        "Azouz.anis"
                ]
        },
-       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> يجب أن تعمل جميع الميزات المعروضة في هذه الصفحة، إلا أن واجهة برمجة التطبيقات لا تزال قيد التطوير النشط، وقد تتغير في أي وقت. الاشتراك في\n<strong>Erroneous requests:</strong>عند إرسال طلبات خاطئة إلى api, فالـHTTP سيتم إرسال رأس مع المفتاح \"MediaWiki-API-Error\" ومن ثم سيتم تعيين قيمة رأس ورمز الخطأ المرسل مرة أخرى إلى نفس القيمة. لمزيد من المعلومات، راجع  [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n<p class=\"mw-apisandbox-link\"><strong>Testing:</strong> لسهولة إختبار طلبات API، انظر [[Special:ApiSandbox]].</p>",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|التوثيق]]\n* [[mw:Special:MyLanguage/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/ القائمة البريدية لإعلان API ميدياويكي] لإشعارات التحديثات.\n\n<strong>الطلبات الخاطئة:</strong>عندما يتم إرسال طلبات خاطئة إلى API، سيتم إرسال رأس HTTP مع مفتاح \"خطأ-API-ميدياويكي\"، وبعد ذلك سترجع قيمة الرأس ورمز الخطأ المرتجع إلى يتم تعيينه على نفس القيمة، لمزيد من المعلومات; راجع [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>الاختبار:</strong>لسهولة اختبار طلبات API ; انظر [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "أي فعل للعمل.",
        "apihelp-main-param-format": "صيغة الخرج.",
        "apihelp-main-param-maxlag": "يمكن استخدام التأخر الأقصى عند تثبيت ميدياويكي على قاعدة بيانات مكررة، لحفظ الإجراءات التي تتسبب في أي تأخير أكثر في النسخ المتماثل للموقع; يمكن أن يجعل هذا الوسيط العميل ينتظر حتى يكون تأخر النسخ المتماثل أقل من القيمة المحددة، في حالة التأخير المفرط، يتم إرجاع رمز الخطأ <samp>maxlag</samp> برسالة مثل <samp>Waiting for $host: $lag seconds lagged</samp>،<br />انظر [[mw:Special:MyLanguage/Manual:Maxlag_parameter|دليل: الوسيط maxlag]] لمزيد من المعلومات.",
index a58888b..85d3982 100644 (file)
        "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
        "apihelp-query+recentchanges-param-type": "显示的更改类型。",
        "apihelp-query+recentchanges-param-toponly": "只列举作为最新修订的更改。",
+       "apihelp-query+recentchanges-param-title": "过滤记录至这些与页面相关的。",
        "apihelp-query+recentchanges-param-generaterevisions": "当作为生成器使用时,生成修订ID而不是标题。不带关联修订ID的最近更改记录(例如大多数日志记录)将不会生成任何东西。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表。",
        "apihelp-query+recentchanges-example-generator": "获取有关最近未巡查更改的页面信息。",
index 9ed6d13..2adc00e 100644 (file)
@@ -1675,7 +1675,7 @@ class AuthManager implements LoggerAwareInterface {
                }
 
                // Checks passed, create the user...
-               $from = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : 'CLI';
+               $from = $_SERVER['REQUEST_URI'] ?? 'CLI';
                $this->logger->info( __METHOD__ . ': creating new user ({username}) - from: {from}', [
                        'username' => $username,
                        'from' => $from,
@@ -2286,9 +2286,10 @@ class AuthManager implements LoggerAwareInterface {
                        $spec = [ 'sort2' => $i++ ] + $spec + [ 'sort' => 0 ];
                }
                unset( $spec );
+               // Sort according to the 'sort' field, and if they are equal, according to 'sort2'
                usort( $specs, function ( $a, $b ) {
-                       return ( (int)$a['sort'] ) - ( (int)$b['sort'] )
-                               ?: $a['sort2'] - $b['sort2'];
+                       return $a['sort'] <=> $b['sort']
+                               ?: $a['sort2'] <=> $b['sort2'];
                } );
 
                $ret = [];
index 45ac3aa..c831fc8 100644 (file)
@@ -96,7 +96,7 @@ class ResetPasswordSecondaryAuthenticationProvider extends AbstractSecondaryAuth
                        }
                }
 
-               $needReq = isset( $data->req ) ? $data->req : new PasswordAuthenticationRequest();
+               $needReq = $data->req ?? new PasswordAuthenticationRequest();
                if ( !$needReq->action ) {
                        $needReq->action = AuthManager::ACTION_CHANGE;
                }
index ae0bc6b..83d67ea 100644 (file)
@@ -58,8 +58,7 @@ class ThrottlePreAuthenticationProvider extends AbstractPreAuthenticationProvide
        public function __construct( $params = [] ) {
                $this->throttleSettings = array_intersect_key( $params,
                        [ 'accountCreationThrottle' => true, 'passwordAttemptThrottle' => true ] );
-               $this->cache = isset( $params['cache'] ) ? $params['cache'] :
-                       \ObjectCache::getLocalClusterInstance();
+               $this->cache = $params['cache'] ?? \ObjectCache::getLocalClusterInstance();
        }
 
        public function setConfig( Config $config ) {
index 099a986..1ec39a5 100644 (file)
@@ -85,7 +85,7 @@ class GenderCache {
                /* Undefined if there is a valid username which for some reason doesn't
                 * exist in the database.
                 */
-               return isset( $this->cache[$username] ) ? $this->cache[$username] : $this->getDefault();
+               return $this->cache[$username] ?? $this->getDefault();
        }
 
        /**
index 71fcd8b..b6213c1 100644 (file)
@@ -727,7 +727,7 @@ class MessageCache {
                        $this->wanCache->makeKey( 'messages', $code, 'hash', 'v1' ),
                        [
                                'hash' => $cache['HASH'],
-                               'latest' => isset( $cache['LATEST'] ) ? $cache['LATEST'] : 0
+                               'latest' => $cache['LATEST'] ?? 0
                        ],
                        WANObjectCache::TTL_INDEFINITE
                );
@@ -836,9 +836,9 @@ class MessageCache {
                                ],
                                [
                                        ' ',
-                                       "\xc2\xa0",
-                                       "\xc2\xa0",
-                                       "\xc2\xad"
+                                       "\u{00A0}",
+                                       "\u{00A0}",
+                                       "\u{00AD}"
                                ],
                                $message
                        );
index cb68571..2828b9a 100644 (file)
@@ -56,9 +56,7 @@ class UserCache {
                        $this->doQuery( [ $userId ] ); // cache miss
                }
 
-               return isset( $this->cache[$userId][$prop] )
-                       ? $this->cache[$userId][$prop]
-                       : false; // user does not exist?
+               return $this->cache[$userId][$prop] ?? false; // user does not exist?
        }
 
        /**
index ac029a2..d7e9052 100644 (file)
@@ -236,7 +236,7 @@ class ChangesList extends ContextSource {
                                $flagInfos[$key]['letter'] = $value['letter'];
                                $flagInfos[$key]['title'] = $value['title'];
                                // Allow customized class name, fall back to flag name
-                               $flagInfos[$key]['class'] = isset( $value['class'] ) ? $value['class'] : $key;
+                               $flagInfos[$key]['class'] = $value['class'] ?? $key;
                        }
                }
 
@@ -646,7 +646,7 @@ class ChangesList extends ContextSource {
                                        'id' => $rc->mAttribs['rc_this_oldid'],
                                        'user' => $rc->mAttribs['rc_user'],
                                        'user_text' => $rc->mAttribs['rc_user_text'],
-                                       'actor' => isset( $rc->mAttribs['rc_actor'] ) ? $rc->mAttribs['rc_actor'] : null,
+                                       'actor' => $rc->mAttribs['rc_actor'] ?? null,
                                        'deleted' => $rc->mAttribs['rc_deleted']
                                ] );
                                $s .= ' ' . Linker::generateRollback( $rev, $this->getContext() );
index 3e2c464..9d30537 100644 (file)
@@ -322,7 +322,7 @@ abstract class ChangesListFilterGroup {
         * @return ChangesListFilter|null Specified filter, or null if it is not registered
         */
        public function getFilter( $name ) {
-               return isset( $this->filters[$name] ) ? $this->filters[$name] : null;
+               return $this->filters[$name] ?? null;
        }
 
        /**
@@ -358,7 +358,7 @@ abstract class ChangesListFilterGroup {
                }
 
                usort( $this->filters, function ( $a, $b ) {
-                       return $b->getPriority() - $a->getPriority();
+                       return $b->getPriority() <=> $a->getPriority();
                } );
 
                foreach ( $this->filters as $filterName => $filter ) {
index 6c7666f..bad5c5a 100644 (file)
@@ -203,8 +203,7 @@ class EnhancedChangesList extends ChangesList {
                # Default values for RC flags
                $collectedRcFlags = [];
                foreach ( $recentChangesFlags as $key => $value ) {
-                       $flagGrouping = ( isset( $recentChangesFlags[$key]['grouping'] ) ?
-                                       $recentChangesFlags[$key]['grouping'] : 'any' );
+                       $flagGrouping = ( $recentChangesFlags[$key]['grouping'] ?? 'any' );
                        switch ( $flagGrouping ) {
                                case 'all':
                                        $collectedRcFlags[$key] = true;
@@ -277,8 +276,7 @@ class EnhancedChangesList extends ChangesList {
 
                        // Roll up flags
                        foreach ( $line['recentChangesFlagsRaw'] as $key => $value ) {
-                               $flagGrouping = ( isset( $recentChangesFlags[$key]['grouping'] ) ?
-                                       $recentChangesFlags[$key]['grouping'] : 'any' );
+                               $flagGrouping = ( $recentChangesFlags[$key]['grouping'] ?? 'any' );
                                switch ( $flagGrouping ) {
                                        case 'all':
                                                if ( !$value ) {
index cc9532e..60fe850 100644 (file)
@@ -420,9 +420,9 @@ class RecentChange {
 
                # Convert mAttribs['rc_user'] etc for ActorMigration
                $user = User::newFromAnyId(
-                       isset( $row['rc_user'] ) ? $row['rc_user'] : null,
-                       isset( $row['rc_user_text'] ) ? $row['rc_user_text'] : null,
-                       isset( $row['rc_actor'] ) ? $row['rc_actor'] : null
+                       $row['rc_user'] ?? null,
+                       $row['rc_user_text'] ?? null,
+                       $row['rc_actor'] ?? null
                );
                unset( $row['rc_user'], $row['rc_user_text'], $row['rc_actor'] );
                $row += ActorMigration::newMigration()->getInsertValues( $dbw, 'rc_user', $user );
@@ -1024,7 +1024,7 @@ class RecentChange {
         */
        public function getParam( $name ) {
                $params = $this->parseParams();
-               return isset( $params[$name] ) ? $params[$name] : null;
+               return $params[$name] ?? null;
        }
 
        /**
@@ -1055,9 +1055,9 @@ class RecentChange {
                $this->mAttribs['rc_comment_data'] = null;
 
                $user = User::newFromAnyId(
-                       isset( $this->mAttribs['rc_user'] ) ? $this->mAttribs['rc_user'] : null,
-                       isset( $this->mAttribs['rc_user_text'] ) ? $this->mAttribs['rc_user_text'] : null,
-                       isset( $this->mAttribs['rc_actor'] ) ? $this->mAttribs['rc_actor'] : null
+                       $this->mAttribs['rc_user'] ?? null,
+                       $this->mAttribs['rc_user_text'] ?? null,
+                       $this->mAttribs['rc_actor'] ?? null
                );
                $this->mAttribs['rc_user'] = $user->getId();
                $this->mAttribs['rc_user_text'] = $user->getName();
@@ -1078,9 +1078,9 @@ class RecentChange {
 
                if ( $name === 'rc_user' || $name === 'rc_user_text' || $name === 'rc_actor' ) {
                        $user = User::newFromAnyId(
-                               isset( $this->mAttribs['rc_user'] ) ? $this->mAttribs['rc_user'] : null,
-                               isset( $this->mAttribs['rc_user_text'] ) ? $this->mAttribs['rc_user_text'] : null,
-                               isset( $this->mAttribs['rc_actor'] ) ? $this->mAttribs['rc_actor'] : null
+                               $this->mAttribs['rc_user'] ?? null,
+                               $this->mAttribs['rc_user_text'] ?? null,
+                               $this->mAttribs['rc_actor'] ?? null
                        );
                        if ( $name === 'rc_user' ) {
                                return $user->getId();
@@ -1093,7 +1093,7 @@ class RecentChange {
                        }
                }
 
-               return isset( $this->mAttribs[$name] ) ? $this->mAttribs[$name] : null;
+               return $this->mAttribs[$name] ?? null;
        }
 
        /**
index b64f85a..429a3b6 100644 (file)
@@ -1268,7 +1268,7 @@ class ChangeTags {
 
                // store the tag usage statistics
                $tagUsage = self::tagUsageStatistics();
-               $hitcount = isset( $tagUsage[$tag] ) ? $tagUsage[$tag] : 0;
+               $hitcount = $tagUsage[$tag] ?? 0;
 
                // do it!
                $deleteResult = self::deleteTagEverywhere( $tag );
index 3388860..a531cd1 100644 (file)
@@ -73,7 +73,7 @@ class SquidPurgeClient {
        public function __construct( $server, $options = [] ) {
                $parts = explode( ':', $server, 2 );
                $this->host = $parts[0];
-               $this->port = isset( $parts[1] ) ? $parts[1] : 80;
+               $this->port = $parts[1] ?? 80;
        }
 
        /**
index d6ab0ff..d92c215 100644 (file)
@@ -94,7 +94,7 @@ class IcuCollation extends Collation {
                'af' => [],
                'am' => [],
                'ar' => [],
-               'as' => [ "\xe0\xa6\x82", "\xe0\xa6\x81", "\xe0\xa6\x83", "\xe0\xa7\x8e", "ক্ষ " ],
+               'as' => [ "\u{0982}", "\u{0981}", "\u{0983}", "\u{09CE}", "ক্ষ " ],
                'ast' => [ "Ch", "Ll", "Ñ" ], // not in libicu
                'az' => [ "Ç", "Ə", "Ğ", "İ", "Ö", "Ş", "Ü" ],
                'be' => [ "Ё" ],
@@ -144,11 +144,11 @@ class IcuCollation extends Collation {
                'ga' => [],
                'gd' => [], // not in libicu
                'gl' => [ "Ch", "Ll", "Ñ" ],
-               'gu' => [ "\xe0\xaa\x82", "\xe0\xaa\x83", "\xe0\xaa\x81", "\xe0\xaa\xb3" ],
+               'gu' => [ "\u{0A82}", "\u{0A83}", "\u{0A81}", "\u{0AB3}" ],
                'ha' => [ 'Ɓ', 'Ɗ', 'Ƙ', 'Sh', 'Ts', 'Ƴ' ],
                'haw' => [ 'ʻ' ],
                'he' => [],
-               'hi' => [ "\xe0\xa4\x82", "\xe0\xa4\x83" ],
+               'hi' => [ "\u{0902}", "\u{0903}" ],
                'hr' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
                'hsb' => [ "Č", "Dź", "Ě", "Ch", "Ł", "Ń", "Ř", "Š", "Ć", "Ž" ],
                'hu' => [ "Cs", "Dz", "Dzs", "Gy", "Ly", "Ny", "Ö", "Sz", "Ty", "Ü", "Zs" ],
@@ -161,13 +161,13 @@ class IcuCollation extends Collation {
                'kk' => [ "Ү", "І" ],
                'kl' => [ "Æ", "Ø", "Å" ],
                'km' => [
-                       "រ", "ឫ", "ឬ", "ល", "ឭ", "ឮ", "\xe1\x9e\xbb\xe1\x9f\x86",
-                       "\xe1\x9f\x86", "\xe1\x9e\xb6\xe1\x9f\x86", "\xe1\x9f\x87",
-                       "\xe1\x9e\xb7\xe1\x9f\x87", "\xe1\x9e\xbb\xe1\x9f\x87",
-                       "\xe1\x9f\x81\xe1\x9f\x87", "\xe1\x9f\x84\xe1\x9f\x87",
+                       "រ", "ឫ", "ឬ", "ល", "ឭ", "ឮ", "\u{17BB}\u{17C6}",
+                       "\u{17C6}", "\u{17B6}\u{17C6}", "\u{17C7}",
+                       "\u{17B7}\u{17C7}", "\u{17BB}\u{17C7}",
+                       "\u{17C1}\u{17C7}", "\u{17C4}\u{17C7}",
                ],
-               'kn' => [ "\xe0\xb2\x81", "\xe0\xb2\x83", "\xe0\xb3\xb1", "\xe0\xb3\xb2" ],
-               'kok' => [ "\xe0\xa4\x82", "\xe0\xa4\x83", "ळ", "क्ष" ],
+               'kn' => [ "\u{0C81}", "\u{0C83}", "\u{0CF1}", "\u{0CF2}" ],
+               'kok' => [ "\u{0902}", "\u{0903}", "ळ", "क्ष" ],
                'ku' => [ "Ç", "Ê", "Î", "Ş", "Û" ], // not in libicu
                'ky' => [ "Ё" ],
                'la' => [], // not in libicu
@@ -181,7 +181,7 @@ class IcuCollation extends Collation {
                'ml' => [],
                'mn' => [],
                'mo' => [ "Ă", "Â", "Î", "Ș", "Ț" ], // not in libicu
-               'mr' => [ "\xe0\xa4\x82", "\xe0\xa4\x83", "ळ", "क्ष", "ज्ञ" ],
+               'mr' => [ "\u{0902}", "\u{0903}", "ळ", "क्ष", "ज्ञ" ],
                'ms' => [],
                'mt' => [ "Ċ", "Ġ", "Għ", "Ħ", "Ż" ],
                'nb' => [ "Æ", "Ø", "Å" ],
@@ -191,8 +191,8 @@ class IcuCollation extends Collation {
                'no' => [ "Æ", "Ø", "Å" ], // not in libicu. You should probably use nb or nn instead.
                'oc' => [], // not in libicu
                'om' => [ 'Ch', 'Dh', 'Kh', 'Ny', 'Ph', 'Sh' ],
-               'or' => [ "\xe0\xac\x81", "\xe0\xac\x82", "\xe0\xac\x83", "କ୍ଷ" ],
-               'pa' => [ "\xe0\xa9\x8d" ],
+               'or' => [ "\u{0B01}", "\u{0B02}", "\u{0B03}", "କ୍ଷ" ],
+               'pa' => [ "\u{0A4D}" ],
                'pl' => [ "Ą", "Ć", "Ę", "Ł", "Ń", "Ó", "Ś", "Ź", "Ż" ],
                'pt' => [],
                'rm' => [], // not in libicu
@@ -204,7 +204,7 @@ class IcuCollation extends Collation {
                        'Á', 'Č', 'Ʒ', 'Ǯ', 'Đ', 'Ǧ', 'Ǥ', 'Ǩ', 'Ŋ',
                        'Š', 'Ŧ', 'Ž', 'Ø', 'Æ', 'Ȧ', 'Ä', 'Ö'
                ],
-               'si' => [ "\xe0\xb6\x82", "\xe0\xb6\x83", "\xe0\xb6\xa4" ],
+               'si' => [ "\u{0D82}", "\u{0D83}", "\u{0DA4}" ],
                'sk' => [ "Ä", "Č", "Ch", "Ô", "Š", "Ž" ],
                'sl' => [ "Č", "Š", "Ž" ],
                'smn' => [ "Á", "Č", "Đ", "Ŋ", "Š", "Ŧ", "Ž", "Æ", "Ø", "Å", "Ä", "Ö" ],
@@ -215,12 +215,12 @@ class IcuCollation extends Collation {
                'sv@collation=standard' => [ "Å", "Ä", "Ö" ],
                'sw' => [],
                'ta' => [
-                       "\xE0\xAE\x82", "ஃ", "க்ஷ", "க்", "ங்", "ச்", "ஞ்", "ட்", "ண்", "த்", "ந்",
+                       "\u{0B82}", "ஃ", "க்ஷ", "க்", "ங்", "ச்", "ஞ்", "ட்", "ண்", "த்", "ந்",
                        "ப்", "ம்", "ய்", "ர்", "ல்", "வ்", "ழ்", "ள்", "ற்", "ன்", "ஜ்", "ஶ்", "ஷ்",
                        "ஸ்", "ஹ்", "க்ஷ்"
                ],
-               'te' => [ "\xe0\xb0\x81", "\xe0\xb0\x82", "\xe0\xb0\x83" ],
-               'th' => [ "ฯ", "\xe0\xb9\x86", "\xe0\xb9\x8d", "\xe0\xb8\xba" ],
+               'te' => [ "\u{0C01}", "\u{0C02}", "\u{0C03}" ],
+               'th' => [ "ฯ", "\u{0E46}", "\u{0E4D}", "\u{0E3A}" ],
                'tk' => [ "Ç", "Ä", "Ž", "Ň", "Ö", "Ş", "Ü", "Ý" ],
                'tl' => [ "Ñ", "Ng" ], // not in libicu
                'to' => [ "Ng", "ʻ" ],
@@ -231,8 +231,8 @@ class IcuCollation extends Collation {
                'vi' => [ "Ă", "Â", "Đ", "Ê", "Ô", "Ơ", "Ư" ],
                'vo' => [ "Ä", "Ö", "Ü" ],
                'yi' => [
-                       "\xd7\x91\xd6\xbf", "\xd7\x9b\xd6\xbc", "\xd7\xa4\xd6\xbc",
-                       "\xd7\xa9\xd7\x82", "\xd7\xaa\xd6\xbc"
+                       "\u{05D1}\u{05BF}", "\u{05DB}\u{05BC}", "\u{05E4}\u{05BC}",
+                       "\u{05E9}\u{05C2}", "\u{05EA}\u{05BC}"
                ],
                'yo' => [ "Ẹ", "Gb", "Ọ", "Ṣ" ],
                'zu' => [],
@@ -390,8 +390,7 @@ class IcuCollation extends Collation {
                                wfDebug( "Primary collision '$letter' '{$letterMap[$key]}' (comparison: $comp)\n" );
                                // If that also has a collision, use codepoint as a tiebreaker.
                                if ( $comp === 0 ) {
-                                       // TODO Use <=> operator when PHP 7 is allowed.
-                                       $comp = UtfNormal\Utils::utf8ToCodepoint( $letter ) -
+                                       $comp = UtfNormal\Utils::utf8ToCodepoint( $letter ) <=>
                                                UtfNormal\Utils::utf8ToCodepoint( $letterMap[$key] );
                                }
                                if ( $comp < 0 ) {
diff --git a/includes/compat/ScopedCallback.php b/includes/compat/ScopedCallback.php
deleted file mode 100644 (file)
index 4fd4bc7..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * Compatibility class for pre-namespace, pre-library class name
- *
- * 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
- */
-
-/**
- * @deprecated since 1.28 use Wikimedia\ScopedCallback
- *
- * @since 1.21
- */
-class ScopedCallback extends Wikimedia\ScopedCallback {
-}
diff --git a/includes/compat/XMPReader.php b/includes/compat/XMPReader.php
new file mode 100644 (file)
index 0000000..5854842
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Back-compat for pre-librarized XMP 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.
+ */
+
+use Wikimedia\XMPReader\Info;
+use Wikimedia\XMPReader\Reader;
+use Wikimedia\XMPReader\Validate;
+
+/**
+ * @deprecated since 1.32
+ */
+class XMPInfo extends Info {
+}
+
+/**
+ * @deprecated since 1.32
+ */
+class XMPReader extends Reader {
+}
+
+/**
+ * @deprecated since 1.32
+ */
+class XMPValidate extends Validate {
+}
index ec27ad1..670ba39 100644 (file)
@@ -179,9 +179,7 @@ class MonologSpi implements Spi {
                if ( !isset( $this->singletons['loggers'][$channel] ) ) {
                        // Fallback to using the '@default' configuration if an explict
                        // configuration for the requested channel isn't found.
-                       $spec = isset( $this->config['loggers'][$channel] ) ?
-                               $this->config['loggers'][$channel] :
-                               $this->config['loggers']['@default'];
+                       $spec = $this->config['loggers'][$channel] ?? $this->config['loggers']['@default'];
 
                        $monolog = $this->createLogger( $channel, $spec );
                        $this->singletons['loggers'][$channel] = $monolog;
index cdc4da3..62d45d4 100644 (file)
@@ -164,7 +164,7 @@ class LineFormatter extends MonologLineFormatter {
                                                );
                                }
 
-                               $prev = isset( $prev['previous'] ) ? $prev['previous'] : null;
+                               $prev = $prev['previous'] ?? null;
                        }
                }
                return $str;
index 5edb4b2..45a6baf 100644 (file)
@@ -128,7 +128,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
        public function getSlave( $cluster ) {
                global $wgDefaultExternalStore;
 
-               $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+               $wiki = $this->params['wiki'] ?? false;
                $lb = $this->getLoadBalancer( $cluster );
 
                if ( !in_array( "DB://" . $cluster, (array)$wgDefaultExternalStore ) ) {
@@ -151,7 +151,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * @return MaintainableDBConnRef
         */
        public function getMaster( $cluster ) {
-               $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : false;
+               $wiki = $this->params['wiki'] ?? false;
                $lb = $this->getLoadBalancer( $cluster );
 
                $db = $lb->getMaintenanceConnectionRef( DB_MASTER, [], $wiki );
@@ -301,7 +301,7 @@ class ExternalStoreDB extends ExternalStoreMedium {
                return [
                        $path[2], // cluster
                        $path[3], // id
-                       isset( $path[4] ) ? $path[4] : false // itemID
+                       $path[4] ?? false // itemID
                ];
        }
 }
index 5d7155e..c5893be 100644 (file)
@@ -81,7 +81,7 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
                        // Make sure ID is roughly lexicographically increasing for performance
                        $id = str_pad( UIDGenerator::newTimestampedUID128( 32 ), 26, '0', STR_PAD_LEFT );
                        // Segregate items by wiki ID for the sake of bookkeeping
-                       $wiki = isset( $this->params['wiki'] ) ? $this->params['wiki'] : wfWikiID();
+                       $wiki = $this->params['wiki'] ?? wfWikiID();
 
                        $url = $be->getContainerStoragePath( 'data' ) . '/' . rawurlencode( $wiki );
                        $url .= ( $be instanceof FSFileBackend )
index 454b633..dc6dbe8 100644 (file)
@@ -79,15 +79,9 @@ class FileBackendGroup {
                        $repoName = $info['name'];
                        // Local vars that used to be FSRepo members...
                        $directory = $info['directory'];
-                       $deletedDir = isset( $info['deletedDir'] )
-                               ? $info['deletedDir']
-                               : false; // deletion disabled
-                       $thumbDir = isset( $info['thumbDir'] )
-                               ? $info['thumbDir']
-                               : "{$directory}/thumb";
-                       $transcodedDir = isset( $info['transcodedDir'] )
-                               ? $info['transcodedDir']
-                               : "{$directory}/transcoded";
+                       $deletedDir = $info['deletedDir'] ?? false; // deletion disabled
+                       $thumbDir = $info['thumbDir'] ?? "{$directory}/thumb";
+                       $transcodedDir = $info['transcodedDir'] ?? "{$directory}/transcoded";
                        // Get the FS backend configuration
                        $autoBackends[] = [
                                'name' => $backendName,
@@ -100,7 +94,7 @@ class FileBackendGroup {
                                        "{$repoName}-deleted" => $deletedDir,
                                        "{$repoName}-temp" => "{$directory}/temp"
                                ],
-                               'fileMode' => isset( $info['fileMode'] ) ? $info['fileMode'] : 0644,
+                               'fileMode' => $info['fileMode'] ?? 0644,
                                'directoryMode' => $wgDirectoryMode,
                        ];
                }
index b15f81f..89bb81a 100644 (file)
@@ -171,30 +171,20 @@ class FileRepo {
                }
 
                // Optional settings that have a default
-               $this->initialCapital = isset( $info['initialCapital'] )
-                       ? $info['initialCapital']
-                       : MWNamespace::isCapitalized( NS_FILE );
-               $this->url = isset( $info['url'] )
-                       ? $info['url']
-                       : false; // a subclass may set the URL (e.g. ForeignAPIRepo)
+               $this->initialCapital = $info['initialCapital'] ?? MWNamespace::isCapitalized( NS_FILE );
+               $this->url = $info['url'] ?? false; // a subclass may set the URL (e.g. ForeignAPIRepo)
                if ( isset( $info['thumbUrl'] ) ) {
                        $this->thumbUrl = $info['thumbUrl'];
                } else {
                        $this->thumbUrl = $this->url ? "{$this->url}/thumb" : false;
                }
-               $this->hashLevels = isset( $info['hashLevels'] )
-                       ? $info['hashLevels']
-                       : 2;
-               $this->deletedHashLevels = isset( $info['deletedHashLevels'] )
-                       ? $info['deletedHashLevels']
-                       : $this->hashLevels;
+               $this->hashLevels = $info['hashLevels'] ?? 2;
+               $this->deletedHashLevels = $info['deletedHashLevels'] ?? $this->hashLevels;
                $this->transformVia404 = !empty( $info['transformVia404'] );
-               $this->abbrvThreshold = isset( $info['abbrvThreshold'] )
-                       ? $info['abbrvThreshold']
-                       : 255;
+               $this->abbrvThreshold = $info['abbrvThreshold'] ?? 255;
                $this->isPrivate = !empty( $info['isPrivate'] );
                // Give defaults for the basic zones...
-               $this->zones = isset( $info['zones'] ) ? $info['zones'] : [];
+               $this->zones = $info['zones'] ?? [];
                foreach ( [ 'public', 'thumb', 'transcoded', 'temp', 'deleted' ] as $zone ) {
                        if ( !isset( $this->zones[$zone]['container'] ) ) {
                                $this->zones[$zone]['container'] = "{$this->name}-{$zone}";
@@ -428,7 +418,7 @@ class FileRepo {
                if ( isset( $options['bypassCache'] ) ) {
                        $options['latest'] = $options['bypassCache']; // b/c
                }
-               $time = isset( $options['time'] ) ? $options['time'] : false;
+               $time = $options['time'] ?? false;
                $flags = !empty( $options['latest'] ) ? File::READ_LATEST : 0;
                # First try the current version of the file to see if it precedes the timestamp
                $img = $this->newFile( $title );
@@ -534,7 +524,7 @@ class FileRepo {
         * @return File|bool False on failure
         */
        public function findFileFromKey( $sha1, $options = [] ) {
-               $time = isset( $options['time'] ) ? $options['time'] : false;
+               $time = $options['time'] ?? false;
                # First try to find a matching current version of a file...
                if ( !$this->fileFactoryKey ) {
                        return false; // find-by-sha1 not supported
@@ -690,7 +680,7 @@ class FileRepo {
         */
        public function getTempHashPath( $suffix ) {
                $parts = explode( '!', $suffix, 2 ); // format is <timestamp>!<name> or just <name>
-               $name = isset( $parts[1] ) ? $parts[1] : $suffix; // hash path is not based on timestamp
+               $name = $parts[1] ?? $suffix; // hash path is not based on timestamp
                return self::getHashPathForLevel( $name, $this->hashLevels );
        }
 
@@ -1225,7 +1215,7 @@ class FileRepo {
                        list( $src, $dstRel, $archiveRel ) = $ntuple;
                        $srcPath = ( $src instanceof FSFile ) ? $src->getPath() : $src;
 
-                       $options = isset( $ntuple[3] ) ? $ntuple[3] : [];
+                       $options = $ntuple[3] ?? [];
                        // Resolve source to a storage path if virtual
                        $srcPath = $this->resolveToStoragePath( $srcPath );
                        if ( !$this->validateFilename( $dstRel ) ) {
@@ -1250,7 +1240,7 @@ class FileRepo {
                        }
 
                        // Set any desired headers to be use in GET/HEAD responses
-                       $headers = isset( $options['headers'] ) ? $options['headers'] : [];
+                       $headers = $options['headers'] ?? [];
 
                        // Archive destination file if it exists.
                        // This will check if the archive file also exists and fail if does.
index cba21c8..c20df76 100644 (file)
@@ -75,7 +75,7 @@ class ForeignAPIRepo extends FileRepo {
                parent::__construct( $info );
 
                // https://commons.wikimedia.org/w/api.php
-               $this->mApiBase = isset( $info['apibase'] ) ? $info['apibase'] : null;
+               $this->mApiBase = $info['apibase'] ?? null;
 
                if ( isset( $info['apiThumbCacheExpiry'] ) ) {
                        $this->apiThumbCacheExpiry = $info['apiThumbCacheExpiry'];
index b797790..0056181 100644 (file)
@@ -140,7 +140,7 @@ class RepoGroup {
                        && empty( $options['private'] )
                        && empty( $options['latest'] )
                ) {
-                       $time = isset( $options['time'] ) ? $options['time'] : '';
+                       $time = $options['time'] ?? '';
                        if ( $this->cache->has( $dbkey, $time, 60 ) ) {
                                return $this->cache->get( $dbkey, $time );
                        }
index 7c87af3..546b78a 100644 (file)
@@ -933,7 +933,7 @@ abstract class File implements IDBAccessObject {
         */
        function getUnscaledThumb( $handlerParams = [] ) {
                $hp =& $handlerParams;
-               $page = isset( $hp['page'] ) ? $hp['page'] : false;
+               $page = $hp['page'] ?? false;
                $width = $this->getWidth( $page );
                if ( !$width ) {
                        return $this->iconThumb();
index 1002b82..0e48195 100644 (file)
@@ -128,8 +128,8 @@ class ForeignAPIFile extends File {
                // Note, the this->canRender() check above implies
                // that we have a handler, and it can do makeParamString.
                $otherParams = $this->handler->makeParamString( $params );
-               $width = isset( $params['width'] ) ? $params['width'] : -1;
-               $height = isset( $params['height'] ) ? $params['height'] : -1;
+               $width = $params['width'] ?? -1;
+               $height = $params['height'] ?? -1;
 
                $thumbUrl = $this->repo->getThumbUrlFromCache(
                        $this->getName(),
@@ -311,9 +311,7 @@ class ForeignAPIFile extends File {
         * @return bool|string
         */
        function getDescriptionUrl() {
-               return isset( $this->mInfo['descriptionurl'] )
-                       ? $this->mInfo['descriptionurl']
-                       : false;
+               return $this->mInfo['descriptionurl'] ?? false;
        }
 
        /**
index 1702264..adad9ad 100644 (file)
@@ -583,9 +583,9 @@ class LocalFile extends File {
                        ->getComment( 'description', (object)$decoded )->text;
 
                $decoded['user'] = User::newFromAnyId(
-                       isset( $decoded['user'] ) ? $decoded['user'] : null,
-                       isset( $decoded['user_text'] ) ? $decoded['user_text'] : null,
-                       isset( $decoded['actor'] ) ? $decoded['actor'] : null
+                       $decoded['user'] ?? null,
+                       $decoded['user_text'] ?? null,
+                       $decoded['actor'] ?? null
                );
                unset( $decoded['user_text'], $decoded['actor'] );
 
@@ -772,9 +772,9 @@ class LocalFile extends File {
 
                if ( isset( $info['user'] ) || isset( $info['user_text'] ) || isset( $info['actor'] ) ) {
                        $this->user = User::newFromAnyId(
-                               isset( $info['user'] ) ? $info['user'] : null,
-                               isset( $info['user_text'] ) ? $info['user_text'] : null,
-                               isset( $info['actor'] ) ? $info['actor'] : null
+                               $info['user'] ?? null,
+                               $info['user_text'] ?? null,
+                               $info['actor'] ?? null
                        );
                }
 
index cd6aab0..a87322d 100644 (file)
@@ -35,7 +35,7 @@ class TraditionalImageGallery extends ImageGalleryBase {
        function toHTML() {
                if ( $this->mPerRow > 0 ) {
                        $maxwidth = $this->mPerRow * ( $this->mWidths + $this->getAllPadding() );
-                       $oldStyle = isset( $this->mAttribs['style'] ) ? $this->mAttribs['style'] : '';
+                       $oldStyle = $this->mAttribs['style'] ?? '';
                        # _width is ignored by any sane browser. IE6 doesn't know max-width
                        # so it uses _width instead
                        $this->mAttribs['style'] = "max-width: {$maxwidth}px;_width: {$maxwidth}px;" .
index 043e0f6..785d30f 100644 (file)
@@ -333,9 +333,7 @@ class HTMLForm extends ContextSource {
                $this->mFlatFields = [];
 
                foreach ( $descriptor as $fieldname => $info ) {
-                       $section = isset( $info['section'] )
-                               ? $info['section']
-                               : '';
+                       $section = $info['section'] ?? '';
 
                        if ( isset( $info['type'] ) && $info['type'] === 'file' ) {
                                $this->mUseMultipart = true;
@@ -805,7 +803,7 @@ class HTMLForm extends ContextSource {
                if ( $section === null ) {
                        return $this->mHeader;
                } else {
-                       return isset( $this->mSectionHeaders[$section] ) ? $this->mSectionHeaders[$section] : '';
+                       return $this->mSectionHeaders[$section] ?? '';
                }
        }
 
@@ -860,7 +858,7 @@ class HTMLForm extends ContextSource {
                if ( $section === null ) {
                        return $this->mFooter;
                } else {
-                       return isset( $this->mSectionFooters[$section] ) ? $this->mSectionFooters[$section] : '';
+                       return $this->mSectionFooters[$section] ?? '';
                }
        }
 
@@ -959,8 +957,8 @@ class HTMLForm extends ContextSource {
                        $data = [
                                'name' => $args[0],
                                'value' => $args[1],
-                               'id' => isset( $args[2] ) ? $args[2] : null,
-                               'attribs' => isset( $args[3] ) ? $args[3] : null,
+                               'id' => $args[2] ?? null,
+                               'attribs' => $args[3] ?? null,
                        ];
                } else {
                        if ( !isset( $data['name'] ) ) {
index 2830b9c..fbef265 100644 (file)
@@ -13,8 +13,8 @@ trait HTMLFormElement {
 
        public function initializeHTMLFormElement( array $config = [] ) {
                // Properties
-               $this->hideIf = isset( $config['hideIf'] ) ? $config['hideIf'] : null;
-               $this->modules = isset( $config['modules'] ) ? $config['modules'] : [];
+               $this->hideIf = $config['hideIf'] ?? null;
+               $this->modules = $config['modules'] ?? [];
 
                // Initialization
                if ( $this->hideIf ) {
index 5066f28..cd4d4b7 100644 (file)
@@ -546,8 +546,7 @@ abstract class HTMLFormField {
                        'mw-htmlform-nolabel' => ( $label === '' )
                ];
 
-               $horizontalLabel = isset( $this->mParams['horizontal-label'] )
-                       ? $this->mParams['horizontal-label'] : false;
+               $horizontalLabel = $this->mParams['horizontal-label'] ?? false;
 
                if ( $horizontalLabel ) {
                        $field = '&#160;' . $inputHtml . "\n$errors";
@@ -950,8 +949,7 @@ abstract class HTMLFormField {
 
                $displayFormat = $this->mParent->getDisplayFormat();
                $html = '';
-               $horizontalLabel = isset( $this->mParams['horizontal-label'] )
-                       ? $this->mParams['horizontal-label'] : false;
+               $horizontalLabel = $this->mParams['horizontal-label'] ?? false;
 
                if ( $displayFormat === 'table' ) {
                        $html =
index dfe6a8a..e7bdb44 100644 (file)
@@ -56,7 +56,7 @@ class HTMLExpiryField extends HTMLFormField {
                        $this->relativeField->getInputOOUI( $value ),
                        [
                                'id' => $this->mID,
-                               'required' => isset( $this->mParams['required'] ) ? $this->mParams['required'] : false,
+                               'required' => $this->mParams['required'] ?? false,
                        ]
                );
        }
index d2d54e2..72381f0 100644 (file)
@@ -5,7 +5,7 @@
  */
 class HTMLFloatField extends HTMLTextField {
        public function getSize() {
-               return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 20;
+               return $this->mParams['size'] ?? 20;
        }
 
        public function validate( $value, $alldata ) {
index 53c6835..6beb996 100644 (file)
@@ -273,9 +273,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
         * @return string
         */
        protected function getInputHTMLForKey( $key, array $values ) {
-               $displayFormat = isset( $this->mParams['format'] )
-                       ? $this->mParams['format']
-                       : $this->mParent->getDisplayFormat();
+               $displayFormat = $this->mParams['format'] ?? $this->mParent->getDisplayFormat();
 
                // Conveniently, PHP method names are case-insensitive.
                $getFieldHtmlMethod = $displayFormat == 'table' ? 'getTableRow' : ( 'get' . $displayFormat );
@@ -306,9 +304,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
 
                if ( !isset( $fields['delete'] ) ) {
                        $name = "{$this->mName}[$key][delete]";
-                       $label = isset( $this->mParams['delete-button-message'] )
-                               ? $this->mParams['delete-button-message']
-                               : 'htmlform-cloner-delete';
+                       $label = $this->mParams['delete-button-message'] ?? 'htmlform-cloner-delete';
                        $field = HTMLForm::loadInputFromParameters( $name, [
                                'type' => 'submit',
                                'formnovalidate' => true,
@@ -379,9 +375,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                ], $html );
 
                $name = "{$this->mName}[create]";
-               $label = isset( $this->mParams['create-button-message'] )
-                       ? $this->mParams['create-button-message']
-                       : 'htmlform-cloner-create';
+               $label = $this->mParams['create-button-message'] ?? 'htmlform-cloner-create';
                $field = HTMLForm::loadInputFromParameters( $name, [
                        'type' => 'submit',
                        'formnovalidate' => true,
index 610b509..a4d9bca 100644 (file)
@@ -126,8 +126,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        'or' => false,
                        'classes' => [ 'mw-htmlform-select-and-other-field' ],
                        'data' => [
-                               'maxlengthUnit' => isset( $this->mParams['maxlength-unit'] )
-                                       ? $this->mParams['maxlength-unit'] : 'bytes'
+                               'maxlengthUnit' => $this->mParams['maxlength-unit'] ?? 'bytes'
                        ],
                ] );
        }
@@ -177,7 +176,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
        }
 
        public function getSize() {
-               return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
+               return $this->mParams['size'] ?? 45;
        }
 
        public function validate( $value, $alldata ) {
index fb133f2..91050a0 100644 (file)
@@ -12,9 +12,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
                $this->getOptions();
                if ( !in_array( 'other', $this->mOptions, true ) ) {
                        $msg =
-                               isset( $params['other'] )
-                                       ? $params['other']
-                                       : wfMessage( 'htmlform-selectorother-other' )->text();
+                               $params['other'] ?? wfMessage( 'htmlform-selectorother-other' )->text();
                        // Have 'other' always as first element
                        $this->mOptions = [ $msg => 'other' ] + $this->mOptions;
                }
index 145a0ec..bd96d3c 100644 (file)
@@ -10,7 +10,7 @@
  */
 class HTMLSizeFilterField extends HTMLIntField {
        public function getSize() {
-               return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 9;
+               return $this->mParams['size'] ?? 9;
        }
 
        public function getInputHTML( $value ) {
index 3370e4a..e9ed031 100644 (file)
@@ -29,15 +29,15 @@ class HTMLTextAreaField extends HTMLFormField {
        }
 
        public function getCols() {
-               return isset( $this->mParams['cols'] ) ? $this->mParams['cols'] : static::DEFAULT_COLS;
+               return $this->mParams['cols'] ?? static::DEFAULT_COLS;
        }
 
        public function getRows() {
-               return isset( $this->mParams['rows'] ) ? $this->mParams['rows'] : static::DEFAULT_ROWS;
+               return $this->mParams['rows'] ?? static::DEFAULT_ROWS;
        }
 
        public function getSpellCheck() {
-               $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
+               $val = $this->mParams['spellcheck'] ?? null;
                if ( is_bool( $val ) ) {
                        // "spellcheck" attribute literally requires "true" or "false" to work.
                        return $val === true ? 'true' : 'false';
index b2e4f2a..b51182a 100644 (file)
@@ -38,11 +38,11 @@ class HTMLTextField extends HTMLFormField {
        }
 
        public function getSize() {
-               return isset( $this->mParams['size'] ) ? $this->mParams['size'] : 45;
+               return $this->mParams['size'] ?? 45;
        }
 
        public function getSpellCheck() {
-               $val = isset( $this->mParams['spellcheck'] ) ? $this->mParams['spellcheck'] : null;
+               $val = $this->mParams['spellcheck'] ?? null;
                if ( is_bool( $val ) ) {
                        // "spellcheck" attribute literally requires "true" or "false" to work.
                        return $val === true ? 'true' : 'false';
@@ -107,7 +107,7 @@ class HTMLTextField extends HTMLFormField {
        }
 
        protected function getType( &$attribs ) {
-               $type = isset( $attribs['type'] ) ? $attribs['type'] : 'text';
+               $type = $attribs['type'] ?? 'text';
                unset( $attribs['type'] );
 
                # Implement tiny differences between some field variants
index 8991f5e..e5dacd7 100644 (file)
@@ -784,7 +784,7 @@ class WikiImporter {
                        } elseif ( $tag == 'revision' || $tag == 'upload' ) {
                                if ( !isset( $title ) ) {
                                        $title = $this->processTitle( $pageInfo['title'],
-                                               isset( $pageInfo['ns'] ) ? $pageInfo['ns'] : null );
+                                               $pageInfo['ns'] ?? null );
 
                                        // $title is either an array of two titles or false.
                                        if ( is_array( $title ) ) {
@@ -1015,7 +1015,7 @@ class WikiImporter {
         */
        private function processUpload( $pageInfo, $uploadInfo ) {
                $revision = new WikiRevision( $this->config );
-               $text = isset( $uploadInfo['text'] ) ? $uploadInfo['text'] : '';
+               $text = $uploadInfo['text'] ?? '';
 
                $revision->setTitle( $pageInfo['_title'] );
                $revision->setID( $pageInfo['id'] );
index 715f5df..2264b80 100644 (file)
@@ -38,7 +38,6 @@ class CliInstaller extends Installer {
                'dbpass' => 'wgDBpassword',
                'dbprefix' => 'wgDBprefix',
                'dbtableoptions' => 'wgDBTableOptions',
-               'dbmysql5' => 'wgDBmysql5',
                'dbport' => 'wgDBport',
                'dbschema' => 'wgDBmwschema',
                'dbpath' => 'wgSQLiteDataDir',
@@ -97,7 +96,7 @@ class CliInstaller extends Installer {
                        $this->setVar( '_InstallUser',
                                $option['installdbuser'] );
                        $this->setVar( '_InstallPassword',
-                               isset( $option['installdbpass'] ) ? $option['installdbpass'] : "" );
+                               $option['installdbpass'] ?? "" );
 
                        // Assume that if we're given the installer user, we'll create the account.
                        $this->setVar( '_CreateDBAccount', true );
index 99d7186..4fc04db 100644 (file)
@@ -779,6 +779,39 @@ abstract class DatabaseUpdater {
                return true;
        }
 
+       /**
+        * Add a new index to an existing table if none of the given indexes exist
+        *
+        * @param string $table Name of the table to modify
+        * @param string[] $indexes Name of the indexes to check. $indexes[0] should
+        *  be the one actually being added.
+        * @param string $patch Path to the patch file
+        * @param bool $fullpath Whether to treat $patch path as a relative or not
+        * @return bool False if this was skipped because schema changes are skipped
+        */
+       protected function addIndexIfNoneExist( $table, $indexes, $patch, $fullpath = false ) {
+               if ( !$this->doTable( $table ) ) {
+                       return true;
+               }
+
+               if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
+                       $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+                       return true;
+               }
+
+               $newIndex = $indexes[0];
+               foreach ( $indexes as $index ) {
+                       if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+                               $this->output(
+                                       "...skipping index $newIndex because index $index already set on $table table.\n"
+                               );
+                               return true;
+                       }
+               }
+
+               return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
+       }
+
        /**
         * Drop a field from an existing table
         *
index 284d5dd..f5fd3f2 100644 (file)
@@ -811,7 +811,7 @@ abstract class Installer {
                // with utf8 support, but not unicode property support.
                // check that \p{Zs} (space separators) matches
                // U+3000 (Ideographic space)
-               $regexprop = preg_replace( '/\p{Zs}/u', '', "-\xE3\x80\x80-" );
+               $regexprop = preg_replace( '/\p{Zs}/u', '', "-\u{3000}-" );
                Wikimedia\restoreWarnings();
                if ( $regexd != '--' || $regexprop != '--' ) {
                        $this->showError( 'config-pcre-no-utf8' );
@@ -1107,29 +1107,6 @@ abstract class Installer {
                return true;
        }
 
-       /**
-        * Convert a hex string representing a Unicode code point to that code point.
-        * @param string $c
-        * @return string|false
-        */
-       protected function unicodeChar( $c ) {
-               $c = hexdec( $c );
-               if ( $c <= 0x7F ) {
-                       return chr( $c );
-               } elseif ( $c <= 0x7FF ) {
-                       return chr( 0xC0 | $c >> 6 ) . chr( 0x80 | $c & 0x3F );
-               } elseif ( $c <= 0xFFFF ) {
-                       return chr( 0xE0 | $c >> 12 ) . chr( 0x80 | $c >> 6 & 0x3F ) .
-                               chr( 0x80 | $c & 0x3F );
-               } elseif ( $c <= 0x10FFFF ) {
-                       return chr( 0xF0 | $c >> 18 ) . chr( 0x80 | $c >> 12 & 0x3F ) .
-                               chr( 0x80 | $c >> 6 & 0x3F ) .
-                               chr( 0x80 | $c & 0x3F );
-               } else {
-                       return false;
-               }
-       }
-
        /**
         * Check the libicu version
         */
@@ -1141,8 +1118,8 @@ abstract class Installer {
                 * Note that we use the hex representation to create the code
                 * points in order to avoid any Unicode-destroying during transit.
                 */
-               $not_normal_c = $this->unicodeChar( "FA6C" );
-               $normal_c = $this->unicodeChar( "242EE" );
+               $not_normal_c = "\u{FA6C}";
+               $normal_c = "\u{242EE}";
 
                $useNormalizer = 'php';
                $needsUpdate = false;
index 44b4e30..cfa21f4 100644 (file)
@@ -136,6 +136,7 @@ class MssqlUpdater extends DatabaseUpdater {
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
                ];
        }
 
index 6256204..45f932a 100644 (file)
@@ -40,7 +40,6 @@ class MysqlInstaller extends DatabaseInstaller {
                'wgDBpassword',
                'wgDBprefix',
                'wgDBTableOptions',
-               'wgDBmysql5',
        ];
 
        protected $internalDefaults = [
@@ -414,20 +413,6 @@ class MysqlInstaller extends DatabaseInstaller {
                        $this->setVar( '_MysqlCharset', reset( $charsets ) );
                }
 
-               // Do charset selector
-               if ( count( $charsets ) >= 2 ) {
-                       // getRadioSet() builds a set of labeled radio buttons.
-                       // For grep: The following messages are used as the item labels:
-                       // config-mysql-binary, config-mysql-utf8
-                       $s .= $this->getRadioSet( [
-                               'var' => '_MysqlCharset',
-                               'label' => 'config-mysql-charset',
-                               'itemLabelPrefix' => 'config-mysql-',
-                               'values' => $charsets
-                       ] );
-                       $s .= $this->parent->getHelpBox( 'config-mysql-charset-help' );
-               }
-
                return $s;
        }
 
@@ -671,7 +656,6 @@ class MysqlInstaller extends DatabaseInstaller {
        }
 
        public function getLocalSettings() {
-               $dbmysql5 = wfBoolToStr( $this->getVar( 'wgDBmysql5', true ) );
                $prefix = LocalSettingsGenerator::escapePhpString( $this->getVar( 'wgDBprefix' ) );
                $tblOpts = LocalSettingsGenerator::escapePhpString( $this->getTableOptions() );
 
@@ -679,9 +663,6 @@ class MysqlInstaller extends DatabaseInstaller {
 \$wgDBprefix = \"{$prefix}\";
 
 # MySQL table options to use during installation or update
-\$wgDBTableOptions = \"{$tblOpts}\";
-
-# Experimental charset support for MySQL 5.0.
-\$wgDBmysql5 = {$dbmysql5};";
+\$wgDBTableOptions = \"{$tblOpts}\";";
        }
 }
index d70edea..f8114e3 100644 (file)
@@ -185,7 +185,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'doClFieldsUpdate' ],
                        [ 'addTable', 'module_deps', 'patch-module_deps.sql' ],
                        [ 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ],
-                       [ 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ],
+                       [ 'addIndexIfNoneExist',
+                               'archive', [ 'ar_revid', 'ar_revid_uniq' ], 'patch-archive_ar_revid.sql' ],
                        [ 'doLangLinksLengthUpdate' ],
 
                        // 1.18
@@ -356,6 +357,7 @@ class MysqlUpdater extends DatabaseUpdater {
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
                ];
        }
 
index 965187a..9d2fdc6 100644 (file)
@@ -153,6 +153,7 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'populateExternallinksIndex60' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
 
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
index 49419ea..dc1ffdb 100644 (file)
@@ -582,6 +582,8 @@ class PostgresUpdater extends DatabaseUpdater {
                                'change_tag_tag_id_id',
                                '( ct_tag_id, ct_rc_id, ct_rev_id, ct_log_id )'
                        ],
+                       [ 'addPgIndex', 'archive', 'ar_revid_uniq', '(ar_rev_id)', 'unique' ],
+                       [ 'dropPgIndex', 'archive', 'ar_revid' ], // Probably doesn't exist, but do it anyway.
                ];
        }
 
@@ -959,12 +961,13 @@ END;
                }
        }
 
-       public function addPgIndex( $table, $index, $type ) {
+       public function addPgIndex( $table, $index, $type, $unique = false ) {
                if ( $this->db->indexExists( $table, $index ) ) {
                        $this->output( "...index '$index' on table '$table' already exists\n" );
                } else {
                        $this->output( "Creating index '$index' on table '$table' $type\n" );
-                       $this->db->query( "CREATE INDEX $index ON $table $type" );
+                       $unique = $unique ? 'UNIQUE' : '';
+                       $this->db->query( "CREATE $unique INDEX $index ON $table $type" );
                }
        }
 
index 2b27d37..fd9179b 100644 (file)
@@ -68,7 +68,8 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ],
                        [ 'addTable', 'module_deps', 'patch-module_deps.sql' ],
                        [ 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ],
-                       [ 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ],
+                       [ 'addIndexIfNoneExist',
+                               'archive', [ 'ar_revid', 'ar_revid_uniq' ], 'patch-archive_ar_revid.sql' ],
 
                        // 1.18
                        [ 'addIndex', 'user', 'user_email', 'patch-user_email_index.sql' ],
@@ -220,6 +221,7 @@ class SqliteUpdater extends DatabaseUpdater {
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
                        [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
+                       [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
                ];
        }
 
index df68be8..0c7428f 100644 (file)
@@ -180,9 +180,7 @@ class WebInstallerExistingWiki extends WebInstallerPage {
 
                // Copy $wgAuthenticationTokenVersion too, if it exists
                $this->setVar( 'wgAuthenticationTokenVersion',
-                       isset( $vars['wgAuthenticationTokenVersion'] )
-                               ? $vars['wgAuthenticationTokenVersion']
-                               : null
+                       $vars['wgAuthenticationTokenVersion'] ?? null
                );
 
                return $status;
index 58c6b72..c74f637 100644 (file)
@@ -75,9 +75,6 @@
        "config-mysql-engine": "Stoor-enjin:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Karakterstelsel vir databasis:",
-       "config-mysql-binary": "Binêr",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Naam van die wiki:",
        "config-site-name-blank": "Verskaf 'n naam vir u webwerf.",
        "config-project-namespace": "Projeknaamruimte:",
index b8a2f8f..cb6051f 100644 (file)
        "config-mysql-myisam-dep": "<strong>تحذير:</strong> لقد اخترت MyISAM كمحرك تخزين لـMySQL، والذي لا يُنصَح باستخدامه مع ميدياويكي; لأنه:\n* بالكاد يدعم التزامن بسبب قفل الجدول \n* أكثر عرضة للفساد من المحركات الأخرى\n* لا يقوم الكود الأساسي لميدياويكي بمعالجة MyISAM دائما كما يجب\n\nإذا كان تثبيت MySQL يدعم InnoDB، فمن المستحسن جدا أن تختاره بدلا منه، \nإذا كان تثبيت MySQL لا يدعم InnoDB، فربما حان الوقت للترقية.",
        "config-mysql-only-myisam-dep": "<strong>تحذير:</strong> MyISAMهو محرك التخزين الوحيد المتاح لـMySQL على هذا الجهاز، ولا يُنصَح باستخدامه مع ميدياويكي; لأنه:\n* بالكاد يدعم التزامن بسبب قفل الجدول \n* أكثر عرضة للفساد من المحركات الأخرى\n* لا يقوم الكود الأساسي لميدياويكي بمعالجة MyISAM دائما كما يجب\n\nتثبيت MySQL لا يدعم InnoDB; ربما حان الوقت للترقية.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> هو دائما الخيار الأفضل; لأنه يحتوي على دعم تزامن جيد.\n\nقد يكون <strong>MyISAM</strong> أسرع في تثبيت المستخدم الفردي أو للقراءة فقط،\nتميل قواعد بيانات MyISAM للتلف أكثر من قواعد بيانات InnoDB.",
-       "config-mysql-charset": "مجموعة محارف قاعدة البيانات",
-       "config-mysql-binary": "ثنائي",
-       "config-mysql-utf8": "يو تي إف-8",
-       "config-mysql-charset-help": "في <strong>الوضع الثنائي</strong>، يقوم ميدياويكي بتخزين نص UTF-8 في قاعدة البيانات في الحقول الثنائية، \nهذا أكثر كفاءة من وضع UTF-8 الخاص بـMySQL، ويسمح لك باستخدام النطاق الكامل لأحرف يونيكود. \n\nفي <strong>وضع UTF-8</strong>، ستعرف MySQL ما هي مجموعة البيانات التي تقوم بها، ويمكنها تقديمها وتحويلها بشكل مناسب، ولكنها لن تسمح لك بتخزين الحروف فوق [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "نوع الاستيثاق:",
        "config-mssql-install-auth": "حدد نوع المصادقة الذي سيتم استخدامه للاتصال بقاعدة البيانات أثناء عملية التثبيت. \nإذا حددت \"{{int:config-mssql-windowsauth}}\"، فسيتم استخدام بيانات اعتماد أي مستخدم يعمل عليه خادم الويب.",
        "config-mssql-web-auth": "حدد نوع المصادقة الذي سيستخدمه خادم الويب للاتصال بخادم قاعدة البيانات، أثناء التشغيل العادي للويكي. \nإذا حددت \"{{int:config-mssql-windowsauth}}\"، فسيتم استخدام بيانات اعتماد أي مستخدم يعمل عليه خادم الويب.",
index b640402..0b99eca 100644 (file)
        "config-mysql-engine": "Motor d'almacenamientu:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Binariu",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Triba d'autenticación:",
        "config-site-name": "Nome de la wiki:",
        "config-site-name-help": "Esto apaecerá na barra de títulos del navegador y en dellos sitios más.",
        "config-license-cc-choose": "Escoyer una llicencia Creative Commons  personalizada",
        "config-email-settings": "Configuración de corréu electrónicu",
        "config-enable-email": "Activar el corréu electrónicu de salida",
-       "config-enable-email-help": "Si quies que'l corréu electrónicu funcione, les [Config-dbsupport-oracle/manual/en/mail.configuration.php preferencies de corréu de PHP] tienen de tar configuraes correutamente.\nSi nun quies les funciones de corréu electrónicu, puedes desactivales equí.",
+       "config-enable-email-help": "Si quies que'l corréu electrónicu funcione, les [https://secure.php.net/manual/en/mail.configuration.php preferencies de corréu de PHP] tienen de tar configuraes correutamente.\nSi nun quies les funciones de corréu electrónicu, puedes desactivales equí.",
        "config-email-user": "Activar el corréu electrónicu ente usuarios",
        "config-logo": "URL del logo:",
        "config-instantcommons": "Activar Instant Commons",
index f08580f..6fcaca2 100644 (file)
        "config-mysql-myisam-dep": "\"Иғтибар\" Һеҙ MySQL мәғлүмәтен һаҡлау өсөн MyISAM механизмын һайланығыҙ. Түбәндәге сәбәптәр арҡаһында уны ҡулланыу тәҡдим ителмәй:\n* параллелизмда эшләп булмай;\n* башҡа механизмдар менән сағыштырғанда мәғлүмәттәр юғала;\n* MediaWiki коды  MyISAM үҙенсәләген иҫәпкә алмай.\n\nҺеҙҙең MySQL InnoDB менән яраҡлы эшләһә ошо механизмды һайларға тәҡдим итебеҙ.\n\nҺеҙҙең MySQL InnoDB менән яраҡһыҙ эшләһә  механизмды яңыртырға тәҡдим итебеҙ.",
        "config-mysql-only-myisam-dep": "<strong>Иҫкәртеү:</strong> MyISAM — был компьютерҙә MySQL өсөн берҙән-бер асыҡ мәғлүмәттәр һаҡлау системаһы, һәм  MediaWiki менән берлектә ҡулланырға рөхсәт ителмәй,сөнки:\n* таблицаларҙы блокировкалау һөҙөмтәһендә параллелизмды көсһөҙ тота;\n* башҡа системаларға ҡарағанда, ватылыуға күберәк дусар ителгән;\n* MediaWiki код базаһы MyISAM -ды ғәҙәттәгесә эшкәртеп бөтә алмай\nҺеҙҙең MySQL  InnoDB -ды тотмай, бәлки, яңыртыу ваҡыты еткәндер.",
        "config-mysql-engine-help": "Параллель рәүештә яҡшыраҡ эшләгәне өсөн '''InnoDB''' өҫтөнлөрәк.\n\nБер ҡулланыусы йәки төҙәтеүҙәр әҙ булғанда вики өсөн '''MyISAM'''тың тиҙлеге  шәберәк, әммә унда мәғлүмәт базаһы InnoDB-ҡа ҡарағанда йышыраҡ сафтан сыға.",
-       "config-mysql-charset": "Мәғлүмәт базаһын кодлау",
-       "config-mysql-binary": "Икеле",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "'''Ике режим'''да MediaWiki  UTF-8 тексын мәғлүмәт базаһының бинарныхҡырында һаҡлай.\nБыл MySQL-дың''UTF-8 режим''ына ҡарағанда һөҙөмтәлерәк һәм Unicode символдарының тулы тупланмаһын ҡулланыу мөмкинлеген бирә. \n\n'''UTF-8 режимы'''нда MySQL мәғлүмәттәрегеҙҙең ниндәй кодировкала ятҡанын беләсәк һәм уларҙы тейешенсә сағылдырасаҡ, үҙгәртәсәк, әммә был символдарҙы юғарыраҡ [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes База күптеллелек киңлегендә] һаәлау мөмкинлеген бирәсәк.",
        "config-mssql-auth": "Аутентификация төрө :",
        "config-mssql-install-auth": "Ҡуйыу процесында мәғлүмәт базаһына инеү өсөн файҙаланылған төп нөсхәне тикшереү тибын һайлағыҙ. \n\nӘгәр «{{int:config-mssql-windowsauth}}» һайлаһығыҙ, ҡулланыусының веб-сервер эшләгән иҫәп яҙмаһы файҙаланыласаҡ.",
        "config-mssql-web-auth": "Викиҙың ғәҙәттәге эше ваҡытында мәғлүмәттәр базаһы серверына инеү өсөн веб-сервер файҙаланған  төп нөсхәне тикшереү тибын һайлағыҙ. \n\nӘгәр «{{int:config-mssql-windowsauth}}» һайлаһығыҙ, ҡулланыусының веб-сервер эшләгән иҫәп яҙмаһы файҙаланыласаҡ.",
index ce9aabb..0402ef5 100644 (file)
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] зьяўляецца галоўнай мэтай MediaWiki і падтрымліваецца лепей за ўсё. MediaWiki таксама працуе з [{{int:version-db-mariadb-url}} MariaDB] і [{{int:version-db-percona-url}} Percona Server], якія сумяшчальныя з MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Як скампіляваць PHP з падтрымкай MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] — папулярная сыстэма базы зьвестак з адкрытым кодам, якая зьяўляецца альтэрнатывай MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Як кампіляваць PHP з падтрымкай PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] — невялікая сыстэма базы зьвестак, якая мае вельмі добрую падтрымку. ([https://secure.php.net/manual/en/pdo.installation.php Як кампіляваць PHP з падтрымкай SQLite], выкарыстоўвае PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([http://www.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] зьяўляецца камэрцыйнай прафэсійнай базай зьвестак. ([https://secure.php.net/manual/en/oci8.installation.php Як скампіляваць PHP з падтрымкай OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] — камэрцыйная база зьвестак для Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Як скампіляваць PHP з падтрымкай SQLSRV])",
        "config-header-mysql": "Налады MySQL",
        "config-header-postgres": "Налады PostgreSQL",
        "config-mysql-myisam-dep": "'''Папярэджаньне''': Вы выбралі MyISAM у якасьці рухавіка для захоўваньня зьвестак у MySQL, які не рэкамэндуецца да выкарыстаньня з MediaWiki па прычынах:\n* кепская падтрымка паралельнай апрацоўкі з-за таблічных блякаваньняў;\n* большая імавернасьць пашкоджаньня зьвестак у параўнаньні зь іншымі рухавікамі;\n* код MediaWiki не ва ўсіх выпадках улічвае асаблівасьці MyISAM.\n\nКалі Ваш MySQL-сэрвэр падтрымлівае InnoDB, вельмі рэкамэндуецца выкарыстаньне менавіта гэтага рухавіка.\nКалі MySQL-сэрвэр не падтрымлівае InnoDB, пэўна, настаў час абнавіць яго.",
        "config-mysql-only-myisam-dep": "<strong>Папярэджаньне:</strong> MyISAM — адзіная даступная сыстэма захоўваньня зьвестак для MySQL на гэтым кампутары, яна не рэкамэндуецца для ўжываньня з MediaWiki, таму што:\n* слаба падтрымлівае паралельнасьць праз блякаваньне табліцаў\n* больш за іншыя сыстэмы схільная да пашкоджаньняў\n* кодавая база MediaWiki не заўсёды належна апрацоўвае MyISAM\n\nВашае ўсталяваньне MySQL не падтрымлівае InnoDB, магчыма, час для абнаўленьня.",
        "config-mysql-engine-help": "'''InnoDB''' — звычайна найбольш слушны варыянт, таму што добра падтрымлівае паралелізм.\n\n'''MyISAM''' можа быць хутчэйшай у вікі з адным удзельнікам, ці толькі для чытаньня.\nБазы зьвестак на MyISAM вядомыя тым, што ў іх зьвесткі шкодзяцца нашмат часьцей за InnoDB.",
-       "config-mysql-charset": "Кадаваньне базы зьвестак:",
-       "config-mysql-binary": "Двайковае",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "У '''двайковым рэжыме''', MediaWiki захоўвае тэкст у кадаваньні UTF-8 у базе зьвестак у двайковых палях.\nГэта болей эфэктыўна за рэжым MySQL UTF-8, і дазваляе Вам выкарыстоўваць увесь дыяпазон сымбаляў Unicode.\n\nУ '''рэжыме UTF-8''', MySQL ведае, якая табліцы сымбаляў выкарыстоўваецца ў Вашых зьвестках, і можа адпаведна прадстаўляць і канвэртаваць іх, але гэта не дазволіць Вам захоўваць сымбалі па-за межамі [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базавага шматмоўнага дыяпазону].",
        "config-mssql-auth": "Тып аўтэнтыфікацыі:",
        "config-mssql-install-auth": "Абярыце тып аўтэнтыфікацыі, які будзе выкарыстаны для злучэньня з базай зьвестак падчас працэсу ўсталяваньня.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
        "config-mssql-web-auth": "Абярыце тып аўтэнтыфікацыі, які вэб-сэрвэр будзе выкарыстоўваць для злучэньня з базай зьвестак падчас звычайнага функцыянаваньня вікі.\nКалі вы абярэце «{{int:config-mssql-windowsauth}}», будуць выкарыстаныя ўліковыя зьвесткі карыстальніка, пад якім працуе вэб-сэрвэр.",
        "config-license-help": "Шматлікія адкрытыя вікі публікуюць увесь унёсак у праект на ўмовах [https://freedomdefined.org/Definition вольнай ліцэнзіі].\nГэта дазваляе ствараць эфэкт супольнай уласнасьці і садзейнічае доўгатэрміноваму ўнёску.\nДля прыватных і карпаратыўных вікі гэта не зьяўляецца неабходнасьцю.\n\nКалі Вы жадаеце выкарыстоўваць тэкст зь Вікіпэдыі, і жадаеце, каб Вікіпэдыя магла прымаць тэксты, скапіяваныя з Вашай вікі, Вам неабходна выбраць ліцэнзію <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nРаней Вікіпэдыя выкарыстоўвала ліцэнзію GNU Free Documentation.\nЯна ўсё яшчэ дзейнічае, але яна ўтрымлівае некаторыя моманты, якія ўскладняюць паўторнае выкарыстаньне і інтэрпрэтацыю матэрыялаў.",
        "config-email-settings": "Налады электроннай пошты",
        "config-enable-email": "Дазволіць выходзячыя электронныя лісты",
-       "config-enable-email-help": "Ð\9aалÑ\96 Ð\92Ñ\8b Ð¶Ð°Ð´Ð°ÐµÑ\86е, ÐºÐ°Ð± Ð¿Ñ\80аÑ\86авала Ñ\8dлекÑ\82Ñ\80оннаÑ\8f Ð¿Ð¾Ñ\88Ñ\82а, Ð½ÐµÐ°Ð±Ñ\85одна Ñ\81канÑ\84Ñ\96гÑ\83Ñ\80аваÑ\86Ñ\8c PHP [Config-dbsupport-oracle/manual/en/mail.configuration.php Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ñ\8bм Ñ\87Ñ\8bнам].\nÐ\9aалÑ\96 Ð\92Ñ\8b Ð½Ðµ Ð¶Ð°Ð´Ð°ÐµÑ\86е Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c Ð¼Ð°Ð³Ñ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\96 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\8fе Ð°Ð´ÐºÐ»Ñ\8eÑ\87Ñ\8bÑ\86Ñ\8c.",
+       "config-enable-email-help": "Ð\9aалÑ\96 Ð²Ñ\8b Ð¶Ð°Ð´Ð°ÐµÑ\86е, ÐºÐ°Ð± Ð¿Ñ\80аÑ\86авала Ñ\8dлекÑ\82Ñ\80оннаÑ\8f Ð¿Ð¾Ñ\88Ñ\82а, Ð½ÐµÐ°Ð±Ñ\85одна Ñ\81канÑ\84Ñ\96гÑ\83Ñ\80аваÑ\86Ñ\8c PHP [https://secure.php.net/manual/en/mail.configuration.php Ð°Ð´Ð¿Ð°Ð²ÐµÐ´Ð½Ñ\8bм Ñ\87Ñ\8bнам].\nÐ\9aалÑ\96 Ð²Ñ\8b Ð½Ðµ Ð¶Ð°Ð´Ð°ÐµÑ\86е Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c Ð¼Ð°Ð³Ñ\87Ñ\8bмаÑ\81Ñ\8cÑ\86Ñ\96 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82Ñ\8b, Ð²Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ñ\96Ñ\85 Ð°Ð´ÐºÐ»Ñ\8eÑ\87Ñ\8bÑ\86Ñ\8c Ñ\82Ñ\83Ñ\82.",
        "config-email-user": "Дазволіць электронную пошту для сувязі паміж удзельнікамі",
        "config-email-user-help": "Дазволіць усім удзельнікам дасылаць адзін аднаму электронныя лісты, калі ўключаная адпаведная магчымасьць ў іх наладах.",
        "config-email-usertalk": "Уключыць абвяшчэньні пра паведамленьні на старонцы абмеркаваньня",
index 4848bfb..829a910 100644 (file)
        "config-mysql-myisam-dep": "<strong>Внимание:</strong> Избрана е MyISAM като система за складиране в MySQL, която не се препоръчва за използване с МедияУики, защото:\n* почти не поддържа паралелност заради заключване на таблиците\n* е по-податлива на повреди в сравнение с други системи\n* кодът на МедияУики не винаги поддържа MyISAM коректно\n\nАко инсталацията на MySQL поддържа InnoDB, силно е препоръчително да се използва тя.\nАко инсталацията на MySQL не поддържа InnoDB, вероятно е време за обновяване.",
        "config-mysql-only-myisam-dep": "<strong>Внимание:</strong> MyISAM e единственият наличен на тази машина тип на таблиците за MySQL и не е препоръчителен за употреба при МедияУики защото:\n* има слаба поддръжка на конкурентност на заявките, поради закючването на таблиците\n* е много по-податлив на грешки в базите от данни от другите типове таблици\n* кодът на МедияУики не винаги работи с MyISAM както трябва\n\nВашият MySQL не поддържа InnoDB, така че може би е дошло време за актуализиране.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> почти винаги е най-добрата възможност заради навременната си поддръжка.\n\n<strong>MyISAM</strong> може да е по-бърза при инсталации с един потребител или само за четене.\nБазите от данни MyISAM се повреждат по-често от InnoDB.",
-       "config-mysql-charset": "Набор от знаци на базата от данни:",
-       "config-mysql-binary": "Двоичен",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "В <strong>двоичен режим</strong> МедияУики съхранява текстовете в UTF-8 в бинарни полета в базата от данни.\nТова е по-ефективно от UTF-8 режима на MySQL и позволява използването на пълния набор от знаци в Уникод.\n\nВ <strong>UTF-8 режим</strong> MySQL ще знае в кой набор от знаци са данните от уикито и ще може да ги показва и променя по подходящ начин, но няма да позволява складиране на знаци извън [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основния многоезичен набор].",
        "config-mssql-auth": "Тип на удостоверяването:",
        "config-mssql-install-auth": "Изберете начин за удостоверяване, който ще бъде използван за връзка с базата от данни по време на инсталацията.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.",
        "config-mssql-web-auth": "Изберете начина за удостоверяване, който ще се използва от уеб сървъра за връзка със сървъра за бази от данни по време на нормалните операции на уикито.\nАко изберете \"{{int:config-mssql-windowsauth}}\", ще се използват идентификационните данни на потребителя под който работи уеб сървъра.",
index 76399c4..ad74add 100644 (file)
@@ -81,9 +81,6 @@
        "config-mysql-engine": "সংরক্ষণ ইঞ্জিন:",
        "config-mysql-innodb": "ইনোডিবি",
        "config-mysql-myisam": "মাইআইএসএএম",
-       "config-mysql-charset": "ডেটাবেজের অক্ষর সেট",
-       "config-mysql-binary": "বাইনারি",
-       "config-mysql-utf8": "ইউটিএফ-৮",
        "config-mssql-windowsauth": "উইন্ডোজ প্রমাণীকরণ",
        "config-site-name": "উইকির নাম:",
        "config-site-name-blank": "একটি সাইটের নাম প্রবেশ করান।",
index 96b3dae..75381f2 100644 (file)
        "config-mysql-myisam-dep": "<strong>Diwallit :</strong> Diuzet eo bet ganeoc'h MyISAM evel keflusker stokañ evit MySQL, ar pezh n'eo ket erbedet evit implijout gant MediaWiki, rak :\n* a-boan m'eo skoret gantañ ober meur a dra war un dro peogwir eo prennet an taolennoù\n* techetoc'h eo d'ar gwastoù eget kefluskerioù all\n* kod diazez MediaWiki n'eo ket atav embreget MyISAM gantañ evel m'eo dleet\n\nM'eo skoret InnoDB gant ho staliadur MySQL, ez eo kuzuliet c'hwek deoc'h dibab hennezh kentoc'h.\nMa n'eo ket skoret InnoDB gant ho staliadur MySQL, e c'hallfe bezañ poent deoc'h ober un hizivadenn.",
        "config-mysql-only-myisam-dep": "<strong>Taolit evezh :</strong> MyISAM eo ar c'heflusker stokañ nemetañ a c'haller ober gantañ war ar mekanik-mañ evit MySQL, padal n'eo ket erbedet e implij gant MediaWiki, rak :\n* a-boan ma skor ar c'hevezerezh abalamour m'eo prennet an taolennoù\n* aesoc'h eo e wastañ eget kefluskerioù all\n* n'eo ket atav embreget MyIsam evel ma tlefe bezañ gant kod diazez MediaWiki\n\nN'eo ket skoret InnoDB gant ho staliadur MySQL. Poent eo hizivaat anezhañ marteze.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> eo an dibab gwellañ koulz lavaret atav, kemer a ra e kont ar monedoù kevezus.\n\n<strong>MyISAM</strong> a c'hall bezañ fonnusoc'h evit ar staliadurioù unpost pe ar re lenn hepken.\nDiazoù roadennoù MyISAM zo techet da vezañ gwastet aliesoc'h eget re InnoDB.",
-       "config-mysql-charset": "Strobad arouezennoù an diaz roadennoù :",
-       "config-mysql-binary": "Binarel",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Er <strong>mod binarel</strong> eo stoket an destenn UTF-8 gant MediaWiki en diaz roadennoù e maeziennoù binarel.\nEfedusoc'h eo an dra-se eget mod UTF-8 MySQL; leuskel a ra ac'hanoc'h da implijout skalfad klok arouezennoù Unicode.\n\nEr <strong>mod UTF-8</strong>, MySQL a ouio anavezout ar rikoù arouezennoù emañ ho roadennoù ennañ hag e c'hallo o c'hinnig hag o amdreiñ en doare a zere met ne aotreo ket ac'hanoc'h da stokañ arouezennoù a-us d'ar [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Steuñv liesyezhek diazez] (e saozneg).",
        "config-mssql-auth": "Seut anaoudadur :",
        "config-mssql-install-auth": "Diuzañ ar seurt dilesa a vo implijet evit kevreañ ouzh an diaz roadennoù e-pad ar staliañ.\nMa tibabit \"{{int:config-mssql-windowsauth}}\", e vo implijet titouroù anaout an implijer a laka ar servijer da dreiñ.",
        "config-mssql-web-auth": "Diuzañ ar seurt dilesa a vo implijet gant ar servijer web evit kevreañ ouzh diaz roadennoù ar servijer e-pad oberiadennoù boas ar wiki.\nMa tibabit \"{{int:config-mssql-windowsauth}}\", e vo implijet titouroù anaout an implijer a laka ar servijer da dreiñ.",
index a70c981..254c539 100644 (file)
        "config-mysql-engine": "Skladišni pogon:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Binarni",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Vrsta autentifikacije:",
        "config-site-name": "Ime wikija:",
        "config-site-name-blank": "Upišite ime sajta.",
index 2252568..6fb1bbe 100644 (file)
@@ -39,8 +39,6 @@
        "config-header-mssql": "Microsoft SQL Server settings",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Binary",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Ngaran ka wiki",
        "config-site-name-blank": "Ibutang a ngaran ka site.",
        "config-project-namespace": "Bibutangan ka proyekto:",
index e03a737..a1f7248 100644 (file)
        "config-mysql-engine": "Motor d'emmagatzemament:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Joc de caràcters de la base de dades:",
-       "config-mysql-binary": "Binari",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Tipus d'autenticació:",
        "config-mssql-sqlauth": "Autenticació de l’SQL Server",
        "config-mssql-windowsauth": "Autenticació del Windows",
index b58ff41..be482e9 100644 (file)
@@ -39,7 +39,6 @@
        "config-missing-db-server-oracle": "Ахьа тӀеюза езаш ю «{{int:config-db-host-oracle}}»",
        "config-invalid-db-server-oracle": "Хаамийн базан «$1» нийса йоцу TNS.\nЛелае «TNS Name», я могӀа «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm ЦӀерш техкаран кеп Oracle])",
        "config-sqlite-fts3-downgrade": "PHPн  гӀо до FTS3 яц — кхуссу таблицаш",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Аутентификацин тайп:",
        "config-site-name": "Викин цӀе:",
        "config-site-name-blank": "Язъе сайтан цӀе.",
index c2ec005..ba75bd3 100644 (file)
        "config-mysql-myisam-dep": "<strong>Upozornění:</strong> Jako typ úložiště pro MySQL jste zvolili MyISAM, které není pro použití v MediaWiki doporučeno, neboť:\n* stěží podporuje současný přístup kvůli zamykání tabulek,\n* je náchylnější na poškození dat než jiná úložiště,\n* kód MediaWiki nepodporuje MyISAM vždy tak dobře, jak by měl.\n\nPokud vaše instalace MySQL podporuje InnoDB, důrazně doporučujeme použít spíše to.\nPokud vaše instalace MySQL InnoDB nepodporuje, možná je čas na aktualizaci.",
        "config-mysql-only-myisam-dep": "<strong>Upozornění:</strong> Jediným dostupným úložištěm dat pro MySQL je MyISAM, který se k užití s MediaWiki nedoporučuje, neboť:\n* téměř nepodporuje paralelní přístup kvůli zamykání tabulek,\n* oproti jiným formátům je náchylnější k poškození,\n* MediaWiki nepodporuje MyISAM tak dobře, jak by bylo třeba.\n\nVaše instalace MySQL nepodporuje InnoDB, možná je na čase upgradovat.",
        "config-mysql-engine-help": "'''InnoDB''' je téměř vždy nejlepší volba, neboť má dobrou podporu současného přístupu.\n\n'''MyISAM''' může být rychlejší u instalací pro jednoho uživatele nebo jen pro čtení.\nDatabáze MyISAM bývají poškozeny častěji než databáze InnoDB.",
-       "config-mysql-charset": "Znaková sada databáze:",
-       "config-mysql-binary": "Binární",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "V '''binárním režimu''' ukládá MediaWiki text v UTF-8 do databáze v binárních sloupcích.\nTo je výkonnější než UTF-8 režim MySQL a umožňuje využít plný rozsah znaků Unicode.\n\nV '''režimu UTF-8''' bude MySQL znát znakovou sadu vašich dat a může je příslušně zobrazovat a převádět, ale neumožní vám uložit znaky mimo [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Typ autentizace:",
        "config-mssql-install-auth": "Zvolte si typ autentizace, který se bude používat pro připojení k databázi v průběhu instalace.\nPokud zvolíte možnost „{{int:config-mssql-windowsauth}}“, použijí se přihlašovací údaje uživatele, pod kterým běží webový server.",
        "config-mssql-web-auth": "Zvolte si typ autentizace, který se bude používat pro připojení k databázi za běžného provozu wiki.\nPokud zvolíte možnost „{{int:config-mssql-windowsauth}}“, použijí se přihlašovací údaje uživatele, pod kterým běží webový server.",
index ff52ec6..6c8e9b8 100644 (file)
@@ -40,8 +40,6 @@
        "config-diff3-bad": "Felënk GNU diff3.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "binarny",
-       "config-mysql-utf8": "UTF‐8",
        "config-site-name": "Miono wiki:",
        "config-site-name-blank": "Wpiszë miono starnów.",
        "config-ns-other-default": "MòjôWiki",
index add4c27..88d0344 100644 (file)
        "config-mysql-myisam-dep": "<strong>Warnung:</strong> Es wurde MyISAM als Speichersubsystem für das Datenbanksystem MySQL ausgewählt. Aus folgenden Gründen wird es nicht für den Einsatz mit MediaWiki empfohlen:\n* Es unterstützt aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen.\n* Es ist anfälliger für Datenprobleme.\n* Es wird von MediaWiki nicht immer adäquat unterstützt.\n\nSofern die vorhandene MySQL-Installation das Speichersubsystem InnoDB unterstützt, wird deren Verwendung eindringlich empfohlen.\nSofern sie es nicht unterstützt, sollte nunmehr eine entsprechende Aktualisierung in Erwägung gezogen werden.",
        "config-mysql-only-myisam-dep": "<strong>Warnung:</strong> MyISAM ist das einzige verfügbare Speichersubsystem für das Datenbanksystem MySQL auf diesem Server. Es wird nicht für die Verwendung mit MediaWiki empfohlen, da es\n* aufgrund von Tabellensperrungen kaum die nebenläufige Ausführung von Aktionen unterstützt,\n* anfälliger für Datenprobleme ist und\n* von MediaWiki nicht immer adäquat unterstützt wird.\n\nDeine MySQL-Installation unterstützt nicht das Speichersubsystem InnoDB. Eine Aktualisierung wird nunmehr empfohlen.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> als Speichersubsystem für das Datenbanksystem MySQL ist fast immer die bessere Wahl, da es gleichzeitige Zugriffe gut unterstützt.\n\n<strong>MyISAM</strong> als Speichersubsystem für das Datenbanksystem MySQL ist hingegen in Einzelnutzerumgebungen oder bei schreibgeschützten Wikis schneller.\nDatenbanken, die MyISAM verwenden, sind indes tendenziell fehleranfälliger als solche, die InnoDB verwenden.",
-       "config-mysql-charset": "Datenbankzeichensatz:",
-       "config-mysql-binary": "binär",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Im '''binären Modus''' speichert MediaWiki UTF-8 Texte in der Datenbank in binär kodierte Datenfelder.\nDies ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwendung jeglicher Unicode-Zeichen.\n\nIm '''UTF-8-Modus''' wird MySQL den Zeichensatz der Daten erkennen und sie richtig anzeigen und konvertieren,\nallerdings können keine Zeichen außerhalb des [https://de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert werden.",
        "config-mssql-auth": "Authentifikationstyp:",
        "config-mssql-install-auth": "Wähle den Authentifikationstyp aus, der zur Verbindung mit der Datenbank während des Installationsprozesses verwendet wird.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werden die Anmeldeinformationen eines beliebigen Benutzers verwendet, der den Webserver ausführt.",
        "config-mssql-web-auth": "Wähle den Authentifikationstyp aus, der vom Webserver zur Verbindung mit dem Datenbankserver während des gewöhnlichen Betriebs des Wikis verwendet wird.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werden die Anmeldeinformationen eines beliebigen Benutzers verwendet, der den Webserver ausführt.",
index 26cdb59..159b66e 100644 (file)
@@ -59,8 +59,6 @@
        "config-mysql-engine": "Motorë depok kerdışi",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Dılet",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-sqlauth": "SQL Server araştnayış",
        "config-mssql-windowsauth": "Windows kamiye araştnayış",
        "config-site-name": "Namey wiki:",
index f8ce568..fae5001 100644 (file)
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-engine-help": "Το <strong>InnoDB</strong> είναι σχεδόν πάντα η καλύτερη επιλογή, αφού έχει καλή υποστήριξη ταυτόχρονης λειτουργίας.\n\nΤο <strong>MyISAM</strong> μπορεί να είναι ταχύτερο σε εγκαταστάσεις του ενός χρήστη ή μόνο ανάγνωσης. \nΟι βάσεις δεδομένων MyISAM τείνουν να φθείρονται συχνότερα από τις βάσεις δεδομένων InnoDB.",
-       "config-mysql-charset": "Σύνολο χαρακτήρων βάσης δεδομένων:",
-       "config-mysql-binary": "Δυαδικό",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Σε <strong>λειτουργία δυαδικού</strong>, το MediaWiki αποθηκεύει κείμενο UTF-8 στη βάση δεδομένων σε δυαδικά πεδία.\nΑυτό είναι πιο αποτελεσματικό από τη λειτουργία UTF-8 της MySQL και σας επιτρέπει να χρησιμοποιείτε ολόκληρο το φάσμα των χαρακτήρων Unicode.\n\nΣε <strong>λειτουργία UTF-8</strong>, η MySQL θα γνωρίζει σε ποιο σύνολο χαρακτήρων ανήκουν τα δεδομένα σας και θα μπορεί να τα παρουσιάζει και να τα μετατρέπει κατάλληλα, αλλά δεν θα σας επιτρέπει να αποθηκεύετε χαρακτήρες πάνω από το [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes βασικό πολύγλωσσο επίπεδο].",
        "config-mssql-auth": "Τύπος ελέγχου ταυτότητας:",
        "config-mssql-sqlauth": "Έλεγχος ταυτότητας του SQL Server",
        "config-mssql-windowsauth": "Έλεγχος ταυτότητας των Windows",
index 412b405..005fef6 100644 (file)
        "config-mysql-myisam-dep": "<strong>Warning:</strong> You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nIf your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.\nIf your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
        "config-mysql-only-myisam-dep": "<strong>Warning:</strong> MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nYour MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.\n\n<strong>MyISAM</strong> may be faster in single-user or read-only installations.\nMyISAM databases tend to get corrupted more often than InnoDB databases.",
-       "config-mysql-charset": "Database character set:",
-       "config-mysql-binary": "Binary",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\n\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Authentication type:",
        "config-mssql-install-auth": "Select the authentication type that will be used to connect to the database during the installation process.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
        "config-mssql-web-auth": "Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
index bf791f3..3adafe8 100644 (file)
@@ -49,8 +49,6 @@
        "config-header-sqlite": "SQLite-agordoj",
        "config-header-oracle": "Oracle-agordoj",
        "config-header-mssql": "Microsoft SQL Server-agordoj",
-       "config-mysql-binary": "Duuma",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Nomo de vikio:",
        "config-ns-generic": "Projekto",
        "config-admin-name": "Via uzantonomo:",
index 99be820..09fce89 100644 (file)
        "config-mysql-myisam-dep": "<strong>Atención:</strong> has seleccionado MyISAM como motor de almacenamiento de MySQL, el cual no está recomendado para usarse con MediaWiki, porque:\n* apenas admite la concurrencia debido al bloqueo de tablas\n* es más propenso a daños que otros motores\n* el código MediaWiki no siempre controla MyISAM como debería\n\nSi tu instalación de MySQL admite InnoDB, es muy recomendable que lo elijas en su lugar.\nSi tu instalación de MySQL no admite InnoDB, quizás es el momento de una modernización.",
        "config-mysql-only-myisam-dep": "<strong>Advertencia:</strong> solo se ha encontrado el motor de almacenamiento MyISAM para MySQL en esta máquina, y no se recomienda su uso con MediaWiki, porque:\n* apenas admite la concurrencia debido al bloqueo de tablas\n* es más propenso a daños que otros motores\n* el código de MediaWiki no siempre controla MyISAM como debería\n\nTu instalación de MySQL no admite InnoDB; quizás es el momento de una actualización.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> es casi siempre la mejor opción, dado que soporta bien los accesos simultáneos.\n\n<strong>MyISAM</strong> puede ser más rápido en instalaciones con usuario único o de sólo lectura.\nLas bases de datos MyISAM tienden a corromperse más a menudo que las bases de datos InnoDB.",
-       "config-mysql-charset": "Conjunto de caracteres de la base de datos:",
-       "config-mysql-binary": "Binario",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "En <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 para la base de datos en campos binarios.\nEsto es más eficiente que el modo UTF-8 de MySQL y permite utilizar la gama completa de caracteres Unicode.\n\nEn <strong>modo UTF-8</strong>, MySQL sabrá qué conjunto de caracteres emplean sus datos y puede presentarlos y convertirlos adecuadamente, pero no permitirá almacenar caracteres por encima del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plano multilingüe básico].",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Selecciona el tipo de autenticación que se utilizará para conectarse a la base de datos durante el proceso de instalación.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el que se ejecuta el servidor web.",
        "config-mssql-web-auth": "Selecciona el tipo de autenticación que utilizará el servidor web para conectarse al servidor de base de datos, durante el funcionamiento normal de la wiki.\nSi seleccionas \"{{int:config-mssql-windowsauth}}\", se usarán las credenciales del usuario con el cual se ejecuta el servidor web.",
index 07198f7..5c9a3af 100644 (file)
        "config-mysql-myisam-dep": "<strong>Oharra:</strong> MyISAM MySQL biltegiratze-motor gisa aukeratu duzu, MediaWikirekin erabiltzeko gomendagarria ez dena honengatik:\n*taula blokeoak direla-eta gauza gutxi onartu ohi du\n*beste motore batzuek baino ustelkeria gehiago izateko aukerak ditu\n*MediaWiki-ren kode baseak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioa InnoDB onartzen badu, hori aukeratzeko gomendatzen da.\nZure MySQL instalazioa InnoDB ez badu onartzen, baliteke bertsioa berritzeko ordua izatea.",
        "config-mysql-only-myisam-dep": "<strong> Oharra: </strong> MyISAM makinaren MySQL biltegiratze motarako bakarra da, eta hau ez da MediaWiki-rekin erabiltzeko gomendatzen, honengatik:\n* maiztasunez taula blokeoek konkurrentzia ez dute onartzen \n* Beste motore batzuek baino ustelkeria gehiago izaten dute\n* MediaWiki-ren kodekak ez du beti kudeatzen MyISAM behar bezala\n\nZure MySQL instalazioak ez du InnoDB onartzen, agian bertsio berritzeko ordua da.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> ia beti aukerarik onena da, konkurrentzia-laguntza ona duelako.\n\n<strong>MyISAM</strong> erabiltzaile bakarreko edo irakurketa bakarreko instalazioetan azkarragoa izan daiteke.\nMyISAM datu-basea gehiagokotan hondatuta ageri da InnoDB datu-baseareakin baino.",
-       "config-mysql-charset": "Datu-basearen karaktere multzoa:",
-       "config-mysql-binary": "Bitarra",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "<strong>Modu bitarrean</strong>, MediaWiki-k UTF-8 testua datu-baseko eremu bitarretan gordetzen du.\nHau MySQL-en UTF-8 modua baino eraginkorragoa da eta Unicode karaktereen barruti osoa erabiltzea ahalbidetzen du.\n\n<Strong>UTF-8 moduan</strong>, MySQL-k jakingo du zer karakterean zure datuak konfiguratzen dituen, aurkeztu eta behar bezala bihurtzeko, baina ez dizkizu karaktereak [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Oinarrizko Eleaniztasun Plana]-ren gainetik gordetzen utziko.",
        "config-mssql-auth": "Autentifikazio mota:",
        "config-mssql-install-auth": "Aukeratu instalazio prozesuan zehar datu-basera konektatzeko erabiliko den autentifikazio mota.\n\"{{Int: config-mssql-windowsauth}}\" hautatzen baduzu, web zerbitzariak duen edozein erabiltzailek erabiliko duen kredentziala erabiliko da.",
        "config-mssql-web-auth": "Aukeratu instalazio prozesuan zehar datu-base zerbitzariari konektatzeko erabiliko den autentifikazio mota.\n\"{{Int: config-mssql-windowsauth}}\" hautatzen baduzu, web zerbitzariak duen edozein erabiltzailek erabiliko duen kredentziala erabiliko da.",
index a94cae8..3ef8df0 100644 (file)
        "config-mysql-myisam-dep": "'''هشدار:''' شما مای‌آی‌اس‌ای‌ام را به عنوان موتور ذخیره برای مای‌آی‌اس‌ای‌ام انتخاب کرده‌اید، که برای استفاده با مدیاویکی توصیه نمی‌شود زیرا:\n* به‌علت قفل شدن جدول اجمالاً به طور همزمان پشتیبانی می کند\n* بیشتر از دیگر موتورها برای از بین‌ رفتن مستعد است.\n* مبنای رمز مدیاویکی همیشه مای‌آی‌اس‌ای‌ام را همان طور که باید باشد،کنترل نمی‌کند\nاگر نصب مای‌اس‌کیو‌ال شما اینودی‌بی را پشتیبانی می‌کند،بسیار توصیه می‌شود  که در عوض ،آن را انتخاب کنید.\nاگر نصب مای‌اس‌کیو‌ال شما، اینودی‌بی را پشتیبانی نمی‌کند، ممکن است زمان ارتقاء رسیده باشد.",
        "config-mysql-only-myisam-dep": "'''هشدار:''' مای‌آی‌اس‌ای‌ام تنها موتور ذخیره‌سازی اطلاعات برای مای‌اس‌کیو‌ال در این دستگاه است، و برای استفاده با مدیاویکی توصیه نمی‌شود، زیرا:\n* به‌علت قفل شدن جدول اجمالاً به طور همزمان پشتیبانی می کند\n* بیشتر از دیگر موتورها برای از بین‌ رفتن مستعد است.\n* مبنای رمز مدیاویکی همیشه مای‌آی‌اس‌ای‌ام را همان طور که باید باشد،کنترل نمی‌کند\nنصب مای‌اس‌کیو‌ال شما اینودی‌بی را پشتیبانی نمی‌کند،ممکن است زمان یک ارتقاء رسیده باشد.",
        "config-mysql-engine-help": "'''اینودی‌بی''' تقریباً همیشه بهترین گزینه است،زیرا پشتیبانی همزمان خوبی دارد.\n'''مای‌آی‌اس‌ای‌ام''' ممکن است در نصب‌های کاربر جداگانه یا فقط خواندنی سریع‌تر باشد.\nپایگاه‌های اطلاعاتی مای‌آی‌اس‌ای‌ام اغلب بیشتر از پایگاه‌های اطلاعاتی اینودی‌بی مستعد ازبین رفتن هستند.",
-       "config-mysql-charset": "مجموعه‌ٔ خصوصیات پایگاه اطلاعاتی:",
-       "config-mysql-binary": "دودویی",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "در حالت باینری مدیاویکی متن را به صورت  UTF-8 در پایگاه داده باینری ذخیره می‌کند.\nاین روش بسیار به صرفه‌تر از حالت  UTF-8 برای MySQL هست و به شما اجازهٔ استفاده از همه بازهٔ نویسه‌های یونیکد را می دهد.\n\nدر حالت UTF-8 برنامه MySQL به شما اجازه می‌دهد که کدام نویسه‌ها در داده‌های شما باشند و اجازهٔ تبدیل و حضور آنها را به صورت مطلوبی می‌دهد ولی به شما اجازهٔ ذخیرهٔ نویسه‌های بالای [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes نقشه ابتدائی چندزبانی] را می‌دهد.",
        "config-mssql-auth": "نوع تأیید:",
        "config-mssql-install-auth": "نوع تأییدی را که برای اتصال به پایگاه اطلاعاتی حین فرآیند نصب مورد استفاده قرار گیرد را انتخاب کنید.\nاگر \"{{int:config-mssql-windowsauth}}\" را انتخاب می‌کنید، اعتبارات هرآنچه کاربر وب سرور به عنوان آن  مورد استفاده قرار می‌دهد مورد استفاده قرار خواهد گرفت.",
        "config-mssql-web-auth": "نوع تأییدی را که کارساز وب به‌وسیلهٔ آن برای کارهای معمولی به پایگاه اطلاعاتی متصل خواهد شد را انتخاب کنید.\nاگر «{{int:config-mssql-windowsauth}}» را انتخاب می‌کنید، اعتبارات هرآنچه کاربر وب سرور به عنوان آن  مورد استفاده قرار می‌دهد مورد استفاده قرار خواهد گرفت.",
index 5f47db4..151dfa6 100644 (file)
        "config-mysql-engine": "Tallennusmoottori",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Tietokannan merkistökoodaus:",
-       "config-mysql-binary": "Binääri",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Varmennuksen tyyppi:",
        "config-mssql-install-auth": "Valitse varmennuksen tyyppi, jota käytetään yhdistäessä tietokantaan asennuksen aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
        "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.",
index 39a1868..4bda25c 100644 (file)
        "config-mysql-myisam-dep": "<strong> Avertissement </strong>: vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n’est pas recommandé pour une utilisation avec MediaWiki, parce que :\n * il prend à peine en charge la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le code de base MediaWiki ne gère pas toujours MyISAM comme il se doit\n\nSi votre installation MySQL prenden charge InnoDB, il est fortement recommandé que vous le choisissiez plutôt. \nSi votre installation MySQL ne prend pas en charge les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
        "config-mysql-only-myisam-dep": "<strong>Attention :</strong> MyISAM est le seul moteur de stockage disponible pour MySQL sur cette machine, et cela n’est pas recommandé pour une utilisation avec MédiaWiki, car :\n* il prend très peu en charge les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne prend pas en charge InnoDB ; il est peut-être temps de la mettre à jour.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> est presque toujours la meilleure option, car il prend bien en charge les accès concurrents.\n\n<strong>MyISAM</strong> peut être plus rapide dans les installations monoposte ou en lecture seule.\nLes bases de données MyISAM ont tendance à se corrompre plus souvent que les bases d’InnoDB.",
-       "config-mysql-charset": "Jeu de caractères de la base de données :",
-       "config-mysql-binary": "Binaire",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "En <strong>mode binaire</strong>, MediaWiki stocke le texte au format UTF-8 dans la base de données dans des champs binaires.\nC'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn <strong>mode UTF-8</strong>, MySQL reconnaîtra le jeu de caractères dans lequel sont vos données et pourra les présenter et les convertir de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
        "config-mssql-auth": "Type d’authentification :",
        "config-mssql-install-auth": "Sélectionner le type d’authentification qui sera utilisé pour se connecter à la base de données pendant le processus d’installation.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur faisant tourner le serveur seront utilisées.",
        "config-mssql-web-auth": "Sélectionner le type d’authentification que le serveur web utilisera pour se connecter au serveur de base de données lors des opérations habituelles du wiki.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur sous lequel tourne le serveur web seront utilisées.",
index 5eac7d3..c0e86f7 100644 (file)
@@ -50,8 +50,6 @@
        "config-sqlite-name-help": "Choisir un nom qui identifie ton wiki.\nFait user pas ni d'espaces ni des traits d'union\nIl va user pour fichier de données SQLite.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Binaire",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Nom du wiki:",
        "config-ns-generic": "Projet",
        "config-ns-other-default": "MonWiki",
index 6f6210e..fa84d5f 100644 (file)
@@ -68,9 +68,6 @@
        "config-mysql-engine": "Motor de stocâjo :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Juè de caractèros de la bâsa de balyês :",
-       "config-mysql-binary": "Binèro",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Nom du vouiqui :",
        "config-site-name-blank": "Buchiéd un nom de seto.",
        "config-project-namespace": "Èspâço de noms du projèt :",
index c625b67..7ad449d 100644 (file)
        "config-mysql-myisam-dep": "<strong>Atención:</strong> Seleccionou MyISAM como o motor de almacenamento para MySQL, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nSe a súa instalación MySQL soporta InnoDB, recoméndase elixilo no canto de MyISAM.\nSe a súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        "config-mysql-only-myisam-dep": "<strong>Atención:</strong> MyISAM é o único motor de almacenamento para MySQL nesta máquina, unha combinación non recomendada para MediaWiki, porque:\n* practicamente non soporta os accesos simultáneos debido ao bloqueo de táboas\n* é máis propenso a corromperse ca outros motores\n* o código base de MediaWiki non sempre manexa o MyISAM como debera\n\nA súa instalación MySQL non soporta InnoDB, quizais sexa boa idea realizar unha actualización.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é case sempre a mellor opción, dado que soporta ben os accesos simultáneos.\n\n<strong>MyISAM</strong> é máis rápido en instalacións de usuario único e de só lectura.\nAs bases de datos MyISAM tenden a se corromper máis a miúdo ca as bases de datos InnoDB.",
-       "config-mysql-charset": "Conxunto de caracteres da base de datos:",
-       "config-mysql-binary": "Binario",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "No <strong>modo binario</strong>, MediaWiki almacena texto UTF-8 na base de datos en campos binarios.\nIsto é máis eficaz ca o modo UTF-8 de MySQL e permítelle usar o rango completo de caracteres Unicode.\n\nNo <strong>modo UTF-8</strong>, MySQL saberá o xogo de caracteres dos seus datos e pode presentar e converter os datos de maneira axeitada,\npero non lle deixará gardar caracteres por riba do [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingüe básico].",
        "config-mssql-auth": "Tipo de autenticación:",
        "config-mssql-install-auth": "Seleccione o tipo de autenticación que se utilizará para conectarse á base de datos durante o proceso de instalación.\nSe selecciona \"{{int:config-mssql-windowsauth}}\", usaranse as credenciais do usuario co que se está a executar o servidor web.",
        "config-mssql-web-auth": "Seleccione o tipo de autenticación que utilizará o servidor web para conectarse ao servidor da base de datos durante o funcionamiento normal do wiki.\nSe selecciona \"{{int:config-mssql-windowsauth}}\", usaranse as credenciais do usuario co que se está a executar o servidor web.",
index afa7d72..08672c4 100644 (file)
@@ -44,8 +44,6 @@
        "config-db-name": "Inoa hōkeo ʻikepili",
        "config-db-username": "Inoa hōkeo ʻikepili:",
        "config-db-password": "ʻŌlelo hūnā hōkeo ʻikepili",
-       "config-mysql-binary": "Baineli",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Inoa wiki:",
        "config-project-namespace": "Lewainoa papahana:",
        "config-ns-generic": "Papahana",
index 36871b8..8c4d352 100644 (file)
        "config-mysql-myisam-dep": "'''אזהרה''': בחרתם ב־MyISAM בתור מנוע אחסון של MySQL, וזה לא מומלץ מהסיבות הבאות:\n* המנוע הזה בקושי תומך בעיבוד מקבילי בגלל נעילת טבלאות\n* הוא פחות עמיד בפני אובדן מידע ממנועים אחרים\n* הקוד של מדיה־ויקי לא תמיד מטפל ב־MyISAM כפי שצריך\n\nאם התקנת MySQL שלכם תומכת ב־InnoDB, מומלץ מאוד שתבחרו באפשרות הזאת.\nאם התקנת MySQL שלכם אינה תומכת ב־InnoDB, אולי זה הזמן לשקול לשדרג אותה.",
        "config-mysql-only-myisam-dep": "'''אזהרה:''' MyISAM הוא מנוע האחסון היחיד שזמין ל־MySQL במכונה הזאת, וזה לא מומלץ לשימוש עם מדיה־ויקי, כי:\n* הוא כמעט שאינו תומך בחיבורים מרובים בגלל נעילת טבלאות\n* הוא פגיע יותר לקלקול ממנועים אחרים\n* הקוד של מדיה־ויקי לא תמיד מטפל ב־MyISAM כפי שצריך\n\nהתקנת MySQL אינה תומכת ב־InnoDB, ואולי הגיע הזמן לשדרג אותה.",
        "config-mysql-engine-help": "'''InnoDB''' היא כמעט תמיד האפשרות הטובה ביותר, כי במנוע הזה יש תמיכה טובה ביותר בעיבוד מקבילי.\n\n'''MyISAM''' עשוי להיות בהתקנות שמיועדות למשתמש אחד ולהתקנות לקריאה בלבד.\nמסדי נתונים עם MyISAM נוטים להיהרס לעתים קרובות יותר מאשר מסדי נתונים עם InnoDB.",
-       "config-mysql-charset": "קידוד התווים של מסד הנתונים:",
-       "config-mysql-binary": "בינרי",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "ב'''מצב בינרי''' (binary mode) מדיה־ויקי שומרת טקסט UTF-8 במסד הנתונים בשדות בינריים.\nזה יעיל יותר ממצב UTF-8 של MySQL ומאפשר לכם להשתמש בכל הטווח של תווי יוניקוד.\n\nב'''מצב UTF-8'''&rlm; (UTF-8 mode)&rlm; MySQL יֵדַע מה קידוד התווים (character set) של הטקסט שלכם ויציג וימיר אותו בהתאם, אבל לא יאפשר לכם לשמור תווים שאינם נמצאים בטווח הרב־לשוני הבסיסי ([https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane]).",
        "config-mssql-auth": "סוג אימות:",
        "config-mssql-install-auth": "נא לבחור את סוג האימות שישמש להתחברות למסד הנתונים בזמן תהליך ההתקנה. בחירה ב־\"{{int:config-mssql-windowsauth}}\" תשתמש בהרשאות של החשבון שמריץ את השרת הנוכחי.",
        "config-mssql-web-auth": "נא לבחור את סוג האימות שישמש את השרת להתחברות למסד הנתונים בזמן הריצה הרגילה של הוויקי.\nבחירה ב־\"{{int:config-mssql-windowsauth}}\" תשתמש בהרשאות של החשבון שמריץ את השרת הנוכחי.",
index 992ba29..ca3d1df 100644 (file)
@@ -65,8 +65,6 @@
        "config-regenerate": "LocalSettings.php फिर से निर्मित करें →",
        "config-db-web-account": "वेब पहुँच हेतु डेटाबेस खाता",
        "config-mysql-innodb": "इनोडीबी",
-       "config-mysql-binary": "बाइनरी",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "प्रमाणन प्रकार:",
        "config-mssql-sqlauth": "SQL सर्वर प्रमाणन",
        "config-site-name": "विकि का नाम:",
index ef58e56..2e077b2 100644 (file)
        "config-mysql-myisam-dep": "'''Warnung:''' Es woard MyISAM als Speicher-Engine für MySQL ausgewählt, die aus follichend Gründe net für den Insatz mit MediaWiki rekommendiert ist:\n* Sie unnerstützt uffgrund von Tabellesperrunge koom die neweloofiche Ausführung von Aktione.\n* Sie ist oonfällicher für Dateprobleme.\n* Sie weard von MediaWiki net immer adäquat unnerstützt.\n\nSoweit die voarhandne MySQL-Installation die Speicher-Engine InnoDB unnerstützt, weard sei Verwennung eindringlich rekommendiert.\nSoweit sie sie net unnerstützt, sollt en entsprechend Aktualisierung nunmeahr Erwächung gezoh sin.",
        "config-mysql-only-myisam-dep": "'''Warnung:''' MyISAM ist die einziche verfüchbare Speicher-Engine für MySQL uff dem Rechner, und das weard net für die Verwennung mit MediaWiki rekommendiert, weil sie\n* uffgrund von Tabellesperrunge koom die neweloofiche Ausführung von Aktione unnerstützt,\n* oonfällicher für Dateprobleme ist und\n* von MediaWiki net immer adäquat unnerstützt weard.\n\nDein MySQL-Installation unnerstützt net InnoDB. Eventuell muss en Aktualisierung dorrichgeführt werre.",
        "config-mysql-engine-help": "'''InnoDB''' ist nächst immer die bessre Wähl, weil es gleichzeitiche Zugriffe gut unnerstützt.\n\n'''MyISAM''' ist in Enzelnutzerumgebunge sowie bei schreibgeschützte Wikis schneller.\nBei MyISAM-Datebanke treten tendenziell häuficher Fehler uff als bei InnoDB-Datebanke.",
-       "config-mysql-charset": "Datebankzeichesatz",
-       "config-mysql-binary": "binär",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Im '''binäre Modus''' speichert MediaWiki UTF-8 Texte in der Datebank in binär kodierte Datefelder.\nDas ist effizienter als der UTF-8-Modus von MySQL und ermöglicht so die Verwennung jeder Unicode-Zeiche.\n\nIm '''UTF-8-Modus''' weard MySQL den Zeichesatz der Date erkenne und sie richtich oonzeiche und konvertiere,\nawer könne ken Zeiche ausserhalb von der [https://de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke ''Basic Multilingual Plane'' (BMP)] gespeichert sin.",
        "config-mssql-auth": "Authentifikationstyp:",
        "config-mssql-install-auth": "Wähl den Authentifikationstyp aus, der zur Verbinnung mit der Datebank während von der Installationsprozesses verwennt weard.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werre die Oonmeldeinformatione von en beliebiche Benutzer verwennt, wo den Webserver ausführt.",
        "config-mssql-web-auth": "Wähl den Authentifikationstyp aus, der vom Webserver zur Verbinnung mit dem Datebankserver während / im Verloof von der gewöhnliche Betrieb von der Wiki verwennt weard.\nFalls du „{{int:config-mssql-windowsauth}}“ auswählst, werre die Oonmeldeinformatione von en beliebiche Benutzer verwennt, wo den Webserver ausführt.",
index 3d898ea..bc31799 100644 (file)
        "config-mysql-engine": "Składowanska mašina:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Znamješkowa sadźba datoweje banki:",
-       "config-mysql-binary": "Binarny",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Mjeno wikija:",
        "config-site-name-help": "To zjewi so w titulowej lejstwje wobhladaka kaž tež na wšelakich druhich městnach.",
        "config-site-name-blank": "Zapodaj sydłowe mjeno.",
index 93c95ab..10011ba 100644 (file)
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''Figyelmeztetés''': A MyISAM tárolómotort választottad, ami nem ajánlott a MediaWiki használatánál, mert:\n* nagyon rosszul kezeli a párhuzamos lekéréseket a táblák zárolása miatt\n* sokkal nagyobb az esélye az adatkorrupció kialakulásának\n* a MediaWiki kódbázisa nem mindig úgy kezeli a MyISAM-ot, ahogyan kellene\n\nHa a feltelepített MySQL támogatja az InnoDB-t, erősen ajánlott, hogy inkább azt válaszd.\nHa nem, akkor lehet, hogy itt az ideje a frissítésnek.",
        "config-mysql-engine-help": "A legtöbb esetben az '''InnoDB''' a legjobb választás, mivel megfelelően támogatja a párhuzamosságot.\n\nA '''MyISAM''' gyorsabb megoldás lehet egyfelhasználós vagy csak olvasható környezetekben, azonban a MyISAM-adatbázisok sokkal gyakrabban sérülnek meg, mint az InnoDB-adatbázisok.",
-       "config-mysql-charset": "Adatbázis karakterkészlete:",
-       "config-mysql-binary": "Bináris",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "'''Bináris módban''' a MediaWiki az UTF-8-as szövegeket bináris mezőkben tárolja az adatbázisban.\nEz sokkal hatékonyabb a MySQL UTF-8-as módjánál, és lehetővé teszi a teljes Unicode-karakterkészlet használatát.\n\n'''UTF-8-as módban''' a MySQL tudni fogja,hogy az adatok milyen karakterkészlettel rendelkeznek, és megfelelően átalakítja őket, azonban nem tárolhatóak olyan karakterek, melyek a [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] felett vannak.",
        "config-mssql-auth": "Hitelesítés típusa:",
        "config-mssql-sqlauth": "SQL Server hitelesítés",
        "config-mssql-windowsauth": "Windows hitelesítés",
index 7ef9c2d..9ba487c 100644 (file)
        "config-support-info": "MediaWiki supporta le sequente systemas de base de datos:\n\n$1\n\nSi tu non vide hic infra le systema de base de datos que tu tenta usar, alora seque le instructiones ligate hic supra pro activar le supporto.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mariadb-url}} MariaDB] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MySQL. ([https://secure.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un systema de base de datos popular e open source, alternativa a MySQL. ([https://secure.php.net/manual/en/pgsql.installation.php Como compilar PHP con supporto de PostgreSQL])",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([https://secure.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([https://secure.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un base de datos de interprisa commercial pro Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Como compilar PHP con supporto de SQLSRV])",
        "config-header-mysql": "Configuration de MySQL",
        "config-header-postgres": "Configuration de PostgreSQL",
        "config-mysql-myisam-dep": "* '''Attention:''' Tu ha seligite MyISAM como motor de immagazinage pro MySQL, lo que non es recommendate pro uso con MediaWiki, perque:\n* illo a pena supporta le processamento simultanee a causa del blocada le tabulas\n* illo es plus susceptibile al corruption que altere motores\n* le base de codice de MediaWiki non sempre manea MyISAM como illo deberea\n\nSi tu installation de MySQL supporta InnoDB, es multo recommendate que tu selige iste in su loco.\nSi tu installation de MySQL non supporta InnoDB, forsan isto es un bon occasion pro actualisar lo.",
        "config-mysql-only-myisam-dep": "'''Attention:''' MyISAM es le unic motor de immagazinage disponibile pro MySQL in iste machina, ma isto non es recommendate pro le uso con MediaWiki, perque:\n* a pena supporto le accesso simultanee a causa del blocage de tabellas\n* es plus propense a corrumper se que altere motores\n* le codice base de MediaWiki non sempre gere MyISAM como deberea\n\nTu installation de MySQL non supporta InnoDB; forsan il es tempore de actualisar lo.",
        "config-mysql-engine-help": "'''InnoDB''' es quasi sempre le melior option, post que illo ha bon supporto pro simultaneitate.\n\n'''MyISAM''' pote esser plus rapide in installationes a usator singule o a lectura solmente.\nLe bases de datos MyISAM tende a esser corrumpite plus frequentemente que le base de datos InnoDB.",
-       "config-mysql-charset": "Codification de characteres in le base de datos:",
-       "config-mysql-binary": "Binari",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In '''modo binari''', MediaWiki immagazina le texto UTF-8 in le base de datos in campos binari.\nIsto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.\n\nIn '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
        "config-mssql-auth": "Typo de authentication:",
        "config-mssql-install-auth": "Selige le typo de authentication a usar pro connecter al base de datos durante le processo de installation.\nSi tu selige \"{{int:config-mssql-windowsauth}}\", le credentiales del usator que executa le servitor web essera usate.",
        "config-mssql-web-auth": "Selige le typo de authentication que le servitor web usara pro connecter al base de datos durante le operation ordinari del wiki.\nSi tu selige \"{{int:config-mssql-windowsauth}}\", le credentiales del usator que executa le servitor web essera usate.",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
        "config-extension-link": "Sapeva tu que tu wiki supporta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [https://www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
        "config-skins-screenshots": "$1 (capturas de schermo: $2)",
+       "config-extensions-requires": "$1 (require $2)",
        "config-screenshot": "captura de schermo",
        "mainpagetext": "<strong>MediaWiki ha essite installate.</strong>",
        "mainpagedocfooter": "Consulta le [https://meta.wikimedia.org/wiki/Help:Contents Guida del usator] pro information sur le uso del software wiki.\n\n== Pro initiar ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de configurationes]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ a proposito de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de diffusion pro annuncios de nove versiones de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducer MediaWiki in tu lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Como combatter le spam in tu wiki]"
index 7605f85..5cae965 100644 (file)
        "config-mysql-myisam-dep": "<strong>Peringatan:</strong> Anda telah memilih MyISAM sebagai mesin penyimpanan MySQL, yang tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n * nyaris tidak mendukung operasi bersamaan karena penguncian tabel\n * lebih rentan terhadap korupsi daripada mesin lain\n * basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nJika instalasi MySQL Anda mendukung InnoDB, sangat disarankan bagi Anda memilih itu.\nJika instalasi MySQL tidak mendukung InnoDB, mungkin sudah waktunya untuk pemutakhiran.",
        "config-mysql-only-myisam-dep": "<strong>Peringatan:</strong> MyISAM adalah satu-satunya mesin penyimpanan yang tersedia untuk MySQL pada mesin ini, dan hal ini tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n* hampir tidak mendukung konkurensi karena penguncian tabel\n* basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nInstalasi MySQL Anda tidak mendukung InnoDB, mungkin sudah waktunya untuk peningkatan.",
        "config-mysql-engine-help": "'''InnoDB''' hampir selalu merupakan pilihan terbaik karena memiliki dukungan konkurensi yang baik.\n\n'''MyISAM''' mungkin lebih cepat dalam instalasi pengguna-tunggal atau hanya-baca.\nBasis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
-       "config-mysql-charset": "Set karakter basis data:",
-       "config-mysql-binary": "Biner",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Dalam '''modus biner''', MediaWiki menyimpan teks UTF-8 untuk basis data dalam bidang biner.\nIni lebih efisien daripada modus UTF-8 MySQL dan memungkinkan Anda untuk menggunakan ragam penuh karakter Unicode.\n\nDalam '''modus UTF-8''', MySQL akan tahu apa set karakter data dan dapat menampilkan dan mengubahnya sesuai keperluan, tetapi tidak akan mengizinkan Anda menyimpan karakter di atas [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Jenis otentikasi:",
        "config-mssql-install-auth": "Pilih jenis otentikasi yang akan digunakan untuk menyambung ke database selama proses instalasi.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
        "config-mssql-web-auth": "Pilih jenis otentikasi yang akan digunakan oleh server web untuk menyambung ke server basis data, selama operasi biasa dari wiki.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
index 2f5826f..93039ff 100644 (file)
@@ -63,9 +63,6 @@
        "config-mysql-engine": "Gagnagrunnshýsing:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Stafatafla gagnagrunns:",
-       "config-mysql-binary": "Tvíundakerfis",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Tegund auðkenningar:",
        "config-mssql-sqlauth": "SQL Server auðkenning",
        "config-mssql-windowsauth": "Windows auðkenning",
index 35adc1c..79845cf 100644 (file)
        "config-mysql-myisam-dep": "<strong>Attenzione:</strong> hai selezionato MyISAM come motore di archiviazione per MySQL, che non è raccomandato per l'uso con  MediaWiki, perché:\n* supporta debolmente la concorrenza per il blocco della tabella\n* è più incline alla corruzione di altri motori\n* il codice di base MediaWiki non gestisce sempre MyISAM come dovrebbe\n\nSe la tua installazione MySQL supporta InnoDB, è altamente raccomandato che lo si scelga al suo posto.\nSe la tua installazione MySQL non supporta InnoDB, forse è il momento per un aggiornamento.",
        "config-mysql-only-myisam-dep": "<strong>Attenzione:</strong> MyISAM è l'unico motore di archiviazione disponibile per MySQL su questa macchina, e questo non è consigliato per l'uso con MediaWiki, perché:\n* supporta debolmente la concorrenza per il blocco della tabella\n* è più incline alla corruzione di altri motori\n* il codice di base MediaWiki non gestisce sempre MyISAM come dovrebbe\n\nSe la tua installazione MySQL non supporta InnoDB, forse è il momento per un aggiornamento.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> è quasi sempre l'opzione migliore, in quanto ha un buon supporto della concorrenza.\n\n<strong>MyISAM</strong> potrebbe essere più veloce nelle installazioni monoutente o in sola lettura.\nI database MyISAM tendono a danneggiarsi più spesso dei database InnoDB.",
-       "config-mysql-charset": "Set di caratteri del database:",
-       "config-mysql-binary": "Binario",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In <strong>modalità binaria</strong>, MediaWiki archivia il testo UTF-8 nel database in campi binari.\nCiò è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn <strong>modalità UTF-8</strong>, MySQL saprà in quale set di caratteri sono i tuoi dati, e potrà presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Piano di base multilinguistico].",
        "config-mssql-auth": "Tipo di autenticazione:",
        "config-mssql-install-auth": "Seleziona il tipo di autenticazione che verrà utilizzato per connettersi al database durante il processo di installazione.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
        "config-mssql-web-auth": "Seleziona il tipo di autenticazione che il server web utilizzerà per connettersi al database, durante il normale funzionamento del wiki.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.",
index 838eaae..0edc545 100644 (file)
        "config-mysql-myisam-dep": "<strong>警告:</strong> MySQLのストレージエンジンとして MyISAM を選択していますが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしている場合、代わりにそちらをお使いになることを強くお勧めします。\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。",
        "config-mysql-only-myisam-dep": "<strong>警告:</strong> MyISAM がこのマシンの MySQL の唯一のストレージエンジンですが、これをMediaWikiで利用するのは推奨されていません。その理由は: \n* テーブルロックによる並列性をほとんどサポートしていない\n* 他のエンジンに比べて壊れやすい\n* MediaWiki のコードベースは必ずしも MyISAM を本来あるべきほどには扱っていない\n\nあなたがインストールした MySQL が InnoDB をサポートしていない場合、アップグレードした方がいいでしょう。",
        "config-mysql-engine-help": "<strong>InnoDB</strong>は、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。\n\n<strong>MyISAM</strong>は、利用者が1人の場合、あるいは読み込み専用でインストールする場合に、より処理が早くなるでしょう。\nただし、MyISAMのデータベースは、InnoDBより高頻度で破損する傾向があります。",
-       "config-mysql-charset": "データベースの文字セット:",
-       "config-mysql-binary": "バイナリ",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "<strong>バイナリ モード</strong>では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。\nこれは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。\n\n<strong>UTF-8 モード</strong>では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、\n[https://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 基本多言語面]の外にある文字を格納できません。",
        "config-mssql-auth": "認証の種類:",
        "config-mssql-install-auth": "インストール過程でデータベースに接続するために使用する認証の種類を選択してください。\n「{{int:config-mssql-windowsauth}}」を選択した場合、ウェブサーバーを実行しているユーザーの認証情報が使用されます。",
        "config-mssql-web-auth": "ウィキの通常の操作の際にウェブサーバーがデータベースサーバーに接続するために使用する認証の種類を選択してください。\n「{{int:config-mssql-windowsauth}}」を選択した場合、ウェブサーバーを実行しているユーザーの認証情報が使用されます。",
index 2d12f47..90967d1 100644 (file)
@@ -47,8 +47,6 @@
        "config-sqlite-readonly": "ფაილი <code>$1</code> ჩასაწერად მიუწვდომელია.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "ორობითი",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "ვიკის სახელი:",
        "config-site-name-blank": "შეიყვანეთ ვებ-გვერდის სახელი.",
        "config-project-namespace": "პროექტის სახელთა სივრცე:",
index d97c55f..5e8d4dc 100644 (file)
        "config-mysql-myisam-dep": "<strong>경고:</strong> MySQL을 위한 저장소 엔진으로 MyISAM을 선택하였습니다. MyISAM을 미디어위키에 사용하는 것은 좋지 않습니다.  이유는:\n* 테이블 잠금 때문에 동시 실행을 지원하지 않습니다\n* 다른 엔진보다 더 손상되는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\nMySQL이 InnoDB를 지원한다면, InnoDB를 선택할 것을 매우 권장합니다.\nMySQL이 InnoDB를 지원하지 않는다면, 업그레이드를 하시는 편이 좋습니다.",
        "config-mysql-only-myisam-dep": "<strong>경고:</strong> MyISAM은 이 기계에  유일하게 사용할 수 있는 MySQL용 저장소 엔진이며, 미디어위키에 사용하는 것은 좋지 않습니다. 이유는:\n* 테이블 잠금 때문에 동시 실행을 지원하지 않습니다\n* 다른 엔진보다 더 손상시키는 경향이 있습니다\n* 미디어위키 코드베이스가 항상 정상적으로 MyISAM을 처리하지 않습니다\n\n당신의 MySQL은 InnoDB를 지원하지 않으며, 업그레이드를 하는 것이 좋습니다.",
        "config-mysql-engine-help": "<strong>InnoDB</strong>는 동시 실행 지원이 우수하기 때문에 대부분의 경우 최고의 옵션입니다.\n\n<strong>MyISAM</strong>은 단일 사용자나 읽기 전용 설치에서 더 빠를 수 있습니다.\nMyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실될 수 있습니다.",
-       "config-mysql-charset": "데이터베이스 문자 집합:",
-       "config-mysql-binary": "바이너리",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "<strong>바이너리 모드</strong>에서 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.\nMySQL의 UTF-8 모드보다 더 효율적이고, 유니코드 문자의 전체 범위를 사용할 수 있습니다.\n<strong>UTF-8 모드</strong>에서는 MySQL이 데이터를 사용하는 문자 집합을 알고 있기 때문에 적절하게 표현하고 변환할 수 있지만\n[https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#.EA.B8.B0.EB.B3.B8_.EB.8B.A4.EA.B5.AD.EC.96.B4_.ED.8F.89.EB.A9.B4 기본 다국어 평면] 밖에 있는 문자를 저장할 수 없습니다.",
        "config-mssql-auth": "인증 형식:",
        "config-mssql-install-auth": "설치 과정 중 데이터베이스에 연결하는 데 사용할 인증 형식을 선택하세요.\n\"{{int:config-mssql-windowsauth}}\"을 선택하시면 웹서버를 실행 중인 아무 사용자의 자격 증명이 사용됩니다.",
        "config-mssql-web-auth": "위키가 일반적인 작업을 수행하는 동안 데이터베이스 서버에 연결하는 데 사용할 인증 형식을 선택하세요.\n\n\"{{int:config-mssql-windowsauth}}\"을 선택하시면 웹서버를 실행 중인 아무 사용자의 자격 증명이 사용됩니다.",
index 4b89b41..33ccabd 100644 (file)
        "config-mysql-myisam-dep": "'''Opjepaß:''' <i lang=\"en\">MyISAM</i> es als Speicher för <i lang=\"en\">MySQL</i> nit besönders joot för et Zosammeschpell met MediaWiki zo bruche:\n* Dorj_et kumplätte Sperre vun Tabälle, künne koum ens Saache parrallel en dä Daatebangk jedonn wääde.\n* Dat Fomaat es anfällesch för Probleme met de Daate.\n* Et weed vun MediaWiki nit ėmmer zopaß ongerschtöz.\n\nWann Ding <i lang=\"en\">MySQL</i> et Schpeischere en <i lang=\"en\">InnoDB</i>-Datteije ongerschtöze deiht, dom_mer dat nohdröcklesch ämfähle.\nKann dä ẞööver dat nit, künnd et joode jelääjeheit sin, dä ens op der neuste Schtand ze bränge.",
        "config-mysql-only-myisam-dep": "'''Opjepaß:''' <i lang=\"en\" xml:lang=\"en\">MyISAM</i> es de einzeje Zoot Schpeischerprojramm för <i lang=\"en\" xml:lang=\"en\">MySQL</i> op dä Maschiin. Di es nit för MediaWiki ze ämfähle es, weil:\n* wääje dem Schpärre vun jannze Tabälle sin koum paralleele Axjuhne en dä Daatebangk möjjelesch,\n* ed es aanfällesch för Probleeme met de Daate es, un\n* et weed vun MediaWiki nit emmer jood ongerschtöz.\n\nDing Enschtallazjuhn vum <i lang=\"en\" xml:lang=\"en\">MySQL</i> kann nit met <i lang=\"en\" xml:lang=\"en\">InnoDB</i> ömjonn.\nWi wöhr et med ene neuere Väsjohn vum <i lang=\"en\" xml:lang=\"en\">MySQL</i>?",
        "config-mysql-engine-help": "<strong>InnoDB</strong> es fö jewöhnlesch et beß, weil vill Zohjreffe op eijmohl joot ongershtöz wääde.\n\n<strong>MyISAM</strong> es flöcker op Rääschnere met bloß einem Minsch draan, un bei Wikis, di mer bloß lässe un nit schrieeve kann.\nMyISAM-Daatebangke han em Schnett mih Fähler un jon flöcker kappott, wi InnoDB-Daatebangke.",
-       "config-mysql-charset": "Dä Daatebangk iere Zeischesaz:",
-       "config-mysql-binary": "binär",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Beim Schpeischere em <strong>binähre Fomaht</strong> deiht MehdijaWikki Täx, dä em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Däm Unicode singe Universal Coded Character Set + Transformation Format—8-Bit\">UTF-8</i>-Fommaht kütt, en singer Dahtebangk en binähr kodehrte Dahtefälder faßhallde.\nDad_es flöcker un spahsamer wi et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Däm Unicode singe Universal Coded Character Set + Transformation Format—8-Bit\">UTF-8</i>-Fommaht vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MySQL</i> un määd_et müjjelesch, jehdes <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"a standard for the consistent encoding, representation, and handling of text expressed in most of the world's writing systems\">UNICODE</i>-Zeische met faßzehallde.\n\nBeim Schpeischere em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Däm Unicode singe Universal Coded Character Set + Transformation Format—8-Bit\">UTF-8</i> deihd_et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">MySQL</i> der Zeijschesaz un de Kodehrung vun dä Dahte känne, un kann se akeraht aanzeije un ömwandelle,\nallerdengs künne kein Zeische ußerhalv vum [https://de.wikipedia.org/wiki/Basic_Multilingual_Plane#Gliederung_in_Ebenen_und_Bl.C3.B6cke jrundlähje Knubbel för vill Schprohche (<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Basic Multilingual Plane — BMP</i>)] afjeschpeischert wähde.",
        "config-mssql-auth": "De Zoot Aanmäldong:",
        "config-mssql-install-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vor sesch jonn sull för de Enschtallazjuhn.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed jenumme, met wat emmer dä Wäbßööver aam loufe es.",
        "config-mssql-web-auth": "Söhk us, wi dat Aanmälde aan dä Daatebangk vör sesch jonn sull för de nommaale Ärbeid vum Wiki.\nWann De <em>{{int:Config-mssql-windowsauth}}</em> nemms, weed dat jenumme, wohmet dä Wäbßööver aam loufe es.",
index ea8c6a6..a6d5fda 100644 (file)
@@ -41,7 +41,6 @@
        "config-db-web-account": "Hesabê danegehê bô têgihiştina tora înternetê",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Navê wîkiyê:",
        "config-site-name-blank": "Navê malperek têkeve.",
        "config-ns-generic": "Proje",
index 92adf7b..f37b694 100644 (file)
        "config-db-web-create": "De Kont uleeë wann et e net scho gëtt",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "binär",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Typ vun der Authentifikatioun:",
        "config-mssql-sqlauth": "SOL-Server-Authentifikatioun",
        "config-mssql-windowsauth": "Windows-Authentifikatioun",
index 130dbda..8d05b79 100644 (file)
        "config-mysql-myisam-dep": "<strong>Atençion:</strong> t'hæ seleçionou MyISAM comme motô d'archiviaçion pe MySQL, ch'o no l'è racomandou pe l'uso con  MediaWiki, percose:\n* o supporta debolmente a concorença pe-o blocco da tabella\n* o l'è ciu inclinou a-a corruçion di atri motoî\n* o codiçe de base MediaWiki o no gestisce sempre MyISAM comm'o doviæ\n\nSe a to instalaçion MySQL a supporta InnoDB, l'è atamente racomandou che ti o çerni a-o so posto.\nSe a to installaçion MySQL a no supporta InnoDB, foscia l'è o momento pe 'n agiornamento.",
        "config-mysql-only-myisam-dep": "<strong>Atençion:</strong> MyISAM o l'è l'unnico motô d'archiviaçion disponibbile pe MySQL insce sta macchina, e questo no l'è consegiou pe doeuviâlo con MediaWiki, percose:\n* o supporta debolmente a concorenza pe-o blocco da tabella\n* o l''è ciu inclinou a-a corruçion di atri motoî\n* o coddiçe de base MediaWiki MyISAM  o no-o gestisce sempre comm'o doviæ\n\nS'a to installaçion MySQL a no supporta InnoDB, foscia l'è o momento pe 'n agiornamento.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> o l'è quæxi sempre a megio opçion, in quante o g'ha 'n bon supporto da concorença.\n\n<strong>MyISAM</strong> o poriæ vese ciu veloçe inte installaçioin mono-utente ò in sola-lettua.\nI database MyISAM tendan a dannezâse ciu soventi di database InnoDB.",
-       "config-mysql-charset": "Set di caratteri do database:",
-       "config-mysql-binary": "Binaio",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In <strong>modalitæ binaia</strong>, MediaWiki a l'archivvia o testo UTF-8 into database in campi binai.\nQuest'o l'è ciu efficaçe che a modalitæ UTF-8 do MySQL, e o consente de doeuviâ a gamma completa de caratteri Unicode.\n\nIn <strong>modalitæ UTF-8</strong>, MySQL o saviâ inte quæ set de caratteri l'è che son i to dæti, e o poriâ presentâli e convertîli in moddo apropiou, ma o no te permetiâ de memorizâ i caratteri de d'ato a-o [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Cian de base murtilenguistego].",
        "config-mssql-auth": "Tipo d'aotenticaçion:",
        "config-mssql-install-auth": "Seleçion-a o tipo d'aotenticaçion ch'o saiâ doeuviou pe conettise a-o database durante o processo de instalaçion.\nSe ti seleçion-i \"{{int:config-mssql-windowsauth}}\", saiâ doeuviou e credençiæ de quæ se segge utente segge aproeuv'a fâ giâ o serviou web.",
        "config-mssql-web-auth": "Seleçion-a o tipo d'aotenticaçion che o serviou web o doeuviâ pe conettise a-o database. \nSe ti seleçion-i \"{{int:config-mssql-windowsauth}}\", saiâ doeuviou e credençiæ de quæ se segge utente segge aproeuv'a fâ giâ o serviou web.",
index 5268510..fe1888d 100644 (file)
        "config-mysql-engine": "Saugojimo variklis:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Duomenų bazės simbolių rinkinys:",
-       "config-mysql-binary": "Dvejetainis",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Autentifikavimo tipas:",
        "config-mssql-sqlauth": "SQL Serverio autentifikavimas",
        "config-mssql-windowsauth": "Windows autentifikavimas",
index ccf733e..baa6e49 100644 (file)
@@ -44,7 +44,6 @@
        "config-header-mssql": "Microsoft SQL servera iestatījumi",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-windowsauth": "Windows Autentifikācija",
        "config-ns-generic": "Projekts",
        "config-ns-site-name": "Tāds pats kā viki nosaukums: $1",
index 829a543..1e712b0 100644 (file)
        "config-mysql-myisam-dep": "'''Предупредување:''' Го одбравте MyISAM како складишен погон за MySQL. Но тој не се препорачува за МедијаВики бидејќи:\n* одвај поддржува едновременост поради заклучување на табелите\n* поподложен на расипување од другите погони\n* кодната база на МедијаВики не секогаш може да работи со MyISAM како што треба\n\nАко вашата воспоставка на MySQL поддржува InnoDB, тогаш сериозно препорачуваме да го користите него наместо MyISAM.\nАко вашата воспоставка на MySQL не поддржува InnoDB, веројатно дошло време за надградба.",
        "config-mysql-only-myisam-dep": "'''Предупредување:''' MyISAM е единствениот достапен складишен погон за MySQL на оваа машина, а ова не се препорачува за употреба со МедијаВики, бидејќи:\n* речиси не поддржува истовремено извршување на задачите поради заклучувањето на табелите\n* поподложен е на расипувања од другите погони\n* кодната база на МедијаВИки не секогаш работи исправно со MyISAM\nВашата воспоставка на MySQL не поддржува InnoDB. Можеби е време да ја надградите.",
        "config-mysql-engine-help": "'''InnoDB''' речиси секогаш е најдобар избор, бидејќи има добра поддршка за едновременост.\n\n'''MyISAM''' може да е побрз кај воспоставките наменети за само еден корисник или незаписни воспоставки (само читање).\nБазите на податоци од MyISAM почесто се расипуваат од базите на InnoDB.",
-       "config-mysql-charset": "Збир знаци за базата:",
-       "config-mysql-binary": "Бинарен",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Во '''бинарен режим''', во базата на податоци МедијаВики складира UTF-8 текст во бинарни полиња.\nОва е поефикасно отколку  TF-8 режимот на MySQL, и ви овозможува да ја користите целата палета на уникодни знаци.\n\nВо '''UTF-8 режим''', MySQL ќе знае на кој збир знаци припаѓаат вашите податоци, и може соодветно да ги претстави и претвори, но нема да ви дозволи да складиратезнаци над [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Основната повеќејазична рамнина].",
        "config-mssql-auth": "Тип на заверка:",
        "config-mssql-install-auth": "Изберете го типот на заверка што ќе се користи за поврзување со базата на податоци во текот на воспоставката.\nАко изберете „{{int:config-mssql-windowsauth}}“, ќе се користат најавните податоци или корисникот како кој работи мрежниот опслужувач.",
        "config-mssql-web-auth": "Изберете го типот на заверка што мрежниот послужувач ќе го користи за поврзување со опслужувачот на базата во текот на редовната работа на викито.\nАко изберете „{{int:config-mssql-windowsauth}}“, ќе се користат најавните податоци или корисникот како кој работи мрежниот опслужувач.",
index 79fd490..c1bbec0 100644 (file)
@@ -56,7 +56,6 @@
        "config-connection-error": "$1.\n\nതാഴെ നൽകിയിരിക്കുന്ന ഹോസ്റ്റ്, ഉപയോക്തൃനാമം, രഹസ്യവാക്ക് എന്നിവ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.",
        "config-regenerate": "LocalSettings.php പുനഃസൃഷ്ടിക്കുക →",
        "config-mysql-engine": "സ്റ്റോറേജ് എൻജിൻ:",
-       "config-mysql-utf8": "യു.ടി.എഫ്.-8",
        "config-site-name": "വിക്കിയുടെ പേര്:",
        "config-site-name-help": "ഇത് ബ്രൗസറിന്റെ ടൈറ്റിൽ ബാറിലും മറ്റനേകം ഇടങ്ങളിലും പ്രദർശിപ്പിക്കപ്പെടും.",
        "config-site-name-blank": "സൈറ്റിന്റെ പേര് നൽകുക.",
index 41e678c..28b497f 100644 (file)
@@ -98,9 +98,6 @@
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-only-myisam-dep": "<strong>Amaran:</strong> MyISAM ialah satu-satunya enjin storan yang terdapat untuk MySQL di mesin ini, dan penggunaannya dengan MediaWiki tidak digalakkan kerana:\n* ia tidak menyokong keserempakan (''concurrency'') disebabkan penguncian jadual\n* ia lebih terdedah kepada korupsi daripada enjin-enjin lain\n* pangkalan kod MediaWiki tidak sentiasa mengendalikan MyISAM seperti yang diharapkan\n\nPemasangan MySQL anda tidak menyokong InnoDB. Mungkin tiba masanya untuk naik taraf.",
-       "config-mysql-charset": "Peranggu aksara pangkalan data:",
-       "config-mysql-binary": "Perduaan",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Jenis pengesahan:",
        "config-site-name": "Nama wiki:",
        "config-site-name-help": "Ini akan dipaparkan pada bar tajuk perisian pelayar dan tempat-tempat lain yang berkenaan.",
index ad1da47..c4cd28b 100644 (file)
@@ -42,9 +42,6 @@
        "config-db-web-create": "Oħloq il-kont jekk għadu ma jeżistix",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Sett ta' karattri tad-databażi:",
-       "config-mysql-binary": "Binarju",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Isem tal-wiki:",
        "config-site-name-help": "Dan se jidher fil-barra tat-titlu tal-browżer u f'diversi postijiet oħra.",
        "config-site-name-blank": "Daħħal isem tas-sit.",
index f7cc024..c64a2cd 100644 (file)
@@ -35,8 +35,6 @@
        "config-apcu": "[https://secure.php.net/apcu APCu] نصب بیه.",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] نصب بیه.",
        "config-diff3-bad": "GNU diff3 پیدا نیه.",
-       "config-mysql-binary": "باینری",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "نوع تأیید:",
        "config-ns-generic": "پروژه",
        "config-ns-other": "دیگه ( تعیین هاکنین)",
index 5cacc89..2f2ae1e 100644 (file)
        "config-mysql-myisam-dep": "<strong>Attenziò:</strong> avite scigliuto MyISAM comm' 'o mutore 'archiviaziona MySQL, ca nun è raccummannato pe' l'ausà cu MediaWiki, pecché:\n* supporta debolmente 'a concorrenza p' 'o blocco d' 'a tabbella\n* è cchiù inchine 'a corruzione 'e l'ati mutore\n* 'o codece 'e base 'e MediaWiki nun gestisce sempe MyISAM comme l'avess'a gistiunà\n\nSi ll'installazione vosta MySQL suppuorta InnoDB, è autamente raccummandato ca si scigliesse a 'o posto suo.\nSi 'a installazione MySQL nun suppurtasse InnoDB, forse è 'o mumento 'e ll'agghiurnà.",
        "config-mysql-only-myisam-dep": "<strong>Attenziò:</strong> MyISAM è l'uneco mutore p'astipà date ca se trova mo' a disposizione p' 'o MySQL dint'a sta macchina, e nun fosse raccumandato 'e s'ausà cu MediaWiki, pecché:\n* suppurtasse minimamente concorrenza pe' bbìa 'e bluccà tabbelle\n* è cchiù facile ca jesse a se scassà cchiù 'e l'ati mutore\n* 'o codece MediaWiki nun maniasse sempe MyISAM comme l'avesse 'e manià\n\nL'installazione MySQL nun suppurtasse InnoDB, può darse ca chist'è 'o mumento pe' ve ll'agghiurnà.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> è quase sempe 'a meglia opzione, pecché ave nu buono suppuorto concorrente.\n\n<strong>MyISAM</strong> putesse ghì cchiù ampressa int'a na installazione mono-utente e liegge-surtanto.\n'E database MyISAM se scassano cchiù spisso d' 'e database InnoDB.",
-       "config-mysql-charset": "Nzieme 'e carattere d' 'o database:",
-       "config-mysql-binary": "Binario",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Int'a <strong>modalità binaria</strong>, MediaWiki archiviasse 'o testo UTF-8 dint' 'o database a campe binarie.\nChest'è cchiù efficiente rispetto 'a modalità UTF-8 'e MySQL, e ve cunzente d'ausà 'a gamma cumpreta 'e carattere Unicode.\n\nInt'a <strong>modalità UTF-8</strong>, MySQL canoscesse dint'a quale set 'e carattere ce stanno 'e date vuoste, e putesse presentà e scagnà sti date int'a nu modo appropriato, ma nun ve premmettesse 'e dà memoria a 'e carattere ncopp' 'o [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Piano base Multilengua].",
        "config-mssql-auth": "Tipo d'autenticazione:",
        "config-mssql-install-auth": "Sceglie 'o tipo d'autenticazziona ca s'ausarrà pe cunnettà â database, durante ll'operazziona d'istallazziona. Si piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
        "config-mssql-web-auth": "Sceglie 'o tipo d'autenticazziona ca 'o web server pigliarrà pe se cunnettà a 'o server 'e bbase 'e dati, durante ll'operazziona nurmale d' 'a wiki.\nSi piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
index 479c3f5..c67d04e 100644 (file)
        "config-mysql-myisam-dep": "'''Advarsel:''' Du har valgt MyISAM som lagringsmotor for MySQL, noe som ikke er anbefalt for bruk med MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon støtter InnoDB, er det sterkt å anbefale at du i stedet velger den.\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
        "config-mysql-only-myisam-dep": "'''Advarsel:''' MyISAM er den eneste tilgjengelig lagringsmotoren for MySQL på denne maskinen, og det er ikke anbefalt brukt for MediaWiki, fordi:\n* den knapt støtter samtidighet pga. tabell-låsing\n* den har større tilbøyelighet for å bli korrupt enn andre motorer\n* MediaWiki-koden håndterer ikke alltid MyISAM som den burde\n\nHvis din MySQL-installasjon ikke støtter InnoDB, kan det være på tide med en oppgradering.",
        "config-mysql-engine-help": "'''InnoDB''' er nesten alltid det beste alternativet siden den har god støtte for samtidighet («concurrency»).\n\n'''MyISAM''' kan være raskere i enbruker- eller les-bare-installasjoner.\nMyISAM-databaser har en tendens til å bli ødelagt oftere enn InnoDB-databaser.",
-       "config-mysql-charset": "Databasetegnsett:",
-       "config-mysql-binary": "Binær",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "I '''binary mode''' lagrer MediaWiki UTF-8 tekst til databasen i binærfelt.\nDette er mer effektivt enn MySQLs UTF-8 modus og tillater deg å bruke hele spekteret av Unicode-tegn.\n\nI '''UTF-8 mode''' vil MySQL vite hvilket tegnsett dataene dine er i og kan presentere og konvertere det på en riktig måte,\nmen det vil ikke la deg lagre tegn over «[https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes the Basic Multilingual Plane]».",
        "config-mssql-auth": "Autentiseringstype:",
        "config-mssql-install-auth": "Valg autentiseringstypen som skal brukes for å koble til databasen under installeringsprosessen. Hvis du velger «{{int:config-mssql-windowsauth}}», vil påloggingsinformasjonen for brukeren som kjører webtjeneren blir brukt.",
        "config-mssql-web-auth": "Velg autentiseringstype som webtjeneren vil bruke for å koble til databasetjeneren under normal kjøring av wikien.\nHvis du velger «{{int:config-mssql-windowsauth}}», vil påloggingsinformasjonen til brukeren som kjører webtjeneren blir brukt.",
index 3ee33c1..2677d47 100644 (file)
@@ -48,8 +48,6 @@
        "config-header-postgres": "PostgreSQL सेटिङहरू",
        "config-header-sqlite": "SQLite सेटिङ्हरू",
        "config-header-oracle": "ओरेकल सेटिङहरू",
-       "config-mysql-binary": "बाइनरी",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "विकीको नाम:",
        "config-site-name-blank": "साइटको नाम लेख्नुहोस।",
        "config-project-namespace": "आयोजना नेमस्पेस:",
index dcee489..49e0e58 100644 (file)
@@ -45,7 +45,6 @@
        "config-upgrade-done-no-regenerate": "Het bijwerken is afgerond.\n\nJe kunt nu [$1 je wiki gebruiken].",
        "config-db-web-no-create-privs": "Het account dat je voor installatie hebt opgegeven, heeft niet voldoende rechten om een account aan te maken.\nHet account dat je hier opgeeft, moet al bestaan.",
        "config-mysql-myisam-dep": "'''Waarschuwing''': je hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:\n* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;\n* het meer vatbaar is voor corruptie dan andere engines;\n* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.\n\nAls je installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.\nAls je installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
-       "config-mysql-charset-help": "In '''binaire modus''' slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.\nDit is efficiënter dan de UTF-8-modus van MySQL en stelt je in staat de volledige reeks Unicodetekens te gebruiken.\n\nIn '''UTF-8-modus''' kent MySQL de tekenset van je gegevens en kan de databaseserver ze juist weergeven en converteren.\nHet is dat niet mogelijk tekens op te slaan die de \"[https://nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
        "config-project-namespace-help": "In het kielzog van Wikipedia beheren veel wiki's hun beleidspagina's apart van hun inhoudelijke pagina's in een \"'''projectnaamruimte'''\".\nAlle paginanamen in deze naamruimte beginnen met een bepaald voorvoegsel dat je hier kunt opgeven.\nDit voorvoegsel wordt meestal afgeleid van de naam van de wiki, maar het kan geen bijzondere tekens bevatten als \"#\" of \":\".",
        "config-admin-name": "Je naam:",
        "config-admin-password-mismatch": "De twee door jou ingevoerde wachtwoorden komen niet overeen.",
index 607926e..7bcd391 100644 (file)
        "config-mysql-myisam-dep": "'''Waarschuwing''': u hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:\n* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;\n* het meer vatbaar is voor corruptie dan andere engines;\n* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.\n\nAls uw installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.\nAls uw installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
        "config-mysql-only-myisam-dep": "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL in deze omgeving, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:\n* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;\n* tabellen makkelijker stuk kunnen gaan;\n* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.\n\nUw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
        "config-mysql-engine-help": "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.\n\n'''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.\nMyISAM-databases raken vaker beschadigd dan InnoDB-databases.",
-       "config-mysql-charset": "Tekenset voor de database:",
-       "config-mysql-binary": "Binair",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In <strong>binaire modus</strong> slaat MediaWiki tekst in UTF-8 op in binaire databasevelden.\nDit is efficiënter dan de UTF-8-modus van MySQL en stelt u in staat de volledige reeks Unicodetekens te gebruiken.\n\nIn <strong>UTF-8-modus</strong> kent MySQL de tekenset van uw gegevens en kan de databaseserver ze juist weergeven en converteren.\nHet is dan niet mogelijk tekens op te slaan die de \"[https://nl.wikipedia.org/wiki/Lijst_van_Unicode-subbereiken#Basic_Multilingual_Plane Basic Multilingual Plane]\" te boven gaan.",
        "config-mssql-auth": "Authenticatietype:",
        "config-mssql-install-auth": "Selecteer de authenticatiemethode die wordt gebruikt om met de database te verbinden tijdens het installatieproces.\nAls u \"{{int:config-mssql-windowsauth}}\" selecteert, dan worden de aanmeldgegevens van de gebruiker waaronder de webserver draait voor authenticatie gebruikt.",
        "config-mssql-web-auth": "Selecteer de authenticatiemethode die de webserver gebruikt om met de database te verbinden tijdens het installatieproces.\nAls u \"{{int:config-mssql-windowsauth}}\" selecteert, dan worden de aanmeldgegevens van de gebruiker waaronder de webserver draait voor authenticatie gebruikt.",
index c099895..7198522 100644 (file)
@@ -91,9 +91,6 @@
        "config-mysql-engine": "Motor d'emmagazinatge :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Jòc de caractèrs de la basa de donadas :",
-       "config-mysql-binary": "Binari",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Tipe d’autentificacion :",
        "config-mssql-sqlauth": "Autentificacion de SQL Server",
        "config-mssql-windowsauth": "Autentificacion Windows",
index 6894534..dd24138 100644 (file)
@@ -35,7 +35,6 @@
        "config-header-mssql": "Microsoft SQL Server azetukset",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Wikin nimi:",
        "config-site-name-blank": "Kirjuta sivun nimi.",
        "config-project-namespace": "Projektan nimitila:",
index f1003c6..d395f83 100644 (file)
        "config-mysql-myisam-dep": "'''Ostrzeżenie''': wybrano MyISIAM jako silnik  składowania danych MySQL, co nie jest zalecane do użytku w MediaWiki, ponieważ:\n * ledwo obsługuje współbieżnośći ze względu na blokowanie tabel\n * jest bardziej podatna na uszkodzenie niż inne silniki\n * kod źródłowy MediaWiki nie zawsze obsługuje MyISAM tak, jak powinien\n\nJeśli instalacja MySQL obsługuje InnoDB, jest wysoce zalecane, by to je wybrać.\nJeśli instalacja MySQL nie obsługuje InnoDB, być może nadszedł czas na jej uaktualnienie.",
        "config-mysql-only-myisam-dep": "'''Ostrzeżenie:''' MyISAM jest jedynym dostępnym na tym komputerze mechanizmem składowania dla MySQL, który jednak nie jest zalecany do używania z MediaWiki, ponieważ:\n* słabo obsługuje współbieżność z powodu blokowania tabel\n* jest bardziej skłonny do uszkodzeń niż inne silniki\n* kod MediaWiki nie zawsze traktuje MyISAM jak powinien\n\nTwoja instalacja MySQL nie obsługuje InnoDB, być może jest to czas na aktualizację.",
        "config-mysql-engine-help": "'''InnoDB''' jest prawie zawsze najlepszą opcją, ponieważ posiada dobrą obsługę współbieżności.\n\n'''MyISAM''' może być szybsze w instalacjach pojedynczego użytkownika lub tylko do odczytu.\nBazy danych MyISAM mają tendencję do ulegania uszkodzeniom częściej niż bazy InnoDB.",
-       "config-mysql-charset": "Zestaw znaków bazy danych:",
-       "config-mysql-binary": "binarny",
-       "config-mysql-utf8": "UTF‐8",
-       "config-mysql-charset-help": "W <strong>trybie binarnym</strong>, MediaWiki zapisuje tekst UTF-8 do bazy danych w polach binarnych.\nJest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków z pełnego zakresu Unicode.\n\nW <strong>trybie UTF-8</strong> MySQL będzie znać zestaw znaków w jakim zakodowano dane, możne też je wyświetlić i odpowiednio przekonwertować, ale nie pozwoli Ci przechowywać znaków spoza [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
        "config-mssql-auth": "Typ uwierzytelniania:",
        "config-mssql-install-auth": "Wybierz typ uwierzytelniania, który będzie używany do łączenia się z bazą danych w trakcie procesu instalacji.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, będą wykorzystywane dane konta użytkownika, pod którym działa serwer www.",
        "config-mssql-web-auth": "Wybierz typ uwierzytelniania, który będzie używany przez serwer www do łączenia się z bazą danych podczas normalnego funkcjonowania wiki.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, użyte zostaną dane konta użytkownika, pod którym działa serwer www.",
index f397942..bcdf1a7 100644 (file)
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''Avis''': A l'ha selessionà MyISAM com motor ëd memorisassion për MySQL, che a l'é pa arcomandà da dovré con MediaWiki, përchè:\n* a sopòrta a pen-a la contemporanità për via ëd saradure ëd tàula\n* a l'é pi soget a la corussion che j'àutri motor\n* ël còdes bas ëd MediaWiki pa sempe a gestiss MyISAM com a dovrìa\n\nSe soa istalassion MySQL a manten InnoDB, a l'é fortement arcomandà ch'a serna pitòst col-lì.\nSe soa istalassion MySQL a manten nen InnoDB, a peul esse ch'a sia ël moment ëd n'agiornament.",
        "config-mysql-engine-help": "'''InnoDB''' a l'é scasi sempe la mej opsion, da già ch'a l'ha un bon manteniment dla concorensa.\n\n'''MyISAM''' a peul esse pi lest an instalassion për n'utent sol o mach an letura.\nLa base ëd dàit MyISAM a tira a corompse pi 'd soens che la base ëd dàit InnoDB.",
-       "config-mysql-charset": "Ansem ëd caràter dla base ëd dàit:",
-       "config-mysql-binary": "Binari",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "An '''manera binaria''', MediaWiki a memorisa ël test UTF-8 ant la base ëd dàit an camp binari.\nSòn a l'é pi eficient che la manera UTF-8 ëd MySQL, e a-j përmët ëd dovré l'ansema antregh ëd caràter Unicode.\n\nAn '''manera UTF-8''', MySQL a conossrà an che ansem ëd caràter a son ij sò dat, e a peul presenteje e convertije apropriatament, ma a-j lassa pa memorisé ij caràter ëdzora al [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes pian multilenghìstich ëd base].",
        "config-site-name": "Nòm ëd la wiki:",
        "config-site-name-help": "Sòn a comparirà ant la bara dël tìtol dël navigador e an vàire d'àutri pòst.",
        "config-site-name-blank": "Ch'a buta un nòm ëd sit.",
index cad2822..840c449 100644 (file)
@@ -53,8 +53,6 @@
        "config-header-mssql": "د مايکروسافټ SQL پالنگر امستنې",
        "config-sqlite-readonly": "د <code>$1</code> دوتنه د ليکلو وړ نه ده.",
        "config-sqlite-cant-create-db": "د توکبنسټ دوتنه <code>$1</code> جوړه نه شوه.",
-       "config-mysql-binary": "دوه ايز",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "د ويکي نوم:",
        "config-site-name-blank": "د وېبځي نوم وليکۍ.",
        "config-project-namespace": "د پروژې نوم-تشيال:",
index 3eeb672..60898d9 100644 (file)
        "config-mysql-myisam-dep": "<strong>Aviso:</strong> Você selecionou MyISAM como mecanismo de armazenamento para o MySQL, o que não é recomendado para uso com o MediaWiki, porque:\n* dificilmente suporta concorrência devido ao bloqueio da tabela\n* é mais propenso à corrupção do que outros motores\n*a base de código MediaWiki nem sempre lida com o MyISAM como deveria\n\nSe sua instalação MySQL suportar o InnoDB, é altamente recomendável que você escolha ele.\nSe sua instalação MySQL não suportar o InnoDB, talvez seja hora de uma atualização.",
        "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O MyISAM é o único mecanismo de armazenamento disponível para o MySQL nesta máquina e isso não é recomendado para uso com o MediaWiki, porque:\n* dificilmente suporta concorrência devido ao bloqueio da tabela\n* é mais propenso à corrupção do que outros motores\n*a base de código MediaWiki nem sempre lida com o MyISAM como deveria\n\nA sua instalação no MySQL não suporta InnoDB, talvez seja hora de uma atualização.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, uma vez que possui um bom suporte de concorrência.\n\n<strong>MyISAM</strong> pode ser mais rápido em instalações de usuário único ou somente leitura.\\O banco de dados MyISAM tendem a ficar corrompidos mais frequentemente do que os bancos de dados InnoDB.",
-       "config-mysql-charset": "Conjunto de caracteres do banco de dados:",
-       "config-mysql-binary": "Binário",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Em <strong>modo binário</strong>, o MediaWiki armazena texto UTF-8 no banco de dados em campos binários.\nEsto é mais eficiente que o modo UTF-8 do MySQL e permite que você use a gama completa de caracteres Unicode.\n\nNo <strong>modo UTF-8</strong>, o MySQL saberá o caracterer em que seus dados estão inseridos e pode apresentá-lo e convertê-lo adequadamente, mas não permitirá que você armazene caracteres acima do [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Multilingue Básico].",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-install-auth": "Selecione o tipo de autenticação que será usado para se conectar ao banco de dados durante o processo de instalação.\nSe você selecionar \"{{int:config-mssql-windowsauth}}\", as credenciais de qualquer usuário que o servidor web esteja executando serão usadas.",
        "config-mssql-web-auth": "Selecione o tipo de autenticação que o servidor web usará para se conectar ao servidor do banco de dados, durante a operação normal da wiki.\nSe você selecionar \"{{int:config-mssql-windowsauth}}\", as credenciais de qualquer usuário no qual o servidor web está rodando serão usadas.",
index 26931f8..9593ebe 100644 (file)
        "config-mysql-myisam-dep": "<strong>Aviso:</strong>  Selecionou o MyISAM para motor de armazenamento do MySQL, uma combinação desaconselhada para usar com o MediaWiki porque:\n* praticamente não permite acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nSe a sua instalação do MySQL suporta InnoDB, é altamente recomendado que o escolha em vez do MyISAM.\nSe não suporta o InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
        "config-mysql-only-myisam-dep": "<strong>Aviso:</strong> O único motor de armazenamento para MySQL nesta máquina é o MyISAM e o seu uso com o MediaWiki não é recomendado porque:\n* praticamente não suporta acessos simultâneos, porque bloqueia tabelas\n* o MyISAM é mais suscetível a perdas da integridade dos dados do que outros motores\n* o código do MediaWiki não trabalha devidamente com o MyISAM\n\nA sua instalação MySQL não suporta InnoDB, talvez seja uma boa altura para atualizá-la para a versão mais recente.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> é quase sempre a melhor opção, porque suporta bem acessos simultâneos <i>(concurrency)</i>.\n\n<strong>MyISAM</strong> pode ser mais rápido no modo de utilizador único ou em instalações somente para leitura.\nAs bases de dados MyISAM tendem a perder integridade de dados com mais frequência do que as bases de dados InnoDB.",
-       "config-mysql-charset": "Conjunto de caracteres da base de dados:",
-       "config-mysql-binary": "Binário",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "No modo '''binary''' (\"binário\"), o MediaWiki armazena o texto UTF-8 na base de dados em campos binários.\nIsto é mais eficiente do que o modo UTF-8 do MySQL e permite que sejam usados todos os caracteres Unicode.\n\nNo modo '''UTF-8''', o MySQL saberá em que conjunto de caracteres os seus dados estão e pode apresentá-los e convertê-los da forma mais adequada,\nmas não lhe permitirá armazenar caracteres acima do [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Básico].",
        "config-mssql-auth": "Tipo de autenticação:",
        "config-mssql-install-auth": "Selecione o tipo de autenticação a usar para ligar à base de dados durante o processo de instalação.\nSe selecionar \"{{int:config-mssql-windowsauth}}\", serão usadas as credenciais do utilizador com que o servidor de Internet está a ser executado.",
        "config-mssql-web-auth": "Selecione o tipo de autenticação que o servidor de Internet irá usar para se ligar ao servidor da base de dados durante a operação normal da wiki.\nSe selecionar \"{{int:config-mssql-windowsauth}}\", serão usadas as credenciais do utilizador com que o servidor de Internet está a ser executado.",
index fb546ab..0779204 100644 (file)
        "config-mysql-myisam-dep": "Warning message in the MediaWiki installer when MyISAM is chosen as MySQL storage engine.",
        "config-mysql-only-myisam-dep": "Used as warning message when mysql does not support the minimum suggested feature set.",
        "config-mysql-engine-help": "Help text in MediaWiki installer with advice for picking a MySQL storage engine.",
-       "config-mysql-charset": "Field label for the MySQL character set in the MediaWiki installer.",
-       "config-mysql-binary": "{{Identical|Binary}}",
-       "config-mysql-utf8": "Option for the MySQL character set in the MediaWiki installer.",
-       "config-mysql-charset-help": "Help text for the MySQL character set setting in the MediaWiki installer.",
        "config-mssql-auth": "Radio button group label.\n\nFollowed by the following radio button labels:\n* {{msg-mw|Config-mssql-sqlauth}}\n* {{msg-mw|Config-mssql-windowsauth}}",
        "config-mssql-install-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for installation.\n\nRefers to {{msg-mw|Config-mssql-windowsauth}}.\n\nSee also:\n* {{msg-mw|Config-mssql-web-auth}}",
        "config-mssql-web-auth": "Used as the help text for the \"Authentication type\" radio button when typing in database settings for normal wiki usage.\n\nRefers to {{msg-mw|Config-mssql-windowsauth}}.\n\nSee also:\n* {{msg-mw|Config-mssql-install-auth}}",
index f5b2ced..048ac02 100644 (file)
@@ -91,9 +91,6 @@
        "config-mysql-engine": "Motor de stocare:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Setul de caractere al bazei de date:",
-       "config-mysql-binary": "Binar",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Tip de autentificare:",
        "config-site-name": "Numele wikiului:",
        "config-site-name-blank": "Introduceți un nume pentru sit.",
index 11c13d7..fcdaf00 100644 (file)
@@ -53,8 +53,6 @@
        "config-invalid-db-type": "Tipe de database invalide.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Binarie",
-       "config-mysql-utf8": "UTF-8",
        "config-ns-generic": "Proggette",
        "config-admin-email": "Indirizze e-mail:",
        "config-install-step-done": "fatte",
index 2c262ab..aeda43a 100644 (file)
        "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
        "config-mysql-only-myisam-dep": "<strong>Предупреждение:</strong> MyISAM — единственная доступная система хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования совместно с MediaWiki, потому что:\n* слабо поддерживает параллелизм из-за блокировки таблиц\n* больше других систем подвержена повреждению\n* кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        "config-mysql-engine-help": "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.\n\n'''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
-       "config-mysql-charset": "Кодировка базы данных:",
-       "config-mysql-binary": "Двоичный",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "В '''двоичном режиме''' MediaWiki хранит UTF-8 текст в бинарных полях базы данных.\nЭто более эффективно, чем ''UTF-8 режим'' MySQL, и позволяет использовать полный набор символов Unicode.\n\nВ '''режиме UTF-8''' MySQL будет знать в какой кодировке находятся Ваши данные и может отображать и преобразовывать их соответствующим образом, но это не позволит вам хранить символы выше [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Базовой Многоязыковой Плоскости].",
        "config-mssql-auth": "Тип аутентификации:",
        "config-mssql-install-auth": "Выберите тип проверки подлинности, который будет использоваться для подключения к базе данных во время процесса установки.\nЕсли вы выберите «{{int:config-mssql-windowsauth}}», будут использоваться учётные данные пользователя, под которым работает веб-сервер.",
        "config-mssql-web-auth": "Выберите тип проверки подлинности, который веб-сервер будет использовать для подключения к серверу базы данных во время обычного функционирования вики.\nЕсли вы выберите «{{int:config-mssql-windowsauth}}», будут использоваться учётные данные пользователя, под которым работает веб-сервер.",
index d0e3dc8..5b60540 100644 (file)
        "config-mysql-myisam-dep": "<strong>Warnishment:</strong> Ye'v selected MyISAM aes storage engine fer MySQL, this isna recommended fer uiss wi MediaWiki, cause:\n* it barelie supports concurrencie cause o buird lockin\n* it's mair prone til rot than ither engines\n* the MediaWiki codebase disna aye haunnle MyISAM aes it shid\n\nGif yer MySQL installâtion supports InnoDB, it is heilie recommended that ye chuise that instead.\nGif yer MySQL installâtion disna support InnoDB, than perhaps it's time fer aen upgrade.",
        "config-mysql-only-myisam-dep": "<strong>Warnishment:</strong> MyISAM is the yinly available storage engine fer MySQL oan this machine, n this isna recommended fer uiss wi MediaWiki, cause:\n* it barelie supports concurrencie cause o buird lockin\n* it is mair prone til rot than ither engines\n* the MediaWiki codebase disna aye haunnle MyISAM aes it shid\n\nYer MySQL installâtion dina support InnoDB, perhaps it's time fer aen upgrade.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> is awmaist aye the best optie, aes it haes guid concurrencie support.\n\n<strong>MyISAM</strong> micht be faster in single-uiser or read-yinly installâtions.\nMyISAM databases tend tae rot mair aften than InnoDB databases.",
-       "config-mysql-charset": "Database chairacter set:",
-       "config-mysql-binary": "Binarie",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "In <strong>binarie mode</strong>, MediaWiki stores UTF-8 tex til the database in binarie fields.\nThis is mair effeecient than MySQL's UTF-8 mode, n permits ye tae uise the ful range o Unicode chairacters.\n\nIn <strong>UTF-8 mode</strong>, MySQL will ken whit chairacter set yer data is in, n can present n convert it appropreeatelie, but it'll naw lat ye store chairacters abuin the [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Authentication type:",
        "config-mssql-install-auth": "Select the authentication type that's tae be uised tae connect wi the database durin the installation process.\nGif ye select \"{{int:config-mssql-windowsauth}}\", the credeentials o whitever uiser the wabserver is rinnin aes will be uised.",
        "config-mssql-web-auth": "Select the authentication type that the wab server will uise tae connect wi the database server, durin ordinair operation o the wiki.\nGif ye select \"{{int:config-mssql-winowsauth}}\", the credeentials o whitever uiser the wabserver is rinnin aes will be uised.",
index 410f480..363014c 100644 (file)
@@ -63,8 +63,6 @@
        "config-mysql-engine": "ආචයන එන්ජිම:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "ද්විමය",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-windowsauth": "windows සහතික කිරීම.",
        "config-site-name": "විකියෙහි නම:",
        "config-site-name-blank": "අඩවි නාමයක් යොදන්න.",
index 7e110c2..7e83f56 100644 (file)
        "config-mysql-engine": "Pogon skladiščenja:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Nabor znakov zbirke podatkov:",
-       "config-mysql-binary": "Dvojiško",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Tip avtentikacije:",
        "config-site-name": "Ime wikija:",
        "config-site-name-help": "To bo prikazano v naslovni vrstici brskalnika in na drugih različnih mestih.",
index 015b6ff..fa4ad6d 100644 (file)
@@ -69,7 +69,6 @@
        "config-mssql-old": "Потребан је Microsoft SQL Server $1 или новији. Ви имате $2.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Тип провере идентитета:",
        "config-mssql-sqlauth": "Провера идентитета SQL Server-а",
        "config-mssql-windowsauth": "Провера идентитета Виндоуса",
index 400b959..a691824 100644 (file)
        "config-mysql-myisam-dep": "'''Varning:''' Du har valt MyISAM som lagringsmotor för MySQL, vilket inte rekommenderas för användning med MediaWiki eftersom:\n* den knappt stöder samtidigt exekvering på grund av låsning av tabeller\n* den är mer benägen att korrumpera data än andra motorer\n* MediaWiki-kodbasen hanterar inte alltid MyISAM som den ska\n\nOm din MySQL-installation stöder InnoDB, är det starkt rekommenderat att du väljer det istället.\nOm din MySQL-installation inte stöder InnoDB, kanske det är dags för en uppgradering.",
        "config-mysql-only-myisam-dep": "'''Varning:''' MyISAM är den enda tillgängliga lagringsmotorn för MySQL på denna maskin, och den är inte rekommenderad att använda med MediaWiki eftersom:\n* den knappt stöder samtidigt exekvering på grund av låsning av tabeller\n* den är mer benägen att korrumpera data än andra motorer\n* MediaWiki-kodbasen hanterar inte alltid MyISAM som den ska\n\nDin MySQL-installation stöder inte InnoDB, det kanske är dags för en uppgradering.",
        "config-mysql-engine-help": "'''InnoDB''' är nästan alltid det bästa valet eftersom den har ett bra system för samtidiga arbeten.\n\n'''MyISAM''' kan vara snabbare i enanvändarläge eller skrivskyddade installationer.\nMyISAM-databaser tenderar att bli korrupta oftare än InnoDB-databaser.",
-       "config-mysql-charset": "Databasteckensuppsättning:",
-       "config-mysql-binary": "Binär",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "I '''binärt läge''' lagrar MediaWiki UTF-8 text till databasen i binära fält.\nDetta är mer effektivt än MySQLs UTF-8-läge, och den tillåter dig att använda den fulla uppsättningen av Unicode-tecken.\n\nI '''UTF-8-läge''' vet MySQL vilket teckenuppsättning din data är i och kan presentera och konvertera den på ett lämpligt sätt, men den tillåter dig inte att lagra tecken över [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Autentiseringstyp:",
        "config-mssql-install-auth": "Välj autentiseringstypen som kommer att användas för att ansluta till databasen under installationsprocessen.\nOm du väljer \"{{int:config-mssql-windowsauth}}\", kommer autentiseringsuppgifterna för den användare webbservern körs som att användas.",
        "config-mssql-web-auth": "Välj autentiseringstypen som kommer att användas för att ansluta till databasen under ordinarie drift av wikin.\nOm du väljer \"{{int:config-mssql-windowsauth}}\", kommer autentiseringsuppgifterna för den användare webbservern körs som att användas.",
index a531f4f..c2368da 100644 (file)
@@ -43,8 +43,6 @@
        "config-upgrade-done-no-regenerate": "தரமுயர்த்தல் முழுமையடைந்தது.\nநீங்கள் தற்போது [$1 உங்கள் விக்கியைப் பயன்படுத்தத் துவங்கலாம்].",
        "config-db-web-account": "வலை அணுகலுக்கான தரவுத் தளக் கணக்கு",
        "config-mysql-engine": "சேமிப்பு இயந்திரம்:",
-       "config-mysql-charset": "தரவுத் தள வரியுருத் தொகுதி:",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "விக்கியின் பெயர்:",
        "config-site-name-blank": "ஒரு தளத்தின் பெயரை உள்ளிடுக.",
        "config-ns-generic": "திட்டம்",
index ce949d1..dd4bd0c 100644 (file)
        "config-mysql-engine": "స్టోరేజీ ఇంజను:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "డేటాబేసు కారెక్టరు సెట్:",
-       "config-mysql-binary": "బైనరీ",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "ఆథెంటికేషన్ రకం:",
        "config-mssql-sqlauth": "SQL Server ఆథెంటికేషన్",
        "config-mssql-windowsauth": "విండోస్ ఆథెంటికేషన్",
index 4c3a32d..ab47a50 100644 (file)
        "config-mysql-myisam-dep": "<strong>คำเตือน:</strong> คุณได้เลือก MyISAM เป็นกลไกที่จัดเก็บข้อมูลสำหรับ MySQL ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nถ้าการติดตั้ง MySQL ของคุณสนับสนุน InnoDB แนะนำอย่างยิ่งว่าให้คุณเลือก InnoDB แทน\nถ้าการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว",
        "config-mysql-only-myisam-dep": "<strong>คำเตือน:</strong> กลไกที่จัดเก็บข้อมูลสำหรับ MySQL ที่พร้อมใช้งานบนเครื่องนี้มีเพียง MyISAM ซึ่่งไม่แนะนำให้ใช้กับ MediaWiki เนื่องจาก:\n* ไม่ค่อยสนับสนุนกระบวนการทำงานพร้อมกันเนื่องจากการล็อกตารางข้อมูล\n* มีแนวโน้มที่จะเสียหายมากกว่ากลไกอื่น\n* Codebase ของ MediaWiki ไม่สามารถจัดการ MyISAM ได้ดีเท่าที่ควร\n\nการติดตั้ง MySQL ของคุณไม่สนับสนุน InnoDB อาจถึงเวลาที่คุณต้องอัปเกรดแล้ว",
        "config-mysql-engine-help": "<strong>InnoDB</strong> เป็นตัวเลือกที่เกือบดีที่สุดเสมอ เนื่องจากมีการสนับสนุนกระบวนการทำงานพร้อมกัน\n\n<strong>MyISAM</strong> อาจทำงานได้เร็วกว่าในการติดตั้งแบบผู้ใช้คนเดียวหรือแบบอ่านอย่างเดียว\nฐานข้อมูล MyISAM มักจะได้รับความเสียหายบ่อยมากกว่าฐานข้อมูล InnoDB",
-       "config-mysql-charset": "ชุดอักขระของฐานข้อมูล:",
-       "config-mysql-binary": "ไบนารี",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "ใน<strong>โหมดไบนารี</strong> MediaWiki จะจัดเก็บข้อความ UTF-8 ไว้ในฐานข้อมูลในเขตข้อมูลไบนารี\nการใช้โหมดไบนารีจะมีประสิทธิภาพมากกว่าการใช้โหมด UTF-8 ของ MySQL และจะอนุญาตให้คุณสามารถใช้อักขระที่มีใน Unicode ได้หมดทุกช่วง\n\nใน<strong>โหมด UTF-8</strong> MySQL จะทราบว่าข้อมูลของคุณอยู่ในชุดอักขระได้ และจะสามารถเสนอและแปลงข้อมูลดังกล่าวได้อย่างเหมาะสม แต่จะไม่อนุญาตให้คุณจัดเก็บข้อมูลที่มีอักขระนอกเหนือจากในช่วง[https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes เพลนหลายภาษาพื้นฐาน]",
        "config-mssql-auth": "ชนิดการยืนยันตัวตน:",
        "config-mssql-install-auth": "เลือกชนิดการยืนยันตัวตนที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างกระบวนการติดตั้ง\nถ้าคุณเลือก \"{{int:config-mssql-windowsauth}}\" ข้อมูลประจำตัวที่ระบุว่าเว็บเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ใดจะถูกใช้",
        "config-mssql-web-auth": "เลือกชนิดการยืนยันตัวตนที่จะใช้เชื่อมต่อไปยังฐานข้อมูลในระหว่างการใช้งานวิกิตามปกติ\nถ้าคุณเลือก \"{{int:config-mssql-windowsauth}}\" ข้อมูลประจำตัวที่ระบุว่าเว็บเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ใดจะถูกใช้",
index ab6632f..6298cb7 100644 (file)
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''Babala''': Pinili mo ang MyISAM bilang makinang imbakan para sa MySQL, na hindi iminumungkahi para gamitin sa MediaWiki, sapagkat:\n* bahagya lamang itong sumusuporta ng pagkakasundu-sundo dahil sa pagkakandado ng talahanayan\n* mas malaki ang pagkakataon na kapitan ng sira kaysa sa ibang mga makina\n* ang himpilang kodigo ng MediaWiki ay hindi palaging humahawak ng MyISAM ayon sa nararapat\n\nKung ang iyong nakaluklok na MySQL ay sumusuporta ng InnoDB, higit na iminumungkahi na piliin mo iyon sa halip.\nKung ang iyong nakaluklok na MySQL ay hindi sumusuporta ng InnoDB, marahil ay panahon na para sa isang pagtataas ng uri.",
        "config-mysql-engine-help": "Ang '''InnoDB''' ay ang halos palaging pinaka mainam na mapipili, dahil mayroon itong mabuting suporta ng pagkakasundu-sundo.\n\nMaaaring mas mabilis ang '''MyISAM''' sa mga pagluluklok na pang-isahang tagagamit o mababasa lamang.\nMay gawi ang mga kalipunan ng dato ng MyISAM na masira nang mas madalas kaysa sa mga kalipunan ng dato ng InnoDB.",
-       "config-mysql-charset": "Pangkat ng panitik ng kalipunan ng dato:",
-       "config-mysql-binary": "Binaryo",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Sa '''gawi na binaryo''', iniimbak ng MediaWiki ang tekstong UTF-8 sa kalipunan ng dato sa loob ng mga hanay na binaryo.\nMas kapaki-pakinabang ito kaysa sa gawi na UTF-8 ng MySQL, at nagpapahintulot sa iyo upang magamit ang buong kasaklawan ng mga panitik ng Unikodigo.\n\nSa ''gawi na UTF-8''', malalaman ng MySQL kung sa anong pangkat ng panitik nakapaloob ang iyong dato, at angkop na makakapagharap at makapapagpalit nito, subalit hindi ka nito papayagan na mag-imbak ng mga panitik na nasa itaas ng [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] o Saligang Tapyas na Pangmaramihang Wika.",
        "config-site-name": "Pangalan ng wiki:",
        "config-site-name-help": "Lilitaw ito sa bareta ng pamagat ng pantingin-tingin at sa samu't saring ibang mga lugar.",
        "config-site-name-blank": "Magpasok ng isang pangalan ng sityo.",
index 9f63ba8..60f3000 100644 (file)
        "config-mysql-engine": "Depolama motoru:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-charset": "Veritabanı karakter seti",
-       "config-mysql-binary": "İkili",
-       "config-mysql-utf8": "UTF-8",
        "config-mssql-auth": "Kimlik doğrulama türü:",
        "config-mssql-install-auth": "Kurulum işlemi sırasında veritabanına bağlanmak için kullanılacak doğrulama türünü seçin.\n\"{{int:config-mssql-windowsauth}}\"'ı seçerseniz,ağ sunucusu olarak çalışan kullanıcının kimlik bilgileri kullanılacaktır.",
        "config-mssql-sqlauth": "SQL Server kimlik doğrulaması",
index 391e8ae..9ebbc27 100644 (file)
@@ -41,8 +41,6 @@
        "config-db-schema": "MediaWiki өчен төзелеш:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Икеле",
-       "config-mysql-utf8": "UTF-8",
        "config-ns-generic": "Проект",
        "config-ns-other": "Башка (күрсәтегез)",
        "config-ns-other-default": "MyWiki",
index 9d890f7..b1e69df 100644 (file)
        "config-mysql-myisam-dep": "'''Увага''': Ви обрали MyISAM для зберігання даних MySQL, що не рекомендовано для роботи з MediaWiki, оскільки:\n* він слабко підтримує паралелізм через блокування таблиць\n* він більш схильний до ушкоджень, ніж інші двигуни\n* база коду MediaWiki не завжди працює з MyISAM так, як мала б.\n\nЯкщо Ваша інсталяція MySQL підтримує InnoDB, дуже рекомендується вибрати цей двигун.\nЯкщо Ваша інсталяція MySQL не підтримує InnoDB, можливо настав час її оновити.",
        "config-mysql-only-myisam-dep": "\"'Зауваження:\"' MyISAM є єдиним механізмом для зберігання MySQL на цій машині, який не рекомендується для використання з MediaWiki, оскільки:\n* слабо підтримує паралелізм через блокування таблиць\n* більш схильний до пошкоджень, ніж інші двигуни\n* код MediaWiki не завжди розглядає MyISAM, як повинен\n\nТвоє встановлення MySQL не підтримує InnoDB, можливо, потрібно оновити.",
        "config-mysql-engine-help": "'''InnoDB''' є завжди кращим вибором, оскільки краще підтримує паралельний доступ.\n\n'''MyISAM''' може бути швидшим для одного користувача або в інсталяціях read-only.\nБази даних MyISAM схильні псуватись частіше, ніж бази InnoDB.",
-       "config-mysql-charset": "Кодування бази даних:",
-       "config-mysql-binary": "Двійкове",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "У '''бінарному режимі''' MediaWiki зберігає текст UTF-8 у базі даних з бінарними полями.\nЦе більш ефективно, ніж UTF-8 режим MySQL, і дозволяє використовувати увесь набір символів Юнікоду.\n\nУ '''режимі UTF-8''' MySQL буде знати, якого символу стосуються Ваші дані, і могтиме відображати та конвертувати їх належним чином, але не дозволятиме зберігати символи, що виходять за межі [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Тип автентифікації:",
        "config-mssql-install-auth": "Виберіть тип перевірки автентичності, який буде використовуватися для підключення до бази даних під час процесу установки. \nЯкщо ви оберете \"{{int:config-mssql-windowsauth}}\", будуть використовуватися облікові дані користувача, під яким працює веб-сервер.",
        "config-mssql-web-auth": "Виберіть тип перевірки автентичності, який веб-сервер буде використовувати для підключення до сервера бази даних під час звичайного функціонування вікі. \nЯкщо ви оберете \"{{int:config-mssql-windowsauth}}\", будуть використовуватися облікові дані користувача, під яким працює веб-сервер.",
index 1c2861a..0ecd688 100644 (file)
        "config-mysql-myisam-dep": "<strong>Cảnh báo:</strong> Bạn đã chọn MyISAM làm động cơ lưu trữ cho MySQL, điều này không được khuyến khích sử dụng với MediaWiki, bởi vì:\n* Nó ít hỗ trợ đồng thời do việc khóa bảng\n* Nó dễ bị lỗi hơn so với các động cơ khác\n* Kho mã nguồn của MediaWiki không phải khi nào cũng xử lý MyISAM như mong muốn\n\nNếu cài đặt MySQL của bạn hỗ trợ InnoDB, đặc biệt khuyến cáo bạn nên chọn để thay thế.\nNếu cài đặt MySQL của bạn không hỗ trợ InnoDB, có lẽ đã đến lúc để nâng cấp.",
        "config-mysql-only-myisam-dep": "<strong>Cảnh báo:</strong> MyISAM chỉ là công cụ lưu trữ có sẵn cho MySQL trên máy tính này, và điều này không được khuyến khích sử dụng với MediaWiki, bởi vì:\n* Nó ít hỗ trợ đồng thời do việc khóa khóa\n* Nó là dễ bị hư hỏng hơn các engine khác\n* Codebase MediaWiki không phải khi nào cũng xử lý MyISAM như mong muốn\n\nCài đặt MySQL của bạn không hỗ trợ InnoDB, có lẽ đã đến lúc để nâng cấp.",
        "config-mysql-engine-help": "<strong>InnoDB</strong> hầu như luôn là tùy chọn tốt nhất, vì nó có hỗ trợ đồng thời rất tốt.\n\n<strong>MyISAM</strong> có thể nhanh hơn trong chế độ một người dùng hoặc các cài đặt chỉ-đọc (read-only).\nCơ sở dữ liệu MyISAM có xu hướng thường xuyên bị hỏng hóc hơn so với cơ sở dữ liệu InnoDB.",
-       "config-mysql-charset": "Bảng mã cơ sở dữ liệu:",
-       "config-mysql-binary": "Nhị phân",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "Trong <strong>chế độ nhị phân</strong>, MediaWiki lưu văn bản UTF-8 vào cơ sở dữ liệu trong các trường nhị phân.\nĐiều này hiệu quả hơn so với chế độ UTF-8 của MySQL, và cho phép bạn sử dụng đầy đủ các ký tự Unicode.\n\nTrong <strong>chế độ UTF-8 </strong>, MySQL sẽ biết những ký tự nào thiết lập dữ liệu của bạn, và có thể trình bày và chuyển đổi nó một cách thích hợp, nhưng nó sẽ không cho phép bạn lưu trữ các ký tự nằm trên [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Kiểu xác thực:",
        "config-mssql-install-auth": "Chọn loại xác thực sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nNếu bạn chọn “{{int:config-mssql-windowsauth}}”, thông tin của bất cứ người sử dụng nào mà máy chủ web đang chạy sẽ được sử dụng.",
        "config-mssql-web-auth": "Chọn kiểu xác thực mà máy chủ web sẽ sử dụng để kết nối đến máy chủ cơ sở dữ liệu, trong quá trình hoạt động bình thường của wiki.\nNếu bạn chọn “{{int:config-mssql-windowsauth}}”, thông tin của bất cứ người sử dụng nào mà máy chủ web đang hoạt động sẽ được sử dụng.",
index c598a0b..d6a364c 100644 (file)
@@ -61,8 +61,6 @@
        "config-db-web-account": "Database account para han web access",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-binary": "Binary",
-       "config-mysql-utf8": "UTF-8",
        "config-site-name": "Ngaran han wiki:",
        "config-ns-generic": "Proyekto",
        "config-ns-site-name": "Kapareho han wiki nga ngaran: $1",
index d75f45e..d22c566 100644 (file)
        "config-mysql-myisam-dep": "<strong>警告:</strong>您选择了MyISAM作为MySQL的存储引擎,MediaWiki并不推荐您这么做,因为:\n* 它仅能通过表锁定来勉强支持并发\n* 与其他引擎相比,它更容易被损坏\n* MediaWiki代码库并不总会去处理MyISAM\n\n如果您的MySQL程序支持InnoDB,我们高度推荐您使用该引擎替代MyISAM。\n如果您的MySQL程序不支持InnoDB,请考虑升级。",
        "config-mysql-only-myisam-dep": "<strong>警告:</strong>MyISAM是MySQL在此机器上唯一可用的存储引擎,但它不适合用于MediaWiki,因为:\n*因为表级锁定,它几乎不支持并发。\n*它相比其他引擎更容易损坏。\n*MediaWiki代码不能总是按照预期操作MyISAM。\n\n你的MySQL不支持InnoDB,是时候升级了。",
        "config-mysql-engine-help": "<strong>InnoDB</strong>通常是最佳选项,因为它对并发操作有着良好的支持。\n\n<strong>MyISAM</strong>在单用户或只读环境下可能会有更快的性能表现。但MyISAM数据库出错的概率一般要大于InnoDB数据库。",
-       "config-mysql-charset": "数据库字符集:",
-       "config-mysql-binary": "二进制",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "在<strong>二进制模式</strong>下,MediaWiki会将UTF-8编码的文本存于数据库的二进制字段中。相对于MySQL的UTF-8模式,这种方法效率更高,并允许您使用全范围的Unicode字符。\n\n在<strong>UTF-8模式</strong>下,MySQL将知道您数据使用的字符集,并能适当地提供和转换内容。但这样做您将无法在数据库中存储[https://zh.wikipedia.org/wiki/基本多文种平面 基本多文种平面]以外的字符。",
        "config-mssql-auth": "身份验证类型:",
        "config-mssql-install-auth": "选择安装过程中链接数据库时将采用的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行服务器的用户的身份凭据。",
        "config-mssql-web-auth": "选择Web服务器在通常wiki操作期间用来连接数据库服务器的身份验证方式。如果您选择“{{int:config-mssql-windowsauth}}”,将使用运行Web服务器的用户的凭据。",
index 7c3b00c..a54f66b 100644 (file)
        "config-mysql-myisam-dep": "<strong>警告:</strong>您選擇用來做為 MySQL 的儲存引撆 MyISAM 並不建議使用在 MediaWiki,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 支援 InnoDB,我們強烈建議您改用 InnoDB。\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
        "config-mysql-only-myisam-dep": "<strong>警告:</strong>您的伺服器上的 MySQL 唯一可用的儲存引擎是 MyISAM,但並不建議使用,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
        "config-mysql-engine-help": "由於對同時連線有較好的處理能力,<strong>InnoDB</strong> 通常是最佳的選項。\n\n<strong>MyISAM</strong> 只在單人使用或者唯讀作業的情況之下才可能有較快的處理能力。\n相較於 InnoDB,MyISAM 也較容易出現資料損毀的情況。",
-       "config-mysql-charset": "資料庫字元集:",
-       "config-mysql-binary": "二進制",
-       "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "在 <strong>二進制模式</strong> 下,MediaWiki 將 UTF-8 的文字儲存在二進位型態的欄位。\n這個模式比 MySQL 的 UTF-8 模式還要更有效,並且可以讓您使用完整的 Unicode 字元集。\n\n在 <strong>UTF-8 模式</strong> 下,MySQL 可以知道您的資料使用何種編碼儲存,您可以正常的取得與轉換內容,但此個模式只支援到 Unicode 中的  [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 基本多文種平面] 字元。",
        "config-mssql-auth": "身份驗證類型:",
        "config-mssql-install-auth": "請選擇安裝程序中要用來連線資料庫使用的身份驗證類型。\n若您選擇 \"{{int:config-mssql-windowsauth}}\",不論網頁伺服器是使用何種身份執行都會使用這組驗證資料。",
        "config-mssql-web-auth": "請選擇一般操作中要用來連線資料庫使用的身份驗證類型。\n若您選擇 \"{{int:config-mssql-windowsauth}}\",不論網頁伺服器是使用何種身份執行都會使用這組驗證資料。",
index d5103da..eada9d4 100644 (file)
@@ -314,10 +314,10 @@ class ClassicInterwikiLookup implements InterwikiLookup {
        private function loadFromArray( $mc ) {
                if ( isset( $mc['iw_url'] ) ) {
                        $url = $mc['iw_url'];
-                       $local = isset( $mc['iw_local'] ) ? $mc['iw_local'] : 0;
-                       $trans = isset( $mc['iw_trans'] ) ? $mc['iw_trans'] : 0;
-                       $api = isset( $mc['iw_api'] ) ? $mc['iw_api'] : '';
-                       $wikiId = isset( $mc['iw_wikiid'] ) ? $mc['iw_wikiid'] : '';
+                       $local = $mc['iw_local'] ?? 0;
+                       $trans = $mc['iw_trans'] ?? 0;
+                       $api = $mc['iw_api'] ?? '';
+                       $wikiId = $mc['iw_wikiid'] ?? '';
 
                        return new Interwiki( null, $url, $api, $wikiId, $local, $trans );
                }
index b16cfa3..45ab4d3 100644 (file)
@@ -170,9 +170,7 @@ abstract class Job implements IJobSpecification {
         * @since 1.27
         */
        public function getRequestId() {
-               return isset( $this->params['requestId'] )
-                       ? $this->params['requestId']
-                       : null;
+               return $this->params['requestId'] ?? null;
        }
 
        /**
@@ -280,12 +278,8 @@ abstract class Job implements IJobSpecification {
         */
        public function getRootJobParams() {
                return [
-                       'rootJobSignature' => isset( $this->params['rootJobSignature'] )
-                               ? $this->params['rootJobSignature']
-                               : null,
-                       'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
-                               ? $this->params['rootJobTimestamp']
-                               : null
+                       'rootJobSignature' => $this->params['rootJobSignature'] ?? null,
+                       'rootJobTimestamp' => $this->params['rootJobTimestamp'] ?? null
                ];
        }
 
index d2446ab..c4ce2ba 100644 (file)
@@ -58,8 +58,8 @@ abstract class JobQueue {
        protected function __construct( array $params ) {
                $this->wiki = $params['wiki'];
                $this->type = $params['type'];
-               $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
-               $this->maxTries = isset( $params['maxTries'] ) ? $params['maxTries'] : 3;
+               $this->claimTTL = $params['claimTTL'] ?? 0;
+               $this->maxTries = $params['maxTries'] ?? 3;
                if ( isset( $params['order'] ) && $params['order'] !== 'any' ) {
                        $this->order = $params['order'];
                } else {
@@ -69,12 +69,8 @@ abstract class JobQueue {
                        throw new MWException( __CLASS__ . " does not support '{$this->order}' order." );
                }
                $this->dupCache = wfGetCache( CACHE_ANYTHING );
-               $this->aggr = isset( $params['aggregator'] )
-                       ? $params['aggregator']
-                       : new JobQueueAggregatorNull( [] );
-               $this->readOnlyReason = isset( $params['readOnlyReason'] )
-                       ? $params['readOnlyReason']
-                       : false;
+               $this->aggr = $params['aggregator'] ?? new JobQueueAggregatorNull( [] );
+               $this->readOnlyReason = $params['readOnlyReason'] ?? false;
        }
 
        /**
index a082d64..bc73718 100644 (file)
@@ -55,7 +55,7 @@ class JobQueueDB extends JobQueue {
        protected function __construct( array $params ) {
                parent::__construct( $params );
 
-               $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
+               $this->cluster = $params['cluster'] ?? false;
                $this->cache = ObjectCache::getMainWANInstance();
        }
 
index 7f3b2b1..0f8fcfb 100644 (file)
@@ -73,15 +73,11 @@ class JobQueueFederated extends JobQueue {
         */
        protected function __construct( array $params ) {
                parent::__construct( $params );
-               $section = isset( $params['sectionsByWiki'][$this->wiki] )
-                       ? $params['sectionsByWiki'][$this->wiki]
-                       : 'default';
+               $section = $params['sectionsByWiki'][$this->wiki] ?? 'default';
                if ( !isset( $params['partitionsBySection'][$section] ) ) {
                        throw new MWException( "No configuration for section '$section'." );
                }
-               $this->maxPartitionsTry = isset( $params['maxPartitionsTry'] )
-                       ? $params['maxPartitionsTry']
-                       : 2;
+               $this->maxPartitionsTry = $params['maxPartitionsTry'] ?? 2;
                // Get the full partition map
                $partitionMap = $params['partitionsBySection'][$section];
                arsort( $partitionMap, SORT_NUMERIC );
index 7dad014..e9505bc 100644 (file)
@@ -93,7 +93,7 @@ class JobQueueRedis extends JobQueue {
                parent::__construct( $params );
                $params['redisConfig']['serializer'] = 'none'; // make it easy to use Lua
                $this->server = $params['redisServer'];
-               $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
+               $this->compression = $params['compression'] ?? 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
                if ( empty( $params['daemonized'] ) ) {
                        throw new InvalidArgumentException(
index 01f467f..e63f01f 100644 (file)
@@ -44,7 +44,7 @@ class JobQueueSecondTestQueue extends JobQueue {
                $conf = [ 'wiki' => $params['wiki'], 'type' => $params['type'] ];
                $this->mainQueue = JobQueue::factory( $params['mainqueue'] + $conf );
                $this->debugQueue = JobQueue::factory( $params['debugqueue'] + $conf );
-               $this->onlyWriteToDebugQueue = isset( $params['readonly'] ) ? $params['readonly'] : false;
+               $this->onlyWriteToDebugQueue = $params['readonly'] ?? false;
 
                // We need to construct parent after creating the main and debug queue
                // because super constructor calls some methods we delegate to the main queue.
index 977fbda..a85613a 100644 (file)
@@ -109,9 +109,9 @@ class JobRunner implements LoggerAwareInterface {
 
                $response = [ 'jobs' => [], 'reached' => 'none-ready' ];
 
-               $type = isset( $options['type'] ) ? $options['type'] : false;
-               $maxJobs = isset( $options['maxJobs'] ) ? $options['maxJobs'] : false;
-               $maxTime = isset( $options['maxTime'] ) ? $options['maxTime'] : false;
+               $type = $options['type'] ?? false;
+               $maxJobs = $options['maxJobs'] ?? false;
+               $maxTime = $options['maxTime'] ?? false;
                $noThrottle = isset( $options['throttle'] ) && !$options['throttle'];
 
                // Bail if job type is invalid
index b62b83c..af5646a 100644 (file)
@@ -186,12 +186,8 @@ class JobSpecification implements IJobSpecification {
 
        public function getRootJobParams() {
                return [
-                       'rootJobSignature' => isset( $this->params['rootJobSignature'] )
-                               ? $this->params['rootJobSignature']
-                               : null,
-                       'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
-                               ? $this->params['rootJobTimestamp']
-                               : null
+                       'rootJobSignature' => $this->params['rootJobSignature'] ?? null,
+                       'rootJobTimestamp' => $this->params['rootJobTimestamp'] ?? null
                ];
        }
 
index db07086..7d0e1e6 100644 (file)
@@ -49,9 +49,7 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
-               $this->servers = isset( $params['redisServers'] )
-                       ? $params['redisServers']
-                       : [ $params['redisServer'] ]; // b/c
+               $this->servers = $params['redisServers'] ?? [ $params['redisServer'] ]; // b/c
                $params['redisConfig']['serializer'] = 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
                $this->logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'redis' );
index d0969e4..0a14192 100644 (file)
@@ -55,7 +55,7 @@ class DeleteLinksJob extends Job {
                }
 
                $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-               $timestamp = isset( $this->params['timestamp'] ) ? $this->params['timestamp'] : null;
+               $timestamp = $this->params['timestamp'] ?? null;
                $page = WikiPage::factory( $this->title ); // title when deleted
 
                $update = new LinksDeletionUpdate( $page, $pageId, $timestamp );
index 34028df..7d0ada5 100644 (file)
@@ -128,9 +128,7 @@ class HTMLCacheUpdateJob extends Job {
                // not expected to invalidate these cache entries too often.
                $touchTimestamp = wfTimestampNow();
                // If page_touched is higher than this, then something else already bumped it after enqueue
-               $condTimestamp = isset( $this->params['rootJobTimestamp'] )
-                       ? $this->params['rootJobTimestamp']
-                       : $touchTimestamp;
+               $condTimestamp = $this->params['rootJobTimestamp'] ?? $touchTimestamp;
 
                $dbw = wfGetDB( DB_MASTER );
                $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
index e89812b..d2b2107 100644 (file)
@@ -84,7 +84,7 @@ class PublishStashedFileJob extends Job {
                                $this->params['text'],
                                $this->params['watch'],
                                $user,
-                               isset( $this->params['tags'] ) ? $this->params['tags'] : []
+                               $this->params['tags'] ?? []
                        );
                        if ( !$status->isGood() ) {
                                UploadBase::setSessionStatus(
index 76f8d6d..bf27e9c 100644 (file)
@@ -103,7 +103,7 @@ class BacklinkJobUtils {
                        $realBSize = $bSize;
                }
 
-               $extraParams = isset( $opts['params'] ) ? $opts['params'] : [];
+               $extraParams = $opts['params'] ?? [];
 
                $jobs = [];
                // Combine the first range (of size $bSize) backlinks into leaf jobs
index acbbf26..b99b0b8 100644 (file)
@@ -84,8 +84,8 @@ class FormatJson {
         *       and U+000D (CR). However, PHP already escapes LF and CR according to RFC 4627.
         */
        private static $badChars = [
-               "\xe2\x80\xa8", // U+2028 LINE SEPARATOR
-               "\xe2\x80\xa9", // U+2029 PARAGRAPH SEPARATOR
+               "\u{2028}", // U+2028 LINE SEPARATOR
+               "\u{2029}", // U+2029 PARAGRAPH SEPARATOR
        ];
 
        /**
index da75ed4..74e8b54 100644 (file)
@@ -179,7 +179,7 @@ class CSSMin {
         * @return string
         */
        public static function serializeStringValue( $value ) {
-               $value = strtr( $value, [ "\0" => "\xEF\xBF\xBD", '\\' => '\\\\', '"' => '\\"' ] );
+               $value = strtr( $value, [ "\0" => "\u{FFFD}", '\\' => '\\\\', '"' => '\\"' ] );
                $value = preg_replace_callback( '/[\x01-\x1f\x7f]/', function ( $match ) {
                        return '\\' . base_convert( ord( $match[0] ), 10, 16 ) . ' ';
                }, $value );
index 7e65216..4b14160 100644 (file)
@@ -84,7 +84,7 @@ class HttpStatus {
                        507 => 'Insufficient Storage',
                        511 => 'Network Authentication Required',
                ];
-               return isset( $statusMessage[$code] ) ? $statusMessage[$code] : null;
+               return $statusMessage[$code] ?? null;
        }
 
        /**
index 43cd7db..2e8b591 100644 (file)
@@ -575,7 +575,7 @@ class JavaScriptMinifier {
 
                        // Now get the token type from our type array
                        $token = substr( $s, $pos, $end - $pos ); // so $end - $pos == strlen( $token )
-                       $type = isset( $tokenTypes[$token] ) ? $tokenTypes[$token] : self::TYPE_LITERAL;
+                       $type = $tokenTypes[$token] ?? self::TYPE_LITERAL;
 
                        if ( $newlineFound && isset( $semicolon[$state][$type] ) ) {
                                // This token triggers the semicolon insertion mechanism of javascript. While we
index d60af34..4a62e72 100644 (file)
@@ -60,7 +60,7 @@ class MappedIterator extends FilterIterator {
                }
                parent::__construct( $baseIterator );
                $this->vCallback = $vCallback;
-               $this->aCallback = isset( $options['accept'] ) ? $options['accept'] : null;
+               $this->aCallback = $options['accept'] ?? null;
        }
 
        public function next() {
index d75d698..cb60b01 100644 (file)
@@ -172,7 +172,7 @@ class MultiHttpClient implements LoggerAwareInterface {
                                throw new Exception( "Request has no 'url' field set." );
                        }
                        $this->logger->debug( "{$req['method']}: {$req['url']}" );
-                       $req['query'] = isset( $req['query'] ) ? $req['query'] : [];
+                       $req['query'] = $req['query'] ?? [];
                        $headers = []; // normalized headers
                        if ( isset( $req['headers'] ) ) {
                                foreach ( $req['headers'] as $name => $value ) {
@@ -184,7 +184,7 @@ class MultiHttpClient implements LoggerAwareInterface {
                                $req['body'] = '';
                                $req['headers']['content-length'] = 0;
                        }
-                       $req['flags'] = isset( $req['flags'] ) ? $req['flags'] : [];
+                       $req['flags'] = $req['flags'] ?? [];
                        $handles[$index] = $this->getCurlHandle( $req, $opts );
                        if ( count( $reqs ) > 1 ) {
                                // https://github.com/guzzle/guzzle/issues/349
@@ -286,10 +286,10 @@ class MultiHttpClient implements LoggerAwareInterface {
                $ch = curl_init();
 
                curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT,
-                       isset( $opts['connTimeout'] ) ? $opts['connTimeout'] : $this->connTimeout );
-               curl_setopt( $ch, CURLOPT_PROXY, isset( $req['proxy'] ) ? $req['proxy'] : $this->proxy );
+                       $opts['connTimeout'] ?? $this->connTimeout );
+               curl_setopt( $ch, CURLOPT_PROXY, $req['proxy'] ?? $this->proxy );
                curl_setopt( $ch, CURLOPT_TIMEOUT,
-                       isset( $opts['reqTimeout'] ) ? $opts['reqTimeout'] : $this->reqTimeout );
+                       $opts['reqTimeout'] ?? $this->reqTimeout );
                curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
                curl_setopt( $ch, CURLOPT_MAXREDIRS, 4 );
                curl_setopt( $ch, CURLOPT_HEADER, 0 );
index 7b1a914..04a13e2 100644 (file)
@@ -52,7 +52,7 @@ class Timing implements LoggerAwareInterface {
 
        public function __construct( array $params = [] ) {
                $this->clearMarks();
-               $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
+               $this->setLogger( $params['logger'] ?? new NullLogger() );
        }
 
        /**
@@ -155,7 +155,7 @@ class Timing implements LoggerAwareInterface {
         */
        private function sortEntries() {
                uasort( $this->entries, function ( $a, $b ) {
-                       return 10000 * ( $a['startTime'] - $b['startTime'] );
+                       return $a['startTime'] <=> $b['startTime'];
                } );
        }
 
@@ -188,6 +188,6 @@ class Timing implements LoggerAwareInterface {
         * @return array|null Entry named $name or null if it does not exist.
         */
        public function getEntryByName( $name ) {
-               return isset( $this->entries[$name] ) ? $this->entries[$name] : null;
+               return $this->entries[$name] ?? null;
        }
 }
index 7fad882..7532ce7 100644 (file)
@@ -54,7 +54,7 @@ class UDPTransport {
                        // IPv6 bracketed host
                        $host = $m[1];
                        $port = intval( $m[2] );
-                       $prefix = isset( $m[3] ) ? $m[3] : false;
+                       $prefix = $m[3] ?? false;
                        $domain = AF_INET6;
                } elseif ( preg_match( '!^udp:(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $info, $m ) ) {
                        $host = $m[1];
@@ -62,7 +62,7 @@ class UDPTransport {
                                $host = gethostbyname( $host );
                        }
                        $port = intval( $m[2] );
-                       $prefix = isset( $m[3] ) ? $m[3] : false;
+                       $prefix = $m[3] ?? false;
                        $domain = AF_INET;
                } else {
                        throw new InvalidArgumentException( __METHOD__ . ': Invalid UDP specification' );
index 5af22ed..90e52f0 100644 (file)
@@ -370,11 +370,10 @@ class XhprofData {
                return function ( $a, $b ) use ( $key, $sub ) {
                        if ( isset( $a[$key] ) && isset( $b[$key] ) ) {
                                // Descending sort: larger values will be first in result.
-                               // Assumes all values are numeric.
                                // Values for 'main()' will not have sub keys
                                $valA = is_array( $a[$key] ) ? $a[$key][$sub] : $a[$key];
                                $valB = is_array( $b[$key] ) ? $b[$key][$sub] : $b[$key];
-                               return $valB - $valA;
+                               return $valB <=> $valA;
                        } else {
                                // Sort datum with the key before those without
                                return isset( $a[$key] ) ? -1 : 1;
index ef2b768..54d43d3 100644 (file)
@@ -26,9 +26,9 @@ class ComposerInstalled {
                        $deps[$installed['name']] = [
                                'version' => ComposerJson::normalizeVersion( $installed['version'] ),
                                'type' => $installed['type'],
-                               'licenses' => isset( $installed['license'] ) ? $installed['license'] : [],
-                               'authors' => isset( $installed['authors'] ) ? $installed['authors'] : [],
-                               'description' => isset( $installed['description'] ) ? $installed['description'] : '',
+                               'licenses' => $installed['license'] ?? [],
+                               'authors' => $installed['authors'] ?? [],
+                               'description' => $installed['description'] ?? '',
                        ];
                }
 
index dc8bc03..c5b5f00 100644 (file)
@@ -26,9 +26,9 @@ class ComposerLock {
                        $deps[$installed['name']] = [
                                'version' => ComposerJson::normalizeVersion( $installed['version'] ),
                                'type' => $installed['type'],
-                               'licenses' => isset( $installed['license'] ) ? $installed['license'] : [],
-                               'authors' => isset( $installed['authors'] ) ? $installed['authors'] : [],
-                               'description' => isset( $installed['description'] ) ? $installed['description'] : '',
+                               'licenses' => $installed['license'] ?? [],
+                               'authors' => $installed['authors'] ?? [],
+                               'description' => $installed['description'] ?? '',
                        ];
                }
 
index d60e768..c2c3b47 100644 (file)
@@ -89,8 +89,8 @@ class FSFileBackend extends FileBackendStore {
                        }
                }
 
-               $this->fileMode = isset( $config['fileMode'] ) ? $config['fileMode'] : 0644;
-               $this->dirMode = isset( $config['directoryMode'] ) ? $config['directoryMode'] : 0777;
+               $this->fileMode = $config['fileMode'] ?? 0644;
+               $this->dirMode = $config['directoryMode'] ?? 0777;
                if ( isset( $config['fileOwner'] ) && function_exists( 'posix_getuid' ) ) {
                        $this->fileOwner = $config['fileOwner'];
                        // cache this, assuming it doesn't change
index 08f960a..2d4a772 100644 (file)
@@ -170,12 +170,9 @@ abstract class FileBackend implements LoggerAwareInterface {
                        throw new InvalidArgumentException(
                                "Backend domain ID not provided for '{$this->name}'." );
                }
-               $this->lockManager = isset( $config['lockManager'] )
-                       ? $config['lockManager']
-                       : new NullLockManager( [] );
-               $this->fileJournal = isset( $config['fileJournal'] )
-                       ? $config['fileJournal']
-                       : FileJournal::factory( [ 'class' => NullFileJournal::class ], $this->name );
+               $this->lockManager = $config['lockManager'] ?? new NullLockManager( [] );
+               $this->fileJournal = $config['fileJournal']
+                       ?? FileJournal::factory( [ 'class' => NullFileJournal::class ], $this->name );
                $this->readOnly = isset( $config['readOnly'] )
                        ? (string)$config['readOnly']
                        : '';
@@ -185,18 +182,14 @@ abstract class FileBackend implements LoggerAwareInterface {
                $this->concurrency = isset( $config['concurrency'] )
                        ? (int)$config['concurrency']
                        : 50;
-               $this->obResetFunc = isset( $config['obResetFunc'] )
-                       ? $config['obResetFunc']
-                       : [ $this, 'resetOutputBuffer' ];
-               $this->streamMimeFunc = isset( $config['streamMimeFunc'] )
-                       ? $config['streamMimeFunc']
-                       : null;
-               $this->statusWrapper = isset( $config['statusWrapper'] ) ? $config['statusWrapper'] : null;
-
-               $this->profiler = isset( $config['profiler'] ) ? $config['profiler'] : null;
-               $this->logger = isset( $config['logger'] ) ? $config['logger'] : new \Psr\Log\NullLogger();
-               $this->statusWrapper = isset( $config['statusWrapper'] ) ? $config['statusWrapper'] : null;
-               $this->tmpDirectory = isset( $config['tmpDirectory'] ) ? $config['tmpDirectory'] : null;
+               $this->obResetFunc = $config['obResetFunc'] ?? [ $this, 'resetOutputBuffer' ];
+               $this->streamMimeFunc = $config['streamMimeFunc'] ?? null;
+               $this->statusWrapper = $config['statusWrapper'] ?? null;
+
+               $this->profiler = $config['profiler'] ?? null;
+               $this->logger = $config['logger'] ?? new \Psr\Log\NullLogger();
+               $this->statusWrapper = $config['statusWrapper'] ?? null;
+               $this->tmpDirectory = $config['tmpDirectory'] ?? null;
        }
 
        public function setLogger( LoggerInterface $logger ) {
@@ -1414,7 +1407,7 @@ abstract class FileBackend implements LoggerAwareInterface {
         */
        protected function resolveFSFileObjects( array $ops ) {
                foreach ( $ops as &$op ) {
-                       $src = isset( $op['src'] ) ? $op['src'] : null;
+                       $src = $op['src'] ?? null;
                        if ( $src instanceof FSFile ) {
                                $op['srcRef'] = $src;
                                $op['src'] = $src->getPath();
index 9c367af..655a710 100644 (file)
@@ -95,12 +95,8 @@ class FileBackendMultiWrite extends FileBackend {
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
-               $this->syncChecks = isset( $config['syncChecks'] )
-                       ? $config['syncChecks']
-                       : self::CHECK_SIZE;
-               $this->autoResync = isset( $config['autoResync'] )
-                       ? $config['autoResync']
-                       : false;
+               $this->syncChecks = $config['syncChecks'] ?? self::CHECK_SIZE;
+               $this->autoResync = $config['autoResync'] ?? false;
                $this->asyncWrites = isset( $config['replication'] ) && $config['replication'] === 'async';
                // Construct backends here rather than via registration
                // to keep these backends hidden from outside the proxy.
index 16ea3ea..6c1dc53 100644 (file)
@@ -70,9 +70,7 @@ abstract class FileBackendStore extends FileBackend {
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
-               $this->mimeCallback = isset( $config['mimeCallback'] )
-                       ? $config['mimeCallback']
-                       : null;
+               $this->mimeCallback = $config['mimeCallback'] ?? null;
                $this->srvCache = new EmptyBagOStuff(); // disabled by default
                $this->memCache = WANObjectCache::newEmpty(); // disabled by default
                $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
@@ -649,7 +647,7 @@ abstract class FileBackendStore extends FileBackend {
                $stat = $this->doGetFileStat( $params );
                if ( is_array( $stat ) ) { // file exists
                        // Strongly consistent backends can automatically set "latest"
-                       $stat['latest'] = isset( $stat['latest'] ) ? $stat['latest'] : $latest;
+                       $stat['latest'] = $stat['latest'] ?? $latest;
                        $this->cheapCache->set( $path, 'stat', $stat );
                        $this->setFileCache( $path, $stat ); // update persistent cache
                        if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
@@ -851,8 +849,8 @@ abstract class FileBackendStore extends FileBackend {
                $status = $this->newStatus();
 
                // Always set some fields for subclass convenience
-               $params['options'] = isset( $params['options'] ) ? $params['options'] : [];
-               $params['headers'] = isset( $params['headers'] ) ? $params['headers'] : [];
+               $params['options'] = $params['options'] ?? [];
+               $params['headers'] = $params['headers'] ?? [];
 
                // Don't stream it out as text/html if there was a PHP error
                if ( ( empty( $params['headless'] ) || $params['headers'] ) && headers_sent() ) {
@@ -1324,7 +1322,7 @@ abstract class FileBackendStore extends FileBackend {
                        }
                        if ( is_array( $stat ) ) { // file exists
                                // Strongly consistent backends can automatically set "latest"
-                               $stat['latest'] = isset( $stat['latest'] ) ? $stat['latest'] : $latest;
+                               $stat['latest'] = $stat['latest'] ?? $latest;
                                $this->cheapCache->set( $path, 'stat', $stat );
                                $this->setFileCache( $path, $stat ); // update persistent cache
                                if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
index 2324098..540961e 100644 (file)
@@ -66,7 +66,7 @@ class FileOpBatch {
                $batchId = $journal->getTimestampedUUID();
                $ignoreErrors = !empty( $opts['force'] );
                $journaled = empty( $opts['nonJournaled'] );
-               $maxConcurrency = isset( $opts['concurrency'] ) ? $opts['concurrency'] : 1;
+               $maxConcurrency = $opts['concurrency'] ?? 1;
 
                $entries = []; // file journal entry list
                $predicates = FileOp::newPredicates(); // account for previous ops in prechecks
index 46cd6be..e161254 100644 (file)
@@ -47,12 +47,8 @@ class HTTPFileStreamer {
         */
        public function __construct( $path, array $params = [] ) {
                $this->path = $path;
-               $this->obResetFunc = isset( $params['obResetFunc'] )
-                       ? $params['obResetFunc']
-                       : [ __CLASS__, 'resetOutputBuffers' ];
-               $this->streamMimeFunc = isset( $params['streamMimeFunc'] )
-                       ? $params['streamMimeFunc']
-                       : [ __CLASS__, 'contentTypeFromPath' ];
+               $this->obResetFunc = $params['obResetFunc'] ?? [ __CLASS__, 'resetOutputBuffers' ];
+               $this->streamMimeFunc = $params['streamMimeFunc'] ?? [ __CLASS__, 'contentTypeFromPath' ];
        }
 
        /**
index 997974e..3cd973e 100644 (file)
@@ -116,24 +116,12 @@ class SwiftFileBackend extends FileBackendStore {
                $this->swiftUser = $config['swiftUser'];
                $this->swiftKey = $config['swiftKey'];
                // Optional settings
-               $this->authTTL = isset( $config['swiftAuthTTL'] )
-                       ? $config['swiftAuthTTL']
-                       : 15 * 60; // some sane number
-               $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] )
-                       ? $config['swiftTempUrlKey']
-                       : '';
-               $this->swiftStorageUrl = isset( $config['swiftStorageUrl'] )
-                       ? $config['swiftStorageUrl']
-                       : null;
-               $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
-                       ? $config['shardViaHashLevels']
-                       : '';
-               $this->rgwS3AccessKey = isset( $config['rgwS3AccessKey'] )
-                       ? $config['rgwS3AccessKey']
-                       : '';
-               $this->rgwS3SecretKey = isset( $config['rgwS3SecretKey'] )
-                       ? $config['rgwS3SecretKey']
-                       : '';
+               $this->authTTL = $config['swiftAuthTTL'] ?? 15 * 60; // some sane number
+               $this->swiftTempUrlKey = $config['swiftTempUrlKey'] ?? '';
+               $this->swiftStorageUrl = $config['swiftStorageUrl'] ?? null;
+               $this->shardViaHashLevels = $config['shardViaHashLevels'] ?? '';
+               $this->rgwS3AccessKey = $config['rgwS3AccessKey'] ?? '';
+               $this->rgwS3SecretKey = $config['rgwS3SecretKey'] ?? '';
                // HTTP helper client
                $this->http = new MultiHttpClient( [] );
                // Cache container information to mask latency
@@ -148,18 +136,10 @@ class SwiftFileBackend extends FileBackendStore {
                } else {
                        $this->srvCache = new EmptyBagOStuff();
                }
-               $this->readUsers = isset( $config['readUsers'] )
-                       ? $config['readUsers']
-                       : [];
-               $this->writeUsers = isset( $config['writeUsers'] )
-                       ? $config['writeUsers']
-                       : [];
-               $this->secureReadUsers = isset( $config['secureReadUsers'] )
-                       ? $config['secureReadUsers']
-                       : [];
-               $this->secureWriteUsers = isset( $config['secureWriteUsers'] )
-                       ? $config['secureWriteUsers']
-                       : [];
+               $this->readUsers = $config['readUsers'] ?? [];
+               $this->writeUsers = $config['writeUsers'] ?? [];
+               $this->secureReadUsers = $config['secureReadUsers'] ?? [];
+               $this->secureWriteUsers = $config['secureWriteUsers'] ?? [];
        }
 
        public function getFeatures() {
@@ -299,9 +279,8 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                $sha1Hash = Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 );
-               $contentType = isset( $params['headers']['content-type'] )
-                       ? $params['headers']['content-type']
-                       : $this->getContentType( $params['dst'], $params['content'], null );
+               $contentType = $params['headers']['content-type']
+                       ?? $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = [ [
                        'method' => 'PUT',
@@ -356,9 +335,8 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
                $sha1Hash = Wikimedia\base_convert( $sha1Hash, 16, 36, 31 );
-               $contentType = isset( $params['headers']['content-type'] )
-                       ? $params['headers']['content-type']
-                       : $this->getContentType( $params['dst'], null, $params['src'] );
+               $contentType = $params['headers']['content-type']
+                       ?? $this->getContentType( $params['dst'], null, $params['src'] );
 
                $handle = fopen( $params['src'], 'rb' );
                if ( $handle === false ) { // source doesn't exist?
@@ -1237,7 +1215,7 @@ class SwiftFileBackend extends FileBackendStore {
                                return null;
                        }
 
-                       $ttl = isset( $params['ttl'] ) ? $params['ttl'] : 86400;
+                       $ttl = $params['ttl'] ?? 86400;
                        $expires = time() + $ttl;
 
                        if ( $this->swiftTempUrlKey != '' ) {
@@ -1325,7 +1303,7 @@ class SwiftFileBackend extends FileBackendStore {
                        foreach ( $reqs as $stage => &$req ) {
                                list( $container, $relPath ) = $req['url'];
                                $req['url'] = $this->storageUrl( $auth, $container, $relPath );
-                               $req['headers'] = isset( $req['headers'] ) ? $req['headers'] : [];
+                               $req['headers'] = $req['headers'] ?? [];
                                $req['headers'] = $this->authTokenHeaders( $auth ) + $req['headers'];
                                $httpReqsByStage[$stage][$index] = $req;
                        }
@@ -1686,7 +1664,7 @@ class SwiftFileBackend extends FileBackendStore {
                        'mtime' => $this->convertSwiftDate( $rhdrs['last-modified'], TS_MW ),
                        // Empty objects actually return no content-length header in Ceph
                        'size'  => isset( $rhdrs['content-length'] ) ? (int)$rhdrs['content-length'] : 0,
-                       'sha1'  => isset( $metadata['sha1base36'] ) ? $metadata['sha1base36'] : null,
+                       'sha1'  => $metadata['sha1base36'] ?? null,
                        // Note: manifiest ETags are not an MD5 of the file
                        'md5'   => ctype_xdigit( $rhdrs['etag'] ) ? $rhdrs['etag'] : null,
                        'xattr' => [ 'metadata' => $metadata, 'headers' => $headers ]
index 5ba59c5..9343fcc 100644 (file)
@@ -48,7 +48,7 @@ abstract class FileJournal {
         *     'ttlDays' : days to keep log entries around (false means "forever")
         */
        protected function __construct( array $config ) {
-               $this->ttlDays = isset( $config['ttlDays'] ) ? $config['ttlDays'] : false;
+               $this->ttlDays = $config['ttlDays'] ?? false;
        }
 
        /**
index 40af7ac..2119289 100644 (file)
@@ -137,7 +137,7 @@ abstract class FileOp {
         * @return mixed Returns null if the parameter is not set
         */
        final public function getParam( $name ) {
-               return isset( $this->params[$name] ) ? $this->params[$name] : null;
+               return $this->params[$name] ?? null;
        }
 
        /**
index 26e25f9..564616d 100644 (file)
@@ -90,9 +90,7 @@ abstract class DBLockManager extends QuorumLockManager {
 
                // Tracks peers that couldn't be queried recently to avoid lengthy
                // connection timeouts. This is useless if each bucket has one peer.
-               $this->statusCache = isset( $config['srvCache'] )
-                       ? $config['srvCache']
-                       : new HashBagOStuff();
+               $this->statusCache = $config['srvCache'] ?? new HashBagOStuff();
        }
 
        /**
index 6b3cfb4..e310768 100644 (file)
@@ -80,7 +80,7 @@ abstract class LockManager {
         *               This only applies if locks are not tied to a connection/process.
         */
        public function __construct( array $config ) {
-               $this->domain = isset( $config['domain'] ) ? $config['domain'] : 'global';
+               $this->domain = $config['domain'] ?? 'global';
                if ( isset( $config['lockTTL'] ) ) {
                        $this->lockTTL = max( 5, $config['lockTTL'] );
                } elseif ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' ) {
@@ -101,7 +101,7 @@ abstract class LockManager {
                }
                $this->session = md5( implode( '-', $random ) );
 
-               $this->logger = isset( $config['logger'] ) ? $config['logger'] : new \Psr\Log\NullLogger();
+               $this->logger = $config['logger'] ?? new \Psr\Log\NullLogger();
        }
 
        /**
index 6274d60..ebd72de 100644 (file)
@@ -68,7 +68,7 @@ class MemcLockManager extends QuorumLockManager {
                $this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
                $this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
 
-               $memcConfig = isset( $config['memcConfig'] ) ? $config['memcConfig'] : [];
+               $memcConfig = $config['memcConfig'] ?? [];
                $memcConfig += [ 'class' => MemcachedPhpBagOStuff::class ]; // default
 
                $class = $memcConfig['class'];
index 8d842cb..4a16679 100644 (file)
@@ -195,21 +195,11 @@ EOT;
                $this->typeFile = $params['typeFile'];
                $this->infoFile = $params['infoFile'];
                $this->xmlTypes = $params['xmlTypes'];
-               $this->initCallback = isset( $params['initCallback'] )
-                       ? $params['initCallback']
-                       : null;
-               $this->detectCallback = isset( $params['detectCallback'] )
-                       ? $params['detectCallback']
-                       : null;
-               $this->guessCallback = isset( $params['guessCallback'] )
-                       ? $params['guessCallback']
-                       : null;
-               $this->extCallback = isset( $params['extCallback'] )
-                       ? $params['extCallback']
-                       : null;
-               $this->logger = isset( $params['logger'] )
-                       ? $params['logger']
-                       : new \Psr\Log\NullLogger();
+               $this->initCallback = $params['initCallback'] ?? null;
+               $this->detectCallback = $params['detectCallback'] ?? null;
+               $this->guessCallback = $params['guessCallback'] ?? null;
+               $this->extCallback = $params['extCallback'] ?? null;
+               $this->logger = $params['logger'] ?? new \Psr\Log\NullLogger();
 
                $this->loadFiles();
        }
@@ -437,7 +427,7 @@ EOT;
        public function getTypesForExtension( $ext ) {
                $ext = strtolower( $ext );
 
-               $r = isset( $this->mExtToMime[$ext] ) ? $this->mExtToMime[$ext] : null;
+               $r = $this->mExtToMime[$ext] ?? null;
                return $r;
        }
 
index 9770515..e231113 100644 (file)
@@ -394,8 +394,8 @@ class XmlTypeCheck {
                        $callbackReturn = call_user_func(
                                $externalCallback,
                                $parsedDTD['type'],
-                               isset( $parsedDTD['publicid'] ) ? $parsedDTD['publicid'] : null,
-                               isset( $parsedDTD['systemid'] ) ? $parsedDTD['systemid'] : null
+                               $parsedDTD['publicid'] ?? null,
+                               $parsedDTD['systemid'] ?? null
                        );
                }
                if ( $callbackReturn ) {
index 8a88581..e58a0bb 100644 (file)
@@ -81,6 +81,9 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        /** @var callable[] */
        protected $busyCallbacks = [];
 
+       /** @var float|null */
+       private $wallClockOverride;
+
        /** @var int[] Map of (ATTR_* class constant => QOS_* class constant) */
        protected $attrMap = [];
 
@@ -119,15 +122,13 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                        $this->keyspace = $params['keyspace'];
                }
 
-               $this->asyncHandler = isset( $params['asyncHandler'] )
-                       ? $params['asyncHandler']
-                       : null;
+               $this->asyncHandler = $params['asyncHandler'] ?? null;
 
                if ( !empty( $params['reportDupes'] ) && is_callable( $this->asyncHandler ) ) {
                        $this->reportDupes = true;
                }
 
-               $this->syncTimeout = isset( $params['syncTimeout'] ) ? $params['syncTimeout'] : 3;
+               $this->syncTimeout = $params['syncTimeout'] ?? 3;
        }
 
        /**
@@ -342,7 +343,21 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
         * @throws Exception
         */
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
-               throw new Exception( "CAS is not implemented in " . __CLASS__ );
+               if ( !$this->lock( $key, 0 ) ) {
+                       return false; // non-blocking
+               }
+
+               $curCasToken = null; // passed by reference
+               $this->getWithToken( $key, $curCasToken, self::READ_LATEST );
+               if ( $casToken === $curCasToken ) {
+                       $success = $this->set( $key, $value, $exptime );
+               } else {
+                       $success = false; // mismatched or failed
+               }
+
+               $this->unlock( $key );
+
+               return $success;
        }
 
        /**
@@ -484,11 +499,11 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                        return null;
                }
 
-               $lSince = microtime( true ); // lock timestamp
+               $lSince = $this->getCurrentTime(); // lock timestamp
 
                return new ScopedCallback( function () use ( $key, $lSince, $expiry ) {
                        $latency = 0.050; // latency skew (err towards keeping lock present)
-                       $age = ( microtime( true ) - $lSince + $latency );
+                       $age = ( $this->getCurrentTime() - $lSince + $latency );
                        if ( ( $age + $latency ) >= $expiry ) {
                                $this->logger->warning( "Lock for $key held too long ($age sec)." );
                                return; // expired; it's not "safe" to delete the key
@@ -702,7 +717,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
         */
        protected function convertExpiry( $exptime ) {
                if ( $exptime != 0 && $exptime < ( 10 * self::TTL_YEAR ) ) {
-                       return time() + $exptime;
+                       return (int)$this->getCurrentTime() + $exptime;
                } else {
                        return $exptime;
                }
@@ -717,7 +732,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
         */
        protected function convertToRelative( $exptime ) {
                if ( $exptime >= ( 10 * self::TTL_YEAR ) ) {
-                       $exptime -= time();
+                       $exptime -= (int)$this->getCurrentTime();
                        if ( $exptime <= 0 ) {
                                $exptime = 1;
                        }
@@ -784,7 +799,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
         * @since 1.28
         */
        public function getQoS( $flag ) {
-               return isset( $this->attrMap[$flag] ) ? $this->attrMap[$flag] : self::QOS_UNKNOWN;
+               return $this->attrMap[$flag] ?? self::QOS_UNKNOWN;
        }
 
        /**
@@ -807,4 +822,20 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
 
                return $map;
        }
+
+       /**
+        * @return float UNIX timestamp
+        * @codeCoverageIgnore
+        */
+       protected function getCurrentTime() {
+               return $this->wallClockOverride ?: microtime( true );
+       }
+
+       /**
+        * @param float|null &$time Mock UNIX timestamp for testing
+        * @codeCoverageIgnore
+        */
+       public function setMockTime( &$time ) {
+               $this->wallClockOverride =& $time;
+       }
 }
index f8e3b17..ec66492 100644 (file)
@@ -44,7 +44,7 @@ class HashBagOStuff extends BagOStuff {
        function __construct( $params = [] ) {
                parent::__construct( $params );
 
-               $this->maxCacheKeys = isset( $params['maxKeys'] ) ? $params['maxKeys'] : INF;
+               $this->maxCacheKeys = $params['maxKeys'] ?? INF;
                if ( $this->maxCacheKeys <= 0 ) {
                        throw new InvalidArgumentException( '$maxKeys parameter must be above zero' );
                }
@@ -115,8 +115,4 @@ class HashBagOStuff extends BagOStuff {
        public function clear() {
                $this->bag = [];
        }
-
-       protected function getCurrentTime() {
-               return time();
-       }
 }
index 59131b9..1cc07b7 100644 (file)
@@ -259,11 +259,11 @@ class MemcachedClient {
         * @return mixed
         */
        public function __construct( $args ) {
-               $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
-               $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
+               $this->set_servers( $args['servers'] ?? array() );
+               $this->_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_threshold = $args['compress_threshold'] ?? 0;
+               $this->_persistent = $args['persistent'] ?? false;
                $this->_compress_enable = true;
                $this->_have_zlib = function_exists( 'gzcompress' );
 
@@ -271,12 +271,12 @@ class MemcachedClient {
                $this->_host_dead = array();
 
                $this->_timeout_seconds = 0;
-               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
+               $this->_timeout_microseconds = $args['timeout'] ?? 500000;
 
-               $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
+               $this->_connect_timeout = $args['connect_timeout'] ?? 0.1;
                $this->_connect_attempts = 2;
 
-               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
+               $this->_logger = $args['logger'] ?? new NullLogger();
        }
 
        // }}}
index e3e66d5..fe31c25 100644 (file)
@@ -140,7 +140,19 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                $this->debugLog( "get($key)" );
-               $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken );
+               if ( defined( Memcached::class . '::GET_EXTENDED' ) ) { // v3.0.0
+                       $flags = Memcached::GET_EXTENDED;
+                       $res = $this->client->get( $this->validateKeyEncoding( $key ), null, $flags );
+                       if ( is_array( $res ) ) {
+                               $result = $res['value'];
+                               $casToken = $res['cas'];
+                       } else {
+                               $result = false;
+                               $casToken = null;
+                       }
+               } else {
+                       $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken );
+               }
                $result = $this->checkResult( $key, $result );
                return $result;
        }
index e2d9d93..3ff390b 100644 (file)
@@ -62,12 +62,12 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
        public function incr( $key, $value = 1 ) {
                $this->validateKeyEncoding( $key );
 
-               return $this->client->incr( $key, $value );
+               return $this->client->incr( $key, $value ) ?? false;
        }
 
        public function decr( $key, $value = 1 ) {
                $this->validateKeyEncoding( $key );
 
-               return $this->client->decr( $key, $value );
+               return $this->client->decr( $key, $value ) ?? false;
        }
 }
index f720010..a8047b0 100644 (file)
@@ -91,12 +91,19 @@ class RedisBagOStuff extends BagOStuff {
        }
 
        protected function doGet( $key, $flags = 0 ) {
+               $casToken = null;
+
+               return $this->getWithToken( $key, $casToken, $flags );
+       }
+
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                list( $server, $conn ) = $this->getConnection( $key );
                if ( !$conn ) {
                        return false;
                }
                try {
                        $value = $conn->get( $key );
+                       $casToken = $value;
                        $result = $this->unserialize( $value );
                } catch ( RedisException $e ) {
                        $result = false;
@@ -260,6 +267,10 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
+       public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+       }
+
        /**
         * Non-atomic implementation of incr().
         *
@@ -279,7 +290,7 @@ class RedisBagOStuff extends BagOStuff {
                }
                try {
                        if ( !$conn->exists( $key ) ) {
-                               return null;
+                               return false;
                        }
                        // @FIXME: on races, the key may have a 0 TTL
                        $result = $conn->incrBy( $key, $value );
@@ -396,9 +407,7 @@ class RedisBagOStuff extends BagOStuff {
         */
        protected function getMasterLinkStatus( RedisConnRef $conn ) {
                $info = $conn->info();
-               return isset( $info['master_link_status'] )
-                       ? $info['master_link_status']
-                       : null;
+               return $info['master_link_status'] ?? null;
        }
 
        /**
index 17f596d..a2e2fe1 100644 (file)
@@ -118,6 +118,9 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /** @var int Key fetched */
        private $warmupKeyMisses = 0;
 
+       /** @var float|null */
+       private $wallClockOverride;
+
        /** Max time expected to pass between delete() and DB commit finishing */
        const MAX_COMMIT_DELAY = 3;
        /** Max replication+snapshot lag before applying TTL_LAGGED or disallowing set() */
@@ -223,19 +226,15 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         */
        public function __construct( array $params ) {
                $this->cache = $params['cache'];
-               $this->purgeChannel = isset( $params['channels']['purge'] )
-                       ? $params['channels']['purge']
-                       : self::DEFAULT_PURGE_CHANNEL;
-               $this->purgeRelayer = isset( $params['relayers']['purge'] )
-                       ? $params['relayers']['purge']
-                       : new EventRelayerNull( [] );
-               $this->region = isset( $params['region'] ) ? $params['region'] : 'main';
-               $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : 'wan-main';
+               $this->purgeChannel = $params['channels']['purge'] ?? self::DEFAULT_PURGE_CHANNEL;
+               $this->purgeRelayer = $params['relayers']['purge'] ?? new EventRelayerNull( [] );
+               $this->region = $params['region'] ?? 'main';
+               $this->cluster = $params['cluster'] ?? 'wan-main';
                $this->mcrouterAware = !empty( $params['mcrouterAware'] );
 
-               $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
-               $this->stats = isset( $params['stats'] ) ? $params['stats'] : new NullStatsdDataFactory();
-               $this->asyncHandler = isset( $params['asyncHandler'] ) ? $params['asyncHandler'] : null;
+               $this->setLogger( $params['logger'] ?? new NullLogger() );
+               $this->stats = $params['stats'] ?? new NullStatsdDataFactory();
+               $this->asyncHandler = $params['asyncHandler'] ?? null;
        }
 
        /**
@@ -301,10 +300,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $curTTLs = [];
                $asOfs = [];
                $values = $this->getMulti( [ $key ], $curTTLs, $checkKeys, $asOfs );
-               $curTTL = isset( $curTTLs[$key] ) ? $curTTLs[$key] : null;
-               $asOf = isset( $asOfs[$key] ) ? $asOfs[$key] : null;
+               $curTTL = $curTTLs[$key] ?? null;
+               $asOf = $asOfs[$key] ?? null;
 
-               return isset( $values[$key] ) ? $values[$key] : false;
+               return $values[$key] ?? false;
        }
 
        /**
@@ -494,10 +493,10 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         */
        final public function set( $key, $value, $ttl = 0, array $opts = [] ) {
                $now = $this->getCurrentTime();
-               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
-               $staleTTL = isset( $opts['staleTTL'] ) ? $opts['staleTTL'] : self::STALE_TTL_NONE;
+               $lockTSE = $opts['lockTSE'] ?? self::TSE_NONE;
+               $staleTTL = $opts['staleTTL'] ?? self::STALE_TTL_NONE;
                $age = isset( $opts['since'] ) ? max( 0, $now - $opts['since'] ) : 0;
-               $lag = isset( $opts['lag'] ) ? $opts['lag'] : 0;
+               $lag = $opts['lag'] ?? 0;
 
                // Do not cache potentially uncommitted data as it might get rolled back
                if ( !empty( $opts['pending'] ) ) {
@@ -1052,13 +1051,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @note Callable type hints are not used to avoid class-autoloading
         */
        final public function getWithSetCallback( $key, $ttl, $callback, array $opts = [] ) {
-               $pcTTL = isset( $opts['pcTTL'] ) ? $opts['pcTTL'] : self::TTL_UNCACHEABLE;
+               $pcTTL = $opts['pcTTL'] ?? self::TTL_UNCACHEABLE;
 
                // Try the process cache if enabled and the cache callback is not within a cache callback.
                // Process cache use in nested callbacks is not lag-safe with regard to HOLDOFF_TTL since
                // the in-memory value is further lagged than the shared one since it uses a blind TTL.
                if ( $pcTTL >= 0 && $this->callbackDepth == 0 ) {
-                       $group = isset( $opts['pcGroup'] ) ? $opts['pcGroup'] : self::PC_PRIMARY;
+                       $group = $opts['pcGroup'] ?? self::PC_PRIMARY;
                        $procCache = $this->getProcessCache( $group );
                        $value = $procCache->get( $key );
                } else {
@@ -1137,15 +1136,15 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @note Callable type hints are not used to avoid class-autoloading
         */
        protected function doGetWithSetCallback( $key, $ttl, $callback, array $opts, &$asOf = null ) {
-               $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
-               $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
-               $staleTTL = isset( $opts['staleTTL'] ) ? $opts['staleTTL'] : self::STALE_TTL_NONE;
-               $graceTTL = isset( $opts['graceTTL'] ) ? $opts['graceTTL'] : self::GRACE_TTL_NONE;
-               $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
-               $busyValue = isset( $opts['busyValue'] ) ? $opts['busyValue'] : null;
-               $popWindow = isset( $opts['hotTTR'] ) ? $opts['hotTTR'] : self::HOT_TTR;
-               $ageNew = isset( $opts['ageNew'] ) ? $opts['ageNew'] : self::AGE_NEW;
-               $minTime = isset( $opts['minAsOf'] ) ? $opts['minAsOf'] : self::MIN_TIMESTAMP_NONE;
+               $lowTTL = $opts['lowTTL'] ?? min( self::LOW_TTL, $ttl );
+               $lockTSE = $opts['lockTSE'] ?? self::TSE_NONE;
+               $staleTTL = $opts['staleTTL'] ?? self::STALE_TTL_NONE;
+               $graceTTL = $opts['graceTTL'] ?? self::GRACE_TTL_NONE;
+               $checkKeys = $opts['checkKeys'] ?? [];
+               $busyValue = $opts['busyValue'] ?? null;
+               $popWindow = $opts['hotTTR'] ?? self::HOT_TTR;
+               $ageNew = $opts['ageNew'] ?? self::AGE_NEW;
+               $minTime = $opts['minAsOf'] ?? self::MIN_TIMESTAMP_NONE;
                $versioned = isset( $opts['version'] );
 
                // Get a collection name to describe this class of key
@@ -1381,7 +1380,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                ArrayIterator $keyedIds, $ttl, callable $callback, array $opts = []
        ) {
                $valueKeys = array_keys( $keyedIds->getArrayCopy() );
-               $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+               $checkKeys = $opts['checkKeys'] ?? [];
 
                // Load required keys into process cache in one go
                $this->warmupCache = $this->getRawKeysForWarmup(
@@ -1476,7 +1475,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        ) {
                $idsByValueKey = $keyedIds->getArrayCopy();
                $valueKeys = array_keys( $idsByValueKey );
-               $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : [];
+               $checkKeys = $opts['checkKeys'] ?? [];
                unset( $opts['lockTSE'] ); // incompatible
                unset( $opts['busyValue'] ); // incompatible
 
@@ -2023,7 +2022,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        return [ false, null ];
                }
 
-               $flags = isset( $wrapped[self::FLD_FLAGS] ) ? $wrapped[self::FLD_FLAGS] : 0;
+               $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];
@@ -2061,15 +2060,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        protected function determineKeyClass( $key ) {
                $parts = explode( ':', $key );
 
-               return isset( $parts[1] ) ? $parts[1] : $parts[0]; // sanity
-       }
-
-       /**
-        * @return float UNIX timestamp
-        * @codeCoverageIgnore
-        */
-       protected function getCurrentTime() {
-               return microtime( true );
+               return $parts[1] ?? $parts[0]; // sanity
        }
 
        /**
@@ -2127,7 +2118,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        private function getNonProcessCachedKeys( array $keys, array $opts ) {
                $keysFound = [];
                if ( isset( $opts['pcTTL'] ) && $opts['pcTTL'] > 0 && $this->callbackDepth == 0 ) {
-                       $pcGroup = isset( $opts['pcGroup'] ) ? $opts['pcGroup'] : self::PC_PRIMARY;
+                       $pcGroup = $opts['pcGroup'] ?? self::PC_PRIMARY;
                        $procCache = $this->getProcessCache( $pcGroup );
                        foreach ( $keys as $key ) {
                                if ( $procCache->get( $key ) !== false ) {
@@ -2173,4 +2164,21 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
                return $warmupCache;
        }
+
+       /**
+        * @return float UNIX timestamp
+        * @codeCoverageIgnore
+        */
+       protected function getCurrentTime() {
+               return $this->wallClockOverride ?: microtime( true );
+       }
+
+       /**
+        * @param float|null &$time Mock UNIX timestamp for testing
+        * @codeCoverageIgnore
+        */
+       public function setMockTime( &$time ) {
+               $this->wallClockOverride =& $time;
+               $this->cache->setMockTime( $time );
+       }
 }
index 14737b1..e4ab95c 100644 (file)
@@ -92,12 +92,8 @@ class WANObjectCacheReaper implements LoggerAwareInterface {
                        throw new UnexpectedValueException( "No channel specified." );
                }
 
-               $this->initialStartWindow = isset( $params['initialStartWindow'] )
-                       ? $params['initialStartWindow']
-                       : 3600;
-               $this->logger = isset( $params['logger'] )
-                       ? $params['logger']
-                       : new NullLogger();
+               $this->initialStartWindow = $params['initialStartWindow'] ?? 3600;
+               $this->logger = $params['logger'] ?? new NullLogger();
        }
 
        public function setLogger( LoggerInterface $logger ) {
index 8b21ede..f5cef9e 100644 (file)
@@ -70,13 +70,15 @@ class ChronologyProtector implements LoggerAwareInterface {
 
        /**
         * @param BagOStuff $store
-        * @param array[] $client Map of (ip: <IP>, agent: <user-agent>)
+        * @param array[] $client Map of (ip: <IP>, agent: <user-agent> [, clientId: <hash>] )
         * @param int|null $posIndex Write counter index [optional]
         * @since 1.27
         */
        public function __construct( BagOStuff $store, array $client, $posIndex = null ) {
                $this->store = $store;
-               $this->clientId = md5( $client['ip'] . "\n" . $client['agent'] );
+               $this->clientId = isset( $client['clientId'] )
+                       ? $client['clientId']
+                       : md5( $client['ip'] . "\n" . $client['agent'] );
                $this->key = $store->makeGlobalKey( __CLASS__, $this->clientId, 'v2' );
                $this->waitForPosIndex = $posIndex;
                $this->logger = new NullLogger();
@@ -86,6 +88,14 @@ class ChronologyProtector implements LoggerAwareInterface {
                $this->logger = $logger;
        }
 
+       /**
+        * @return string Client ID hash
+        * @since 1.32
+        */
+       public function getClientId() {
+               return $this->clientId;
+       }
+
        /**
         * @param bool $enabled Whether to no-op all method calls
         * @since 1.27
@@ -330,7 +340,7 @@ class ChronologyProtector implements LoggerAwareInterface {
         */
        protected function mergePositions( $curValue, array $shutdownPositions, &$cpIndex = null ) {
                /** @var DBMasterPos[] $curPositions */
-               $curPositions = isset( $curValue['positions'] ) ? $curValue['positions'] : [];
+               $curPositions = $curValue['positions'] ?? [];
                // Use the newest positions for each DB master
                foreach ( $shutdownPositions as $db => $pos ) {
                        if (
@@ -342,7 +352,7 @@ class ChronologyProtector implements LoggerAwareInterface {
                        }
                }
 
-               $cpIndex = isset( $curValue['writeIndex'] ) ? $curValue['writeIndex'] : 0;
+               $cpIndex = $curValue['writeIndex'] ?? 0;
 
                return [
                        'positions' => $curPositions,
index 1f92c47..16e654f 100644 (file)
@@ -315,9 +315,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                $this->sessionVars = $params['variables'];
 
-               $this->srvCache = isset( $params['srvCache'] )
-                       ? $params['srvCache']
-                       : new HashBagOStuff();
+               $this->srvCache = $params['srvCache'] ?? new HashBagOStuff();
 
                $this->profiler = $params['profiler'];
                $this->trxProfiler = $params['trxProfiler'];
@@ -420,29 +418,27 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @since 1.18
         */
        final public static function factory( $dbType, $p = [], $connect = self::NEW_CONNECTED ) {
-               $class = self::getClass( $dbType, isset( $p['driver'] ) ? $p['driver'] : null );
+               $class = self::getClass( $dbType, $p['driver'] ?? null );
 
                if ( class_exists( $class ) && is_subclass_of( $class, IDatabase::class ) ) {
                        // Resolve some defaults for b/c
-                       $p['host'] = isset( $p['host'] ) ? $p['host'] : false;
-                       $p['user'] = isset( $p['user'] ) ? $p['user'] : false;
-                       $p['password'] = isset( $p['password'] ) ? $p['password'] : false;
-                       $p['dbname'] = isset( $p['dbname'] ) ? $p['dbname'] : false;
-                       $p['flags'] = isset( $p['flags'] ) ? $p['flags'] : 0;
-                       $p['variables'] = isset( $p['variables'] ) ? $p['variables'] : [];
-                       $p['tablePrefix'] = isset( $p['tablePrefix'] ) ? $p['tablePrefix'] : '';
-                       $p['schema'] = isset( $p['schema'] ) ? $p['schema'] : '';
-                       $p['cliMode'] = isset( $p['cliMode'] )
-                               ? $p['cliMode']
-                               : ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
-                       $p['agent'] = isset( $p['agent'] ) ? $p['agent'] : '';
+                       $p['host'] = $p['host'] ?? false;
+                       $p['user'] = $p['user'] ?? false;
+                       $p['password'] = $p['password'] ?? false;
+                       $p['dbname'] = $p['dbname'] ?? false;
+                       $p['flags'] = $p['flags'] ?? 0;
+                       $p['variables'] = $p['variables'] ?? [];
+                       $p['tablePrefix'] = $p['tablePrefix'] ?? '';
+                       $p['schema'] = $p['schema'] ?? '';
+                       $p['cliMode'] = $p['cliMode'] ?? ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
+                       $p['agent'] = $p['agent'] ?? '';
                        if ( !isset( $p['connLogger'] ) ) {
                                $p['connLogger'] = new NullLogger();
                        }
                        if ( !isset( $p['queryLogger'] ) ) {
                                $p['queryLogger'] = new NullLogger();
                        }
-                       $p['profiler'] = isset( $p['profiler'] ) ? $p['profiler'] : null;
+                       $p['profiler'] = $p['profiler'] ?? null;
                        if ( !isset( $p['trxProfiler'] ) ) {
                                $p['trxProfiler'] = new TransactionProfiler();
                        }
@@ -1716,7 +1712,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
                if ( isset( $options['LIMIT'] ) ) {
                        $sql = $this->limitResult( $sql, $options['LIMIT'],
-                               isset( $options['OFFSET'] ) ? $options['OFFSET'] : false );
+                               $options['OFFSET'] ?? false );
                }
                $sql = "$sql $postLimitTail";
 
@@ -1869,7 +1865,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        if ( !$var ) {
                                $column = null;
                        } elseif ( count( $var ) == 1 ) {
-                               $column = isset( $var[0] ) ? $var[0] : reset( $var );
+                               $column = $var[0] ?? reset( $var );
                        } else {
                                throw new DBUnexpectedError( $this, __METHOD__ . ': got multiple columns.' );
                        }
@@ -2577,9 +2573,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
         * @return string
         */
        protected function indexName( $index ) {
-               return isset( $this->indexAliases[$index] )
-                       ? $this->indexAliases[$index]
-                       : $index;
+               return $this->indexAliases[$index] ?? $index;
        }
 
        public function addQuotes( $s ) {
@@ -3132,8 +3126,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                // $conds. Then union them together (using UNION ALL, because the
                // product *should* already be distinct).
                $orderBy = $this->makeOrderBy( $options );
-               $limit = isset( $options['LIMIT'] ) ? $options['LIMIT'] : null;
-               $offset = isset( $options['OFFSET'] ) ? $options['OFFSET'] : false;
+               $limit = $options['LIMIT'] ?? null;
+               $offset = $options['OFFSET'] ?? false;
                $all = empty( $options['NOTALL'] ) && !in_array( 'NOTALL', $options );
                if ( !$this->unionSupportsOrderAndLimit() ) {
                        unset( $options['ORDER BY'], $options['LIMIT'], $options['OFFSET'] );
index ef6600b..602b15c 100644 (file)
@@ -182,7 +182,7 @@ class DatabaseDomain {
                for ( $i = 0; $i < $length; ++$i ) {
                        $char = $encoded[$i];
                        if ( $char === '?' ) {
-                               $nextChar = isset( $encoded[$i + 1] ) ? $encoded[$i + 1] : null;
+                               $nextChar = $encoded[$i + 1] ?? null;
                                if ( $nextChar === 'h' ) {
                                        $decoded .= '-';
                                        ++$i;
index 768e0c6..fed6f14 100644 (file)
@@ -1294,9 +1294,7 @@ class DatabaseMssql extends Database {
                        $this->populateColumnCaches();
                }
 
-               return isset( $this->binaryColumnCache[$tableRaw] )
-                       ? $this->binaryColumnCache[$tableRaw]
-                       : [];
+               return $this->binaryColumnCache[$tableRaw] ?? [];
        }
 
        /**
@@ -1311,9 +1309,7 @@ class DatabaseMssql extends Database {
                        $this->populateColumnCaches();
                }
 
-               return isset( $this->bitColumnCache[$tableRaw] )
-                       ? $this->bitColumnCache[$tableRaw]
-                       : [];
+               return $this->bitColumnCache[$tableRaw] ?? [];
        }
 
        private function populateColumnCaches() {
index 953f63d..78c6d91 100644 (file)
@@ -96,12 +96,8 @@ abstract class DatabaseMysqlBase extends Database {
         * @param array $params
         */
        function __construct( array $params ) {
-               $this->lagDetectionMethod = isset( $params['lagDetectionMethod'] )
-                       ? $params['lagDetectionMethod']
-                       : 'Seconds_Behind_Master';
-               $this->lagDetectionOptions = isset( $params['lagDetectionOptions'] )
-                       ? $params['lagDetectionOptions']
-                       : [];
+               $this->lagDetectionMethod = $params['lagDetectionMethod'] ?? 'Seconds_Behind_Master';
+               $this->lagDetectionOptions = $params['lagDetectionOptions'] ?? [];
                $this->useGTIDs = !empty( $params['useGTIDs' ] );
                foreach ( [ 'KeyPath', 'CertPath', 'CAFile', 'CAPath', 'Ciphers' ] as $name ) {
                        $var = "ssl{$name}";
@@ -109,7 +105,7 @@ abstract class DatabaseMysqlBase extends Database {
                                $this->$var = $params[$var];
                        }
                }
-               $this->sqlMode = isset( $params['sqlMode'] ) ? $params['sqlMode'] : '';
+               $this->sqlMode = $params['sqlMode'] ?? '';
                $this->utf8Mode = !empty( $params['utf8Mode'] );
                $this->insertSelectIsSafe = isset( $params['insertSelectIsSafe'] )
                        ? (bool)$params['insertSelectIsSafe'] : null;
index 31cdd7c..ec69b9d 100644 (file)
@@ -77,7 +77,7 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                } elseif ( substr_count( $realServer, ':' ) == 1 ) {
                        // If we have a colon and something that's not a port number
                        // inside the hostname, assume it's the socket location
-                       $hostAndSocket = explode( ':', $realServer );
+                       $hostAndSocket = explode( ':', $realServer, 2 );
                        $realServer = $hostAndSocket[0];
                        $socket = $hostAndSocket[1];
                }
index 807d9cc..a043cd6 100644 (file)
@@ -54,10 +54,8 @@ class DatabasePostgres extends Database {
         *   - keywordTableMap : Map of reserved table names to alternative table names to use
         */
        public function __construct( array $params ) {
-               $this->port = isset( $params['port'] ) ? $params['port'] : false;
-               $this->keywordTableMap = isset( $params['keywordTableMap'] )
-                       ? $params['keywordTableMap']
-                       : [];
+               $this->port = $params['port'] ?? false;
+               $this->keywordTableMap = $params['keywordTableMap'] ?? [];
 
                parent::__construct( $params );
        }
@@ -710,7 +708,7 @@ __INDEXATTR__;
         * @return string Value of $name or remapped name if $name is a reserved keyword
         */
        public function remappedTableName( $name ) {
-               return isset( $this->keywordTableMap[$name] ) ? $this->keywordTableMap[$name] : $name;
+               return $this->keywordTableMap[$name] ?? $name;
        }
 
        /**
index 5f37c1d..2125c70 100644 (file)
@@ -496,7 +496,7 @@ class DatabaseSqlite extends Database {
                }
                $e = $this->conn->errorInfo();
 
-               return isset( $e[2] ) ? $e[2] : '';
+               return $e[2] ?? '';
        }
 
        /**
index 709c61e..ecaddab 100644 (file)
@@ -18,11 +18,11 @@ class MySQLField implements Field {
                $this->is_multiple = $info->multiple_key;
                $this->is_key = ( $this->is_pk || $this->is_unique || $this->is_multiple );
                $this->type = $info->type;
-               $this->binary = isset( $info->binary ) ? $info->binary : false;
-               $this->is_numeric = isset( $info->numeric ) ? $info->numeric : false;
-               $this->is_blob = isset( $info->blob ) ? $info->blob : false;
-               $this->is_unsigned = isset( $info->unsigned ) ? $info->unsigned : false;
-               $this->is_zerofill = isset( $info->zerofill ) ? $info->zerofill : false;
+               $this->binary = $info->binary ?? false;
+               $this->is_numeric = $info->numeric ?? false;
+               $this->is_blob = $info->blob ?? false;
+               $this->is_unsigned = $info->unsigned ?? false;
+               $this->is_zerofill = $info->zerofill ?? false;
        }
 
        /**
index 16d0e31..85ab115 100644 (file)
@@ -142,9 +142,13 @@ interface ILBFactory {
         * @param int $mode One of the class SHUTDOWN_* constants
         * @param callable|null $workCallback Work to mask ChronologyProtector writes
         * @param int|null &$cpIndex Position key write counter for ChronologyProtector
+        * @param string|null &$cpClientId Client ID hash for ChronologyProtector
         */
        public function shutdown(
-               $mode = self::SHUTDOWN_CHRONPROT_SYNC, callable $workCallback = null, &$cpIndex = null
+               $mode = self::SHUTDOWN_CHRONPROT_SYNC,
+               callable $workCallback = null,
+               &$cpIndex = null,
+               &$cpClientId = null
        );
 
        /**
index e8ec250..52c2df7 100644 (file)
@@ -110,44 +110,34 @@ abstract class LBFactory implements ILBFactory {
                        $this->readOnlyReason = $conf['readOnlyReason'];
                }
 
-               $this->srvCache = isset( $conf['srvCache'] ) ? $conf['srvCache'] : new EmptyBagOStuff();
-               $this->memStash = isset( $conf['memStash'] ) ? $conf['memStash'] : new EmptyBagOStuff();
-               $this->wanCache = isset( $conf['wanCache'] )
-                       ? $conf['wanCache']
-                       : WANObjectCache::newEmpty();
+               $this->srvCache = $conf['srvCache'] ?? new EmptyBagOStuff();
+               $this->memStash = $conf['memStash'] ?? new EmptyBagOStuff();
+               $this->wanCache = $conf['wanCache'] ?? WANObjectCache::newEmpty();
 
                foreach ( self::$loggerFields as $key ) {
-                       $this->$key = isset( $conf[$key] ) ? $conf[$key] : new \Psr\Log\NullLogger();
+                       $this->$key = $conf[$key] ?? new \Psr\Log\NullLogger();
                }
-               $this->errorLogger = isset( $conf['errorLogger'] )
-                       ? $conf['errorLogger']
-                       : function ( Exception $e ) {
-                               trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
-                       };
-               $this->deprecationLogger = isset( $conf['deprecationLogger'] )
-                       ? $conf['deprecationLogger']
-                       : function ( $msg ) {
-                               trigger_error( $msg, E_USER_DEPRECATED );
-                       };
-
-               $this->profiler = isset( $conf['profiler'] ) ? $conf['profiler'] : null;
-               $this->trxProfiler = isset( $conf['trxProfiler'] )
-                       ? $conf['trxProfiler']
-                       : new TransactionProfiler();
+               $this->errorLogger = $conf['errorLogger'] ?? function ( Exception $e ) {
+                       trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
+               };
+               $this->deprecationLogger = $conf['deprecationLogger'] ?? function ( $msg ) {
+                       trigger_error( $msg, E_USER_DEPRECATED );
+               };
+
+               $this->profiler = $conf['profiler'] ?? null;
+               $this->trxProfiler = $conf['trxProfiler'] ?? new TransactionProfiler();
 
                $this->requestInfo = [
-                       'IPAddress' => isset( $_SERVER[ 'REMOTE_ADDR' ] ) ? $_SERVER[ 'REMOTE_ADDR' ] : '',
-                       'UserAgent' => isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '',
-                       'ChronologyProtection' => 'true',
-                       // phpcs:ignore MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals -- library can't use $wgRequest
-                       'ChronologyPositionIndex' => isset( $_GET['cpPosIndex'] ) ? $_GET['cpPosIndex'] : null
+                       'IPAddress' => $_SERVER[ 'REMOTE_ADDR' ] ?? '',
+                       'UserAgent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
+                       // Headers application can inject via LBFactory::setRequestInfo()
+                       'ChronologyClientId' => null, // prior $cpClientId value from LBFactory::shutdown()
+                       'ChronologyPositionIndex' => null // prior $cpIndex value from LBFactory::shutdown()
                ];
 
-               $this->cliMode = isset( $conf['cliMode'] )
-                       ? $conf['cliMode']
-                       : ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
-               $this->hostname = isset( $conf['hostname'] ) ? $conf['hostname'] : gethostname();
-               $this->agent = isset( $conf['agent'] ) ? $conf['agent'] : '';
+               $this->cliMode = $conf['cliMode'] ?? ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
+               $this->hostname = $conf['hostname'] ?? gethostname();
+               $this->agent = $conf['agent'] ?? '';
 
                $this->ticket = mt_rand();
        }
@@ -158,7 +148,10 @@ abstract class LBFactory implements ILBFactory {
        }
 
        public function shutdown(
-               $mode = self::SHUTDOWN_CHRONPROT_SYNC, callable $workCallback = null, &$cpIndex = null
+               $mode = self::SHUTDOWN_CHRONPROT_SYNC,
+               callable $workCallback = null,
+               &$cpIndex = null,
+               &$cpClientId = null
        ) {
                $chronProt = $this->getChronologyProtector();
                if ( $mode === self::SHUTDOWN_CHRONPROT_SYNC ) {
@@ -167,6 +160,8 @@ abstract class LBFactory implements ILBFactory {
                        $this->shutdownChronologyProtector( $chronProt, null, 'async', $cpIndex );
                }
 
+               $cpClientId = $chronProt->getClientId();
+
                $this->commitMasterChanges( __METHOD__ ); // sanity
        }
 
@@ -498,6 +493,7 @@ abstract class LBFactory implements ILBFactory {
                        [
                                'ip' => $this->requestInfo['IPAddress'],
                                'agent' => $this->requestInfo['UserAgent'],
+                               'clientId' => $this->requestInfo['ChronologyClientId']
                        ],
                        $this->requestInfo['ChronologyPositionIndex']
                );
@@ -643,32 +639,38 @@ abstract class LBFactory implements ILBFactory {
 
        /**
         * @param int $index Write index
-        * @param int $time UNIX timestamp
-        * @return string Timestamp-qualified write index of the form "<index>.<timestamp>"
+        * @param int $time UNIX timestamp; can be used to detect stale cookies (T190082)
+        * @param string $clientId Agent ID hash from ILBFactory::shutdown()
+        * @return string Timestamp-qualified write index of the form "<index>@<timestamp>#<hash>"
         * @since 1.32
         */
-       public static function makeCookieValueFromCPIndex( $index, $time ) {
-               return $index . '@' . $time;
+       public static function makeCookieValueFromCPIndex( $index, $time, $clientId ) {
+               return "$index@$time#$clientId";
        }
 
        /**
-        * @param string $value String possibly of the form "<index>" or "<index>@<timestamp>"
+        * @param string $value Possible result of LBFactory::makeCookieValueFromCPIndex()
         * @param int $minTimestamp Lowest UNIX timestamp of non-expired values (if present)
-        * @return int|null Write index or null if $value is empty or expired
+        * @return array (index: int or null, clientId: string or null)
         * @since 1.32
         */
-       public static function getCPIndexFromCookieValue( $value, $minTimestamp ) {
-               if ( !preg_match( '/^(\d+)(?:@(\d+))?$/', $value, $m ) ) {
-                       return null;
+       public static function getCPInfoFromCookieValue( $value, $minTimestamp ) {
+               static $placeholder = [ 'index' => null, 'clientId' => null ];
+
+               if ( !preg_match( '/^(\d+)(?:@(\d+))?(?:#([0-9a-f]{32}))?$/', $value, $m ) ) {
+                       return $placeholder; // invalid
                }
 
                $index = (int)$m[1];
-
-               if ( isset( $m[2] ) && $m[2] !== '' && (int)$m[2] < $minTimestamp ) {
-                       return null; // expired
+               if ( $index <= 0 ) {
+                       return $placeholder; // invalid
+               } elseif ( isset( $m[2] ) && $m[2] !== '' && (int)$m[2] < $minTimestamp ) {
+                       return $placeholder; // expired
                }
 
-               return ( $index > 0 ) ? $index : null;
+               $clientId = ( isset( $m[3] ) && $m[3] !== '' ) ? $m[3] : null;
+
+               return [ 'index' => $index, 'clientId' => $clientId ];
        }
 
        public function setRequestInfo( array $info ) {
index 9a6aa3a..0d7b812 100644 (file)
@@ -62,7 +62,7 @@ class LBFactorySimple extends LBFactory {
        public function __construct( array $conf ) {
                parent::__construct( $conf );
 
-               $this->servers = isset( $conf['servers'] ) ? $conf['servers'] : [];
+               $this->servers = $conf['servers'] ?? [];
                foreach ( $this->servers as $i => $server ) {
                        if ( $i == 0 ) {
                                $this->servers[$i]['master'] = true;
@@ -71,13 +71,9 @@ class LBFactorySimple extends LBFactory {
                        }
                }
 
-               $this->externalClusters = isset( $conf['externalClusters'] )
-                       ? $conf['externalClusters']
-                       : [];
-               $this->loadMonitorClass = isset( $conf['loadMonitorClass'] )
-                       ? $conf['loadMonitorClass']
-                       : 'LoadMonitor';
-               $this->maxLag = isset( $conf['maxLag'] ) ? $conf['maxLag'] : self::MAX_LAG_DEFAULT;
+               $this->externalClusters = $conf['externalClusters'] ?? [];
+               $this->loadMonitorClass = $conf['loadMonitorClass'] ?? 'LoadMonitor';
+               $this->maxLag = $conf['maxLag'] ?? self::MAX_LAG_DEFAULT;
        }
 
        /**
index 81ce4ba..04a553c 100644 (file)
@@ -332,6 +332,13 @@ interface ILoadBalancer {
         */
        public function getServerName( $i );
 
+       /**
+        * Return the server info structure for a given index, or false if the index is invalid.
+        * @param int $i
+        * @return array|bool
+        */
+       public function getServerInfo( $i );
+
        /**
         * Get DB type of the server with the specified index
         *
index eabcbbd..221bca4 100644 (file)
@@ -172,9 +172,7 @@ class LoadBalancer implements ILoadBalancer {
                        : DatabaseDomain::newUnspecified();
                $this->setLocalDomain( $localDomain );
 
-               $this->waitTimeout = isset( $params['waitTimeout'] )
-                       ? $params['waitTimeout']
-                       : self::MAX_WAIT_DEFAULT;
+               $this->waitTimeout = $params['waitTimeout'] ?? self::MAX_WAIT_DEFAULT;
 
                $this->readIndex = -1;
                $this->conns = [
@@ -228,35 +226,27 @@ class LoadBalancer implements ILoadBalancer {
                } else {
                        $this->wanCache = WANObjectCache::newEmpty();
                }
-               $this->profiler = isset( $params['profiler'] ) ? $params['profiler'] : null;
+               $this->profiler = $params['profiler'] ?? null;
                if ( isset( $params['trxProfiler'] ) ) {
                        $this->trxProfiler = $params['trxProfiler'];
                } else {
                        $this->trxProfiler = new TransactionProfiler();
                }
 
-               $this->errorLogger = isset( $params['errorLogger'] )
-                       ? $params['errorLogger']
-                       : function ( Exception $e ) {
-                               trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
-                       };
-               $this->deprecationLogger = isset( $params['deprecationLogger'] )
-                       ? $params['deprecationLogger']
-                       : function ( $msg ) {
-                               trigger_error( $msg, E_USER_DEPRECATED );
-                       };
+               $this->errorLogger = $params['errorLogger'] ?? function ( Exception $e ) {
+                       trigger_error( get_class( $e ) . ': ' . $e->getMessage(), E_USER_WARNING );
+               };
+               $this->deprecationLogger = $params['deprecationLogger'] ?? function ( $msg ) {
+                       trigger_error( $msg, E_USER_DEPRECATED );
+               };
 
                foreach ( [ 'replLogger', 'connLogger', 'queryLogger', 'perfLogger' ] as $key ) {
-                       $this->$key = isset( $params[$key] ) ? $params[$key] : new NullLogger();
+                       $this->$key = $params[$key] ?? new NullLogger();
                }
 
-               $this->host = isset( $params['hostname'] )
-                       ? $params['hostname']
-                       : ( gethostname() ?: 'unknown' );
-               $this->cliMode = isset( $params['cliMode'] )
-                       ? $params['cliMode']
-                       : ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
-               $this->agent = isset( $params['agent'] ) ? $params['agent'] : '';
+               $this->host = $params['hostname'] ?? ( gethostname() ?: 'unknown' );
+               $this->cliMode = $params['cliMode'] ?? ( PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg' );
+               $this->agent = $params['agent'] ?? '';
 
                if ( isset( $params['chronologyCallback'] ) ) {
                        $this->chronologyCallback = $params['chronologyCallback'];
@@ -321,9 +311,7 @@ class LoadBalancer implements ILoadBalancer {
                foreach ( $lags as $i => $lag ) {
                        if ( $i != 0 ) {
                                # How much lag this server nominally is allowed to have
-                               $maxServerLag = isset( $this->servers[$i]['max lag'] )
-                                       ? $this->servers[$i]['max lag']
-                                       : $this->maxLag; // default
+                               $maxServerLag = $this->servers[$i]['max lag'] ?? $this->maxLag; // default
                                # Constrain that futher by $maxLag argument
                                $maxServerLag = min( $maxServerLag, $maxLag );
 
@@ -1033,7 +1021,7 @@ class LoadBalancer implements ILoadBalancer {
        public function getServerAttributes( $i ) {
                return Database::attributesFromType(
                        $this->getServerType( $i ),
-                       isset( $this->servers[$i]['driver'] ) ? $this->servers[$i]['driver'] : null
+                       $this->servers[$i]['driver'] ?? null
                );
        }
 
@@ -1106,7 +1094,7 @@ class LoadBalancer implements ILoadBalancer {
                $server['agent'] = $this->agent;
                // Use DBO_DEFAULT flags by default for LoadBalancer managed databases. Assume that the
                // application calls LoadBalancer::commitMasterChanges() before the PHP script completes.
-               $server['flags'] = isset( $server['flags'] ) ? $server['flags'] : IDatabase::DBO_DEFAULT;
+               $server['flags'] = $server['flags'] ?? IDatabase::DBO_DEFAULT;
 
                // Create a live connection object
                try {
@@ -1195,8 +1183,16 @@ class LoadBalancer implements ILoadBalancer {
                return ( $name != '' ) ? $name : 'localhost';
        }
 
+       public function getServerInfo( $i ) {
+               if ( isset( $this->servers[$i] ) ) {
+                       return $this->servers[$i];
+               } else {
+                       return false;
+               }
+       }
+
        public function getServerType( $i ) {
-               return isset( $this->servers[$i]['type'] ) ? $this->servers[$i]['type'] : 'unknown';
+               return $this->servers[$i]['type'] ?? 'unknown';
        }
 
        public function getMasterPos() {
@@ -1297,7 +1293,7 @@ class LoadBalancer implements ILoadBalancer {
        public function approveMasterChanges( array $options ) {
                $this->assertTransactionRoundStage( self::ROUND_FINALIZED );
 
-               $limit = isset( $options['maxWriteDuration'] ) ? $options['maxWriteDuration'] : 0;
+               $limit = $options['maxWriteDuration'] ?? 0;
 
                $this->trxRoundStage = self::ROUND_ERROR; // "failed" until proven otherwise
                $this->forEachOpenMasterConnection( function ( IDatabase $conn ) use ( $limit ) {
index d29258f..1b72502 100644 (file)
@@ -52,9 +52,9 @@ class LoadBalancerSingle extends LoadBalancer {
                                        'load' => 1,
                                ]
                        ],
-                       'trxProfiler' => isset( $params['trxProfiler'] ) ? $params['trxProfiler'] : null,
-                       'srvCache' => isset( $params['srvCache'] ) ? $params['srvCache'] : null,
-                       'wanCache' => isset( $params['wanCache'] ) ? $params['wanCache'] : null
+                       'trxProfiler' => $params['trxProfiler'] ?? null,
+                       'srvCache' => $params['srvCache'] ?? null,
+                       'wanCache' => $params['wanCache'] ?? null
                ] );
 
                if ( isset( $params['readOnlyReason'] ) ) {
index c7f807a..01834ee 100644 (file)
@@ -69,12 +69,8 @@ class LoadMonitor implements ILoadMonitor {
                $this->wanCache = $wCache;
                $this->replLogger = new NullLogger();
 
-               $this->movingAveRatio = isset( $options['movingAveRatio'] )
-                       ? $options['movingAveRatio']
-                       : 0.1;
-               $this->lagWarnThreshold = isset( $options['lagWarnThreshold'] )
-                       ? $options['lagWarnThreshold']
-                       : self::LAG_WARN_THRESHOLD;
+               $this->movingAveRatio = $options['movingAveRatio'] ?? 0.1;
+               $this->lagWarnThreshold = $options['lagWarnThreshold'] ?? self::LAG_WARN_THRESHOLD;
        }
 
        public function setLogger( LoggerInterface $logger ) {
@@ -167,9 +163,7 @@ class LoadMonitor implements ILoadMonitor {
                                $close = true; // new connection
                        }
 
-                       $lastWeight = isset( $staleValue['weightScales'][$i] )
-                               ? $staleValue['weightScales'][$i]
-                               : 1.0;
+                       $lastWeight = $staleValue['weightScales'][$i] ?? 1.0;
                        $coefficient = $this->getWeightScale( $i, $conn ?: null );
                        $newWeight = $movAveRatio * $coefficient + ( 1 - $movAveRatio ) * $lastWeight;
 
index 1fbc117..dda980c 100644 (file)
@@ -39,9 +39,7 @@ class LoadMonitorMySQL extends LoadMonitor {
        ) {
                parent::__construct( $lb, $srvCache, $wCache, $options );
 
-               $this->warmCacheRatio = isset( $options['warmCacheRatio'] )
-                       ? $options['warmCacheRatio']
-                       : 0.0;
+               $this->warmCacheRatio = $options['warmCacheRatio'] ?? 0.0;
        }
 
        protected function getWeightScale( $index, IDatabase $conn = null ) {
index d330d3c..ede35fa 100644 (file)
@@ -42,6 +42,27 @@ class RedisConnRef implements LoggerAwareInterface {
         */
        protected $logger;
 
+       /**
+        * No authentication errors.
+        *
+        * @var constant
+        */
+       const AUTH_NO_ERROR = 200;
+
+       /**
+        * Temporary authentication error; recovered by reauthenticating.
+        *
+        * @var constant
+        */
+       const AUTH_ERROR_TEMPORARY = 201;
+
+       /**
+        * Authentication error was permanent and could not be recovered.
+        *
+        * @var constant
+        */
+       const AUTH_ERROR_PERMANENT = 202;
+
        /**
         * @param RedisConnectionPool $pool
         * @param string $server
@@ -77,41 +98,145 @@ class RedisConnRef implements LoggerAwareInterface {
                $this->lastError = null;
        }
 
+       /**
+        * Magic __call handler for most Redis functions.
+        *
+        * @param string $name
+        * @param array $arguments
+        * @return mixed $res
+        * @throws RedisException
+        */
        public function __call( $name, $arguments ) {
-               $conn = $this->conn; // convenience
-
                // Work around https://github.com/nicolasff/phpredis/issues/70
                $lname = strtolower( $name );
-               if ( ( $lname === 'blpop' || $lname == 'brpop' )
-                       && is_array( $arguments[0] ) && isset( $arguments[1] )
+               if (
+                       ( $lname === 'blpop' || $lname === 'brpop' || $lname === 'brpoplpush' )
+                       && count( $arguments ) > 1
                ) {
-                       $this->pool->resetTimeout( $conn, $arguments[1] + 1 );
-               } elseif ( $lname === 'brpoplpush' && isset( $arguments[2] ) ) {
-                       $this->pool->resetTimeout( $conn, $arguments[2] + 1 );
+                       // Get timeout off the end since it is always required and argument length can vary
+                       $timeout = end( $arguments );
+                       // Only give the additional one second buffer if not requesting an infinite timeout
+                       $this->pool->resetTimeout( $this->conn, ( $timeout > 0 ? $timeout + 1 : $timeout ) );
                }
 
-               $conn->clearLastError();
+               return $this->tryCall( $name, $arguments );
+       }
+
+       /**
+        * Do the method call in the common try catch handler.
+        *
+        * @param string $method
+        * @param array $arguments
+        * @return mixed $res
+        * @throws RedisException
+        */
+       private function tryCall( $method, $arguments ) {
+               $this->conn->clearLastError();
                try {
-                       $res = call_user_func_array( [ $conn, $name ], $arguments );
-                       if ( preg_match( '/^ERR operation not permitted\b/', $conn->getLastError() ) ) {
-                               $this->pool->reauthenticateConnection( $this->server, $conn );
-                               $conn->clearLastError();
-                               $res = call_user_func_array( [ $conn, $name ], $arguments );
-                               $this->logger->info(
-                                       "Used automatic re-authentication for method '$name'.",
-                                       [ 'redis_server' => $this->server ]
-                               );
+                       $res = call_user_func_array( [ $this->conn, $method ], $arguments );
+                       $authError = $this->checkAuthentication();
+                       if ( $authError === self::AUTH_ERROR_TEMPORARY ) {
+                               $res = call_user_func_array( [ $this->conn, $method ], $arguments );
                        }
-               } catch ( RedisException $e ) {
-                       $this->pool->resetTimeout( $conn ); // restore
-                       throw $e;
+                       if ( $authError === self::AUTH_ERROR_PERMANENT ) {
+                               throw new RedisException( "Failure reauthenticating to Redis." );
+                       }
+               } finally {
+                       $this->postCallCleanup();
                }
 
-               $this->lastError = $conn->getLastError() ?: $this->lastError;
+               return $res;
+       }
 
-               $this->pool->resetTimeout( $conn ); // restore
+       /**
+        * Key Scan
+        * Handle this explicity due to needing the iterator passed by reference.
+        * See: https://github.com/phpredis/phpredis#scan
+        *
+        * @param int &$iterator
+        * @param string $pattern
+        * @param int $count
+        * @return array $res
+        */
+       public function scan( &$iterator, $pattern = null, $count = null ) {
+               return $this->tryCall( 'scan', [ &$iterator, $pattern, $count ] );
+       }
 
-               return $res;
+       /**
+        * Set Scan
+        * Handle this explicity due to needing the iterator passed by reference.
+        * See: https://github.com/phpredis/phpredis#sScan
+        *
+        * @param string $key
+        * @param int &$iterator
+        * @param string $pattern
+        * @param int $count
+        * @return array $res
+        */
+       public function sScan( $key, &$iterator, $pattern = null, $count = null ) {
+               return $this->tryCall( 'sScan', [ $key, &$iterator, $pattern, $count ] );
+       }
+
+       /**
+        * Hash Scan
+        * Handle this explicity due to needing the iterator passed by reference.
+        * See: https://github.com/phpredis/phpredis#hScan
+        *
+        * @param string $key
+        * @param int &$iterator
+        * @param string $pattern
+        * @param int $count
+        * @return array $res
+        */
+       public function hScan( $key, &$iterator, $pattern = null, $count = null ) {
+               return $this->tryCall( 'hScan', [ $key, &$iterator, $pattern, $count ] );
+       }
+
+       /**
+        * Sorted Set Scan
+        * Handle this explicity due to needing the iterator passed by reference.
+        * See: https://github.com/phpredis/phpredis#hScan
+        *
+        * @param string $key
+        * @param int &$iterator
+        * @param string $pattern
+        * @param int $count
+        * @return array $res
+        */
+       public function zScan( $key, &$iterator, $pattern = null, $count = null ) {
+               return $this->tryCall( 'zScan', [ $key, &$iterator, $pattern, $count ] );
+       }
+
+       /**
+        * Handle authentication errors and automatically reauthenticate.
+        *
+        * @return constant self::AUTH_NO_ERROR, self::AUTH_ERROR_TEMPORARY, or self::AUTH_ERROR_PERMANENT
+        */
+       private function checkAuthentication() {
+               if ( preg_match( '/^ERR operation not permitted\b/', $this->conn->getLastError() ) ) {
+                       if ( !$this->pool->reauthenticateConnection( $this->server, $this->conn ) ) {
+                               return self::AUTH_ERROR_PERMANENT;
+                       }
+                       $this->conn->clearLastError();
+                       $this->logger->info(
+                               "Used automatic re-authentication for Redis.",
+                               [ 'redis_server' => $this->server ]
+                       );
+                       return self::AUTH_ERROR_TEMPORARY;
+               }
+               return self::AUTH_NO_ERROR;
+       }
+
+       /**
+        * Post Redis call cleanup.
+        *
+        * @return void
+        */
+       private function postCallCleanup() {
+               $this->lastError = $this->conn->getLastError() ?: $this->lastError;
+
+               // Restore original timeout in the case of blocking calls.
+               $this->pool->resetTimeout( $this->conn );
        }
 
        /**
index 509240f..82cc233 100644 (file)
@@ -81,9 +81,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
                                __CLASS__ . ' requires a Redis client library. ' .
                                'See https://www.mediawiki.org/wiki/Redis#Setup' );
                }
-               $this->logger = isset( $options['logger'] )
-                       ? $options['logger']
-                       : new \Psr\Log\NullLogger();
+               $this->logger = $options['logger'] ?? new \Psr\Log\NullLogger();
                $this->connectTimeout = $options['connectTimeout'];
                $this->readTimeout = $options['readTimeout'];
                $this->persistent = $options['persistent'];
index 2f16078..c7b76b6 100644 (file)
@@ -51,7 +51,7 @@ abstract class VirtualRESTService {
         * @return string The name of the service behind this VRS object.
         */
        public function getName() {
-               return isset( $this->params['name'] ) ? $this->params['name'] : static::class;
+               return $this->params['name'] ?? static::class;
        }
 
        /**
index e3b9376..96d7929 100644 (file)
@@ -105,10 +105,7 @@ class VirtualRESTServiceClient {
                $cmpFunc = function ( $a, $b ) {
                        $al = substr_count( $a, '/' );
                        $bl = substr_count( $b, '/' );
-                       if ( $al === $bl ) {
-                               return 0; // should not actually happen
-                       }
-                       return ( $al < $bl ) ? 1 : -1; // largest prefix first
+                       return $bl <=> $al; // largest prefix first
                };
 
                $matches = []; // matching prefixes (mount points)
diff --git a/includes/libs/xmp/XMP.php b/includes/libs/xmp/XMP.php
deleted file mode 100644 (file)
index 6a4d7c4..0000000
+++ /dev/null
@@ -1,1443 +0,0 @@
-<?php
-/**
- * Reader for XMP data containing properties relevant to images.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Media
- */
-
-use Psr\Log\LoggerAwareInterface;
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
-use Wikimedia\ScopedCallback;
-
-/**
- * Class for reading xmp data containing properties relevant to
- * images, and spitting out an array that FormatMetadata accepts.
- *
- * Note, this is not meant to recognize every possible thing you can
- * encode in XMP. It should recognize all the properties we want.
- * For example it doesn't have support for structures with multiple
- * nesting levels, as none of the properties we're supporting use that
- * feature. If it comes across properties it doesn't recognize, it should
- * ignore them.
- *
- * The public methods one would call in this class are
- * - parse( $content )
- *    Reads in xmp content.
- *    Can potentially be called multiple times with partial data each time.
- * - parseExtended( $content )
- *    Reads XMPExtended blocks (jpeg files only).
- * - getResults
- *    Outputs a results array.
- *
- * Note XMP kind of looks like rdf. They are not the same thing - XMP is
- * encoded as a specific subset of rdf. This class can read XMP. It cannot
- * read rdf.
- */
-class XMPReader implements LoggerAwareInterface {
-       /** @var array XMP item configuration array */
-       protected $items;
-
-       /** @var array Array to hold the current element (and previous element, and so on) */
-       private $curItem = [];
-
-       /** @var bool|string The structure name when processing nested structures. */
-       private $ancestorStruct = false;
-
-       /** @var bool|string Temporary holder for character data that appears in xmp doc. */
-       private $charContent = false;
-
-       /** @var array Stores the state the xmpreader is in (see MODE_FOO constants) */
-       private $mode = [];
-
-       /** @var array Array to hold results */
-       private $results = [];
-
-       /** @var bool If we're doing a seq or bag. */
-       private $processingArray = false;
-
-       /** @var bool|string Used for lang alts only */
-       private $itemLang = false;
-
-       /** @var resource A resource handle for the XML parser */
-       private $xmlParser;
-
-       /** @var bool|string Character set like 'UTF-8' */
-       private $charset = false;
-
-       /** @var int */
-       private $extendedXMPOffset = 0;
-
-       /** @var int Flag determining if the XMP is safe to parse **/
-       private $parsable = 0;
-
-       /** @var string Buffer of XML to parse **/
-       private $xmlParsableBuffer = '';
-
-       /**
-        * These are various mode constants.
-        * they are used to figure out what to do
-        * with an element when its encountered.
-        *
-        * For example, MODE_IGNORE is used when processing
-        * a property we're not interested in. So if a new
-        * element pops up when we're in that mode, we ignore it.
-        */
-       const MODE_INITIAL = 0;
-       const MODE_IGNORE = 1;
-       const MODE_LI = 2;
-       const MODE_LI_LANG = 3;
-       const MODE_QDESC = 4;
-
-       // The following MODE constants are also used in the
-       // $items array to denote what type of property the item is.
-       const MODE_SIMPLE = 10;
-       const MODE_STRUCT = 11; // structure (associative array)
-       const MODE_SEQ = 12; // ordered list
-       const MODE_BAG = 13; // unordered list
-       const MODE_LANG = 14;
-       const MODE_ALT = 15; // non-language alt. Currently not implemented, and not needed atm.
-       const MODE_BAGSTRUCT = 16; // A BAG of Structs.
-
-       const NS_RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
-       const NS_XML = 'http://www.w3.org/XML/1998/namespace';
-
-       // States used while determining if XML is safe to parse
-       const PARSABLE_UNKNOWN = 0;
-       const PARSABLE_OK = 1;
-       const PARSABLE_BUFFERING = 2;
-       const PARSABLE_NO = 3;
-
-       /**
-        * @var LoggerInterface
-        */
-       private $logger;
-
-       /**
-        * @var string
-        */
-       private $filename;
-
-       /**
-        * Primary job is to initialize the XMLParser
-        * @param LoggerInterface|null $logger
-        * @param string $filename
-        */
-       function __construct( LoggerInterface $logger = null, $filename = 'unknown' ) {
-               if ( !function_exists( 'xml_parser_create_ns' ) ) {
-                       // this should already be checked by this point
-                       throw new RuntimeException( 'XMP support requires XML Parser' );
-               }
-               if ( $logger ) {
-                       $this->setLogger( $logger );
-               } else {
-                       $this->setLogger( new NullLogger() );
-               }
-               $this->filename = $filename;
-
-               $this->items = XMPInfo::getItems();
-
-               $this->resetXMLParser();
-       }
-
-       public function setLogger( LoggerInterface $logger ) {
-               $this->logger = $logger;
-       }
-
-       /**
-        * free the XML parser.
-        *
-        * @note It is unclear to me if we really need to do this ourselves
-        *  or if php garbage collection will automatically free the xmlParser
-        *  when it is no longer needed.
-        */
-       private function destroyXMLParser() {
-               if ( $this->xmlParser ) {
-                       xml_parser_free( $this->xmlParser );
-                       $this->xmlParser = null;
-               }
-       }
-
-       /**
-        * Main use is if a single item has multiple xmp documents describing it.
-        * For example in jpeg's with extendedXMP
-        */
-       private function resetXMLParser() {
-               $this->destroyXMLParser();
-
-               $this->xmlParser = xml_parser_create_ns( 'UTF-8', ' ' );
-               xml_parser_set_option( $this->xmlParser, XML_OPTION_CASE_FOLDING, 0 );
-               xml_parser_set_option( $this->xmlParser, XML_OPTION_SKIP_WHITE, 1 );
-
-               xml_set_element_handler( $this->xmlParser,
-                       [ $this, 'startElement' ],
-                       [ $this, 'endElement' ] );
-
-               xml_set_character_data_handler( $this->xmlParser, [ $this, 'char' ] );
-
-               $this->parsable = self::PARSABLE_UNKNOWN;
-               $this->xmlParsableBuffer = '';
-       }
-
-       /**
-        * Check if this instance supports using this class
-        * @return bool
-        */
-       public static function isSupported() {
-               return function_exists( 'xml_parser_create_ns' ) && class_exists( 'XMLReader' );
-       }
-
-       /** Get the result array. Do some post-processing before returning
-        * the array, and transform any metadata that is special-cased.
-        *
-        * @return array Array of results as an array of arrays suitable for
-        *    FormatMetadata::getFormattedData().
-        */
-       public function getResults() {
-               // xmp-special is for metadata that affects how stuff
-               // is extracted. For example xmpNote:HasExtendedXMP.
-
-               // It is also used to handle photoshop:AuthorsPosition
-               // which is weird and really part of another property,
-               // see 2:85 in IPTC. See also pg 21 of IPTC4XMP standard.
-               // The location fields also use it.
-
-               $data = $this->results;
-
-               if ( isset( $data['xmp-special']['AuthorsPosition'] )
-                       && is_string( $data['xmp-special']['AuthorsPosition'] )
-                       && isset( $data['xmp-general']['Artist'][0] )
-               ) {
-                       // Note, if there is more than one creator,
-                       // this only applies to first. This also will
-                       // only apply to the dc:Creator prop, not the
-                       // exif:Artist prop.
-
-                       $data['xmp-general']['Artist'][0] =
-                               $data['xmp-special']['AuthorsPosition'] . ', '
-                               . $data['xmp-general']['Artist'][0];
-               }
-
-               // Go through the LocationShown and LocationCreated
-               // changing it to the non-hierarchal form used by
-               // the other location fields.
-
-               if ( isset( $data['xmp-special']['LocationShown'][0] )
-                       && is_array( $data['xmp-special']['LocationShown'][0] )
-               ) {
-                       // the is_array is just paranoia. It should always
-                       // be an array.
-                       foreach ( $data['xmp-special']['LocationShown'] as $loc ) {
-                               if ( !is_array( $loc ) ) {
-                                       // To avoid copying over the _type meta-fields.
-                                       continue;
-                               }
-                               foreach ( $loc as $field => $val ) {
-                                       $data['xmp-general'][$field . 'Dest'][] = $val;
-                               }
-                       }
-               }
-               if ( isset( $data['xmp-special']['LocationCreated'][0] )
-                       && is_array( $data['xmp-special']['LocationCreated'][0] )
-               ) {
-                       // the is_array is just paranoia. It should always
-                       // be an array.
-                       foreach ( $data['xmp-special']['LocationCreated'] as $loc ) {
-                               if ( !is_array( $loc ) ) {
-                                       // To avoid copying over the _type meta-fields.
-                                       continue;
-                               }
-                               foreach ( $loc as $field => $val ) {
-                                       $data['xmp-general'][$field . 'Created'][] = $val;
-                               }
-                       }
-               }
-
-               // We don't want to return the special values, since they're
-               // special and not info to be stored about the file.
-               unset( $data['xmp-special'] );
-
-               // Convert GPSAltitude to negative if below sea level.
-               if ( isset( $data['xmp-exif']['GPSAltitudeRef'] )
-                       && isset( $data['xmp-exif']['GPSAltitude'] )
-               ) {
-                       // Must convert to a real before multiplying by -1
-                       // XMPValidate guarantees there will always be a '/' in this value.
-                       list( $nom, $denom ) = explode( '/', $data['xmp-exif']['GPSAltitude'] );
-                       $data['xmp-exif']['GPSAltitude'] = $nom / $denom;
-
-                       if ( $data['xmp-exif']['GPSAltitudeRef'] == '1' ) {
-                               $data['xmp-exif']['GPSAltitude'] *= -1;
-                       }
-                       unset( $data['xmp-exif']['GPSAltitudeRef'] );
-               }
-
-               return $data;
-       }
-
-       /**
-        * Main function to call to parse XMP. Use getResults to
-        * get results.
-        *
-        * Also catches any errors during processing, writes them to
-        * debug log, blanks result array and returns false.
-        *
-        * @param string $content XMP data
-        * @param bool $allOfIt If this is all the data (true) or if its split up (false). Default true
-        * @throws RuntimeException
-        * @return bool Success.
-        */
-       public function parse( $content, $allOfIt = true ) {
-               if ( !$this->xmlParser ) {
-                       $this->resetXMLParser();
-               }
-               try {
-
-                       // detect encoding by looking for BOM which is supposed to be in processing instruction.
-                       // see page 12 of http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart3.pdf
-                       if ( !$this->charset ) {
-                               $bom = [];
-                               if ( preg_match( '/\xEF\xBB\xBF|\xFE\xFF|\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\xFF\xFE/',
-                                       $content, $bom )
-                               ) {
-                                       switch ( $bom[0] ) {
-                                               case "\xFE\xFF":
-                                                       $this->charset = 'UTF-16BE';
-                                                       break;
-                                               case "\xFF\xFE":
-                                                       $this->charset = 'UTF-16LE';
-                                                       break;
-                                               case "\x00\x00\xFE\xFF":
-                                                       $this->charset = 'UTF-32BE';
-                                                       break;
-                                               case "\xFF\xFE\x00\x00":
-                                                       $this->charset = 'UTF-32LE';
-                                                       break;
-                                               case "\xEF\xBB\xBF":
-                                                       $this->charset = 'UTF-8';
-                                                       break;
-                                               default:
-                                                       // this should be impossible to get to
-                                                       throw new RuntimeException( "Invalid BOM" );
-                                       }
-                               } else {
-                                       // standard specifically says, if no bom assume utf-8
-                                       $this->charset = 'UTF-8';
-                               }
-                       }
-                       if ( $this->charset !== 'UTF-8' ) {
-                               // don't convert if already utf-8
-                               Wikimedia\suppressWarnings();
-                               $content = iconv( $this->charset, 'UTF-8//IGNORE', $content );
-                               Wikimedia\restoreWarnings();
-                       }
-
-                       // Ensure the XMP block does not have an xml doctype declaration, which
-                       // could declare entities unsafe to parse with xml_parse (T85848/T71210).
-                       if ( $this->parsable !== self::PARSABLE_OK ) {
-                               if ( $this->parsable === self::PARSABLE_NO ) {
-                                       throw new RuntimeException( 'Unsafe doctype declaration in XML.' );
-                               }
-
-                               $content = $this->xmlParsableBuffer . $content;
-                               if ( !$this->checkParseSafety( $content ) ) {
-                                       if ( !$allOfIt && $this->parsable !== self::PARSABLE_NO ) {
-                                               // parse wasn't Unsuccessful yet, so return true
-                                               // in this case.
-                                               return true;
-                                       }
-                                       $msg = ( $this->parsable === self::PARSABLE_NO ) ?
-                                               'Unsafe doctype declaration in XML.' :
-                                               'No root element found in XML.';
-                                       throw new RuntimeException( $msg );
-                               }
-                       }
-
-                       $ok = xml_parse( $this->xmlParser, $content, $allOfIt );
-                       if ( !$ok ) {
-                               $code = xml_get_error_code( $this->xmlParser );
-                               $error = xml_error_string( $code );
-                               $line = xml_get_current_line_number( $this->xmlParser );
-                               $col = xml_get_current_column_number( $this->xmlParser );
-                               $offset = xml_get_current_byte_index( $this->xmlParser );
-
-                               $this->logger->info(
-                                       '{method} : Error reading XMP content: {error} ' .
-                                       '(file: {file}, line: {line} column: {column} ' .
-                                       'byte offset: {offset})',
-                                       [
-                                               'method' => __METHOD__,
-                                               'error_code' => $code,
-                                               'error' => $error,
-                                               'file' => $this->filename,
-                                               'line' => $line,
-                                               'column' => $col,
-                                               'offset' => $offset,
-                                               'content' => $content,
-                               ] );
-                               $this->results = []; // blank if error.
-                               $this->destroyXMLParser();
-                               return false;
-                       }
-               } catch ( Exception $e ) {
-                       $this->logger->warning(
-                               '{method} {exception}',
-                               [
-                                       'method' => __METHOD__,
-                                       'exception' => $e,
-                                       'file' => $this->filename,
-                                       'content' => $content,
-                               ]
-                       );
-                       $this->results = [];
-                       return false;
-               }
-               if ( $allOfIt ) {
-                       $this->destroyXMLParser();
-               }
-
-               return true;
-       }
-
-       /** Entry point for XMPExtended blocks in jpeg files
-        *
-        * @todo In serious need of testing
-        * @see http://www.adobe.ge/devnet/xmp/pdfs/XMPSpecificationPart3.pdf XMP spec part 3 page 20
-        * @param string $content XMPExtended block minus the namespace signature
-        * @return bool If it succeeded.
-        */
-       public function parseExtended( $content ) {
-               // @todo FIXME: This is untested. Hard to find example files
-               // or programs that make such files..
-               $guid = substr( $content, 0, 32 );
-               if ( !isset( $this->results['xmp-special']['HasExtendedXMP'] )
-                       || $this->results['xmp-special']['HasExtendedXMP'] !== $guid
-               ) {
-                       $this->logger->info( __METHOD__ .
-                               " Ignoring XMPExtended block due to wrong guid (guid= '{guid}')",
-                                       [
-                                               'guid' => $guid,
-                                               'file' => $this->filename,
-                                       ]
-                       );
-
-                       return false;
-               }
-               $len = unpack( 'Nlength/Noffset', substr( $content, 32, 8 ) );
-
-               if ( !$len ||
-                       $len['length'] < 4 ||
-                       $len['offset'] < 0 ||
-                       $len['offset'] > $len['length']
-               ) {
-                       $this->logger->info(
-                               __METHOD__ . 'Error reading extended XMP block, invalid length or offset.',
-                               [ 'file' => $this->filename ]
-                       );
-
-                       return false;
-               }
-
-               // we're not very robust here. we should accept it in the wrong order.
-               // To quote the XMP standard:
-               // "A JPEG writer should write the ExtendedXMP marker segments in order,
-               // immediately following the StandardXMP. However, the JPEG standard
-               // does not require preservation of marker segment order. A robust JPEG
-               // reader should tolerate the marker segments in any order."
-               // On the other hand, the probability that an image will have more than
-               // 128k of metadata is rather low... so the probability that it will have
-               // > 128k, and be in the wrong order is very low...
-
-               if ( $len['offset'] !== $this->extendedXMPOffset ) {
-                       $this->logger->info( __METHOD__ . 'Ignoring XMPExtended block due to wrong order. (Offset was '
-                               . $len['offset'] . ' but expected ' . $this->extendedXMPOffset . ')',
-                               [ 'file' => $this->filename ]
-                       );
-
-                       return false;
-               }
-
-               if ( $len['offset'] === 0 ) {
-                       // if we're starting the extended block, we've probably already
-                       // done the XMPStandard block, so reset.
-                       $this->resetXMLParser();
-               }
-
-               $this->extendedXMPOffset += $len['length'];
-
-               $actualContent = substr( $content, 40 );
-
-               if ( $this->extendedXMPOffset === strlen( $actualContent ) ) {
-                       $atEnd = true;
-               } else {
-                       $atEnd = false;
-               }
-
-               $this->logger->debug(
-                       __METHOD__ . 'Parsing a XMPExtended block',
-                       [ 'file' => $this->filename ]
-               );
-
-               return $this->parse( $actualContent, $atEnd );
-       }
-
-       /**
-        * Character data handler
-        * Called whenever character data is found in the xmp document.
-        *
-        * does nothing if we're in MODE_IGNORE or if the data is whitespace
-        * throws an error if we're not in MODE_SIMPLE (as we're not allowed to have character
-        * data in the other modes).
-        *
-        * As an example, this happens when we encounter XMP like:
-        * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
-        * and are processing the 0/10 bit.
-        *
-        * @param resource $parser XMLParser reference to the xml parser
-        * @param string $data Character data
-        * @throws RuntimeException On invalid data
-        */
-       function char( $parser, $data ) {
-               $data = trim( $data );
-               if ( trim( $data ) === "" ) {
-                       return;
-               }
-
-               if ( !isset( $this->mode[0] ) ) {
-                       throw new RuntimeException( 'Unexpected character data before first rdf:Description element' );
-               }
-
-               if ( $this->mode[0] === self::MODE_IGNORE ) {
-                       return;
-               }
-
-               if ( $this->mode[0] !== self::MODE_SIMPLE
-                       && $this->mode[0] !== self::MODE_QDESC
-               ) {
-                       throw new RuntimeException( 'character data where not expected. (mode ' . $this->mode[0] . ')' );
-               }
-
-               // to check, how does this handle w.s.
-               if ( $this->charContent === false ) {
-                       $this->charContent = $data;
-               } else {
-                       $this->charContent .= $data;
-               }
-       }
-
-       /**
-        * Check if a block of XML is safe to pass to xml_parse, i.e. doesn't
-        * contain a doctype declaration which could contain a dos attack if we
-        * parse it and expand internal entities (T85848).
-        *
-        * @param string $content xml string to check for parse safety
-        * @return bool true if the xml is safe to parse, false otherwise
-        */
-       private function checkParseSafety( $content ) {
-               $reader = new XMLReader();
-               $result = null;
-
-               // For XMLReader to parse incomplete/invalid XML, it has to be open()'ed
-               // instead of using XML().
-               $reader->open(
-                       'data://text/plain,' . urlencode( $content ),
-                       null,
-                       LIBXML_NOERROR | LIBXML_NOWARNING | LIBXML_NONET
-               );
-
-               $oldDisable = libxml_disable_entity_loader( true );
-               /** @noinspection PhpUnusedLocalVariableInspection */
-               $reset = new ScopedCallback(
-                       'libxml_disable_entity_loader',
-                       [ $oldDisable ]
-               );
-               $reader->setParserProperty( XMLReader::SUBST_ENTITIES, false );
-
-               // Even with LIBXML_NOWARNING set, XMLReader::read gives a warning
-               // when parsing truncated XML, which causes unit tests to fail.
-               Wikimedia\suppressWarnings();
-               while ( $reader->read() ) {
-                       if ( $reader->nodeType === XMLReader::ELEMENT ) {
-                               // Reached the first element without hitting a doctype declaration
-                               $this->parsable = self::PARSABLE_OK;
-                               $result = true;
-                               break;
-                       }
-                       if ( $reader->nodeType === XMLReader::DOC_TYPE ) {
-                               $this->parsable = self::PARSABLE_NO;
-                               $result = false;
-                               break;
-                       }
-               }
-               Wikimedia\restoreWarnings();
-
-               if ( !is_null( $result ) ) {
-                       return $result;
-               }
-
-               // Reached the end of the parsable xml without finding an element
-               // or doctype. Buffer and try again.
-               $this->parsable = self::PARSABLE_BUFFERING;
-               $this->xmlParsableBuffer = $content;
-               return false;
-       }
-
-       /** When we hit a closing element in MODE_IGNORE
-        * Check to see if this is the element we started to ignore,
-        * in which case we get out of MODE_IGNORE
-        *
-        * @param string $elm Namespace of element followed by a space and then tag name of element.
-        */
-       private function endElementModeIgnore( $elm ) {
-               if ( $this->curItem[0] === $elm ) {
-                       array_shift( $this->curItem );
-                       array_shift( $this->mode );
-               }
-       }
-
-       /**
-        * Hit a closing element when in MODE_SIMPLE.
-        * This generally means that we finished processing a
-        * property value, and now have to save the result to the
-        * results array
-        *
-        * For example, when processing:
-        * <exif:DigitalZoomRatio>0/10</exif:DigitalZoomRatio>
-        * this deals with when we hit </exif:DigitalZoomRatio>.
-        *
-        * Or it could be if we hit the end element of a property
-        * of a compound data structure (like a member of an array).
-        *
-        * @param string $elm Namespace, space, and tag name.
-        */
-       private function endElementModeSimple( $elm ) {
-               if ( $this->charContent !== false ) {
-                       if ( $this->processingArray ) {
-                               // if we're processing an array, use the original element
-                               // name instead of rdf:li.
-                               list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
-                       } else {
-                               list( $ns, $tag ) = explode( ' ', $elm, 2 );
-                       }
-                       $this->saveValue( $ns, $tag, $this->charContent );
-
-                       $this->charContent = false; // reset
-               }
-               array_shift( $this->curItem );
-               array_shift( $this->mode );
-       }
-
-       /**
-        * Hit a closing element in MODE_STRUCT, MODE_SEQ, MODE_BAG
-        * generally means we've finished processing a nested structure.
-        * resets some internal variables to indicate that.
-        *
-        * Note this means we hit the closing element not the "</rdf:Seq>".
-        *
-        * @par For example, when processing:
-        * @code{,xml}
-        * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
-        *   </rdf:Seq> </exif:ISOSpeedRatings>
-        * @endcode
-        *
-        * This method is called when we hit the "</exif:ISOSpeedRatings>" tag.
-        *
-        * @param string $elm Namespace . space . tag name.
-        * @throws RuntimeException
-        */
-       private function endElementNested( $elm ) {
-               /* cur item must be the same as $elm, unless if in MODE_STRUCT
-                * in which case it could also be rdf:Description */
-               if ( $this->curItem[0] !== $elm
-                       && !( $elm === self::NS_RDF . ' Description'
-                               && $this->mode[0] === self::MODE_STRUCT )
-               ) {
-                       throw new RuntimeException( "nesting mismatch. got a </$elm> but expected a </" .
-                               $this->curItem[0] . '>' );
-               }
-
-               // Validate structures.
-               list( $ns, $tag ) = explode( ' ', $elm, 2 );
-               if ( isset( $this->items[$ns][$tag]['validate'] ) ) {
-                       $info =& $this->items[$ns][$tag];
-                       $finalName = isset( $info['map_name'] )
-                               ? $info['map_name'] : $tag;
-
-                       if ( is_array( $info['validate'] ) ) {
-                               $validate = $info['validate'];
-                       } else {
-                               $validator = new XMPValidate( $this->logger );
-                               $validate = [ $validator, $info['validate'] ];
-                       }
-
-                       if ( !isset( $this->results['xmp-' . $info['map_group']][$finalName] ) ) {
-                               // This can happen if all the members of the struct failed validation.
-                               $this->logger->debug(
-                                       __METHOD__ . " <$ns:$tag> has no valid members.",
-                                       [ 'file' => $this->filename ]
-                               );
-                       } elseif ( is_callable( $validate ) ) {
-                               $val =& $this->results['xmp-' . $info['map_group']][$finalName];
-                               call_user_func_array( $validate, [ $info, &$val, false ] );
-                               if ( is_null( $val ) ) {
-                                       // the idea being the validation function will unset the variable if
-                                       // its invalid.
-                                       $this->logger->info(
-                                               __METHOD__ . " <$ns:$tag> failed validation.",
-                                               [ 'file' => $this->filename ]
-                                       );
-                                       unset( $this->results['xmp-' . $info['map_group']][$finalName] );
-                               }
-                       } else {
-                               $this->logger->warning(
-                                       __METHOD__ . " Validation function for $finalName (" .
-                                       $validate[0] . '::' . $validate[1] . '()) is not callable.',
-                                       [ 'file' => $this->filename ]
-                               );
-                       }
-               }
-
-               array_shift( $this->curItem );
-               array_shift( $this->mode );
-               $this->ancestorStruct = false;
-               $this->processingArray = false;
-               $this->itemLang = false;
-       }
-
-       /**
-        * Hit a closing element in MODE_LI (either rdf:Seq, or rdf:Bag )
-        * Add information about what type of element this is.
-        *
-        * Note we still have to hit the outer "</property>"
-        *
-        * @par For example, when processing:
-        * @code{,xml}
-        * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
-        *   </rdf:Seq> </exif:ISOSpeedRatings>
-        * @endcode
-        *
-        * This method is called when we hit the "</rdf:Seq>".
-        * (For comparison, we call endElementModeSimple when we
-        * hit the "</rdf:li>")
-        *
-        * @param string $elm Namespace . ' ' . element name
-        * @throws RuntimeException
-        */
-       private function endElementModeLi( $elm ) {
-               list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
-               $info = $this->items[$ns][$tag];
-               $finalName = isset( $info['map_name'] )
-                       ? $info['map_name'] : $tag;
-
-               array_shift( $this->mode );
-
-               if ( !isset( $this->results['xmp-' . $info['map_group']][$finalName] ) ) {
-                       $this->logger->debug(
-                               __METHOD__ . " Empty compund element $finalName.",
-                               [ 'file' => $this->filename ]
-                       );
-
-                       return;
-               }
-
-               if ( $elm === self::NS_RDF . ' Seq' ) {
-                       $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'ol';
-               } elseif ( $elm === self::NS_RDF . ' Bag' ) {
-                       $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'ul';
-               } elseif ( $elm === self::NS_RDF . ' Alt' ) {
-                       // extra if needed as you could theoretically have a non-language alt.
-                       if ( $info['mode'] === self::MODE_LANG ) {
-                               $this->results['xmp-' . $info['map_group']][$finalName]['_type'] = 'lang';
-                       }
-               } else {
-                       throw new RuntimeException(
-                               __METHOD__ . " expected </rdf:seq> or </rdf:bag> but instead got $elm."
-                       );
-               }
-       }
-
-       /**
-        * End element while in MODE_QDESC
-        * mostly when ending an element when we have a simple value
-        * that has qualifiers.
-        *
-        * Qualifiers aren't all that common, and we don't do anything
-        * with them.
-        *
-        * @param string $elm Namespace and element
-        */
-       private function endElementModeQDesc( $elm ) {
-               if ( $elm === self::NS_RDF . ' value' ) {
-                       list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
-                       $this->saveValue( $ns, $tag, $this->charContent );
-
-                       return;
-               } else {
-                       array_shift( $this->mode );
-                       array_shift( $this->curItem );
-               }
-       }
-
-       /**
-        * Handler for hitting a closing element.
-        *
-        * generally just calls a helper function depending on what
-        * mode we're in.
-        *
-        * Ignores the outer wrapping elements that are optional in
-        * xmp and have no meaning.
-        *
-        * @param resource $parser
-        * @param string $elm Namespace . ' ' . element name
-        * @throws RuntimeException
-        */
-       function endElement( $parser, $elm ) {
-               if ( $elm === ( self::NS_RDF . ' RDF' )
-                       || $elm === 'adobe:ns:meta/ xmpmeta'
-                       || $elm === 'adobe:ns:meta/ xapmeta'
-               ) {
-                       // ignore these.
-                       return;
-               }
-
-               if ( $elm === self::NS_RDF . ' type' ) {
-                       // these aren't really supported properly yet.
-                       // However, it appears they almost never used.
-                       $this->logger->info(
-                               __METHOD__ . ' encountered <rdf:type>',
-                               [ 'file' => $this->filename ]
-                       );
-               }
-
-               if ( strpos( $elm, ' ' ) === false ) {
-                       // This probably shouldn't happen.
-                       // However, there is a bug in an adobe product
-                       // that forgets the namespace on some things.
-                       // (Luckily they are unimportant things).
-                       $this->logger->info(
-                               __METHOD__ . " Encountered </$elm> which has no namespace. Skipping.",
-                               [ 'file' => $this->filename ]
-                       );
-
-                       return;
-               }
-
-               if ( count( $this->mode ) === 0 ) {
-                       // This should never ever happen and means
-                       // there is a pretty major bug in this class.
-                       throw new RuntimeException( 'Encountered end element with no mode' );
-               }
-
-               if ( count( $this->curItem ) == 0 && $this->mode[0] !== self::MODE_INITIAL ) {
-                       // just to be paranoid. Should always have a curItem, except for initially
-                       // (aka during MODE_INITAL).
-                       throw new RuntimeException( "Hit end element </$elm> but no curItem" );
-               }
-
-               switch ( $this->mode[0] ) {
-                       case self::MODE_IGNORE:
-                               $this->endElementModeIgnore( $elm );
-                               break;
-                       case self::MODE_SIMPLE:
-                               $this->endElementModeSimple( $elm );
-                               break;
-                       case self::MODE_STRUCT:
-                       case self::MODE_SEQ:
-                       case self::MODE_BAG:
-                       case self::MODE_LANG:
-                       case self::MODE_BAGSTRUCT:
-                               $this->endElementNested( $elm );
-                               break;
-                       case self::MODE_INITIAL:
-                               if ( $elm === self::NS_RDF . ' Description' ) {
-                                       array_shift( $this->mode );
-                               } else {
-                                       throw new RuntimeException( 'Element ended unexpectedly while in MODE_INITIAL' );
-                               }
-                               break;
-                       case self::MODE_LI:
-                       case self::MODE_LI_LANG:
-                               $this->endElementModeLi( $elm );
-                               break;
-                       case self::MODE_QDESC:
-                               $this->endElementModeQDesc( $elm );
-                               break;
-                       default:
-                               $this->logger->info(
-                                       __METHOD__ . " no mode (elm = $elm)",
-                                       [ 'file' => $this->filename ]
-                               );
-                               break;
-               }
-       }
-
-       /**
-        * Hit an opening element while in MODE_IGNORE
-        *
-        * XMP is extensible, so ignore any tag we don't understand.
-        *
-        * Mostly ignores, unless we encounter the element that we are ignoring.
-        * in which case we add it to the item stack, so we can ignore things
-        * that are nested, correctly.
-        *
-        * @param string $elm Namespace . ' ' . tag name
-        */
-       private function startElementModeIgnore( $elm ) {
-               if ( $elm === $this->curItem[0] ) {
-                       array_unshift( $this->curItem, $elm );
-                       array_unshift( $this->mode, self::MODE_IGNORE );
-               }
-       }
-
-       /**
-        *  Start element in MODE_BAG (unordered array)
-        * this should always be <rdf:Bag>
-        *
-        * @param string $elm Namespace . ' ' . tag
-        * @throws RuntimeException If we have an element that's not <rdf:Bag>
-        */
-       private function startElementModeBag( $elm ) {
-               if ( $elm === self::NS_RDF . ' Bag' ) {
-                       array_unshift( $this->mode, self::MODE_LI );
-               } else {
-                       throw new RuntimeException( "Expected <rdf:Bag> but got $elm." );
-               }
-       }
-
-       /**
-        * Start element in MODE_SEQ (ordered array)
-        * this should always be <rdf:Seq>
-        *
-        * @param string $elm Namespace . ' ' . tag
-        * @throws RuntimeException If we have an element that's not <rdf:Seq>
-        */
-       private function startElementModeSeq( $elm ) {
-               if ( $elm === self::NS_RDF . ' Seq' ) {
-                       array_unshift( $this->mode, self::MODE_LI );
-               } elseif ( $elm === self::NS_RDF . ' Bag' ) {
-                       # T29105
-                       $this->logger->info(
-                               __METHOD__ . ' Expected an rdf:Seq, but got an rdf:Bag. Pretending' .
-                               ' it is a Seq, since some buggy software is known to screw this up.',
-                               [ 'file' => $this->filename ]
-                       );
-                       array_unshift( $this->mode, self::MODE_LI );
-               } else {
-                       throw new RuntimeException( "Expected <rdf:Seq> but got $elm." );
-               }
-       }
-
-       /**
-        * Start element in MODE_LANG (language alternative)
-        * this should always be <rdf:Alt>
-        *
-        * This tag tends to be used for metadata like describe this
-        * picture, which can be translated into multiple languages.
-        *
-        * XMP supports non-linguistic alternative selections,
-        * which are really only used for thumbnails, which
-        * we don't care about.
-        *
-        * @param string $elm Namespace . ' ' . tag
-        * @throws RuntimeException If we have an element that's not <rdf:Alt>
-        */
-       private function startElementModeLang( $elm ) {
-               if ( $elm === self::NS_RDF . ' Alt' ) {
-                       array_unshift( $this->mode, self::MODE_LI_LANG );
-               } else {
-                       throw new RuntimeException( "Expected <rdf:Seq> but got $elm." );
-               }
-       }
-
-       /**
-        * Handle an opening element when in MODE_SIMPLE
-        *
-        * This should not happen often. This is for if a simple element
-        * already opened has a child element. Could happen for a
-        * qualified element.
-        *
-        * For example:
-        * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
-        *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
-        *   </exif:DigitalZoomRatio>
-        *
-        * This method is called when processing the <rdf:Description> element
-        *
-        * @param string $elm Namespace and tag names separated by space.
-        * @param array $attribs Attributes of the element.
-        * @throws RuntimeException
-        */
-       private function startElementModeSimple( $elm, $attribs ) {
-               if ( $elm === self::NS_RDF . ' Description' ) {
-                       // If this value has qualifiers
-                       array_unshift( $this->mode, self::MODE_QDESC );
-                       array_unshift( $this->curItem, $this->curItem[0] );
-
-                       if ( isset( $attribs[self::NS_RDF . ' value'] ) ) {
-                               list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
-                               $this->saveValue( $ns, $tag, $attribs[self::NS_RDF . ' value'] );
-                       }
-               } elseif ( $elm === self::NS_RDF . ' value' ) {
-                       // This should not be here.
-                       throw new RuntimeException( __METHOD__ . ' Encountered <rdf:value> where it was unexpected.' );
-               } else {
-                       // something else we don't recognize, like a qualifier maybe.
-                       $this->logger->info( __METHOD__ .
-                               " Encountered element <{element}> where only expecting character data as value of {curitem}",
-                               [
-                                       'element' => $elm,
-                                       'curitem' => $this->curItem[0],
-                                       'file' => $this->filename,
-                               ]
-                       );
-                       array_unshift( $this->mode, self::MODE_IGNORE );
-                       array_unshift( $this->curItem, $elm );
-               }
-       }
-
-       /**
-        * Start an element when in MODE_QDESC.
-        * This generally happens when a simple element has an inner
-        * rdf:Description to hold qualifier elements.
-        *
-        * For example in:
-        * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
-        *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
-        *   </exif:DigitalZoomRatio>
-        * Called when processing the <rdf:value> or <foo:someQualifier>.
-        *
-        * @param string $elm Namespace and tag name separated by a space.
-        */
-       private function startElementModeQDesc( $elm ) {
-               if ( $elm === self::NS_RDF . ' value' ) {
-                       return; // do nothing
-               } else {
-                       // otherwise its a qualifier, which we ignore
-                       array_unshift( $this->mode, self::MODE_IGNORE );
-                       array_unshift( $this->curItem, $elm );
-               }
-       }
-
-       /**
-        * Starting an element when in MODE_INITIAL
-        * This usually happens when we hit an element inside
-        * the outer rdf:Description
-        *
-        * This is generally where most properties start.
-        *
-        * @param string $ns Namespace
-        * @param string $tag Tag name (without namespace prefix)
-        * @param array $attribs Array of attributes
-        * @throws RuntimeException
-        */
-       private function startElementModeInitial( $ns, $tag, $attribs ) {
-               if ( $ns !== self::NS_RDF ) {
-                       if ( isset( $this->items[$ns][$tag] ) ) {
-                               if ( isset( $this->items[$ns][$tag]['structPart'] ) ) {
-                                       // If this element is supposed to appear only as
-                                       // a child of a structure, but appears here (not as
-                                       // a child of a struct), then something weird is
-                                       // happening, so ignore this element and its children.
-
-                                       $this->logger->info(
-                                               'Encountered <{element}> outside of its expected parent. Ignoring.',
-                                               [ 'element' => "$ns:$tag", 'file' => $this->filename ]
-                                       );
-
-                                       array_unshift( $this->mode, self::MODE_IGNORE );
-                                       array_unshift( $this->curItem, $ns . ' ' . $tag );
-
-                                       return;
-                               }
-                               $mode = $this->items[$ns][$tag]['mode'];
-                               array_unshift( $this->mode, $mode );
-                               array_unshift( $this->curItem, $ns . ' ' . $tag );
-                               if ( $mode === self::MODE_STRUCT ) {
-                                       $this->ancestorStruct = isset( $this->items[$ns][$tag]['map_name'] )
-                                               ? $this->items[$ns][$tag]['map_name'] : $tag;
-                               }
-                               if ( $this->charContent !== false ) {
-                                       // Something weird.
-                                       // Should not happen in valid XMP.
-                                       throw new RuntimeException( 'tag nested in non-whitespace characters.' );
-                               }
-                       } else {
-                               // This element is not on our list of allowed elements so ignore.
-                               $this->logger->debug( __METHOD__ . ' Ignoring unrecognized element <{element}>.',
-                                       [ 'element' => "$ns:$tag", 'file' => $this->filename ] );
-                               array_unshift( $this->mode, self::MODE_IGNORE );
-                               array_unshift( $this->curItem, $ns . ' ' . $tag );
-
-                               return;
-                       }
-               }
-               // process attributes
-               $this->doAttribs( $attribs );
-       }
-
-       /**
-        * Hit an opening element when in a Struct (MODE_STRUCT)
-        * This is generally for fields of a compound property.
-        *
-        * Example of a struct (abbreviated; flash has more properties):
-        *
-        * <exif:Flash> <rdf:Description> <exif:Fired>True</exif:Fired>
-        *  <exif:Mode>1</exif:Mode></rdf:Description></exif:Flash>
-        *
-        * or:
-        *
-        * <exif:Flash rdf:parseType='Resource'> <exif:Fired>True</exif:Fired>
-        *  <exif:Mode>1</exif:Mode></exif:Flash>
-        *
-        * @param string $ns Namespace
-        * @param string $tag Tag name (no ns)
-        * @param array $attribs Array of attribs w/ values.
-        * @throws RuntimeException
-        */
-       private function startElementModeStruct( $ns, $tag, $attribs ) {
-               if ( $ns !== self::NS_RDF ) {
-                       if ( isset( $this->items[$ns][$tag] ) ) {
-                               if ( isset( $this->items[$ns][$this->ancestorStruct]['children'] )
-                                       && !isset( $this->items[$ns][$this->ancestorStruct]['children'][$tag] )
-                               ) {
-                                       // This assumes that we don't have inter-namespace nesting
-                                       // which we don't in all the properties we're interested in.
-                                       throw new RuntimeException( " <$tag> appeared nested in <" . $this->ancestorStruct
-                                               . "> where it is not allowed." );
-                               }
-                               array_unshift( $this->mode, $this->items[$ns][$tag]['mode'] );
-                               array_unshift( $this->curItem, $ns . ' ' . $tag );
-                               if ( $this->charContent !== false ) {
-                                       // Something weird.
-                                       // Should not happen in valid XMP.
-                                       throw new RuntimeException( "tag <$tag> nested in non-whitespace characters (" .
-                                               $this->charContent . ")." );
-                               }
-                       } else {
-                               array_unshift( $this->mode, self::MODE_IGNORE );
-                               array_unshift( $this->curItem, $ns . ' ' . $tag );
-
-                               return;
-                       }
-               }
-
-               if ( $ns === self::NS_RDF && $tag === 'Description' ) {
-                       $this->doAttribs( $attribs );
-                       array_unshift( $this->mode, self::MODE_STRUCT );
-                       array_unshift( $this->curItem, $this->curItem[0] );
-               }
-       }
-
-       /**
-        * opening element in MODE_LI
-        * process elements of arrays.
-        *
-        * Example:
-        * <exif:ISOSpeedRatings> <rdf:Seq> <rdf:li>64</rdf:li>
-        *   </rdf:Seq> </exif:ISOSpeedRatings>
-        * This method is called when we hit the <rdf:li> element.
-        *
-        * @param string $elm Namespace . ' ' . tagname
-        * @param array $attribs Attributes. (needed for BAGSTRUCTS)
-        * @throws RuntimeException If gets a tag other than <rdf:li>
-        */
-       private function startElementModeLi( $elm, $attribs ) {
-               if ( ( $elm ) !== self::NS_RDF . ' li' ) {
-                       throw new RuntimeException( "<rdf:li> expected but got $elm." );
-               }
-
-               if ( !isset( $this->mode[1] ) ) {
-                       // This should never ever ever happen. Checking for it
-                       // to be paranoid.
-                       throw new RuntimeException( 'In mode Li, but no 2xPrevious mode!' );
-               }
-
-               if ( $this->mode[1] === self::MODE_BAGSTRUCT ) {
-                       // This list item contains a compound (STRUCT) value.
-                       array_unshift( $this->mode, self::MODE_STRUCT );
-                       array_unshift( $this->curItem, $elm );
-                       $this->processingArray = true;
-
-                       if ( !isset( $this->curItem[1] ) ) {
-                               // be paranoid.
-                               throw new RuntimeException( 'Can not find parent of BAGSTRUCT.' );
-                       }
-                       list( $curNS, $curTag ) = explode( ' ', $this->curItem[1] );
-                       $this->ancestorStruct = isset( $this->items[$curNS][$curTag]['map_name'] )
-                               ? $this->items[$curNS][$curTag]['map_name'] : $curTag;
-
-                       $this->doAttribs( $attribs );
-               } else {
-                       // Normal BAG or SEQ containing simple values.
-                       array_unshift( $this->mode, self::MODE_SIMPLE );
-                       // need to add curItem[0] on again since one is for the specific item
-                       // and one is for the entire group.
-                       array_unshift( $this->curItem, $this->curItem[0] );
-                       $this->processingArray = true;
-               }
-       }
-
-       /**
-        * Opening element in MODE_LI_LANG.
-        * process elements of language alternatives
-        *
-        * Example:
-        * <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">My house
-        *  </rdf:li> </rdf:Alt> </dc:title>
-        *
-        * This method is called when we hit the <rdf:li> element.
-        *
-        * @param string $elm Namespace . ' ' . tag
-        * @param array $attribs Array of elements (most importantly xml:lang)
-        * @throws RuntimeException If gets a tag other than <rdf:li> or if no xml:lang
-        */
-       private function startElementModeLiLang( $elm, $attribs ) {
-               if ( $elm !== self::NS_RDF . ' li' ) {
-                       throw new RuntimeException( __METHOD__ . " <rdf:li> expected but got $elm." );
-               }
-               if ( !isset( $attribs[self::NS_XML . ' lang'] )
-                       || !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $attribs[self::NS_XML . ' lang'] )
-               ) {
-                       throw new RuntimeException( __METHOD__
-                               . " <rdf:li> did not contain, or has invalid xml:lang attribute in lang alternative" );
-               }
-
-               // Lang is case-insensitive.
-               $this->itemLang = strtolower( $attribs[self::NS_XML . ' lang'] );
-
-               // need to add curItem[0] on again since one is for the specific item
-               // and one is for the entire group.
-               array_unshift( $this->curItem, $this->curItem[0] );
-               array_unshift( $this->mode, self::MODE_SIMPLE );
-               $this->processingArray = true;
-       }
-
-       /**
-        * Hits an opening element.
-        * Generally just calls a helper based on what MODE we're in.
-        * Also does some initial set up for the wrapper element
-        *
-        * @param resource $parser
-        * @param string $elm Namespace "<space>" element
-        * @param array $attribs Attribute name => value
-        * @throws RuntimeException
-        */
-       function startElement( $parser, $elm, $attribs ) {
-               if ( $elm === self::NS_RDF . ' RDF'
-                       || $elm === 'adobe:ns:meta/ xmpmeta'
-                       || $elm === 'adobe:ns:meta/ xapmeta'
-               ) {
-                       /* ignore. */
-                       return;
-               } elseif ( $elm === self::NS_RDF . ' Description' ) {
-                       if ( count( $this->mode ) === 0 ) {
-                               // outer rdf:desc
-                               array_unshift( $this->mode, self::MODE_INITIAL );
-                       }
-               } elseif ( $elm === self::NS_RDF . ' type' ) {
-                       // This doesn't support rdf:type properly.
-                       // In practise I have yet to see a file that
-                       // uses this element, however it is mentioned
-                       // on page 25 of part 1 of the xmp standard.
-                       // Also it seems as if exiv2 and exiftool do not support
-                       // this either (That or I misunderstand the standard)
-                       $this->logger->info(
-                               __METHOD__ . ' Encountered <rdf:type> which isn\'t currently supported',
-                               [ 'file' => $this->filename ]
-                       );
-               }
-
-               if ( strpos( $elm, ' ' ) === false ) {
-                       // This probably shouldn't happen.
-                       $this->logger->info(
-                               __METHOD__ . " Encountered <$elm> which has no namespace. Skipping.",
-                               [ 'file' => $this->filename ]
-                       );
-
-                       return;
-               }
-
-               list( $ns, $tag ) = explode( ' ', $elm, 2 );
-
-               if ( count( $this->mode ) === 0 ) {
-                       // This should not happen.
-                       throw new RuntimeException( 'Error extracting XMP, '
-                               . "encountered <$elm> with no mode" );
-               }
-
-               switch ( $this->mode[0] ) {
-                       case self::MODE_IGNORE:
-                               $this->startElementModeIgnore( $elm );
-                               break;
-                       case self::MODE_SIMPLE:
-                               $this->startElementModeSimple( $elm, $attribs );
-                               break;
-                       case self::MODE_INITIAL:
-                               $this->startElementModeInitial( $ns, $tag, $attribs );
-                               break;
-                       case self::MODE_STRUCT:
-                               $this->startElementModeStruct( $ns, $tag, $attribs );
-                               break;
-                       case self::MODE_BAG:
-                       case self::MODE_BAGSTRUCT:
-                               $this->startElementModeBag( $elm );
-                               break;
-                       case self::MODE_SEQ:
-                               $this->startElementModeSeq( $elm );
-                               break;
-                       case self::MODE_LANG:
-                               $this->startElementModeLang( $elm );
-                               break;
-                       case self::MODE_LI_LANG:
-                               $this->startElementModeLiLang( $elm, $attribs );
-                               break;
-                       case self::MODE_LI:
-                               $this->startElementModeLi( $elm, $attribs );
-                               break;
-                       case self::MODE_QDESC:
-                               $this->startElementModeQDesc( $elm );
-                               break;
-                       default:
-                               throw new RuntimeException( 'StartElement in unknown mode: ' . $this->mode[0] );
-               }
-       }
-
-       // phpcs:disable Generic.Files.LineLength
-       /**
-        * Process attributes.
-        * Simple values can be stored as either a tag or attribute
-        *
-        * Often the initial "<rdf:Description>" tag just has all the simple
-        * properties as attributes.
-        *
-        * @par Example:
-        * @code
-        * <rdf:Description rdf:about="" xmlns:exif="http://ns.adobe.com/exif/1.0/" exif:DigitalZoomRatio="0/10">
-        * @endcode
-        *
-        * @param array $attribs Array attribute=>value
-        * @throws RuntimeException
-        */
-       // phpcs:enable
-       private function doAttribs( $attribs ) {
-               // first check for rdf:parseType attribute, as that can change
-               // how the attributes are interperted.
-
-               if ( isset( $attribs[self::NS_RDF . ' parseType'] )
-                       && $attribs[self::NS_RDF . ' parseType'] === 'Resource'
-                       && $this->mode[0] === self::MODE_SIMPLE
-               ) {
-                       // this is equivalent to having an inner rdf:Description
-                       $this->mode[0] = self::MODE_QDESC;
-               }
-               foreach ( $attribs as $name => $val ) {
-                       if ( strpos( $name, ' ' ) === false ) {
-                               // This shouldn't happen, but so far some old software forgets namespace
-                               // on rdf:about.
-                               $this->logger->info(
-                                       __METHOD__ . ' Encountered non-namespaced attribute: ' .
-                                       " $name=\"$val\". Skipping. ",
-                                       [ 'file' => $this->filename ]
-                               );
-                               continue;
-                       }
-                       list( $ns, $tag ) = explode( ' ', $name, 2 );
-                       if ( $ns === self::NS_RDF ) {
-                               if ( $tag === 'value' || $tag === 'resource' ) {
-                                       // resource is for url.
-                                       // value attribute is a weird way of just putting the contents.
-                                       $this->char( $this->xmlParser, $val );
-                               }
-                       } elseif ( isset( $this->items[$ns][$tag] ) ) {
-                               if ( $this->mode[0] === self::MODE_SIMPLE ) {
-                                       throw new RuntimeException( __METHOD__
-                                               . " $ns:$tag found as attribute where not allowed" );
-                               }
-                               $this->saveValue( $ns, $tag, $val );
-                       } else {
-                               $this->logger->debug(
-                                       __METHOD__ . " Ignoring unrecognized element <$ns:$tag>.",
-                                       [ 'file' => $this->filename ]
-                               );
-                       }
-               }
-       }
-
-       /**
-        * Given an extracted value, save it to results array
-        *
-        * note also uses $this->ancestorStruct and
-        * $this->processingArray to determine what name to
-        * save the value under. (in addition to $tag).
-        *
-        * @param string $ns Namespace of tag this is for
-        * @param string $tag Tag name
-        * @param string $val Value to save
-        */
-       private function saveValue( $ns, $tag, $val ) {
-               $info =& $this->items[$ns][$tag];
-               $finalName = isset( $info['map_name'] )
-                       ? $info['map_name'] : $tag;
-               if ( isset( $info['validate'] ) ) {
-                       if ( is_array( $info['validate'] ) ) {
-                               $validate = $info['validate'];
-                       } else {
-                               $validator = new XMPValidate( $this->logger );
-                               $validate = [ $validator, $info['validate'] ];
-                       }
-
-                       if ( is_callable( $validate ) ) {
-                               call_user_func_array( $validate, [ $info, &$val, true ] );
-                               // the reasoning behind using &$val instead of using the return value
-                               // is to be consistent between here and validating structures.
-                               if ( is_null( $val ) ) {
-                                       $this->logger->info(
-                                               __METHOD__ . " <$ns:$tag> failed validation.",
-                                               [ 'file' => $this->filename ]
-                                       );
-
-                                       return;
-                               }
-                       } else {
-                               $this->logger->warning(
-                                       __METHOD__ . " Validation function for $finalName (" .
-                                       $validate[0] . '::' . $validate[1] . '()) is not callable.',
-                                       [ 'file' => $this->filename ]
-                               );
-                       }
-               }
-
-               if ( $this->ancestorStruct && $this->processingArray ) {
-                       // Aka both an array and a struct. ( self::MODE_BAGSTRUCT )
-                       $this->results['xmp-' . $info['map_group']][$this->ancestorStruct][][$finalName] = $val;
-               } elseif ( $this->ancestorStruct ) {
-                       $this->results['xmp-' . $info['map_group']][$this->ancestorStruct][$finalName] = $val;
-               } elseif ( $this->processingArray ) {
-                       if ( $this->itemLang === false ) {
-                               // normal array
-                               $this->results['xmp-' . $info['map_group']][$finalName][] = $val;
-                       } else {
-                               // lang array.
-                               $this->results['xmp-' . $info['map_group']][$finalName][$this->itemLang] = $val;
-                       }
-               } else {
-                       $this->results['xmp-' . $info['map_group']][$finalName] = $val;
-               }
-       }
-}
diff --git a/includes/libs/xmp/XMPInfo.php b/includes/libs/xmp/XMPInfo.php
deleted file mode 100644 (file)
index 5211a2c..0000000
+++ /dev/null
@@ -1,1168 +0,0 @@
-<?php
-/**
- * Definitions for XMPReader 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 Media
- */
-
-/**
- * This class is just a container for a big array
- * used by XMPReader to determine which XMP items to
- * extract.
- */
-class XMPInfo {
-       /** Get the items array
-        * @return array XMP item configuration array.
-        */
-       public static function getItems() {
-               return self::$items;
-       }
-
-       /**
-        * XMPInfo::$items keeps a list of all the items
-        * we are interested to extract, as well as
-        * information about the item like what type
-        * it is.
-        *
-        * Format is an array of namespaces,
-        * each containing an array of tags
-        * each tag is an array of information about the
-        * tag, including:
-        *   * map_group - What group (used for precedence during conflicts).
-        *   * mode - What type of item (self::MODE_SIMPLE usually, see above for
-        *     all values).
-        *   * validate - Method to validate input. Could also post-process the
-        *     input. A string value is assumed to be a method of
-        *     XMPValidate. Can also take a array( 'className', 'methodName' ).
-        *   * choices - Array of potential values (format of 'value' => true ).
-        *     Only used with validateClosed.
-        *   * rangeLow and rangeHigh - Alternative to choices for numeric ranges.
-        *     Again for validateClosed only.
-        *   * children - For MODE_STRUCT items, allowed children.
-        *   * structPart - Indicates that this element can only appear as a member
-        *     of a structure.
-        *
-        * Currently this just has a bunch of EXIF values as this class is only half-done.
-        */
-       static private $items = [
-               'http://ns.adobe.com/exif/1.0/' => [
-                       'ApertureValue' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'BrightnessValue' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'CompressedBitsPerPixel' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'DigitalZoomRatio' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'ExposureBiasValue' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'ExposureIndex' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'ExposureTime' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'FlashEnergy' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational',
-                       ],
-                       'FNumber' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'FocalLength' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'FocalPlaneXResolution' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'FocalPlaneYResolution' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'GPSAltitude' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational',
-                       ],
-                       'GPSDestBearing' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'GPSDestDistance' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'GPSDOP' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'GPSImgDirection' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'GPSSpeed' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'GPSTrack' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'MaxApertureValue' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'ShutterSpeedValue' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       'SubjectDistance' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational'
-                       ],
-                       /* Flash */
-                       'Flash' => [
-                               'mode' => XMPReader::MODE_STRUCT,
-                               'children' => [
-                                       'Fired' => true,
-                                       'Function' => true,
-                                       'Mode' => true,
-                                       'RedEyeMode' => true,
-                                       'Return' => true,
-                               ],
-                               'validate' => 'validateFlash',
-                               'map_group' => 'exif',
-                       ],
-                       'Fired' => [
-                               'map_group' => 'exif',
-                               'validate' => 'validateBoolean',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'Function' => [
-                               'map_group' => 'exif',
-                               'validate' => 'validateBoolean',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'Mode' => [
-                               'map_group' => 'exif',
-                               'validate' => 'validateClosed',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'choices' => [ '0' => true, '1' => true,
-                                       '2' => true, '3' => true ],
-                               'structPart' => true,
-                       ],
-                       'Return' => [
-                               'map_group' => 'exif',
-                               'validate' => 'validateClosed',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'choices' => [ '0' => true,
-                                       '2' => true, '3' => true ],
-                               'structPart' => true,
-                       ],
-                       'RedEyeMode' => [
-                               'map_group' => 'exif',
-                               'validate' => 'validateBoolean',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       /* End Flash */
-                       'ISOSpeedRatings' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateInteger'
-                       ],
-                       /* end rational things */
-                       'ColorSpace' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '1' => true, '65535' => true ],
-                       ],
-                       'ComponentsConfiguration' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '1' => true, '2' => true, '3' => true, '4' => true,
-                                       '5' => true, '6' => true ]
-                       ],
-                       'Contrast' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '0' => true, '1' => true, '2' => true ]
-                       ],
-                       'CustomRendered' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '0' => true, '1' => true ]
-                       ],
-                       'DateTimeOriginal' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateDate',
-                       ],
-                       'DateTimeDigitized' => [ /* xmp:CreateDate */
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateDate',
-                       ],
-                       /* todo: there might be interesting information in
-                        * exif:DeviceSettingDescription, but need to find an
-                        * example
-                        */
-                       'ExifVersion' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'ExposureMode' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 2,
-                       ],
-                       'ExposureProgram' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 8,
-                       ],
-                       'FileSource' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '3' => true ]
-                       ],
-                       'FlashpixVersion' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'FocalLengthIn35mmFilm' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                       ],
-                       'FocalPlaneResolutionUnit' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '2' => true, '3' => true ],
-                       ],
-                       'GainControl' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 4,
-                       ],
-                       /* this value is post-processed out later */
-                       'GPSAltitudeRef' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '0' => true, '1' => true ],
-                       ],
-                       'GPSAreaInformation' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'GPSDestBearingRef' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ 'T' => true, 'M' => true ],
-                       ],
-                       'GPSDestDistanceRef' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ 'K' => true, 'M' => true,
-                                       'N' => true ],
-                       ],
-                       'GPSDestLatitude' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateGPS',
-                       ],
-                       'GPSDestLongitude' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateGPS',
-                       ],
-                       'GPSDifferential' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '0' => true, '1' => true ],
-                       ],
-                       'GPSImgDirectionRef' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ 'T' => true, 'M' => true ],
-                       ],
-                       'GPSLatitude' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateGPS',
-                       ],
-                       'GPSLongitude' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateGPS',
-                       ],
-                       'GPSMapDatum' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'GPSMeasureMode' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '2' => true, '3' => true ]
-                       ],
-                       'GPSProcessingMethod' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'GPSSatellites' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'GPSSpeedRef' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ 'K' => true, 'M' => true,
-                                       'N' => true ],
-                       ],
-                       'GPSStatus' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ 'A' => true, 'V' => true ]
-                       ],
-                       'GPSTimeStamp' => [
-                               'map_group' => 'exif',
-                               // Note: in exif, GPSDateStamp does not include
-                               // the time, where here it does.
-                               'map_name' => 'GPSDateStamp',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateDate',
-                       ],
-                       'GPSTrackRef' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ 'T' => true, 'M' => true ]
-                       ],
-                       'GPSVersionID' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'ImageUniqueID' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'LightSource' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               /* can't use a range, as it skips... */
-                               'choices' => [ '0' => true, '1' => true,
-                                       '2' => true, '3' => true, '4' => true,
-                                       '9' => true, '10' => true, '11' => true,
-                                       '12' => true, '13' => true,
-                                       '14' => true, '15' => true,
-                                       '17' => true, '18' => true,
-                                       '19' => true, '20' => true,
-                                       '21' => true, '22' => true,
-                                       '23' => true, '24' => true,
-                                       '255' => true,
-                               ],
-                       ],
-                       'MeteringMode' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 6,
-                               'choices' => [ '255' => true ],
-                       ],
-                       /* Pixel(X|Y)Dimension are rather useless, but for
-                        * completeness since we do it with exif.
-                        */
-                       'PixelXDimension' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                       ],
-                       'PixelYDimension' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                       ],
-                       'Saturation' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 2,
-                       ],
-                       'SceneCaptureType' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 3,
-                       ],
-                       'SceneType' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '1' => true ],
-                       ],
-                       // Note, 6 is not valid SensingMethod.
-                       'SensingMethod' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 1,
-                               'rangeHigh' => 5,
-                               'choices' => [ '7' => true, 8 => true ],
-                       ],
-                       'Sharpness' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 2,
-                       ],
-                       'SpectralSensitivity' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       // This tag should perhaps be displayed to user better.
-                       'SubjectArea' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateInteger',
-                       ],
-                       'SubjectDistanceRange' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'rangeLow' => 0,
-                               'rangeHigh' => 3,
-                       ],
-                       'SubjectLocation' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateInteger',
-                       ],
-                       'UserComment' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_LANG,
-                       ],
-                       'WhiteBalance' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '0' => true, '1' => true ]
-                       ],
-               ],
-               'http://ns.adobe.com/tiff/1.0/' => [
-                       'Artist' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'BitsPerSample' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateInteger',
-                       ],
-                       'Compression' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '1' => true, '6' => true ],
-                       ],
-                       /* this prop should not be used in XMP. dc:rights is the correct prop */
-                       'Copyright' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_LANG,
-                       ],
-                       'DateTime' => [ /* proper prop is xmp:ModifyDate */
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateDate',
-                       ],
-                       'ImageDescription' => [ /* proper one is dc:description */
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_LANG,
-                       ],
-                       'ImageLength' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                       ],
-                       'ImageWidth' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                       ],
-                       'Make' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'Model' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       /**** Do not extract this property
-                        * It interferes with auto exif rotation.
-                        * 'Orientation'       => array(
-                        *    'map_group' => 'exif',
-                        *    'mode'      => XMPReader::MODE_SIMPLE,
-                        *    'validate'  => 'validateClosed',
-                        *    'choices'   => array( '1' => true, '2' => true, '3' => true, '4' => true, 5 => true,
-                        *            '6' => true, '7' => true, '8' => true ),
-                        *),
-                        ******/
-                       'PhotometricInterpretation' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '2' => true, '6' => true ],
-                       ],
-                       'PlanerConfiguration' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '1' => true, '2' => true ],
-                       ],
-                       'PrimaryChromaticities' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateRational',
-                       ],
-                       'ReferenceBlackWhite' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateRational',
-                       ],
-                       'ResolutionUnit' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '2' => true, '3' => true ],
-                       ],
-                       'SamplesPerPixel' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                       ],
-                       'Software' => [ /* see xmp:CreatorTool */
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       /* ignore TransferFunction */
-                       'WhitePoint' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateRational',
-                       ],
-                       'XResolution' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational',
-                       ],
-                       'YResolution' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRational',
-                       ],
-                       'YCbCrCoefficients' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateRational',
-                       ],
-                       'YCbCrPositioning' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateClosed',
-                               'choices' => [ '1' => true, '2' => true ],
-                       ],
-                       /********
-                        * Disable extracting this property (T33944)
-                        * Several files have a string instead of a Seq
-                        * for this property. XMPReader doesn't handle
-                        * mismatched types very gracefully (it marks
-                        * the entire file as invalid, instead of just
-                        * the relavent prop). Since this prop
-                        * doesn't communicate all that useful information
-                        * just disable this prop for now, until such
-                        * XMPReader is more graceful (T34172)
-                        * 'YCbCrSubSampling'  => array(
-                        *    'map_group' => 'exif',
-                        *    'mode'      => XMPReader::MODE_SEQ,
-                        *    'validate'  => 'validateClosed',
-                        *    'choices'   => array( '1' => true, '2' => true ),
-                        * ),
-                        */
-               ],
-               'http://ns.adobe.com/exif/1.0/aux/' => [
-                       'Lens' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'SerialNumber' => [
-                               'map_group' => 'exif',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'OwnerName' => [
-                               'map_group' => 'exif',
-                               'map_name' => 'CameraOwnerName',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-               ],
-               'http://purl.org/dc/elements/1.1/' => [
-                       'title' => [
-                               'map_group' => 'general',
-                               'map_name' => 'ObjectName',
-                               'mode' => XMPReader::MODE_LANG
-                       ],
-                       'description' => [
-                               'map_group' => 'general',
-                               'map_name' => 'ImageDescription',
-                               'mode' => XMPReader::MODE_LANG
-                       ],
-                       'contributor' => [
-                               'map_group' => 'general',
-                               'map_name' => 'dc-contributor',
-                               'mode' => XMPReader::MODE_BAG
-                       ],
-                       'coverage' => [
-                               'map_group' => 'general',
-                               'map_name' => 'dc-coverage',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'creator' => [
-                               'map_group' => 'general',
-                               'map_name' => 'Artist', // map with exif Artist, iptc byline (2:80)
-                               'mode' => XMPReader::MODE_SEQ,
-                       ],
-                       'date' => [
-                               'map_group' => 'general',
-                               // Note, not mapped with other date properties, as this type of date is
-                               // non-specific: "A point or period of time associated with an event in
-                               //  the lifecycle of the resource"
-                               'map_name' => 'dc-date',
-                               'mode' => XMPReader::MODE_SEQ,
-                               'validate' => 'validateDate',
-                       ],
-                       /* Do not extract dc:format, as we've got better ways to determine MIME type */
-                       'identifier' => [
-                               'map_group' => 'deprecated',
-                               'map_name' => 'Identifier',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'language' => [
-                               'map_group' => 'general',
-                               'map_name' => 'LanguageCode', /* mapped with iptc 2:135 */
-                               'mode' => XMPReader::MODE_BAG,
-                               'validate' => 'validateLangCode',
-                       ],
-                       'publisher' => [
-                               'map_group' => 'general',
-                               'map_name' => 'dc-publisher',
-                               'mode' => XMPReader::MODE_BAG,
-                       ],
-                       // for related images/resources
-                       'relation' => [
-                               'map_group' => 'general',
-                               'map_name' => 'dc-relation',
-                               'mode' => XMPReader::MODE_BAG,
-                       ],
-                       'rights' => [
-                               'map_group' => 'general',
-                               'map_name' => 'Copyright',
-                               'mode' => XMPReader::MODE_LANG,
-                       ],
-                       // Note: source is not mapped with iptc source, since iptc
-                       // source describes the source of the image in terms of a person
-                       // who provided the image, where this is to describe an image that the
-                       // current one is based on.
-                       'source' => [
-                               'map_group' => 'general',
-                               'map_name' => 'dc-source',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'subject' => [
-                               'map_group' => 'general',
-                               'map_name' => 'Keywords', /* maps to iptc 2:25 */
-                               'mode' => XMPReader::MODE_BAG,
-                       ],
-                       'type' => [
-                               'map_group' => 'general',
-                               'map_name' => 'dc-type',
-                               'mode' => XMPReader::MODE_BAG,
-                       ],
-               ],
-               'http://ns.adobe.com/xap/1.0/' => [
-                       'CreateDate' => [
-                               'map_group' => 'general',
-                               'map_name' => 'DateTimeDigitized',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateDate',
-                       ],
-                       'CreatorTool' => [
-                               'map_group' => 'general',
-                               'map_name' => 'Software',
-                               'mode' => XMPReader::MODE_SIMPLE
-                       ],
-                       'Identifier' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_BAG,
-                       ],
-                       'Label' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'ModifyDate' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'DateTime',
-                               'validate' => 'validateDate',
-                       ],
-                       'MetadataDate' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               // map_name to be consistent with other date names.
-                               'map_name' => 'DateTimeMetadata',
-                               'validate' => 'validateDate',
-                       ],
-                       'Nickname' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'Rating' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateRating',
-                       ],
-               ],
-               'http://ns.adobe.com/xap/1.0/rights/' => [
-                       'Certificate' => [
-                               'map_group' => 'general',
-                               'map_name' => 'RightsCertificate',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'Marked' => [
-                               'map_group' => 'general',
-                               'map_name' => 'Copyrighted',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateBoolean',
-                       ],
-                       'Owner' => [
-                               'map_group' => 'general',
-                               'map_name' => 'CopyrightOwner',
-                               'mode' => XMPReader::MODE_BAG,
-                       ],
-                       // this seems similar to dc:rights.
-                       'UsageTerms' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_LANG,
-                       ],
-                       'WebStatement' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-               ],
-               // XMP media management.
-               'http://ns.adobe.com/xap/1.0/mm/' => [
-                       // if we extract the exif UniqueImageID, might
-                       // as well do this too.
-                       'OriginalDocumentID' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       // It might also be useful to do xmpMM:LastURL
-                       // and xmpMM:DerivedFrom as you can potentially,
-                       // get the url of this document/source for this
-                       // document. However whats more likely is you'd
-                       // get a file:// url for the path of the doc,
-                       // which is somewhat of a privacy issue.
-               ],
-               'http://creativecommons.org/ns#' => [
-                       'license' => [
-                               'map_name' => 'LicenseUrl',
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'morePermissions' => [
-                               'map_name' => 'MorePermissionsUrl',
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'attributionURL' => [
-                               'map_group' => 'general',
-                               'map_name' => 'AttributionUrl',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'attributionName' => [
-                               'map_group' => 'general',
-                               'map_name' => 'PreferredAttributionName',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-               ],
-               // Note, this property affects how jpeg metadata is extracted.
-               'http://ns.adobe.com/xmp/note/' => [
-                       'HasExtendedXMP' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-               ],
-               /* Note, in iptc schemas, the legacy properties are denoted
-                * as deprecated, since other properties should used instead,
-                * and properties marked as deprecated in the standard are
-                * are marked as general here as they don't have replacements
-                */
-               'http://ns.adobe.com/photoshop/1.0/' => [
-                       'City' => [
-                               'map_group' => 'deprecated',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'CityDest',
-                       ],
-                       'Country' => [
-                               'map_group' => 'deprecated',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'CountryDest',
-                       ],
-                       'State' => [
-                               'map_group' => 'deprecated',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'ProvinceOrStateDest',
-                       ],
-                       'DateCreated' => [
-                               'map_group' => 'deprecated',
-                               // marking as deprecated as the xmp prop preferred
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'DateTimeOriginal',
-                               'validate' => 'validateDate',
-                               // note this prop is an XMP, not IPTC date
-                       ],
-                       'CaptionWriter' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'Writer',
-                       ],
-                       'Instructions' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'SpecialInstructions',
-                       ],
-                       'TransmissionReference' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'OriginalTransmissionRef',
-                       ],
-                       'AuthorsPosition' => [
-                               /* This corresponds with 2:85
-                                * By-line Title, which needs to be
-                                * handled weirdly to correspond
-                                * with iptc/exif. */
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE
-                       ],
-                       'Credit' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'Source' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'Urgency' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'Category' => [
-                               // Note, this prop is deprecated, but in general
-                               // group since it doesn't have a replacement.
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'iimCategory',
-                       ],
-                       'SupplementalCategories' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_BAG,
-                               'map_name' => 'iimSupplementalCategory',
-                       ],
-                       'Headline' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE
-                       ],
-               ],
-               'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/' => [
-                       'CountryCode' => [
-                               'map_group' => 'deprecated',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'CountryCodeDest',
-                       ],
-                       'IntellectualGenre' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       // Note, this is a six digit code.
-                       // See: http://cv.iptc.org/newscodes/scene/
-                       // Since these aren't really all that common,
-                       // we just show the number.
-                       'Scene' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_BAG,
-                               'validate' => 'validateInteger',
-                               'map_name' => 'SceneCode',
-                       ],
-                       /* Note: SubjectCode should be an 8 ascii digits.
-                        * it is not really an integer (has leading 0's,
-                        * cannot have a +/- sign), but validateInteger
-                        * will let it through.
-                        */
-                       'SubjectCode' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_BAG,
-                               'map_name' => 'SubjectNewsCode',
-                               'validate' => 'validateInteger'
-                       ],
-                       'Location' => [
-                               'map_group' => 'deprecated',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'map_name' => 'SublocationDest',
-                       ],
-                       'CreatorContactInfo' => [
-                               /* Note this maps to 2:118 in iim
-                                * (Contact) field. However those field
-                                * types are slightly different - 2:118
-                                * is free form text field, where this
-                                * is more structured.
-                                */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_STRUCT,
-                               'map_name' => 'Contact',
-                               'children' => [
-                                       'CiAdrExtadr' => true,
-                                       'CiAdrCity' => true,
-                                       'CiAdrCtry' => true,
-                                       'CiEmailWork' => true,
-                                       'CiTelWork' => true,
-                                       'CiAdrPcode' => true,
-                                       'CiAdrRegion' => true,
-                                       'CiUrlWork' => true,
-                               ],
-                       ],
-                       'CiAdrExtadr' => [ /* address */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CiAdrCity' => [ /* city */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CiAdrCtry' => [ /* country */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CiEmailWork' => [ /* email (possibly separated by ',') */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CiTelWork' => [ /* telephone */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CiAdrPcode' => [ /* postal code */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CiAdrRegion' => [ /* province/state */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CiUrlWork' => [ /* url. Multiple may be separated by comma. */
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       /* End contact info struct properties */
-               ],
-               'http://iptc.org/std/Iptc4xmpExt/2008-02-29/' => [
-                       'Event' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                       ],
-                       'OrganisationInImageName' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_BAG,
-                               'map_name' => 'OrganisationInImage'
-                       ],
-                       'PersonInImage' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_BAG,
-                       ],
-                       'MaxAvailHeight' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                               'map_name' => 'OriginalImageHeight',
-                       ],
-                       'MaxAvailWidth' => [
-                               'map_group' => 'general',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'validate' => 'validateInteger',
-                               'map_name' => 'OriginalImageWidth',
-                       ],
-                       // LocationShown and LocationCreated are handled
-                       // specially because they are hierarchical, but we
-                       // also want to merge with the old non-hierarchical.
-                       'LocationShown' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_BAGSTRUCT,
-                               'children' => [
-                                       'WorldRegion' => true,
-                                       'CountryCode' => true, /* iso code */
-                                       'CountryName' => true,
-                                       'ProvinceState' => true,
-                                       'City' => true,
-                                       'Sublocation' => true,
-                               ],
-                       ],
-                       'LocationCreated' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_BAGSTRUCT,
-                               'children' => [
-                                       'WorldRegion' => true,
-                                       'CountryCode' => true, /* iso code */
-                                       'CountryName' => true,
-                                       'ProvinceState' => true,
-                                       'City' => true,
-                                       'Sublocation' => true,
-                               ],
-                       ],
-                       'WorldRegion' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CountryCode' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'CountryName' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                               'map_name' => 'Country',
-                       ],
-                       'ProvinceState' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                               'map_name' => 'ProvinceOrState',
-                       ],
-                       'City' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-                       'Sublocation' => [
-                               'map_group' => 'special',
-                               'mode' => XMPReader::MODE_SIMPLE,
-                               'structPart' => true,
-                       ],
-
-                       /* Other props that might be interesting but
-                        * Not currently extracted:
-                        * ArtworkOrObject, (info about objects in picture)
-                        * DigitalSourceType
-                        * RegistryId
-                        */
-               ],
-
-               /* Plus props we might want to consider:
-                * (Note: some of these have unclear/incomplete definitions
-                * from the iptc4xmp standard).
-                * ImageSupplier (kind of like iptc source field)
-                * ImageSupplierId (id code for image from supplier)
-                * CopyrightOwner
-                * ImageCreator
-                * Licensor
-                * Various model release fields
-                * Property release fields.
-                */
-       ];
-}
diff --git a/includes/libs/xmp/XMPValidate.php b/includes/libs/xmp/XMPValidate.php
deleted file mode 100644 (file)
index 9fe3e33..0000000
+++ /dev/null
@@ -1,399 +0,0 @@
-<?php
-/**
- * Methods for validating XMP properties.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Media
- */
-
-use Psr\Log\LoggerInterface;
-use Psr\Log\LoggerAwareInterface;
-use Wikimedia\Timestamp\ConvertibleTimestamp;
-
-/**
- * This contains some static methods for
- * validating XMP properties. See XMPInfo and XMPReader classes.
- *
- * Each of these functions take the same parameters
- * * an info array which is a subset of the XMPInfo::items array
- * * A value (passed as reference) to validate. This can be either a
- *    simple value or an array
- * * A boolean to determine if this is validating a simple or complex values
- *
- * It should be noted that when an array is being validated, typically the validation
- * function is called once for each value, and then once at the end for the entire array.
- *
- * These validation functions can also be used to modify the data. See the gps and flash one's
- * for example.
- *
- * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart1.pdf starting at pg 28
- * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf starting at pg 11
- */
-class XMPValidate implements LoggerAwareInterface {
-
-       /**
-        * @var LoggerInterface
-        */
-       private $logger;
-
-       public function __construct( LoggerInterface $logger ) {
-               $this->setLogger( $logger );
-       }
-
-       public function setLogger( LoggerInterface $logger ) {
-               $this->logger = $logger;
-       }
-       /**
-        * Function to validate boolean properties ( True or False )
-        *
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateBoolean( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       // this only validates standalone properties, not arrays, etc
-                       return;
-               }
-               if ( $val !== 'True' && $val !== 'False' ) {
-                       $this->logger->info( __METHOD__ . " Expected True or False but got $val" );
-                       $val = null;
-               }
-       }
-
-       /**
-        * function to validate rational properties ( 12/10 )
-        *
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateRational( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       // this only validates standalone properties, not arrays, etc
-                       return;
-               }
-               if ( !preg_match( '/^(?:-?\d+)\/(?:\d+[1-9]|[1-9]\d*)$/D', $val ) ) {
-                       $this->logger->info( __METHOD__ . " Expected rational but got $val" );
-                       $val = null;
-               }
-       }
-
-       /**
-        * function to validate rating properties -1, 0-5
-        *
-        * if its outside of range put it into range.
-        *
-        * @see MWG spec
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateRating( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       // this only validates standalone properties, not arrays, etc
-                       return;
-               }
-               if ( !preg_match( '/^[-+]?\d*(?:\.?\d*)$/D', $val )
-                       || !is_numeric( $val )
-               ) {
-                       $this->logger->info( __METHOD__ . " Expected rating but got $val" );
-                       $val = null;
-
-                       return;
-               } else {
-                       $nVal = (float)$val;
-                       if ( $nVal < 0 ) {
-                               // We do < 0 here instead of < -1 here, since
-                               // the values between 0 and -1 are also illegal
-                               // as -1 is meant as a special reject rating.
-                               $this->logger->info( __METHOD__ . " Rating too low, setting to -1 (Rejected)" );
-                               $val = '-1';
-
-                               return;
-                       }
-                       if ( $nVal > 5 ) {
-                               $this->logger->info( __METHOD__ . " Rating too high, setting to 5" );
-                               $val = '5';
-
-                               return;
-                       }
-               }
-       }
-
-       /**
-        * function to validate integers
-        *
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateInteger( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       // this only validates standalone properties, not arrays, etc
-                       return;
-               }
-               if ( !preg_match( '/^[-+]?\d+$/D', $val ) ) {
-                       $this->logger->info( __METHOD__ . " Expected integer but got $val" );
-                       $val = null;
-               }
-       }
-
-       /**
-        * function to validate properties with a fixed number of allowed
-        * choices. (closed choice)
-        *
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateClosed( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       // this only validates standalone properties, not arrays, etc
-                       return;
-               }
-
-               // check if its in a numeric range
-               $inRange = false;
-               if ( isset( $info['rangeLow'] )
-                       && isset( $info['rangeHigh'] )
-                       && is_numeric( $val )
-                       && ( intval( $val ) <= $info['rangeHigh'] )
-                       && ( intval( $val ) >= $info['rangeLow'] )
-               ) {
-                       $inRange = true;
-               }
-
-               if ( !isset( $info['choices'][$val] ) && !$inRange ) {
-                       $this->logger->info( __METHOD__ . " Expected closed choice, but got $val" );
-                       $val = null;
-               }
-       }
-
-       /**
-        * function to validate and modify flash structure
-        *
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateFlash( $info, &$val, $standalone ) {
-               if ( $standalone ) {
-                       // this only validates flash structs, not individual properties
-                       return;
-               }
-               if ( !( isset( $val['Fired'] )
-                       && isset( $val['Function'] )
-                       && isset( $val['Mode'] )
-                       && isset( $val['RedEyeMode'] )
-                       && isset( $val['Return'] )
-               ) ) {
-                       $this->logger->info( __METHOD__ . " Flash structure did not have all the required components" );
-                       $val = null;
-               } else {
-                       $val = ( 0 | ( $val['Fired'] === 'True' )
-                               | ( intval( $val['Return'] ) << 1 )
-                               | ( intval( $val['Mode'] ) << 3 )
-                               | ( ( $val['Function'] === 'True' ) << 5 )
-                               | ( ( $val['RedEyeMode'] === 'True' ) << 6 ) );
-               }
-       }
-
-       /**
-        * function to validate LangCode properties ( en-GB, etc )
-        *
-        * This is just a naive check to make sure it somewhat looks like a lang code.
-        *
-        * @see BCP 47
-        * @see https://wwwimages2.adobe.com/content/dam/Adobe/en/devnet/xmp/pdfs/
-        *      XMP%20SDK%20Release%20cc-2014-12/XMPSpecificationPart1.pdf page 22 (section 8.2.2.4)
-        *
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateLangCode( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       // this only validates standalone properties, not arrays, etc
-                       return;
-               }
-               if ( !preg_match( '/^[-A-Za-z0-9]{2,}$/D', $val ) ) {
-                       // this is a rather naive check.
-                       $this->logger->info( __METHOD__ . " Expected Lang code but got $val" );
-                       $val = null;
-               }
-       }
-
-       /**
-        * function to validate date properties, and convert to (partial) Exif format.
-        *
-        * Dates can be one of the following formats:
-        * YYYY
-        * YYYY-MM
-        * YYYY-MM-DD
-        * YYYY-MM-DDThh:mmTZD
-        * YYYY-MM-DDThh:mm:ssTZD
-        * YYYY-MM-DDThh:mm:ss.sTZD
-        *
-        * @param array $info Information about current property
-        * @param mixed &$val Current value to validate. Converts to TS_EXIF as a side-effect.
-        *    in cases where there's only a partial date, it will give things like
-        *    2011:04.
-        * @param bool $standalone If this is a simple property or array
-        */
-       public function validateDate( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       // this only validates standalone properties, not arrays, etc
-                       return;
-               }
-               $res = [];
-               if ( !preg_match(
-                       /* ahh! scary regex... */
-                       // phpcs:ignore Generic.Files.LineLength
-                       '/^([0-3]\d{3})(?:-([01]\d)(?:-([0-3]\d)(?:T([0-2]\d):([0-6]\d)(?::([0-6]\d)(?:\.\d+)?)?([-+]\d{2}:\d{2}|Z)?)?)?)?$/D',
-                       $val, $res )
-               ) {
-                       $this->logger->info( __METHOD__ . " Expected date but got $val" );
-                       $val = null;
-               } else {
-                       /*
-                        * $res is formatted as follows:
-                        * 0 -> full date.
-                        * 1 -> year, 2-> month, 3-> day, 4-> hour, 5-> minute, 6->second
-                        * 7-> Timezone specifier (Z or something like +12:30 )
-                        * many parts are optional, some aren't. For example if you specify
-                        * minute, you must specify hour, day, month, and year but not second or TZ.
-                        */
-
-                       /*
-                        * First of all, if year = 0000, Something is wrongish,
-                        * so don't extract. This seems to happen when
-                        * some programs convert between metadata formats.
-                        */
-                       if ( $res[1] === '0000' ) {
-                               $this->logger->info( __METHOD__ . " Invalid date (year 0): $val" );
-                               $val = null;
-
-                               return;
-                       }
-
-                       if ( !isset( $res[4] ) ) { // hour
-                               // just have the year month day (if that)
-                               $val = $res[1];
-                               if ( isset( $res[2] ) ) {
-                                       $val .= ':' . $res[2];
-                               }
-                               if ( isset( $res[3] ) ) {
-                                       $val .= ':' . $res[3];
-                               }
-
-                               return;
-                       }
-
-                       if ( !isset( $res[7] ) || $res[7] === 'Z' ) {
-                               // if hour is set, then minute must also be or regex above will fail.
-                               $val = $res[1] . ':' . $res[2] . ':' . $res[3]
-                                       . ' ' . $res[4] . ':' . $res[5];
-                               if ( isset( $res[6] ) && $res[6] !== '' ) {
-                                       $val .= ':' . $res[6];
-                               }
-
-                               return;
-                       }
-
-                       // Extra check for empty string necessary due to TZ but no second case.
-                       $stripSeconds = false;
-                       if ( !isset( $res[6] ) || $res[6] === '' ) {
-                               $res[6] = '00';
-                               $stripSeconds = true;
-                       }
-
-                       // Do timezone processing. We've already done the case that tz = Z.
-
-                       // We know that if we got to this step, year, month day hour and min must be set
-                       // by virtue of regex not failing.
-
-                       $unix = ConvertibleTimestamp::convert( TS_UNIX,
-                               $res[1] . $res[2] . $res[3] . $res[4] . $res[5] . $res[6]
-                       );
-                       $offset = intval( substr( $res[7], 1, 2 ) ) * 60 * 60;
-                       $offset += intval( substr( $res[7], 4, 2 ) ) * 60;
-                       if ( substr( $res[7], 0, 1 ) === '-' ) {
-                               $offset = -$offset;
-                       }
-                       $val = ConvertibleTimestamp::convert( TS_EXIF, $unix + $offset );
-
-                       if ( $stripSeconds ) {
-                               // If seconds weren't specified, remove the trailing ':00'.
-                               $val = substr( $val, 0, -3 );
-                       }
-               }
-       }
-
-       /** function to validate, and more importantly
-        * translate the XMP DMS form of gps coords to
-        * the decimal form we use.
-        *
-        * @see http://www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf
-        *        section 1.2.7.4 on page 23
-        *
-        * @param array $info Unused (info about prop)
-        * @param string &$val GPS string in either DDD,MM,SSk or
-        *   or DDD,MM.mmk form
-        * @param bool $standalone If its a simple prop (should always be true)
-        */
-       public function validateGPS( $info, &$val, $standalone ) {
-               if ( !$standalone ) {
-                       return;
-               }
-
-               $m = [];
-               if ( preg_match(
-                       '/(\d{1,3}),(\d{1,2}),(\d{1,2})([NWSE])/D',
-                       $val, $m )
-               ) {
-                       $coord = intval( $m[1] );
-                       $coord += intval( $m[2] ) * ( 1 / 60 );
-                       $coord += intval( $m[3] ) * ( 1 / 3600 );
-                       if ( $m[4] === 'S' || $m[4] === 'W' ) {
-                               $coord = -$coord;
-                       }
-                       $val = $coord;
-
-                       return;
-               } elseif ( preg_match(
-                       '/(\d{1,3}),(\d{1,2}(?:.\d*)?)([NWSE])/D',
-                       $val, $m )
-               ) {
-                       $coord = intval( $m[1] );
-                       $coord += floatval( $m[2] ) * ( 1 / 60 );
-                       if ( $m[3] === 'S' || $m[3] === 'W' ) {
-                               $coord = -$coord;
-                       }
-                       $val = $coord;
-
-                       return;
-               } else {
-                       $this->logger->info( __METHOD__
-                               . " Expected GPSCoordinate, but got $val." );
-                       $val = null;
-
-                       return;
-               }
-       }
-}
index 0cf3e6d..54f2d58 100644 (file)
@@ -377,7 +377,7 @@ class LogFormatter {
                                                // new key (5::duration/6::flags) or old key (0/optional 1)
                                                if ( $entry->isLegacy() ) {
                                                        $rawDuration = $parameters[0];
-                                                       $rawFlags = isset( $parameters[1] ) ? $parameters[1] : '';
+                                                       $rawFlags = $parameters[1] ?? '';
                                                } else {
                                                        $rawDuration = $parameters['5::duration'];
                                                        $rawFlags = $parameters['6::flags'];
index 8cdd2af..6e527e8 100644 (file)
@@ -95,7 +95,7 @@ class RightsLogFormatter extends LogFormatter {
 
                if ( count( $oldGroups ) ) {
                        $params[3] = [ 'raw' => $this->formatRightsList( $oldGroups,
-                               isset( $allParams['oldmetadata'] ) ? $allParams['oldmetadata'] : [] ) ];
+                               $allParams['oldmetadata'] ?? [] ) ];
                } else {
                        $params[3] = $this->msg( 'rightsnone' )->text();
                }
@@ -103,7 +103,7 @@ class RightsLogFormatter extends LogFormatter {
                        // Array_values is used here because of T44211
                        // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
                        $params[4] = [ 'raw' => $this->formatRightsList( array_values( $newGroups ),
-                               isset( $allParams['newmetadata'] ) ? $allParams['newmetadata'] : [] ) ];
+                               $allParams['newmetadata'] ?? [] ) ];
                } else {
                        $params[4] = $this->msg( 'rightsnone' )->text();
                }
@@ -181,8 +181,7 @@ class RightsLogFormatter extends LogFormatter {
                                if ( isset( $oldmetadata[$index] ) ) {
                                        $result += $oldmetadata[$index];
                                }
-                               $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
-                                       $result['expiry'] : null );
+                               $result['expiry'] = ApiResult::formatExpiry( $result['expiry'] ?? null );
 
                                return $result;
                        }, array_keys( $params['4:array:oldgroups'] ) );
@@ -199,8 +198,7 @@ class RightsLogFormatter extends LogFormatter {
                                if ( isset( $newmetadata[$index] ) ) {
                                        $result += $newmetadata[$index];
                                }
-                               $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
-                                       $result['expiry'] : null );
+                               $result['expiry'] = ApiResult::formatExpiry( $result['expiry'] ?? null );
 
                                return $result;
                        }, array_keys( $params['5:array:newgroups'] ) );
index bdd4f44..5d7afd3 100644 (file)
@@ -244,10 +244,9 @@ class UserMailer {
                global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams;
                $mime = null;
 
-               $replyto = isset( $options['replyTo'] ) ? $options['replyTo'] : null;
-               $contentType = isset( $options['contentType'] ) ?
-                       $options['contentType'] : 'text/plain; charset=UTF-8';
-               $headers = isset( $options['headers'] ) ? $options['headers'] : [];
+               $replyto = $options['replyTo'] ?? null;
+               $contentType = $options['contentType'] ?? 'text/plain; charset=UTF-8';
+               $headers = $options['headers'] ?? [];
 
                // Allow transformation of content, such as encrypting/signing
                $error = false;
index 9e0fc3d..c0dfa3a 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\XMPReader\Reader as XMPReader;
 
 /**
  * Class to deal with reconciling and extracting metadata from bitmap images.
@@ -184,7 +185,7 @@ class BitmapMetadataHandler {
                        }
                }
 
-               $meta->getExif( $filename, isset( $seg['byteOrder'] ) ? $seg['byteOrder'] : 'BE' );
+               $meta->getExif( $filename, $seg['byteOrder'] ?? 'BE' );
 
                return $meta->getMetadataArray();
        }
index 2541e35..14074ef 100644 (file)
@@ -105,7 +105,7 @@ class DjVuHandler extends ImageHandler {
         * @return bool|string
         */
        public function makeParamString( $params ) {
-               $page = isset( $params['page'] ) ? $params['page'] : 1;
+               $page = $params['page'] ?? 1;
                if ( !isset( $params['width'] ) ) {
                        return false;
                }
index 3c778f3..8a26f60 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Media
  */
 
+use Wikimedia\XMPReader\Reader as XMPReader;
+
 /**
  * Class for reading jpegs and extracting metadata.
  * see also BitmapMetadataHandler.
index 3506684..4aeaac4 100644 (file)
@@ -360,9 +360,9 @@ class ThumbnailImage extends MediaTransformOutput {
                        throw new MWException( __METHOD__ . ' called in the old style' );
                }
 
-               $alt = isset( $options['alt'] ) ? $options['alt'] : '';
+               $alt = $options['alt'] ?? '';
 
-               $query = isset( $options['desc-query'] ) ? $options['desc-query'] : '';
+               $query = $options['desc-query'] ?? '';
 
                $attribs = [
                        'alt' => $alt,
@@ -487,8 +487,8 @@ class MediaTransformError extends MediaTransformOutput {
 class TransformParameterError extends MediaTransformError {
        function __construct( $params ) {
                parent::__construct( 'thumbnail_error',
-                       max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
-                       max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
+                       max( $params['width'] ?? 0, 120 ),
+                       max( $params['height'] ?? 0, 120 ),
                        wfMessage( 'thumbnail_invalid_params' )
                );
        }
@@ -512,8 +512,8 @@ class TransformTooBigImageAreaError extends MediaTransformError {
                );
 
                parent::__construct( 'thumbnail_error',
-                       max( isset( $params['width'] ) ? $params['width'] : 0, 120 ),
-                       max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
+                       max( $params['width'] ?? 0, 120 ),
+                       max( $params['height'] ?? 0, 120 ),
                        $msg
                );
        }
index 9085421..a589dbf 100644 (file)
@@ -201,7 +201,7 @@ class SvgHandler extends ImageHandler {
                $clientHeight = $params['height'];
                $physicalWidth = $params['physicalWidth'];
                $physicalHeight = $params['physicalHeight'];
-               $lang = isset( $params['lang'] ) ? $params['lang'] : $this->getDefaultRenderLanguage( $image );
+               $lang = $params['lang'] ?? $this->getDefaultRenderLanguage( $image );
 
                if ( $flags & self::TRANSFORM_LATER ) {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
index 85430d2..ea0d61b 100644 (file)
@@ -127,7 +127,7 @@ abstract class TransformationalImageHandler extends ImageHandler {
                        'mimeType' => $image->getMimeType(),
                        'dstPath' => $dstPath,
                        'dstUrl' => $dstUrl,
-                       'interlace' => isset( $params['interlace'] ) ? $params['interlace'] : false,
+                       'interlace' => $params['interlace'] ?? false,
                ];
 
                if ( isset( $params['quality'] ) && $params['quality'] === 'low' ) {
index c384032..6d76d5e 100644 (file)
@@ -182,13 +182,9 @@ class ObjectCache {
                } elseif ( isset( $params['class'] ) ) {
                        $class = $params['class'];
                        // Automatically set the 'async' update handler
-                       $params['asyncHandler'] = isset( $params['asyncHandler'] )
-                               ? $params['asyncHandler']
-                               : 'DeferredUpdates::addCallableUpdate';
+                       $params['asyncHandler'] = $params['asyncHandler'] ?? 'DeferredUpdates::addCallableUpdate';
                        // Enable reportDupes by default
-                       $params['reportDupes'] = isset( $params['reportDupes'] )
-                               ? $params['reportDupes']
-                               : true;
+                       $params['reportDupes'] = $params['reportDupes'] ?? true;
                        // Do b/c logic for SqlBagOStuff
                        if ( is_a( $class, SqlBagOStuff::class, true ) ) {
                                if ( isset( $params['server'] ) && !isset( $params['servers'] ) ) {
@@ -289,7 +285,7 @@ class ObjectCache {
                $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
                if ( $cache instanceof EmptyBagOStuff ) {
                        if ( is_array( $fallback ) ) {
-                               $fallback = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE;
+                               $fallback = $fallback['fallback'] ?? CACHE_NONE;
                        }
                        $cache = self::getInstance( $fallback );
                }
index 8ff14ed..076f208 100644 (file)
@@ -117,7 +117,7 @@ class SqlBagOStuff extends BagOStuff {
                                if ( is_string( $tag ) ) {
                                        $this->serverTags[$index] = $tag;
                                } else {
-                                       $this->serverTags[$index] = isset( $info['host'] ) ? $info['host'] : "#$index";
+                                       $this->serverTags[$index] = $info['host'] ?? "#$index";
                                }
                                ++$index;
                        }
@@ -168,8 +168,8 @@ class SqlBagOStuff extends BagOStuff {
                        if ( $this->serverInfos ) {
                                // Use custom database defined by server connection info
                                $info = $this->serverInfos[$serverIndex];
-                               $type = isset( $info['type'] ) ? $info['type'] : 'mysql';
-                               $host = isset( $info['host'] ) ? $info['host'] : '[unknown]';
+                               $type = $info['type'] ?? 'mysql';
+                               $host = $info['host'] ?? '[unknown]';
                                $this->logger->debug( __CLASS__ . ": connecting to $host" );
                                // Use a blank trx profiler to ignore expections as this is a cache
                                $info['trxProfiler'] = new TransactionProfiler();
index b5ff805..81677d4 100644 (file)
@@ -1015,11 +1015,8 @@ EOT
         * @return int Result of string comparison, or namespace comparison
         */
        protected function compare( $a, $b ) {
-               if ( $a->page_namespace == $b->page_namespace ) {
-                       return strcmp( $a->page_title, $b->page_title );
-               } else {
-                       return $a->page_namespace - $b->page_namespace;
-               }
+               return $a->page_namespace <=> $b->page_namespace
+                       ?: strcmp( $a->page_title, $b->page_title );
        }
 
        /**
@@ -1045,9 +1042,8 @@ EOT
                        $option = 0;
                }
 
-               return isset( $wgImageLimits[$option] )
-                       ? $wgImageLimits[$option]
-                       : [ 800, 600 ]; // if nothing is set, fallback to a hardcoded default
+               // if nothing is set, fallback to a hardcoded default
+               return $wgImageLimits[$option] ?? [ 800, 600 ];
        }
 
        /**
index cbce884..e186279 100644 (file)
@@ -1874,7 +1874,7 @@ class WikiPage implements Page, IDBAccessObject {
        private function doCreate(
                Content $content, $flags, User $user, $summary, array $meta
        ) {
-               global $wgUseRCPatrol, $wgUseNPPatrol;
+               global $wgUseRCPatrol, $wgUseNPPatrol, $wgPageCreationLog;
 
                $status = Status::newGood( [ 'new' => true, 'revision' => null ] );
 
@@ -1950,6 +1950,21 @@ class WikiPage implements Page, IDBAccessObject {
 
                $user->incEditCount();
 
+               if ( $wgPageCreationLog ) {
+                       // Log the page creation
+                       // @TODO: Do we want a 'recreate' action?
+                       $logEntry = new ManualLogEntry( 'create', 'create' );
+                       $logEntry->setPerformer( $user );
+                       $logEntry->setTarget( $this->mTitle );
+                       $logEntry->setComment( $summary );
+                       $logEntry->setTimestamp( $now );
+                       $logEntry->setAssociatedRevId( $revisionId );
+                       $logid = $logEntry->insert();
+                       // Note that we don't publish page creation events to recentchanges
+                       // (i.e. $logEntry->publish()) since this would create duplicate entries,
+                       // one for the edit and one for the page creation.
+               }
+
                $dbw->endAtomic( __METHOD__ );
                $this->mTimestamp = $now;
 
@@ -3311,9 +3326,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // raise error, when the edit is an edit without a new version
-               $statusRev = isset( $status->value['revision'] )
-                       ? $status->value['revision']
-                       : null;
+               $statusRev = $status->value['revision'] ?? null;
                if ( !( $statusRev instanceof Revision ) ) {
                        $resultDetails = [ 'current' => $current ];
                        return [ [ 'alreadyrolled',
index 6880d58..2323142 100644 (file)
@@ -381,9 +381,9 @@ abstract class IndexPager extends ContextSource implements Pager {
                $info = $this->getQueryInfo();
                $tables = $info['tables'];
                $fields = $info['fields'];
-               $conds = isset( $info['conds'] ) ? $info['conds'] : [];
-               $options = isset( $info['options'] ) ? $info['options'] : [];
-               $join_conds = isset( $info['join_conds'] ) ? $info['join_conds'] : [];
+               $conds = $info['conds'] ?? [];
+               $options = $info['options'] ?? [];
+               $join_conds = $info['join_conds'] ?? [];
                $sortColumns = array_merge( [ $this->mIndexField ], $this->mExtraSortFields );
                if ( $descending ) {
                        $options['ORDER BY'] = $sortColumns;
index 70055da..b6d5b94 100644 (file)
@@ -188,7 +188,7 @@ abstract class TablePager extends IndexPager {
                $fieldNames = $this->getFieldNames();
 
                foreach ( $fieldNames as $field => $name ) {
-                       $value = isset( $row->$field ) ? $row->$field : null;
+                       $value = $row->$field ?? null;
                        $formatted = strval( $this->formatValue( $field, $value ) );
 
                        if ( $formatted == '' ) {
index d408c7f..7f6dbe5 100644 (file)
@@ -1059,7 +1059,7 @@ class CoreParserFunctions {
                                $name = trim( $frame->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
                                $value = trim( $frame->expand( $bits['value'] ) );
                                if ( preg_match( '/^(?:["\'](.+)["\']|""|\'\')$/s', $value, $m ) ) {
-                                       $value = isset( $m[1] ) ? $m[1] : '';
+                                       $value = $m[1] ?? '';
                                }
                                $attributes[$name] = $value;
                        }
index 816f7f7..1d722c2 100644 (file)
@@ -372,7 +372,7 @@ class LinkHolderArray {
                        foreach ( $entries as $index => $entry ) {
                                $pdbk = $entry['pdbk'];
                                $title = $entry['title'];
-                               $query = isset( $entry['query'] ) ? $entry['query'] : [];
+                               $query = $entry['query'] ?? [];
                                $key = "$ns:$index";
                                $searchkey = "<!--LINK'\" $key-->";
                                $displayText = $entry['text'];
index dfd9602..8df5b5b 100644 (file)
@@ -593,7 +593,7 @@ class Parser {
                // Add on template profiling data in human/machine readable way
                $dataByFunc = $this->mProfiler->getFunctionStats();
                uasort( $dataByFunc, function ( $a, $b ) {
-                       return $a['real'] < $b['real']; // descending order
+                       return $b['real'] <=> $a['real']; // descending order
                } );
                $profileReport = [];
                foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
@@ -3566,7 +3566,7 @@ class Parser {
                if ( is_string( $stuff['text'] ) ) {
                        $text = strtr( $text, "\x7f", "?" );
                }
-               $finalTitle = isset( $stuff['finalTitle'] ) ? $stuff['finalTitle'] : $title;
+               $finalTitle = $stuff['finalTitle'] ?? $title;
                if ( isset( $stuff['deps'] ) ) {
                        foreach ( $stuff['deps'] as $dep ) {
                                $this->mOutput->addTemplate( $dep['title'], $dep['page_id'], $dep['rev_id'] );
@@ -4763,7 +4763,7 @@ class Parser {
                if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
                        throw new MWException( "Invalid character {$m[0]} in setHook('$tag', ...) call" );
                }
-               $oldVal = isset( $this->mTagHooks[$tag] ) ? $this->mTagHooks[$tag] : null;
+               $oldVal = $this->mTagHooks[$tag] ?? null;
                $this->mTagHooks[$tag] = $callback;
                if ( !in_array( $tag, $this->mStripList ) ) {
                        $this->mStripList[] = $tag;
@@ -4794,7 +4794,7 @@ class Parser {
                if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
                        throw new MWException( "Invalid character {$m[0]} in setTransparentHook('$tag', ...) call" );
                }
-               $oldVal = isset( $this->mTransparentTagHooks[$tag] ) ? $this->mTransparentTagHooks[$tag] : null;
+               $oldVal = $this->mTransparentTagHooks[$tag] ?? null;
                $this->mTransparentTagHooks[$tag] = $callback;
 
                return $oldVal;
@@ -4909,8 +4909,7 @@ class Parser {
                if ( preg_match( '/[<>\r\n]/', $tag, $m ) ) {
                        throw new MWException( "Invalid character {$m[0]} in setFunctionTagHook('$tag', ...) call" );
                }
-               $old = isset( $this->mFunctionTagHooks[$tag] ) ?
-                       $this->mFunctionTagHooks[$tag] : null;
+               $old = $this->mFunctionTagHooks[$tag] ?? null;
                $this->mFunctionTagHooks[$tag] = [ $callback, $flags ];
 
                if ( !in_array( $tag, $this->mStripList ) ) {
@@ -5377,7 +5376,7 @@ class Parser {
                Hooks::run( 'ParserMakeImageParams', [ $title, $file, &$params, $this ] );
 
                # Linker does the rest
-               $time = isset( $options['time'] ) ? $options['time'] : false;
+               $time = $options['time'] ?? false;
                $ret = Linker::makeImageLink( $this, $title, $file, $params['frame'], $params['handler'],
                        $time, $descQuery, $this->mOptions->getThumbSize() );
 
index fc36659..9ec6cf8 100644 (file)
@@ -959,7 +959,7 @@ class ParserOutput extends CacheTime {
         * @note You need to use getProperties() to check for boolean and null properties.
         */
        public function getProperty( $name ) {
-               return isset( $this->mProperties[$name] ) ? $this->mProperties[$name] : false;
+               return $this->mProperties[$name] ?? false;
        }
 
        public function unsetProperty( $name ) {
index 104cd13..d00c40f 100644 (file)
@@ -1547,7 +1547,7 @@ class PPFrame_DOM implements PPFrame {
                if ( $level === false ) {
                        return $this->title->getPrefixedDBkey();
                } else {
-                       return isset( $this->titleCache[$level] ) ? $this->titleCache[$level] : false;
+                       return $this->titleCache[$level] ?? false;
                }
        }
 
index 8e74380..0326499 100644 (file)
@@ -1368,7 +1368,7 @@ class PPFrame_Hash implements PPFrame {
                if ( $level === false ) {
                        return $this->title->getPrefixedDBkey();
                } else {
-                       return isset( $this->titleCache[$level] ) ? $this->titleCache[$level] : false;
+                       return $this->titleCache[$level] ?? false;
                }
        }
 
index 118442d..ff543db 100644 (file)
@@ -1706,9 +1706,7 @@ class Sanitizer {
         */
        static function attributeWhitelist( $element ) {
                $list = self::setupAttributeWhitelist();
-               return isset( $list[$element] )
-                       ? $list[$element]
-                       : [];
+               return $list[$element] ?? [];
        }
 
        /**
index 4a8831e..541fd0e 100644 (file)
@@ -42,8 +42,7 @@ class Pbkdf2Password extends ParameterizedPassword {
        }
 
        protected function shouldUseHashExtension() {
-               return isset( $this->config['use-hash-extension'] ) ?
-                       $this->config['use-hash-extension'] : function_exists( 'hash_pbkdf2' );
+               return $this->config['use-hash-extension'] ?? function_exists( 'hash_pbkdf2' );
        }
 
        public function crypt( $password ) {
index a570d78..16e4397 100644 (file)
@@ -150,9 +150,7 @@ abstract class PoolCounterWork {
                                        PoolCounter::QUEUE_FULL => 'pool-queuefull',
                                        PoolCounter::TIMEOUT => 'pool-timeout' ];
 
-                               $status = Status::newFatal( isset( $errors[$status->value] )
-                                       ? $errors[$status->value]
-                                       : 'pool-errorunknown' );
+                               $status = Status::newFatal( $errors[$status->value] ?? 'pool-errorunknown' );
                                $this->logError( $status );
                                return $this->error( $status );
                }
index 62973d9..eed4b0d 100644 (file)
@@ -185,9 +185,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                $info['disabled'] = 'disabled';
                        }
                        $field = HTMLForm::loadInputFromParameters( $name, $info, $dummyForm ); // For validation
-                       $globalDefault = isset( $defaultOptions[$name] )
-                               ? $defaultOptions[$name]
-                               : null;
+                       $globalDefault = $defaultOptions[$name] ?? null;
 
                        // If it validates, set it as the default
                        if ( isset( $info['default'] ) ) {
@@ -221,7 +219,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
                                ( isset( $info['class'] ) && $info['class'] == \HTMLMultiSelectField::class ) ) {
                        $options = HTMLFormField::flattenOptions( $info['options'] );
-                       $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+                       $prefix = $info['prefix'] ?? $name;
                        $val = [];
 
                        foreach ( $options as $value ) {
@@ -236,7 +234,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                ( isset( $info['class'] ) && $info['class'] == \HTMLCheckMatrix::class ) ) {
                        $columns = HTMLFormField::flattenOptions( $info['columns'] );
                        $rows = HTMLFormField::flattenOptions( $info['rows'] );
-                       $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+                       $prefix = $info['prefix'] ?? $name;
                        $val = [];
 
                        foreach ( $columns as $column ) {
@@ -1275,6 +1273,15 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                'help-message' => 'prefs-help-watchlist-token2',
                        ];
                }
+
+               if ( $this->config->get( 'StructuredChangeFiltersShowWatchlistPreference' ) ) {
+                       $defaultPreferences['wlenhancedfilters-disable'] = [
+                               'type' => 'toggle',
+                               'section' => 'watchlist/opt-out',
+                               'label-message' => 'rcfilters-watchlist-preference-label',
+                               'help-message' => 'rcfilters-watchlist-preference-help',
+                       ];
+               }
        }
 
        /**
@@ -1411,8 +1418,8 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $pixels = $l10n->msg( 'unit-pixel' )->text();
 
                foreach ( $this->config->get( 'ImageLimits' ) as $index => $limits ) {
-                       // Note: A left-to-right marker (\u200e) is inserted, see T144386
-                       $display = "{$limits[0]}" . json_decode( '"\u200e"' ) . "×{$limits[1]}" . $pixels;
+                       // Note: A left-to-right marker (U+200E) is inserted, see T144386
+                       $display = "{$limits[0]}\u{200E}×{$limits[1]}$pixels";
                        $ret[$display] = $index;
                }
 
index a7bc137..504859d 100644 (file)
@@ -73,10 +73,7 @@ class ProfilerSectionOnly extends Profiler {
        protected function getFunctionReport() {
                $data = $this->getFunctionStats();
                usort( $data, function ( $a, $b ) {
-                       if ( $a['real'] === $b['real'] ) {
-                               return 0;
-                       }
-                       return ( $a['real'] > $b['real'] ) ? -1 : 1; // descending
+                       return $b['real'] <=> $a['real']; // descending
                } );
 
                $width = 140;
index ffa441e..2f2be47 100644 (file)
@@ -73,7 +73,7 @@ class ProfilerXhprof extends Profiler {
        public function __construct( array $params = [] ) {
                parent::__construct( $params );
 
-               $flags = isset( $params['flags'] ) ? $params['flags'] : 0;
+               $flags = $params['flags'] ?? 0;
                $options = isset( $params['exclude'] )
                        ? [ 'ignored_functions' => $params['exclude'] ] : [];
                Xhprof::enable( $flags, $options );
@@ -201,10 +201,7 @@ class ProfilerXhprof extends Profiler {
        protected function getFunctionReport() {
                $data = $this->getFunctionStats();
                usort( $data, function ( $a, $b ) {
-                       if ( $a['real'] === $b['real'] ) {
-                               return 0;
-                       }
-                       return ( $a['real'] > $b['real'] ) ? -1 : 1; // descending
+                       return $b['real'] <=> $a['real']; // descending
                } );
 
                $width = 140;
index bb86551..6041ba0 100644 (file)
@@ -38,7 +38,7 @@ class ProfilerOutputStats extends ProfilerOutput {
         * @param array $stats
         */
        public function log( array $stats ) {
-               $prefix = isset( $this->params['prefix'] ) ? $this->params['prefix'] : '';
+               $prefix = $this->params['prefix'] ?? '';
                $contextStats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                foreach ( $stats as $stat ) {
index 100304f..e3184db 100644 (file)
@@ -33,9 +33,7 @@ class ProfilerOutputText extends ProfilerOutput {
 
        function __construct( Profiler $collector, array $params ) {
                parent::__construct( $collector, $params );
-               $this->thresholdMs = isset( $params['thresholdMs'] )
-                       ? $params['thresholdMs']
-                       : 1.0;
+               $this->thresholdMs = $params['thresholdMs'] ?? 1.0;
        }
        public function log( array $stats ) {
                if ( $this->collector->getTemplated() ) {
@@ -48,7 +46,7 @@ class ProfilerOutputText extends ProfilerOutput {
                        } );
                        // Sort descending by time elapsed
                        usort( $stats, function ( $a, $b ) {
-                               return $a['real'] < $b['real'];
+                               return $b['real'] <=> $a['real'];
                        } );
 
                        array_walk( $stats,
@@ -62,8 +60,7 @@ class ProfilerOutputText extends ProfilerOutput {
                        if ( wfIsCLI() ) {
                                print "<!--\n{$out}\n-->\n";
                        } elseif ( $contentType === 'text/html' ) {
-                               $visible = isset( $this->params['visible'] ) ?
-                                       $this->params['visible'] : false;
+                               $visible = $this->params['visible'] ?? false;
                                if ( $visible ) {
                                        print "<pre>{$out}</pre>";
                                } else {
index 14d4a17..a803e3a 100644 (file)
@@ -298,7 +298,7 @@ class ExtensionProcessor implements Processor {
        }
 
        public function getRequirements( array $info ) {
-               return isset( $info['requires'] ) ? $info['requires'] : [];
+               return $info['requires'] ?? [];
        }
 
        protected function extractHooks( array $info ) {
@@ -359,9 +359,7 @@ class ExtensionProcessor implements Processor {
        }
 
        protected function extractResourceLoaderModules( $dir, array $info ) {
-               $defaultPaths = isset( $info['ResourceFileModulePaths'] )
-                       ? $info['ResourceFileModulePaths']
-                       : false;
+               $defaultPaths = $info['ResourceFileModulePaths'] ?? false;
                if ( isset( $defaultPaths['localBasePath'] ) ) {
                        if ( $defaultPaths['localBasePath'] === '' ) {
                                // Avoid double slashes (e.g. /extensions/Example//path)
@@ -426,7 +424,7 @@ class ExtensionProcessor implements Processor {
        protected function extractCredits( $path, array $info ) {
                $credits = [
                        'path' => $path,
-                       'type' => isset( $info['type'] ) ? $info['type'] : 'other',
+                       'type' => $info['type'] ?? 'other',
                ];
                foreach ( self::$creditsAttributes as $attr ) {
                        if ( isset( $info[$attr] ) ) {
index f3b6a70..43f294b 100644 (file)
@@ -1103,7 +1103,7 @@ MESSAGE;
                                                $strContent = isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
                                                break;
                                        default:
-                                               $scripts = isset( $content['scripts'] ) ? $content['scripts'] : '';
+                                               $scripts = $content['scripts'] ?? '';
                                                if ( is_string( $scripts ) ) {
                                                        if ( $name === 'site' || $name === 'user' ) {
                                                                // Legacy scripts that run in the global scope without a closure.
@@ -1120,9 +1120,9 @@ MESSAGE;
                                                $strContent = self::makeLoaderImplementScript(
                                                        $implementKey,
                                                        $scripts,
-                                                       isset( $content['styles'] ) ? $content['styles'] : [],
+                                                       $content['styles'] ?? [],
                                                        isset( $content['messagesBlob'] ) ? new XmlJsCode( $content['messagesBlob'] ) : [],
-                                                       isset( $content['templates'] ) ? $content['templates'] : []
+                                                       $content['templates'] ?? []
                                                );
                                                break;
                                }
index 7f8c7f5..e572aa4 100644 (file)
@@ -641,7 +641,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                $collatedFiles[$default][] = $value;
                        } elseif ( is_array( $value ) ) {
                                // File name as the key, options array as the value
-                               $optionValue = isset( $value[$option] ) ? $value[$option] : $default;
+                               $optionValue = $value[$option] ?? $default;
                                if ( !isset( $collatedFiles[$optionValue] ) ) {
                                        $collatedFiles[$optionValue] = [];
                                }
index 5e329e8..e1bddcc 100644 (file)
@@ -224,7 +224,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
        public function getImage( $name, ResourceLoaderContext $context ) {
                $this->loadFromDefinition();
                $images = $this->getImages( $context );
-               return isset( $images[$name] ) ? $images[$name] : null;
+               return $images[$name] ?? null;
        }
 
        /**
@@ -241,9 +241,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                if ( !isset( $this->imageObjects[$skin] ) ) {
                        $this->imageObjects[$skin] = [];
                        if ( !isset( $this->images[$skin] ) ) {
-                               $this->images[$skin] = isset( $this->images['default'] ) ?
-                                       $this->images['default'] :
-                                       [];
+                               $this->images[$skin] = $this->images['default'] ?? [];
                        }
                        foreach ( $this->images[$skin] as $name => $options ) {
                                $fileDescriptor = is_string( $options ) ? $options : $options['file'];
@@ -290,9 +288,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                if ( !isset( $this->globalVariants[$skin] ) ) {
                        $this->globalVariants[$skin] = [];
                        if ( !isset( $this->variants[$skin] ) ) {
-                               $this->variants[$skin] = isset( $this->variants['default'] ) ?
-                                       $this->variants['default'] :
-                                       [];
+                               $this->variants[$skin] = $this->variants['default'] ?? [];
                        }
                        foreach ( $this->variants[$skin] as $name => $config ) {
                                if ( isset( $config['global'] ) && $config['global'] ) {
index a0a4e58..609abb8 100644 (file)
@@ -799,11 +799,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * This method should be quick because it is frequently run by ResourceLoaderStartUpModule to
         * propagate changes to the client and effectively invalidate cache.
         *
-        * For backward-compatibility, the following optional data providers are automatically included:
-        *
-        * - getModifiedTime()
-        * - getModifiedHash()
-        *
         * @since 1.26
         * @param ResourceLoaderContext $context
         * @return string Hash (should use ResourceLoader::makeHash)
@@ -833,18 +828,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                                        throw new LogicException( 'getDefinitionSummary must call parent method' );
                                }
                                $str = json_encode( $summary );
-
-                               $mtime = $this->getModifiedTime( $context );
-                               if ( $mtime !== null ) {
-                                       // Support: MediaWiki 1.25 and earlier
-                                       $str .= strval( $mtime );
-                               }
-
-                               $mhash = $this->getModifiedHash( $context );
-                               if ( $mhash !== null ) {
-                                       // Support: MediaWiki 1.25 and earlier
-                                       $str .= strval( $mhash );
-                               }
                        }
 
                        $this->versionHash[$contextHash] = ResourceLoader::makeHash( $str );
@@ -915,28 +898,6 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                ];
        }
 
-       /**
-        * Get this module's last modification timestamp for a given context.
-        *
-        * @deprecated since 1.26 Use getDefinitionSummary() instead
-        * @param ResourceLoaderContext $context
-        * @return int|null UNIX timestamp
-        */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               return null;
-       }
-
-       /**
-        * Helper method for providing a version hash to getVersionHash().
-        *
-        * @deprecated since 1.26 Use getDefinitionSummary() instead
-        * @param ResourceLoaderContext $context
-        * @return string|null Hash
-        */
-       public function getModifiedHash( ResourceLoaderContext $context ) {
-               return null;
-       }
-
        /**
         * Check whether this module is known to be empty. If a child class
         * has an easy and cheap way to determine that this module is
index 5c9e1d9..313d789 100644 (file)
@@ -35,7 +35,7 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
                $themes = self::getSkinThemeMap();
 
                // For backwards-compatibility, allow missing 'themeImages'
-               $module = isset( $this->definition['themeImages'] ) ? $this->definition['themeImages'] : '';
+               $module = $this->definition['themeImages'] ?? '';
 
                $definition = [];
                foreach ( $themes as $skin => $theme ) {
index 085244a..53ae435 100644 (file)
@@ -285,7 +285,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        if ( $options['type'] !== 'style' ) {
                                continue;
                        }
-                       $media = isset( $options['media'] ) ? $options['media'] : 'all';
+                       $media = $options['media'] ?? 'all';
                        $style = $this->getContent( $titleText, $context );
                        if ( strval( $style ) === '' ) {
                                continue;
index 89025bc..cf895ba 100644 (file)
@@ -112,7 +112,7 @@ abstract class RevDelList extends RevisionListBase {
 
                $bitPars = $params['value'];
                $comment = $params['comment'];
-               $perItemStatus = isset( $params['perItemStatus'] ) ? $params['perItemStatus'] : false;
+               $perItemStatus = $params['perItemStatus'] ?? false;
 
                // CAS-style checks are done on the _deleted fields so the select
                // does not need to use FOR UPDATE nor be in the atomic section
@@ -287,7 +287,7 @@ abstract class RevDelList extends RevisionListBase {
                                'oldBits' => $virtualOldBits,
                                'comment' => $comment,
                                'ids' => $idsForLog,
-                               'tags' => isset( $params['tags'] ) ? $params['tags'] : [],
+                               'tags' => $params['tags'] ?? [],
                        ] + $authorFields
                );
 
index 9f09e22..4c52693 100644 (file)
@@ -185,7 +185,7 @@ class ServiceContainer implements DestructibleService {
                        throw new NoSuchServiceException( $name );
                }
 
-               return isset( $this->services[$name] ) ? $this->services[$name] : null;
+               return $this->services[$name] ?? null;
        }
 
        /**
index 1cab3d3..200b913 100644 (file)
@@ -84,9 +84,7 @@ abstract class ImmutableSessionProviderWithCookie extends SessionProvider {
                        );
                }
 
-               $prefix = isset( $this->sessionCookieOptions['prefix'] )
-                       ? $this->sessionCookieOptions['prefix']
-                       : $this->config->get( 'CookiePrefix' );
+               $prefix = $this->sessionCookieOptions['prefix'] ?? $this->config->get( 'CookiePrefix' );
                $id = $request->getCookie( $this->sessionCookieName, $prefix );
                return SessionManager::validateSessionId( $id ) ? $id : null;
        }
@@ -141,9 +139,7 @@ abstract class ImmutableSessionProviderWithCookie extends SessionProvider {
                        return [];
                }
 
-               $prefix = isset( $this->sessionCookieOptions['prefix'] )
-                       ? $this->sessionCookieOptions['prefix']
-                       : $this->config->get( 'CookiePrefix' );
+               $prefix = $this->sessionCookieOptions['prefix'] ?? $this->config->get( 'CookiePrefix' );
                return [ $prefix . $this->sessionCookieName ];
        }
 
index 4e1a69b..d029163 100644 (file)
@@ -256,7 +256,7 @@ class PHPSessionHandler implements \SessionHandlerInterface {
 
                // Now merge the data into the Session object.
                $changed = false;
-               $cache = isset( $this->sessionFieldCache[$id] ) ? $this->sessionFieldCache[$id] : [];
+               $cache = $this->sessionFieldCache[$id] ?? [];
                foreach ( $data as $key => $value ) {
                        if ( !array_key_exists( $key, $cache ) ) {
                                if ( $session->exists( $key ) ) {
index 287da9d..577e03a 100644 (file)
@@ -282,7 +282,7 @@ class SessionInfo {
         * @return int Negative if $a < $b, positive if $a > $b, zero if equal
         */
        public static function compare( $a, $b ) {
-               return $a->getPriority() - $b->getPriority();
+               return $a->getPriority() <=> $b->getPriority();
        }
 
 }
index 603985f..ceb9ceb 100644 (file)
@@ -455,7 +455,7 @@ final class SessionManager implements SessionManagerInterface {
         */
        public function getProvider( $name ) {
                $providers = $this->getProviders();
-               return isset( $providers[$name] ) ? $providers[$name] : null;
+               return $providers[$name] ?? null;
        }
 
        /**
index d818930..7aed05f 100644 (file)
@@ -65,7 +65,7 @@ class FirejailCommand extends Command {
                        $splitCommand = explode( ' ', $command, 2 );
                        $this->logger->debug(
                                "firejail: Command {$splitCommand[0]} {params} has no restrictions",
-                               [ 'params' => isset( $splitCommand[1] ) ? $splitCommand[1] : '' ]
+                               [ 'params' => $splitCommand[1] ?? '' ]
                        );
                        return parent::buildFinalCommand( $command );
                }
index 742e142..ee9f1eb 100644 (file)
@@ -43,18 +43,6 @@ use MediaWiki\MediaWikiServices;
  */
 class Shell {
 
-       /**
-        * Apply a default set of restrictions for improved
-        * security out of the box.
-        *
-        * Equal to NO_ROOT | SECCOMP | PRIVATE_DEV | NO_LOCALSETTINGS
-        *
-        * @note This value will change over time to provide increased security
-        *       by default, and is not guaranteed to be backwards-compatible.
-        * @since 1.31
-        */
-       const RESTRICT_DEFAULT = 39;
-
        /**
         * Disallow any root access. Any setuid binaries
         * will be run without elevated access.
@@ -101,6 +89,17 @@ class Shell {
         */
        const NO_LOCALSETTINGS = 32;
 
+       /**
+        * Apply a default set of restrictions for improved
+        * security out of the box.
+        *
+        * @note This value will change over time to provide increased security
+        *       by default, and is not guaranteed to be backwards-compatible.
+        * @since 1.31
+        */
+       const RESTRICT_DEFAULT = self::NO_ROOT | self::SECCOMP | self::PRIVATE_DEV |
+                                                        self::NO_LOCALSETTINGS;
+
        /**
         * Don't apply any restrictions
         *
@@ -111,23 +110,22 @@ class Shell {
        /**
         * Returns a new instance of Command class
         *
-        * @param string|string[] $command String or array of strings representing the command to
+        * @param string|string[] ...$commands String or array of strings representing the command to
         * be executed, each value will be escaped.
         *   Example:   [ 'convert', '-font', 'font name' ] would produce "'convert' '-font' 'font name'"
         * @return Command
         */
-       public static function command( $command ) {
-               $args = func_get_args();
-               if ( count( $args ) === 1 && is_array( reset( $args ) ) ) {
+       public static function command( ...$commands ) {
+               if ( count( $commands ) === 1 && is_array( reset( $commands ) ) ) {
                        // If only one argument has been passed, and that argument is an array,
                        // treat it as a list of arguments
-                       $args = reset( $args );
+                       $commands = reset( $commands );
                }
                $command = MediaWikiServices::getInstance()
                        ->getShellCommandFactory()
                        ->create();
 
-               return $command->params( $args );
+               return $command->params( $commands );
        }
 
        /**
@@ -157,12 +155,11 @@ class Shell {
         * (https://bugs.php.net/bug.php?id=26285) and the locale problems on Linux in
         * PHP 5.2.6+ (bug backported to earlier distro releases of PHP).
         *
-        * @param string $args,... strings to escape and glue together, or a single array of
-        *     strings parameter. Null values are ignored.
+        * @param string|string[] ...$args strings to escape and glue together, or a single
+        *     array of strings parameter. Null values are ignored.
         * @return string
         */
-       public static function escape( /* ... */ ) {
-               $args = func_get_args();
+       public static function escape( ...$args ) {
                if ( count( $args ) === 1 && is_array( reset( $args ) ) ) {
                        // If only one argument has been passed, and that argument is an array,
                        // treat it as a list of arguments
index 156df67..d1bea8d 100644 (file)
@@ -366,7 +366,7 @@ abstract class BaseTemplate extends QuickTemplate {
                if ( isset( $item['text'] ) ) {
                        $text = $item['text'];
                } else {
-                       $text = wfMessage( isset( $item['msg'] ) ? $item['msg'] : $key )->text();
+                       $text = wfMessage( $item['msg'] ?? $key )->text();
                }
 
                $html = htmlspecialchars( $text );
@@ -378,9 +378,7 @@ abstract class BaseTemplate extends QuickTemplate {
                        }
                        while ( count( $wrapper ) > 0 ) {
                                $element = array_pop( $wrapper );
-                               $html = Html::rawElement( $element['tag'], isset( $element['attributes'] )
-                                       ? $element['attributes']
-                                       : null, $html );
+                               $html = Html::rawElement( $element['tag'], $element['attributes'] ?? null, $html );
                        }
                }
 
@@ -517,7 +515,7 @@ abstract class BaseTemplate extends QuickTemplate {
                if ( isset( $item['itemtitle'] ) ) {
                        $attrs['title'] = $item['itemtitle'];
                }
-               return Html::rawElement( isset( $options['tag'] ) ? $options['tag'] : 'li', $attrs, $html );
+               return Html::rawElement( $options['tag'] ?? 'li', $attrs, $html );
        }
 
        function makeSearchInput( $attrs = [] ) {
@@ -561,11 +559,9 @@ abstract class BaseTemplate extends QuickTemplate {
                                unset( $buttonAttrs['height'] );
                                $imgAttrs = [
                                        'src' => $attrs['src'],
-                                       'alt' => isset( $attrs['alt'] )
-                                               ? $attrs['alt']
-                                               : wfMessage( 'searchbutton' )->text(),
-                                       'width' => isset( $attrs['width'] ) ? $attrs['width'] : null,
-                                       'height' => isset( $attrs['height'] ) ? $attrs['height'] : null,
+                                       'alt' => $attrs['alt'] ?? wfMessage( 'searchbutton' )->text(),
+                                       'width' => $attrs['width'] ?? null,
+                                       'height' => $attrs['height'] ?? null,
                                ];
                                return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) );
                        default:
index 6739c08..55d3462 100644 (file)
@@ -976,7 +976,7 @@ abstract class Skin extends ContextSource {
                if ( is_string( $icon ) ) {
                        $html = $icon;
                } else { // Assuming array
-                       $url = isset( $icon["url"] ) ? $icon["url"] : null;
+                       $url = $icon["url"] ?? null;
                        unset( $icon["url"] );
                        if ( isset( $icon["src"] ) && $withImage === 'withImage' ) {
                                // do this the lazy way, just pass icon data as an attribute array
@@ -1454,7 +1454,7 @@ abstract class Skin extends ContextSource {
 
                if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
                        $uTalkTitle = $user->getTalkPage();
-                       $lastSeenRev = isset( $newtalks[0]['rev'] ) ? $newtalks[0]['rev'] : null;
+                       $lastSeenRev = $newtalks[0]['rev'] ?? null;
                        $nofAuthors = 0;
                        if ( $lastSeenRev !== null ) {
                                $plural = true; // Default if we have a last seen revision: if unknown, use plural
@@ -1605,8 +1605,7 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Create a section edit link.  This supersedes editSectionLink() and
-        * editSectionLinkForOther().
+        * Create a section edit link.
         *
         * @param Title $nt The title being linked to (may not be the same as
         *   the current page, if the section is included from a template)
index b9745de..81e13f0 100644 (file)
@@ -718,8 +718,8 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
                        $field['__index'] = $i++;
                }
                uasort( $formDescriptor, function ( $first, $second ) {
-                       return self::getField( $first, 'weight', 0 ) - self::getField( $second, 'weight', 0 )
-                               ?: $first['__index'] - $second['__index'];
+                       return self::getField( $first, 'weight', 0 ) <=> self::getField( $second, 'weight', 0 )
+                               ?: $first['__index'] <=> $second['__index'];
                } );
                foreach ( $formDescriptor as &$field ) {
                        unset( $field['__index'] );
index 9e61ef7..0622584 100644 (file)
@@ -1196,9 +1196,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return ChangesListFilterGroup|null Group, or null if not registered
         */
        public function getFilterGroup( $groupName ) {
-               return isset( $this->filterGroups[$groupName] ) ?
-                       $this->filterGroups[$groupName] :
-                       null;
+               return $this->filterGroups[$groupName] ?? null;
        }
 
        // Currently, this intentionally only includes filters that display
@@ -1220,7 +1218,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                ];
 
                usort( $this->filterGroups, function ( $a, $b ) {
-                       return $b->getPriority() - $a->getPriority();
+                       return $b->getPriority() <=> $a->getPriority();
                } );
 
                foreach ( $this->filterGroups as $groupName => $group ) {
@@ -1682,9 +1680,9 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        unset( $legendItems['unpatrolled'] );
                }
                foreach ( $legendItems as $key => $item ) { # generate items of the legend
-                       $label = isset( $item['legend'] ) ? $item['legend'] : $item['title'];
+                       $label = $item['legend'] ?? $item['title'];
                        $letter = $item['letter'];
-                       $cssClass = isset( $item['class'] ) ? $item['class'] : $key;
+                       $cssClass = $item['class'] ?? $key;
 
                        $legend .= Html::element( 'dt',
                                [ 'class' => $cssClass ], $context->msg( $letter )->text()
index 49aaffd..8df6493 100644 (file)
@@ -52,7 +52,7 @@ abstract class ImageQueryPage extends QueryPage {
                        $i = 0;
                        foreach ( $res as $row ) {
                                $i++;
-                               $namespace = isset( $row->namespace ) ? $row->namespace : NS_FILE;
+                               $namespace = $row->namespace ?? NS_FILE;
                                $title = Title::makeTitleSafe( $namespace, $row->title );
                                if ( $title instanceof Title && $title->getNamespace() == NS_FILE ) {
                                        $gallery->add( $title, $this->getCellHtml( $row ) );
index 1c54d13..45e9684 100644 (file)
@@ -846,8 +846,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
 
                // keep the ordering from getCoreFieldDescriptors() where there is no explicit weight
                foreach ( $coreFieldDescriptors as $fieldName => $coreField ) {
-                       $requestField = isset( $formDescriptor[$fieldName] ) ?
-                               $formDescriptor[$fieldName] : [];
+                       $requestField = $formDescriptor[$fieldName] ?? [];
 
                        // remove everything that is not in the fieldinfo, is not marked as a supplemental field
                        // to something in the fieldinfo, is not B/C for the pre-AuthManager templates,
index f642106..655b495 100644 (file)
@@ -806,7 +806,7 @@ abstract class QueryPage extends SpecialPage {
                }
                $title = Title::makeTitle( intval( $row->namespace ), $row->title );
                if ( $title ) {
-                       $date = isset( $row->timestamp ) ? $row->timestamp : '';
+                       $date = $row->timestamp ?? '';
                        $comments = '';
                        if ( $title ) {
                                $talkpage = $title->getTalkPage();
@@ -830,7 +830,7 @@ abstract class QueryPage extends SpecialPage {
        }
 
        function feedItemAuthor( $row ) {
-               return isset( $row->user_text ) ? $row->user_text : '';
+               return $row->user_text ?? '';
        }
 
        function feedTitle() {
index cc62d61..6091a64 100644 (file)
@@ -74,9 +74,7 @@ class SpecialListGroupRights extends SpecialPage {
                $linkRenderer = $this->getLinkRenderer();
 
                foreach ( $allGroups as $group ) {
-                       $permissions = isset( $groupPermissions[$group] )
-                               ? $groupPermissions[$group]
-                               : [];
+                       $permissions = $groupPermissions[$group] ?? [];
                        $groupname = ( $group == '*' ) // Replace * with a more descriptive groupname
                                ? 'all'
                                : $group;
@@ -114,13 +112,11 @@ class SpecialListGroupRights extends SpecialPage {
                                $grouplink = '';
                        }
 
-                       $revoke = isset( $revokePermissions[$group] ) ? $revokePermissions[$group] : [];
-                       $addgroups = isset( $addGroups[$group] ) ? $addGroups[$group] : [];
-                       $removegroups = isset( $removeGroups[$group] ) ? $removeGroups[$group] : [];
-                       $addgroupsSelf = isset( $groupsAddToSelf[$group] ) ? $groupsAddToSelf[$group] : [];
-                       $removegroupsSelf = isset( $groupsRemoveFromSelf[$group] )
-                               ? $groupsRemoveFromSelf[$group]
-                               : [];
+                       $revoke = $revokePermissions[$group] ?? [];
+                       $addgroups = $addGroups[$group] ?? [];
+                       $removegroups = $removeGroups[$group] ?? [];
+                       $addgroupsSelf = $groupsAddToSelf[$group] ?? [];
+                       $removegroupsSelf = $groupsRemoveFromSelf[$group] ?? [];
 
                        $id = $group == '*' ? false : Sanitizer::escapeIdForAttribute( $group );
                        $out->addHTML( Html::rawElement( 'tr', [ 'id' => $id ], "
index 943fa57..26c9b06 100644 (file)
@@ -363,8 +363,8 @@ class MediaStatisticsPage extends QueryPage {
                $this->totalCount = $this->totalBytes = 0;
                foreach ( $res as $row ) {
                        $mediaStats = $this->splitFakeTitle( $row->title );
-                       $this->totalCount += isset( $mediaStats[2] ) ? $mediaStats[2] : 0;
-                       $this->totalBytes += isset( $mediaStats[3] ) ? $mediaStats[3] : 0;
+                       $this->totalCount += $mediaStats[2] ?? 0;
+                       $this->totalBytes += $mediaStats[3] ?? 0;
                }
                $res->seek( 0 );
        }
index cd3da4f..a93b522 100644 (file)
@@ -483,7 +483,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function feedItemAuthor( $row ) {
-               return isset( $row->rc_user_text ) ? $row->rc_user_text : '';
+               return $row->rc_user_text ?? '';
        }
 
        protected function feedItemDesc( $row ) {
index 7539235..7342bb0 100644 (file)
@@ -133,8 +133,8 @@ class SpecialPasswordReset extends FormSpecialPage {
         * @return Status
         */
        public function onSubmit( array $data ) {
-               $username = isset( $data['Username'] ) ? $data['Username'] : null;
-               $email = isset( $data['Email'] ) ? $data['Email'] : null;
+               $username = $data['Username'] ?? null;
+               $email = $data['Email'] ?? null;
 
                $this->method = $username ? 'username' : 'email';
                $this->result = Status::wrap(
index a05452d..22c6afe 100644 (file)
@@ -373,7 +373,7 @@ class UserrightsPage extends SpecialPage {
                }
                if ( $add ) {
                        foreach ( $add as $index => $group ) {
-                               $expiry = isset( $groupExpiries[$group] ) ? $groupExpiries[$group] : null;
+                               $expiry = $groupExpiries[$group] ?? null;
                                if ( !$user->addGroup( $group, $expiry ) ) {
                                        unset( $add[$index] );
                                }
index d4e5151..911c9a6 100644 (file)
@@ -233,7 +233,9 @@ class SpecialVersion extends SpecialPage {
                }
                $software[$dbr->getSoftwareLink()] = $dbr->getServerInfo();
 
-               $software['[http://site.icu-project.org/ ICU]'] = INTL_ICU_VERSION;
+               if ( defined( 'INTL_ICU_VERSION' ) ) {
+                       $software['[http://site.icu-project.org/ ICU]'] = INTL_ICU_VERSION;
+               }
 
                // Allow a hook to add/remove items.
                Hooks::run( 'SoftwareInfo', [ &$software ] );
@@ -394,7 +396,7 @@ class SpecialVersion extends SpecialPage {
        public static function getExtensionTypeName( $type ) {
                $types = self::getExtensionTypes();
 
-               return isset( $types[$type] ) ? $types[$type] : $types['other'];
+               return $types[$type] ?? $types['other'];
        }
 
        /**
@@ -656,13 +658,7 @@ class SpecialVersion extends SpecialPage {
         * @return int
         */
        public function compare( $a, $b ) {
-               if ( $a['name'] === $b['name'] ) {
-                       return 0;
-               } else {
-                       return $this->getLanguage()->lc( $a['name'] ) > $this->getLanguage()->lc( $b['name'] )
-                               ? 1
-                               : -1;
-               }
+               return $this->getLanguage()->lc( $a['name'] ) <=> $this->getLanguage()->lc( $b['name'] );
        }
 
        /**
@@ -836,7 +832,7 @@ class SpecialVersion extends SpecialPage {
                $description = $out->parseInline( $description );
 
                // ... now get the authors for this extension
-               $authors = isset( $extension['author'] ) ? $extension['author'] : [];
+               $authors = $extension['author'] ?? [];
                $authors = $this->listAuthors( $authors, $extension['name'], $extensionPath );
 
                // Finally! Create the table
index fc0c312..d323c9e 100644 (file)
@@ -103,9 +103,7 @@ class WantedCategoriesPage extends WantedQueryPage {
                } else {
                        $plink = $this->getLinkRenderer()->makeLink( $nt, $text );
 
-                       $currentValue = isset( $this->currentCategoryCounts[$result->title] )
-                               ? $this->currentCategoryCounts[$result->title]
-                               : 0;
+                       $currentValue = $this->currentCategoryCounts[$result->title] ?? 0;
                        $cachedValue = intval( $result->value ); // T76910
 
                        // If the category has been created or emptied since the list was refreshed, strike it
index ea73347..ce7fea9 100644 (file)
@@ -110,10 +110,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        public static function checkStructuredFilterUiEnabled( Config $config, User $user ) {
-               return (
-                       $config->get( 'StructuredChangeFiltersOnWatchlist' ) &&
-                       $user->getOption( 'rcenhancedfilters' )
-               );
+               if ( !$config->get( 'StructuredChangeFiltersOnWatchlist' ) ) {
+                       return false;
+               }
+
+               if ( $config->get( 'StructuredChangeFiltersShowWatchlistPreference' ) ) {
+                       return !$user->getOption( 'wlenhancedfilters-disable' );
+               } else {
+                       return $user->getOption( 'rcenhancedfilters' );
+               }
        }
 
        /**
index 5677ac8..942346e 100644 (file)
@@ -209,14 +209,17 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                                                $out->addHTML( $this->getFilterPanel() );
                                        }
                                        $msgKey = is_int( $namespace ) ? 'nolinkshere-ns-2' : 'nolinkshere-2';
-                                       $link = $this->getLinkRenderer()->makeKnownLink(
+                                       $link = $this->getLinkRenderer()->makeLink(
                                                $this->target,
                                                null,
                                                [],
                                                $this->target->isRedirect() ? [ 'redirect' => 'no' ] : []
                                        );
 
-                                       $errMsg = $this->msg( $msgKey )->rawParams( $link )->parseAsBlock();
+                                       $errMsg = $this->msg( $msgKey )
+                                               ->params( $this->target->getPrefixedText() )
+                                               ->rawParams( $link )
+                                               ->parseAsBlock();
                                        $out->addHTML( $errMsg );
                                        $out->setStatusCode( 404 );
                                }
@@ -282,14 +285,17 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                                $out->addHTML( $this->whatlinkshereForm() );
                                $out->addHTML( $this->getFilterPanel() );
 
-                               $link = $this->getLinkRenderer()->makeKnownLink(
+                               $link = $this->getLinkRenderer()->makeLink(
                                        $this->target,
                                        null,
                                        [],
                                        $this->target->isRedirect() ? [ 'redirect' => 'no' ] : []
                                );
 
-                               $msg = $this->msg( 'linkshere-2' )->rawParams( $link )->parseAsBlock();
+                               $msg = $this->msg( 'linkshere-2' )
+                                       ->params( $this->target->getPrefixedText() )
+                                       ->rawParams( $link )
+                                       ->parseAsBlock();
                                $out->addHTML( $msg );
 
                                $prevnext = $this->getPrevNext( $prevId, $nextId );
index a2f3128..0b6c165 100644 (file)
@@ -186,7 +186,7 @@ class Licenses extends HTMLFormField {
                        $attribs['selected'] = 'selected';
                }
 
-               $val = str_repeat( /* &nbsp */ "\xc2\xa0", $depth * 2 ) . $text;
+               $val = str_repeat( /* &nbsp */ "\u{00A0}", $depth * 2 ) . $text;
                return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
        }
 
index 251a286..6dc129c 100644 (file)
@@ -61,8 +61,6 @@ class UploadSourceField extends HTMLTextField {
         * @return int
         */
        function getSize() {
-               return isset( $this->mParams['size'] )
-                       ? $this->mParams['size']
-                       : 60;
+               return $this->mParams['size'] ?? 60;
        }
 }
index b60882a..5f07073 100644 (file)
@@ -29,4 +29,10 @@ class EditWatchlistNormalHTMLForm extends OOUIHTMLForm {
                        ? $this->msg( 'blanknamespace' )->escaped()
                        : htmlspecialchars( $this->getContext()->getLanguage()->getFormattedNsText( $namespace ) );
        }
+
+       public function displaySection(
+               $fields, $sectionName = '', $fieldsetIDPrefix = '', &$hasUserVisibleFields = false
+       ) {
+               return parent::displaySection( $fields, $sectionName, 'editwatchlist-', $hasUserVisibleFields );
+       }
 }
index 48bded4..cae895f 100644 (file)
@@ -104,7 +104,7 @@ class PreferencesFormLegacy extends HTMLForm {
                foreach ( $this->mFlatFields as $fieldname => $field ) {
                        if ( $field instanceof HTMLNestedFilterable ) {
                                $info = $field->mParams;
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+                               $prefix = $info['prefix'] ?? $fieldname;
                                foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
                                        $data["$prefix$key"] = $value;
                                }
index 47a595f..423e2bb 100644 (file)
@@ -105,7 +105,7 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
                foreach ( $this->mFlatFields as $fieldname => $field ) {
                        if ( $field instanceof HTMLNestedFilterable ) {
                                $info = $field->mParams;
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $fieldname;
+                               $prefix = $info['prefix'] ?? $fieldname;
                                foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
                                        $data["$prefix$key"] = $value;
                                }
index 8ab6f29..e37200f 100644 (file)
@@ -55,19 +55,16 @@ class UploadForm extends HTMLForm {
 
                $this->mWatch = !empty( $options['watch'] );
                $this->mForReUpload = !empty( $options['forreupload'] );
-               $this->mSessionKey = isset( $options['sessionkey'] ) ? $options['sessionkey'] : '';
+               $this->mSessionKey = $options['sessionkey'] ?? '';
                $this->mHideIgnoreWarning = !empty( $options['hideignorewarning'] );
                $this->mDestWarningAck = !empty( $options['destwarningack'] );
-               $this->mDestFile = isset( $options['destfile'] ) ? $options['destfile'] : '';
+               $this->mDestFile = $options['destfile'] ?? '';
 
-               $this->mComment = isset( $options['description'] ) ?
-                       $options['description'] : '';
+               $this->mComment = $options['description'] ?? '';
 
-               $this->mTextTop = isset( $options['texttop'] )
-                       ? $options['texttop'] : '';
+               $this->mTextTop = $options['texttop'] ?? '';
 
-               $this->mTextAfterSummary = isset( $options['textaftersummary'] )
-                       ? $options['textaftersummary'] : '';
+               $this->mTextAfterSummary = $options['textaftersummary'] ?? '';
 
                $sourceDescriptor = $this->getSourceSection();
                $descriptor = $sourceDescriptor
index e31498a..205364f 100644 (file)
@@ -64,12 +64,12 @@ class ContribsPager extends RangeChronologicalPager {
                        $this->messages[$msg] = $this->msg( $msg )->escaped();
                }
 
-               $this->target = isset( $options['target'] ) ? $options['target'] : '';
-               $this->contribs = isset( $options['contribs'] ) ? $options['contribs'] : 'users';
-               $this->namespace = isset( $options['namespace'] ) ? $options['namespace'] : '';
-               $this->tagFilter = isset( $options['tagfilter'] ) ? $options['tagfilter'] : false;
-               $this->nsInvert = isset( $options['nsInvert'] ) ? $options['nsInvert'] : false;
-               $this->associated = isset( $options['associated'] ) ? $options['associated'] : false;
+               $this->target = $options['target'] ?? '';
+               $this->contribs = $options['contribs'] ?? 'users';
+               $this->namespace = $options['namespace'] ?? '';
+               $this->tagFilter = $options['tagfilter'] ?? false;
+               $this->nsInvert = $options['nsInvert'] ?? false;
+               $this->associated = $options['associated'] ?? false;
 
                $this->deletedOnly = !empty( $options['deletedOnly'] );
                $this->topOnly = !empty( $options['topOnly'] );
@@ -640,10 +640,10 @@ class ContribsPager extends RangeChronologicalPager {
         * @return array Options array with processed start and end date filter options
         */
        public static function processDateFilter( array $opts ) {
-               $start = isset( $opts['start'] ) ? $opts['start'] : '';
-               $end = isset( $opts['end'] ) ? $opts['end'] : '';
-               $year = isset( $opts['year'] ) ? $opts['year'] : '';
-               $month = isset( $opts['month'] ) ? $opts['month'] : '';
+               $start = $opts['start'] ?? '';
+               $end = $opts['end'] ?? '';
+               $year = $opts['year'] ?? '';
+               $month = $opts['month'] ?? '';
 
                if ( $start !== '' && $end !== '' && $start > $end ) {
                        $temp = $start;
index f3de64d..b5ced13 100644 (file)
@@ -256,7 +256,7 @@ class DeletedContribsPager extends IndexPager {
                        'comment' => CommentStore::getStore()->getComment( 'ar_comment', $row )->text,
                        'user' => $row->ar_user,
                        'user_text' => $row->ar_user_text,
-                       'actor' => isset( $row->ar_actor ) ? $row->ar_actor : null,
+                       'actor' => $row->ar_actor ?? null,
                        'timestamp' => $row->ar_timestamp,
                        'minor_edit' => $row->ar_minor_edit,
                        'deleted' => $row->ar_deleted,
index d17332f..23f9f83 100644 (file)
@@ -411,7 +411,7 @@ class UsersPager extends AlphabeticPager {
                        $user = User::newFromId( $uid );
                        return $user->getGroupMemberships();
                } else {
-                       return isset( $cache[$uid] ) ? $cache[$uid] : [];
+                       return $cache[$uid] ?? [];
                }
        }
 
index c8a715b..4e93382 100644 (file)
@@ -18,9 +18,9 @@ class RemexCompatFormatter extends HtmlFormatter {
 
        public function __construct( $options = [] ) {
                parent::__construct( $options );
-               $this->attributeEscapes["\xc2\xa0"] = '&#160;';
+               $this->attributeEscapes["\u{00A0}"] = '&#160;';
                unset( $this->attributeEscapes["&"] );
-               $this->textEscapes["\xc2\xa0"] = '&#160;';
+               $this->textEscapes["\u{00A0}"] = '&#160;';
                unset( $this->textEscapes["&"] );
        }
 
index 7c2d393..890a870 100644 (file)
@@ -275,15 +275,10 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                        'user_case_dbkey' => $dbkey,
                ];
 
-               # Strip soft hyphens (U+00AD) and Unicode directional formatting characters (U+061C, U+200E,
-               # U+200F, U+202A. U+202B, U+202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069).
+               # Strip Unicode bidi override characters.
                # Sometimes they slip into cut-n-pasted page titles, where the
-               # soft hyphens or override chars get included in list displays.
-               $dbkey = preg_replace(
-                       '/\xC2\xAD|\xD8\x9C|\xE2\x80[\x8E\x8F\xAA-\xAE]|\xE2\x81[\xA6-\xA9]/S',
-                       '',
-                       $dbkey
-               );
+               # override chars get included in list displays.
+               $dbkey = preg_replace( '/\xE2\x80[\x8E\x8F\xAA-\xAE]/S', '', $dbkey );
 
                # Clean up whitespace
                # Note: use of the /u option on preg_replace here will cause
index 064ca67..27c0ed7 100644 (file)
@@ -1864,8 +1864,7 @@ abstract class UploadBase {
                # look up scanner configuration
                $command = $wgAntivirusSetup[$wgAntivirus]['command'];
                $exitCodeMap = $wgAntivirusSetup[$wgAntivirus]['codemap'];
-               $msgPattern = isset( $wgAntivirusSetup[$wgAntivirus]['messagepattern'] ) ?
-                       $wgAntivirusSetup[$wgAntivirus]['messagepattern'] : null;
+               $msgPattern = $wgAntivirusSetup[$wgAntivirus]['messagepattern'] ?? null;
 
                if ( strpos( $command, "%f" ) === false ) {
                        # simple pattern: append file to scan
index 6b8153c..960a486 100644 (file)
@@ -139,10 +139,8 @@ class BotPassword implements IDBAccessObject {
                        'bp_user' => 0,
                        'bp_app_id' => isset( $data['appId'] ) ? trim( $data['appId'] ) : '',
                        'bp_token' => '**unsaved**',
-                       'bp_restrictions' => isset( $data['restrictions'] )
-                               ? $data['restrictions']
-                               : MWRestrictions::newDefault(),
-                       'bp_grants' => isset( $data['grants'] ) ? $data['grants'] : [],
+                       'bp_restrictions' => $data['restrictions'] ?? MWRestrictions::newDefault(),
+                       'bp_grants' => $data['grants'] ?? [],
                ];
 
                if (
index f953b14..66674dc 100644 (file)
@@ -27,8 +27,20 @@ use MediaWiki\MediaWikiServices;
  * @since 1.31
  */
 class ExternalUserNames {
+
+       /**
+        * @var string
+        */
        private $usernamePrefix = 'imported';
+
+       /**
+        * @var bool
+        */
        private $assignKnownUsers = false;
+
+       /**
+        * @var bool[]
+        */
        private $triedCreations = [];
 
        /**
@@ -69,8 +81,16 @@ class ExternalUserNames {
        /**
         * Add an interwiki prefix to the username, if appropriate
         *
-        * @param string $name Name being imported
-        * @return string Name, possibly with the prefix prepended.
+        * This method does have a side-effect on SUL (single user login) wikis: Calling this calls the
+        * ImportHandleUnknownUser hook from the CentralAuth extension, which assigns a local ID to the
+        * global user name, if possible. No prefix is applied if this is successful.
+        *
+        * @see https://meta.wikimedia.org/wiki/Help:Unified_login
+        * @see https://www.mediawiki.org/wiki/Manual:Hooks/ImportHandleUnknownUser
+        *
+        * @param string $name
+        * @return string Either the unchanged username if it's a known local user (or not a valid
+        *  username), otherwise the name with the prefix prepended.
         */
        public function applyPrefix( $name ) {
                if ( !User::isUsableName( $name ) ) {
@@ -99,8 +119,8 @@ class ExternalUserNames {
        /**
         * Add an interwiki prefix to the username regardless of circumstances
         *
-        * @param string $name Name being imported
-        * @return string Name
+        * @param string $name
+        * @return string Prefixed username, using ">" as separator
         */
        public function addPrefix( $name ) {
                return substr( $this->usernamePrefix . '>' . $name, 0, 255 );
index b5fa97f..c5fa05a 100644 (file)
@@ -3335,7 +3335,7 @@ class User implements IDBAccessObject, UserIdentity {
                        if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
                                        ( isset( $info['class'] ) && $info['class'] == HTMLMultiSelectField::class ) ) {
                                $opts = HTMLFormField::flattenOptions( $info['options'] );
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+                               $prefix = $info['prefix'] ?? $name;
 
                                foreach ( $opts as $value ) {
                                        $multiselectOptions["$prefix$value"] = true;
@@ -3350,7 +3350,7 @@ class User implements IDBAccessObject, UserIdentity {
                                        ( isset( $info['class'] ) && $info['class'] == HTMLCheckMatrix::class ) ) {
                                $columns = HTMLFormField::flattenOptions( $info['columns'] );
                                $rows = HTMLFormField::flattenOptions( $info['rows'] );
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+                               $prefix = $info['prefix'] ?? $name;
 
                                foreach ( $columns as $column ) {
                                        foreach ( $rows as $row ) {
index deb1f28..17d9b91 100644 (file)
@@ -220,7 +220,7 @@ class WatchedItemQueryService {
                        $joinConds
                );
 
-               $limit = isset( $dbOptions['LIMIT'] ) ? $dbOptions['LIMIT'] : INF;
+               $limit = $dbOptions['LIMIT'] ?? INF;
                $items = [];
                $startFrom = null;
                foreach ( $res as $row ) {
index ca6c848..392e46d 100644 (file)
@@ -40,9 +40,7 @@ class ComplexTitleInputWidget extends \OOUI\Widget {
                        $config['title'],
                        [
                                'relative' => true,
-                               'namespace' => isset( $config['namespace']['value'] ) ?
-                                       $config['namespace']['value'] :
-                                       null,
+                               'namespace' => $config['namespace']['value'] ?? null,
                        ]
                ) );
 
index 7395df1..f9985eb 100644 (file)
@@ -42,7 +42,7 @@ class ExpiryInputWidget extends Widget {
                parent::__construct( $options );
 
                $this->noDatePicker = $options['noDatePicker'];
-               $this->required = isset( $options['required'] ) ? $options['required'] : false;
+               $this->required = $options['required'] ?? false;
 
                // Properties
                $this->relativeInput = $relativeInput;
index 0840886..7802a2a 100644 (file)
@@ -25,8 +25,8 @@ class NamespaceInputWidget extends \OOUI\DropdownInputWidget {
                parent::__construct( $config );
 
                // Properties
-               $this->includeAllValue = isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null;
-               $this->exclude = isset( $config['exclude'] ) ? $config['exclude'] : [];
+               $this->includeAllValue = $config['includeAllValue'] ?? null;
+               $this->exclude = $config['exclude'] ?? [];
 
                // Initialization
                $this->addClasses( [ 'mw-widget-namespaceInputWidget' ] );
@@ -34,8 +34,8 @@ class NamespaceInputWidget extends \OOUI\DropdownInputWidget {
 
        protected function getNamespaceDropdownOptions( array $config ) {
                $namespaceOptionsParams = [
-                       'all' => isset( $config['includeAllValue'] ) ? $config['includeAllValue'] : null,
-                       'exclude' => isset( $config['exclude'] ) ? $config['exclude'] : null
+                       'all' => $config['includeAllValue'] ?? null,
+                       'exclude' => $config['exclude'] ?? null
                ];
                $namespaceOptions = \Html::namespaceSelectorOptions( $namespaceOptionsParams );
 
index 1320a57..da7bc94 100644 (file)
@@ -154,9 +154,9 @@ class Language {
        /**
         * Unicode directional formatting characters, for embedBidi()
         */
-       static private $lre = "\xE2\x80\xAA"; // U+202A LEFT-TO-RIGHT EMBEDDING
-       static private $rle = "\xE2\x80\xAB"; // U+202B RIGHT-TO-LEFT EMBEDDING
-       static private $pdf = "\xE2\x80\xAC"; // U+202C POP DIRECTIONAL FORMATTING
+       static private $lre = "\u{202A}"; // U+202A LEFT-TO-RIGHT EMBEDDING
+       static private $rle = "\u{202B}"; // U+202B RIGHT-TO-LEFT EMBEDDING
+       static private $pdf = "\u{202C}"; // U+202C POP DIRECTIONAL FORMATTING
 
        /**
         * Directionality test regex for embedBidi(). Matches the first strong directionality codepoint:
@@ -188,9 +188,7 @@ class Language {
                }
 
                // get the language object to process
-               $langObj = isset( self::$mLangObjCache[$code] )
-                       ? self::$mLangObjCache[$code]
-                       : self::newFromCode( $code );
+               $langObj = self::$mLangObjCache[$code] ?? self::newFromCode( $code );
 
                // merge the language object in to get it up front in the cache
                self::$mLangObjCache = array_merge( [ $code => $langObj ], self::$mLangObjCache );
@@ -542,7 +540,7 @@ class Language {
         */
        public function getNsText( $index ) {
                $ns = $this->getNamespaces();
-               return isset( $ns[$index] ) ? $ns[$index] : false;
+               return $ns[$index] ?? false;
        }
 
        /**
@@ -577,7 +575,7 @@ class Language {
                $ns = $wgExtraGenderNamespaces +
                        (array)self::$dataCache->getItem( $this->mCode, 'namespaceGenderAliases' );
 
-               return isset( $ns[$index][$gender] ) ? $ns[$index][$gender] : $this->getNsText( $index );
+               return $ns[$index][$gender] ?? $this->getNsText( $index );
        }
 
        /**
@@ -613,7 +611,7 @@ class Language {
        function getLocalNsIndex( $text ) {
                $lctext = $this->lc( $text );
                $ids = $this->getNamespaceIds();
-               return isset( $ids[$lctext] ) ? $ids[$lctext] : false;
+               return $ids[$lctext] ?? false;
        }
 
        /**
@@ -700,7 +698,7 @@ class Language {
                        return $ns;
                }
                $ids = $this->getNamespaceIds();
-               return isset( $ids[$lctext] ) ? $ids[$lctext] : false;
+               return $ids[$lctext] ?? false;
        }
 
        /**
@@ -2917,33 +2915,33 @@ class Language {
                        if ( $code < 0xac00 || 0xd7a4 <= $code ) {
                                return $matches[1];
                        } elseif ( $code < 0xb098 ) {
-                               return "\xe3\x84\xb1";
+                               return "\u{3131}";
                        } elseif ( $code < 0xb2e4 ) {
-                               return "\xe3\x84\xb4";
+                               return "\u{3134}";
                        } elseif ( $code < 0xb77c ) {
-                               return "\xe3\x84\xb7";
+                               return "\u{3137}";
                        } elseif ( $code < 0xb9c8 ) {
-                               return "\xe3\x84\xb9";
+                               return "\u{3139}";
                        } elseif ( $code < 0xbc14 ) {
-                               return "\xe3\x85\x81";
+                               return "\u{3141}";
                        } elseif ( $code < 0xc0ac ) {
-                               return "\xe3\x85\x82";
+                               return "\u{3142}";
                        } elseif ( $code < 0xc544 ) {
-                               return "\xe3\x85\x85";
+                               return "\u{3145}";
                        } elseif ( $code < 0xc790 ) {
-                               return "\xe3\x85\x87";
+                               return "\u{3147}";
                        } elseif ( $code < 0xcc28 ) {
-                               return "\xe3\x85\x88";
+                               return "\u{3148}";
                        } elseif ( $code < 0xce74 ) {
-                               return "\xe3\x85\x8a";
+                               return "\u{314A}";
                        } elseif ( $code < 0xd0c0 ) {
-                               return "\xe3\x85\x8b";
+                               return "\u{314B}";
                        } elseif ( $code < 0xd30c ) {
-                               return "\xe3\x85\x8c";
+                               return "\u{314C}";
                        } elseif ( $code < 0xd558 ) {
-                               return "\xe3\x85\x8d";
+                               return "\u{314D}";
                        } else {
-                               return "\xe3\x85\x8e";
+                               return "\u{314E}";
                        }
                } else {
                        return '';
@@ -3090,8 +3088,8 @@ class Language {
         * @return string
         */
        function getDirMark( $opposite = false ) {
-               $lrm = "\xE2\x80\x8E"; # LEFT-TO-RIGHT MARK, commonly abbreviated LRM
-               $rlm = "\xE2\x80\x8F"; # RIGHT-TO-LEFT MARK, commonly abbreviated RLM
+               $lrm = "\u{200E}"; # LEFT-TO-RIGHT MARK, commonly abbreviated LRM
+               $rlm = "\u{200F}"; # RIGHT-TO-LEFT MARK, commonly abbreviated RLM
                if ( $opposite ) {
                        return $this->isRTL() ? $lrm : $rlm;
                }
@@ -3960,7 +3958,7 @@ class Language {
                if ( $gender === 'female' ) {
                        return $forms[1];
                }
-               return isset( $forms[2] ) ? $forms[2] : $forms[0];
+               return $forms[2] ?? $forms[0];
        }
 
        /**
index 737c20f..af844ee 100644 (file)
@@ -29,8 +29,8 @@ namespace MediaWiki\Languages\Data;
  * These determine things like interwikis, language selectors, and so on.
  * Safe to change without running scripts on the respective sites.
  *
- * \xE2\x80\x8E is the left-to-right marker and
- * \xE2\x80\x8F is the right-to-left marker.
+ * \u{200E} is the left-to-right marker and
+ * \u{200F} is the right-to-left marker.
  * They are required for ensuring the correct display of brackets in
  * mixed rtl/ltr environment.
  *
@@ -88,8 +88,8 @@ class Names {
                'bcc' => 'جهلسری بلوچی', # Southern Balochi
                'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
                'be' => 'беларуская', # Belarusian normative
-               'be-tarask' => "беларуская (тарашкевіца)\xE2\x80\x8E", # Belarusian in Taraskievica orthography
-               'be-x-old' => "беларуская (тарашкевіца)\xE2\x80\x8E", # (be-tarask compat)
+               'be-tarask' => "беларуская (тарашкевіца)\u{200E}", # Belarusian in Taraskievica orthography
+               'be-x-old' => "беларуская (тарашкевіца)\u{200E}", # (be-tarask compat)
                'bg' => 'български', # Bulgarian
                'bgn' => 'روچ کپتین بلوچی', # Western Balochi
                'bh' => 'भोजपुरी', # Bihari macro language. Falls back to Bhojpuri (bho)
@@ -104,6 +104,7 @@ class Names {
                'br' => 'brezhoneg', # Breton
                'brh' => 'Bráhuí', # Brahui
                'bs' => 'bosanski', # Bosnian
+               'btm' => 'Batak Mandailing', # Batak Mandailing
                'bto' => 'Iriga Bicolano', # Rinconada Bikol
                'bug' => 'ᨅᨔ ᨕᨘᨁᨗ', # Buginese
                'bxr' => 'буряад', # Buryat (Russia)
@@ -121,8 +122,8 @@ class Names {
                'cps' => 'Capiceño', # Capiznon
                'cr' => 'Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ', # Cree
                'crh' => 'qırımtatarca', # Crimean Tatar (multiple scripts - defaults to Latin)
-               'crh-latn' => "qırımtatarca (Latin)\xE2\x80\x8E", # Crimean Tatar (Latin)
-               'crh-cyrl' => "къырымтатарджа (Кирилл)\xE2\x80\x8E", # Crimean Tatar (Cyrillic)
+               'crh-latn' => "qırımtatarca (Latin)\u{200E}", # Crimean Tatar (Latin)
+               'crh-cyrl' => "къырымтатарджа (Кирилл)\u{200E}", # Crimean Tatar (Cyrillic)
                'cs' => 'čeština', # Czech
                'csb' => 'kaszëbsczi', # Cassubian
                'cu' => 'словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ', # Old Church Slavonic (ancient language)
@@ -132,7 +133,7 @@ class Names {
                'de' => 'Deutsch', # German ("Du")
                'de-at' => 'Österreichisches Deutsch', # Austrian German
                'de-ch' => 'Schweizer Hochdeutsch', # Swiss Standard German
-               'de-formal' => "Deutsch (Sie-Form)\xE2\x80\x8E", # German - formal address ("Sie")
+               'de-formal' => "Deutsch (Sie-Form)\u{200E}", # German - formal address ("Sie")
                'din' => 'Thuɔŋjäŋ', # Dinka
                'diq' => 'Zazaki', # Zazaki
                'dsb' => 'dolnoserbski', # Lower Sorbian
@@ -149,7 +150,7 @@ class Names {
                'en-gb' => 'British English', # British English
                'eo' => 'Esperanto', # Esperanto
                'es' => 'español', # Spanish
-               'es-formal' => "español (formal)\xE2\x80\x8E", # Spanish formal address
+               'es-formal' => "español (formal)\u{200E}", # Spanish formal address
                'et' => 'eesti', # Estonian
                'eu' => 'euskara', # Basque
                'ext' => 'estremeñu', # Extremaduran
@@ -169,8 +170,8 @@ class Names {
                'ga' => 'Gaeilge', # Irish
                'gag' => 'Gagauz', # Gagauz
                'gan' => '贛語', # Gan (multiple scripts - defaults to Traditional)
-               'gan-hans' => "赣语(简体)\xE2\x80\x8E", # Gan (Simplified Han)
-               'gan-hant' => "贛語(繁體)\xE2\x80\x8E", # Gan (Traditional Han)
+               'gan-hans' => "赣语(简体)\u{200E}", # Gan (Simplified Han)
+               'gan-hant' => "贛語(繁體)\u{200E}", # Gan (Traditional Han)
                'gcr' => 'kréyòl gwiyanè', # Guianan Creole
                'gd' => 'Gàidhlig', # Scots Gaelic
                'gl' => 'galego', # Galician
@@ -199,7 +200,7 @@ class Names {
                'hsb' => 'hornjoserbsce', # Upper Sorbian
                'ht' => 'Kreyòl ayisyen', # Haitian Creole French
                'hu' => 'magyar', # Hungarian
-               'hu-formal' => "magyar (formal)\xE2\x80\x8E", # Hungarian formal address
+               'hu-formal' => "magyar (formal)\u{200E}", # Hungarian formal address
                'hy' => 'Հայերեն', # Armenian
                'hz' => 'Otsiherero', # Herero
                'ia' => 'interlingua', # Interlingua (IALA)
@@ -233,12 +234,12 @@ class Names {
                'kiu' => 'Kırmancki', # Kirmanjki
                'kj' => 'Kwanyama', # Kwanyama
                'kk' => 'қазақша', # Kazakh (multiple scripts - defaults to Cyrillic)
-               'kk-arab' => "قازاقشا (تٴوتە)\xE2\x80\x8F", # Kazakh Arabic
-               'kk-cyrl' => "қазақша (кирил)\xE2\x80\x8E", # Kazakh Cyrillic
-               'kk-latn' => "qazaqşa (latın)\xE2\x80\x8E", # Kazakh Latin
-               'kk-cn' => "قازاقشا (جۇنگو)\xE2\x80\x8F", # Kazakh (China)
-               'kk-kz' => "қазақша (Қазақстан)\xE2\x80\x8E", # Kazakh (Kazakhstan)
-               'kk-tr' => "qazaqşa (Türkïya)\xE2\x80\x8E", # Kazakh (Turkey)
+               'kk-arab' => "قازاقشا (تٴوتە)\u{200F}", # Kazakh Arabic
+               'kk-cyrl' => "қазақша (кирил)\u{200E}", # Kazakh Cyrillic
+               'kk-latn' => "qazaqşa (latın)\u{200E}", # Kazakh Latin
+               'kk-cn' => "قازاقشا (جۇنگو)\u{200F}", # Kazakh (China)
+               'kk-kz' => "қазақша (Қазақстан)\u{200E}", # Kazakh (Kazakhstan)
+               'kk-tr' => "qazaqşa (Türkïya)\u{200E}", # Kazakh (Turkey)
                'kl' => 'kalaallisut', # Inuktitut, Greenlandic/Greenlandic/Kalaallisut (kal)
                'km' => 'ភាសាខ្មែរ', # Khmer, Central
                'kn' => 'ಕನ್ನಡ', # Kannada
@@ -255,8 +256,8 @@ class Names {
                'ks-deva' => 'कॉशुर', # Kashmiri (Devanagari script)
                'ksh' => 'Ripoarisch', # Ripuarian
                'ku' => 'kurdî', # Kurdish (multiple scripts - defaults to Latin)
-               'ku-latn' => "kurdî (latînî)\xE2\x80\x8E", # Northern Kurdish (Latin script)
-               'ku-arab' => "كوردي (عەرەبی)\xE2\x80\x8F", # Northern Kurdish (Arabic script) (falls back to ckb)
+               'ku-latn' => "kurdî (latînî)\u{200E}", # Northern Kurdish (Latin script)
+               'ku-arab' => "كوردي (عەرەبی)\u{200F}", # Northern Kurdish (Arabic script) (falls back to ckb)
                'kum' => 'къумукъ', # Kumyk (Cyrillic, 'kum-latn' for Latin script)
                'kv' => 'коми', # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
                'kw' => 'kernowek', # Cornish
@@ -317,7 +318,7 @@ class Names {
                'ng' => 'Oshiwambo', # Ndonga
                'niu' => 'Niuē', # Niuean
                'nl' => 'Nederlands', # Dutch
-               'nl-informal' => "Nederlands (informeel)\xE2\x80\x8E", # Dutch (informal address ("je"))
+               'nl-informal' => "Nederlands (informeel)\u{200E}", # Dutch (informal address ("je"))
                'nn' => 'norsk nynorsk', # Norwegian (Nynorsk)
                'no' => 'norsk', # Norwegian macro language (falls back to nb).
                'nov' => 'Novial', # Novial
@@ -400,8 +401,8 @@ class Names {
                'so' => 'Soomaaliga', # Somali
                'sq' => 'shqip', # Albanian
                'sr' => 'српски / srpski', # Serbian (multiple scripts - defaults to Cyrillic)
-               'sr-ec' => "српски (ћирилица)\xE2\x80\x8E", # Serbian Cyrillic ekavian
-               'sr-el' => "srpski (latinica)\xE2\x80\x8E", # Serbian Latin ekavian
+               'sr-ec' => "српски (ћирилица)\u{200E}", # Serbian Cyrillic ekavian
+               'sr-el' => "srpski (latinica)\u{200E}", # Serbian Latin ekavian
                'srn' => 'Sranantongo', # Sranan Tongo
                'ss' => 'SiSwati', # Swati
                'st' => 'Sesotho', # Southern Sotho
@@ -470,15 +471,15 @@ class Names {
                'zea' => 'Zeêuws', # Zeeuws/Zeaws
                'zh' => '中文', # (Zhōng Wén) - Chinese
                'zh-classical' => '文言', # Classical Chinese/Literary Chinese -- (see T10217)
-               'zh-cn' => "中文(中国大陆)\xE2\x80\x8E", # Chinese (PRC)
-               'zh-hans' => "中文(简体)\xE2\x80\x8E", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
-               'zh-hant' => "中文(繁體)\xE2\x80\x8E", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
-               'zh-hk' => "中文(香港)\xE2\x80\x8E", # Chinese (Hong Kong)
+               'zh-cn' => "中文(中国大陆)\u{200E}", # Chinese (PRC)
+               'zh-hans' => "中文(简体)\u{200E}", # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
+               'zh-hant' => "中文(繁體)\u{200E}", # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
+               'zh-hk' => "中文(香港)\u{200E}", # Chinese (Hong Kong)
                'zh-min-nan' => 'Bân-lâm-gú', # Min-nan -- (see T10217)
-               'zh-mo' => "中文(澳門)\xE2\x80\x8E", # Chinese (Macau)
-               'zh-my' => "中文(马来西亚)\xE2\x80\x8E", # Chinese (Malaysia)
-               'zh-sg' => "中文(新加坡)\xE2\x80\x8E", # Chinese (Singapore)
-               'zh-tw' => "中文(台灣)\xE2\x80\x8E", # Chinese (Taiwan)
+               'zh-mo' => "中文(澳門)\u{200E}", # Chinese (Macau)
+               'zh-my' => "中文(马来西亚)\u{200E}", # Chinese (Malaysia)
+               'zh-sg' => "中文(新加坡)\u{200E}", # Chinese (Singapore)
+               'zh-tw' => "中文(台灣)\u{200E}", # Chinese (Taiwan)
                'zh-yue' => '粵語', # Cantonese -- (see T10217)
                'zu' => 'isiZulu' # Zulu
        ];
index 4bbbe6f..0b0f67c 100644 (file)
        "whatlinkshere": "Peunawôt balék",
        "whatlinkshere-title": "Laman nyang mupawôt u $1",
        "whatlinkshere-page": "Miëng:",
-       "linkshere-2": "Laman-laman nyoë meupawôt u '''$1''':",
-       "nolinkshere-2": "Hana halaman nyang teukaw'et u '''$1'''.",
+       "linkshere-2": "Laman-laman nyoë meupawôt u '''$2''':",
+       "nolinkshere-2": "Hana halaman nyang teukaw'et u '''$2'''.",
        "isredirect": "laman peuninah",
        "istemplate": "ngön seunaleuëk",
        "isimage": "peunawôt beureukaih",
index 0cd04d9..91de82f 100644 (file)
        "whatlinkshere": "Мы нэкӀубгъом къэзыщэрэ зэпыщэхэр",
        "whatlinkshere-title": "\"$1\"-м къэзыщэрэ нэкӀубгъохэр",
        "whatlinkshere-page": "НэкӀубгъо:",
-       "linkshere-2": "Мы нэкӀубгъомэ зэпыщэр мыщ къащэ <strong>$1</strong>:",
+       "linkshere-2": "Мы нэкӀубгъомэ зэпыщэр мыщ къащэ <strong>$2</strong>:",
        "isredirect": "езгъэкӀокӀырэ нэкӀубгъо",
        "istemplate": "хэлъхьаныгъэ",
        "isimage": "файл зэпыщэ",
index 2ab8104..7efb9bb 100644 (file)
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
        "whatlinkshere-page": "الپاج:",
-       "linkshere-2": "الصفحات التالية تصل إلى '''$1''':",
-       "nolinkshere-2": "لا توجد صفحات تصل إلى '''$1'''.",
+       "linkshere-2": "الصفحات التالية تصل إلى '''$2''':",
+       "nolinkshere-2": "لا توجد صفحات تصل إلى '''$2'''.",
        "isredirect": "صفحة تحويل",
        "istemplate": "مضمن",
        "isimage": "وصلة ملف",
index 0c3c6a7..6bad339 100644 (file)
        "whatlinkshere": "Skakels hierheen",
        "whatlinkshere-title": "Bladsye wat na \"$1\" skakel",
        "whatlinkshere-page": "Bladsy:",
-       "linkshere-2": "Die volgende bladsye skakel na '''$1''':",
-       "nolinkshere-2": "Geen bladsye skakel na '''$1'''.",
-       "nolinkshere-ns-2": "Geen bladsye skakel na '''$1''' in die verkose naamruimte nie.",
+       "linkshere-2": "Die volgende bladsye skakel na '''$2''':",
+       "nolinkshere-2": "Geen bladsye skakel na '''$2'''.",
+       "nolinkshere-ns-2": "Geen bladsye skakel na '''$2''' in die verkose naamruimte nie.",
        "isredirect": "aanstuurblad",
        "istemplate": "insluiting",
        "isimage": "lêerskakel",
index 57fd482..e559bfa 100644 (file)
        "whatlinkshere": "masasiket katukuh uyniyay a kasabelih",
        "whatlinkshere-title": "masasiket tayza \"$1\" a kasabelih",
        "whatlinkshere-page": "Kasabelih:",
-       "linkshere-2": "isasaay a kasabelih masasiket tazuma tu <strong>$1</strong>:",
-       "nolinkshere-2": "No pages link to <strong>$1</strong>.",
-       "nolinkshere-ns-2": "mapili’ay a pangangananay a salaedan inayi’ kasabelih  masasiket tu $1.",
+       "linkshere-2": "isasaay a kasabelih masasiket tazuma tu <strong>$2</strong>:",
+       "nolinkshere-2": "No pages link to <strong>$2</strong>.",
+       "nolinkshere-ns-2": "mapili’ay a pangangananay a salaedan inayi’ kasabelih  masasiket tu $2.",
        "isredirect": "miliyaw patatuzu’",
        "istemplate": "palaculen tu kasabelih",
        "isimage": "tangan-tangan misiket",
index 4989c5d..2f1bf61 100644 (file)
        "whatlinkshere": "Vegzat me këtu",
        "whatlinkshere-title": "Faqe që lidhen me \"$1\"",
        "whatlinkshere-page": "Faqja:",
-       "linkshere-2": "Faqet e mâposhtme lidhen në '''$1''':",
+       "linkshere-2": "Faqet e mâposhtme lidhen në '''$2''':",
        "isredirect": "faqe përcjellëse",
        "istemplate": "përfshirë",
        "isimage": "vegëz në figurë",
index f9f475d..b3d02f8 100644 (file)
        "whatlinkshere": "ወዲህ የሚያያዝ",
        "whatlinkshere-title": "ከ «$1» ጋር የሚያያዙ ገጾች",
        "whatlinkshere-page": "ለገጽ (አርዕስት)፦",
-       "linkshere-2": "የሚከተሉት ገጾች ወደ '''$1''' ተያይዘዋል።",
-       "nolinkshere-2": "ወደ '''$1''' የተያያዘ ገጽ የለም።",
-       "nolinkshere-ns-2": "ባመለከቱት ክፍለ-ዊኪ ወደ '''$1''' የተያያዘ ገጽ የለም።",
+       "linkshere-2": "የሚከተሉት ገጾች ወደ '''$2''' ተያይዘዋል።",
+       "nolinkshere-2": "ወደ '''$2''' የተያያዘ ገጽ የለም።",
+       "nolinkshere-ns-2": "ባመለከቱት ክፍለ-ዊኪ ወደ '''$2''' የተያያዘ ገጽ የለም።",
        "isredirect": "መምሪያ መንገድ",
        "istemplate": "የተሰካ",
        "isimage": "የምስል ማያያዣ",
index 3e54a4a..bef9f04 100644 (file)
        "logempty": "No bi ha garra elemento en o rechistro con ixas carauteristicas.",
        "log-title-wildcard": "Mirar títols que prencipien con iste texto",
        "allpages": "Todas as pachinas",
-       "nextpage": "Siguient pachina ($1)",
+       "nextpage": "Pachina siguient ($1)",
        "prevpage": "Pachina anterior ($1)",
        "allpagesfrom": "Amostrar as pachinas que prencipien por:",
        "allpagesto": "Amostrar as pachinas que rematen en:",
        "whatlinkshere": "Pachinas que enlazan con ista",
        "whatlinkshere-title": "Pachinas que tienen vinclos ta $1",
        "whatlinkshere-page": "Pachina:",
-       "linkshere-2": "As siguients pachinas tienen vinclos enta '''$1''':",
-       "nolinkshere-2": "Garra pachina tiene vinclos ta '''$1'''.",
-       "nolinkshere-ns-2": "Garra pachina d'o espacio de nombres trigato tiene vinclos ta '''$1'''.",
+       "linkshere-2": "As siguients pachinas tienen vinclos enta '''$2''':",
+       "nolinkshere-2": "Garra pachina tiene vinclos ta '''$2'''.",
+       "nolinkshere-ns-2": "Garra pachina d'o espacio de nombres trigato tiene vinclos ta '''$2'''.",
        "isredirect": "pachina reendrezata",
        "istemplate": "incluyida",
        "isimage": "Vinclo ta un fichero",
index e833c1b..2020d36 100644 (file)
        "whatlinkshere": "Hwæt hæfþ hlencan hider",
        "whatlinkshere-title": "Trametas þā habbaþ hlencan tō \"$1\"",
        "whatlinkshere-page": "Tramet:",
-       "linkshere-2": "Þā folgiendan trametas habbaþ hlencan tō: '''$1'''",
-       "nolinkshere-2": "Nǣnge trametas habbaþ hlencan tō '''$1'''.",
+       "linkshere-2": "Þā folgiendan trametas habbaþ hlencan tō: '''$2'''",
+       "nolinkshere-2": "Nǣnge trametas habbaþ hlencan tō '''$2'''.",
        "isredirect": "edlǣdunge tramet",
        "istemplate": "bysene nytt",
        "isimage": "ymelan hlenca",
index 8382f17..0b8e23b 100644 (file)
        "whatlinkshere": "एन्जां की जुड़तै",
        "whatlinkshere-title": "$1 सं॑ जुड़लऽ पन्ना",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere-2": "नीचे के सब पन्ना '''$1''' स॑ जुड़लऽ:",
-       "nolinkshere-2": "<strong>$1</strong> स॑ कोय भी पन्ना नै जुड़लऽ छै।",
+       "linkshere-2": "नीचे के सब पन्ना '''$2''' स॑ जुड़लऽ:",
+       "nolinkshere-2": "<strong>$2</strong> स॑ कोय भी पन्ना नै जुड़लऽ छै।",
        "isredirect": "पुन: निर्दिष्ट पन्ना",
        "istemplate": "मिलाबऽ",
        "isimage": "फाइल लिंक",
index 97b37ff..446d0a2 100644 (file)
        "whatlinkshere": "ماذا يصل هنا",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
        "whatlinkshere-page": "الصفحة:",
-       "linkshere-2": "الصفحات التالية تصل إلى '''$1''':",
-       "nolinkshere-2": "لا توجد صفحات تصل إلى '''$1'''.",
-       "nolinkshere-ns-2": "لا تصل أي صفحة إلى '''$1''' في النطاق المختار.",
+       "linkshere-2": "الصفحات التالية تصل إلى <strong>$2</strong>:",
+       "nolinkshere-2": "لا توجد صفحات تصل إلى <strong>$2</strong>.",
+       "nolinkshere-ns-2": "لا تصل أي صفحة إلى '''$2''' في النطاق المختار.",
        "isredirect": "صفحة تحويل",
        "istemplate": "مضمن",
        "isimage": "وصلة ملف",
index 15b1e3e..5acd30b 100644 (file)
        "whatlinkshere": "ܡܐ ܐܣܪ ܠܗܪܟܐ",
        "whatlinkshere-title": "ܦܐܬܬ̈ܐ ܕܐܣܝܪܝܢ ܥܡ \"$1\"",
        "whatlinkshere-page": "ܦܐܬܐ:",
-       "linkshere-2": "ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܝܪܝܢ ܥܡ '''$1''':",
-       "nolinkshere-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$1'''.",
-       "nolinkshere-ns-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$1''' ܒܚܩܠܐ ܓܒܝܐ.",
+       "linkshere-2": "ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܝܪܝܢ ܥܡ '''$2''':",
+       "nolinkshere-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$2'''.",
+       "nolinkshere-ns-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$2''' ܒܚܩܠܐ ܓܒܝܐ.",
        "isredirect": "ܦܐܬܐ ܕܨܘܝܒܐ",
        "istemplate": "ܚܒܝܫܬܐ",
        "isimage": "ܐܣܘܪܐ ܕܠܦܦܐ",
index 1ca78c1..4a44136 100644 (file)
        "whatlinkshere": "Lasulu faw püle",
        "whatlinkshere-title": "Wülngiñ nülkükawlelu \"$1\"",
        "whatlinkshere-page": "Pakina:",
-       "linkshere-2": "Tüfachi wülngiñ nülkükawley '''$1''':",
-       "nolinkshere-2": "Chem wülngiñ no rume nülkükawlelu '''$1'''.",
+       "linkshere-2": "Tüfachi wülngiñ nülkükawley '''$2''':",
+       "nolinkshere-2": "Chem wülngiñ no rume nülkükawlelu '''$2'''.",
        "isredirect": "wüñongünen wülngiñ",
        "istemplate": "yomtukudungu",
        "isimage": "Adentun lasun",
index 0367678..25da2ab 100644 (file)
        "whatlinkshere": "شنوّ يوصّل ل هنا",
        "whatlinkshere-title": "الباجات اللي تقين في \"$1\"",
        "whatlinkshere-page": "الباجه:",
-       "linkshere-2": "هاذ الباجات يوصلو إلى '''$1''':",
-       "nolinkshere-2": "ما كانش  باجه فيها وصيله ل'''$1'''.",
+       "linkshere-2": "هاذ الباجات يوصلو إلى '''$2''':",
+       "nolinkshere-2": "ما كانش  باجه فيها وصيله ل'''$2'''.",
        "isredirect": "باجت تحويل",
        "istemplate": "تضمين",
        "isimage": "وصيلة ملف",
index c412556..6320882 100644 (file)
        "whatlinkshere": "Ṣefḫaṫ mlaqyin",
        "whatlinkshere-title": "Ṣ-Ṣefḫaṫ li mlaqyin mĝa \"$1\"",
        "whatlinkshere-page": "ṣfḫa:",
-       "linkshere-2": "Had ṣ-ṣefḫaṫ kayddiw le '''$1''':",
-       "nolinkshere-2": "ḫṫa ċi ṣfḫa ma ka-twṣṣel l-'''$1'''.",
-       "nolinkshere-ns-2": "ḫṫṫĝ ṣfḫa ma ka-twṣṣal l-'''$1''' f-nnitaq lli ĥṫariṫi",
+       "linkshere-2": "Had ṣ-ṣefḫaṫ kayddiw le '''$2''':",
+       "nolinkshere-2": "ḫṫa ċi ṣfḫa ma ka-twṣṣel l-'''$2'''.",
+       "nolinkshere-ns-2": "ḫṫṫĝ ṣfḫa ma ka-twṣṣal l-'''$2''' f-nnitaq lli ĥṫariṫi",
        "isredirect": "Ṫeḫwil ṣ-ṣefḫa",
        "istemplate": "Daĥel",
        "isimage": "wṣlṫ l-milef",
index c392c6a..6c85c59 100644 (file)
        "whatlinkshere": "ايه بيوصل هنا",
        "whatlinkshere-title": "الصفحات اللى بتوصل لـ \"$1\"",
        "whatlinkshere-page": "الصفحة:",
-       "linkshere-2": "الصفحات دى فيها وصله ل '''$1''':",
-       "nolinkshere-2": "مافيش صفحات بتوصل ل '''$1'''.",
-       "nolinkshere-ns-2": "مافيش صفحات بتوصل لـ '''$1''' فى النطاق اللى انت اختارته.",
+       "linkshere-2": "الصفحات دى فيها وصله ل '''$2''':",
+       "nolinkshere-2": "مافيش صفحات بتوصل ل '''$2'''.",
+       "nolinkshere-ns-2": "مافيش صفحات بتوصل لـ '''$2''' فى النطاق اللى انت اختارته.",
        "isredirect": "صفحة تحويل",
        "istemplate": "متضمن",
        "isimage": "وصلة ملف",
index f7772e1..51c4582 100644 (file)
        "whatlinkshere": "ইয়ালৈ থকা সংযোগসমূহ",
        "whatlinkshere-title": "\"$1\"লৈ সংযোজিত পৃষ্ঠাসমূহ",
        "whatlinkshere-page": "পৃষ্ঠা:",
-       "linkshere-2": "এই পৃষ্ঠাটো '''$1''' ৰ লগত সংযোজিত:",
-       "nolinkshere-2": "'''$1''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
-       "nolinkshere-ns-2": "নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা $1লৈ সংযোগ নাই ।",
+       "linkshere-2": "এই পৃষ্ঠাটো '''$2''' ৰ লগত সংযোজিত:",
+       "nolinkshere-2": "'''$2''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
+       "nolinkshere-ns-2": "নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা $2লৈ সংযোগ নাই ।",
        "isredirect": "পুনঃনিৰ্দেশনা পৃষ্ঠা",
        "istemplate": "অন্তৰ্ভুক্ত কৰক",
        "isimage": "নথিৰ সংযোগ",
index 1a15227..a5ff32b 100644 (file)
        "protectedtitles-submit": "Amosar títulos",
        "listusers": "Llista d'usuarios",
        "listusers-editsonly": "Amosar namái usuarios con ediciones",
+       "listusers-temporarygroupsonly": "Amosar solo usuarios en grupos d'usuariu temporales",
        "listusers-creationsort": "Ordenar por data de creación",
        "listusers-desc": "Ordenar n'orde descendente",
        "usereditcount": "$1 {{PLURAL:$1|edición|ediciones}}",
        "dellogpage": "Rexistru de desanicios",
        "dellogpagetext": "Más abaxo ta la llista de los desanicios más recién.",
        "deletionlog": "rexistru de desanicios",
+       "log-name-create": "Rexistru de creación de páxines",
+       "log-description-create": "Más abaxo ta la llista de les creaciones de páxines más recién.",
+       "logentry-create-create": "$1 {{GENDER:$2|creó}} la páxina $3",
        "reverted": "Revertida a una revisión anterior",
        "deletecomment": "Motivu:",
        "deleteotherreason": "Motivu distintu/adicional:",
        "whatlinkshere": "Lo qu'enllaza equí",
        "whatlinkshere-title": "Páxines qu’enllacien a «$1»",
        "whatlinkshere-page": "Páxina:",
-       "linkshere-2": "Les páxines siguientes enllacien a '''$1''':",
-       "nolinkshere-2": "Nenguna páxina enllaza a '''$1'''.",
-       "nolinkshere-ns-2": "Nenguna páxina enllaza con <strong>$1</strong> nel espaciu de nomes escoyíu.",
+       "linkshere-2": "Les páxines siguientes enllacien a <strong>$2</strong>:",
+       "nolinkshere-2": "Nenguna páxina enllaza a <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Nenguna páxina enllaza con <strong>$2</strong> nel espaciu de nomes escoyíu.",
        "isredirect": "páxina de redireición",
        "istemplate": "tresclusión",
        "isimage": "enllaz al ficheru",
        "pagedata-text": "Esta páxina ufre una interfaz de datos pa les páxines. Escribe'l títulu de la páxina na URL, usando la sintaxis de subpáxina.\n* Aplícase la negociación de conteníu en base a la testera Accept del to cliente. Esto significa que los datos de la páxina van dase nel formatu que prefiera'l to cliente.",
        "pagedata-not-acceptable": "Nun s'alcontró nengún formatu que coincidiera. Tipos MIME soportaos: $1",
        "pagedata-bad-title": "Títulu inválidu: $1.",
-       "unregistered-user-config": "Por motivos de seguridá, les subpáxines d'usuariu JavaScript, CSS y JSON nun pueden cargase pa usuarios ensin rexistrar."
+       "unregistered-user-config": "Por motivos de seguridá, les subpáxines d'usuariu JavaScript, CSS y JSON nun pueden cargase pa usuarios ensin rexistrar.",
+       "passwordpolicies": "Polítiques pa les contraseñes",
+       "passwordpolicies-summary": "Esta ye una llista de polítiques de contraseñes efeutives pa los grupos d'usuarios definíos nesta wiki.",
+       "passwordpolicies-group": "Grupu",
+       "passwordpolicies-policies": "Polítiques",
+       "passwordpolicies-policy-minimalpasswordlength": "La contraseña tien de tener polo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "La contraseña tien de tener polo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}} pa poder aniciar sesión",
+       "passwordpolicies-policy-passwordcannotmatchusername": "La contraseña nun puede ser la mesma que'l nome d'usuariu",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "La contraseña nun puede casar con contraseñes torgaes específicamente",
+       "passwordpolicies-policy-maximalpasswordlength": "La llonxitú de la contraseña tien de ser menor que {{PLURAL:$1|1 caráuter|$1 caráuteres}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "La contraseña nun puede {{PLURAL:$1|ser la contraseña más popular|tar na llista de $1 contraseñes populares}}"
 }
index 185574b..a7b2b4e 100644 (file)
        "whatlinkshere": "Kaskina ickwemakina ka witci acteki",
        "whatlinkshere-title": "Masinahikan nte mia ka ici tapitik \"$1\"",
        "whatlinkshere-page": "Masinahikan:",
-       "linkshere-2": "Masinhikan ka ici tapitik <strong>$1</strong>:",
+       "linkshere-2": "Masinhikan ka ici tapitik <strong>$2</strong>:",
        "isredirect": "masinhikan ke kweskiticohemikok",
        "istemplate": "ka ki acotcipitcikatek",
        "isimage": "e ici tapitik masinahikaniwoc",
index 92939aa..7a6e595 100644 (file)
        "whatlinkshere": "Gluyarakiraf bueem",
        "whatlinkshere-title": "Bu gluyasu va \"$1\"",
        "whatlinkshere-page": "Bu :",
-       "linkshere-2": "Van batu bu vlevef bueem va gluyasiki ruldar : '''$1'''",
-       "nolinkshere-2": "Van batu bu nedoyu bu va gluyasiki ruldar : '''$1'''",
-       "nolinkshere-ns-2": "Koe kiblayano yoltxo meku bu gluyasikikirafu gu '''$1'''.",
+       "linkshere-2": "Van batu bu vlevef bueem va gluyasiki ruldar : '''$2'''",
+       "nolinkshere-2": "Van batu bu nedoyu bu va gluyasiki ruldar : '''$2'''",
+       "nolinkshere-ns-2": "Koe kiblayano yoltxo meku bu gluyasikikirafu gu '''$2'''.",
        "isredirect": "graskarabu",
        "istemplate": "kodoplekura",
        "isimage": "skedasiki va ewava",
index db933ef..acd0a07 100644 (file)
        "whatlinkshere": "हिँया का जोडान अहै",
        "whatlinkshere-title": "$1 से जोडान पन्ना",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere-2": "नीचे दिहा पन्ना '''$1''' से जोडान है:",
-       "nolinkshere-2": "'''$1''' से कुछ नाइ जोडान् है।",
-       "nolinkshere-ns-2": "चुनल नामस्थानसे '''$1''' से कवनो पन्ना नाइ जोडान् है।",
+       "linkshere-2": "नीचे दिहा पन्ना '''$2''' से जोडान है:",
+       "nolinkshere-2": "'''$2''' से कुछ नाइ जोडान् है।",
+       "nolinkshere-ns-2": "चुनल नामस्थानसे '''$2''' से कवनो पन्ना नाइ जोडान् है।",
        "isredirect": "पुनर्निर्देशन पन्ना",
        "istemplate": "मिलावा जाय",
        "isimage": "फ़ाइल कय कड़ी",
index c7afe94..fbb6576 100644 (file)
        "whatlinkshere": "Bu səhifəyə bağlantılar",
        "whatlinkshere-title": "\"$1\" məqaləsinə keçid verən səhifələr",
        "whatlinkshere-page": "Səhifə:",
-       "linkshere-2": "'''$1''' səhifəsinə keçid verən səhifələr:",
-       "nolinkshere-2": "<strong>$1</strong> səhifəsinə keçid verən səhifə yoxdur.",
-       "nolinkshere-ns-2": "Seçilmiş ad aralığında heç bir səhifə '''$1''' səhifəsinə keçid vermir.",
+       "linkshere-2": "'''$2''' səhifəsinə keçid verən səhifələr:",
+       "nolinkshere-2": "<strong>$2</strong> səhifəsinə keçid verən səhifə yoxdur.",
+       "nolinkshere-ns-2": "Seçilmiş ad aralığında heç bir səhifə '''$2''' səhifəsinə keçid vermir.",
        "isredirect": "İstiqamətləndirmə səhifəsi",
        "istemplate": "daxil olmuş",
        "isimage": "şəkil üçün keçid",
index 4ec9935..1ed9513 100644 (file)
        "whatlinkshere": "بۇ صفحه‌‌يه باغلانتیلار",
        "whatlinkshere-title": "«$1»-ه باغلانان صفحه‌لر",
        "whatlinkshere-page": "صفحه:",
-       "linkshere-2": "آشاغیداکی صفحه‌لر '''$1'''-ه باغلانیب:",
-       "nolinkshere-2": "<strong>$1</strong>-ه هئچ بیر صفحه باغلانماییب‌دیر.",
-       "nolinkshere-ns-2": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''$1'''-ه باغلانتی‌سی یوخدور.",
+       "linkshere-2": "آشاغیداکی صفحه‌لر '''$2'''-ه باغلانیب:",
+       "nolinkshere-2": "<strong>$2</strong>-ه هئچ بیر صفحه باغلانماییب‌دیر.",
+       "nolinkshere-ns-2": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''$2'''-ه باغلانتی‌سی یوخدور.",
        "isredirect": "یوللاندیرما صفحه‌سی",
        "istemplate": "داخیل اولموش",
        "isimage": "فایلا باغلانتی",
index 033c601..6d2c238 100644 (file)
        "whatlinkshere": "Бында һылтанмалар",
        "whatlinkshere-title": "«$1» битенә һылтанған биттәр",
        "whatlinkshere-page": "Бит:",
-       "linkshere-2": "'''$1''' битенә киләһе биттәр һылтана:",
-       "nolinkshere-2": "'''$1''' битенә бер бит тә һылтанмай.",
-       "nolinkshere-ns-2": "'''$1''' битенә һайланған исемдәр арауығынан бер бит тә һылтанмай.",
+       "linkshere-2": "'''$2''' битенә киләһе биттәр һылтана:",
+       "nolinkshere-2": "'''$2''' битенә бер бит тә һылтанмай.",
+       "nolinkshere-ns-2": "'''$2''' битенә һайланған исемдәр арауығынан бер бит тә һылтанмай.",
        "isredirect": "йүнәлтеү бите",
        "istemplate": "ҡушылған",
        "isimage": "файл һылтанмаһы",
index 4ca49b6..f9e733e 100644 (file)
        "whatlinkshere": "Links af de Seitn",
        "whatlinkshere-title": "Seitn, wo af „$1“ valinka",
        "whatlinkshere-page": "Seitn:",
-       "linkshere-2": "De foigandn Seitn valinka af '''„$1“''':",
-       "nolinkshere-2": "Koa Seitn valinkt af '''„$1“'''.",
+       "linkshere-2": "De foigandn Seitn valinka af '''„$2“''':",
+       "nolinkshere-2": "Koa Seitn valinkt af '''„$2“'''.",
        "isredirect": "Weidaloatungsseitn",
        "istemplate": "Vorlogneinbindung",
        "isimage": "Dateilink",
index a15010d..2177ae2 100644 (file)
        "whatlinkshere": "ای لینکی که ادا هست",
        "whatlinkshere-title": "صفحاتی که لینگ بوتگنت په \"$1\"",
        "whatlinkshere-page": "صفحه:",
-       "linkshere-2": "جهلیگی صفحات لینک بوت '''$1''':",
-       "nolinkshere-2": "هچ لینک صفحه ای په '''$1'''.",
-       "nolinkshere-ns-2": "هج صفحه ای لینک نهنت په '''$1''' ته ای انتخابی نام فضا",
+       "linkshere-2": "جهلیگی صفحات لینک بوت '''$2''':",
+       "nolinkshere-2": "هچ لینک صفحه ای په '''$2'''.",
+       "nolinkshere-ns-2": "هج صفحه ای لینک نهنت په '''$2''' ته ای انتخابی نام فضا",
        "isredirect": "صفحه غیر مستقیم",
        "istemplate": "همراهی",
        "isimage": "لینک عکس",
index a839c35..87604d3 100644 (file)
        "whatlinkshere": "Ano an mga makasugpon digde",
        "whatlinkshere-title": "Mga pahina na nakasugpon sa \"$1\"",
        "whatlinkshere-page": "Pahina:",
-       "linkshere-2": "An mga minasunod na pahina isinusugpon sa '''$1''':",
-       "nolinkshere-2": "Mayong mga pahinang kasugpon sa '''$1'''.",
-       "nolinkshere-ns-2": "Mayong pahina na nakatakod sa '''$1''' sa piniling ngaran-espacio.",
+       "linkshere-2": "An mga minasunod na pahina isinusugpon sa '''$2''':",
+       "nolinkshere-2": "Mayong mga pahinang kasugpon sa '''$2'''.",
+       "nolinkshere-ns-2": "Mayong pahina na nakatakod sa '''$2''' sa piniling ngaran-espacio.",
        "isredirect": "palikwaton an pahina",
        "istemplate": "pinagkabalihan",
        "isimage": "kasugpon nin sagunson",
index 2e353e6..5fec93c 100644 (file)
        "ignorewarnings": "Ігнараваць усе папярэджаньні",
        "minlength1": "Назва файлу павінна ўтрымліваць хаця б адну літару.",
        "illegalfilename": "Назва файлу «$1» зьмяшчае сымбалі, якія нельга выкарыстоўваць у назвах старонак. Калі ласка, зьмяніце назву файлу і паспрабуйце загрузіць яго зноў.",
-       "filename-toolong": "Назвы файлаў ня могуць быць даўжэй 240 байтаў.",
-       "badfilename": "Назва файла была зьмененая на «$1».",
-       "filetype-mime-mismatch": "Пашырэньне файла «.$1» не адпавядае выяўленаму MIME-тыпу файла ($2).",
+       "filename-toolong": "Назвы файлаў ня могуць быць даўжэй за 240 байтаў.",
+       "badfilename": "Назва файлу была зьмененая на «$1».",
+       "filetype-mime-mismatch": "Пашырэньне файлу «.$1» не адпавядае выяўленаму MIME-тыпу файлу ($2).",
        "filetype-badmime": "Загрузка файлаў тыпу MIME «$1» забароненая.",
        "filetype-bad-ie-mime": "Немагчыма загрузіць гэты файл, таму што Internet Explorer вызначыў яго як «$1», што азначае, што тып гэтага файла забаронены і патэнцыяльна небясьпечны.",
        "filetype-unwanted-type": "<strong>«.$1»</strong> — непажаданы тып файла.\n{{PLURAL:$3|1=Пажаданым тыпам файла зьяўляецца|Пажаданымі тыпамі файлаў зьяўляюцца:}} $2.",
        "dellogpage": "Журнал выдаленьняў",
        "dellogpagetext": "Сьпіс апошніх выдаленьняў.",
        "deletionlog": "журнал выдаленьняў",
+       "log-name-create": "Журнал стварэньня старонак",
+       "log-description-create": "Ніжэй знаходзіцца сьпіс апошніх стварэньняў старонак.",
        "reverted": "Вернутая да папярэдняй вэрсіі",
        "deletecomment": "Прычына:",
        "deleteotherreason": "Іншая/дадатковая прычына:",
        "whatlinkshere": "Спасылкі на старонку",
        "whatlinkshere-title": "Старонкі, якія спасылаюцца на $1",
        "whatlinkshere-page": "Старонка:",
-       "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$1</strong>:",
-       "nolinkshere-2": "Ніводная старонка не спасылаецца на <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Ніводная старонка не спасылаецца на '''$1''' з выбранай прасторы назваў.",
+       "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$2</strong>:",
+       "nolinkshere-2": "Ніводная старонка не спасылаецца на <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Ніводная старонка не спасылаецца на <strong>$2</strong> з абранай прасторы назваў.",
        "isredirect": "старонка-перанакіраваньне",
        "istemplate": "уключэньне",
        "isimage": "спасылка на файл",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "Пароль мусіць мець даўжыню найменш $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}, каб уваходзіць у сыстэму",
        "passwordpolicies-policy-passwordcannotmatchusername": "Пароль ня можа супадаць зь імем ўдзельніка",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Пароль ня можа супадаць з паролямі з чорнага сьпісу",
-       "passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}"
+       "passwordpolicies-policy-maximalpasswordlength": "Пароль мусіць быць даўжынёй менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "Пароль ня можа {{PLURAL:$1|супадаць з самым папулярным паролем|быць зь сьпісу $1 папулярных пароляў}}"
 }
index 71c2d94..bd3e0cf 100644 (file)
        "whatlinkshere": "Сюды спасылаюцца",
        "whatlinkshere-title": "Старонкі, якія спасылаюцца на \"$1\"",
        "whatlinkshere-page": "Старонка:",
-       "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$1</strong>:",
-       "nolinkshere-2": "Няма старонак, якія б спасылаліся на '''$1'''.",
-       "nolinkshere-ns-2": "Няма старонак, якія б спасылаліся на '''$1''' у гэтай прасторы назваў.",
+       "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$2</strong>:",
+       "nolinkshere-2": "Няма старонак, якія б спасылаліся на '''$2'''.",
+       "nolinkshere-ns-2": "Няма старонак, якія б спасылаліся на '''$2''' у гэтай прасторы назваў.",
        "isredirect": "старонка-перасылка",
        "istemplate": "уключэнне",
        "isimage": "Спасылка на выяву",
index 40b3be4..a277382 100644 (file)
        "whatlinkshere": "Какво сочи насам",
        "whatlinkshere-title": "Страници, които сочат към „$1“",
        "whatlinkshere-page": "Страница:",
-       "linkshere-2": "Следните страници сочат към <strong>$1</strong>:",
-       "nolinkshere-2": "Няма страници, сочещи към <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Няма страници, сочещи към $1 в избраното именно пространство.",
+       "linkshere-2": "Следните страници сочат към <strong>$2</strong>:",
+       "nolinkshere-2": "Няма страници, сочещи към <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Няма страници, сочещи към $2 в избраното именно пространство.",
        "isredirect": "пренасочваща страница",
        "istemplate": "включване",
        "isimage": "препратка към файла",
index bbf7078..f016a18 100644 (file)
        "whatlinkshere": "لینک په ای تاکدیما",
        "whatlinkshere-title": "تاکدیمان که گو  «$1» لینک دارنت",
        "whatlinkshere-page": "تاکدیم:",
-       "linkshere-2": "جهلگین دیم بئ  '''$1''' ئا لینک داریت:",
-       "nolinkshere-2": "هیچ دیمی بئ  '''$1''' ئا لینک نه داریت.",
-       "nolinkshere-ns-2": "هیچ دیمی شه انتخاب بوته ئین نامی فضائان بئ  '''$1''' ئا لینک نداریت.",
+       "linkshere-2": "جهلگین دیم بئ  '''$2''' ئا لینک داریت:",
+       "nolinkshere-2": "هیچ دیمی بئ  '''$2''' ئا لینک نه داریت.",
+       "nolinkshere-ns-2": "هیچ دیمی شه انتخاب بوته ئین نامی فضائان بئ  '''$2''' ئا لینک نداریت.",
        "isredirect": "تاکدیمی تغییرمسیر داتین",
        "istemplate": "تراگنجانش‌هان",
        "isimage": "فایل لینک",
index 0468272..c1fcd51 100644 (file)
        "whatlinkshere": "इहाँ का जुड़ल बा",
        "whatlinkshere-title": "पन्ना जेवन \"$1\" से जुड़ल बा",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere-2": "<strong>$1</strong> से नीचे दिहल पन्ना जुड़ल बाने:",
-       "nolinkshere-2": "'''$1''' से कौनो पन्ना नइखे जुड़ल।",
-       "nolinkshere-ns-2": "चुनल गईल सन्दर्भ में '''$1''' से कौनो पन्ना ना जुड़ेला।",
+       "linkshere-2": "<strong>$2</strong> से नीचे दिहल पन्ना जुड़ल बाने:",
+       "nolinkshere-2": "'''$2''' से कौनो पन्ना नइखे जुड़ल।",
+       "nolinkshere-ns-2": "चुनल गईल सन्दर्भ में '''$2''' से कौनो पन्ना ना जुड़ेला।",
        "isredirect": "अनुप्रेषित पन्ना",
        "istemplate": "ट्रांस्क्लूजन",
        "isimage": "फाइल कड़ी",
index 1e3d606..df01397 100644 (file)
        "whatlinkshere": "Tautan apa di sia",
        "whatlinkshere-title": "Tungkaran-tungkaran nang batautan ka ''$1''",
        "whatlinkshere-page": "Tungkaran:",
-       "linkshere-2": "Tungkaran-tungkaran barikut batautan ka '''$1''':",
-       "nolinkshere-2": "Kadada tutungkaran tataut ka '''$1'''.",
-       "nolinkshere-ns-2": "Kadada tutungkaran tataut ka '''$1''' dalam ruang-ngaran nang dipilih.",
+       "linkshere-2": "Tungkaran-tungkaran barikut batautan ka '''$2''':",
+       "nolinkshere-2": "Kadada tutungkaran tataut ka '''$2'''.",
+       "nolinkshere-ns-2": "Kadada tutungkaran tataut ka '''$2''' dalam ruang-ngaran nang dipilih.",
        "isredirect": "tungkaran paugahan",
        "istemplate": "transklusi",
        "isimage": "tautan barakas",
index d92ed63..8245a5f 100644 (file)
        "botpasswords-existing": "বিদ্যমান বট পাসওয়ার্ড",
        "botpasswords-createnew": "একটি নতুন বট পাসওয়ার্ড তৈরি করুন",
        "botpasswords-editexisting": "একটি বিদ্যমান বট পাসওয়ার্ড পরিবর্তন করুন",
+       "botpasswords-label-needsreset": "(পাসওয়ার্ড পুনঃস্থাপন করা প্রয়োজন)",
        "botpasswords-label-appid": "বটের নাম:",
        "botpasswords-label-create": "তৈরি করুন",
        "botpasswords-label-update": "হালনাগাদ করুন",
        "botpasswords-restriction-failed": "বট পাসওয়ার্ডের সীমাবদ্ধতার কারণে অ্যাকাউন্টে প্রবেশের এই প্রচেষ্টাটিকে প্রতিরোধ করা হয়েছে।",
        "botpasswords-invalid-name": "নির্দিষ্টকৃত ব্যবহারকারী নামটিতে বট পাসওয়ার্ড পৃথকীকারক অক্ষরটি (\"$1\") নেই।",
        "botpasswords-not-exist": "ব্যবহারকারী \"$1\"-এর \"$2\" নামক বট পাসওয়ার্ডটি নেই।",
+       "botpasswords-needs-reset": "{{GENDER:$1|ব্যবহারকারী}} \"$1\"-এর \"$2\" নামের বটের জন্য বট পাসওয়ার্ড অবশ্যই পুনঃস্থাপন করা প্রয়োজন।",
        "resetpass_forbidden": "পাসওয়ার্ড পরিবর্তন করা সম্ভব নয়",
        "resetpass_forbidden-reason": "পাসওয়ার্ড পরিবর্তন করা যাবে না: $1",
        "resetpass-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই অ্যাকাউন্টে প্রবেশ করতে হবে।",
        "listusers-creationsort": "তৈরির তারিখ অনুসারে সাজাও",
        "listusers-desc": "বড় থেকে ছোট ক্রম অনুযায়ী সাজাও",
        "usereditcount": "$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনা}}",
-       "usercreated": "{{GENDER:$3|তà§\88রি à¦¹à¦¯à¦¼à§\87à¦\9bà§\87}} $1 à¦¤à¦¾à¦°à¦¿à¦\96, à¦¸à¦®à¦¯à¦¼: $2",
+       "usercreated": "{{GENDER:$3|তà§\88রি à¦¹à¦¬à¦¾à¦°}} à¦¤à¦¾à¦°à¦¿à¦\96 $1, à¦¸à¦®à¦¯à¦¼ $2",
        "newpages": "নতুন পাতাসমূহ",
        "newpages-submit": "দেখাও",
        "newpages-username": "ব্যবহারকারী নাম:",
        "whatlinkshere": "সংযোগকারী পাতাসমূহ",
        "whatlinkshere-title": "যে পাতাগুলি থেকে \"$1\"-এর প্রতি সংযোগ আছে",
        "whatlinkshere-page": "পাতা:",
-       "linkshere-2": "নিচের পাতাসমূহ '''$1''' পাতায় সংযুক্ত আছে:",
-       "nolinkshere-2": "কোনো পাতা থেকে '''$1''' পাতায় সংযোগ নেই।",
-       "nolinkshere-ns-2": "নির্বাচিত নামস্থানে '''$1'''-এর প্রতি কোন পাতা থেকে সংযোগ নেই।",
+       "linkshere-2": "নিচের পাতাসমূহ <strong>$2</strong> পাতায় সংযুক্ত আছে:",
+       "nolinkshere-2": "কোনো পাতা থেকে <strong>$2</strong> পাতায় সংযোগ নেই।",
+       "nolinkshere-ns-2": "নির্বাচিত নামস্থানে <strong>$2</strong> -এর প্রতি কোন পাতা থেকে সংযোগ নেই।",
        "isredirect": "পুনর্নির্দেশ",
        "istemplate": "অন্তর্ভুক্তি",
        "isimage": "ফাইল সংযোগ",
        "pagedata-title": "পাতার উপাত্ত",
        "pagedata-not-acceptable": "কোন মিলে যাওয়া বিন্যাস পাওয়া যায় নি। সমর্থিত MIME ধরনগুলি হল: $1",
        "pagedata-bad-title": "অপ্রযোজ্য শিরোনাম: \"$1\"",
+       "unregistered-user-config": "নিরাপত্তার কারণে জাভাস্ক্রিপ্ট, CSS এবং JSON ব্যবহারকারী উপপাতাগুলি অনিবন্ধিত ব্যবহারকারীদের জন্য লোড করা যাবে না।",
+       "passwordpolicies": "পাসওয়ার্ড নীতি",
+       "passwordpolicies-summary": "এটি এই উইকিতে সংজ্ঞায়িত ব্যবহারকারী দলের কার্যকর পাসওয়ার্ড নীতিগুলির একটি তালিকা।",
        "passwordpolicies-group": "দল",
        "passwordpolicies-policies": "নীতিসমূহ",
-       "passwordpolicies-policy-minimalpasswordlength": "পাসওয়ার্ড অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে"
+       "passwordpolicies-policy-minimalpasswordlength": "পাসওয়ার্ড অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে",
+       "passwordpolicies-policy-passwordcannotmatchusername": "পাসওয়ার্ড ব্যবহারকারী নামের মত একই হতে পারে না",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "পাসওয়ার্ড বিশেষত কালো তালিকাভুক্ত পাসওয়ার্ডের সাথে মিলতে পারবে না",
+       "passwordpolicies-policy-maximalpasswordlength": "পাসওয়ার্ড $1 {{PLURAL:$1|অক্ষরের}} চেয়ে কম দীর্ঘ হতে হবে"
 }
index 97cbed7..fdc99d7 100644 (file)
        "whatlinkshere": "གང་དང་སྦྲེལ་བ།",
        "whatlinkshere-title": "\"$1\" ལ སྦྲེལ་ཡོད་པའི་ཤོག་ངོས།",
        "whatlinkshere-page": "ཤོག་ངོས།",
-       "linkshere-2": "གཤམ་གྱི་ཤོག་ངོས་རྣམས་ '''$1''': ལ་སྦྲེལ་ཡོད།",
-       "nolinkshere-2": "<strong>$1</strong> ཤོག་ངོས་གཅིག་ཀྱང་སྦྲེལ་མཐུད་མི་འདུག།",
+       "linkshere-2": "གཤམ་གྱི་ཤོག་ངོས་རྣམས་ '''$2''': ལ་སྦྲེལ་ཡོད།",
+       "nolinkshere-2": "<strong>$2</strong> ཤོག་ངོས་གཅིག་ཀྱང་སྦྲེལ་མཐུད་མི་འདུག།",
        "isimage": "ཡིག་རིས་སྦྲེལ་མཐུད།",
        "whatlinkshere-links": "← སྦྲེལ་མཐུད།",
        "whatlinkshere-hideredirs": "$1 ཁ་ཕྱོགས་བསྐྱར་སྟོན།",
index f048f56..b403f42 100644 (file)
        "whatlinkshere": "যে পাতাহানিত্ত এহানাত মিলাপ আসে",
        "whatlinkshere-title": "পাতাহানি $1 -ত মিলাপ আসে",
        "whatlinkshere-page": "পাতা:",
-       "linkshere-2": "থাঙনার পাতাহানি '''$1'''র লগে মিলাপ আসে:",
-       "nolinkshere-2": "পাতা '''$1'''হানাত কোন মিলাপ নেই।",
+       "linkshere-2": "থাঙনার পাতাহানি '''$2'''র লগে মিলাপ আসে:",
+       "nolinkshere-2": "পাতা '''$2'''হানাত কোন মিলাপ নেই।",
        "isredirect": "বুলনদের পাতা",
        "istemplate": "বরানি",
        "isimage": "ফাইল মিলাপ",
index c59dffa..804a14f 100644 (file)
@@ -21,7 +21,7 @@
        "tog-editondblclick": "ڤیرایشت بٱلگاٛیل ڤا دو کئرٱت پۊرنیڌن",
        "tog-editsectiononrightclick": "ڤیرایشت ڤابیڌن ڤا راست پۊرنیڌن ری بٱرجا داسۊن هر جاگٱ",
        "tog-watchcreations": "اٛزاف کردن او بٱلگاٛیلی کاٛ خوم راست کردوماٛ و او جانیایلی کاٛ خوم لاهامسۊناٛ مئن سئیل بٱرگ خوم",
-       "tog-watchdefault": "اضاف کردن اوصفحاتی که خوم اصلاح کردم به فهرست نمایشی",
+       "tog-watchdefault": "اٛزاف کردن بٱلگاٛیٱل و جانیایٱلی کاٛ مو مئن سئیل برگوم ڤیرایشدسۊن کردوماٛ",
        "tog-watchmoves": "اضاف کردن صفحاتی که خوم جابجا کردم به فهرست نمایشی",
        "tog-watchdeletion": "اضاف کردن صفحاتی که خوم پاک کردم به فهرست نمایشی خوم",
        "tog-minordefault": "علامت نهادن به اصلاحات ناقص",
@@ -32,7 +32,7 @@
        "tog-enotifminoredits": "امیل به مو سی صفحات ناقص اصلاح شده",
        "tog-enotifrevealaddr": "دیاری کردن تیرنشۊن ٱنجوماناماٛ مو مئن دیارکاری ایمیلی",
        "tog-shownumberswatching": "نشودادن شماره کاربران درحال کار یاتماشا",
-       "tog-oldsig": "اÙ\85ضا Ø§Û\8cسنی",
+       "tog-oldsig": "اÙ\9bÙ\85زا Ø§Û\8cسئنی",
        "tog-fancysig": "امضایل ناتموم",
        "tog-uselivepreview": "پیش سئیل زندە ڤن ڤا کار",
        "tog-forceeditsummary": "یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه",
        "whatlinkshere": "لینک های ای صفحه",
        "whatlinkshere-title": "صفحات آن لینک به \"$1\"",
        "whatlinkshere-page": "بألگە",
-       "linkshere-2": "لینک صفحات ذیل الذکر به '''$1''':",
-       "nolinkshere-2": "هیچ صفحه ای پیوند نداردبه '''$1'''.",
+       "linkshere-2": "لینک صفحات ذیل الذکر به '''$2''':",
+       "nolinkshere-2": "هیچ صفحه ای پیوند نداردبه '''$2'''.",
        "isredirect": "صفحه تغییر مسیر",
        "istemplate": "استفاده‌ وابیده داخل صفحه",
        "isimage": "جانیا هوم پیوند",
index 48547d4..5c41b7a 100644 (file)
        "whatlinkshere": "Pajennoù liammet",
        "whatlinkshere-title": "Pajennoù liammet ouzh \"$1\"",
        "whatlinkshere-page": "Pajenn :",
-       "linkshere-2": "Ar pajennoù a-is zo enno ul liamm a gas war-du '''$1''':",
-       "nolinkshere-2": "N'eus pajenn ebet enni ul liamm war-du '''$1'''.",
-       "nolinkshere-ns-2": "Pajenn ebet n'eo liammet ouzh '''$1''' en esaouenn anv dibabet.",
+       "linkshere-2": "Ar pajennoù a-is zo enno ul liamm a gas war-du '''$2''':",
+       "nolinkshere-2": "N'eus pajenn ebet enni ul liamm war-du '''$2'''.",
+       "nolinkshere-ns-2": "Pajenn ebet n'eo liammet ouzh '''$2''' en esaouenn anv dibabet.",
        "isredirect": "pajenn adkas",
        "istemplate": "enframmet",
        "isimage": "Liamm war-zu ar restr",
index f97f35a..67ec1dd 100644 (file)
        "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Prikaži samo korisnike koji su uređivali",
+       "listusers-temporarygroupsonly": "Prikaži samo korisnike u privremenim korisničkim grupama",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
        "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "whatlinkshere-page": "Stranica:",
-       "linkshere-2": "Sljedeće stranice vode na <strong>$1</strong>:",
-       "nolinkshere-2": "Nijedna stranica nije povezana sa <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Nijedna stranica nije povezana sa <strong>$1</strong> u izabranom imenskom prostoru.",
+       "linkshere-2": "Sljedeće stranice vode na <strong>$2</strong>:",
+       "nolinkshere-2": "Nijedna stranica nije povezana sa <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Nijedna stranica nije povezana sa <strong>$2</strong> u izabranom imenskom prostoru.",
        "isredirect": "preusmjerenje",
        "istemplate": "uključivanje",
        "isimage": "veza na datoteku",
index dff32b6..a9d34df 100644 (file)
@@ -5,6 +5,57 @@
                        "Apundung"
                ]
        },
+       "tog-underline": "Garis torui pranala:",
+       "tog-hideminor": "Bunion editan namenek i parubaan tarbaru",
+       "tog-hidepatrolled": "Bunion editan tarpatroli parubaan tarbaru",
+       "tog-newpageshidepatrolled": "Bunion alaman tarpatroli tingon daftar alaman baru",
+       "tog-hidecategorization": "Bunion pangkatagorian alaman",
+       "tog-extendwatchlist": "Kombangkon daftar pamataan tuna patidaon sude parubaan, inda umna tarbaru",
+       "tog-usenewrc": "Kalompokkon editan i tampilan parubaan tarbaru dot daftar pamataan mardasorkon alaman",
+       "tog-numberheadings": "Len nomor judul sacara otomatis",
+       "tog-showtoolbar": "Tampilkon bilah alat pangeditan",
+       "tog-editondblclick": "Pature alaman dohot klik ganda",
+       "tog-editsectiononrightclick": "Fungsion pangeditan bagian dohot mangklik siamun i judul bagian",
+       "tog-watchcreations": "Tambaon alaman na ubaen dot berkas na uunggah tu daftar pamataan",
+       "tog-watchdefault": "Tambaon alaman na upature tu daftar pamataan",
+       "tog-watchmoves": "Tambaon alaman na upapindah tu daftar pamataan",
+       "tog-watchdeletion": "Tambaon alaman na uapus tu daftar pantauan",
+       "tog-watchuploads": "Tambaon berkas baru nauunggah tu daftar pamataan",
+       "tog-watchrollback": "Tambaon alaman na unjung ubaen mulak tu bagasan daftar pamataanku",
+       "tog-minordefault": "Partando sude editan manjadi editan namenek sacara baku",
+       "tog-previewontop": "Patidaon pratayang dompakso kotak edit dot inda sidungi",
+       "tog-previewonfirst": "Patidaon pratayang i suntingan parjolo",
+       "tog-enotifwatchlistpages": "Kirimkon tuau surel molo sada alaman sanga berkas na u pamatai maruba",
+       "tog-enotifusertalkpages": "Kirimkon jau surel molo alaman parkobaranku maruba",
+       "tog-enotifminoredits": "Kirimkon jau surel juo i parubaan namenek",
+       "tog-enotifrevealaddr": "Tampilkon alamat surelku i surel notifikasi",
+       "tog-shownumberswatching": "Patidaon bahat ni namamatai",
+       "tog-oldsig": "Tekenanmu namadung adong:",
+       "tog-fancysig": "Baen tekenan manjadi teks wiki (indapake pranala otomatis)",
+       "tog-uselivepreview": "Tampilkon pratayang indapake mamuat mulak alaman",
+       "tog-forceeditsummary": "Paingot au molo kotak ringkasan editan nakosong dope",
+       "tog-watchlisthideown": "Bunion editanku i daftar pamataan",
+       "tog-watchlisthidebots": "Bunion editan bot idaftar pantauan",
+       "tog-watchlisthideminor": "Bunion editan namenek tingon pamataan",
+       "tog-watchlisthideliu": "Bunion suntingan masuk log tingon pamataan",
+       "tog-watchlistreloadautomatically": "Muat mulak daftar pamataan sacara otomatis atia sada tapis maruba (JavaScript iporluon)",
+       "tog-watchlistunwatchlinks": "Tambaon pananda pamatai/apus pamataan tu alaman na imatai na maruba (JavaScript iporluon tu manggonti fungsi on)",
+       "tog-watchlisthideanons": "Bunion editan pamake anonim i daftar pamataan",
+       "tog-watchlisthidepatrolled": "Bunion editan tarpatroli i daftar pantauan",
+       "tog-watchlisthidecategorization": "Bunion pangkatagorian alaman",
+       "tog-ccmeonemails": "Kirimkon jau salinan surel nau kirimkon tu alak nalain",
+       "tog-diffonly": "Ulang patidaon isi alaman i toru parbedaan editan",
+       "tog-showhiddencats": "Patidaon kategori namonjap",
+       "tog-norollbackdiff": "Nangkon patidaon parbedaan sidung mambaen paulakan",
+       "tog-useeditwarning": "Ingotkon au molo maninggalkon alaman pangeditan dompak so manyimpan parubaan",
+       "tog-prefershttps": "Totop pake sambungan aman atia masuk log",
+       "underline-always": "Totop",
+       "underline-never": "Inda unjung",
+       "underline-default": "Ulit sanga pangaraun naiobanna",
+       "editfont-style": "Gaya tulisan komputer i kotak pangeditan:",
+       "editfont-monospace": "Tulisan Monospace",
+       "editfont-sansserif": "Tulisan Sans-serif",
+       "editfont-serif": "Tulisan Serif",
        "sunday": "Akad",
        "monday": "Sinayan",
        "tuesday": "Salasa",
        "oct": "Okt",
        "nov": "Nov",
        "dec": "Des",
+       "january-date": "$1 Januari",
+       "february-date": "$1 Februari",
+       "march-date": "$1 Maret",
+       "april-date": "$1 April",
+       "may-date": "$1 Mei",
+       "june-date": "$1 Juni",
+       "july-date": "$1 Juli",
+       "august-date": "$1 Agustus",
+       "september-date": "$1 September",
+       "october-date": "$1 Oktober",
+       "november-date": "$1 November",
+       "december-date": "$1 Desember",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Category|Kategori}}",
        "category_header": "Alaman i kategori \"$1\"",
        "subcategories": "Subkategori",
        "category-media-header": "Media i kategori \"$1\"",
        "category-empty": "<em>Kategori on sonnari indadong alaman dot media.</em>",
        "hidden-categories": "{{PLURAL:$1|Hidden category|Kategori monjap}}",
+       "hidden-category-category": "Kategori namonjap",
        "category-subcat-count": "{{PLURAL:$2|Kategori on umna puna subkategori ima.|Kategori on puna ima {{PLURAL:$1|subkategori|$1 subkategori}}, tingon bahat $2.}}",
+       "category-subcat-count-limited": "Kategori on puna {{PLURAL:$1|$1 subkategori}} on.",
        "category-article-count": "{{PLURAL:$2|Kategori on umna marisi alaman ima.|Onma{{PLURAL:$1|alaman ima|$1 alaman}} i kategori on, tingon bahat $2.}}",
+       "category-article-count-limited": "Kategori on puna {{PLURAL:$1|$1 alaman}} onma.",
        "category-file-count": "{{PLURAL:$2|Kategori on umna marisi alaman ima.|Onma{{PLURAL:$1|alaman ima|$1 alaman}} i kategori on, tingon bahat $2.}}",
        "listingcontinuesabbrev": "Sat",
+       "index-category": "Alaman na iindeks",
        "noindex-category": "Alaman naso tarindeks",
        "broken-file-category": "Alaman dot link berkas sega",
        "about": "Satontang",
+       "article": "Isi nialaman",
        "newwindow": "(bukak i tingkap nabaru)",
        "cancel": "Antai",
+       "moredotdotdot": "Lainna...",
+       "morenotlisted": "Daftar on mungkin inda singkop",
+       "mypage": "Alaman",
        "mytalk": "Dokon",
+       "anontalk": "Obar",
        "navigation": "Navigasi",
        "and": "&#32;dot",
+       "faq": "FAQ",
        "namespaces": "Ruang gorar",
        "variants": "Mocoman",
        "navigation-heading": "Menu Navigasi",
+       "errorpagetitle": "Sega",
        "returnto": "Keimulak tu $1",
        "tagline": "Tingon {{SITENAME}}",
        "help": "Tolong",
        "search": "Jalaki",
+       "search-ignored-headings": "# <pre>\n# Judul na angkan ipatopi ni panjalakan.\n# Editan on nangkan iterapkon sidung alaman dohot judul on iindeks.\n# Amu bisa mamaksaon pangindekskan mulak alaman on dohot mambaen editan kosong (''null edit'')\n# Sintaksisna ima songon onma:\n#   * Sudena tingon karakter \"#\" tu ujung baris ima sada komentar.\n#   * Satiop baris naso-kosong ima judul pas na angkan ipatopi\nReferensi\nPranala luar\nLigin muse\n #</pre>",
        "searchbutton": "Jalaki",
+       "go": "Kehe",
        "searcharticle": "Kehe",
        "history": "Sejarah alaman",
        "history_short": "Sejarah",
+       "history_small": "sejarah",
+       "updatedmarker": "Iuba sian parabisan uligi",
        "printableversion": "Versi cetak",
        "permalink": "Tautan permanen",
+       "print": "Cetak",
        "view": "Sise",
        "view-foreign": "Sise i $1",
        "edit": "Pature",
+       "edit-local": "Baen deskeipsi lokal",
        "create": "Baen",
        "create-local": "Baen deskripsi lokal",
        "delete": "Apus",
        "whatlinkshere": "Tautan aha ison",
        "whatlinkshere-title": "Alaman puna tautan tu \"$1\"",
        "whatlinkshere-page": "Alaman:",
-       "linkshere-2": "Onma alaman namartaut tu <strong>$1</strong>:",
-       "nolinkshere-2": "Inda adong alaman na martaut tu <strong>$1</strong>.",
+       "linkshere-2": "Onma alaman namartaut tu <strong>$2</strong>:",
+       "nolinkshere-2": "Inda adong alaman na martaut tu <strong>$2</strong>.",
        "isredirect": "Alaman pangalihan",
        "istemplate": "transklusi",
        "isimage": "Tautan berkas",
index d4b37fc..32a36d2 100644 (file)
        "default": "per defecte",
        "prefs-files": "Fitxers",
        "prefs-custom-css": "CSS personalitzat",
+       "prefs-custom-json": "JSON personalitzat",
        "prefs-custom-js": "JS personalitzat",
        "prefs-common-config": "CSS/JS compartit per tots els skins:",
        "prefs-reset-intro": "Podeu usar aquesta pàgina per a restablir les vostres preferències als valors per defecte.\nNo es podrà desfer el canvi.",
        "prefs-dateformat": "Format de la data",
        "prefs-timeoffset": "Decalatge horari",
        "prefs-advancedediting": "Opcions generals",
+       "prefs-developertools": "Eines de desenvolupament",
        "prefs-editor": "Edició",
        "prefs-preview": "Previsualització",
        "prefs-advancedrc": "Opcions avançades",
        "rcfilters-filter-humans-description": "Modificacions fetes per editors humans.",
        "rcfilters-filtergroup-reviewstatus": "Estat de revisió",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "No patrullat",
+       "rcfilters-filter-reviewstatus-manual-label": "Patrullat manualment",
        "rcfilters-filtergroup-significance": "Significació",
        "rcfilters-filter-minor-label": "Modificacions menors",
        "rcfilters-filter-minor-description": "Modificacions que l'autor va etiquetar com a menors.",
        "rcfilters-watchlist-edit-watchlist-button": "Editeu la vostra llista de pàgines seguides",
        "rcfilters-watchlist-showupdated": "Els canvis fets en pàgines que no heu visitat des que s'efectuaren apareixen en <strong>negreta</strong> amb un punt sòlid al costat.",
        "rcfilters-preference-label": "Amaga la versió millorada de Canvis recents",
+       "rcfilters-filter-showlinkedto-label": "Mostra els canvis a les pàgines que enllacin a",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Pàgines que enllacen a</strong> la pàgina seleccionada",
        "rcfilters-target-page-placeholder": "Escriviu el nom d’una pàgina (o d’una categoria)",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
        "rclistfromreset": "Reinicialitza la selecció de data",
        "uploadstash-bad-path-invalid": "El camí no és vàlid.",
        "uploadstash-bad-path-unknown-type": "El tipus «$1» és desconegut.",
        "uploadstash-no-extension": "L’extensió és nul·la.",
+       "uploadstash-zero-length": "El fitxer té mida zero.",
        "invalid-chunk-offset": "El desplaçament del fragment no és vàlid",
        "img-auth-accessdenied": "Accés denegat",
        "img-auth-nopathinfo": "Hi manca PATH_INFO.\nEl servidor no està configurat per passar aquesta informació.\nPot estar basat en CGI i no ser compatible amb img_auth.\nConsulteu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
        "whatlinkshere": "Què hi enllaça",
        "whatlinkshere-title": "Pàgines que enllacen amb «$1»",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere-2": "Les següents pàgines enllacen amb '''$1''':",
-       "nolinkshere-2": "Cap pàgina no enllaça amb '''$1'''.",
-       "nolinkshere-ns-2": "No s'enllaça cap pàgina a '''$1''' en l'espai de noms triat.",
+       "linkshere-2": "Les següents pàgines enllacen amb '''$2''':",
+       "nolinkshere-2": "Cap pàgina no enllaça amb '''$2'''.",
+       "nolinkshere-ns-2": "No s'enllaça cap pàgina a '''$2''' en l'espai de noms triat.",
        "isredirect": "pàgina redirigida",
        "istemplate": "inclusió",
        "isimage": "enllaç a fitxer",
index 8ae463f..4b6deae 100644 (file)
        "whatlinkshere": "Diē-nē̤ lièng gáu cē̤-nē̤",
        "whatlinkshere-title": "鏈接遘$1其頁面",
        "whatlinkshere-page": "頁面:",
-       "linkshere-2": "下底其頁面鏈接遘'''$1''':",
-       "nolinkshere-2": "無頁鏈接遘'''$1'''。",
+       "linkshere-2": "下底其頁面鏈接遘'''$2''':",
+       "nolinkshere-2": "無頁鏈接遘'''$2'''。",
        "isredirect": "重定向頁面",
        "isimage": "文件鏈接",
        "whatlinkshere-prev": "{{PLURAL:$1|前|前$1}}",
index 7603a1a..754c8fe 100644 (file)
        "whatlinkshere": "Кхуза хьажоргаш",
        "whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
        "whatlinkshere-page": "АгӀо:",
-       "linkshere-2": "ТӀаьхьайогӀу агӀонаш оцу '''$1''': хьажоргца ю",
-       "nolinkshere-2": "ХӀокху '''$1''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
-       "nolinkshere-ns-2": "Хаьржинчу меттигехь яц '''$1''' цӀе йолу агӀонаш",
+       "linkshere-2": "ТӀаьхьайогӀу агӀонаш оцу '''$2''': хьажоргца ю",
+       "nolinkshere-2": "ХӀокху '''$2''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
+       "nolinkshere-ns-2": "Хаьржинчу меттигехь яц '''$2''' цӀе йолу агӀонаш",
        "isredirect": "агӀо-дӀасахьажорг",
        "istemplate": "юкъаялийнарш",
        "isimage": "Файлан хьажорг",
index 415ae14..259ce4c 100644 (file)
        "whatlinkshere": "Unsay mga misumpay dinhi",
        "whatlinkshere-title": "Mga panid nga misumpay ngadto sa \"$1\"",
        "whatlinkshere-page": "Panid:",
-       "linkshere-2": "Ang mosunod nga mga panid misumpay sa '''$1''':",
+       "linkshere-2": "Ang mosunod nga mga panid misumpay sa '''$2''':",
        "isredirect": "panid sa redirekta",
        "istemplate": "transklusyon",
        "isimage": "sumpay sa payl",
index 138554b..cd194c2 100644 (file)
        "whatlinkshere": "Håfa ha na'chetton guini",
        "whatlinkshere-title": "I påhina siha ni mana'chetton yan \"$1\"",
        "whatlinkshere-page": "Påhina:",
-       "linkshere-2": "Umachetton i sigienten påhina siha yan '''$1''':",
-       "nolinkshere-2": "Taya' umachetton yan '''$1'''.",
+       "linkshere-2": "Umachetton i sigienten påhina siha yan '''$2''':",
+       "nolinkshere-2": "Taya' umachetton yan '''$2'''.",
        "isredirect": "dirihi i påhina",
        "istemplate": "sinaonao",
        "whatlinkshere-prev": "{{PLURAL:$1|ni må'pos|$1 ni manmå'pos}}",
index c0f78de..1c44e41 100644 (file)
        "whatlinkshere": "بەستەرەکان بە ئێرەوە",
        "whatlinkshere-title": "ئەو پەڕانەی بەستەریان ھەیە بۆ «$1»",
        "whatlinkshere-page": "پەڕە:",
-       "linkshere-2": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>$1</strong>:",
-       "nolinkshere-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$1</strong>.",
-       "nolinkshere-ns-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$1</strong> لە بۆشایی ناوی هەڵبژێرراودا.",
+       "linkshere-2": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>$2</strong>:",
+       "nolinkshere-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$2</strong>.",
+       "nolinkshere-ns-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$2</strong> لە بۆشایی ناوی هەڵبژێرراودا.",
        "isredirect": "پەڕەی ڕەوانەکەر",
        "istemplate": "بەکارھێنراو",
        "isimage": "بەستەری پەڕگە",
index 360b865..9c990be 100644 (file)
        "sp-contributions-submit": "Circà",
        "whatlinkshere": "Pagine chì leganu quì",
        "whatlinkshere-title": "Pagine ligate à \"$1\"",
-       "linkshere-2": "E seguente pagine sò culligate à '''$1''':",
+       "linkshere-2": "E seguente pagine sò culligate à '''$2''':",
        "istemplate": "inclusione",
        "whatlinkshere-prev": "{{PLURAL:$1|precidente|precidenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguente|seguenti $1}}",
index 214edc4..cb985e5 100644 (file)
        "whatlinkshere": "Ang nagatabid diri",
        "whatlinkshere-title": "Mga pahina nga naga-link sa $1",
        "whatlinkshere-page": "Pahina:",
-       "linkshere-2": "Ang mga gasunod nga pahina ga-link sa '''$1''':",
+       "linkshere-2": "Ang mga gasunod nga pahina ga-link sa '''$2''':",
        "isredirect": "pahina pangdirekta",
        "istemplate": "transklusyon",
        "isimage": "Link sang litrato",
index 27ff8ba..6c64af4 100644 (file)
        "whatlinkshere": "Бу саифеге багълантылар",
        "whatlinkshere-title": "«$1» саифесине багъланты олгъан саифелер",
        "whatlinkshere-page": "Саифе:",
-       "linkshere-2": "'''$1''' саифесине багъланты берген саифелер:",
-       "nolinkshere-2": "'''$1''' саифесине багъланты берген саифе ёкъ.",
-       "nolinkshere-ns-2": "Сайлангъан исим фезасында '''$1''' саифесине багълангъан саифе ёкътыр.",
+       "linkshere-2": "'''$2''' саифесине багъланты берген саифелер:",
+       "nolinkshere-2": "'''$2''' саифесине багъланты берген саифе ёкъ.",
+       "nolinkshere-ns-2": "Сайлангъан исим фезасында '''$2''' саифесине багълангъан саифе ёкътыр.",
        "isredirect": "Ёллама саифеси",
        "istemplate": "кирсетильме",
        "isimage": "файл багълантысы",
index cd350ed..33fcee0 100644 (file)
        "whatlinkshere": "Bu saifege bağlantılar",
        "whatlinkshere-title": "“$1” saifesine bağlantı bergen saifeler",
        "whatlinkshere-page": "Saife:",
-       "linkshere-2": "'''$1''' saifesine bağlantı bergen saifeler:",
-       "nolinkshere-2": "'''$1''' saifesine bağlantı bergen saife yoq.",
-       "nolinkshere-ns-2": "Saylanğan isim fezasında '''$1''' saifesine bağlanğan saife yoqtır.",
+       "linkshere-2": "'''$2''' saifesine bağlantı bergen saifeler:",
+       "nolinkshere-2": "'''$2''' saifesine bağlantı bergen saife yoq.",
+       "nolinkshere-ns-2": "Saylanğan isim fezasında '''$2''' saifesine bağlanğan saife yoqtır.",
        "isredirect": "Yollama saifesi",
        "istemplate": "kirsetilme",
        "isimage": "fayl bağlantısı",
index 160fc43..dfa2d9c 100644 (file)
        "dellogpage": "Kniha smazaných stránek",
        "dellogpagetext": "Zde je seznam posledních smazaných stránek.",
        "deletionlog": "Kniha smazaných stránek",
+       "log-name-create": "Kniha vytvoření stránek",
+       "log-description-create": "Níže se nachází seznam posledních vyvořených stránek.",
+       "logentry-create-create": "$1 {{GENDER:$2|vytvořil|vytvořila|vytvořil(a)}} stránku $3",
        "reverted": "Obnovení předchozí verze",
        "deletecomment": "Důvod:",
        "deleteotherreason": "Jiný/další důvod:",
        "whatlinkshere": "Odkazuje sem",
        "whatlinkshere-title": "Stránky odkazující na „$1“",
        "whatlinkshere-page": "Strana:",
-       "linkshere-2": "Na <strong>$1</strong> odkazují tyto stránky:",
-       "nolinkshere-2": "Žádná stránka na <strong>$1</strong> neodkazuje.",
-       "nolinkshere-ns-2": "Ve zvoleném jmenném prostoru na <strong>$1</strong> neodkazuje žádná stránka.",
+       "linkshere-2": "Na <strong>$2</strong> odkazují tyto stránky:",
+       "nolinkshere-2": "Žádná stránka na <strong>$2</strong> neodkazuje.",
+       "nolinkshere-ns-2": "Ve zvoleném jmenném prostoru na <strong>$2</strong> neodkazuje žádná stránka.",
        "isredirect": "přesměrování",
        "istemplate": "vložení",
        "isimage": "vložení souboru",
        "pagedata-text": "Tato stránka poskytuje datové rozhraní ke stránkám. Uveďte prosím název stránky v URL pomocí syntaxe pro podstránky.\n* Funguje dohadování o obsahu na základě hlavičky Accept vašeho klienta. To znamená, že data stránky budou poskytnuta ve formátu preferovaném vaším klientem.",
        "pagedata-not-acceptable": "Nenalezen odpovídající formát. Podporované MIME typy: $1",
        "pagedata-bad-title": "Neplatný název: $1.",
-       "unregistered-user-config": "Z bezpečnostních důvodů nelze načítat uživatelské podstránky s JavaScriptem, CSS nebo JSONem u neregistrovaných uživatelů."
+       "unregistered-user-config": "Z bezpečnostních důvodů nelze načítat uživatelské podstránky s JavaScriptem, CSS nebo JSONem u neregistrovaných uživatelů.",
+       "passwordpolicies-group": "Skupina",
+       "passwordpolicies-policy-minimalpasswordlength": "Heslo musí být alespoň {{PLURAL:$1|$1 znak|$1 znaky|$1 znaků}} dlouhé",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Pro přihlášení je vyžadováno alespoň {{PLURAL:$1|$1 znak|$1 znaky|$1 znaků}} dlouhé heslo",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Heslo se nemůže shodovat s uživatelským jménem",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Heslo nesmí být v seznamu určitých zakázaných hesel",
+       "passwordpolicies-policy-maximalpasswordlength": "Heslo musí být kratší než {{PLURAL:$1|$1 znak|$1 znaky|$1 znaků}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "Heslo nesmí být {{PLURAL:$1|dané oblíbené heslo|v seznamu $1 oblíbených hesel}}"
 }
index 3620a0b..10c4b90 100644 (file)
        "whatlinkshere": "Lënkùjącé",
        "whatlinkshere-title": "Starnë lënkùjącé do \"$1\"",
        "whatlinkshere-page": "Starna:",
-       "linkshere-2": "Do '''$1''' lënkùją hewòtné starnë:",
-       "nolinkshere-2": "Niżódnô starna nie lënkùje do '''$1'''.",
+       "linkshere-2": "Do '''$2''' lënkùją hewòtné starnë:",
+       "nolinkshere-2": "Niżódnô starna nie lënkùje do '''$2'''.",
        "isredirect": "starna przeczerowaniô",
        "istemplate": "doparłãczony",
        "isimage": "lënk do lopka",
index c490c2a..efad727 100644 (file)
        "whatlinkshere": "дос҄ьдєщьнѩ съвѧꙁиѥ",
        "whatlinkshere-title": "страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ",
        "whatlinkshere-page": "страница :",
-       "linkshere-2": "сѩ страницѧ съ <strong>$1</strong> съвѧꙁи имѫтъ :",
+       "linkshere-2": "сѩ страницѧ съ <strong>$2</strong> съвѧꙁи имѫтъ :",
        "isredirect": "прѣнаправлѥниѥ",
        "istemplate": "внѫтри страницѧ",
        "isimage": "дѣла съвѧꙁь",
index eaa60c0..e043517 100644 (file)
        "recentchanges-submit": "Кăтарт",
        "rcfilters-legend-heading": "<strong>Кĕскетнисем:</strong>",
        "rcfilters-other-review-tools": "Урăх пăхмаллисем",
+       "rcfilters-show-new-changes": "Çĕнĕ улăшăннисем",
        "rcfilters-filterlist-title": "Фильтрсем",
        "rcfilters-filter-editsbyself-label": "Хăвăр улăштарнисем",
        "rcfilters-filter-editsbyother-label": "Урăххисем улăштарнисем",
        "sp-contributions-submit": "Шыра",
        "whatlinkshere": "Кунта каçаканнисем",
        "whatlinkshere-title": "\"$1\" çине каçакан страницăсем",
-       "linkshere-2": "<strong>$1</strong> çине каçакан страницăсем:",
-       "nolinkshere-2": "'''$1''' страница çине ытти страницăсенчен килме пулмасть.",
+       "linkshere-2": "<strong>$2</strong> çине каçакан страницăсем:",
+       "nolinkshere-2": "'''$2''' страница çине ытти страницăсенчен килме пулмасть.",
        "whatlinkshere-prev": "{{PLURAL:$1|унчченхи|унчченхи $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|урăххи|урăххисем $1}}",
        "whatlinkshere-links": "← каçаканнисем",
index fc7cf59..d74bd9b 100644 (file)
        "whatlinkshere": "Beth sy'n cysylltu yma",
        "whatlinkshere-title": "Tudalennau sy'n cysylltu â \"$1\"",
        "whatlinkshere-page": "Tudalen:",
-       "linkshere-2": "Mae'r tudalennau isod yn cysylltu â '''$1''':",
-       "nolinkshere-2": "Nid oes cyswllt ar unrhyw dudalen arall syn arwain at '''$1'''.",
-       "nolinkshere-ns-2": "Nid oes cyswllt ar unrhyw dudalen yn y parth dewisedig sy'n arwain at '''$1'''.",
+       "linkshere-2": "Mae'r tudalennau isod yn cysylltu â '''$2''':",
+       "nolinkshere-2": "Nid oes cyswllt ar unrhyw dudalen arall syn arwain at '''$2'''.",
+       "nolinkshere-ns-2": "Nid oes cyswllt ar unrhyw dudalen yn y parth dewisedig sy'n arwain at '''$2'''.",
        "isredirect": "tudalen ailgyfeirio",
        "istemplate": "cynhwysiad",
        "isimage": "cyswllt ffeil",
index 3112c59..ec25fdc 100644 (file)
@@ -68,7 +68,8 @@
                        "EeveeSylveon",
                        "Kenn.jensen",
                        "Saederup92",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Jorn Ari"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "whatlinkshere": "Hvad henviser hertil",
        "whatlinkshere-title": "Sider der linker til \"$1\"",
        "whatlinkshere-page": "Side:",
-       "linkshere-2": "De følgende sider henviser til '''„$1“''':",
-       "nolinkshere-2": "Ingen sider henviser til '''„$1“'''.",
-       "nolinkshere-ns-2": "Ingen side henviser til '''„$1“''' i det valgte navnerum.",
+       "linkshere-2": "De følgende sider henviser til <strong>$2</strong>:",
+       "nolinkshere-2": "Ingen sider henviser til <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Ingen sider henviser til <strong>$2</strong> i det valgte navnerum.",
        "isredirect": "omdirigeringsside",
        "istemplate": "indlejring",
        "isimage": "filhenvisning",
index 2718774..112fb1f 100644 (file)
        "blanknamespace": "(Seiten)",
        "contributions-title": "Benutzerbeiträge von «$1»",
        "whatlinkshere-title": "Seiten, die auf «$1» verlinken",
-       "linkshere-2": "Die folgenden Seiten verlinken auf '''«$1»''':",
-       "nolinkshere-2": "Keine Seite verlinkt auf '''«$1»'''.",
-       "nolinkshere-ns-2": "Keine Seite verlinkt auf '''«$1»''' im gewählten Namensraum.",
+       "linkshere-2": "Die folgenden Seiten verlinken auf '''«$2»''':",
+       "nolinkshere-2": "Keine Seite verlinkt auf '''«$2»'''.",
+       "nolinkshere-ns-2": "Keine Seite verlinkt auf '''«$2»''' im gewählten Namensraum.",
        "ipb-confirmhideuser": "Du bist gerade dabei, einen Benutzer im Modus «Benutzer verstecken» zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?",
        "ipb-unblock-addr": "«$1» freigeben",
        "ipb-blocklist-contribs": "Benutzerbeiträge von «$1»",
index bbc8a08..fa9859e 100644 (file)
        "dellogpage": "Lösch-Logbuch",
        "dellogpagetext": "Dies ist das Logbuch der gelöschten Seiten und Dateien.",
        "deletionlog": "Lösch-Logbuch",
+       "log-name-create": "Seitenerstellungs-Logbuch",
+       "log-description-create": "Es folgt eine Liste der letzten Seitenerstellungen.",
+       "logentry-create-create": "$1 hat die Seite $3 {{GENDER:$2|erstellt}}",
        "reverted": "Auf eine alte Version zurückgesetzt",
        "deletecomment": "Grund:",
        "deleteotherreason": "Anderer/ergänzender Grund:",
        "whatlinkshere": "Links auf diese Seite",
        "whatlinkshere-title": "Seiten, die auf „$1“ verlinken",
        "whatlinkshere-page": "Seite:",
-       "linkshere-2": "Die folgenden Seiten verlinken auf <strong>$1</strong>:",
-       "nolinkshere-2": "Keine Seite verlinkt auf '''„$1“'''.",
-       "nolinkshere-ns-2": "Keine Seite verlinkt auf '''„$1“''' im gewählten Namensraum.",
+       "linkshere-2": "Die folgenden Seiten verlinken auf <strong>$2</strong>:",
+       "nolinkshere-2": "Keine Seiten verlinken auf <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Keine Seiten verlinken auf <strong>$2</strong> in dem ausgewählten Namensraum.",
        "isredirect": "Weiterleitungsseite",
        "istemplate": "Vorlageneinbindung",
        "isimage": "Dateilink",
index dac9e07..36f4d61 100644 (file)
        "whatlinkshere": "Linkê tedeestey",
        "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
-       "linkshere-2": "Pera <strong>$1</strong> rê gıre dayen perri",
-       "nolinkshere-2": "Per da '''$1''' rê pera ke gıre dana çıniya.",
-       "nolinkshere-ns-2": "Cayo ke namey rê weçinayo de qet perre '''$1''' rê link nêbena.",
+       "linkshere-2": "Pera <strong>$2</strong> rê gıre dayen perri",
+       "nolinkshere-2": "Per da '''$2''' rê pera ke gıre dana çıniya.",
+       "nolinkshere-ns-2": "Cayo ke namey rê weçinayo de qet perre '''$2''' rê link nêbena.",
        "isredirect": "pera hetenayışi",
        "istemplate": "Açarnayene",
        "isimage": "gırey dosye",
index 2b8e205..a00e4bd 100644 (file)
        "whatlinkshere": "Wótkaze na toś ten bok",
        "whatlinkshere-title": "Boki, kótarež wótkazuju na \"$1\"",
        "whatlinkshere-page": "bok:",
-       "linkshere-2": "Toś te boki wótkazuju na '''„$1“''':",
-       "nolinkshere-2": "Žedne boki njewótkazuju na '''$1'''.",
-       "nolinkshere-ns-2": "Žedne boki we wubranem mjenjowem rumje njewótkazuju na '''$1'''.",
+       "linkshere-2": "Toś te boki wótkazuju na '''„$2“''':",
+       "nolinkshere-2": "Žedne boki njewótkazuju na '''$2'''.",
+       "nolinkshere-ns-2": "Žedne boki we wubranem mjenjowem rumje njewótkazuju na '''$2'''.",
        "isredirect": "dalejpósrědnjujucy bok",
        "istemplate": "zawězanje pśedłogi",
        "isimage": "datajowy wótkaz",
index 00b5f14..7089b5a 100644 (file)
        "whatlinkshere": "Nunu poingoput hiti",
        "whatlinkshere-title": "Bolikon di poingoput id \"$1\"",
        "whatlinkshere-page": "Bolikon:",
-       "linkshere-2": "Bolikon diti poingoput kumaa id  '''$1''':",
-       "nolinkshere-2": "Ingaa bolikon poingoput id '''$1'''.",
+       "linkshere-2": "Bolikon diti poingoput kumaa id  '''$2''':",
+       "nolinkshere-2": "Ingaa bolikon poingoput id '''$2'''.",
        "isredirect": "bolikon pinotilombus",
        "istemplate": "alanai",
        "isimage": "noputan do upa",
index 99021a1..d869519 100644 (file)
        "whatlinkshere": "याँखाइ कि जोणीन्छ",
        "whatlinkshere-title": "$1 सित जोडियाऽ पन्नाअन",
        "whatlinkshere-page": "पानो",
-       "linkshere-2": "निम्न पानाहरू '''$1''' मी जुडन्छ :",
-       "nolinkshere-ns-2": "चुनियाको नामस्थानमी '''$1''' सित जुड्न्या पानाहरू नाइथिन्।",
+       "linkshere-2": "निम्न पानाहरू '''$2''' मी जुडन्छ :",
+       "nolinkshere-ns-2": "चुनियाको नामस्थानमी '''$2''' सित जुड्न्या पानाहरू नाइथिन्।",
        "isredirect": "अनुप्रेषित पानो",
        "istemplate": "पारदर्शिता",
        "isimage": "फाइल लिङ्क",
index e8cbc3f..3e71d42 100644 (file)
        "whatlinkshere": "A pûnten ché",
        "whatlinkshere-title": "Pàgini che pûnten a \"$1\"",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere-2": "Al pàgini segvèinti a gh'àn di colegamèint a '''$1'''.",
-       "nolinkshere-2": "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''$1'''.",
+       "linkshere-2": "Al pàgini segvèinti a gh'àn di colegamèint a '''$2'''.",
+       "nolinkshere-2": "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''$2'''.",
        "isredirect": "Pàgina redirect",
        "istemplate": "uniòun",
        "isimage": "Colegamèint vêrs al file",
index ec816d5..e2a5941 100644 (file)
        "dellogpage": "Αρχείο καταγραφών διαγραφών",
        "dellogpagetext": "Λίστα των πιο πρόσφατων διαγραφών",
        "deletionlog": "Καταγραφές διαγραφών",
+       "log-name-create": "Αρχείο καταγραφών δημιουργίας σελίδων",
+       "log-description-create": "Παρακάτω υπάρχει ένας κατάλογος των πιο πρόσφατων δημιουργιών σελίδας.",
        "reverted": "Επαναφορά σε προηγούμενη αναθεώρηση",
        "deletecomment": "Λόγος:",
        "deleteotherreason": "Άλλος/πρόσθετος λόγος:",
        "whatlinkshere": "Τι συνδέει εδώ",
        "whatlinkshere-title": "Σελίδες που συνδέουν στη σελίδα «$1»",
        "whatlinkshere-page": "Σελίδα:",
-       "linkshere-2": "Οι ακόλουθες σελίδες συνδέουν στη σελίδα '''$1''':",
-       "nolinkshere-2": "Δεν υπάρχουν σελίδες που να συνδέουν στη σελίδα '''$1'''.",
-       "nolinkshere-ns-2": "Καμία σελίδα δεν συνδέει στο '''$1''' στον επιλεγμένο ονοματοχώρο.",
+       "linkshere-2": "Οι ακόλουθες σελίδες συνδέουν στη σελίδα <strong>$2</strong>:",
+       "nolinkshere-2": "Δεν υπάρχουν σελίδες που να συνδέουν στη σελίδα <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Καμία σελίδα δεν συνδέει στο <strong>$2</strong> στον επιλεγμένο ονοματοχώρο.",
        "isredirect": "σελίδα ανακατεύθυνσης",
        "istemplate": "ενσωμάτωση",
        "isimage": "σύνδεσμος αρχείου",
index 837e3b5..744dc97 100644 (file)
        "rcfilters-watchlist-showupdated": "Changes to pages you haven't visited since the changes occurred are in <strong>bold</strong>, with solid markers.",
        "rcfilters-preference-label": "Hide the improved version of Recent Changes",
        "rcfilters-preference-help": "Rolls back the 2017 interface redesign and all tools added then and since.",
+       "rcfilters-watchlist-preference-label": "Hide the improved version of the Watchlist",
+       "rcfilters-watchlist-preference-help": "Rolls back the 2017 interface redesign and all tools added then and since.",
        "rcfilters-filter-showlinkedfrom-label": "Show changes on pages linked from",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pages linked from</strong> the selected page",
        "rcfilters-filter-showlinkedto-label": "Show changes on pages linking to",
        "dellogpage": "Deletion log",
        "dellogpagetext": "Below is a list of the most recent deletions.",
        "deletionlog": "deletion log",
+       "log-name-create": "Page creation log",
+       "log-description-create": "Below is a list of the most recent page creations.",
+       "logentry-create-create": "$1 {{GENDER:$2|created}} page $3",
        "reverted": "Reverted to earlier revision",
        "deletecomment": "Reason:",
        "deleteotherreason": "Other/additional reason:",
        "whatlinkshere-title": "Pages that link to \"$1\"",
        "whatlinkshere-summary": "",
        "whatlinkshere-page": "Page:",
-       "linkshere-2": "The following pages link to <strong>$1</strong>:",
-       "nolinkshere-2": "No pages link to <strong>$1</strong>.",
-       "nolinkshere-ns-2": "No pages link to <strong>$1</strong> in the chosen namespace.",
+       "linkshere-2": "The following pages link to <strong>$2</strong>:",
+       "nolinkshere-2": "No pages link to <strong>$2</strong>.",
+       "nolinkshere-ns-2": "No pages link to <strong>$2</strong> in the chosen namespace.",
        "isredirect": "redirect page",
        "istemplate": "transclusion",
        "isimage": "file link",
index cebd18b..da17ec0 100644 (file)
        "whatlinkshere": "Ligiloj ĉi tien",
        "whatlinkshere-title": "Paĝoj ligantaj al \"$1\"",
        "whatlinkshere-page": "Paĝo:",
-       "linkshere-2": "La jenaj paĝoj ligas al '''$1''':",
-       "nolinkshere-2": "Neniu paĝo ligas al '''$1'''.",
-       "nolinkshere-ns-2": "Neniuj paĝoj ligas al '''$1''' en la elektita nomspaco.",
+       "linkshere-2": "La jenaj paĝoj ligas al <strong>$2</strong>:",
+       "nolinkshere-2": "Neniu paĝo ligas al <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Neniuj paĝoj ligas al '''$2''' en la elektita nomspaco.",
        "isredirect": "alidirektilo",
        "istemplate": "inkludo",
        "isimage": "ligilo al dosiero",
index 2fac3ff..b29c8f2 100644 (file)
        "dellogpage": "Registro de borrados",
        "dellogpagetext": "A continuación se muestra una lista de los borrados más recientes.",
        "deletionlog": "registro de borrados",
+       "log-name-create": "Registro de creación de páginas",
+       "log-description-create": "La siguiente es una lista de las páginas creadas recientemente.",
+       "logentry-create-create": "$1 {{GENDER:$2|creó}} la página $3",
        "reverted": "Revertido a una revisión anterior",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Otro motivo:",
        "whatlinkshere": "Lo que enlaza aquí",
        "whatlinkshere-title": "Páginas que enlazan con «$1»",
        "whatlinkshere-page": "Página:",
-       "linkshere-2": "Las siguientes páginas enlazan a <strong>$1</strong>:",
-       "nolinkshere-2": "Ninguna página enlaza con <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Ninguna página enlaza con <strong>$1</strong> en el espacio de nombres elegido.",
+       "linkshere-2": "Las siguientes páginas enlazan a <strong>$2</strong>:",
+       "nolinkshere-2": "Ninguna página enlaza con <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Ninguna página enlaza con <strong>$2</strong> en el espacio de nombres elegido.",
        "isredirect": "página redirigida",
        "istemplate": "inclusión",
        "isimage": "enlace de archivo",
index abffdb9..2fe3fa9 100644 (file)
        "botpasswords-existing": "Olemasolevad robotiparoolid",
        "botpasswords-createnew": "Uue robotiparooli loomine",
        "botpasswords-editexisting": "Olemasoleva robotiparooli muutmine",
+       "botpasswords-label-needsreset": "(parool vajab lähtestamist)",
        "botpasswords-label-appid": "Robotinimi:",
        "botpasswords-label-create": "Loo",
        "botpasswords-label-update": "Uuenda",
        "botpasswords-restriction-failed": "Robotiparooli piirangud takistavad sisselogimist.",
        "botpasswords-invalid-name": "Määratud kasutajanimi ei sisalda robotiparooli eraldajat (\"$1\").",
        "botpasswords-not-exist": "Kasutaja \"$1\" robotinimele \"$2\" vastav robotiparool puudub.",
+       "botpasswords-needs-reset": "Kasutaja \"$1\" robotinime \"$2\" robotiparool tuleb lähtestada.",
        "resetpass_forbidden": "Paroole ei saa muuta",
        "resetpass_forbidden-reason": "Paroole ei saa muuta: $1",
        "resetpass-no-info": "Pead olema sisselogitud, et sellele lehele pääseda.",
        "subject-preview": "Resümee eelvaade:",
        "previewerrortext": "Sinu muudatuste eelvaatluse juures esines tõrge.",
        "blockedtitle": "Kasutaja on blokeeritud",
-       "blockedtext": "'''Sinu kasutajanimi või IP-aadress on blokeeritud.'''\n\nBlokeeris $1.\nTema põhjendus on järgmine: ''$2''.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi.\n\nSinu praegune IP-aadress on $3 ning blokeeringu number on #$5. Lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
-       "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:''$2''\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa teisele kasutajale teadet saata, kui sa pole kinnitanud oma [[Special:Preferences|eelistuste lehel]] kehtivat e-posti aadressi ega ole selle kasutamisest blokeeritud.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
+       "blockedtext": "<strong>Sinu kasutajanimi või IP-aadress on blokeeritud.</strong>\n\nBlokeeris $1.\nTema põhjendus on järgmine: <em>$2</em>.\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nSa ei saa kasutada funktsiooni \"{{int:emailuser}}\", kui [[Special:Preferences|konto eelistustes]] pole määratud kehtivat e-posti aadressi või kui sul on keelatud seda funktsiooni kasutada.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number on #$5. Palun lisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
+       "autoblockedtext": "Sinu IP-aadress blokeeriti automaatselt, sest seda kasutas teine kasutaja, kelle $1 blokeeris.\nPõhjendus on järgmine:\n\n:<em>$2</em>\n\n* Blokeeringu algus: $8\n* Blokeeringu lõpp: $6\n* Sooviti blokeerida: $7\n\nKüsimuse arutamiseks võid pöörduda kasutaja $1 või mõne teise [[{{MediaWiki:Grouppage-sysop}}|administraatori]] poole.\n\nPane tähele, et sa ei saa kasutada funktsiooni \"{{int:emailuser}}\", kui [[Special:Preferences|konto eelistustes]] pole määratud kehtivat e-posti aadressi või kui sul on keelatud seda funktsiooni kasutada.\n\nSinu praegune IP-aadress on $3 ja blokeeringu number #$5. Palun lisa need andmed kõigile järelpärimistele, mida kavatsed teha.",
        "systemblockedtext": "MediaWiki tarkvara on sinu kasutajanime või IP-aadressi automaatselt blokeerinud.\nToodud on järgmine põhjus:\n\n:<em>$2</em>\n\n* Blokeerimisaeg: $8\n* Blokeeringu aegumistähtaeg: $6\n* Sooviti blokeerida: $7\n\nSinu praegune IP-aadress on $3.\nLisa need andmed kõigile järelepärimistele, mida kavatsed teha.",
        "blockednoreason": "põhjendust ei ole kirja pandud",
        "whitelistedittext": "Lehekülgede toimetamiseks pead $1.",
        "recentchangescount": "Mitut muudatust viimaste muudatuste loendis, lehekülgede ajalugudes ja logides vaikimisi näidata:",
        "prefs-help-recentchangescount": "Suurim võimalik väärtus: 1000",
        "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]].",
-       "prefs-help-tokenmanagement": "#REDIRECT [[MediaWiki:Prefs-help-watchlist-token2/et]]",
+       "prefs-help-tokenmanagement": "Saad vaadata ja lähtestada salavõtit, mis võimaldab juurdepääsu konto jälgimisloendi veebivoole. Igaüks, kes võtit teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.",
        "savedprefs": "Sinu eelistused on salvestatud.",
        "savedrights": "Kasutaja $1 rühmad on salvestatud.",
        "timezonelegend": "Ajavöönd:",
        "recentchangeslinked-feed": "Seotud muudatused",
        "recentchangeslinked-toolbox": "Seotud muudatused",
        "recentchangeslinked-title": "Leheküljega \"$1\" seotud muudatused",
-       "recentchangeslinked-summary": "Sisesta lehekülje pealkri, et näha muudatusi lehekülgedel, mis viitavad sellele leheküljele, või millele viidatakse sellel leheküljel. Et näha kategooria liikmeid, sisesta \"Kategooria:Kategooria pealkiri\". Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on  <strong>rasvases kirjas</strong>.",
+       "recentchangeslinked-summary": "Sisesta lehekülje pealkri, et näha muudatusi lehekülgedel, mis viitavad sellele leheküljele, või millele viidatakse sellel leheküljel. Et näha kategooria liikmeid, sisesta \"{{ns:category}}:Kategooria pealkiri\". Sinu [[Special:Watchlist|jälgimisloendi]] leheküljed on  <strong>rasvases kirjas</strong>.",
        "recentchangeslinked-page": "Lehekülje nimi:",
        "recentchangeslinked-to": "Näita hoopis muudatusi lehekülgedel, mis sellele lehele lingivad",
        "recentchanges-page-added-to-category": "kategooriasse lisatud \"[[:$1]]\"",
        "protectedtitles-submit": "Kuva pealkirjad",
        "listusers": "Kasutajate loend",
        "listusers-editsonly": "Näita vaid kasutajaid, kes on teinud muudatusi",
+       "listusers-temporarygroupsonly": "Näita vaid kasutajaid, kelle rühmaliikmesus on ajutine",
        "listusers-creationsort": "Järjesta konto loomise aja järgi",
        "listusers-desc": "Järjesta laskuvalt",
        "usereditcount": "$1 {{PLURAL:$1|redigeerimine|redigeerimist}}",
        "apisandbox-dynamic-parameters-add-label": "Lisa parameeter:",
        "apisandbox-dynamic-parameters-add-placeholder": "Parameetri nimi",
        "apisandbox-dynamic-error-exists": "Parameeter nimega \"$1\" on juba olemas.",
+       "apisandbox-templated-parameter-reason": "Seda [[Special:ApiHelp/main#main/templatedparams|mallparameetrit]] pakutakse välja $2 {{PLURAL:$1|väärtuse|väärtuste}} põhjal.",
        "apisandbox-deprecated-parameters": "Vananenud parameetrid",
        "apisandbox-fetch-token": "Hangi luba automaatselt",
        "apisandbox-add-multi": "Lisa",
        "whatlinkshere": "Lingid siia",
        "whatlinkshere-title": "Leheküljed, mis viitavad lehele \"$1\"",
        "whatlinkshere-page": "Lehekülg:",
-       "linkshere-2": "Lehele '''$1''' viitavad järgmised leheküljed:",
-       "nolinkshere-2": "Lehele '''$1''' ei viita ükski lehekülg.",
-       "nolinkshere-ns-2": "Leheküljele <strong>$1</strong> ei ole valitud nimeruumis linke.",
+       "linkshere-2": "Lehele '''$2''' viitavad järgmised leheküljed:",
+       "nolinkshere-2": "Lehele '''$2''' ei viita ükski lehekülg.",
+       "nolinkshere-ns-2": "Leheküljele <strong>$2</strong> ei ole valitud nimeruumis linke.",
        "isredirect": "ümbersuunamislehekülg",
        "istemplate": "kasutamine mallina",
        "isimage": "faililink",
        "pagedata-title": "Lehekülje andmed",
        "pagedata-text": "See lehekülg varustab leheküljed andmeliidesega. Palun too internetiaadressis ära lehekülje pealkiri, kasutades alamlehekülje süntaksit.\n* Sisu kooskõlastatakse vastavalt sinu kliendi Accept-päisele. See tähendab seda, et andmeid pakutakse vormingus, mida sinu klient eelistab.",
        "pagedata-not-acceptable": "Vastavat vormingut ei leitud. Toetatud MIME tüübid: $1",
-       "pagedata-bad-title": "Vigane pealkiri: $1."
+       "pagedata-bad-title": "Vigane pealkiri: $1.",
+       "unregistered-user-config": "Registreerumata kasutajad ei saa turvakaalutluse tõttu kasutaja JavaScripti, CSS- ja JSON-alamlehekülgi laadida.",
+       "passwordpolicies": "Paroolireeglid",
+       "passwordpolicies-summary": "Siin on loetletud vikis kasutusel olevate kasutajarühmade suhtes kehtivad paroolireeglid.",
+       "passwordpolicies-group": "Rühm",
+       "passwordpolicies-policies": "Reeglid",
+       "passwordpolicies-policy-minimalpasswordlength": "Parool peab olema vähemalt $1 {{PLURAL:$1|märgi}} pikkune.",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Parool peab olema vähemalt $1 {{PLURAL:$1|märgi}} pikkune, et saaks sisse logida.",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Parool ei tohi olla sama mis kasutajanimi.",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Parool ei tohi olla kantud musta nimekirja.",
+       "passwordpolicies-policy-maximalpasswordlength": "Parool peab olema $1 {{PLURAL:$1|märgist}} lühem.",
+       "passwordpolicies-policy-passwordcannotbepopular": "Parool ei tohi olla {{PLURAL:$1|populaarne parool|$1 populaarse parooli loendis}}."
 }
index 7417273..4bd471b 100644 (file)
        "customcssprotected": "Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.",
        "customjsprotected": "Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.",
        "mycustomcssprotected": "Ez duzu baimenik CSS orrialde hau aldatzeko.",
+       "mycustomjsonprotected": "Ez duzu baimenik JSON orrialde hau aldatzeko.",
        "mycustomjsprotected": "Ez duzu baimentik JavaScript orrialdea aldatzeko.",
        "myprivateinfoprotected": "Ez duzu eskumenik zure informazio pribatua aldatzeko.",
        "mypreferencesprotected": "Ez daukazu eskumenik zure hobespenak aldatzeko.",
        "whatlinkshere": "Honanzko lotura duten orriak",
        "whatlinkshere-title": "$1(e)ra lotura duten orriak",
        "whatlinkshere-page": "Orria:",
-       "linkshere-2": "Hauek dute '''$1''' orrialderako lotura:",
-       "nolinkshere-2": "Ez dago '''$1''' lotura duen orrialderik.",
-       "nolinkshere-ns-2": "Hautatutako izen-tartean ez dago '''$1''' orrialderako lotura duenik.",
+       "linkshere-2": "Hauek dute '''$2''' orrialderako lotura:",
+       "nolinkshere-2": "Ez dago '''$2''' lotura duen orrialderik.",
+       "nolinkshere-ns-2": "Hautatutako izen-tartean ez dago '''$2''' orrialderako lotura duenik.",
        "isredirect": "birbideratze orrialdea",
        "istemplate": "erabilpena",
        "isimage": "fitxategi lotura",
index 73086be..f2fab6c 100644 (file)
        "whatlinkshere": "Lo que atija aquina",
        "whatlinkshere-title": "Páhinas que atihan a $1",
        "whatlinkshere-page": "Páhina:",
-       "linkshere-2": "Las siguientis páhinas atihan a '''$1''':",
-       "nolinkshere-2": "Denguna páhina atiha a '''$1'''.",
-       "nolinkshere-ns-2": "Nu ai denguna páhina qu´atihi a '''$1''' nel espaciu e nombris lihiu.",
+       "linkshere-2": "Las siguientis páhinas atihan a '''$2''':",
+       "nolinkshere-2": "Denguna páhina atiha a '''$2'''.",
+       "nolinkshere-ns-2": "Nu ai denguna páhina qu´atihi a '''$2''' nel espaciu e nombris lihiu.",
        "isredirect": "Rederihil páhina",
        "istemplate": "inclusión",
        "isimage": "atihu la imahin",
index 1d17909..5cc628c 100644 (file)
        "whatlinkshere": "پیوندها به این صفحه",
        "whatlinkshere-title": "صفحه‌هایی که به «$1» پیوند دارند",
        "whatlinkshere-page": "صفحه:",
-       "linkshere-2": "صفحه‌های زیر به '''$1''' پیوند دارند:",
-       "nolinkshere-2": "هیچ صفحه‌ای به '''$1''' پیوند ندارد.",
-       "nolinkshere-ns-2": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''$1''' پیوند ندارد.",
+       "linkshere-2": "صفحه‌های زیر به '''$2''' پیوند دارند:",
+       "nolinkshere-2": "هیچ صفحه‌ای به '''$2''' پیوند ندارد.",
+       "nolinkshere-ns-2": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''$2''' پیوند ندارد.",
        "isredirect": "صفحهٔ تغییرمسیر",
        "istemplate": "تراگنجانش‌ها",
        "isimage": "پیوند به پرونده",
index 182e853..3ecbfac 100644 (file)
        "whatlinkshere": "Tänne viittaavat sivut",
        "whatlinkshere-title": "Sivut, jotka viittaavat sivulle $1",
        "whatlinkshere-page": "Sivu:",
-       "linkshere-2": "Seuraavilta sivuilta on linkki sivulle <strong>$1</strong>:",
-       "nolinkshere-2": "Sivulle <strong>$1</strong> ei ole linkkejä.",
-       "nolinkshere-ns-2": "Sivulle <strong>$1</strong> ei ole linkkejä valitussa nimiavaruudessa.",
+       "linkshere-2": "Seuraavilta sivuilta on linkki sivulle <strong>$2</strong>:",
+       "nolinkshere-2": "Sivulle <strong>$2</strong> ei ole linkkejä.",
+       "nolinkshere-ns-2": "Sivulle <strong>$2</strong> ei ole linkkejä valitussa nimiavaruudessa.",
        "isredirect": "ohjaussivu",
        "istemplate": "sisällytetty",
        "isimage": "tiedostolinkki",
index 34b3a95..cf8d321 100644 (file)
        "whatlinkshere": "Hvat slóðar higar",
        "whatlinkshere-title": "Síður sum slóða til \"$1\"",
        "whatlinkshere-page": "Síða:",
-       "linkshere-2": "Hesar síður slóða til '''$1''':",
-       "nolinkshere-2": "Ongar síður slóða til '''$1'''.",
-       "nolinkshere-ns-2": "Ongar síður slóða til '''$1''' í tí valda navnarúminum.",
+       "linkshere-2": "Hesar síður slóða til '''$2''':",
+       "nolinkshere-2": "Ongar síður slóða til '''$2'''.",
+       "nolinkshere-ns-2": "Ongar síður slóða til '''$2''' í tí valda navnarúminum.",
        "isredirect": "ávísingarsíða",
        "istemplate": "leggjast innan í",
        "isimage": "fílu slóð",
index b0d2b27..2a6817f 100644 (file)
        "dellogpage": "Journal des suppressions",
        "dellogpagetext": "Voici la liste des suppressions les plus récentes.",
        "deletionlog": "journal des suppressions",
+       "log-name-create": "Journal des créations de pages",
+       "log-description-create": "Ci-dessous, la liste des dernières créations de pages.",
+       "logentry-create-create": "$1 {{GENDER:$2|a créé}} la page $3",
        "reverted": "Version précédente rétablie",
        "deletecomment": "Motif :",
        "deleteotherreason": "Motif autre ou supplémentaire :",
        "whatlinkshere": "Pages liées",
        "whatlinkshere-title": "Pages qui pointent vers « $1 »",
        "whatlinkshere-page": "Page :",
-       "linkshere-2": "Les pages ci-dessous contiennent un lien vers <strong>$1</strong> :",
-       "nolinkshere-2": "Aucune page ne contient de lien vers <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Aucune page ne contient de lien vers <strong>$1</strong> dans l'espace de noms choisi.",
+       "linkshere-2": "Les pages ci-dessous contiennent un lien vers <strong>$2</strong> :",
+       "nolinkshere-2": "Aucune page ne contient de lien vers <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Aucune page ne contient de liens vers <strong>$2</strong> dans l'espace de noms choisi.",
        "isredirect": "page de redirection",
        "istemplate": "inclusion",
        "isimage": "lien vers le fichier",
index 9607106..9a34922 100644 (file)
        "whatlinkshere": "Pâges liyêes",
        "whatlinkshere-title": "Pâges que pouentont vers « $1 »",
        "whatlinkshere-page": "Pâge :",
-       "linkshere-2": "Cetes pâges contegnont un lim de vers <strong>$1</strong> :",
-       "nolinkshere-2": "Niona pâge contint de lim de vers <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Niona pâge contint de lim de vers <strong>$1</strong> dedens l’èspâço de noms chouèsi.",
+       "linkshere-2": "Cetes pâges contegnont un lim de vers <strong>$2</strong> :",
+       "nolinkshere-2": "Niona pâge contint de lim de vers <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Niona pâge contint de lim de vers <strong>$2</strong> dedens l’èspâço de noms chouèsi.",
        "isredirect": "pâge de redirèccion",
        "istemplate": "transcllusion",
        "isimage": "lim de vers lo fichiér",
index f4b889d..5fe0995 100644 (file)
        "whatlinkshere": "Ferwisangen üüb detdiar sidj",
        "whatlinkshere-title": "Sidjen, diar üüb \"$1\" ferwise",
        "whatlinkshere-page": "Sidj:",
-       "linkshere-2": "Jodiar sidjen ferwise üüb '''„$1“''':",
-       "nolinkshere-2": "Nian sidj ferwiset üüb $1",
-       "nolinkshere-ns-2": "Nian sidj ferwiset üüb '''„$1“''' uun di ütjsoocht nöömrüm.",
+       "linkshere-2": "Jodiar sidjen ferwise üüb '''„$2“''':",
+       "nolinkshere-2": "Nian sidj ferwiset üüb $2",
+       "nolinkshere-ns-2": "Nian sidj ferwiset üüb '''„$2“''' uun di ütjsoocht nöömrüm.",
        "isredirect": "widjerfeerang",
        "istemplate": "iinbünjen föörlaagen",
        "isimage": "Dateilink",
index 92e11bf..ee6d34c 100644 (file)
        "whatlinkshere": "Leams a cheste vôs",
        "whatlinkshere-title": "Pagjinis che a son leadis a \"$1\"",
        "whatlinkshere-page": "Pagjine:",
-       "linkshere-2": "Lis pagjinis ca sot a son leadis a '''$1''':",
-       "nolinkshere-2": "Nissune pagjine e à leams a '''$1'''.",
-       "nolinkshere-ns-2": "No son pagjine leadis a '''$1''' intal spazi dai nons sielt.",
+       "linkshere-2": "Lis pagjinis ca sot a son leadis a '''$2''':",
+       "nolinkshere-2": "Nissune pagjine e à leams a '''$2'''.",
+       "nolinkshere-ns-2": "No son pagjine leadis a '''$2''' intal spazi dai nons sielt.",
        "isredirect": "pagjine di reindirizament",
        "istemplate": "includude",
        "isimage": "leam a figure",
index 648cf63..1ed186b 100644 (file)
        "whatlinkshere": "Wat is hjirmei keppele?",
        "whatlinkshere-title": "Siden dy't keppele binne mei \"$1\"",
        "whatlinkshere-page": "Side:",
-       "linkshere-2": "Dizze siden binne keppele oan '''$1''':",
-       "nolinkshere-2": "Der binne gjin siden oan '''$1''' keppele.",
-       "nolinkshere-ns-2": "Gjin siden yn de keazen nammeromte keppelje nei '''$1'''.",
+       "linkshere-2": "Dizze siden binne keppele oan '''$2''':",
+       "nolinkshere-2": "Der binne gjin siden oan '''$2''' keppele.",
+       "nolinkshere-ns-2": "Gjin siden yn de keazen nammeromte keppelje nei '''$2'''.",
        "isredirect": "synonym",
        "istemplate": "opnaam",
        "isimage": "triemkeppeling",
index f59930b..a8f1ea7 100644 (file)
        "whatlinkshere": "Naisc leis an lch seo",
        "whatlinkshere-title": "Naisc le $1",
        "whatlinkshere-page": "Leathanach:",
-       "linkshere-2": "Tá nasc chuig '''$1''' ar na leathanaigh seo a leanas:",
-       "nolinkshere-2": "Níl leathanach ar bith ann a bhfuil nasc chuig '''$1''' air.",
-       "nolinkshere-ns-2": "Níl leathanach ar bith ann san ainmspás roghnaithe a bhfuil nasc chuig '''$1''' air.",
+       "linkshere-2": "Tá nasc chuig '''$2''' ar na leathanaigh seo a leanas:",
+       "nolinkshere-2": "Níl leathanach ar bith ann a bhfuil nasc chuig '''$2''' air.",
+       "nolinkshere-ns-2": "Níl leathanach ar bith ann san ainmspás roghnaithe a bhfuil nasc chuig '''$2''' air.",
        "isredirect": "Leathanach athsheolaidh",
        "istemplate": "iniamh",
        "isimage": "nasc comhad",
index 00bf854..46af8d0 100644 (file)
        "whatlinkshere": "Baalantılar sayfaa",
        "whatlinkshere-title": "$1 baalantısı olan sayfalar",
        "whatlinkshere-page": "Yaprak:",
-       "linkshere-2": "Buraya baalantısı var olan sayfalar '''$1''':",
-       "nolinkshere-2": "Yok buraya baalanan sayfa '''$1'''.",
+       "linkshere-2": "Buraya baalantısı var olan sayfalar '''$2''':",
+       "nolinkshere-2": "Yok buraya baalanan sayfa '''$2'''.",
        "isredirect": "yönnendirmäk sayfası",
        "istemplate": "eklemää",
        "isimage": "fayl baalantısı",
index 64ddae7..a90f038 100644 (file)
        "whatlinkshere": "有什哩连到个首",
        "whatlinkshere-title": "连到 $1 𠮶页面",
        "whatlinkshere-page": "页面:",
-       "linkshere-2": "下底𠮶页面链接到$1:",
-       "nolinkshere-2": "冇页面链接到$1。",
-       "nolinkshere-ns-2": "选正𠮶空间名内冇页面链接到$1。",
+       "linkshere-2": "下底𠮶页面链接到$2:",
+       "nolinkshere-2": "冇页面链接到$2。",
+       "nolinkshere-ns-2": "选正𠮶空间名内冇页面链接到$2。",
        "isredirect": "重定向页面",
        "istemplate": "含到",
        "isimage": "档案连结",
index 944d037..f5ebf64 100644 (file)
        "whatlinkshere": "有什哩連到箇首",
        "whatlinkshere-title": "連到 $1 嗰頁面",
        "whatlinkshere-page": "頁面:",
-       "linkshere-2": "下底嗰頁面連結到$1:",
-       "nolinkshere-2": "冇頁面連結到$1。",
-       "nolinkshere-ns-2": "選正嗰空間名內冇頁面連結到$1。",
+       "linkshere-2": "下底嗰頁面連結到$2:",
+       "nolinkshere-2": "冇頁面連結到$2。",
+       "nolinkshere-ns-2": "選正嗰空間名內冇頁面連結到$2。",
        "isredirect": "重定向頁",
        "istemplate": "含到",
        "isimage": "檔案連結",
index 89f046e..135287d 100644 (file)
        "whatlinkshere": "Paj lyé",
        "whatlinkshere-title": "Paj ki ka pwenté bò'd « $1 »",
        "whatlinkshere-page": "Paj :",
-       "linkshere-2": "Paj-ya ki anba ka kontni roun lyen vèr <strong>$1</strong> :",
-       "nolinkshere-2": "Pyès paj pa gen kontni dé lyen vèr <strong>$1</strong>.",
+       "linkshere-2": "Paj-ya ki anba ka kontni roun lyen vèr <strong>$2</strong> :",
+       "nolinkshere-2": "Pyès paj pa gen kontni dé lyen vèr <strong>$2</strong>.",
        "isredirect": "paj di roudirèksyon",
        "istemplate": "enklizyon",
        "isimage": "Lyen vèr fiché-a",
index e5a0161..c8b8b0d 100644 (file)
        "whatlinkshere": "Na tha a' ceangal a-nall an-seo",
        "whatlinkshere-title": "Duilleagan a tha a' ceangal ri \"$1\"",
        "whatlinkshere-page": "Duilleag:",
-       "linkshere-2": "Tha na duilleagan a leanas a' ceangal ri <strong>$1</strong>:",
-       "nolinkshere-2": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Chan eil ceangal gu <strong>$1</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
+       "linkshere-2": "Tha na duilleagan a leanas a' ceangal ri <strong>$2</strong>:",
+       "nolinkshere-2": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Chan eil ceangal gu <strong>$2</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
        "isredirect": "duilleag ath-sheòlaidh",
        "istemplate": "transclusion",
        "isimage": "ceangal faidhle",
index f584af6..9bd0e32 100644 (file)
        "subject-preview": "Vista previa do asunto:",
        "previewerrortext": "Produciuse un erro ao intentar previsualizar os cambios.",
        "blockedtitle": "O usuario está bloqueado",
-       "blockedtext": "<strong>Bloqueouse o seu nome de usuario ou enderezo IP.</strong>\n\n$1 estableceu o bloqueo.\nO motivo que achegou foi <em>$2</em>.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o identificador do bloqueo é #$5.\nPor favor, inclúa todos estes datos nas consultas que faga.",
-       "autoblockedtext": "O seu enderezo IP foi bloqueado automaticamente porque foi empregado por outro usuario que foi bloqueado por $1.\nA razón que deu foi a seguinte:\n\n:''$2''\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\n\nTeña en conta que non pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.\n\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
+       "blockedtext": "<strong>Bloqueouse o seu nome de usuario ou enderezo IP.</strong>\n\n$1 estableceu o bloqueo.\nO motivo que achegou foi <em>$2</em>.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"{{int:emailuser}}\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o identificador do bloqueo é #$5.\nPor favor, inclúa todos estes datos nas consultas que faga.",
+       "autoblockedtext": "O seu enderezo IP foi bloqueado automaticamente porque foi empregado por outro usuario que foi bloqueado por $1.\nA razón que deu foi a seguinte:\n\n:<em>$2</em>\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\n\nTeña en conta que non pode empregar a característica \"{{int:emailuser}}\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.\n\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
        "systemblockedtext": "O seu nome de usuario ou enderezo IP foi bloqueado automaticamente polo sistema MediaWiki.\nO motivo do bloqueo é:\n\n:<em>$2</em>\n\n* Comezo do bloqueo: $8\n* Expiración do bloqueo: $6\n* Destinatario do bloqueo: $7\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos estes detalles en calquera consulta que realice.",
        "blockednoreason": "non se deu ningunha razón",
        "whitelistedittext": "Debe $1 para poder editar páxinas.",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Número de días a mostrar nos cambios recentes:",
        "recentchangesdays-max": "Máximo: $1 {{PLURAL:$1|día|días}}",
-       "recentchangescount": "Número de edicións a mostrar por defecto:",
+       "recentchangescount": "Número de edicións a amosar por defecto nos cambios recentes, nos historiais de páxina e nos rexistrosː",
        "prefs-help-recentchangescount": "Número máximo: 1000",
        "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.\nSe o precisa, [[Special:ResetTokens|pode restablecela]].",
        "prefs-help-tokenmanagement": "Podes ver e restaurar a chave secreta para a túa conta que pode acceder á fonte web da túa lista de vixiancia. Calquera que coñeza a chave poderá leer a túa lista de vixiancia.",
        "recentchangeslinked-feed": "Cambios relacionados",
        "recentchangeslinked-toolbox": "Cambios relacionados",
        "recentchangeslinked-title": "Cambios relacionados con \"$1\"",
-       "recentchangeslinked-summary": "Introduce un nome de páxina para ver os cambios en páxinas ligadas dende ou ata esa páxina. (Para ver os membros dunha categoría, introduce Categoría:Nome da categoría). Os cambios na túa [[Special:Watchlist|lista de vixiancia]] están en <strong>negra</strong>.",
+       "recentchangeslinked-summary": "Introduce un nome de páxina para ver os cambios en páxinas ligadas dende ou ata esa páxina. (Para ver os membros dunha categoría, introduce {{ns:category}}:Nome da categoría). Os cambios na túa [[Special:Watchlist|lista de vixiancia]] están en <strong>negra</strong>.",
        "recentchangeslinked-page": "Nome da páxina:",
        "recentchangeslinked-to": "Mostrar os cambios relacionados das páxinas que ligan coa dada",
        "recentchanges-page-added-to-category": "\"[[:$1]]\" engadiuse á categoría",
        "protectedtitles-submit": "Mostrar os títulos",
        "listusers": "Lista de usuarios",
        "listusers-editsonly": "Mostrar só os usuarios con edicións",
+       "listusers-temporarygroupsonly": "Amosar só usuarios en grupos de usuario temporais",
        "listusers-creationsort": "Ordenar por data de creación",
        "listusers-desc": "Ordenar de xeito descendente",
        "usereditcount": "$1 {{PLURAL:$1|edición|edicións}}",
        "dellogpage": "Rexistro de borrados",
        "dellogpagetext": "A continuación atópase a lista cos borrados máis recentes.",
        "deletionlog": "rexistro de borrados",
+       "log-name-create": "Rexistro de creación de páxinas",
+       "log-description-create": "Debaixo está a lista das páxinas creadas máis recentemente.",
+       "logentry-create-create": "$1 {{GENDER:$2|creou}} a páxina $3",
        "reverted": "Volveuse a unha versión anterior",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Outro motivo:",
        "whatlinkshere": "Páxinas que ligan con esta",
        "whatlinkshere-title": "Páxinas que ligan con \"$1\"",
        "whatlinkshere-page": "Páxina:",
-       "linkshere-2": "As seguintes páxinas ligan con \"'''$1'''\":",
-       "nolinkshere-2": "Ningunha páxina liga con \"'''$1'''\".",
-       "nolinkshere-ns-2": "Ningunha páxina liga con \"'''$1'''\" no espazo de nomes elixido.",
+       "linkshere-2": "As seguintes páxinas ligan con <strong>$2</strong>:",
+       "nolinkshere-2": "Ningunha páxina liga con <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Ningunha páxina liga con <strong>$2</strong> no espazo de nomes elixido.",
        "isredirect": "páxina redirixida",
        "istemplate": "inclusión",
        "isimage": "ligazón ao ficheiro",
index f65948d..843702e 100644 (file)
        "whatlinkshere": "هرچي خال ببؤ ائره",
        "whatlinkshere-title": "ولگؤني گه «$1»ˇ أمرأ خال دأنن",
        "whatlinkshere-page": "ولگ:",
-       "linkshere-2": "جيري ولگؤن '''$1'''ˇ أمرأ خال دأنن:",
+       "linkshere-2": "جيري ولگؤن '''$2'''ˇ أمرأ خال دأنن:",
        "isredirect": "تغييرمسيرˇ ولگ",
        "isimage": "فاىلˇ خال",
        "whatlinkshere-prev": "{{PLURAL:$1|قبلي|$1 قبلي مؤرد}}",
index 8b89f81..ebd9ef0 100644 (file)
        "whatlinkshere": "हाका कितें जुळटा",
        "whatlinkshere-title": " \"$1\" हाका जोडणी आशिल्लीं पानां",
        "whatlinkshere-page": "पान:",
-       "linkshere-2": "मुखावेली पानां '''$1''': हाका जोडणी करतात",
-       "nolinkshere-2": "$1हाका खंयच्याच पानाची जोडणी ना",
+       "linkshere-2": "मुखावेली पानां '''$2''': हाका जोडणी करतात",
+       "nolinkshere-2": "$2हाका खंयच्याच पानाची जोडणी ना",
        "isredirect": "पुनर्निर्देशन पान",
        "istemplate": "$1 दूसरात-समावेस",
        "isimage": "फायलीचो दुवो",
index ff45698..5d36b59 100644 (file)
        "whatlinkshere": "Hanga kitem zoddta",
        "whatlinkshere-title": "\"$1\" haka zoddlelim panam",
        "whatlinkshere-page": "Pan:",
-       "linkshere-2": "Sokoilim panam <strong>$1</strong> ak zoddtat:",
-       "nolinkshere-2": "Khoincheim pan '''$1''' ak zoddna.",
+       "linkshere-2": "Sokoilim panam <strong>$2</strong> ak zoddtat:",
+       "nolinkshere-2": "Khoincheim pan '''$2''' ak zoddna.",
        "isredirect": "punornirdexon pan",
        "istemplate": "Durasth-somaves",
        "isimage": "failichem zoddop",
index e69303e..4d0b731 100644 (file)
        "whatlinkshere": "Wumbuta",
        "whatlinkshere-title": "Halaman botiye o wumbuta ode \"$1\"",
        "whatlinkshere-page": "Halaman",
-       "linkshere-2": "Halaman botiye woluwo wumbuta ode <strong>$1<strong>:",
-       "nolinkshere-2": "Diya'a halaman wumbuta ode <strong>$1</strong>",
+       "linkshere-2": "Halaman botiye woluwo wumbuta ode <strong>$2<strong>:",
+       "nolinkshere-2": "Diya'a halaman wumbuta ode <strong>$2</strong>",
        "isredirect": "halaman pilobaleyalo",
        "istemplate": "tranklusi",
        "isimage": "wumbuta lo berkas",
index d1d4424..5697b6e 100644 (file)
        "tog-enotifusertalkpages": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌼𐌹𐌺 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌾𐌰𐌱𐌰𐌹 𐌼𐌴𐌹𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰",
        "tog-shownumberswatching": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐍅𐌹𐍄𐌰𐌽𐌳𐌰𐌹𐌶𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌴",
        "tog-oldsig": "𐌸𐌴𐌹𐌽𐌰 𐍅𐌹𐍃𐌰𐌽𐌳𐌴𐌹 𐌿𐍆𐌼𐌴𐌻𐌴𐌹𐌽𐍃",
+       "tog-showhiddencats": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
+       "tog-prefershttps": "𐌱𐍂𐌿𐌺𐌴𐌹 𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐌰𐍂𐍅𐌾𐌰𐌹𐌶𐍉𐍃 𐌲𐌰𐍅𐌹𐍃𐌰𐌹𐍃 𐌸𐌰𐌽 𐌰𐍄𐌹𐌳𐌳𐌾𐌰",
        "underline-always": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉",
        "underline-never": "𐌽𐌹 𐌰𐌹𐍅",
+       "editfont-serif": "𐍃𐌰𐌹𐍂𐌹𐍆 𐍆𐌰𐌿𐌽𐍄",
        "sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
        "monday": "𐌼𐌴𐌽𐌹𐌽𐍃 𐌳𐌰𐌲𐍃",
        "tuesday": "𐍄𐌴𐌹𐍅𐌹𐍃 𐌳𐌰𐌲𐍃",
@@ -74,6 +77,7 @@
        "february-date": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃 $1",
        "march-date": "𐌼𐌰𐍂𐍄𐌹𐌿𐍃 $1",
        "april-date": "𐌰𐍀𐍂𐌹𐌻𐌹𐍃 $1",
+       "may-date": "𐌼𐌰𐌹𐌿𐍃 $1",
        "september-date": "𐍃𐌰𐌹𐍀𐍄𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
        "november-date": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
        "pagecategories": "{{PLURAL:$1|𐌺𐌿𐌽𐌹|𐌺𐌿𐌽𐌾𐌰}}",
        "category-subcat-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌴𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 {{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌹𐍆𐍄𐌿𐌼𐌰 $1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌺𐌿𐌽𐌾𐌴.}}",
        "category-subcat-count-limited": "𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌹𐍆𐍄𐌿𐌼𐍉𐌽/𐌹𐍆𐍄𐌿𐌼𐍉𐌽𐌰\n{{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|$1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}.",
        "category-article-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼𐌰𐌽 𐌻𐌰𐌿𐍆.|𐌹𐍆𐍄𐌿𐌼𐌰(𐌽𐍃) {{PLURAL:$1|𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄|$1 𐌻𐌰𐌿𐌱𐍉𐍃 𐍃𐌹𐌽𐌳}} 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌺𐌿𐌽𐌾𐌰, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌻𐌰𐌿𐌱𐌴.}}",
+       "broken-file-category": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌼𐌹𐌸 𐌱𐍂𐌹𐌺𐌰𐌽𐌰𐌹𐌼 𐍆𐌰𐌾𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌹𐌼",
        "about": "𐌱𐌹",
        "article": "𐌷𐌰𐌱𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "newwindow": "(𐌿𐍃𐌻𐌿𐌺𐌹𐌸 𐌹𐌽 𐌽𐌹𐌿𐌾𐌰𐌼𐌼𐌰 𐌰𐌿𐌲𐌰𐌳𐌰𐌿𐍂𐌹𐌽)",
        "cancel": "𐍃𐍅𐌴𐌹𐌱",
        "moredotdotdot": "𐌼𐌰𐌹𐍃...",
+       "morenotlisted": "𐍃𐍉 𐍅𐌹𐌺𐍉 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌿𐌽𐌲𐌰𐍆𐌰𐌿𐍂𐌳𐌰.",
        "mypage": "𐌻𐌰𐌿𐍆𐍃",
        "mytalk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
+       "anontalk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
        "navigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
        "and": "𐌾𐌰𐌷",
+       "faq": "𐍆𐌹𐌻𐌿 𐍆𐍂𐌰𐌹𐌷𐌽𐌰𐌽𐍉𐍃 𐌱𐌹𐌳𐍉𐍃",
        "actions": "𐍄𐍉𐌾𐌰",
        "namespaces": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼𐌰",
        "variants": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺",
+       "navigation-heading": "𐌱𐌰𐌿𐍄𐌰",
        "errorpagetitle": "𐌰𐌹𐍂𐌶𐌴𐌹",
        "returnto": "𐌲𐌰𐍅𐌰𐌽𐌳𐌴𐌹 𐌳𐌿 $1.",
        "tagline": "𐍆𐍂𐌰𐌼 {{SITENAME}}",
        "view": "𐍃𐌰𐌹𐍈",
        "view-foreign": "𐍃𐌰𐌹𐍈 𐌰𐌽𐌰 $1",
        "edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
+       "edit-local": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐍃𐍄𐌰𐌳𐌹𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽",
        "create": "𐍃𐌺𐌰𐍀𐌴𐌹",
+       "create-local": "𐌰𐌽𐌰𐌰𐌹𐌰𐌿𐌺 𐍃𐍄𐌰𐌳𐌹𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽",
        "delete": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
        "protect": "𐍆𐍂𐌹𐌸",
        "protect_change": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
        "talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
        "views": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃",
        "toolbox": "𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
+       "tool-link-emailuser": "𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 {{{{GENDER:$1|𐌼𐌰𐌽𐌽}}",
+       "imagepage": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐍆𐌰𐌾𐌻𐌰𐌻𐌰𐌿𐍆",
        "mediawikipage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐍅𐌰𐌿𐍂𐌳𐌰𐌻𐌰𐌿𐍆",
        "viewhelppage": "𐌰𐌽𐌳𐌷𐌿𐌻𐌴𐌹 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆",
+       "viewtalkpage": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
        "otherlanguages": "𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍂𐌰𐌶𐌳𐍉𐌼",
        "redirectedfrom": "(𐌹𐍃 {{GENDER:𐍄𐌹𐌿𐌷𐌰𐌽𐍃|𐍄𐌹𐌿𐌷𐌰𐌽𐌰}} 𐌷𐌹𐌳𐍂𐌴 𐍆𐍂𐌰𐌼 $1)",
        "redirectpagesub": "𐌰𐌻𐌾𐌰𐍂 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
-       "lastmodifiedat": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌸𐌰𐍄𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌸𐍃 𐍅𐌰𐍃 ($1) ($2).",
+       "lastmodifiedat": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌸𐌰𐍄𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌸𐍃 𐍅𐌰𐍃 $1, 𐌰𐍄 $2.",
        "protectedpage": "𐍆𐍂𐌹𐌸𐍉𐌽𐍃 𐌻𐌰𐌿𐍆𐍃",
        "jumpto": "𐌲𐌰𐌲𐌲 𐌳𐌿:",
        "jumptonavigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
        "jumptosearch": "𐍃𐍉𐌺𐌴𐌹",
+       "view-pool-error": "𐌰𐍆𐌻𐌴𐍄 𐌿𐌽𐍃, 𐍃𐌺𐌰𐌻𐌺𐌹𐌽𐍉𐌽𐌳𐍃 𐌽𐌿 𐌿𐍆𐌰𐍂𐍆𐌹𐌻𐌿 𐌱𐍂𐌿𐌷𐍄𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳. 𐌿𐍆𐌰𐍂𐍆𐌹𐌻𐌿 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌴 𐍃𐍉𐌺𐌾𐌰𐌽𐌳 𐌳𐌿 𐌱𐌰𐌽𐌳𐍅𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆. 𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺, 𐌱𐌴𐌹𐌳 𐌻𐌰𐌲𐌲𐌹𐍃 𐌼𐌴𐌻𐌹𐍃 𐍆𐌰𐌿𐍂𐌸𐌹𐌶𐌴𐌹 𐌰𐍆𐍄𐍂𐌰 𐍃𐍉𐌺𐌾𐌰𐌹𐍃 𐌳𐌿 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰. \n\n$1",
        "pool-errorunknown": "𐌽𐌰𐍃𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
+       "poolcounter-usage-error": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹: $1",
        "aboutsite": "𐌱𐌹 {{SITENAME}}",
        "aboutpage": "Project:𐌱𐌹",
        "copyrightpage": "{{ns:project}}:𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐌹𐍂𐌰𐌹𐌷𐍄𐌴𐌹𐍃",
        "portal-url": "Project:𐌲𐌰𐌵𐌿𐌼𐌸𐍃 𐌲𐌰𐌼𐌰𐌹𐌽𐌳𐌿𐌸𐌰𐌹𐍃",
        "privacy": "𐍃𐌿𐌽𐌳𐍂𐌰𐌻𐌴𐌹𐌺𐌴𐌹𐌽𐍃 𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "privacypage": "Project:𐍃𐌿𐌽𐌳𐍂𐌰𐌻𐌴𐌹𐌺𐌴𐌹𐌽𐍃 𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+       "badaccess": "𐌰𐌽𐌳𐌻𐌴𐍄𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹",
+       "badaccess-group0": "𐌽𐌹𐍃𐍄 𐌰𐌽𐌳𐌻𐌴𐍄 𐌸𐌿𐍃 𐌳𐌿 𐌿𐍃𐍄𐌹𐌿𐌷𐌰𐌽 𐍄𐌰𐌿𐌹 𐌸𐌰𐍄𐌴𐌹 𐌸𐌿 𐍅𐌹𐌻𐌳𐌴𐍃.",
+       "badaccess-groups": "𐍄𐌰𐌿𐌹 𐌸𐌰𐍄𐌴𐌹 𐌸𐌿 𐍅𐌹𐌻𐌳𐌴𐍃 𐌹𐍃𐍄 𐌼𐌰𐍂𐌺𐍉𐌸 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌰𐌼 𐌹𐌽 {{PLURAL:$2|𐌺𐌿𐌽𐌾𐌰|𐌰𐌹𐌽𐌰𐌼𐌼𐌰 𐌺𐌿𐌽𐌾𐌴}}: $1.",
+       "versionrequired": "𐌿𐍃𐌼𐌴𐍂𐌾𐌰 $1 𐌼𐌰𐌹𐌳𐌾𐌰𐍅𐌹𐌺𐌾𐌹𐍃 𐍃𐌺𐌿𐌻𐌳 𐌹𐍃𐍄",
        "retrievedfrom": "𐌲𐌰𐌽𐌿𐌼𐌰𐌽 𐍆𐍂𐌰𐌼 \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|𐌷𐌰𐌱𐌰𐌹𐍃}} $1 ($2).",
+       "youhavenewmessagesmanyusers": "𐌷𐌰𐌱𐌰𐌹𐍃 $1 𐌼𐌰𐌽𐌰𐌲𐌰𐌹𐌶𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌴 ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|𐌽𐌹𐍅𐌹 𐍅𐌰𐌿𐍂𐌳|999=𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌿𐍂𐌳𐌰}}",
        "newmessagesdifflinkplural": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰/𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|999=𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
        "youhavenewmessagesmulti": "𐌷𐌰𐌱𐌰𐌹𐍃 𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌿𐍂𐌳𐌰 𐌰𐌽𐌰 $1",
        "toc": "𐌹𐌽𐌽𐌰𐌽𐌰",
        "showtoc": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
        "hidetoc": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "collapsible-expand": "𐌿𐍆𐌸𐌰𐌽𐌴𐌹",
        "confirmable-confirm": "𐌹𐍃 {{GENDER:$1:𐌸𐌿}} 𐌰𐍂𐌽𐌹𐌱𐌰?",
        "confirmable-yes": "𐌾𐌰",
        "confirmable-no": "𐌽𐌴",
+       "thisisdeleted": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌸𐌰𐌿 𐌲𐌰𐌵𐌹𐌿𐌾𐌰𐌽 $1?",
+       "viewdeleted": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 $1?",
        "site-rss-feed": "$1 RSS 𐍂𐌹𐌽𐌽𐍉",
        "site-atom-feed": "$1 𐌰𐍄𐌰𐌿𐌼 𐍂𐌹𐌽𐌽𐍉",
        "page-atom-feed": "\"$1\" 𐌰𐍄𐌰𐌿𐌼 𐍂𐌹𐌽𐌽𐍉",
        "red-link-title": "$1 (𐌻𐌰𐌿𐍆𐍃 𐌽𐌹𐍃𐍄)",
        "nstab-main": "𐌻𐌰𐌿𐍆𐍃",
        "nstab-user": "𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃 𐌻𐌰𐌿𐍆𐍃",
+       "nstab-media": "𐌼𐌰𐌹𐌳𐌾𐌰𐌻𐌰𐌿𐍆𐍃",
        "nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "nstab-project": "𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
        "nstab-image": "𐍆𐌰𐌾𐌻",
        "nstab-help": "𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
        "nstab-category": "𐌺𐌿𐌽𐌹",
        "mainpage-nstab": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
+       "nosuchaction": "𐍃𐍅𐌰𐌻𐌴𐌹𐌺 𐍄𐌰𐌿𐌹 𐌽𐌹𐍃𐍄",
        "nosuchspecialpage": "𐌽𐌹𐍃𐍄 𐍃𐍅𐌰𐌻𐌴𐌹𐌺𐍃 𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "error": "𐌰𐌹𐍂𐌶𐌴𐌹",
+       "databaseerror": "𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃 𐌳𐌰𐍄𐌰𐌷𐌿𐌶𐌳𐌹𐍃",
+       "databaseerror-function": "𐍆𐌿𐌽𐌺𐍄𐍃𐌾𐍉: $1",
        "databaseerror-error": "𐌰𐌹𐍂𐌶𐌴𐌹: $1",
+       "readonly": "𐌳𐌰𐍄𐌰𐌷𐌿𐌶𐌳 𐌻𐌿𐌺𐌰𐌽 𐌹𐍃𐍄",
+       "enterlockreason": "𐌲𐌹𐍆 𐍅𐌰𐌹𐌷𐍄 𐌻𐌿𐌺𐌰, 𐌾𐌰𐌷 𐍃𐍅𐌰 𐌻𐌰𐌲𐌲𐌰𐌱𐌰 𐍆𐌰𐌿𐍂𐌸𐌹𐌶𐌴𐌹 𐌻𐌿𐌺 𐌿𐍃𐌼𐌴𐍂𐌽𐌰𐌹",
        "missing-article": "𐌳𐌰𐍄𐌰𐌷𐌿𐌶𐌳 𐌽𐌹 𐌱𐌹𐌲𐌰𐍄 𐌱𐍉𐌺𐍉𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌸𐌹𐌶𐌴𐌹 𐍃𐌺𐌿𐌻𐌳𐌴𐌳𐌹 𐌱𐌹𐌲𐌹𐍄𐌰𐌽, 𐌷𐌰𐌹𐍄𐌰𐌽𐍃 \"$1\" $2. \n\n𐌸𐌰𐍄𐌰 𐌿𐍆𐍄𐌰 𐍅𐌰𐌹𐍂𐌸𐌹𐌸 𐌾𐌰𐌱𐌰𐌹 𐌻𐌰𐌹𐍃𐍄𐌾𐌰𐌳𐌰 𐍆𐌰𐌹𐍂𐌽𐌾𐌰 𐌳𐌹𐍆𐍆 𐌸𐌰𐌿 𐍃𐍀𐌹𐌻𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃 𐍃𐌴𐌹 𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌹𐌳𐌰 𐌹𐍃𐍄. 𐌾𐌰𐌱𐌰𐌹 𐌽𐌹𐍃𐍄, 𐌼𐌰𐌷𐍄𐍃 𐌹𐍃𐍄 𐌴𐌹 𐌱𐌹𐌲𐌴𐍄𐌴𐌹𐍃 𐌰𐌹𐍂𐌶𐌴𐌹𐌽 𐌹𐌽 𐍃𐌰𐌿𐍆𐍄𐍅𐌰𐌹𐍂𐌰. \n\n𐌱𐌹𐌳𐌾𐌰𐌼 𐌸𐌿𐌺, 𐌼𐌴𐍂𐌴𐌹 𐌸𐌰𐍄𐌰 𐌳𐌿 [[Special:ListUsers/sysop\n|𐍂𐌴𐌹𐌺]] 𐌲𐌹𐍆𐌿𐌷 𐌲𐌰𐍅𐌹𐍃.",
        "badarticleerror": "𐌸𐍉 𐍅𐌰𐌹𐌷𐍄 𐌽𐌹 𐌼𐌰𐌲𐍄 𐍄𐌰𐌿𐌾𐌰𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
        "cannotdelete-title": "𐌽𐌹 𐌼𐌰𐌲 𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌾𐌰𐌽 𐌻𐌰𐌿𐌱𐌰 \"$1\"",
        "badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
        "badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
        "viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
+       "viewsource-title": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌱𐍂𐌿𐌽𐌽𐌰𐌽 𐍆𐌰𐌿𐍂 $1",
        "protectedpagetext": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳, 𐌴𐌹 𐌽𐌹 𐍅𐌰𐌹𐍂𐌸𐌴𐌹𐌽𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌸𐌰𐌿 𐌰𐌽𐌸𐌰𐍂𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
+       "viewsourcetext": "𐌼𐌰𐌲𐍄 𐌱𐌰𐌽𐌳𐍅𐌾𐌰𐌽 𐌾𐌰𐌷 𐌺𐌰𐌿𐍀𐌾𐌰 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃.",
+       "mycustomcssprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 CSS 𐌻𐌰𐌿𐍆.",
+       "mycustomjsonprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 JSON 𐌻𐌰𐌿𐍆.",
        "mycustomjsprotected": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 JavaScript 𐌻𐌰𐌿𐍆.",
+       "ns-specialprotected": "𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌽𐌹 𐌼𐌰𐌲𐌿𐌽 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐌰.",
+       "cannotlogoutnow-title": "𐌰𐍆𐌻𐌴𐌹𐌸𐌰𐌽 𐌽𐌿 𐌼𐌰𐌷𐍄𐍃 𐌽𐌹𐍃𐍄",
+       "cannotlogoutnow-text": "𐌸𐌰𐌽 $1 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰 𐌰𐍆𐌻𐌴𐌹𐌸𐌰𐌽 𐌼𐌰𐌷𐍄𐍃 𐌽𐌹𐍃𐍄.",
        "welcomeuser": "𐍅𐌰𐌹𐌻𐌰 𐌰𐌽𐌳𐌰𐌽𐌴𐌼𐍃, $1!",
        "yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
        "userlogin-yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
        "createacct-yourpasswordagain": "𐌲𐌰𐍃𐌹𐌲𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
        "createacct-yourpasswordagain-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳 𐌰𐍆𐍄𐍂𐌰",
        "userlogin-remembermypassword": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌼𐌹𐌺 {{GENDER:𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌽𐌰|𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰}}",
+       "userlogin-signwithsecure": "𐌱𐍂𐌿𐌺𐌴𐌹 𐌰𐍂𐌽𐌾𐌰𐌹𐌶𐍉𐍃 𐌲𐌰𐍅𐌹𐍃𐌰𐌹𐍃",
        "cannotloginnow-title": "𐌽𐌿 𐌽𐌹 𐌼𐌰𐌲𐍄 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽",
        "login": "𐌰𐍄𐌲𐌰𐌲𐌲",
        "nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲 / 𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
        "createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
        "createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
+       "createacct-another-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃",
        "createacct-reason": "𐌲𐍂𐌿𐌽𐌳𐌿𐍃",
        "createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
        "createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
        "difference-multipage": "(𐌰𐌽𐌸𐌰𐍂𐌻𐌴𐌹𐌺𐌾𐌰 𐌼𐌹𐌸 𐌻𐌰𐌿𐌱𐌰𐌼)",
        "lineno": "𐍃𐍄𐍂𐌹𐌺𐍃 $1:",
        "editundo": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌰𐍆𐍄𐍂𐌰",
+       "diff-empty": "(𐌽𐌹 𐌰𐌽𐌸𐌰𐍂𐌻𐌴𐌹𐌺𐌴𐌹)",
        "diff-multi-sameuser": "({{PLURAL:$1|𐌰𐌹𐌽𐌰 𐌼𐌹𐌳𐌿𐌼𐌰𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃|$1 𐌼𐌹𐌳𐌿𐌼𐌰 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍉𐍃}} 𐍆𐍂𐌰𐌼 𐍃𐌰𐌼𐌹𐌽 𐌱𐍂𐌿𐌺𐌾𐌹𐌽 𐌽𐌹 𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐌰/𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐍉𐍃)",
        "searchresults": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰",
        "searchresults-title": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰 𐍆𐌰𐌿𐍂 \"$1\"",
        "nchanges": "$1 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
        "enhancedrc-history": "𐍃𐍀𐌹𐌻𐌻",
        "recentchanges": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
+       "recentchanges-legend": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌶𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 𐌼𐌰𐌷𐍄𐌴𐌹𐍃",
        "recentchanges-summary": "𐌰𐍆𐌰𐍂𐌻𐌰𐌹𐍃𐍄𐌴𐌹 𐌸𐌰𐌹𐌼 𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌹𐍃𐍄𐍉𐌼 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐌼 𐌳𐌿 𐍅𐌹𐌺𐌾𐌰 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
        "recentchanges-label-newpage": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌲𐌰𐍃𐌺𐍉𐍀 𐌽𐌹𐌿𐌾𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
        "recentchanges-label-minor": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "recentchanges-label-bot": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍄𐍉𐌾𐌰𐌳𐌰 𐍅𐌰𐍂𐌸 𐍆𐍂𐌰𐌼 𐌼𐌰𐌷𐍄𐌹𐍃𐌺𐌰𐌻𐌺𐌰 (𐌱𐌰𐌿𐍄)",
+       "recentchanges-label-unpatrolled": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌽𐌰𐌿𐌷 𐌽𐌹𐍃𐍄 𐍅𐌰𐍂𐌳𐌹𐌳𐌰",
        "recentchanges-label-plusminus": "𐌻𐌰𐌿𐌱𐌰𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌳𐌰 𐌼𐌹𐌸 𐌸𐌹𐌶𐌰𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐌱𐌹𐍄𐍉",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (𐍃𐌰𐌹𐍈 𐌾𐌰𐌷[[Special:NewPages|𐍅𐌹𐌺𐍉 𐌽𐌹𐌿𐌾𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴]])",
        "rcfilters-limit-title": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌳𐌿 𐌱𐌰𐌽𐌳𐍅𐌾𐌰𐌽",
        "rcshowhideanons": "$1 𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
        "rcshowhideanons-show": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹",
        "rcshowhideanons-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
+       "rcshowhidepatr": "$1 𐍅𐌰𐍂𐌳𐌹𐌳𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "rcshowhidemine": "$1 𐌼𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "rcshowhidemine-show": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹",
        "rcshowhidemine-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|𐌱𐌰𐌾𐍄|𐌱𐌰𐌾𐍄𐌰}} 𐌰𐍆𐌰𐍂 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌰𐌹",
+       "rc-old-title": "𐌸𐌰𐍄𐌴𐌹 𐍆𐍂𐌿𐌼𐌹𐍃𐍄 𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽 𐌹𐍃𐍄 𐍃𐍅𐌰 \"$1\"",
        "recentchangeslinked": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "recentchangeslinked-feed": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "recentchangeslinked-toolbox": "𐌲𐌰𐌱𐌿𐌽𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
        "booksources": "𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
        "booksources-search-legend": "𐍃𐍉𐌺𐌴𐌹 𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
        "booksources-search": "𐍃𐍉𐌺𐌴𐌹",
-       "specialloguserlabel": "Niutand:",
+       "specialloguserlabel": "𐍄𐌰𐌿𐌾𐌰𐌽𐌳𐍃:",
        "speciallogtitlelabel": "Namo:",
        "log": "𐌻𐌰𐌿𐌲𐌰",
        "all-logs-page": "𐌰𐌻𐌻𐌰 𐌰𐌽𐌳𐌰𐌿𐌲𐌾𐍉 𐌻𐌰𐌿𐌲𐌰",
        "allpagessubmit": "𐌲𐌰𐌲𐌲",
        "categories": "𐌺𐌿𐌽𐌾𐌰",
        "linksearch-ns": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼:",
+       "listgrouprights-members": "(𐍅𐌹𐌺𐍉 𐌲𐌰𐌳𐌰𐌹𐌻𐌰𐌽𐌴)",
        "emailuser": "{{GENDER: 𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 𐌸𐌰𐌼𐌼𐌰 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳|𐍃𐌰𐌽𐌳𐌴𐌹 𐌴-𐌱𐍉𐌺𐍉𐍃 𐌳𐌿 𐌸𐌹𐌶𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌾𐌰𐌹}}",
        "watchlist": "𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉",
        "mywatchlist": "𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉",
        "watchthispage": "𐌰𐍄𐍅𐌹𐍄 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
        "unwatch": "𐌿𐌽𐍅𐌹𐍄",
        "watchlist-details": "{{PLURAL:$1|$1 𐌻𐌰𐌿𐍆𐍃|$1 𐌻𐌰𐌿𐌱𐍉𐍃}} 𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽, 𐌽𐌹 𐍃𐌿𐌽𐌳𐍂𐍉 𐍂𐌰𐌷𐌽𐌾𐌰𐌽𐌳𐌰 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰𐌻𐌰𐌿𐌱𐍉𐍃.",
+       "wlheader-showupdated": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳 𐍆𐍂𐌰𐌼 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌼𐌼𐌰 𐌼𐌴𐌻𐌰 𐌸𐌰𐍄𐌴𐌹 𐌲𐌰𐍅𐌴𐌹𐍃𐍉𐌳𐌴𐍃 𐌱𐌰𐌽𐌳𐍅𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳 𐌹𐌽 <strong>𐍃𐍅𐌹𐌽𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼</strong>.",
        "watching": "𐍅𐌹𐍄𐌰𐌽𐌳𐍃...",
        "unwatching": "𐌿𐌽𐍅𐌹𐍄𐌰𐌽𐌳𐍃...",
        "created": "𐌲𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
        "contributions": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃 {{{{GENDER:$1|User}}",
        "mycontris": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃",
        "contribsub2": "𐍆𐌰𐌿𐍂 $1 ($2)",
+       "nocontribs": "𐌽𐌹 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌲𐌰𐌻𐌴𐌹𐌺𐍉𐌽𐌳𐌴𐌹𐌽𐍃 𐌸𐌰𐌹𐌼 𐌱𐌹𐌳𐍉𐌼.",
        "uctop": "(𐌷𐌰𐌿𐌱𐌹𐌸)",
        "month": "𐍆𐍂𐌰𐌼 𐌼𐌴𐌽𐍉𐌸 (𐌾𐌰𐌷 𐌰𐌹𐍂𐌹𐍃):",
        "year": "𐍆𐍂𐌰𐌼 𐌾𐌴𐍂𐌰 (𐌾𐌰𐌷 𐌰𐌹𐍂𐌹𐍃):",
        "sp-contributions-newbies-sub": "𐌽𐌹𐌿𐌾𐌰𐌹𐌼 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌼",
        "sp-contributions-blocklog": "𐍆𐌰𐌿𐍂𐌳𐌰𐌼𐌼𐌴𐌹𐌽𐌰𐌹𐍃 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐍃.",
+       "sp-contributions-uploads": "𐌰𐍄𐌱𐌰𐌹𐍂𐌹𐌳𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐍃",
        "sp-contributions-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹",
+       "sp-contributions-username": "IP 𐍃𐍄𐌰𐌸𐍃 𐌸𐌰𐌿 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
        "sp-contributions-submit": "𐍃𐍉𐌺𐌴𐌹",
        "whatlinkshere": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
        "whatlinkshere-title": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐍄𐌰𐌹𐌺𐌽𐌾𐌰𐌽𐌳 𐌳𐌿 \"$1\"",
        "whatlinkshere-page": "𐌻𐌰𐌿𐍆𐍃:",
-       "linkshere-2": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺  <strong>$1</strong>:",
+       "linkshere-2": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺  <strong>$2</strong>:",
        "isredirect": "𐌰𐌻𐌾𐌰𐍂 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "istemplate": "𐍄𐍂𐌰𐌽𐍃𐌺𐌻𐌿𐍃𐌾𐍉",
+       "isimage": "𐍆𐌰𐌾𐌻𐌰𐌲𐌰𐍅𐌹𐍃𐍃",
        "whatlinkshere-prev": "{{PLURAL:$1|𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰|𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌽𐍃 $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|𐌹𐍆𐍄𐌿𐌼𐌰|𐌹𐍆𐍄𐌿𐌼𐌰𐌽𐍃 $1}}",
        "whatlinkshere-links": "← 𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
        "pageinfo-display-title": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰",
        "pageinfo-article-id": "𐌻𐌰𐌿𐌱𐌹𐍃 𐌹𐌳",
        "pageinfo-robot-index": "𐌰𐌽𐌳𐌻𐌴𐍄𐌰𐌽",
+       "pageinfo-robot-noindex": "𐌰𐌽𐌳𐌻𐌴𐍄𐌰𐌽 𐌽𐌹𐍃𐍄",
+       "pageinfo-subpages-name": "𐍂𐌰𐌸𐌾𐍉 𐌼𐌹𐌽𐌽𐌹𐌶𐌰𐌽𐌴 𐌻𐌰𐌿𐌱𐌴 𐌸𐌹𐍃 𐌻𐌰𐌿𐌹𐍃",
        "pageinfo-firstuser": "𐌻𐌰𐌿𐌱𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃",
        "pageinfo-lastuser": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐌳𐍃",
+       "pageinfo-edits": "𐌰𐌻𐌻𐌰 𐍂𐌰𐌸𐌾𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉",
+       "pageinfo-authors": "𐌰𐌻𐌻𐌰 𐍂𐌰𐌸𐌾𐍉 𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺𐌰𐌹𐌶𐌴 𐌱𐍉𐌺𐌰𐍂𐌾𐌴",
        "pageinfo-recent-edits": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰 𐍂𐌰𐌸𐌾𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 (𐌹𐌽 $1)",
        "pageinfo-recent-authors": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰 𐍂𐌰𐌸𐌾𐍉 𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺𐌰𐌹𐌶𐌴 𐌼𐌴𐌻𐌾𐌰𐌽𐌳𐌴",
        "pageinfo-magic-words": "{{PLURAL:$1|𐌻𐌿𐌱𐌾𐌰𐌻𐌴𐌹𐍃|𐌻𐌿𐌱𐌾𐌰𐌻𐌴𐌹𐍃𐌰}} {{PLURAL:$1|𐍅𐌰𐌿𐍂𐌳|𐍅𐌰𐌿𐍂𐌳𐌰}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽 𐌺𐌿𐌽𐌹|𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}} ($1)",
        "pageinfo-toolboxlink": "𐌺𐌿𐌽𐌸𐌹 𐌻𐌰𐌿𐌱𐌹𐍃",
        "pageinfo-contentpage-yes": "𐌾𐌰𐌹",
        "previousdiff": "← 𐍆𐌰𐌹𐍂𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
        "nextdiff": "𐌽𐌹𐌿𐌾𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|𐌻𐌰𐌿𐍆𐍃|𐌻𐌰𐌿𐌱𐍉𐍃}}",
        "file-info-size": "$1 × $2 𐍀𐌹𐌺𐍃𐌴𐌻𐌰, 𐍆𐌴𐌹𐌻𐍅𐌰𐌷𐍃𐍄𐌿𐍃: $3, 𐌼𐌹𐌼𐌴 𐌺𐌿𐌽𐌹: $4",
        "show-big-image": "𐍆𐍂𐌿𐌼𐌹𐍃𐍄 𐍆𐌰𐌾𐌻",
        "show-big-image-preview": "𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌸𐌹𐌶𐍉𐍃 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹𐍃: $1.",
        "show-big-image-size": "$1 × $2 𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐌹𐍃𐍄𐌰𐌱𐌴𐌹𐍃",
        "ilsubmit": "𐍃𐍉𐌺𐌴𐌹",
        "metadata": "𐌿𐍆𐌰𐍂𐌳𐌰𐍄𐌰",
+       "exif-software": "𐌱𐍂𐌿𐌺𐌹𐌸 𐍃𐌰𐌿𐍆𐍄𐍅𐌰𐌹𐍂",
+       "exif-exifversion": "Exif 𐌿𐍃𐌼𐌴𐍂𐌹",
        "exif-colorspace": "𐍆𐌰𐍂𐍅𐌰𐍂𐌿𐌼",
        "exif-orientation-1": "𐌱𐌹 𐌱𐌹𐌿𐌷𐍄𐌾𐌰",
        "namespacesall": "𐌰𐌻𐌻",
        "imgmultigo": "𐌲𐌰𐌲𐌲!",
        "imgmultigoto": "𐌲𐌰𐌲𐌲 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 $1",
        "table_pager_limit_submit": "Affgaggan",
+       "watchlisttools-view": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌲𐌰𐌲𐌰𐌷𐌰𐍆𐍄𐌹𐌳𐍉𐍃 𐌳𐌿 𐌸𐌰𐌼𐌼𐌰",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰]])",
        "version-other": "Anþar",
        "version-poweredby-translators": "translatewiki.net 𐌲𐌰𐍃𐌺𐌴𐌹𐍂𐌾𐌰𐌽𐍃",
        "redirect-submit": "𐌲𐌰𐌲𐌲",
        "redirect-value": "𐍅𐌰𐌹𐍂𐌸:",
+       "redirect-page": "𐌻𐌰𐌿𐌱𐌹𐍃 ID",
        "redirect-revision": "𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
        "redirect-file": "𐍆𐌰𐌾𐌻𐌰𐌽𐌰𐌼𐍉",
        "specialpages": "𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳𐌰}}]]: $2)",
        "tags-source-header": "𐌱𐍂𐌿𐌽𐌽𐌰",
        "tags-actions-header": "𐍄𐍉𐌾𐌰",
+       "tags-active-yes": "𐌾𐌰𐌹",
        "tags-source-none": "𐌽𐌹 𐌾𐌿 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰",
        "tags-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
        "tags-delete": "𐌿𐍃𐌽𐌹𐌼",
index 1bd6255..6b83c8d 100644 (file)
        "whatlinkshere": "Τὰ ἐνθάδε ἄγοντα",
        "whatlinkshere-title": "Δέλτοι συνεζευγμέναι μετὰ τοῦ \"$1\"",
        "whatlinkshere-page": "Δέλτος:",
-       "linkshere-2": "Τάδε ἄγουσι πρὸς '''$1''':",
-       "nolinkshere-2": "Οὐδένα ἄγουσι πρὸς '''$1'''.",
-       "nolinkshere-ns-2": "Οὐδεμία δέλτος συνδέεται τῇ '''$1''' ἐν τῷ ἐπιλεγμένῳ ὀνοματείῳ.",
+       "linkshere-2": "Τάδε ἄγουσι πρὸς '''$2''':",
+       "nolinkshere-2": "Οὐδένα ἄγουσι πρὸς '''$2'''.",
+       "nolinkshere-ns-2": "Οὐδεμία δέλτος συνδέεται τῇ '''$2''' ἐν τῷ ἐπιλεγμένῳ ὀνοματείῳ.",
        "isredirect": "ἀναδιευθύνειν δέλτον",
        "istemplate": "περίκλεισις",
        "isimage": "σύνδεσμος ἀρχείου",
index 924d5f8..e7fa729 100644 (file)
        "whatlinkshere": "Was verwyst do druff?",
        "whatlinkshere-title": "Sytene, wo uf „$1“ verlinke",
        "whatlinkshere-page": "Syte:",
-       "linkshere-2": "Die Sytene hen e Link, wu zu '''„$1“''' fiere:",
-       "nolinkshere-2": "Kei Artikel verwyyst uf '''„$1“'''.",
-       "nolinkshere-ns-2": "Kei Syte verwyyst uf '''„$1“''' im gwehlte Namensruum.",
+       "linkshere-2": "Die Sytene hen e Link, wu zu '''„$2“''' fiere:",
+       "nolinkshere-2": "Kei Artikel verwyyst uf '''„$2“'''.",
+       "nolinkshere-ns-2": "Kei Syte verwyyst uf '''„$2“''' im gwehlte Namensruum.",
        "isredirect": "Wyterleitigssyte",
        "istemplate": "Vorlageybindig",
        "isimage": "Dateigleich",
index 5a66693..5597618 100644 (file)
        "whatlinkshere": "અહી શું જોડાય છે",
        "whatlinkshere-title": "\"$1\" ને જોડતા પાનાં",
        "whatlinkshere-page": "પાનું:",
-       "linkshere-2": "નીચેના પાનાઓ '''$1''' સાથે જોડાય છે:",
-       "nolinkshere-2": "'''$1'''ની સાથે કોઇ પાના જોડાતા નથી.",
-       "nolinkshere-ns-2": "પસંદ કરેલ નામ સ્થળમાં કોઇ પાના '''$1'''  સાથે જોડાયેલ નથી.",
+       "linkshere-2": "નીચેના પાનાઓ '''$2''' સાથે જોડાય છે:",
+       "nolinkshere-2": "'''$2'''ની સાથે કોઇ પાના જોડાતા નથી.",
+       "nolinkshere-ns-2": "પસંદ કરેલ નામ સ્થળમાં કોઇ પાના '''$2'''  સાથે જોડાયેલ નથી.",
        "isredirect": "દિશાનિર્દેશ કરેલ પાનું",
        "istemplate": "સમાવેશ",
        "isimage": "ફાઇલની કડી",
index 701507a..e3a3824 100644 (file)
        "whatlinkshere": "Cre ta kiangley rish shoh",
        "whatlinkshere-title": "Duillagyn ta kianglt rish $1",
        "whatlinkshere-page": "Duillag:",
-       "linkshere-2": "Ta ny duillagyn shoh kianglt rish '''$1''':",
-       "nolinkshere-2": "Cha nel duillag erbee kianglt rish '''$1'''.",
+       "linkshere-2": "Ta ny duillagyn shoh kianglt rish '''$2''':",
+       "nolinkshere-2": "Cha nel duillag erbee kianglt rish '''$2'''.",
        "isredirect": "duillag aa-enmyssit",
        "istemplate": "goaill stiagh",
        "isimage": "kiangley coadan",
index 5ca721e..4b54d88 100644 (file)
        "whatlinkshere": "Mahaɗan wannan shafi",
        "whatlinkshere-title": "Shafuna masu mahaɗi da \"$1\"",
        "whatlinkshere-page": "Shafi:",
-       "linkshere-2": "Waɗannan shafuna sun haɗu da '''$1''':",
+       "linkshere-2": "Waɗannan shafuna sun haɗu da '''$2''':",
        "isredirect": "shafin turawa",
        "istemplate": "gami",
        "isimage": "majigi shigagge",
index 1ad9597..6340413 100644 (file)
        "whatlinkshere": "Nâi-têu lièn to liá-têu",
        "whatlinkshere-title": "Lièn-chiap to \"$1\" ke ya̍p-mien",
        "whatlinkshere-page": "Ya̍p-mien:",
-       "linkshere-2": "Hâ-poi ya̍p-mien lièn-chiap to <strong>$1</strong>:",
-       "nolinkshere-2": "無頁面鏈接到'''$1'''。",
-       "nolinkshere-ns-2": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to $1.",
+       "linkshere-2": "Hâ-poi ya̍p-mien lièn-chiap to <strong>$2</strong>:",
+       "nolinkshere-2": "無頁面鏈接到'''$2'''。",
+       "nolinkshere-ns-2": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to $2.",
        "isredirect": "chhùng-thin-hiong ya̍p",
        "istemplate": "pâu-hàm",
        "isimage": "vùn-khien lièn-chiap",
index bc55341..ea868e2 100644 (file)
        "whatlinkshere": "He aha ka mea e loulou iho ai",
        "whatlinkshere-title": "Nā ʻAoʻao e loulou iā \"$1\"",
        "whatlinkshere-page": "‘Ao‘ao:",
-       "linkshere-2": "Loulou kēia mau ʻaoʻao iā <strong>$1</strong>:",
-       "nolinkshere-2": "ʻAʻohe ‘ao‘ao e loulou iā '''$1'''.",
+       "linkshere-2": "Loulou kēia mau ʻaoʻao iā <strong>$2</strong>:",
+       "nolinkshere-2": "ʻAʻohe ‘ao‘ao e loulou iā '''$2'''.",
        "isredirect": "ʻaoʻao kia hou",
        "istemplate": "kumo",
        "isimage": "loulou waihona",
index da04a90..1055733 100644 (file)
        "dellogpage": "יומן מחיקות",
        "dellogpagetext": "להלן רשימה של המחיקות האחרונות שבוצעו.",
        "deletionlog": "יומן המחיקות",
+       "log-name-create": "יומן יצירות דפים",
+       "log-description-create": "להלן רשימה של הדפים האחרונים שנוצרו.",
+       "logentry-create-create": "$1 {{GENDER:$2|יצר|יצרה}} את הדף $3",
        "reverted": "שוחזר לגרסה קודמת",
        "deletecomment": "סיבה:",
        "deleteotherreason": "סיבה אחרת/נוספת:",
        "whatlinkshere": "דפים המקושרים לכאן",
        "whatlinkshere-title": "דפים המקשרים לדף \"$1\"",
        "whatlinkshere-page": "דף:",
-       "linkshere-2": "הדפים שלהלן מקשרים לדף <strong>$1</strong>:",
-       "nolinkshere-2": "אין דפים המקשרים לדף <strong>$1</strong>.",
-       "nolinkshere-ns-2": "אין דפים המקשרים לדף <strong>$1</strong> במרחב השם שנבחר.",
+       "linkshere-2": "הדפים שלהלן מקשרים לדף <strong>$2</strong>:",
+       "nolinkshere-2": "אין דפים המקשרים לדף <strong>$2</strong>.",
+       "nolinkshere-ns-2": "אין דפים המקשרים לדף <strong>$2</strong> במרחב השם שנבחר.",
        "isredirect": "דף הפניה",
        "istemplate": "הכללה",
        "isimage": "קישור לקובץ",
        "blockipsuccesssub": "החסימה הושלמה בהצלחה",
        "blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.<br />\nניתן לעיין ב[[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
        "ipb-blockingself": "החשבון שלך ייחסם! האם ברצונך לעשות זאת?",
-       "ipb-confirmhideuser": "×\94×\97ש×\91×\95×\9f ×\99×\99×\97ס×\9d ×¢×\9d ×\94×\90פשר×\95ת \"×\94סתרת ×\9eשת×\9eש\". ×\96×\94 ×\99עלים את שם המשתמש בכל הרשימות ופעולות היומן. האם ברצונך לעשות זאת?",
-       "ipb-confirmaction": "אם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות זאת, אנא {{GENDER:|סמן|סמני|סמנו}} את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
+       "ipb-confirmhideuser": "×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש ×\99×\99×\97ס×\9d ×ª×\95×\9a ×\94פע×\9cת ×\94×\90פשר×\95ת \"×\94סתרת ×\9eשת×\9eש\". ×¤×¢×\95×\9c×\94 ×\96×\95 ×ªעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם ברצונך לעשות זאת?",
+       "ipb-confirmaction": "אם באמת התכוונת לעשות זאת, יש לסמן את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
        "ipb-edit-dropdown": "עריכת סיבות החסימה",
        "ipb-unblock-addr": "שחרור חסימה של $1",
-       "ipb-unblock": "שחרור חסימה של משתמש או כתובת IP",
+       "ipb-unblock": "ש×\97ר×\95ר ×\97ס×\99×\9e×\94 ×©×\9c ×\9eשת×\9eש ×\90×\95 ×©×\9c ×\9bת×\95×\91ת IP",
        "ipb-blocklist": "הצגת החסימות הנוכחיות",
        "ipb-blocklist-contribs": "תרומות של {{GENDER:$1|$1}}",
-       "ipb-blocklist-duration-left": "× ×\95תר×\95 $1",
+       "ipb-blocklist-duration-left": "×\94×\96×\9e×\9f ×©× ×\95תר: $1",
        "unblockip": "שחרור חסימה של משתמש",
-       "unblockiptext": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי להחזיר את הרשאות הכתיבה לכתובת IP חסומה או למשתמש חסום.",
+       "unblockiptext": "ניתן להשתמש בטופס שלהלן כדי להחזיר את הרשאות הכתיבה לכתובת IP חסומה או למשתמש חסום.",
        "ipusubmit": "הסרת חסימה זו",
        "unblocked": "[[User:$1|$1]] {{GENDER:$1|שוחרר מחסימתו|שוחררה מחסימתה}}.",
-       "unblocked-range": "$1 שוחרר מחסימתו.",
+       "unblocked-range": "חסימת הטווח $1 שוחררה.",
        "unblocked-id": "חסימה מספר $1 שוחררה.",
-       "unblocked-ip": "[[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
+       "unblocked-ip": "הכתובת [[Special:Contributions/$1|$1]] שוחררה מחסימתה.",
        "blocklist": "משתמשים חסומים",
        "autoblocklist": "חסימות אוטומטיות",
        "autoblocklist-submit": "חיפוש",
        "blocklog-showsuppresslog": "{{GENDER:$1|משתמש זה נחסם והוסתר|משתמשת זו נחסמה והוסתרה}} בעבר.\nיומן ההעלמות מוצג להלן:",
        "blocklogentry": "חסם את [[$1]] למשך $2 $3",
        "reblock-logentry": "שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3",
-       "blocklogtext": "×\96×\94×\95 ×\99×\95×\9e×\9f ×¤×¢×\95×\9c×\95ת ×\94×\97ס×\99×\9e×\94 ×\95×\94ש×\97ר×\95ר ×©×\9c ×\9eשת×\9eש×\99×\9d.\n×\9bת×\95×\91×\95ת IP ×©× ×\97ס×\9e×\95 ×\90×\95×\98×\95×\9e×\98×\99ת ×\90×\99× ×\9f ×\9e×\95פ×\99×¢×\95ת.\nר×\90×\95 ×\92×\9d ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] ×\9cרש×\99×\9e×\94 ×©×\9c ×\94×\97ר×\9e×\95ת ×\95×\97ס×\99×\9e×\95ת פעילות כעת.",
+       "blocklogtext": "×\96×\94×\95 ×\99×\95×\9e×\9f ×©×\9c ×¤×¢×\95×\9c×\95ת ×\94×\97ס×\99×\9e×\94 ×\95×\94ש×\97ר×\95ר ×©×\9c ×\9eשת×\9eש×\99×\9d.\n×\9bת×\95×\91×\95ת IP ×©× ×\97ס×\9e×\95 ×\90×\95×\98×\95×\9e×\98×\99ת ×\90×\99× ×\9f ×\9e×\95פ×\99×¢×\95ת.\n× ×\99ת×\9f ×\9c×¢×\99×\99×\9f ×\91[[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] ×\9cצפ×\99×\99×\94 ×\91×\97ס×\99×\9e×\95ת ×\94פעילות כעת.",
        "unblocklogentry": "שחרר את החסימה של $1",
        "block-log-flags-anononly": "משתמשים אנונימיים בלבד",
        "block-log-flags-nocreate": "יצירת חשבונות נחסמה",
        "block-log-flags-hiddenname": "שם המשתמש הוסתר",
        "range_block_disabled": "האפשרות לחסום טווח כתובות אינה פעילה.",
        "ipb_expiry_invalid": "זמן פקיעת החסימה אינו תקין.",
-       "ipb_expiry_old": "×\96×\9e×\9f ×\94תפ×\95×\92ה כבר עבר.",
+       "ipb_expiry_old": "×\96×\9e×\9f ×\94פק×\99×¢ה כבר עבר.",
        "ipb_expiry_temp": "חסימות הכוללות הסתרת שם משתמש חייבות להיות לזמן בלתי מוגבל.",
        "ipb_hide_invalid": "לא ניתן להעלים את החשבון הזה; {{PLURAL:$1|בוצעה ממנו יותר מעריכה אחת|בוצעו ממנו יותר מ־$1 עריכות}}.",
        "ipb_already_blocked": "המשתמש \"$1\" כבר נחסם.",
        "ipb-otherblocks-header": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
        "unblock-hideuser": "אין באפשרותך לשחרר את החסימה של המשתמש הזה, כיוון ששם המשתמש שלו הוסתר.",
        "ipb_cant_unblock": "שגיאה: חסימה מספר $1 לא נמצאה. ייתכן שהיא כבר שוחררה.",
-       "ipb_blocked_as_range": "שגיאה: כתובת ה־IP $1 אינה חסומה ישירות ולכן לא ניתן לשחרר את חסימתה. עם זאת, היא חסומה כחלק מהטווח $2, שניתן לשחרר את חסימתו.",
-       "ip_range_invalid": "טווח IP שגוי.",
+       "ipb_blocked_as_range": "שגיאה: כתובת ה־IP‏ $1 אינה חסומה ישירות ולכן לא ניתן לשחרר את חסימתה.\nעם זאת, היא חסומה כחלק מהטווח $2, שניתן לשחרר את חסימתו.",
+       "ip_range_invalid": "טווח כתובות IP שגוי.",
        "ip_range_toolarge": "לא ניתן לחסום טווחים גדולים מ־<span dir=\"ltr\">/$1</span>.",
-       "ip_range_exceeded": "טווח ה־IP חורג מהטווח המרבי. הטווח המותר: /$1.",
+       "ip_range_exceeded": "טווח ה־IP חורג מהטווח המרבי. הטווח המותר: <span dir=\"ltr\">/$1</span>.",
        "ip_range_toolow": "בפועל, טווחי IP אינם מורשים.",
        "proxyblocker": "חוסם פרוקסי",
        "proxyblockreason": "כתובת ה־IP שלכם נחסמה משום שהיא כתובת של שרת פרוקסי פתוח.\nאנא צרו קשר עם ספק האינטרנט שלכם או עם התמיכה הטכנית של הארגון שלכם והודיעו להם על בעיית האבטחה החמורה הזאת.",
        "sorbs_create_account_reason": "כתובת ה־IP שלך רשומה ככתובת פרוקסי פתוחה ב־DNSBL שאתר {{SITENAME}} משתמש בו.\nאין באפשרותך ליצור חשבון.",
        "softblockrangesreason": "תרומות אנונימיות אינן מותרות מכתובת ה־IP שלך ($1). נא להיכנס לחשבון.",
        "xffblockreason": "כתובת IP הנמצאת בכותרת X-Forwarded-For, בין אם שלכם או של שרת פרוקסי שאתם משתמשים בו, נחסמה. סיבת החסימה המקורית הייתה: $1",
-       "cant-see-hidden-user": "×\94×\9eשת×\9eש ×©×\90ת×\9d ×\9eנס×\99×\9d ×\9c×\97ס×\95×\9d ×\9b×\91ר × ×\97ס×\9d ×\95×\94×\95סתר.\n×\9b×\99×\95×\95×\9f ×©×\90×\99×\9f ×\9c×\9b×\9d ×\94רש×\90×\94 ×\9c×\94סתרת ×\9eשת×\9eש×\99×\9d, ×\90×\99×\9f ×\91×\90פשר×\95ת×\9b×\9d לצפות בחסימת המשתמש או לערוך אותה.",
-       "ipbblocked": "×\90×\99× ×\9b×\9d ×\99×\9b×\95×\9c×\99×\9d ×\9c×\97ס×\95×\9d ×\90×\95 ×\9cש×\97רר ×\90ת ×\97ס×\99×\9eת×\9d ×©×\9c ×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d, ×\9b×\99×\95×\95×\9f ×©×\90ת×\9d ×¢×¦×\9e×\9b×\9d ×\97ס×\95×\9e×\99ם.",
-       "ipbnounblockself": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\91×\98×\9c את החסימה של עצמך.",
+       "cant-see-hidden-user": "×\94×\9eשת×\9eש ×©× ×\99ס×\99ת ×\9c×\97ס×\95×\9d ×\9b×\91ר × ×\97ס×\9d ×\95×\94×\95סתר.\n×\9b×\99×\95×\95×\9f ×©×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 ×\9c×\94סתרת ×\9eשת×\9eש×\99×\9d, ×\90×\99×\9f ×\91×\90פשר×\95ת×\9a לצפות בחסימת המשתמש או לערוך אותה.",
+       "ipbblocked": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9c×\97ס×\95×\9d ×\9eשת×\9eש×\99×\9d ×\90×\97ר×\99×\9d ×\90×\95 ×\9cש×\97רר ×\90ת ×\97ס×\99×\9eת×\9d, ×\9b×\99×\95×\95×\9f ×©×\94×\97ש×\91×\95×\9f ×©×\9c×\9a ×\97ס×\95ם.",
+       "ipbnounblockself": "×\90×\99×\9f ×\91×\90פשר×\95ת×\9a ×\9cש×\97רר את החסימה של עצמך.",
        "lockdb": "נעילת בסיס נתונים",
        "unlockdb": "שחרור בסיס נתונים",
        "lockdbtext": "נעילת בסיס הנתונים תמנע ממשתמשים את האפשרות לערוך דפים, לשנות את העדפותיהם, לערוך את רשימות המעקב שלהם, ופעולות אחרות הדורשות ביצוע שינויים בבסיס הנתונים.\n\nאנא אשרו שזה מה שאתם מתכוונים לעשות, ושתשחררו את בסיס הנתונים מנעילה כאשר פעולת התחזוקה תסתיים.",
index 2bf6fc3..3dd5394 100644 (file)
        "whatlinkshere": "यहाँ क्या जुड़ता है",
        "whatlinkshere-title": "$1 से जुड़े हुए पृष्ठ",
        "whatlinkshere-page": "पृष्ठ:",
-       "linkshere-2": "नीचे दिये हुए पृष्ठ '''$1''' से जुडते हैं:",
-       "nolinkshere-2": "<strong>$1</strong> से कोई भी पन्ना नहीं जुड़ा है।",
-       "nolinkshere-ns-2": "चुने हुए नामस्थानसे '''$1''' को जुडने वाले पृष्ठ नहीं हैं।",
+       "linkshere-2": "नीचे दिये हुए पृष्ठ '''$2''' से जुडते हैं:",
+       "nolinkshere-2": "<strong>$2</strong> से कोई भी पन्ना नहीं जुड़ा है।",
+       "nolinkshere-ns-2": "चुने हुए नामस्थानसे '''$2''' को जुडने वाले पृष्ठ नहीं हैं।",
        "isredirect": "पुनर्निर्देशन पृष्ठ",
        "istemplate": "मिलाईयें",
        "isimage": "फ़ाइल प्रयोग",
index b215c80..7db6792 100644 (file)
        "whatlinkshere": "Hian konchij jurre hae",
        "whatlinkshere-title": "Panna jon ki $1 se jurre hai",
        "whatlinkshere-page": "Panna:",
-       "linkshere-2": "Niche waala panna '''$1''' se jorre hai:",
-       "nolinkshere-2": "Koi panna '''$1''' ke nai jorre hai.",
-       "nolinkshere-ns-2": "Chuna gais namespace me koi panna '''$1''' se nai jiurre hai.",
+       "linkshere-2": "Niche waala panna '''$2''' se jorre hai:",
+       "nolinkshere-2": "Koi panna '''$2''' ke nai jorre hai.",
+       "nolinkshere-ns-2": "Chuna gais namespace me koi panna '''$2''' se nai jiurre hai.",
        "isredirect": "panna ke redirect karo",
        "istemplate": "milao",
        "isimage": "file ke jorr",
index 7de08f0..8eb821a 100644 (file)
        "whatlinkshere": "Ang nagatabid diri",
        "whatlinkshere-title": "Mga pahina nga naga tabid sa $1",
        "whatlinkshere-page": "Pahina:",
-       "linkshere-2": "Ang mga sumunod nga pahina ay nagatabid sa '''$1''':",
-       "nolinkshere-2": "Waay panid nga nakasugpon sa '''$1'''.",
+       "linkshere-2": "Ang mga sumunod nga pahina ay nagatabid sa '''$2''':",
+       "nolinkshere-2": "Waay panid nga nakasugpon sa '''$2'''.",
        "isredirect": "pahina sa ginadirekta liwat",
        "istemplate": "transklusyon",
        "isimage": "Ang sugpon sang file",
index def7267..cd0f1ce 100644 (file)
        "prefs-dateformat": "Format datuma",
        "prefs-timeoffset": "Vremensko poravnavanje",
        "prefs-advancedediting": "Napredne mogućnosti",
+       "prefs-developertools": "Razvijateljski alati",
        "prefs-editor": "Uređivač",
        "prefs-preview": "Prikaži kako će izgledati",
        "prefs-advancedrc": "Napredne mogućnosti",
        "protectedtitles-submit": "Prikaži nazive",
        "listusers": "Popis suradnika",
        "listusers-editsonly": "Prikaži samo suradnike s uređivanjem",
+       "listusers-temporarygroupsonly": "Pokaži samo suradnike u privremenim suradničkim skupinama",
        "listusers-creationsort": "Razvrstaj po datumu stvaranja",
        "listusers-desc": "Sortiraj obrnutim redoslijedom",
        "usereditcount": "$1 {{PLURAL:$1|uređivanje|uređivanja|uređivanja}}",
        "whatlinkshere": "Što vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na »$1«",
        "whatlinkshere-page": "Stranica:",
-       "linkshere-2": "Sljedeće stranice povezuju ovamo ($1):",
-       "nolinkshere-2": "Nijedna stranica ne vodi ovamo (tj. nema poveznica na stranicu $1).",
-       "nolinkshere-ns-2": "Nijedna stranica ne vodi na '''$1''' u odabranom imenskom prostoru.",
+       "linkshere-2": "Sljedeće stranice povezuju ovamo ($2):",
+       "nolinkshere-2": "Nijedna stranica ne vodi ovamo (tj. nema poveznica na stranicu $2).",
+       "nolinkshere-ns-2": "Nijedna stranica ne vodi na '''$2''' u odabranom imenskom prostoru.",
        "isredirect": "stranica za preusmjeravanje",
        "istemplate": "kao predložak",
        "isimage": "poveznica na datoteku",
index 88774fd..11efb76 100644 (file)
        "whatlinkshere": "Links uff die Seit",
        "whatlinkshere-title": "Seite, die uff \"$1\" verlinke",
        "whatlinkshere-page": "Seit:",
-       "linkshere-2": "Die follichende Seite verlinke uff '''\"$1\"''':",
-       "nolinkshere-2": "Ken Seit verlinkt uff '''„$1“'''.",
-       "nolinkshere-ns-2": "Ken Seit verlinkt uff '''\"$1\"''' im gewählte Noomeraum.",
+       "linkshere-2": "Die follichende Seite verlinke uff '''\"$2\"''':",
+       "nolinkshere-2": "Ken Seit verlinkt uff '''„$2“'''.",
+       "nolinkshere-ns-2": "Ken Seit verlinkt uff '''\"$2\"''' im gewählte Noomeraum.",
        "isredirect": "Weiterleitungsseit",
        "istemplate": "Voarlooche-einbinnunge (transclusões)",
        "isimage": "Dateilink",
index 735e55e..67fa833 100644 (file)
        "whatlinkshere": "Što wotkazuje sem",
        "whatlinkshere-title": "Strony, kotrež na „$1“ wotkazuja",
        "whatlinkshere-page": "Strona:",
-       "linkshere-2": "Sćěhowace strony na stronu '''$1''' wotkazuja:",
-       "nolinkshere-2": "Žane strony na '''$1''' njewotkazuja.",
-       "nolinkshere-ns-2": "Žane strony njewotkazuja na '''$1''' we wubranym mjenowym rumje.",
+       "linkshere-2": "Sćěhowace strony na stronu '''$2''' wotkazuja:",
+       "nolinkshere-2": "Žane strony na '''$2''' njewotkazuja.",
+       "nolinkshere-ns-2": "Žane strony njewotkazuja na '''$2''' we wubranym mjenowym rumje.",
        "isredirect": "daleposrědkowanje",
        "istemplate": "zapřijeće předłohi",
        "isimage": "Datajowy wotkaz",
index 04d5473..60d80ae 100644 (file)
        "whatlinkshere": "Paj ki gen lyen vè paj sa a",
        "whatlinkshere-title": "Paj ki genyen lyen ki ap mennen nan \"$1\"",
        "whatlinkshere-page": "Paj :",
-       "linkshere-2": "Paj yo ki anba ap mene nan <b>$1</b> :",
-       "nolinkshere-2": "Pyès paj genyen lyen pou paj sa a <b>$1</b>.",
+       "linkshere-2": "Paj yo ki anba ap mene nan <b>$2</b> :",
+       "nolinkshere-2": "Pyès paj genyen lyen pou paj sa a <b>$2</b>.",
        "isredirect": "paj redireksyon",
        "istemplate": "anndan",
        "isimage": "lyen fichye a",
index 7c4f579..b494a09 100644 (file)
        "whatlinkshere": "Mi hivatkozik erre",
        "whatlinkshere-title": "A(z) „$1” lapra hivatkozó lapok",
        "whatlinkshere-page": "Lap:",
-       "linkshere-2": "Az alábbi lapok hivatkoznak erre: $1",
-       "nolinkshere-2": "$1: erre a lapra egyetlen más lap sem hivatkozik.",
-       "nolinkshere-ns-2": "A kiválasztott névtérben egyetlen oldal sem hivatkozik a(z) '''$1''' lapra.",
+       "linkshere-2": "Az alábbi lapok hivatkoznak erre: $2",
+       "nolinkshere-2": "$2: erre a lapra egyetlen más lap sem hivatkozik.",
+       "nolinkshere-ns-2": "A kiválasztott névtérben egyetlen oldal sem hivatkozik a(z) '''$2''' lapra.",
        "isredirect": "átirányítás",
        "istemplate": "beillesztve",
        "isimage": "fájlhivatkozás",
index 9c2d190..7406265 100644 (file)
        "whatlinkshere": "Այստեղ հղվող էջերը",
        "whatlinkshere-title": "Էջեր, որոնք հղում են դեպի «$1»",
        "whatlinkshere-page": "Էջ.",
-       "linkshere-2": "Հետևյալ էջերը հղում են '''$1''' էջին.",
-       "nolinkshere-2": "Ուրիշ էջերից '''$1''' էջին հղումներ չկան։",
-       "nolinkshere-ns-2": "Ընտրված անվանատարածքում '''$1''' էջին հղվող էջեր չկան։",
+       "linkshere-2": "Հետևյալ էջերը հղում են '''$2''' էջին.",
+       "nolinkshere-2": "Ուրիշ էջերից '''$2''' էջին հղումներ չկան։",
+       "nolinkshere-ns-2": "Ընտրված անվանատարածքում '''$2''' էջին հղվող էջեր չկան։",
        "isredirect": "վերահղման էջ",
        "istemplate": "ներառում",
        "isimage": "ֆայլի հղում",
index 3ebb9f5..77d625b 100644 (file)
        "whatlinkshere": "Paginas ligate a iste",
        "whatlinkshere-title": "Paginas con ligamines verso $1",
        "whatlinkshere-page": "Pagina:",
-       "linkshere-2": "Le sequente paginas contine ligamines a <strong>$1</strong>:",
-       "nolinkshere-2": "Nulle pagina contine un ligamine verso <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Nulle pagina liga a <strong>$1</strong>  in le spatio de nomines seligite.",
+       "linkshere-2": "Le sequente paginas contine ligamines a <strong>$2</strong>:",
+       "nolinkshere-2": "Nulle pagina contine un ligamine a <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Nulle pagina liga a <strong>$2</strong> in le spatio de nomines seligite.",
        "isredirect": "pagina de redirection",
        "istemplate": "transclusion",
        "isimage": "ligamine al file",
index 631fc26..7fa177e 100644 (file)
        "listingcontinuesabbrev": "samb.",
        "index-category": "Halaman yang diindeks",
        "noindex-category": "Halaman yang diindeks",
-       "broken-file-category": "Halaman dengan gambar rusak",
+       "broken-file-category": "Halaman dengan berkas rusak",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Tentang",
        "article": "Halaman isi",
        "whatlinkshere": "Pranala balik",
        "whatlinkshere-title": "Halaman yang memiliki pranala ke \"$1\"",
        "whatlinkshere-page": "Halaman:",
-       "linkshere-2": "Halaman-halaman berikut ini memiliki pranala ke '''$1''':",
-       "nolinkshere-2": "Tidak ada halaman yang memiliki pranala ke '''$1'''.",
-       "nolinkshere-ns-2": "Tidak ada halaman yang memiliki pranala ke '''$1''' pada ruang nama yang dipilih.",
+       "linkshere-2": "Halaman-halaman berikut ini memiliki pranala ke '''$2''':",
+       "nolinkshere-2": "Tidak ada halaman yang memiliki pranala ke '''$2'''.",
+       "nolinkshere-ns-2": "Tidak ada halaman yang memiliki pranala ke '''$2''' pada ruang nama yang dipilih.",
        "isredirect": "halaman pengalihan",
        "istemplate": "tranklusi",
        "isimage": "pranala berkas",
index e802ab6..beb6296 100644 (file)
        "whatlinkshere": "Referenties a ti-ci págine",
        "whatlinkshere-title": "Págines quo liga por \"$1\"",
        "whatlinkshere-page": "Págine:",
-       "linkshere-2": "Li sequent págines liga por '''$1''':",
-       "nolinkshere-2": "Nequant págine liga por '''$1'''.",
+       "linkshere-2": "Li sequent págines liga por '''$2''':",
+       "nolinkshere-2": "Nequant págine liga por '''$2'''.",
        "isredirect": "págine de redirecterion",
        "istemplate": "inclusion",
        "isimage": "referentie a un file",
index d2567cc..171fbe5 100644 (file)
        "whatlinkshere": "Ihe na bia nga",
        "whatlinkshere-title": "Ihü ná gá \"$1\" shí jikodo",
        "whatlinkshere-page": "Ihü:",
-       "linkshere-2": "Ihüá na gá '''$1''':",
-       "nolinkshere-2": "Ọ díghị ihü na jikodo gá '''$1'''.",
-       "nolinkshere-ns-2": "Ọ díghị ihü na jikodo gá '''$1''' na áhàámá nke Í chọrọ.",
+       "linkshere-2": "Ihüá na gá '''$2''':",
+       "nolinkshere-2": "Ọ díghị ihü na jikodo gá '''$2'''.",
+       "nolinkshere-ns-2": "Ọ díghị ihü na jikodo gá '''$2''' na áhàámá nke Í chọrọ.",
        "isredirect": "ihü nke nkúfù",
        "istemplate": "ọ jè ákwúkwó usòrò",
        "isimage": "jikodo nnunuuche",
index 4775c24..56b0599 100644 (file)
        "botpasswords-existing": "Dagiti adda a kontrasenias ti bot",
        "botpasswords-createnew": "Agpartuat iti baro a kontrasenias ti bot",
        "botpasswords-editexisting": "Urnosen ti maysa nga adda a kontrasenias ti bot",
+       "botpasswords-label-needsreset": "(nasken a maisaad manen ti kontrasenias)",
        "botpasswords-label-appid": "Nagan ti bot:",
        "botpasswords-label-create": "Agpartuat",
        "botpasswords-label-update": "Pabaruen",
        "subject-preview": "Panangipadas ti suheto:",
        "previewerrortext": "Adda napasamak a maysa a biddut bayat a nagpadpadas kadagiti binawbaliwam.",
        "blockedtitle": "Naseraan ti agar-aramat",
-       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti adres ti IP.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga adres ti esurat a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga adres ti IP ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
-       "autoblockedtext": "Ti bukodmo nga adres ti IP ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga adres ti esurat a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panagusar daytoy.\n\nTi agdama a bukodmo nga adres ti IP ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti adres ti IP.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga {{int:emailuser}} malaksid no adda napudno nga adres ti esurat a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga adres ti IP ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
+       "autoblockedtext": "Ti bukodmo nga adres ti IP ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"{{int:emailuser}}\" a langa malaksid no addaanka iti napudno nga adres ti esurat a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud iti panagusar daytoy.\n\nTi agdama a bukodmo nga adres ti IP ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "systemblockedtext": "Ti naganmo nga agar-aramat wenno adres ti IP ket automatikon a sinerraan babaen ti MediaWiki.\nTi naited a rason ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a maserraan: $7\nTi agdama nga adresmo nga IP ket $3.\nPangngaasi nga iraman amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
        "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "rcfilters-watchlist-markseen-button": "Markaan amin a sinuksukatan a kas nakitan",
        "rcfilters-watchlist-edit-watchlist-button": "Urnosem ti listaam kadagiti mabuybuya a panid",
        "rcfilters-preference-label": "Ilemmeng ti napasayaat a bersion ti Kaudian a Balbaliw",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Pampanid a maisilpo manipud iti</strong> napili a panid",
        "rcfilters-filter-showlinkedto-label": "Ipakita dagiti binaliwan iti pakaisilpuan dagiti panid",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Pampanid a maisilpo iti</strong> napili a panid",
        "rcfilters-target-page-placeholder": "Mangikabil iti nagan ti panid (wenno kategoria)",
        "recentchangeslinked-feed": "Mainaig a sinukatan",
        "recentchangeslinked-toolbox": "Mainaig a sinuksukatan",
        "recentchangeslinked-title": "Sinukatan a mainaig iti \"$1\"",
-       "recentchangeslinked-summary": "Mangikabil iti maysa a nagan ti panid tapno makita dagiti panagbaliw kadagiti naisilpo a panid wenno iti dayta a panid. (Tapno makita dagiti kameng iti maysa a kategoria, ikabil ti Kategoria:Nagan ti kategoria). Dagiti panagbaliw kadagiti panid iti [[Special:Watchlist|Listaan ti bambantayam]] ket addada iti <strong>napuskol</strong>.",
+       "recentchangeslinked-summary": "Mangikabil iti maysa a nagan ti panid tapno makita dagiti panagbaliw kadagiti naisilpo a panid wenno iti dayta a panid. (Tapno makita dagiti kameng iti maysa a kategoria, ikabil ti {{ns:category}}:Nagan ti kategoria). Dagiti panagbaliw kadagiti panid iti [[Special:Watchlist|Listaan ti bambantayam]] ket addada iti <strong>napuskol</strong>.",
        "recentchangeslinked-page": "Nagan ti panid:",
        "recentchangeslinked-to": "Ipakita dagiti sinukatan kadagiti panid nga imbes a naisilpo iti naited a panid",
        "recentchanges-page-added-to-category": "nainayon ti [[:$1]] iti kategoria",
        "uploadbtn": "Agikarga iti papeles",
        "reuploaddesc": "Ukasen ti panagikarga ken agsubli idiay porma ti panagikarga",
        "upload-tryagain": "Mangited iti napabaro a deskripsion ti papeles",
+       "upload-tryagain-nostash": "Mangited iti naikarga manen a papeles ken ti nabaliwan a deskripsion",
        "uploadnologin": "Saan a nakastrek",
        "uploadnologintext": "Pangngaasi a $1 tapno makaikarga kadagiti papeles.",
        "upload_directory_missing": "Ti pagikargaan a direktorio ($1) ket awan ken saan a mabalin a mapartuat babaen ti webserver.",
        "file-deleted-duplicate-notitle": "Ti papales a kapada iti daytoy a papeles ket dati a naikkat, ken nalapdan ti titulo.\nNasken nga agdamagka iti sabali nga addaan iti abilidad a mangrepaso ti nalapdan a datos ti papeles tapno marepaso ti kasasaad sakbay a mapan nga agikarga manen iti daytoy.",
        "uploadwarning": "Ballaag ti panagikarga",
        "uploadwarning-text": "Pangngaasi a baliwam ti deskripsion ti papeles dita baba ken padasen manen.",
+       "uploadwarning-text-nostash": "Pangngaasi nga ikarga manen ti papeles, baliwan ti deskripsion dita baba ken padasen manen.",
        "savefile": "Idulin ti papeles",
        "uploaddisabled": "Nabaldado dagiti panagikarga.",
        "copyuploaddisabled": "Nabaldado ti panagikarga babaen ti URL.",
        "protectedtitles-submit": "Ipakita dagiti titulo",
        "listusers": "Listaan ti agar-aramat",
        "listusers-editsonly": "Ipakita laeng dagiti agar-aramat nga addaan kadagiti inurnos",
+       "listusers-temporarygroupsonly": "Ipakita laeng dagiti agar-aramat kadagiti temporario a grupo ti agar-aramat.",
        "listusers-creationsort": "Ilasin babaen ti petsa a pannakapartuat",
        "listusers-desc": "Ilasin iti agpababa nga urnos",
        "usereditcount": "$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}",
        "dellogpage": "Listaan ti panagikkat",
        "dellogpagetext": "Adda dita baba ti listaan dagiti kaudian a panangikkat.",
        "deletionlog": "listaan ti panagikkat",
+       "log-name-create": "Listaan ti panagpartuat iti panid",
+       "log-description-create": "Dita baba ket listaan dagiti kaudian a panagpartuat iti panid.",
+       "logentry-create-create": "{{GENDER:$2|Pinartuat}} ni $1 ti panid ti $3",
        "reverted": "Naisubli iti nasapsapa a rebision",
        "deletecomment": "Rason:",
        "deleteotherreason": "Sabali/maipatinayon a rason:",
        "whatlinkshere": "Dagiti nakasilpo ditoy",
        "whatlinkshere-title": "Pampanid a nakasilpo iti \"$1\"",
        "whatlinkshere-page": "Panid:",
-       "linkshere-2": "Dagiti sumaganad a panid ket nakasilpo iti <strong>$1</strong>:",
-       "nolinkshere-2": "Awan ti pampanid a nakasilpo iti <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Awan ti pampanid a nakasilpo iti <strong>$1</strong> iti napili a nagan ti espasio.",
+       "linkshere-2": "Dagiti sumaganad a panid ket nakasilpo iti <strong>$2</strong>:",
+       "nolinkshere-2": "Awan ti pampanid a nakasilpo iti <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Awan ti pampanid a nakasilpo iti <strong>$2</strong> iti napili a nagan ti espasio.",
        "isredirect": "baw-ing a panid",
        "istemplate": "mailak-am",
        "isimage": "silpo ti papeles",
        "gotointerwiki-invalid": "Ti nainaganan a titulo ket imbalido.",
        "pagedata-title": "Datos ti panid",
        "pagedata-not-acceptable": "Awan ti kapada a pormat ti nabirukan. Dagiti masuportaran a kita ti MIME: $1",
-       "pagedata-bad-title": "Imbalido ti titulo: $1."
+       "pagedata-bad-title": "Imbalido ti titulo: $1.",
+       "unregistered-user-config": "Para kadagiti rason ti seguridad dagiti subpanid ti agar-aramat iti JavaScript, CSS ken JSON ket saan a maikarga  para kadagiti di nairehistro nga agar-aramat.",
+       "passwordpolicies": "Dagiti annuroten ti kontrasenias",
+       "passwordpolicies-summary": "Daytoy ti listaan dagiti epektibo nga annuroten ti kontrasenias para kadagiti grupo ti agar-aramat iti daytoy a wiki.",
+       "passwordpolicies-group": "Grupo",
+       "passwordpolicies-policies": "Dagiti annuroten",
+       "passwordpolicies-policy-minimalpasswordlength": "Ti kontrasenias ket nasken a saan a basbassit ngem $1 a {{PLURAL:$1|karakter|karkarakter}} iti kaatiddog",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Ti kontrasenias ket nasken a saan a basbassit ngem $1 a {{PLURAL:$1|karakter|karkarakter}} iti kaatiddog tapno makabaelan ti sumrek",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Ti kontrasenia ket saan a mabalin a kapada a kas ti nagan ti agar-aramat",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Ti kontrasenias ket saan a mabalin a maipada kadagiti naiparit a kontrasenias",
+       "passwordpolicies-policy-maximalpasswordlength": "Ti kontrasenias ket nasken a basbassit ngem $1 a {{PLURAL:$1|karakter|karkarakter}} iti kaatiddog",
+       "passwordpolicies-policy-passwordcannotbepopular": "Ti kontrasenias ket saan a mabalin {{PLURAL:$1|a ti popular a kontrasenias|nga adda iti listaan dagiti $1 a popular a kontrasenias}}"
 }
index 1400381..2c4245f 100644 (file)
        "difference-title": "$1 — эршашта юкъе йола башхало",
        "lineno": "МугI $1:",
        "compareselectedversions": "ВIаши йиста хержа версеш",
+       "showhideselectedversions": "Хьахьокха/къайлаяха хьахержа эршаш",
        "editundo": "юхадаккха",
        "diff-empty": "(башхалонаш яц)",
        "diff-multi-sameuser": "({{PLURAL:$1|цхьа юкъ хулаш йола верси|$1 юкъ хулаш йола версеш}} гуш яц цу доакъашхочун)",
        "searchrelated": "вIашагIдувзаденна",
        "searchall": "деррига",
        "search-showingresults": "{{PLURAL:$4|Кораяьй <strong>$1</strong> — цхьа оагӀув|Из дош корадаьд <strong>$3</strong> оагӀонашка, царех гойта $2 оагӀув}}",
-       "search-nonefound": "Хьа дехар дара вIаши нийса доагIаш дар корадаьдац.",
+       "search-nonefound": "Iа лехача дешашта вIаши нийса доагIаш дар корадаьдац.",
        "powersearch-legend": "Шердаь лахар",
-       "powersearch-ns": "ЦIеÑ\80ий Ð°Ñ\80енаÑ\88каÑ\85Ñ\8c лахар:",
+       "powersearch-ns": "ЦIеÑ\80ий Ð¼ÐµÑ\82Ñ\82игаÑ\88ка лахар:",
        "powersearch-toggleall": "Деррига",
        "powersearch-togglenone": "Цхьаккха",
        "powersearch-remember": "Дагалáца хержар кхы тӀехьагӀа лохача хана накъадаргдолаш",
        "gender-female": "ВикиоагIонаш тоаеш я из",
        "prefs-help-gender": "Укхаза оттадаьр ражо леладергда шуга йистхулача хана шо маIа да е кхал да хьежжа.\nМассанена ховш а бIаргагуш а хургда уж оттамаш.",
        "email": "Email",
-       "prefs-help-email": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81 Ð¾Ñ\82Ñ\82аде Ð¿Ð°Ñ\80аз Ð´Ð°Ñ\86, Ð°Ð¼Ð¼Ð° Ð¸Ð· Ñ\8dÑ\88аÑ\88 Ñ\85Ñ\83Ñ\80гда, Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ñ\81анна Ñ\85Ñ\8cона Ñ\85Ñ\8cа ÐºÑ\8aайладIоагIа Ð´Ð¸Ñ\86лой.",
+       "prefs-help-email": "ЭлекÑ\82Ñ\80онни Ð¿Ð¾Ñ\88Ñ\82а Ñ\86Iай Ð¾Ñ\82Ñ\82аде Ð´ÐµÐºÑ\85аÑ\80ийла Ð´Ð°Ñ\86 Ñ\88о, Ñ\86Ñ\85Ñ\8cабакÑ\8aда Ð¸Ð· Ñ\8dÑ\88аÑ\88 Ñ\85Ñ\83Ñ\80гда Ð½Ð°Ð³Ð°Ñ\85Ñ\8cа Ñ\81анна Ñ\88оана Ñ\88оай Ð¿Ð°Ñ\80олÑ\8c Ð¹Ð¸Ñ\86лойÑ\8f.",
        "prefs-help-email-others": "Иштта цунца кхыболча доакъашхошта аьттув хургба шоаца бувзам бе а, шун оагIон тIа е шун дувца оттадара оагIон тIа йола тIахьожаяргаца.\nШун электронни почта адрес цхьаннена гуш хургъяц.",
        "prefs-info": "Кертера дараш",
        "prefs-i18n": "Меттаца дувзаденнар",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократаш",
        "right-read": "оагӀонашка хьажар",
        "right-edit": "оагӀонаш нийсъяр",
+       "right-createpage": "дувцара оагIонаш йоаца оагӀонаш кхоллар",
        "right-createtalk": "дувца оттадара оагӀонаш кхоллар",
+       "right-createaccount": "доакъашхошта керда дагара йоазонаш кхоллар",
        "right-move": "оагIонай цIераш хувцар",
        "right-movefile": "файлай цӀераш хувцар",
+       "right-autoconfirmed": "IP-цIай тIара сухала доазув дар Iехадар",
        "right-writeapi": "дIаяздеш лелае API",
+       "right-editsemiprotected": "оагIонаш тоаяр, лораяь йола иштта «{{int:protect-level-autoconfirmed}}»",
+       "right-viewmywatchlist": "ший зема хьаязъяьрага хьажар",
+       "right-editmywatchlist": "ший зема хьаязъяьр хувцар",
+       "right-viewmyprivateinfo": "шийх лаьца долчунга хьажар (масала, электронни пошта цIай, боккъонца йола цӀи)",
+       "right-editmyprivateinfo": "хьайх лаьца дар хувцар (масала, электронни пошта цIай, боккъонца йола цӀи)",
+       "right-editmyoptions": "ший хьадаь оттамаш хувцар",
+       "right-noratelimit": "сухала доазув дар Iехадар",
        "newuserlogpage": "Доакъашхой дIаязбаь таптар",
        "rightslog": "Доакъашхочун бокъоний тéптар",
        "action-read": "ер оагӀув éшар",
        "recentchanges-label-plusminus": "байташкахь боарам хувцар",
        "recentchanges-legend-heading": "<strong>Легенда:&nbsp;</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа иштта [[Special:NewPages|керда оагIонашка]])",
-       "rcfilters-activefilters": "Хьалотаяь фильтраш",
-       "rcfilters-advancedfilters": "Шеръяь фильтраш",
+       "recentchanges-submit": "Хьахьокха",
+       "rcfilters-tag-remove": "ДIадаккха '$1'",
+       "rcfilters-legend-heading": "<strong>Лоацдаьраш:&nbsp;</strong>",
+       "rcfilters-other-review-tools": "Тохкама кхыйола кечалаш",
+       "rcfilters-group-results-by-page": "Корадаьчарех тоабаш хьае",
+       "rcfilters-activefilters": "Хьалотадаь луттаргаш",
+       "rcfilters-advancedfilters": "Шердаь луттаргаш",
+       "rcfilters-limit-title": "Гойта хувцамаш",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|хувцам}}, $2",
+       "rcfilters-date-popup-title": "Лахара ха белгалъяр",
+       "rcfilters-days-title": "ТӀехьара денош",
+       "rcfilters-hours-title": "ТӀехьара сахьаташ",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|ди}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сахьат}}",
+       "rcfilters-highlighted-filters-list": "Белгалдаьд: $1",
        "rcfilters-quickfilters": "Ӏалашъяь фильтраш",
        "rcfilters-quickfilters-placeholder-title": "Ӏалашъяь фильтраш хIанзехьа яц",
        "rcfilters-quickfilters-placeholder-description": "Фильтра оттамаш дIаяздергдолаши тIехьагIа царех юха а пайда эцаргболаши, лохегIа «Активни фильтр» яздаьча моттиге юкъеехкарг белгалъеча хьарака IотIатоIае.",
        "rcfilters-savedqueries-unsetdefault": "Ше хиннача тайпах яр дIаяккха",
        "rcfilters-savedqueries-remove": "ДIаяккха",
        "rcfilters-savedqueries-new-name-label": "ЦIи",
+       "rcfilters-restore-default-filters": "Юхаметтаоттаде луттаргаш юххьанцара хиннача тайпара",
+       "rcfilters-clear-all-filters": "ӀоцIенде деррига луттаргаш",
+       "rcfilters-show-new-changes": "ТӀехьара хувцамаш",
+       "rcfilters-search-placeholder": "Луттаргаш лаха (меню гIолла е укхаза Iочуязъеш)",
+       "rcfilters-invalid-filter": "Мегашдоаца луттарг",
+       "rcfilters-empty-filter": "Хьалотадаь луттаргаш дац. Гойташ да деррига хувцамаш.",
+       "rcfilters-filterlist-title": "Луттаргаш",
+       "rcfilters-filterlist-whatsthis": "Мишта бу укхо болх?",
+       "rcfilters-filterlist-feedbacklink": "Хьадувца тхога, фу хета шоана укх литтара керда кечалах",
+       "rcfilters-highlightbutton-title": "Белгалде хьалехараш",
+       "rcfilters-highlightmenu-title": "Хьахаржа бос",
+       "rcfilters-highlightmenu-help": "Белгалде аьнна бос хьахаржа",
+       "rcfilters-filterlist-noresults": "Луттаргаш корадаьдац",
+       "rcfilters-filtergroup-authorship": "Автор хилар хувцар",
+       "rcfilters-filter-editsbyself-label": "Оаш даь хувцамаш",
+       "rcfilters-filter-editsbyself-description": "Шун къахьегам.",
+       "rcfilters-filter-editsbyother-label": "Кхыболча доакъашхоша даь хувцамаш",
+       "rcfilters-filter-editsbyother-description": "Деррига тоадараьш, хьа дараш доацаш.",
+       "rcfilters-filtergroup-userExpLevel": "Доакъашхочун регистраци а цун поалхам а",
+       "rcfilters-filter-user-experience-level-registered-label": "ДӀаязбеннараш",
+       "rcfilters-filter-user-experience-level-registered-description": "Ражача дIаэйтта доакъашхой.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "ДӀаязбеннабоацараш",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Ражача дIаэйтта боаца доакъашхой.",
+       "rcfilters-filter-user-experience-level-newcomer-label": "Дукха ха йоаццаш дIаязбеннараш",
+       "rcfilters-filter-user-experience-level-newcomer-description": "ДIаязбенна доакъашхой, 10 кIезигагIа даь тоадаьр долаш е 4 дийнахь мара болх ца баь болаш",
+       "rcfilters-filter-user-experience-level-learner-label": "Iамеш",
+       "rcfilters-filter-user-experience-level-learner-description": "«Керда доакъашхои» «Поалхаме доакъашхои» яхача даржашта юкъе бола дӀаязбенна доакъашхой.",
+       "rcfilters-filter-user-experience-level-experienced-label": "Поалхаме доакъашхой",
+       "rcfilters-filter-user-experience-level-experienced-description": "500 совгIа тоадаьр долаш 30 дийнахь болх баь болаш дӀаязбенна доакъашхой.",
+       "rcfilters-filtergroup-automated": "Авто-къахьегам",
        "rcfilters-filter-bots-label": "Бот",
        "rcfilters-filter-bots-description": "Авто-кечалашца даь тоадар.",
        "rcfilters-filter-humans-label": "Саг ва (бот яц)",
+       "rcfilters-filter-humans-description": "Доакъашхоша даь тоадар.",
+       "rcfilters-filtergroup-significance": "Лоадам",
+       "rcfilters-filter-minor-label": "ЗӀамига хувцамаш",
+       "rcfilters-filter-minor-description": "Авторо зIамига да аьнна белгалдаь тоадаьраш.",
+       "rcfilters-filter-major-label": "ЛерттIа хувцамаш",
+       "rcfilters-filter-major-description": "Авторо зIамига да аьнна белгалдаьдоаца тоадаьраш.",
+       "rcfilters-filtergroup-changetype": "Хувцама тайпа",
        "rcfilters-filter-pageedits-label": "ОагӀона тоадаьраш",
-       "rcfilters-filter-newpages-label": "JагӀонаш кхоллар",
+       "rcfilters-filter-pageedits-description": "Чулоацами, дувцара оагIонаши, оагIаташи тоаяр",
+       "rcfilters-filter-newpages-label": "ОагӀонаш кхоллар",
        "rcfilters-filter-newpages-description": "Керда оагӀонаш кхолла аьнна даь тоадар.",
-       "rcfilters-liveupdates-button": "Ше-шегIа кердадахийта",
-       "rcfilters-liveupdates-button-title-on": "ДIадоаде ше-шегIа кердадахар",
+       "rcfilters-filter-categorization-label": "ОагIаташ хувцар",
+       "rcfilters-filter-categorization-description": "ОагIаташ чура араяьхача е оагIаташта тIатехача оагIонех лаьца.",
+       "rcfilters-filter-logactions-label": "Протокол лелаеш хьадаьр",
+       "rcfilters-filter-logactions-description": "Администратораш хьадаьр, дагара йоазонаш кхоллар, оагIонаш дIаяхар, файлаш хьачуяхар...",
+       "rcfilters-filtergroup-lastRevision": "ТIехьара эршаш",
+       "rcfilters-filter-lastrevision-label": "Карара эрш",
+       "rcfilters-filter-lastrevision-description": "ОагIон тIа алхха тIехьара хинна хувцам.",
+       "rcfilters-filter-previousrevision-label": "ТIехьара йоаца эрш",
+       "rcfilters-filter-previousrevision-description": "«ТӀехьара эрш» мел доаца тоадаьраш.",
+       "rcfilters-liveupdates-button": "Ши-шегIа кердадувлийта",
+       "rcfilters-liveupdates-button-title-on": "ДIадоаде ши-шегIа кердадалар",
        "rcfilters-liveupdates-button-title-off": "Керда хувцам бешше хьахьокха",
        "rcfilters-preference-label": "Къайлаяккха «Керда хувцамий» толашагIа йола эрш",
        "rcfilters-preference-help": "Юхатотта 2017 шера хинна интерфейса редизайн а цу хана тӀатеха кечалаш а.",
        "rcshowhidemine": "$1 Iайха тоадаьраш",
        "rcshowhidemine-show": "Хьахьокха",
        "rcshowhidemine-hide": "Къайладаккха",
+       "rcshowhidecategorization": "$1 оагIаташ тIатохар",
+       "rcshowhidecategorization-show": "Хьахьокха",
+       "rcshowhidecategorization-hide": "Ма хьокха",
        "rclinks": "Хьахьокха $2 дийнахь даь хинна тIеххьара $1 хувцамаш",
        "diff": "башхало",
        "hist": "истори",
        "statistics": "ГӀулакх-хьал",
        "statistics-articles": "Статьяш",
        "statistics-pages": "ОагIонаш",
+       "statistics-users": "Ражача дӏаийтта доакъашхой",
        "statistics-users-active": "Хьинаре доакъашхой",
        "double-redirect-fixer": "ДӀа-хьа хьожавара оагIонаш тоаер",
        "brokenredirects-edit": "нийсъе",
        "prefixindex-strip": "ДIакъайлаяха хьелехача оагIоний дешхьалхенаш (префиксаш)",
        "shortpages": "Лоаца оагIонаш",
        "longpages": "ЙIаьха оагIонаш",
+       "protectedpages-filters": "Луттаргаш:",
        "protectedpages-page": "ОагIув",
        "listusers": "Доакъашхой хьаязъяьр",
+       "usereditcount": "$1 {{PLURAL:$1|тоадаьр}}",
        "usercreated": "{{GENDER:$3|система чу дӀаязвеннав|система чу дӀаязъяннай}} $1 $2",
        "newpages": "Керда оагIонаш",
+       "newpages-submit": "Хьахьокха",
+       "newpages-username": "Доакъашхо:",
        "move": "ЦIи хувца",
        "movethispage": "ЦIи хувца укх оагIон",
        "pager-newer-n": "$1 дукхагIа {{PLURAL:$1|керда}}",
        "all-logs-page": "Деррига тIакхача йиш йола тептараш",
        "alllogstext": "{{SITENAME}} яхача сайта тептарий юкъара хьаязъяьр.\nХьалехараш къерда йиш я тептара тайпах, доакъашхочун цIерах (регистр лоархIаш я) е хьоахаяьча оагIонах (укхаза а иштта регистр лоархI).",
        "logempty": "Укх оагӀон дӀаяздаьраш тептара чу дац.",
+       "checkbox-select": "Харжар: $1",
+       "checkbox-all": "Деррига",
+       "checkbox-none": "Цхьаккха",
+       "checkbox-invert": "Инверт яр",
        "allpages": "Еррига оагIонаш",
        "prevpage": "Хьалха йоагIа оагIув ($1)",
        "allpagesfrom": "Гучаяха оагӀонаш, дӀайолалуш йола укх алапех:",
        "linksearch-line": "$1 яхача оагIонна тIатовжам $2 чура",
        "activeusers": "Хьинаре доакъашхой",
        "activeusers-submit": "Хьахьокха хьинаре бола доакъашхой",
-       "listgrouprights": "Доакъашхой тоабай бокъонаш",
+       "listgrouprights": "Доакъашхой тоабан бокъонаш",
+       "listgrouprights-summary": "ЛохегIа Iохьоахаяьй укх вике чу йола доакъашхой тоабаш. Белгалъяьй цар торонаши бокъонаши.\nИштта, эшаш хила мег [[{{MediaWiki:Listgrouprights-helppage}}|кхыбола хоам]] а.",
+       "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">ДIаенна бокъонаш</span>\n* <span class=\"listgrouprights-revoked\">ДӀаяьха бакъонаш</span>",
+       "listgrouprights-group": "Тоаба",
+       "listgrouprights-rights": "Бокъонаш",
        "listgrouprights-members": "(доакъашхой хьаязъяьр)",
        "listgrouprights-namespaceprotection-namespace": "ЦIерий моттиг",
+       "listgrants-rights": "Бокъонаш",
        "emailuser": "Доакъашхочоа каьхат",
+       "emailusername": "Доакъашхочун цIи:",
        "usermessage-editor": "Системан дIакхоачадар",
        "watchlist": "Зем",
        "mywatchlist": "Зем",
-       "watchlistfor2": "Цунна $1 $2",
+       "watchlistfor2": "Доакъашхо $1 $2",
+       "addwatch": "Зема хьаязъяьрá юкъеяьккха",
        "addedwatchtext": "Статья «[[:$1]]» а, цун дувца оттадара оагIув а тIатехай хьа [[Special:Watchlist|зем бара хьаязъяьра]].",
        "removedwatchtext": "Статья «[[:$1]]» а, иштта цун дувца оттадара оагIув а дIаяьккхай хьа [[Special:Watchlist|зем бара хьаязъяьр]] чура.",
        "watch": "Зем бе",
        "watchthispage": "Зем бе укх оагӀон",
        "unwatch": "Ма бе зем",
        "notanarticle": "Статья яц",
-       "watchlist-details": "Хьа зем бара хьаязъяьр чу $1 {{PLURAL:$1|оагIув}} я (иштта дувца оттадара оагIонаш а).",
+       "watchlist-details": "Хьа зема хьаязъяьра чу $1 {{PLURAL:$1|оагIув}} я (иштта я дувцара оагIонаш а).",
        "wlheader-showupdated": "Хувцаенна оагIонаш '''сома''' шрифтаца белгалъяьй.",
-       "wlnote": "Ð\9aIалÑ\85а Ñ\85Ñ\8cагойÑ\82 {{PLURAL:$2|Ñ\82IеÑ\85Ñ\8cаÑ\80Ñ\87а Ñ\81аÑ\85Ñ\8cаÑ\82а|Ñ\82IеÑ\85Ñ\8cаÑ\80Ñ\87а <strong>$2</strong> Ñ\81аÑ\85Ñ\8cаÑ\82а}} Ð´Ð°Ñ\8c Ñ\85инна {{PLURAL:$1|Ñ\82IеÑ\85Ñ\85Ñ\8cаÑ\80а Ñ\85Ñ\83вÑ\86ам|Ñ\82IеÑ\85хьара <strong>$1</strong> хувцам}} ($3 $4).",
+       "wlnote": "Ð\9bоÑ\85егIа Ñ\85Ñ\8cагойÑ\82 {{PLURAL:$2|Ñ\82IеÑ\85Ñ\8cаÑ\80Ñ\87а Ñ\81аÑ\85Ñ\8cаÑ\82а|Ñ\82IеÑ\85Ñ\8cаÑ\80Ñ\87а <strong>$2</strong> Ñ\81аÑ\85Ñ\8cаÑ\82а}} Ð´Ð°Ñ\8c Ñ\85инна {{PLURAL:$1|Ñ\82IеÑ\85Ñ\8cаÑ\80а Ñ\85Ñ\83вÑ\86ам|Ñ\82Iехьара <strong>$1</strong> хувцам}} ($3 $4).",
        "wlshowlast": "Хьахьокха тIехьарча $2 ден $1 сахьатá",
+       "watchlist-hide": "Ма хьокха",
+       "watchlist-submit": "Хьахьокха",
+       "wlshowtime": "МалагIча ха юкъа хиннар гойта деза:",
+       "wlshowhideminor": "зӀамига хувцамаш",
+       "wlshowhidebots": "бóташ",
+       "wlshowhideliu": "шоашка дагара йоазонаш дола доакъашхой",
+       "wlshowhideanons": "шоай цIераш къайлаяьха доакъашхой",
+       "wlshowhidepatr": "техка тоадаьраш",
+       "wlshowhidemine": "са тоадар",
+       "wlshowhidecategorization": "оагIаташ тIатохар",
        "watchlist-options": "Зем бара хьаязъяьра тоадараш",
        "watching": "Зем бара хьаязъяьр чу тIатохар",
        "unwatching": "Зем бара хьаязъяьр чура дIадаккхар",
        "protect-cascadeon": "Каскадни лорадар оттадаь йолча {{PLURAL:$1|1=кIалхагIа белгалъяь оагIон чу|кIалхагIа белгалъяь оагIонаш чу}} юкъеяьккха хилара бахьане ер оагIув хIанза лораяь я. Укх оагIон лорадара дарж хувцаро каскадни лорадар меттахдоаккхадац.",
        "protect-default": "Лорадар доацаш",
        "protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
-       "protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
+       "protect-level-autoconfirmed": "Могадаьд алхха автохьатIаийца доакъашхошта",
        "protect-level-sysop": "Могадаьд алхха администраторашта",
        "protect-summary-cascade": "каскадни",
        "protect-expiring": "чакхъйоала $1 (UTC)",
        "namespace": "ЦIерий моттигаш:",
        "invert": "Хержар юхадаккха",
        "tooltip-invert": "Оттае ер белгало, хержа цIерий аре чу а (белгалъяь яле вIашагIъювзаенна цIерий аре чу а), оагIонаш тIа а даь хувцамаш къайладоахаргдолаш",
-       "namespace_association": "Ювзаенна Ð°Ñ\80е",
+       "namespace_association": "Ð\92IаÑ\88агIйийÑ\85ка Ð¼Ð¾Ñ\82Ñ\82иг",
        "tooltip-namespace_association": "Оттае ер белгало, иштта хержа цIерий ареца вIашагIъювзаенна дувца оттадара цIерий аре (е кхыяр) юкъейоаккхаргйолаш",
        "blanknamespace": "(Кертера)",
        "contributions": "{{GENDER:$1|Доакъашхочун}} къахьегам",
        "month": "Укх бетт (кхы хьалхагIа)",
        "year": "Укх шер (кхы хьалхагIа):",
        "sp-contributions-newbies": "Хьахьокха алхха керда дагара йоазонашца баь бола къахьегам",
-       "sp-contributions-blocklog": "чIега тохараш",
-       "sp-contributions-uploads": "чуяьккхараш",
+       "sp-contributions-blocklog": "блок тохар",
+       "sp-contributions-deleted": "{{GENDER:$1|доакъашхочун}} дӀадаьккха хинна тоадар",
+       "sp-contributions-uploads": "чуяьхараш",
        "sp-contributions-logs": "тептараш",
        "sp-contributions-talk": "дувца оттадар",
+       "sp-contributions-userrights": "{{GENDER:$1|доакъашхочун}} бокъонашта урхалдар",
        "sp-contributions-search": "Къахьегама лахар",
        "sp-contributions-username": "IP-адрес е доакъашхочун цӀи:",
-       "sp-contributions-toponly": "Гойта алхха тIехьара версеш санна лоархIаш дола нийсдараш",
-       "sp-contributions-newonly": "ОагIонаш кхоллара мара хувцамаш ма гойта.",
+       "sp-contributions-toponly": "Гойта алхха тIехьара эршаш хинна дола тоадаьраш",
+       "sp-contributions-newonly": "Гойта алхха оагIонаш хьакхоллар.",
+       "sp-contributions-hideminor": "Къайладаха зIамига тоадаьраш",
        "sp-contributions-submit": "Хьалáха",
        "whatlinkshere": "Тӏатовжамаш укхаза",
        "whatlinkshere-title": "«$1» яхача оагӏонна тӏатовжаш йола оагӏонаш",
        "whatlinkshere-page": "ОагIув:",
-       "linkshere-2": "«'''$1'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
-       "nolinkshere-2": "Кхыйолча оагӏонашкара '''$1''' яхача оагӏон тIатовжамаш доацаш да.",
+       "linkshere-2": "<strong>$2</strong> ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
+       "nolinkshere-2": "Кхыйолча оагӏонашкара <strong>$2</strong> яхача оагӏонна тIатовжамаш доацаш да.",
        "isredirect": "дIа-хьа хьожавара оагIув",
        "istemplate": "юкъейоалаяр",
        "isimage": "Файлови тӏатовжам",
        "whatlinkshere-hidetrans": "$1 юкъедоаладаьраш",
        "whatlinkshere-hidelinks": "$1 тӏатовжамаш",
        "whatlinkshere-hideimages": "$1 файлай тIатовжамаш",
-       "whatlinkshere-filters": "ФилÑ\8cÑ\82Ñ\80аш",
+       "whatlinkshere-filters": "Ð\9bÑ\83Ñ\82Ñ\82аÑ\80гаш",
        "blockip": "ЧIега тоха {{GENDER:$1|доакъашхочун}}",
        "ipboptions": "2 сахьат:2 hours,1 ди:1 day,3 ди:3 days,1 кIира:1 week,2 кIира:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шу:1 year,хоадаяь ха йоаца:infinite",
        "ipblocklist": "ЧIега теха доакъашхой",
        "export": "Оагӏоний экспорт",
        "allmessagesname": "Хоам",
        "allmessagesdefault": "Массаза йола текст",
+       "allmessages-filter-legend": "Луттарг",
        "allmessages-filter-all": "Еррига",
        "allmessages-language": "Мотт:",
        "allmessages-filter-submit": "Дехьавала",
        "pageinfo-length": "ОагӀон йIоахал (байтах)",
        "pageinfo-article-id": "ОагӀон ID",
        "pageinfo-language": "ОагӀон мотт",
+       "pageinfo-language-change": "хувца",
        "pageinfo-content-model": "ОагӀон чудара модель",
+       "pageinfo-content-model-change": "хувца",
        "pageinfo-robot-policy": "Лахара роботашца йола индексаци",
        "pageinfo-robot-index": "Могадаьд",
        "pageinfo-robot-noindex": "Могадаьдац",
        "show-big-image-preview": "Хьалххе бIаргтохача хана бола боарам: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Кхыбола тIера боарам}}: $1.",
        "show-big-image-size": "$1 × $2 пиксель",
+       "newimages-legend": "Луттарг",
        "noimages": "Суртaш дац.",
        "ilsubmit": "Хьалаха",
+       "days": "{{PLURAL:$1|$1 ди}}",
+       "weeks": "{{PLURAL:$1|$1 кӀира}}",
+       "months": "{{PLURAL:$1|$1 бутт}}",
+       "years": "{{PLURAL:$1|$1 шу}}",
+       "ago": "$1 хьалхагIа",
+       "just-now": "хIанзза",
+       "hours-ago": "$1 {{PLURAL:$1|сахьат}} хьалхагIа",
+       "minutes-ago": "$1 {{PLURAL:$1|минот}} хьалха",
+       "seconds-ago": "$1 {{PLURAL:$1|секунд}} хьалха",
+       "monday-at": "оршот дийнахь $1",
+       "tuesday-at": "шинара дийнахь $1",
+       "wednesday-at": "кхаьрача дийнахь $1",
+       "thursday-at": "ерача дийнахь $1",
+       "friday-at": "пӀаьраска дийнахь $1",
+       "saturday-at": "шоатта дийнахь $1",
+       "sunday-at": "кӀирандийнахь $1",
+       "yesterday-at": "селхан $1 даьлча",
        "bad_image_list": "Формат хила езаш я иштта:\n\nЛоархIаш хургда алхха хьаязъяьра элементаш (укх * яхача хьаракаца дIадолалуш дола могIараш).\nМогIара хьалхара тIатовжам хила безаш ба хьачудаккха йиш йоацача суртá тIатовжаш.\nАмма цун тIехьадоагIа тIатовжамаш тIатовжаш хургда сурт чуоттаде йиш йолча статьяшта.",
        "metadata": "Мета-дараш",
        "metadata-help": "Файло кхыдола дараш чулоац, цифрацара суртдоакхарго е сканеро тIатохаш дола. Нагахьа санна файл хьачуякхачул тIехьагIа хийца хинна яле, цхьаццайола параметраш хIанзарча сурта тIа йоацаш хила мег.",
        "metadata-fields": "Укх хьаязъяьра чу Iохьоахаяь сурта метадарий йистош хьахьекха хургья сурта оагIон тIа дIахьулъяьча метадарий таблица чу. Юхейиса йистош къайла хургья.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Шерал",
        "exif-imagelength": "Лакхал",
+       "exif-bitspersample": "Беса кIоаргал",
        "exif-orientation": "Сурта белгало",
        "exif-xresolution": "ПхьорагIа тIера боарам",
        "exif-yresolution": "УрагIа тIера боарам",
        "exif-exposureprogram-1": "Кара",
        "exif-scenecapturetype-1": "Ландшафт",
        "exif-scenecapturetype-2": "Сага сурт",
+       "exif-dc-rights": "Бокъонаш",
        "exif-iimcategory-edu": "Дешарца Iомадар",
        "exif-iimcategory-evn": "Гонахье",
        "exif-iimcategory-hth": "УнахцIано",
        "imgmultigoto": "$1 оагIон тIа дехьавала",
        "table_pager_limit_submit": "Кхоачашде",
        "watchlistedit-normal-title": "Зема хьаязъяьр хувцар",
-       "watchlisttools-clear": "IоцIанъе зем бара хьаязъяьр",
-       "watchlisttools-view": "Хьаязъяьр чура оагIонаш тIа дола хувцамаш",
+       "watchlisttools-clear": "IоцIанъе зема хьаязъяьр",
+       "watchlisttools-view": "Хьаязъяьра чура оагIонаш тIа даь хувцамаш",
        "watchlisttools-edit": "Хьажа а хувца а хьаязъяьр",
-       "watchlisttools-raw": "Ð\9cаÑ\81Ñ\81аза Ð¹Ð¾Ð»Ð° Ñ\82екÑ\81Ñ\82 Ñ\81анна Ñ\85Ñ\83вÑ\86а",
+       "watchlisttools-raw": "Тоае Ñ\82екÑ\81Ñ\82 Ñ\81анна",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дувца оттадар]])",
        "duplicate-defaultsort": "Теркам. Долча тайпара дIанийсдара дIоагIа «$2» юхакъоастаду долча тайпара дIанийсдара хьалха хинна дIоагIа «$1».",
        "version": "Эрш",
        "specialpages-group-pagetools": "ОагIонашта эша кечалаш",
        "specialpages-group-developer": "Кийчдархочун кечалаш",
        "external_image_whitelist": "#Ер мугI ший болча тайпара бита<pre>\n#Укхаз оттаде кастта дувлача выражений фрагменташ (// юкъе дола дакъа)\n#арахьара суртий URL адресашца дIанийсалургда уш.\n#Мегаргдола сурташ санна хьахьекха хургда, дIаходараш, сурташта тIахьожаяргаш санна хьахьекха хургда.\n#Укханца # долалуш дола могIараш алараш санна лоархIаш да.\n#МогIараш регистраца кIаьда дац\n\n#Укх могIара лакхе оттаде кастта дувлача выражений фрагменташ. Ер мугI ший болча тайпара бита</pre>",
-       "tag-filter": "[[Special:Tags|Ð\91елгалонай]] Ñ\84илÑ\8cÑ\82Ñ\80:",
+       "tag-filter": "[[Special:Tags|ФоÑ\81Ñ\82аÑ\88]] Ð»Ñ\83Ñ\82Ñ\82аÑ\80г:",
        "tag-filter-submit": "Литта",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Ð\91елгало|Ð\91елгалонаш}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=ФоÑ\81Ñ\82|ФоÑ\81Ñ\82аш}}]]: $2)",
        "tag-mw-undo": "эшац",
-       "tags-title": "Ð\91елгалонаш",
+       "tags-title": "ФоÑ\81Ñ\82аш",
        "tags-tag": "Белгалон цӀи",
        "tags-hitcount-header": "Белгалдаь нийсдараш",
        "tags-active-yes": "XӀау",
        "compare-page2": "ШоллагIа оагӀув",
        "compare-rev1": "Хьалхара эрш",
        "compare-rev2": "ШоллагӀа эрш",
+       "compare-submit": "ВIаши йиста",
        "htmlform-submit": "ДIадахьийта",
        "htmlform-reset": "Хувцамаш юхадаккха",
        "htmlform-selectorother-other": "Кхыдар",
        "special-characters-group-arabic": "Iарбий",
        "special-characters-group-persian": "Фаьрсий",
        "special-characters-group-hebrew": "Жугтий",
-       "randomrootpage": "Цаховш нийсъенна овлан оагӀув"
+       "mw-widgets-dateinput-no-date": "Ди хержадац",
+       "date-range-from": "Укх денз:",
+       "date-range-to": "Укх денга кхаччалца:",
+       "randomrootpage": "Цаховш нийсъенна овлан оагӀув",
+       "log-action-filter-rights": "Бокъонаш хувцаялара тайпа:",
+       "log-action-filter-all": "Еррига"
 }
index 359c6aa..e2bd113 100644 (file)
@@ -53,7 +53,7 @@
        "tog-watchlisthideminor": "Celez mikra redaktaji de la surveyaji",
        "tog-watchlisthideliu": "Celar l'editadi dal uzanti enrejistrita qui esas en la listo",
        "tog-watchlistreloadautomatically": "Rimontrez automatale la listo, kande filtrilo modifikesos (bezonas JavaScript)",
-       "tog-watchlistunwatchlinks": "Add direct unwatch/watch links to watchlist entries (bezonas l'uzo di JavaScript)",
+       "tog-watchlistunwatchlinks": "Adjuntar direkta ligili ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) a la listi di pagini modifikita (bezonas l'uzo di JavaScript)",
        "tog-watchlisthideanons": "Celar de la listo l'editadi facita da anonima redakteri",
        "tog-watchlisthidepatrolled": "Celez patroliita chanji en la surveyo-listo",
        "tog-watchlisthidecategorization": "Celar la kategorizeso di pagini",
        "badarticleerror": "Ica ago ne povas facesar en ca pagino.",
        "cannotdelete": "Ne es posibla efacar la pagino od arkivo \"$1\".\nForsan, ulu ja efacis ol.",
        "cannotdelete-title": "Ne povas efacar pagino \"$1\"",
+       "delete-hook-aborted": "L'efaco di la pagino abortesis da ula extenso (\"hook\").\nNe existas expliko pri to.",
        "no-null-revision": "Ne povis krear nova nula-revizo por pagino \"$1\"",
        "badtitle": "Nekorekta titulo",
        "badtitletext": "La solicitita pagino esas nevalida, vakua od esas\nnekorekta interlinguale od interwikale ligilo.",
        "cascadeprotected": "Ica pagino protektesis kontre l'editado pro ke lua kontenajo transskribesas en la sequanta {{PLURAL:$1|pagino, qua esas|pagini, qui esas}} protektita kande selektesis por ol la formo di \"protekto en kaskado\":\n$2",
        "namespaceprotected": "Vu ne es permisita redaktar pagini en la nomaro <strong>$1</strong>.",
        "customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
+       "customjsonprotected": "Vu ne havas permiso por redaktar ica pagino JSON pro ke ol kontenas personal ajustaji di altra uzero.",
        "customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
        "mycustomcssprotected": "Vu ne es permisita redaktar ita CSS pagino.",
+       "mycustomjsonprotected": "Vu ne es permisita redaktar ita pagino JSON.",
        "mycustomjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino.",
        "myprivateinfoprotected": "Vu ne es permisita redaktar vua privata informajo.",
        "mypreferencesprotected": "Vu ne es permisita redaktar vua preferaji.",
        "notextmatches": "Nula paginala texto fitas",
        "prevn": "antea {{PLURAL:$1|$1}}",
        "nextn": "sequanta {{PLURAL:$1|$1}}",
+       "prev-page": "Antea pagino",
        "prevn-title": "Antea $1 {{PLURAL:$1|rezultajo|rezultaji}}",
        "nextn-title": "Sequanta $1 {{PLURAL:$1|rezultajo|rezultaji}}",
        "shown-title": "Montrez $1 {{PLURAL:$1|rezulto|rezulti}} per pagino",
        "enotif_anon_editor": "anonima uzero $1",
        "deletepage": "Efacar pagino",
        "confirm": "Konfirmez",
-       "excontent": "La kontenajo esis: '$1'",
+       "excontent": "La kontenajo esis: \"$1\"",
        "excontentauthor": "la kontenajo esis: \"$1\", e l'unika redaktero esis \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "La kontenajo ante efaco esis: '$1'",
        "delete-confirm": "Efacar \"$1\"",
        "whatlinkshere": "Quo ligesas adhike",
        "whatlinkshere-title": "Pagini qui ligas ad \"$1\"",
        "whatlinkshere-page": "Pagino:",
-       "linkshere-2": "Ca pagini esas ligilizita ad '''$1''':",
-       "nolinkshere-2": "Nula pagino ligas ad '''$1'''.",
+       "linkshere-2": "Ca pagini esas ligilizita ad '''$2''':",
+       "nolinkshere-2": "Nula pagino ligas ad '''$2'''.",
        "isredirect": "ridirektanta pagino",
        "istemplate": "inkluzo",
        "isimage": "arkivo-ligilo",
        "watchlistedit-raw-explain": "Tituli en vua surveyo-listo montresas adinfre, e povas modifikesar per adjuntado od eskarto de la listo; nur un titulo per lineo.\nKande vu finos, kliktez \"{{int:Watchlistedit-raw-submit}}\".\nVu anke povas [[Special:EditWatchlist|uzar la redaktero ordinara ('standard')]].",
        "watchlistedit-raw-titles": "Tituli:",
        "watchlistedit-raw-submit": "Aktualigar surveyo-listo",
+       "watchlistedit-clear-title": "Vakuigar la surveyo-listo",
+       "watchlistedit-clear-legend": "Vakuigar la surveyo-listo",
+       "watchlistedit-clear-explain": "Omna tituli eliminesos de vua surveyo-listo",
+       "watchlistedit-clear-submit": "Vakuigar la surveyo-listo (To esas permananta!)",
        "watchlistedit-too-many": "Esas multa pagini por montrar hike.",
        "watchlisttools-clear": "Vakuigar la surveyo-listo",
        "watchlisttools-view": "Vidar relatanta chanji",
        "redirect-file": "Arkivo-nomo",
        "fileduplicatesearch-submit": "Serchar",
        "specialpages": "Specala pagini",
+       "specialpages-group-maintenance": "Raporti pri manteno",
        "specialpages-group-other": "Altra specala pagini",
        "specialpages-group-login": "Enirar / krear konto",
        "specialpages-group-changes": "Recenta chanji e registri",
index 47cd5be..77e3341 100644 (file)
        "whatlinkshere": "Hvað tengist hingað",
        "whatlinkshere-title": "Síður sem tengjast „$1“",
        "whatlinkshere-page": "Síða:",
-       "linkshere-2": "Eftirfarandi síður tengjast á '''$1''':",
-       "nolinkshere-2": "Engar síður tengjast á '''$1'''.",
-       "nolinkshere-ns-2": "Engar síður tengjast '''$1''' í þessu nafnrými.",
+       "linkshere-2": "Eftirfarandi síður tengjast á '''$2''':",
+       "nolinkshere-2": "Engar síður tengjast á '''$2'''.",
+       "nolinkshere-ns-2": "Engar síður tengjast '''$2''' í þessu nafnrými.",
        "isredirect": "endurbeind síða",
        "istemplate": "innifalið",
        "isimage": "skráartengill",
index 71eeb45..e205654 100644 (file)
        "dellogpage": "Cancellazioni",
        "dellogpagetext": "Di seguito sono elencate le pagine cancellate di recente.",
        "deletionlog": "cancellazioni",
+       "log-name-create": "Creazioni di pagine",
+       "log-description-create": "Di seguito sono elencate le pagine create di recente.",
+       "logentry-create-create": "$1 {{GENDER:$2|ha creato}} la pagina $3",
        "reverted": "Ripristinata la versione precedente",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Altri motivi/dettagli:",
        "whatlinkshere": "Puntano qui",
        "whatlinkshere-title": "Pagine che puntano a \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere-2": "Le seguenti pagine contengono dei collegamenti a <strong>$1</strong>:",
-       "nolinkshere-2": "Nessuna pagina contiene collegamenti che puntano a '''$1'''.",
-       "nolinkshere-ns-2": "Non vi sono pagine che puntano a '''$1''' nel namespace selezionato.",
+       "linkshere-2": "Le seguenti pagine contengono dei collegamenti a <strong>$2</strong>:",
+       "nolinkshere-2": "Nessuna pagina contiene collegamenti che puntano a <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Non vi sono pagine che puntano a <strong>$2</strong> nel namespace selezionato.",
        "isredirect": "redirect",
        "istemplate": "inclusione",
        "isimage": "collegamento al file",
index 2c02c2a..e458155 100644 (file)
        "whatlinkshere": "リンク元",
        "whatlinkshere-title": "「$1」へリンクしているページ",
        "whatlinkshere-page": "ページ:",
-       "linkshere-2": "以下のページが、<strong>$1</strong> にリンクしています:",
-       "nolinkshere-2": "<strong>$1</strong> にリンクしているページはありません。",
-       "nolinkshere-ns-2": "指定した名前空間内に、<strong>$1</strong> にリンクしているページはありません。",
+       "linkshere-2": "以下のページが、<strong>$2</strong> にリンクしています:",
+       "nolinkshere-2": "<strong>$2</strong> にリンクしているページはありません。",
+       "nolinkshere-ns-2": "指定した名前空間内に、<strong>$2</strong> にリンクしているページはありません。",
        "isredirect": "転送ページ",
        "istemplate": "参照読み込み",
        "isimage": "ファイルへのリンク",
        "autosumm-blank": "ページの白紙化",
        "autosumm-replace": "内容を「$1」で置換",
        "autoredircomment": "[[$1]]への転送ページ",
-       "autosumm-removed-redirect": "[[$1]] へのリダイレクトを除しました",
+       "autosumm-removed-redirect": "[[$1]] へのリダイレクトを除しました",
        "autosumm-changed-redirect-target": "転送先を [[$1]] から [[$2]] に変更しました",
        "autosumm-new": "ページの作成:「$1」",
        "autosumm-newblank": "空白のページを作成しました",
        "htmlform-user-not-exists": "<strong>$1</strong>は存在しません。",
        "htmlform-user-not-valid": "<strong>$1</strong>は有効な利用者名ではありません。",
        "logentry-delete-delete": "$1 がページ「$3」を{{GENDER:$2|削除しました}}",
-       "logentry-delete-delete_redir": "$1 がリダイレクト「$3」を上書きにより{{GENDER:$2|削除しました}}",
+       "logentry-delete-delete_redir": "$1 がリダイレクト「$3」を上書き{{GENDER:$2|削除しました}}",
        "logentry-delete-restore": "$1 がページ「$3 ($4)」を{{GENDER:$2|復元しました}}",
        "logentry-delete-restore-nocount": "$1 がページ「$3」を{{GENDER:$2|復元しました}}",
        "restore-count-revisions": "{{PLURAL:$1|1|$1}}件の版",
index 79354d1..17c5274 100644 (file)
        "whatlinkshere": "Wa lingk ya",
        "whatlinkshere-title": "Piej wa lingk tu \"$1\"",
        "whatlinkshere-page": "Piej:",
-       "linkshere-2": "Di falarin piejdem lingk tu '''$1''':",
+       "linkshere-2": "Di falarin piejdem lingk tu '''$2''':",
        "isredirect": "riidirek piej",
        "istemplate": "chranskluujan",
        "isimage": "fail lingk",
index ae892bd..114ba8d 100644 (file)
        "whatlinkshere": "Hwa henwise hertil",
        "whatlinkshere-title": "Side som linke te $1",
        "whatlinkshere-page": "Siid:",
-       "linkshere-2": "Di följenje side henwise te '''„$1“''':",
-       "nolinkshere-2": "Ien side henwise te '''„$1“'''.",
+       "linkshere-2": "Di följenje side henwise te '''„$2“''':",
+       "nolinkshere-2": "Ien side henwise te '''„$2“'''.",
        "isredirect": "omdirigiirengssiid",
        "istemplate": "inlejreng",
        "isimage": "filhenwisneng",
index 6ee482f..9b742c9 100644 (file)
        "whatlinkshere": "Sing nggayut mréné",
        "whatlinkshere-title": "Kaca mawa pranala nggayut \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere-2": "Kaca-kaca ing ngisor iki nggayut menyang <strong>$1</strong>:",
-       "nolinkshere-2": "Ora ana kaca sing nduwé pranala menyang '''$1'''.",
-       "nolinkshere-ns-2": " Ora ana kaca sing nduwé pranala menyang '''$1''' ing bilik jeneng sing kapilih.",
+       "linkshere-2": "Kaca-kaca ing ngisor iki nggayut menyang <strong>$2</strong>:",
+       "nolinkshere-2": "Ora ana kaca sing nduwé pranala menyang '''$2'''.",
+       "nolinkshere-ns-2": " Ora ana kaca sing nduwé pranala menyang '''$2''' ing bilik jeneng sing kapilih.",
        "isredirect": "kaca lih-lihan",
        "istemplate": "tranklusi",
        "isimage": "pranala barkas",
index c33e82e..9008bc9 100644 (file)
        "whatlinkshere": "ბმული გვერდზე",
        "whatlinkshere-title": "გვერდები, რომლებიც შეიცავენ „$1“-ის ბმულებს",
        "whatlinkshere-page": "გვერდი:",
-       "linkshere-2": "მომდევნო გვერდები შეიცავენ ბმულებს '''$1'''-ზე:",
-       "nolinkshere-2": "'''$1'''-ზე ბმული არ არის.",
-       "nolinkshere-ns-2": "არჩეულ სახელთა სივრცეში არ არის გვერდები, რომლებიც მისამართდება '''$1'''.",
+       "linkshere-2": "მომდევნო გვერდები შეიცავენ ბმულებს '''$2'''-ზე:",
+       "nolinkshere-2": "'''$2'''-ზე ბმული არ არის.",
+       "nolinkshere-ns-2": "არჩეულ სახელთა სივრცეში არ არის გვერდები, რომლებიც მისამართდება '''$2'''.",
        "isredirect": "გადამისამართების გვერდი",
        "istemplate": "ჩართვა",
        "isimage": "ბმული ფაილზე",
index e29c671..2910562 100644 (file)
        "whatlinkshere": "Siltelgen betler",
        "whatlinkshere-title": "\"$1\" betine siltelgen betler",
        "whatlinkshere-page": "Bet:",
-       "linkshere-2": "To'mendegi betler mınag'an siltelgen: '''$1''':",
-       "nolinkshere-2": "'''$1''' degenge hesh bet siltemeydi.",
+       "linkshere-2": "To'mendegi betler mınag'an siltelgen: '''$2''':",
+       "nolinkshere-2": "'''$2''' degenge hesh bet siltemeydi.",
        "isredirect": "burıwshı bet",
        "istemplate": "qosıw",
        "isimage": "fayl siltewi",
index 385687b..c7a4fc1 100644 (file)
        "whatlinkshere": "Ayen i d-yettawi ɣer da",
        "whatlinkshere-title": "Isebtaren i sɛan azday ɣer « $1 »",
        "whatlinkshere-page": "Asebter :",
-       "linkshere-2": "Isebtar-agi sɛan azday ɣer '''$1''':",
-       "nolinkshere-2": "Ulac asebter i yesɛan azday ɣer '''$1'''.",
-       "nolinkshere-ns-2": "Ulac asebter i yesɛan azday ɣer '''$1''' deg yisem n taɣult i textareḍ.",
+       "linkshere-2": "Isebtar-agi sɛan azday ɣer '''$2''':",
+       "nolinkshere-2": "Ulac asebter i yesɛan azday ɣer '''$2'''.",
+       "nolinkshere-ns-2": "Ulac asebter i yesɛan azday ɣer '''$2''' deg yisem n taɣult i textareḍ.",
        "isredirect": "Asebter n usemmimeḍ",
        "istemplate": "asekcam",
        "isimage": "azday ɣer afaylu",
index 5e14d55..87c290c 100644 (file)
        "whatlinkshere": "ТехьэпӀэхэр мыбдеж",
        "whatlinkshere-title": "«$1» техьэ напэкІуэцІхэр",
        "whatlinkshere-page": "НапэкIуэцI:",
-       "linkshere-2": "Мыбым '''$1'''  тохьэ напэкӀуэцӀхэр:",
+       "linkshere-2": "Мыбым '''$2'''  тохьэ напэкӀуэцӀхэр:",
        "isredirect": "напэкIуэцI-егъэкIуэкIа",
        "istemplate": "хэгъэхьэныгъэ",
        "isimage": "сурэтым и техьэпӀэ",
index 09db309..2206085 100644 (file)
        "whatlinkshere": "Takayɩhatʋ kɩtamtʋ",
        "whatlinkshere-title": "Takayɩhatʋ ndʋ tɩtamsɩna \\ $1 \\ yɔ",
        "whatlinkshere-page": "Takayɩhayʋʋ :",
-       "linkshere-2": "Takayɩhatʋ ndʋ tɩwɛ pɩ-tɛɛ yɔ tɩwɛna kpasɩ <strong>$1<strong> yɔɔ:",
+       "linkshere-2": "Takayɩhatʋ ndʋ tɩwɛ pɩ-tɛɛ yɔ tɩwɛna kpasɩ <strong>$2<strong> yɔɔ:",
        "isredirect": "Kɩpɩsɩnaʋ takayɩhayʋʋ",
        "istemplate": "tɛɣʋ",
        "isimage": "takayaɣ yɔɔ kpayaɣ",
index 637b2ae..55aafcf 100644 (file)
        "whatlinkshere": "ھیارا کیہ کیہ لنک شینی",
        "whatlinkshere-title": "لنک شدہ صفحات \"$1\"",
        "whatlinkshere-page": " صفحہ:",
-       "linkshere-2": " '''$1''' درج ذیل صفحات لنک کوری شینی:",
-       "nolinkshere-2": "'''$1''' کیہ روابط نیکی",
+       "linkshere-2": " '''$2''' درج ذیل صفحات لنک کوری شینی:",
+       "nolinkshere-2": "'''$2''' کیہ روابط نیکی",
        "isredirect": "خور ژاغا آلدو صفحہ",
        "istemplate": "ٹرانسکلوژن",
        "isimage": "ھوٹوان لنک",
index d1a7c01..c3c7b2f 100644 (file)
        "whatlinkshere": "Çı itay rê gırê beno",
        "whatlinkshere-title": "Pelê ke be \"$1\"i bestninê pa",
        "whatlinkshere-page": "Pele:",
-       "linkshere-2": "Ni pelgi '''$1'''i asnenê:",
-       "nolinkshere-2": "Pelgê ke '''$1'''i asnenê çinê.",
+       "linkshere-2": "Ni pelgi '''$2'''i asnenê:",
+       "nolinkshere-2": "Pelgê ke '''$2'''i asnenê çinê.",
        "isredirect": "pela ciheti",
        "istemplate": "ilawekerdis",
        "isimage": "girê dosya",
index a94f33a..45d8d7a 100644 (file)
        "whatlinkshere": "سىلتەلگەن بەتتەر",
        "whatlinkshere-title": "$1 دەگەنگە سىلتەلگەن بەتتەر",
        "whatlinkshere-page": "بەت:",
-       "linkshere-2": "'''$1''' دەگەنگە مىنا بەتتەر سىلتەيدى:",
-       "nolinkshere-2": "'''$1''' دەگەنگە ەش بەت سىلتەمەيدى.",
-       "nolinkshere-ns-2": "تاڭدالعان ەسىم اياسىندا '''$1''' دەگەنگە ەشقانداي بەت سىلتەمەيدى.",
+       "linkshere-2": "'''$2''' دەگەنگە مىنا بەتتەر سىلتەيدى:",
+       "nolinkshere-2": "'''$2''' دەگەنگە ەش بەت سىلتەمەيدى.",
+       "nolinkshere-ns-2": "تاڭدالعان ەسىم اياسىندا '''$2''' دەگەنگە ەشقانداي بەت سىلتەمەيدى.",
        "isredirect": "ايداتۋ بەتى",
        "istemplate": "كىرىكبەت",
        "isimage": "سۋرەت سىلتەمەسى",
index 28d497c..bca3cfc 100644 (file)
        "whatlinkshere": "Мұнда сілтейтін беттер",
        "whatlinkshere-title": "$1 дегенге сілтейтін беттер",
        "whatlinkshere-page": "Бет:",
-       "linkshere-2": "'''$1''' дегенге мына беттер сілтейді:",
-       "nolinkshere-2": "'''$1''' дегенге еш бет сілтемейді.",
-       "nolinkshere-ns-2": "Таңдалған есім кеңістігінде '''$1''' дегенге ешқандай бет сілтемейді.",
+       "linkshere-2": "'''$2''' дегенге мына беттер сілтейді:",
+       "nolinkshere-2": "'''$2''' дегенге еш бет сілтемейді.",
+       "nolinkshere-ns-2": "Таңдалған есім кеңістігінде '''$2''' дегенге ешқандай бет сілтемейді.",
        "isredirect": "бағыттау беті",
        "istemplate": "кіріcтірілген",
        "isimage": "файл сілтемесі",
index 342339a..60dbcb9 100644 (file)
        "whatlinkshere": "Mında silteýtin better",
        "whatlinkshere-title": "$1 degenge silteýtin better",
        "whatlinkshere-page": "Bet:",
-       "linkshere-2": "'''$1''' degenge mına better silteýdi:",
-       "nolinkshere-2": "'''$1''' degenge eş bet siltemeýdi.",
-       "nolinkshere-ns-2": "Tañdalğan esim ayasında '''$1''' degenge eşqandaý bet siltemeýdi.",
+       "linkshere-2": "'''$2''' degenge mına better silteýdi:",
+       "nolinkshere-2": "'''$2''' degenge eş bet siltemeýdi.",
+       "nolinkshere-ns-2": "Tañdalğan esim ayasında '''$2''' degenge eşqandaý bet siltemeýdi.",
        "isredirect": "aýdatw beti",
        "istemplate": "kirikbet",
        "isimage": "swret siltemesi",
index 11c13cc..b3a81d0 100644 (file)
        "botpasswords-existing": "ពាក្យសម្ងាត់រូបយន្តមានហើយ",
        "botpasswords-createnew": "បង្កើតពាក្យសម្ងាត់រូបយន្តថ្មី",
        "botpasswords-editexisting": "កែប្រែពាក្យសម្ងាត់រូបយន្តមានហើយ",
+       "botpasswords-label-needsreset": "(ពាក្យសម្ងាត់ចាំបាច់ត្រូវកំណត់ឡើងវិញ)",
        "botpasswords-label-appid": "ឈ្មោះរូបយន្ត៖",
        "botpasswords-label-create": "បង្កើត",
        "botpasswords-label-update": "បន្ទាន់សម័យ",
        "whatlinkshere": "អ្វី​ដែលភ្ជាប់មកទីនេះ",
        "whatlinkshere-title": "ទំព័រនានាដែល​តភ្ជាប់​ទៅ \"$1\"",
        "whatlinkshere-page": "ទំព័រ៖",
-       "linkshere-2": "ទំព័រដូចតទៅ​នេះតភ្ជាប់មក '''$1''' ៖",
-       "nolinkshere-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$1''' ទេ។",
-       "nolinkshere-ns-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$1''' ក្នុងប្រភេទដែលបានជ្រើសរើស។",
+       "linkshere-2": "ទំព័រដូចតទៅ​នេះតភ្ជាប់មក '''$2''' ៖",
+       "nolinkshere-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$2''' ទេ។",
+       "nolinkshere-ns-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$2''' ក្នុងប្រភេទដែលបានជ្រើសរើស។",
        "isredirect": "ទំព័របញ្ជូនបន្ត",
        "istemplate": "ការដាក់បញ្ចូល",
        "isimage": "តំណភ្ជាប់ឯកសារ",
index 6017c32..e6fdefe 100644 (file)
        "whatlinkshere": "ಇಲ್ಲಿಗೆ ಯಾವ ಸಂಪರ್ಕ ಕೂಡುತ್ತದೆ",
        "whatlinkshere-title": "\"$1\" ಪುಟಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳು",
        "whatlinkshere-page": "ಪುಟ:",
-       "linkshere-2": "'''$1'''ಗೆ ಈ ಪುಟಗಳು ಸಂಪರ್ಕ ಹೊಂದಿವೆ:",
-       "nolinkshere-2": "'''$1''' ಗೆ ಯಾವ ಪುಟಗಳೂ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
-       "nolinkshere-ns-2": "ಆಯ್ಕೆ ಮಾಡಿದ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ '''$1''' ಅಲ್ಲಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
+       "linkshere-2": "'''$2'''ಗೆ ಈ ಪುಟಗಳು ಸಂಪರ್ಕ ಹೊಂದಿವೆ:",
+       "nolinkshere-2": "'''$2''' ಗೆ ಯಾವ ಪುಟಗಳೂ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
+       "nolinkshere-ns-2": "ಆಯ್ಕೆ ಮಾಡಿದ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ '''$2''' ಅಲ್ಲಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
        "isredirect": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ",
        "istemplate": "ಸೇರ್ಪಡೆ",
        "isimage": "ಚಿತ್ರಕ್ಕೆ ಕೊಂಡಿ",
index ab3733a..14d6626 100644 (file)
        "createaccountmail-help": "비밀번호를 기억하지 않고도 다른 사용자를 위한 계정을 만들 수 있습니다.",
        "createacct-realname": "실명 (선택 사항)",
        "createacct-reason": "이유",
-       "createacct-reason-ph": "왜 다른 계정을 만들어야 합니까",
+       "createacct-reason-ph": "ì\99\9c ë\8b¤ë¥¸ ê³\84ì \95ì\9d\84 ë\98\90 ë§\8cë\93¤ì\96´ì\95¼ í\95©ë\8b\88ê¹\8c",
        "createacct-reason-help": "계정 생성 로그에 표시되는 메시지",
        "createacct-submit": "계정 만들기",
        "createacct-another-submit": "계정 만들기",
        "dellogpage": "삭제 기록",
        "dellogpagetext": "아래의 목록은 최근에 삭제된 문서입니다.",
        "deletionlog": "삭제 기록",
+       "log-name-create": "문서 만들기 기록",
+       "log-description-create": "아래의 목록은 최근에 생성된 문서입니다.",
+       "logentry-create-create": "$1님이 $3 문서를 {{GENDER:$2|만들었습니다}}",
        "reverted": "이전 판으로 되돌렸습니다",
        "deletecomment": "이유:",
        "deleteotherreason": "다른 이유/추가적인 이유:",
        "whatlinkshere": "여기를 가리키는 문서",
        "whatlinkshere-title": "\"$1\" 문서를 가리키는 문서 목록",
        "whatlinkshere-page": "문서:",
-       "linkshere-2": "다음 문서가 '''$1''' 문서를 가리키고 있습니다:",
-       "nolinkshere-2": "'''$1''' 문서를 가리키는 문서가 없습니다.",
-       "nolinkshere-ns-2": "선택한 이름공간에는 '''$1''' 문서를 가리키는 문서가 없습니다.",
+       "linkshere-2": "다음 문서가 <strong>$2</strong> 문서를 가리키고 있습니다:",
+       "nolinkshere-2": "<strong>$2</strong> 문서를 가리키는 문서가 없습니다.",
+       "nolinkshere-ns-2": "선택한 이름공간에는 <strong>$2</strong> 문서를 가리키는 문서가 없습니다.",
        "isredirect": "넘겨주기 문서",
        "istemplate": "끼워넣기",
        "isimage": "연결된 파일",
index 5cc99c4..d50f80a 100644 (file)
        "whatlinkshere": "Бетге джибериуле",
        "whatlinkshere-title": "«$1» бетге джиберген бетле",
        "whatlinkshere-page": "Бет:",
-       "linkshere-2": "'''$1''' битге джиберген бетле:",
-       "nolinkshere-2": "'''$1'' бетге башха бетле джибермейдиле.",
-       "nolinkshere-ns-2": "Сайланнган атла аламда '''$1''' бетге джиберген бет джокъду.",
+       "linkshere-2": "'''$2''' битге джиберген бетле:",
+       "nolinkshere-2": "'''$2'' бетге башха бетле джибермейдиле.",
+       "nolinkshere-ns-2": "Сайланнган атла аламда '''$2''' бетге джиберген бет джокъду.",
        "isredirect": "джибериу бет",
        "istemplate": "къошуу",
        "isimage": "файлгъа джибериу",
index b00dfbe..2b0b1ab 100644 (file)
        "whatlinkshere": "Linkit tänne",
        "whatlinkshere-title": "Šivut, kumpaset viitatah šivulla \"$1\"",
        "whatlinkshere-page": "Šivu:",
-       "linkshere-2": "Šeuruavilta šivuilta on linkki šivulla <strong>$1</strong>:",
+       "linkshere-2": "Šeuruavilta šivuilta on linkki šivulla <strong>$2</strong>:",
        "isredirect": "ohjauššivu",
        "istemplate": "šisällytetty",
        "isimage": "failin linkki",
index 52ad3d1..6d6a37e 100644 (file)
        "whatlinkshere": "Wat noh heh link",
        "whatlinkshere-title": "Sigge, woh Lengks op „$1“ dren sen",
        "whatlinkshere-page": "Sigg:",
-       "linkshere-2": "Dat sin de Sigge, di op <strong>„$1“</strong> lengke donn:",
-       "nolinkshere-2": "Kein Sigg link noh <strong>„$1“</strong>.",
-       "nolinkshere-ns-2": "Nix link op <strong>„$1“</strong> en dämm Appachtemang.",
+       "linkshere-2": "Dat sin de Sigge, di op <strong>„$2“</strong> lengke donn:",
+       "nolinkshere-2": "Kein Sigg link noh <strong>„$2“</strong>.",
+       "nolinkshere-ns-2": "Nix link op <strong>„$2“</strong> en dämm Appachtemang.",
        "isredirect": "Ömleidongssigg",
        "istemplate": "weed enjeföch",
        "isimage": "weed aanjezeisch",
index 68ded3d..173879a 100644 (file)
        "whatlinkshere": "Girêdanên li ser vê rûpelê",
        "whatlinkshere-title": "Rûpelên ku yê berve \"$1\" tên",
        "whatlinkshere-page": "Rûpel:",
-       "linkshere-2": "Ev rûpel tên ser vê rûpelê '''$1''':",
-       "nolinkshere-2": "Ne ji rûpelekê lînk tên ser '''$1'''.",
-       "nolinkshere-ns-2": "Ne lînkek berve '''$1''' di vê namespace'a da tê.",
+       "linkshere-2": "Ev rûpel tên ser vê rûpelê '''$2''':",
+       "nolinkshere-2": "Ne ji rûpelekê lînk tên ser '''$2'''.",
+       "nolinkshere-ns-2": "Ne lînkek berve '''$2''' di vê namespace'a da tê.",
        "isredirect": "rûpelê beralî bike",
        "istemplate": "tê bikaranîn",
        "isimage": "girêdana wêneyî",
index 80dd77c..3bb310e 100644 (file)
        "whatlinkshere": "Мунда байланылгъан",
        "whatlinkshere-title": "\"$1\" бетге байлангъан сагьифалар",
        "whatlinkshere-page": "Сагьифа:",
-       "linkshere-2": "Гелеген сагьифалар бугъар байлавлу <strong>$1</strong>:",
-       "nolinkshere-2": "Бугъар байлавлу сагьифалар ёкъ <strong>$1</strong>:",
+       "linkshere-2": "Гелеген сагьифалар бугъар байлавлу <strong>$2</strong>:",
+       "nolinkshere-2": "Бугъар байлавлу сагьифалар ёкъ <strong>$2</strong>:",
        "isredirect": "ёллав-сагьифа",
        "istemplate": "къошув",
        "isimage": "сапламлы байланыв",
index b767225..2183293 100644 (file)
        "whatlinkshere": "Pyth a gevren dhe omma",
        "whatlinkshere-title": "Folennow ow kevrenna dhe \"$1\"",
        "whatlinkshere-page": "Folen:",
-       "linkshere-2": "Yma an folennow a syw ow kevrenna dhe '''$1''':",
-       "nolinkshere-2": "Nyns eus folen vyth ow kevrenna dhe '''$1'''.",
+       "linkshere-2": "Yma an folennow a syw ow kevrenna dhe '''$2''':",
+       "nolinkshere-2": "Nyns eus folen vyth ow kevrenna dhe '''$2'''.",
        "isredirect": "folen daskedyans",
        "istemplate": "treuskludyans",
        "isimage": "kevren an restren",
index bcedaee..b4df142 100644 (file)
        "whatlinkshere": "Шилтемелерди бул жакка",
        "whatlinkshere-title": "\"$1\" -га шилтеме берген барактар",
        "whatlinkshere-page": "Барак:",
-       "linkshere-2": "'''$1''' барагына шилтеме берген барактар:",
-       "nolinkshere-2": "'''$1''' барагына шилтеме берген барак жок.",
+       "linkshere-2": "'''$2''' барагына шилтеме берген барактар:",
+       "nolinkshere-2": "'''$2''' барагына шилтеме берген барак жок.",
        "isredirect": "багыттама барак",
        "istemplate": "бириктирүү",
        "isimage": "файл шилтемеси",
index 616258d..1f6c9ad 100644 (file)
        "whatlinkshere": "Nexus ad paginam",
        "whatlinkshere-title": "Paginae quae ad \"$1\" nectuntur",
        "whatlinkshere-page": "Pagina:",
-       "linkshere-2": "Paginae sequentes ad '''$1''' nectunt:",
-       "nolinkshere-2": "Nullae paginae ad '''$1''' nectunt.",
-       "nolinkshere-ns-2": "Nullae paginae spatii nominalis selecti ad '''$1''' nectunt.",
+       "linkshere-2": "Paginae sequentes ad '''$2''' nectunt:",
+       "nolinkshere-2": "Nullae paginae ad '''$2''' nectunt.",
+       "nolinkshere-ns-2": "Nullae paginae spatii nominalis selecti ad '''$2''' nectunt.",
        "isredirect": "pagina redirectionis",
        "istemplate": "inclusio",
        "isimage": "nexus fasciculi",
index 9e035e9..a51c25c 100644 (file)
        "whatlinkshere": "Hojas atadas",
        "whatlinkshere-title": "Hojas que dan link a \"$1\"",
        "whatlinkshere-page": "Hoja:",
-       "linkshere-2": "Las hojas venideras dan link a '''$1''':",
-       "nolinkshere-2": "Dinguna ója tiene atamientos kon '''$1'''",
+       "linkshere-2": "Las hojas venideras dan link a '''$2''':",
+       "nolinkshere-2": "Dinguna ója tiene atamientos kon '''$2'''",
        "isredirect": "Hoja redirigida",
        "istemplate": "inclusión",
        "isimage": "atamiento de la dosya",
index 68d5273..f4cf6e6 100644 (file)
        "whatlinkshere": "Linken op dës Säit",
        "whatlinkshere-title": "Säiten, déi mat \"$1\" verlinkt sinn",
        "whatlinkshere-page": "Säit:",
-       "linkshere-2": "Déi folgend Säite linken op '''$1''':",
-       "nolinkshere-2": "Keng Säit ass mat '''$1''' verlinkt.",
-       "nolinkshere-ns-2": "Keng Säite linken op '''$1''' am gewielten Nummraum.",
+       "linkshere-2": "Déi folgend Säite linken op <strong>$2</strong>:",
+       "nolinkshere-2": "Keng Säit ass mat <strong>$2</strong> verlinkt.",
+       "nolinkshere-ns-2": "Keng Säite linken op <strong>$2</strong> am gewielten Nummraum.",
        "isredirect": "Viruleedung",
        "istemplate": "an dëser Säit dran",
        "isimage": "Link op de Fichier",
index cb38f8a..d93f224 100644 (file)
        "whatlinkshere": "Иниз вуч элячIзава",
        "whatlinkshere-title": "\"$1\" - даз элячlзавай ччинар",
        "whatlinkshere-page": "Ччин:",
-       "linkshere-2": "Гуьгъуьнин ччинар '''$1''': - даз  элячlзава",
-       "nolinkshere-2": "'''$1''' ччиниз са ччинни элячIзавач.",
+       "linkshere-2": "Гуьгъуьнин ччинар '''$2''': - даз  элячlзава",
+       "nolinkshere-2": "'''$2''' ччиниз са ччинни элячIзавач.",
        "isredirect": "Рахкъурунин ччин",
        "istemplate": "кутун",
        "isimage": "Файлдин элячlун",
index ec4d570..6ad5301 100644 (file)
        "listduplicatedfiles": "Lista de fixes jemelo",
        "listduplicatedfiles-summary": "Esta es un lista de fixes de cual sua revisa la plu resente es identica con la revisa la plu resente de alga otra fix. Sola fixes local es considerada.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] ave [[$3|{{PLURAL:$2|un jemelo|$2 jemelos}}]].",
-       "unusedtemplates": "modeles nonusada",
+       "unusedtemplates": "Modeles nonusada",
        "unusedtemplatestext": "Esta paje lista tota pajes en la spasio de nom {{ns:template}} cual no es incluida en un otra paje.\nNo oblida esplora otra lias a la stensiles ante sutrae los.",
        "unusedtemplateswlh": "otra lias",
        "randompage": "Paje acaso",
        "whatlinkshere": "Lias a esta paje",
        "whatlinkshere-title": "Pajes cual lia a \"$1\"",
        "whatlinkshere-page": "Paje:",
-       "linkshere-2": "La pajes seguente lia a <strong>$1</strong>:",
-       "nolinkshere-2": "No pajes lia a <strong>$1</strong>.",
-       "nolinkshere-ns-2": "No pajes lia a <strong>$1</strong> en la spasio de nom elejeda.",
+       "linkshere-2": "La pajes seguente lia a <strong>$2</strong>:",
+       "nolinkshere-2": "No pajes lia a <strong>$2</strong>.",
+       "nolinkshere-ns-2": "No pajes lia a <strong>$2</strong> en la spasio de nom elejeda.",
        "isredirect": "paje redirijente",
        "istemplate": "transclui",
        "isimage": "lia de fix",
index d6f438e..2b33e9e 100644 (file)
        "whatlinkshere": "Empapula ezikuggusa ku luno",
        "whatlinkshere-title": "Empapula eziriko enyunzi ezigguka ku $1",
        "whatlinkshere-page": "Lupapula:",
-       "linkshere-2": "Zino z'empapula eziriko enyunzi ezigguka ku '''$1''':",
-       "nolinkshere-2": "Tewali mpapula eziriko enyunzi ezigguka ku '''$1'''.",
+       "linkshere-2": "Zino z'empapula eziriko enyunzi ezigguka ku '''$2''':",
+       "nolinkshere-2": "Tewali mpapula eziriko enyunzi ezigguka ku '''$2'''.",
        "isredirect": "lupapula olukutwalabutwazi ku lunnaalwo",
        "istemplate": "kitundu ekyeyazike",
        "isimage": "lukozesa ekifaananyi kino",
index a86d842..ccd67ad 100644 (file)
        "whatlinkshere": "Links nao dees pagina",
        "whatlinkshere-title": "Pagina's die verwieze nao \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere-2": "De volgende pagina's verwieze nao '''$1''':",
-       "nolinkshere-2": "D'r zint gein pazjena's mit links nao '''$1''' haer.",
-       "nolinkshere-ns-2": "Geine inkele pazjena link nao '''$1''' in de gekaoze naamruumde.",
+       "linkshere-2": "De volgende pagina's verwieze nao '''$2''':",
+       "nolinkshere-2": "D'r zint gein pazjena's mit links nao '''$2''' haer.",
+       "nolinkshere-ns-2": "Geine inkele pazjena link nao '''$2''' in de gekaoze naamruumde.",
        "isredirect": "redirect pagina",
        "istemplate": "ingevoog es sjabloon",
        "isimage": "bestandjslink",
index fea67cc..6146c01 100644 (file)
        "whatlinkshere": "Cöse se colega chì",
        "whatlinkshere-title": "Pàgine c'apontàn a $1",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere-2": "E pàgine segoenti apontan a '''$1''':",
-       "nolinkshere-2": "Nisciùnn-a pàgina a se collega con '''$1'''.",
-       "nolinkshere-ns-2": "Pagine ch'apontan a '''$1''' into namespace seleçionou no ghe n'è.",
+       "linkshere-2": "E pàgine segoenti apontan a '''$2''':",
+       "nolinkshere-2": "Nisciùnn-a pàgina a se collega con '''$2'''.",
+       "nolinkshere-ns-2": "Pagine ch'apontan a '''$2''' into namespace seleçionou no ghe n'è.",
        "isredirect": "Paggina de rindirissamento",
        "istemplate": "Incluxon",
        "isimage": "Colegaménto a-o file",
index 4f060a4..9e49951 100644 (file)
        "whatlinkshere": "پیوندەل وە ئێ وەڵگە",
        "whatlinkshere-title": "وۀلگۀلئ گإ  وۀ «$1» پیوۀند دِرِن",
        "whatlinkshere-page": ":وةڵگە(پەڕە)",
-       "linkshere-2": "The following pages link to <strong>$1</strong>:",
-       "nolinkshere-2": "هیچ صفحه‌ای به '''$1''' پیوند ندارد.",
-       "nolinkshere-ns-2": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''$1''' پیوند ندارد.",
+       "linkshere-2": "The following pages link to <strong>$2</strong>:",
+       "nolinkshere-2": "هیچ صفحه‌ای به '''$2''' پیوند ندارد.",
+       "nolinkshere-ns-2": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''$2''' پیوند ندارد.",
        "isredirect": "وەڵگە ڕێ گؤەڕن(تغییرمسییر)",
        "istemplate": " تراگنجانش‌ها",
        "isimage": "پیوند پرونده",
index a4fb8c9..a3ec274 100644 (file)
        "whatlinkshere": "Pagin che se culeghen chì",
        "whatlinkshere-title": "Paginn che menen a \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere-2": "I paginn chì de sota gh'hann di ligam che porten a '''$1''':",
+       "linkshere-2": "I paginn chì de sota gh'hann di ligam che porten a '''$2''':",
        "isredirect": "redirezión",
        "istemplate": "inclüsión",
        "isimage": "ligam a un archivi",
index 84fcc2c..ade850d 100644 (file)
        "sp-contributions-submit": "ຊອກຫາ",
        "whatlinkshere": "ໜ້າທີ່ເຊື່ອມຕໍ່ມາໜ້ານີ້",
        "whatlinkshere-title": "ໜ້າທີ່ເຊື່ອມຕໍ່ຫາ $1",
-       "linkshere-2": "ບັນດາໜ້າຕໍ່ໄປ ລິ້ງຄ໌ ຫາ ''$1''':",
-       "nolinkshere-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$1'''.",
-       "nolinkshere-ns-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$1''' ໃນ ຂອບເຂດຊື່ ທີ່ ທ່ານເລືອກ.",
+       "linkshere-2": "ບັນດາໜ້າຕໍ່ໄປ ລິ້ງຄ໌ ຫາ ''$2''':",
+       "nolinkshere-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$2'''.",
+       "nolinkshere-ns-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$2''' ໃນ ຂອບເຂດຊື່ ທີ່ ທ່ານເລືອກ.",
        "isredirect": "ໜ້າໂອນ",
        "istemplate": "ລວມ",
        "whatlinkshere-prev": "{{PLURAL:$1|ກ່ອນ|ກ່ອນ $1}}",
index a8146a8..2846b07 100644 (file)
        "whatlinkshere": "Ling'ki di bye petulo",
        "whatlinkshere-title": "Petulo bye ling'ki di $1",
        "whatlinkshere-page": "Petulo:",
-       "linkshere-2": "Bye petulo ling'ki di '''$1''':",
-       "nolinkshere-2": "0 petulo ling'ki di '''$1'''.",
-       "nolinkshere-ns-2": "0 petulo ling'ki di '''$1''' bye sa di bye fatukile efro.",
+       "linkshere-2": "Bye petulo ling'ki di '''$2''':",
+       "nolinkshere-2": "0 petulo ling'ki di '''$2'''.",
+       "nolinkshere-ns-2": "0 petulo ling'ki di '''$2''' bye sa di bye fatukile efro.",
        "isredirect": "petulo abezi",
        "istemplate": "yang'idole",
        "whatlinkshere-prev": "{{PLURAL:$1|kona|kona $1}}",
index e822bba..70217c9 100644 (file)
        "whatlinkshere": "کوم هوم پیۋندیا هان ایچاٛ",
        "whatlinkshere-title": "بلگه ای که د $1 هوم پیوند بیه",
        "whatlinkshere-page": "بلگٱ",
-       "linkshere-2": "بلگیا نهایی د '''$1''' هوم پیوند بیه",
-       "nolinkshere-2": "هیژ بگله ای د  '''$1''' هوم پیوند نبیه",
-       "nolinkshere-ns-2": "هیچ بلگه ای د نومجا انتخاو بیه وه'''$1''' هوم پیوند ناره.",
+       "linkshere-2": "بلگیا نهایی د '''$2''' هوم پیوند بیه",
+       "nolinkshere-2": "هیژ بگله ای د  '''$2''' هوم پیوند نبیه",
+       "nolinkshere-ns-2": "هیچ بلگه ای د نومجا انتخاو بیه وه'''$2''' هوم پیوند ناره.",
        "isredirect": "بلگه دوباره ورگشتن",
        "istemplate": "نشونی دئن",
        "isimage": "جانیا هوم پیوند",
index 4387feb..3d7ea36 100644 (file)
        "whatlinkshere": "Susiję puslapiai",
        "whatlinkshere-title": "Puslapiai, kurie nurodo į „$1“",
        "whatlinkshere-page": "Puslapis:",
-       "linkshere-2": "Šie puslapiai rodo į '''$1''':",
-       "nolinkshere-2": "Į '''$1''' nuorodų nėra.",
-       "nolinkshere-ns-2": "Nurodytoje vardų srityje nei vienas puslapis nenurodo į '''$1'''.",
+       "linkshere-2": "Šie puslapiai rodo į '''$2''':",
+       "nolinkshere-2": "Į '''$2''' nuorodų nėra.",
+       "nolinkshere-ns-2": "Nurodytoje vardų srityje nei vienas puslapis nenurodo į '''$2'''.",
        "isredirect": "nukreipiamasis puslapis",
        "istemplate": "įterpimas",
        "isimage": "rinkmenos nuoroda",
index 97c76b0..9585717 100644 (file)
        "whatlinkshere": "Hemi zawmpuite",
        "whatlinkshere-title": "$1-a thlunzawm phêkte",
        "whatlinkshere-page": "Phêk:",
-       "linkshere-2": "A hnuaia phêkte hian '''$1''' hi an thlunzawm:",
-       "nolinkshere-2": "'''$1'''-a zawm phek pakhat mah a awm lo.",
+       "linkshere-2": "A hnuaia phêkte hian '''$2''' hi an thlunzawm:",
+       "nolinkshere-2": "'''$2'''-a zawm phek pakhat mah a awm lo.",
        "isredirect": "Hruailuhna phêk",
        "istemplate": "ziahhnan",
        "isimage": "taksa thlunzawmna",
index a474cd4..3db69a5 100644 (file)
        "whatlinkshere": "لینکل ئی بألگە",
        "whatlinkshere-title": "بألگل کە لینک دائنە ڤە \"$1\"",
        "whatlinkshere-page": "بألگە:",
-       "linkshere-2": "لینک ھ بألگل دوٙمین الذیکر ڤە '''$1''':",
+       "linkshere-2": "لینک ھ بألگل دوٙمین الذیکر ڤە '''$2''':",
        "isredirect": "بألگە تأغییر مأسیر",
        "istemplate": "ئیستیفادھ ڤابیدھ داخل بألگە",
        "isimage": "لینک ھ فایل",
index 2edaca7..f244589 100644 (file)
        "botpasswords-existing": "Esošās botu paroles",
        "botpasswords-createnew": "Izveidot jaunu bota paroli",
        "botpasswords-editexisting": "Rediģētu esošu bota paroli",
+       "botpasswords-label-needsreset": "(paroli nepieciešams atiestatīt)",
        "botpasswords-label-appid": "Bota nosaukums:",
        "botpasswords-label-create": "Izveidot",
        "botpasswords-label-update": "Atjaunināt",
        "whatlinkshere": "Norādes uz šo rakstu",
        "whatlinkshere-title": "Lapas, kurās ir saites uz lapu \"$1\"",
        "whatlinkshere-page": "Lapa:",
-       "linkshere-2": "Šajās lapās ir norādes uz lapu '''$1''':",
-       "nolinkshere-2": "Nevienā lapā nav norāžu uz lapu '''$1'''.",
-       "nolinkshere-ns-2": "Neviena lapa nenorāda uz '''$1''' izvēlētajā vārdtelpā.",
+       "linkshere-2": "Šajās lapās ir norādes uz lapu '''$2''':",
+       "nolinkshere-2": "Nevienā lapā nav norāžu uz lapu '''$2'''.",
+       "nolinkshere-ns-2": "Neviena lapa nenorāda uz '''$2''' izvēlētajā vārdtelpā.",
        "isredirect": "pāradresācijas lapa",
        "istemplate": "izsaukts",
        "isimage": "faila saite",
index 6f9503b..883bee0 100644 (file)
        "whatlinkshere": "取佐",
        "whatlinkshere-title": "「$1」取佐",
        "whatlinkshere-page": "題",
-       "linkshere-2": "取佐'''$1'''如下:",
-       "nolinkshere-2": "無頁取佐'''$1'''。",
-       "nolinkshere-ns-2": "名冊內無頁取佐'''$1'''。",
+       "linkshere-2": "取佐'''$2'''如下:",
+       "nolinkshere-2": "無頁取佐'''$2'''。",
+       "nolinkshere-ns-2": "名冊內無頁取佐'''$2'''。",
        "isredirect": "渡",
        "istemplate": "含",
        "isimage": "檔佐",
index 381e60a..773765e 100644 (file)
        "whatlinkshere": "Butʼkʼaşa na ixvenu kʼontʼaktʼepe",
        "whatlinkshere-title": "\"$1\" maddeşa kʼontʼaktʼi na ikips butʼkʼape",
        "whatlinkshere-page": "Butʼkʼa:",
-       "linkshere-2": "'''$1''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
+       "linkshere-2": "'''$2''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
        "isredirect": "redirektʼiş butʼkʼa",
        "istemplate": "okʼatu",
        "isimage": "dosyaşi kʼontʼaktʼi",
index 63b2084..a26b4cb 100644 (file)
        "whatlinkshere": "एतय कोन लिङ्क अछि",
        "whatlinkshere-title": "\"$1\" सँ सम्बन्धित पन्नासभ",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere-2": "ई सभ पन्ना सम्बन्धित अछि '''$1''':",
-       "nolinkshere-2": "'''$1''' पर कोनो पन्नाक लागि नै अछि।",
-       "nolinkshere-ns-2": "कोनो पन्नाक लागि '''$1''' चुनल नामगाममे नै अछि।",
+       "linkshere-2": "ई सभ पन्ना सम्बन्धित अछि '''$2''':",
+       "nolinkshere-2": "'''$2''' पर कोनो पन्नाक लागि नै अछि।",
+       "nolinkshere-ns-2": "कोनो पन्नाक लागि '''$2''' चुनल नामगाममे नै अछि।",
        "isredirect": "पुनर्निर्देशन पृष्ठ",
        "istemplate": "परागत",
        "isimage": "फाइल लिङ्क",
index c5b6f61..c7bc782 100644 (file)
        "whatlinkshere": "Pranala Kaca Kiye",
        "whatlinkshere-title": "Kaca-kaca sing duwe pranala maring \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere-2": "Kaca-kaca kiye duwe pranala maring '''$1''':",
-       "nolinkshere-2": "Ora ana kaca sing nduwé pranala maring '''$1'''.",
+       "linkshere-2": "Kaca-kaca kiye duwe pranala maring '''$2''':",
+       "nolinkshere-2": "Ora ana kaca sing nduwé pranala maring '''$2'''.",
        "isredirect": "kaca pangalihan",
        "istemplate": "karo cithakan",
        "isimage": "pranala berkas",
index e236da3..95e757c 100644 (file)
        "whatlinkshere": "Сюлмафкст тяза",
        "whatlinkshere-title": "Лопат конат сюлмафт \"$1\" мархта",
        "whatlinkshere-page": "Лопа:",
-       "linkshere-2": "Ся лопатне сюлмафт '''$1''' мархта:",
-       "nolinkshere-2": "Лопат, конат сюлмафт '''$1''' мархта ашет.",
-       "nolinkshere-ns-2": "Аш лопат сюлмафт '''$1''' мархта  кочкаф лемботмоста.",
+       "linkshere-2": "Ся лопатне сюлмафт '''$2''' мархта:",
+       "nolinkshere-2": "Лопат, конат сюлмафт '''$2''' мархта ашет.",
+       "nolinkshere-ns-2": "Аш лопат сюлмафт '''$2''' мархта  кочкаф лемботмоста.",
        "isredirect": "умборондафтф лопа",
        "istemplate": "сувафтома",
        "isimage": "↓архтофксонь сюлмафкссь",
index 0467390..4bb2a06 100644 (file)
        "whatlinkshere": "Pejy mirohy eto",
        "whatlinkshere-title": "Pejy mirohy any amin'i « $1 »",
        "whatlinkshere-page": "Pejy :",
-       "linkshere-2": "Ireo pejy ireo dia manana rohy mankany amin'i '''$1'''",
-       "nolinkshere-2": "Tsy nahitana pejy mirohy any amin'i '''$1'''.",
-       "nolinkshere-ns-2": "Tsy nahitana pejy mirohy any amin'i $1 ao amin'ny anaran-tsehatra nofidiana.",
+       "linkshere-2": "Ireo pejy ireo dia manana rohy mankany amin'i '''$2'''",
+       "nolinkshere-2": "Tsy nahitana pejy mirohy any amin'i '''$2'''.",
+       "nolinkshere-ns-2": "Tsy nahitana pejy mirohy any amin'i $2 ao amin'ny anaran-tsehatra nofidiana.",
        "isredirect": "pejy fihodinana",
        "istemplate": "tsofo-pejy",
        "isimage": "rohy mankany amin'ilay rakitra",
index c9c2dc7..a4aa676 100644 (file)
        "whatlinkshere": "Тышке кондышо кылвер-влак",
        "whatlinkshere-title": "\"$1\" дене лаштык-влак кылым палемдат",
        "whatlinkshere-page": "Лаштык:",
-       "linkshere-2": "'''$1''' лаштык дене кылдалтше лаштык-влак:",
-       "nolinkshere-2": "'''$1''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
-       "nolinkshere-ns-2": "Тыгай лӱм-влакын кумдыкышто '''$1''' лаштык дене нимогай лаштык-влак огыт кылдалт.",
+       "linkshere-2": "'''$2''' лаштык дене кылдалтше лаштык-влак:",
+       "nolinkshere-2": "'''$2''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
+       "nolinkshere-ns-2": "Тыгай лӱм-влакын кумдыкышто '''$2''' лаштык дене нимогай лаштык-влак огыт кылдалт.",
        "isredirect": "вес вере колтышо лаштык",
        "istemplate": "пуртымаш",
        "isimage": "файлыш кылвер",
index 81c9e84..e5234e6 100644 (file)
        "whatlinkshere": "Pautan baliak",
        "whatlinkshere-title": "Laman nan takaik ka \"$1\"",
        "whatlinkshere-page": "Laman:",
-       "linkshere-2": "Laman-laman ko bakaik ka '''$1''':",
-       "nolinkshere-2": "Indak ado laman nan punyo tautan ka '''$1'''.",
-       "nolinkshere-ns-2": "Indak ado pautan laman ka '''$1''' pado ruang namo nan dipiliah.",
+       "linkshere-2": "Laman-laman ko bakaik ka '''$2''':",
+       "nolinkshere-2": "Indak ado laman nan punyo tautan ka '''$2'''.",
+       "nolinkshere-ns-2": "Indak ado pautan laman ka '''$2''' pado ruang namo nan dipiliah.",
        "isredirect": "laman pangaliahan",
        "istemplate": "transklusi",
        "isimage": "pautan berkas",
index b55fb55..dffb09b 100644 (file)
        "dellogpage": "Дневник на бришења",
        "dellogpagetext": "Подолу е наведен список на најновите бришења.",
        "deletionlog": "дневник на бришењата",
+       "log-name-create": "Дневник на создавање страници",
+       "log-description-create": "Подолу е наведен список на најновите создавања.",
+       "logentry-create-create": "$1 {{GENDER:$2|ја создаде}} страница $3",
        "reverted": "Вратено на претходната преработка",
        "deletecomment": "Причина:",
        "deleteotherreason": "Друга/дополнителна причина:",
        "whatlinkshere": "Што води овде",
        "whatlinkshere-title": "Страници со врски што водат до „$1“",
        "whatlinkshere-page": "Страница:",
-       "linkshere-2": "Следните страници водат кон „'''$1'''“:",
-       "nolinkshere-2": "Нема страници што водат кон '''$1'''.",
-       "nolinkshere-ns-2": "Нема страници што водат кон '''$1''' во избраниот именски простор.",
+       "linkshere-2": "Следните страници водат кон <strong>$2</strong>:",
+       "nolinkshere-2": "Нема страници што водат кон <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Нема страници што водат кон <strong>$2</strong> во избраниот именски простор.",
        "isredirect": "пренасочувачка страница",
        "istemplate": "превметнување",
        "isimage": "врска до податотеката",
index 9d1ac9a..95173b9 100644 (file)
        "whatlinkshere": "ഈ താളിലേക്കുള്ള കണ്ണികൾ",
        "whatlinkshere-title": "\"$1\" എന്ന താളിലേക്കുള്ള കണ്ണികൾ",
        "whatlinkshere-page": "താൾ:",
-       "linkshere-2": "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ നിന്നും '''$1''' എന്ന താളിലേക്ക് കണ്ണികളുണ്ട്:",
-       "nolinkshere-2": "'''$1''' എന്ന താളിലേക്ക് കണ്ണികളൊന്നും നിലവിലില്ല.",
-       "nolinkshere-ns-2": "തിരഞ്ഞെടുത്ത നാമമേഖലയിൽ '''$1''' എന്ന താളിലേക്ക് മറ്റൊരു താളുകളിൽനിന്നും കണ്ണികളില്ല.",
+       "linkshere-2": "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ നിന്നും '''$2''' എന്ന താളിലേക്ക് കണ്ണികളുണ്ട്:",
+       "nolinkshere-2": "'''$2''' എന്ന താളിലേക്ക് കണ്ണികളൊന്നും നിലവിലില്ല.",
+       "nolinkshere-ns-2": "തിരഞ്ഞെടുത്ത നാമമേഖലയിൽ '''$2''' എന്ന താളിലേക്ക് മറ്റൊരു താളുകളിൽനിന്നും കണ്ണികളില്ല.",
        "isredirect": "തിരിച്ചുവിടൽ താൾ",
        "istemplate": "ഉൾപ്പെടുത്തൽ",
        "isimage": "പ്രമാണത്തിന്റെ കണ്ണി",
index 113c30f..e4c45bd 100644 (file)
        "whatlinkshere": "Энд холбогдсон хуудсууд",
        "whatlinkshere-title": "\"$1\"-д холбоостой хуудаснууд",
        "whatlinkshere-page": "Хуудас:",
-       "linkshere-2": "Дараах хуудсууд '''$1'''-тай холбогдсон байна:",
-       "nolinkshere-2": "'''$1'''-тай холбогдсон хуудас байхгүй байна.",
-       "nolinkshere-ns-2": "Сонгосон нэрний зайд '''$1''' руу холбогдсон хуудас байхгүй байна.",
+       "linkshere-2": "Дараах хуудсууд '''$2'''-тай холбогдсон байна:",
+       "nolinkshere-2": "'''$2'''-тай холбогдсон хуудас байхгүй байна.",
+       "nolinkshere-ns-2": "Сонгосон нэрний зайд '''$2''' руу холбогдсон хуудас байхгүй байна.",
        "isredirect": "чиглүүлэгч",
        "istemplate": "оруулалт",
        "isimage": "файлын холбоос",
index e860acb..8c17c57 100644 (file)
        "whatlinkshere": "येथे काय जोडले आहे",
        "whatlinkshere-title": "\"$1\" ला जुळलेली पाने",
        "whatlinkshere-page": "पान:",
-       "linkshere-2": "खालील लेख '''$1''' या पानांशी जोडले आहेत:",
-       "nolinkshere-2": "'''$1''' येथे कोणत्याही पानांचे दुवे नाहीत.",
-       "nolinkshere-ns-2": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>$1</strong>ला दुवा देत नाहीत .",
+       "linkshere-2": "खालील लेख '''$2''' या पानांशी जोडले आहेत:",
+       "nolinkshere-2": "'''$2''' येथे कोणत्याही पानांचे दुवे नाहीत.",
+       "nolinkshere-ns-2": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>$2</strong>ला दुवा देत नाहीत .",
        "isredirect": "पुनर्निर्देशित पान",
        "istemplate": "आंतर्न्यास (ट्रांसक्लूजन)",
        "isimage": "संचिका दुवा",
index 96132fd..91d721b 100644 (file)
        "savechanges": "Simpan perubahan",
        "publishpage": "Terbitkan",
        "publishchanges": "Terbit perubahan",
+       "savearticle-start": "Simpan laman...",
+       "savechanges-start": "Simpan perubahan...",
+       "publishpage-start": "Terbitkan laman...",
+       "publishchanges-start": "Terbitkan perubahan...",
        "preview": "Pralihat",
        "showpreview": "Paparkan pralihat",
        "showdiff": "Lihat perubahan",
        "whatlinkshere": "Pautan ke laman ini",
        "whatlinkshere-title": "Laman yang mengandungi pautan ke \"$1\"",
        "whatlinkshere-page": "Laman:",
-       "linkshere-2": "Laman-laman berikut mengandungi pautan ke '''$1''':",
-       "nolinkshere-2": "Tiada laman yang mengandungi pautan ke '''$1'''.",
-       "nolinkshere-ns-2": "Tiada laman yang mengandungi pautan ke '''$1''' dalam ruang nama yang dinyatakan.",
+       "linkshere-2": "Laman-laman berikut mengandungi pautan ke '''$2''':",
+       "nolinkshere-2": "Tiada laman yang mengandungi pautan ke '''$2'''.",
+       "nolinkshere-ns-2": "Tiada laman yang mengandungi pautan ke '''$2''' dalam ruang nama yang dinyatakan.",
        "isredirect": "laman lencongan",
        "istemplate": "penyertaan",
        "isimage": "pautan fail",
index e67b778..43a5bc7 100644 (file)
        "whatlinkshere": "Li jwasslu 'l hawn",
        "whatlinkshere-title": "Paġni li jippuntaw lejn $1",
        "whatlinkshere-page": "Paġna:",
-       "linkshere-2": "Il-paġni segwenti jorbtu lejn '''$1''':",
-       "nolinkshere-2": "L-ebda paġna ma twassal għal '''$1'''.",
-       "nolinkshere-ns-2": "L-ebda paġna ma tipponta lejn '''$1''' fl-ispazju tal-isem magħżul.",
+       "linkshere-2": "Il-paġni segwenti jorbtu lejn '''$2''':",
+       "nolinkshere-2": "L-ebda paġna ma twassal għal '''$2'''.",
+       "nolinkshere-ns-2": "L-ebda paġna ma tipponta lejn '''$2''' fl-ispazju tal-isem magħżul.",
        "isredirect": "paġna ta' rindirizz",
        "istemplate": "inklużjoni",
        "isimage": "ħolqa lejn il-fajl",
index 297cde8..06f420d 100644 (file)
        "whatlinkshere": "L que lhiga eiqui",
        "whatlinkshere-title": "Páiginas que lhígan a \"$1\"",
        "whatlinkshere-page": "Páigina:",
-       "linkshere-2": "Estas páiginas ténen lhigaçones pa <strong>$1</strong>:",
-       "nolinkshere-2": "Nun eisisten lhigaçones pa '''$1'''.",
+       "linkshere-2": "Estas páiginas ténen lhigaçones pa <strong>$2</strong>:",
+       "nolinkshere-2": "Nun eisisten lhigaçones pa '''$2'''.",
        "isredirect": "páigina de ancaminamiento",
        "istemplate": "ancluson",
        "isimage": "lhigaçon pa l fexeiro",
index ca80b0b..9378123 100644 (file)
        "whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ",
        "whatlinkshere-title": "\"$1\" သို့ ချိတ်ဆက်ထားသော စာမျက်နှာများ",
        "whatlinkshere-page": "စာမျက်နှာ -",
-       "linkshere-2": "အောက်ပါစာမျက်နှာများသည် <strong>$1</strong> သို့ ချိတ်ဆက်ထားသည် -",
-       "nolinkshere-2": "<strong>$1</strong> သို့ လင့်ခ်ထားသော စာမျက်နှာ မရှိပါ။",
+       "linkshere-2": "အောက်ပါစာမျက်နှာများသည် <strong>$2</strong> သို့ ချိတ်ဆက်ထားသည် -",
+       "nolinkshere-2": "<strong>$2</strong> သို့ လင့်ခ်ထားသော စာမျက်နှာ မရှိပါ။",
        "isredirect": "ပြန်ညွှန်းသော စာမျက်နှာ",
        "istemplate": "ထည့်သွင်းကူးယူချက်",
        "isimage": "ဖိုင်လင့်",
index 903c2c4..4ad22a5 100644 (file)
        "whatlinkshere": "Мезе тезэнь сюлмави",
        "whatlinkshere-title": "$1 марто сюлмазь лопатне",
        "whatlinkshere-page": "Лопась:",
-       "linkshere-2": "Сыця лопатьне сюлмававить '''$1''' марто:",
-       "nolinkshere-2": "Кодаткак лопат асульмавить '''$1''' марто.",
+       "linkshere-2": "Сыця лопатьне сюлмававить '''$2''' марто:",
+       "nolinkshere-2": "Кодаткак лопат асульмавить '''$2''' марто.",
        "isredirect": "Лиякс витнинк-петнинк лопанть",
        "istemplate": "совавтомс",
        "isimage": "файлань сюлмавома пене",
index b4e276f..7a64dd0 100644 (file)
        "whatlinkshere": "لینک‌ئون ِاینتا صفحه",
        "whatlinkshere-title": "وألـگ‌ئونی که \"$1\" ره لـیـنک هه‌دانه",
        "whatlinkshere-page": "صفحه:",
-       "linkshere-2": "اینان صفحه‌ئون به '''$1''' لینک هدانه:",
+       "linkshere-2": "اینان صفحه‌ئون به '''$2''' لینک هدانه:",
        "isredirect": "دکشی‌ین صفحه",
        "istemplate": "تراگنجانش‌ئون",
        "isimage": "فایل ِلینک",
index 1f1925d..dbccb93 100644 (file)
        "whatlinkshere": "In tlein quitzonhuilia nican",
        "whatlinkshere-title": "Zāzaniltin quitzonhuiliah $1",
        "whatlinkshere-page": "Tlahcuilolamatl:",
-       "linkshere-2": "Inīn zāzaniltin quitzonhuiliah '''$1''' īhuīc:",
-       "nolinkshere-2": "Ahtle quitzonhuilia '''$1''' īhuīc.",
+       "linkshere-2": "Inīn zāzaniltin quitzonhuiliah '''$2''' īhuīc:",
+       "nolinkshere-2": "Ahtle quitzonhuilia '''$2''' īhuīc.",
        "isredirect": "Tlacueptli tlahcuilolamatl",
        "isimage": "īxiptlahtli tzonhuiliztli",
        "whatlinkshere-prev": "{{PLURAL:$1|achtopa|$1 achtopa}}",
index 93069ae..e11a829 100644 (file)
        "whatlinkshere": "Tó-ūi liân kàu chia",
        "whatlinkshere-title": "Liân khì \"$1\" ê ia̍h-bīn",
        "whatlinkshere-page": "Ia̍h:",
-       "linkshere-2": "Í-hā '''$1''' liân kàu chia:",
-       "nolinkshere-2": "Bô poàⁿ ia̍h liân kàu '''$1'''.",
+       "linkshere-2": "Í-hā '''$2''' liân kàu chia:",
+       "nolinkshere-2": "Bô poàⁿ ia̍h liân kàu '''$2'''.",
        "isredirect": "choán-ia̍h",
        "isimage": "tóng-àn liân-kiat",
        "whatlinkshere-prev": "{{PLURAL:$1|chêng|chêng $1 ê}}",
index e7b4c82..209c448 100644 (file)
        "whatlinkshere": "Paggene ca cullegano a chesta",
        "whatlinkshere-title": "Paggene ca cullegano a $1",
        "whatlinkshere-page": "Paggena:",
-       "linkshere-2": "'E paggene ccà abbascio cunteneno jonte ca spuntano a '''$1'''.",
-       "nolinkshere-2": "Nisciuna paggena cuntene jonte ca spuntasse a <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Nun ce stanno paggene ca spuntassero '''$1''' dint' 'o namespace scigliuto.",
+       "linkshere-2": "'E paggene ccà abbascio cunteneno jonte ca spuntano a '''$2'''.",
+       "nolinkshere-2": "Nisciuna paggena cuntene jonte ca spuntasse a <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Nun ce stanno paggene ca spuntassero '''$2''' dint' 'o namespace scigliuto.",
        "isredirect": "redirect a paggena",
        "istemplate": "'nclusione",
        "isimage": "Cullegamente a file multimediale",
index 8b306c4..c2c65bd 100644 (file)
        "whatlinkshere": "Lenker hit",
        "whatlinkshere-title": "Sider som lenker til «$1»",
        "whatlinkshere-page": "Side:",
-       "linkshere-2": "Følgende sider lenker til '''$1''':",
-       "nolinkshere-2": "Ingen sider lenker til '''$1'''.",
-       "nolinkshere-ns-2": "Ingen sider lenker til '''$1''' i valgte navnerom.",
+       "linkshere-2": "Følgende sider lenker til '''$2''':",
+       "nolinkshere-2": "Ingen sider lenker til '''$2'''.",
+       "nolinkshere-ns-2": "Ingen sider lenker til '''$2''' i valgte navnerom.",
        "isredirect": "omdirigeringsside",
        "istemplate": "transklusjon",
        "isimage": "fillenke",
index 944031d..7a7d99b 100644 (file)
        "unprotect": "Beveyliging wysigen",
        "newpage": "Nieje zied",
        "talkpagelinktext": "Oaverleg",
-       "specialpage": "Spesiale zied",
+       "specialpage": "Speciale syde",
        "personaltools": "Persoonlike instellingen",
        "talk": "Oaverleg",
        "views": "Weergaven",
        "nstab-main": "Artikel",
        "nstab-user": "Gebruker",
        "nstab-media": "Media",
-       "nstab-special": "Spesiale zied",
-       "nstab-project": "Projektzied",
-       "nstab-image": "Bestaand",
-       "nstab-mediawiki": "Tiejige",
+       "nstab-special": "Speciale syde",
+       "nstab-project": "Projektsyde",
+       "nstab-image": "Bestand",
+       "nstab-mediawiki": "Bericht",
        "nstab-template": "Mal",
-       "nstab-help": "Hulpe",
-       "nstab-category": "Kategorie",
+       "nstab-help": "Hülpe",
+       "nstab-category": "Kategory",
        "mainpage-nstab": "Vöärblad",
        "nosuchaction": "De op-egeven haandeling besteet niet",
        "nosuchactiontext": "De opdrachte in t webadres in ongeldig.\nJe hebben t webadres misschien verkeerd in-etikt of de verkeerde verwiezing evolgd.\nDit kan oek dujen op n fout in de programmatuur van {{SITENAME}}.",
        "whatlinkshere": "Verwysingen hyrhinne",
        "whatlinkshere-title": "Ziejen die verwiezen naor \"$1\"",
        "whatlinkshere-page": "Zied:",
-       "linkshere-2": "Disse ziejen verwiezen naor '''$1''':",
-       "nolinkshere-2": "Gien enkele zied verwis naor '''$1'''.",
-       "nolinkshere-ns-2": "Gien enkele zied verwis naor '''$1''' in de ekeuzen naamruumte.",
+       "linkshere-2": "Disse ziejen verwiezen naor '''$2''':",
+       "nolinkshere-2": "Gien enkele zied verwis naor '''$2'''.",
+       "nolinkshere-ns-2": "Gien enkele zied verwis naor '''$2''' in de ekeuzen naamruumte.",
        "isredirect": "deurverwiezing",
        "istemplate": "in-evoegd as mal",
        "isimage": "bestaandsverwiezing",
index b5b6faa..3fd131d 100644 (file)
        "whatlinkshere": "Wat wiest na disse Siet hen",
        "whatlinkshere-title": "Sieden, de na „$1“ wiest",
        "whatlinkshere-page": "Siet:",
-       "linkshere-2": "Disse Sieden wiest na '''„$1“''':",
-       "nolinkshere-2": "Kene Siet wiest na '''„$1“'''.",
-       "nolinkshere-ns-2": "Kene Sieden wiest na '''$1''' in’n utwählten Naamruum.",
+       "linkshere-2": "Disse Sieden wiest na '''„$2“''':",
+       "nolinkshere-2": "Kene Siet wiest na '''„$2“'''.",
+       "nolinkshere-ns-2": "Kene Sieden wiest na '''$2''' in’n utwählten Naamruum.",
        "isredirect": "Wiederleiden",
        "istemplate": "inbunnen dör Vörlaag",
        "isimage": "Dateilenk",
index 1e22e2a..6dc0770 100644 (file)
        "whatlinkshere": "यहाँ के जोडिन्छ",
        "whatlinkshere-title": "$1 सँग जोडिएका पानाहरू",
        "whatlinkshere-page": "पृष्ठ:",
-       "linkshere-2": "निम्न पृष्ठहरू '''$1''' मा जोडिन्छ :",
-       "nolinkshere-2": " '''$1'''मा लिंक भएका कुनै पृष्ठहरू छैनन्",
-       "nolinkshere-ns-2": "चुनिएको नामस्थानमा '''$1''' सित जोडिने पृष्ठहरू छैनन्।",
+       "linkshere-2": "निम्न पृष्ठहरू '''$2''' मा जोडिन्छ :",
+       "nolinkshere-2": " '''$2'''मा लिंक भएका कुनै पृष्ठहरू छैनन्",
+       "nolinkshere-ns-2": "चुनिएको नामस्थानमा '''$2''' सित जोडिने पृष्ठहरू छैनन्।",
        "isredirect": "अनुप्रेषित पृष्ठ",
        "istemplate": "पारदर्शिता",
        "isimage": "फाइल लिङ्क",
index f295c76..2e6e242 100644 (file)
        "dellogpage": "Verwijderingslogboek",
        "dellogpagetext": "Hieronder wordt een lijst met recent verwijderde pagina's en bestanden weergegeven.",
        "deletionlog": "verwijderingslogboek",
+       "log-name-create": "Logboek nieuwe pagina's",
+       "log-description-create": "Hieronder wordt een lijst met recent aangemaakte pagina's weergegeven.",
+       "logentry-create-create": "$1 {{GENDER:$2|heeft}} de pagina $3 aangemaakt",
        "reverted": "Eerdere versie hersteld",
        "deletecomment": "Reden:",
        "deleteotherreason": "Andere reden:",
        "whatlinkshere": "Verwijzingen naar deze pagina",
        "whatlinkshere-title": "Pagina's die verwijzen naar \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere-2": "De volgende pagina's verwijzen naar '''$1''':",
-       "nolinkshere-2": "Geen enkele pagina verwijst naar '''$1'''.",
-       "nolinkshere-ns-2": "Geen enkele pagina in de gekozen naamruimte verwijst naar '''$1'''.",
+       "linkshere-2": "De volgende pagina's verwijzen naar <strong>$2</strong>:",
+       "nolinkshere-2": "Geen enkele pagina verwijst naar <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Geen enkele pagina in de gekozen naamruimte verwijst naar <strong>$2</strong>.",
        "isredirect": "doorverwijspagina",
        "istemplate": "ingevoegd als sjabloon",
        "isimage": "bestandskoppeling",
index c9862b6..ee209ac 100644 (file)
        "whatlinkshere": "Lenkjer hit",
        "whatlinkshere-title": "Sider som har lenkje til «$1»",
        "whatlinkshere-page": "Side:",
-       "linkshere-2": "Desse sidene har lenkjer til '''$1''':",
-       "nolinkshere-2": "Ingen sider har lenkjer til '''$1'''.",
-       "nolinkshere-ns-2": "Ingen sider har lenkje til '''$1''' i det valde namnerommet.",
+       "linkshere-2": "Desse sidene har lenkjer til '''$2''':",
+       "nolinkshere-2": "Ingen sider har lenkjer til '''$2'''.",
+       "nolinkshere-ns-2": "Ingen sider har lenkje til '''$2''' i det valde namnerommet.",
        "isredirect": "omdirigeringsside",
        "istemplate": "inkludert som mal",
        "isimage": "fillenkje",
index 702f91e..678b265 100644 (file)
        "whatlinkshere": "Ke eng yeo e hlomaganyago mo",
        "whatlinkshere-title": "Matlakala a go hlomaganya go \"$1\"",
        "whatlinkshere-page": "Letlakala:",
-       "linkshere-2": "Matlaka a latelago a hlomaganya le '''$1''':",
-       "nolinkshere-2": "Ga go letlakala leo le hlomaganyago go '''$1'''.",
+       "linkshere-2": "Matlaka a latelago a hlomaganya le '''$2''':",
+       "nolinkshere-2": "Ga go letlakala leo le hlomaganyago go '''$2'''.",
        "isredirect": "''redirect'' letlakala",
        "istemplate": "tsentšho",
        "isimage": "Hlomaganyo ya Faele",
index 239d754..7d88e71 100644 (file)
        "whatlinkshere": "natj beda nitja",
        "whatlinkshere-title": "Bibol beda $1",
        "whatlinkshere-page": "Bibol:",
-       "linkshere-2": "Ngawaliny bibol beda-ang <strong>$1</strong>",
-       "nolinkshere-2": "Uart bibol beda <strong>$1</strong>.",
+       "linkshere-2": "Ngawaliny bibol beda-ang <strong>$2</strong>",
+       "nolinkshere-2": "Uart bibol beda <strong>$2</strong>.",
        "isredirect": "Dtallangiritch bibol",
        "istemplate": "transclusion",
        "isimage": "file beda",
index 1b14a70..c5533e7 100644 (file)
        "botpasswords-updated-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es estat mes a jorn.",
        "botpasswords-deleted-title": "Senhal de robòts suprimit",
        "botpasswords-deleted-body": "Lo senhal pel robòt « $1 » de l'{{GENDER:$2|utilizaire|utilizaira}} « $2 » es suprimit.",
+       "botpasswords-newpassword": "Lo mot de passa novèl per se connectar a <strong>$1</strong> es <strong>$2</strong>. <em>Vos cal lo registrar per lo vos remembrar mai tard.</em> <br> (Per los robòts vièlhs qu'an de besonh que lo nom per se connectar siá lo meteis que lo nom d'utilizaire, podètz tanben emplegar <strong>$3</strong> coma nom d'utilizaire e <strong>$4</strong> coma mot de passa.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider es pas disponible.",
        "botpasswords-restriction-failed": "Las restriccions de mot de passa de bots empachan aquela connexion.",
        "botpasswords-invalid-name": "Lo nom d'usatgièr especificat conten pas de separador de mot de passa de robòt (\"$1\").",
        "botpasswords-not-exist": "L'usatgièr «$1» a pas de mot de passa de robòt nomenat «$2».",
+       "botpasswords-needs-reset": "Cal tornar inicializar lo mot de passa pel robòt nomenat \"$2\" de l'utilizaire {{GENDER:$1|user}} \"$1\".",
        "resetpass_forbidden": "Los senhals pòdon pas èsser cambiats",
        "resetpass_forbidden-reason": "Los senhaus pòdon pas èsser cambiats : $1",
        "resetpass-no-info": "Vos cal èsser connectat per aver accès a aquesta pagina.",
        "whatlinkshere": "Paginas ligadas a aquesta",
        "whatlinkshere-title": "Paginas que puntan cap a « $1 »",
        "whatlinkshere-page": "Pagina :",
-       "linkshere-2": "Las paginas çaijós contenon un ligam cap a '''$1''':",
-       "nolinkshere-2": "Cap de pagina conten pas de ligam cap a '''$1'''.",
-       "nolinkshere-ns-2": "Cap de pagina conten pas de ligam cap a '''$1''' dins l’espaci de nom causit.",
+       "linkshere-2": "Las paginas çaijós contenon un ligam cap a '''$2''':",
+       "nolinkshere-2": "Cap de pagina conten pas de ligam cap a '''$2'''.",
+       "nolinkshere-ns-2": "Cap de pagina conten pas de ligam cap a '''$2''' dins l’espaci de nom causit.",
        "isredirect": "pagina de redireccion",
        "istemplate": "inclusion",
        "isimage": "ligam cap al fichièr",
index f2433a8..2c06bd9 100644 (file)
        "whatlinkshere": "Linkit tänne",
        "whatlinkshere-title": "Sivut, kudamat kosketah sivuu \"$1\"",
        "whatlinkshere-page": "Sivu:",
-       "linkshere-2": "Nämmä sivut linkittiäkseh sivuh <strong>$1</strong>:",
+       "linkshere-2": "Nämmä sivut linkittiäkseh sivuh <strong>$2</strong>:",
        "isredirect": "uvvellehohjavussivu",
        "istemplate": "sizällyttämine",
        "isimage": "failan linku",
index 06aa815..bf6d040 100644 (file)
        "whatlinkshere": "ଏଠାରେ ଥିବା ଲିଙ୍କ",
        "whatlinkshere-title": "\"$1\" କୁ ପୃଷ୍ଠା ଲିଙ୍କ",
        "whatlinkshere-page": "ପୃଷ୍ଠା:",
-       "linkshere-2": "ଏହି ପୃଷ୍ଠା ସବୁ  <strong>$1</strong> ସହ ଯୋଡ଼ା ଯାଇଅଛି:",
-       "nolinkshere-2": "'''$1''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
-       "nolinkshere-ns-2": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''$1''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
+       "linkshere-2": "ଏହି ପୃଷ୍ଠା ସବୁ  <strong>$2</strong> ସହ ଯୋଡ଼ା ଯାଇଅଛି:",
+       "nolinkshere-2": "'''$2''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
+       "nolinkshere-ns-2": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''$2''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
        "isredirect": "ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା",
        "istemplate": "ଆଧାର ସହ ଭିତରେ ରଖିବା",
        "isimage": "ଫାଇଲର ଲିଙ୍କ",
index dea5c69..5abedc3 100644 (file)
        "whatlinkshere": "Чи æрвиты ардæм",
        "whatlinkshere-title": "Фæрстæ, кæдон æрвитынц ардæм: «$1»",
        "whatlinkshere-page": "Фарс:",
-       "linkshere-2": "Ацы фæрстæ æрвитынц '''$1''':",
-       "nolinkshere-2": "Никæцы фарс æрвиты ардæм: '''$1'''.",
-       "nolinkshere-ns-2": "Амынд номдоны мидæг никæцы фарс æрвиты ардæм <strong>$1</strong>.",
+       "linkshere-2": "Ацы фæрстæ æрвитынц '''$2''':",
+       "nolinkshere-2": "Никæцы фарс æрвиты ардæм: '''$2'''.",
+       "nolinkshere-ns-2": "Амынд номдоны мидæг никæцы фарс æрвиты ардæм <strong>$2</strong>.",
        "isredirect": "æрвитæн фарс",
        "istemplate": "æфтыдæй",
        "isimage": "файлмæ æрвитæн",
index af9527f..10eecf2 100644 (file)
        "whatlinkshere": "ਇੱਥੇ ਕੀ ਆ ਕੇ ਜੁੜਦਾ ਹੈ",
        "whatlinkshere-title": "$1 ਨਾਲ ਜੋੜਨ ਵਾਲੇ ਸਫ਼ੇ",
        "whatlinkshere-page": "ਸਫ਼ਾ:",
-       "linkshere-2": "ਇਹ ਪੰਨੇ '''$1''' ਨਾਲ ਜੋੜਦੇ ਹਨ:",
-       "nolinkshere-2": "ਕੋਈ ਵੀ ਸਫ਼ਾ '''$1''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
+       "linkshere-2": "ਇਹ ਪੰਨੇ '''$2''' ਨਾਲ ਜੋੜਦੇ ਹਨ:",
+       "nolinkshere-2": "ਕੋਈ ਵੀ ਸਫ਼ਾ '''$2''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
        "isredirect": "ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ",
        "istemplate": "ਟਾਕਰਾ ਕਰੋ",
        "isimage": "ਫ਼ਾਈਲ ਲਿੰਕ",
index 4b23940..5eb9345 100644 (file)
        "whatlinkshere": "Deng pakasuglung keti",
        "whatlinkshere-title": "Deng bulung a makasuglung king \"$1\"",
        "whatlinkshere-page": "Bulung:",
-       "linkshere-2": "Pakasuglung la king '''$1''' deng makatuking bulung:",
-       "nolinkshere-2": "Alang bulung a makasuglung king '''$1'''.",
-       "nolinkshere-ns-2": "Alang bulung a makatuglung king '''$1''' ketang mepiling pirinan lagyu (namespace).",
+       "linkshere-2": "Pakasuglung la king '''$2''' deng makatuking bulung:",
+       "nolinkshere-2": "Alang bulung a makasuglung king '''$2'''.",
+       "nolinkshere-ns-2": "Alang bulung a makatuglung king '''$2''' ketang mepiling pirinan lagyu (namespace).",
        "isredirect": "Bulung ning pamanaliling direksiun",
        "istemplate": "misingit",
        "isimage": "Isuglung king larawan",
index ca5abff..cfac4e4 100644 (file)
        "whatlinkshere": "Cha lie quoé ichi",
        "whatlinkshere-title": "Paches qu'il ont des loïens aveuc \"$1\"",
        "whatlinkshere-page": "Pache:",
-       "linkshere-2": "Chés paches-lo il sont érliées à '''$1''':",
-       "nolinkshere-2": "i n'y o poin d'pache aveuc un loïen vers  '''$1'''.",
-       "nolinkshere-ns-2": "i n'y o poin d'pache aveuc un loïen vers '''$1''' dins echl'éspace d'noms coési.",
+       "linkshere-2": "Chés paches-lo il sont érliées à '''$2''':",
+       "nolinkshere-2": "i n'y o poin d'pache aveuc un loïen vers  '''$2'''.",
+       "nolinkshere-ns-2": "i n'y o poin d'pache aveuc un loïen vers '''$2''' dins echl'éspace d'noms coési.",
        "isredirect": "pache érdirigée",
        "istemplate": "transclusion",
        "isimage": "Loïen aveuc l'fichié",
index b421a6a..9fc4999 100644 (file)
        "whatlinkshere": "Was dohea zaische dud",
        "whatlinkshere-title": "Saide wu uff \"$1\" valing'gn",
        "whatlinkshere-page": "Said:",
-       "linkshere-2": "Die Saide valing'gn uff '''$1''':",
-       "nolinkshere-2": "Kä Said zaischd uff '''$1'''.",
+       "linkshere-2": "Die Saide valing'gn uff '''$2''':",
+       "nolinkshere-2": "Kä Said zaischd uff '''$2'''.",
        "isredirect": "Waidalaidungsaid",
        "istemplate": "Vorlacheoibindung",
        "isimage": "Dadailing'g",
index 70e089a..803878a 100644 (file)
        "whatlinkshere": "Linkujące",
        "whatlinkshere-title": "Strony linkujące do „$1”",
        "whatlinkshere-page": "Strona:",
-       "linkshere-2": "Następujące strony odwołują się do '''$1''':",
-       "nolinkshere-2": "Żadna strona nie odwołuje się do '''$1'''.",
-       "nolinkshere-ns-2": "Żadna strona nie odwołuje się do '''$1''' w wybranej przestrzeni nazw.",
+       "linkshere-2": "Następujące strony odwołują się do <strong>$2</strong>:",
+       "nolinkshere-2": "Żadna strona nie odwołuje się do <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Żadna strona nie odwołuje się do <strong>$2</strong> w wybranej przestrzeni nazw.",
        "isredirect": "strona przekierowująca",
        "istemplate": "dołączony szablon",
        "isimage": "link do pliku",
index 5a88383..96a5307 100644 (file)
        "whatlinkshere": "Pàgine con dj'anliure che a men-o a costa-sì",
        "whatlinkshere-title": "Pàgine ch'a men-o a «$1»",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere-2": "Le pàgine sì-sota a l'han andrinta dj'anliure che a men-o a '''$1''':",
-       "nolinkshere-2": "A-i é pa gnun-a pàgina che a l'abia dj'anliure che a men-o a '''$1'''.",
-       "nolinkshere-ns-2": "An cost ëspassi nominal-sì a-i é gnun-e pàgine con dj'anliure ch'a men-o a '''$1'''.",
+       "linkshere-2": "Le pàgine sì-sota a l'han andrinta dj'anliure che a men-o a '''$2''':",
+       "nolinkshere-2": "A-i é pa gnun-a pàgina che a l'abia dj'anliure che a men-o a '''$2'''.",
+       "nolinkshere-ns-2": "An cost ëspassi nominal-sì a-i é gnun-e pàgine con dj'anliure ch'a men-o a '''$2'''.",
        "isredirect": "ridiression",
        "istemplate": "inclusion",
        "isimage": "anliura a l'archivi",
index 4519eca..3f72102 100644 (file)
        "whatlinkshere": "ایتھے کیدا جوڑ اے",
        "whatlinkshere-title": "او صفے جہڑے \"$1\" نال جڑے نیں",
        "whatlinkshere-page": "صفہ:",
-       "linkshere-2": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''$1''':",
-       "nolinkshere-2": "'''$1''' دے نال کسے دا جوڑ نہیں",
-       "nolinkshere-ns-2": "چنے ناں چ کسے صفے دا '''$1''' نال جوڑ نئیں۔",
+       "linkshere-2": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''$2''':",
+       "nolinkshere-2": "'''$2''' دے نال کسے دا جوڑ نہیں",
+       "nolinkshere-ns-2": "چنے ناں چ کسے صفے دا '''$2''' نال جوڑ نئیں۔",
        "isredirect": "ریڈائرکٹ صفہ",
        "istemplate": "ملن",
        "isimage": "مورت دا جوڑ",
index ba2addf..e23cdac 100644 (file)
        "whatlinkshere": "Ντο δεκνίζ' αδακές",
        "whatlinkshere-title": "Σελίδας ντο συνδέουν ση σελίδαν $1",
        "whatlinkshere-page": "Σελίδαν:",
-       "linkshere-2": "Αβούτα τα σελίδας δεκνίζνε σο '''$1''':",
-       "nolinkshere-2": "'Κ ευρέθεν σελίδα το δεκνίζ' ση σελίδαν '''$1'''.",
+       "linkshere-2": "Αβούτα τα σελίδας δεκνίζνε σο '''$2''':",
+       "nolinkshere-2": "'Κ ευρέθεν σελίδα το δεκνίζ' ση σελίδαν '''$2'''.",
        "isredirect": "σελίδαν διπλού σύνδεσμονος",
        "istemplate": "ενσωμάτωση",
        "isimage": "σύνδεσμον εικόνας",
index 1f6ca9e..f300386 100644 (file)
        "whatlinkshere": "Ka autenginna stwi",
        "whatlinkshere-title": "Pāusan autengināntei prei \"$1\"",
        "whatlinkshere-page": "Pāusan:",
-       "linkshere-2": "Ripīntei pāusai autenginna prei '''$1''':",
-       "nolinkshere-2": "Niaīnan pāusan ni autenginna prei '''$1'''.",
-       "nolinkshere-ns-2": "Niaīnan pāusan ni autenginna prei '''$1''' en etrīnktai tītelin plattibin.",
+       "linkshere-2": "Ripīntei pāusai autenginna prei '''$2''':",
+       "nolinkshere-2": "Niaīnan pāusan ni autenginna prei '''$2'''.",
+       "nolinkshere-ns-2": "Niaīnan pāusan ni autenginna prei '''$2''' en etrīnktai tītelin plattibin.",
        "isredirect": "prawesnas pāusan",
        "istemplate": "entensīsenis",
        "isimage": "autengīnsenis prei bildin",
index 62206cb..8378692 100644 (file)
        "whatlinkshere": "د دې مخ تړنې",
        "whatlinkshere-title": "هغه مخونه چې د \"$1\" سره تړنې لري",
        "whatlinkshere-page": "مخ:",
-       "linkshere-2": "دغه لانديني مخونه د '''$1''' سره تړنې لري:",
-       "nolinkshere-2": "د '''$1''' سره هېڅ يو مخ هم تړنې نه لري .",
+       "linkshere-2": "دغه لانديني مخونه د '''$2''' سره تړنې لري:",
+       "nolinkshere-2": "د '''$2''' سره هېڅ يو مخ هم تړنې نه لري .",
        "isredirect": "د مخ گرځونې مخ",
        "istemplate": "ورگډېدنه",
        "isimage": "د دوتنې تړنه",
index 4bcde5e..faa797a 100644 (file)
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "sp-contributions-blocklog": "registro de bloqueios",
        "sp-contributions-suppresslog": "Contribuições de {{GENDER:$1|usuário}} suprimidas",
-       "sp-contributions-deleted": "contribuições eliminadas do {{GENDER:$1|usuário}}",
+       "sp-contributions-deleted": "contribuições eliminadas",
        "sp-contributions-uploads": "envios",
        "sp-contributions-logs": "registros",
-       "sp-contributions-talk": "disc",
-       "sp-contributions-userrights": "gerenciamento de privilégios de {{GENDER:$1|usuários}}",
+       "sp-contributions-talk": "discussão",
+       "sp-contributions-userrights": "gerenciamento de privilégios",
        "sp-contributions-blocked-notice": "Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP encontra-se bloqueado.\nSegue, para referência, a entrada mais recente no registro de bloqueios:",
        "sp-contributions-search": "Navegar pelas contribuições",
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas que têm links para \"$1\"",
        "whatlinkshere-page": "Página:",
-       "linkshere-2": "As seguintes páginas possuem links para '''$1''':",
-       "nolinkshere-2": "Não há afluentes para '''$1''' com as condições especificadas.",
-       "nolinkshere-ns-2": "Não há links para '''$1''' no espaço nominal selecionado.",
+       "linkshere-2": "As seguintes páginas têm link para <strong>$2</strong>:",
+       "nolinkshere-2": "Não existem afluentes para <strong>$2</strong> com as condições especificadas.",
+       "nolinkshere-ns-2": "Não existem afluentes para <strong>$2</strong> no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "transclusão",
        "isimage": "link para o arquivo",
        "movenosubpage": "Esta página não tem subpáginas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
-       "delete_and_move_text": "A página de destino \"[[:$1]]\" já existe. Deseja excluí-lo para abrir caminho para o movimento?",
+       "delete_and_move_text": "A página de destino \"[[:$1]]\" já existe. Deseja eliminá-la para abrir caminho para o movimento?",
        "delete_and_move_confirm": "Sim, eliminar a página",
        "delete_and_move_reason": "Eliminada para mover \"[[$1]]\"",
        "selfmove": "O título fonte e o título destinatário são os mesmos; não é possível mover uma página para ela mesma.",
index 011b3cf..52eb0bd 100644 (file)
        "actionfailed": "Operação falhou",
        "deletedtext": "\"$1\" foi eliminada.\nConsulte $2 para um registo de eliminações recentes.",
        "dellogpage": "Registo de eliminações",
-       "dellogpagetext": "Abaixo uma lista das eliminações mais recentes.",
+       "dellogpagetext": "Encontra abaixo uma lista das eliminações mais recentes.",
        "deletionlog": "registo de eliminações",
+       "log-name-create": "Registo de criação de páginas",
+       "log-description-create": "Encontra abaixo uma lista das criações de páginas mais recentes.",
+       "logentry-create-create": "$1 {{GENDER:$2|criou}} a página $3",
        "reverted": "Revertido para versão anterior",
        "deletecomment": "Motivo:",
        "deleteotherreason": "Outro/motivo adicional:",
        "sp-contributions-newbies-title": "Contribuições de contas novas",
        "sp-contributions-blocklog": "registo de bloqueios",
        "sp-contributions-suppresslog": "contribuições suprimidas {{GENDER:$1|do utilizador|da utilizadora}}",
-       "sp-contributions-deleted": "contribuições eliminadas {{GENDER:$1|do utilizador|da utilizadora}}",
+       "sp-contributions-deleted": "{{GENDER:$1|contribuições}} eliminadas",
        "sp-contributions-uploads": "carregamentos",
        "sp-contributions-logs": "registos",
        "sp-contributions-talk": "discussão",
-       "sp-contributions-userrights": "Gestão de privilégios {{GENDER:$1|do utilizador|da utilizadora}}",
+       "sp-contributions-userrights": "{{GENDER:$1|gestão}} dos privilégios",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas com hiperligações para \"$1\"",
        "whatlinkshere-page": "Página:",
-       "linkshere-2": "As seguintes páginas têm hiperligações para <strong>$1</strong>:",
-       "nolinkshere-2": "Não existem afluentes para <strong>$1</strong> com as condições especificadas.",
-       "nolinkshere-ns-2": "Não existem afluentes para <strong>$1</strong> no espaço nominal selecionado.",
+       "linkshere-2": "As seguintes páginas têm hiperligações para <strong>$2</strong>:",
+       "nolinkshere-2": "Não existem afluentes para <strong>$2</strong> com as condições especificadas.",
+       "nolinkshere-ns-2": "Não existem afluentes para <strong>$2</strong> no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "inclusão",
        "isimage": "hiperligação para ficheiro",
index 139c91c..8c61a14 100644 (file)
                        "Acamicamacaraca",
                        "Avatar6",
                        "Akapochtli",
-                       "ديفيد"
+                       "ديفيد",
+                       "Daimona Eaytoy"
                ]
        },
        "sidebar": "{{notranslate}}",
        "rcfilters-watchlist-showupdated": "Message at the top of [[Special:Watchlist]] when the Structured filters are enabled that describes what unseen changes look like.\n\nCf. {{msg-mw|wlheader-showupdated}}",
        "rcfilters-preference-label": "Option in RecentChanges tab of [[Special:Preferences]].",
        "rcfilters-preference-help": "Explanation for the option in the RecentChanges tab of [[Special:Preferences]].",
+       "rcfilters-watchlist-preference-label": "Option in Watchlist tab of [[Special:Preferences]].",
+       "rcfilters-watchlist-preference-help": "Explanation for the option in the Watchlist tab of [[Special:Preferences]].",
        "rcfilters-filter-showlinkedfrom-label": "Label that indicates that the page is showing changes that link FROM the target page. Used on [[Special:Recentchangeslinked]] when structured filters are enabled.",
        "rcfilters-filter-showlinkedfrom-option-label": "Menu option to show changes FROM the target page. Used on [[Special:Recentchangeslinked]] when structured filters are enabled.",
        "rcfilters-filter-showlinkedto-label": "Label that indicates that the page is showing changes that link TO the target page. Used on [[Special:Recentchangeslinked]] when structured filters are enabled.",
        "dellogpage": "{{doc-logpage}}\n\nThe name of the deletion log. Used as heading on [[Special:Log/delete]] and in the drop down menu for selecting logs on [[Special:Log]].\n{{Identical|Deletion log}}",
        "dellogpagetext": "Text in [[Special:Log/delete]].",
        "deletionlog": "Used as text for the link which points to the deletion log:\n* Used as <code>$1</code> in {{msg-mw|Filewasdeleted}}\n* Used as <code>$2</code> in {{msg-mw|Deletedtext}}\n* Used in log lines on [[Special:DeletedContributions]]\n{{Identical|Deletion log}}",
+       "log-name-create": "{{doc-logpage}}\n\nThe name of the page creation log. Used as heading on [[Special:Log/create]] and in the drop down menu for selecting logs on [[Special:Log]].",
+       "log-description-create": "Text in [[Special:Log/create]].",
+       "logentry-create-create": "{{Logentry|[[Special:Log/create]]}}",
        "reverted": "{{Identical|Revert}}",
        "deletecomment": "{{Identical|Reason}}",
        "deleteotherreason": "{{Identical|Other/additional reason}}",
        "whatlinkshere-title": "Title of the special page [[Special:WhatLinksHere]]. This page appears when you click on the 'What links here' button in the toolbox. $1 is the name of the page concerned.",
        "whatlinkshere-summary": "{{doc-specialpagesummary|whatlinkshere}}",
        "whatlinkshere-page": "{{Identical|Page}}",
-       "linkshere-2": "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking \"What links here\" in the sidebar toolbox.\n\nIt is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - HTML link to the page.",
-       "nolinkshere-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - HTML link to the page\nSee also:\n* {{msg-mw|Nolinkshere-ns-html}}",
-       "nolinkshere-ns-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - HTML link to the page\nSee also:\n* {{msg-mw|Nolinkshere-html}}",
+       "linkshere-2": "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking \"What links here\" in the sidebar toolbox.\n\nIt is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - Plain page title\n* $2 - HTML link to the page.",
+       "nolinkshere-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - Plain page title\n* $2 - HTML link to the page.\nSee also:\n* {{msg-mw|Nolinkshere-ns-2}}",
+       "nolinkshere-ns-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - Plain page title\n* $2 - HTML link to the page.\nSee also:\n* {{msg-mw|Nolinkshere-2}}",
        "isredirect": "Displayed in [[Special:WhatLinksHere]] (see [{{fullurl:Special:WhatLinksHere/Project:Translator|hidelinks=1}} Special:WhatLinksHere/Project:Translator] for example).\n\n{{Identical|Redirect page}}",
        "istemplate": "Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.\nDisplayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).\nIf you are not sure how to translate this term, think of something like \"inclusion\", \"embedding\", or \"insertion\".\n{{Identical|Transclusion}}",
        "isimage": "This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).\n{{Identical|File link}}",
index 9d090ba..c98038f 100644 (file)
        "whatlinkshere": "Kayman t'inkimuq",
        "whatlinkshere-title": "$1 sutiyuq p'anqaman t'inkimuqkuna",
        "whatlinkshere-page": "P'anqa:",
-       "linkshere-2": "'''$1''' sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:",
-       "nolinkshere-2": "Manam kachkanchu '''$1'''-man t'inkiq p'anqa.",
-       "nolinkshere-ns-2": "Manam kachkanchu '''$1'''-man t'inkiq p'anqa akllasqa suti k'itipi.",
+       "linkshere-2": "'''$2''' sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:",
+       "nolinkshere-2": "Manam kachkanchu '''$2'''-man t'inkiq p'anqa.",
+       "nolinkshere-ns-2": "Manam kachkanchu '''$2'''-man t'inkiq p'anqa akllasqa suti k'itipi.",
        "isredirect": "pusapusqa p'anqa",
        "istemplate": "ch'aqtasqa",
        "isimage": "willañiqi t'inki",
index 0f24732..6aaa149 100644 (file)
        "whatlinkshere": "Kayman tinkikuna",
        "whatlinkshere-title": "$1-man tinkiyuk pankakuna",
        "whatlinkshere-page": "Panka:",
-       "linkshere-2": "Chay pankakunaka '''$1'''-man tinkiyukmi kan:",
-       "nolinkshere-2": "Mana pankaka '''$1'''-man tinkikunchu.",
+       "linkshere-2": "Chay pankakunaka '''$2'''-man tinkiyukmi kan:",
+       "nolinkshere-2": "Mana pankaka '''$2'''-man tinkikunchu.",
        "isredirect": "pushashka panka",
        "istemplate": "Ukupi tiyak panka (''inclusión'')",
        "isimage": "rikcha tinki",
index a9adaa9..befa626 100644 (file)
        "whatlinkshere": "ⵎⵉⵏ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⴷⴰ",
        "whatlinkshere-title": "Tasniwin id-izedyen ɣar \"$1\"",
        "whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
-       "linkshere-2": "Tasna ya tzedi ɣa '''$1''':",
-       "nolinkshere-2": "war tlli ca n Tasna tqqen-d da '''$1'''.",
+       "linkshere-2": "Tasna ya tzedi ɣa '''$2''':",
+       "nolinkshere-2": "war tlli ca n Tasna tqqen-d da '''$2'''.",
        "isredirect": "Tasna n (redirect)",
        "istemplate": "Asidef",
        "isimage": "amaqqan usatul",
index 0a894b1..b546f5c 100644 (file)
        "whatlinkshere": "Colliaziuns sin questa pagina",
        "whatlinkshere-title": "Paginas ch'èn colliadas cun \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere-2": "Suandantas paginas èn colliadas cun '''$1''':",
-       "nolinkshere-2": "Naginas paginas èn colliadas cun '''$1'''.",
-       "nolinkshere-ns-2": "Naginas paginas èn colliadas cun '''$1''' en il tip da pagina tschernì.",
+       "linkshere-2": "Suandantas paginas èn colliadas cun '''$2''':",
+       "nolinkshere-2": "Naginas paginas èn colliadas cun '''$2'''.",
+       "nolinkshere-ns-2": "Naginas paginas èn colliadas cun '''$2''' en il tip da pagina tschernì.",
        "isredirect": "Pagina che renviescha",
        "istemplate": "Integraziun da models",
        "isimage": "colliaziun da datoteca",
index 939d795..0f20480 100644 (file)
        "whatlinkshere": "Ce trimite aici",
        "whatlinkshere-title": "Pagini care conțin legături spre „$1”",
        "whatlinkshere-page": "Pagină:",
-       "linkshere-2": "Următoarele pagini conțin legături către <strong>$1</strong>:",
-       "nolinkshere-2": "Nici o pagină nu trimite la '''$1'''.",
-       "nolinkshere-ns-2": "Nici o pagină din spațiul de nume ales nu trimite la '''$1'''.",
+       "linkshere-2": "Următoarele pagini conțin legături către <strong>$2</strong>:",
+       "nolinkshere-2": "Nici o pagină nu trimite la '''$2'''.",
+       "nolinkshere-ns-2": "Nici o pagină din spațiul de nume ales nu trimite la '''$2'''.",
        "isredirect": "pagină de redirecționare",
        "istemplate": "prin includerea formatului",
        "isimage": "legătură către fișier",
index cb006f0..47ada87 100644 (file)
        "whatlinkshere": "Appondene aqquà",
        "whatlinkshere-title": "Pàggene ca appondene a \"$1\"",
        "whatlinkshere-page": "Pàgene:",
-       "linkshere-2": "Le pàggene ca avènene appondene a '''$1''':",
-       "nolinkshere-2": "Nisciuna pàgene apponde a '''$1'''.",
-       "nolinkshere-ns-2": "Nisciuna pàgene apponde a '''$1''' jndr'à 'u namespace scacchiete.",
+       "linkshere-2": "Le pàggene ca avènene appondene a '''$2''':",
+       "nolinkshere-2": "Nisciuna pàgene apponde a '''$2'''.",
+       "nolinkshere-ns-2": "Nisciuna pàgene apponde a '''$2''' jndr'à 'u namespace scacchiete.",
        "isredirect": "pàgene de ridirezionamende",
        "istemplate": "inclusione",
        "isimage": "collegamende a 'u file",
index 25063c8..193b292 100644 (file)
        "whatlinkshere": "Ссылки сюда",
        "whatlinkshere-title": "Страницы, ссылающиеся на «$1»",
        "whatlinkshere-page": "Страница:",
-       "linkshere-2": "Следующие страницы ссылаются на «'''$1'''»:",
-       "nolinkshere-2": "На страницу '''$1''' отсутствуют ссылки с других страниц.",
-       "nolinkshere-ns-2": "В выбранном пространстве имён нет страниц, ссылающихся на '''$1'''.",
+       "linkshere-2": "Следующие страницы ссылаются на <strong>$2</strong>:",
+       "nolinkshere-2": "На страницу <strong>$2</strong> отсутствуют ссылки с других страниц.",
+       "nolinkshere-ns-2": "В выбранном пространстве имён нет страниц, ссылающихся на <strong>$2</strong>.",
        "isredirect": "страница-перенаправление",
        "istemplate": "включение",
        "isimage": "файловая ссылка",
index 0b1f038..25bd92a 100644 (file)
        "whatlinkshere": "Одказы на тоту сторінку",
        "whatlinkshere-title": "Сторінкы, што ся одказують на \"$1\"",
        "whatlinkshere-page": "Сторінка:",
-       "linkshere-2": "Наслїдуючі сторінкы ся одказують на '''$1''':",
-       "nolinkshere-2": "Жадна сторінка на '''$1''' не одказує.",
-       "nolinkshere-ns-2": "У выбранім просторї назв на '''$1''' не одказує жадна сторінка.",
+       "linkshere-2": "Наслїдуючі сторінкы ся одказують на '''$2''':",
+       "nolinkshere-2": "Жадна сторінка на '''$2''' не одказує.",
+       "nolinkshere-ns-2": "У выбранім просторї назв на '''$2''' не одказує жадна сторінка.",
        "isredirect": "сторінка напрямлена",
        "istemplate": "вложіня",
        "isimage": "Одказ на файл",
index 6b9a08a..cfd5ff9 100644 (file)
        "whatlinkshere": "अनेन सह सम्बद्धाः",
        "whatlinkshere-title": "\"$1\" सम्बद्धानि पृष्ठानि",
        "whatlinkshere-page": "पृष्ठम्:",
-       "linkshere-2": "'''$1''' इत्यनेन सह अधो लिखितानां पृष्ठानां परिसन्धिं करोतु:",
-       "nolinkshere-2": "'''$1''' इत्यनेन सह न किमपि पृष्ठं परिसन्धितम्",
-       "nolinkshere-ns-2": "चितनामस्थानात्  '''$1''' इत्येनं योजनयोग्यं पृष्ठं नास्ति  ।",
+       "linkshere-2": "'''$2''' इत्यनेन सह अधो लिखितानां पृष्ठानां परिसन्धिं करोतु:",
+       "nolinkshere-2": "'''$2''' इत्यनेन सह न किमपि पृष्ठं परिसन्धितम्",
+       "nolinkshere-ns-2": "चितनामस्थानात्  '''$2''' इत्येनं योजनयोग्यं पृष्ठं नास्ति  ।",
        "isredirect": "अनुप्रेषण-पृष्ठम्",
        "istemplate": "अन्यलेखभागः (transclusion)",
        "isimage": "सञ्चिकासम्बन्धः",
index 3dc7eb0..600ffb2 100644 (file)
        "whatlinkshere": "Манна сигэнэллэр",
        "whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
        "whatlinkshere-page": "Сирэй:",
-       "linkshere-2": "'''$1''' билэҕэ манна көрдөрүллүбүт сирэйдэр сигэнэллэр:",
-       "nolinkshere-2": "'''$1''' сирэйгэ сигэнэр сирэйдэр суохтар.",
-       "nolinkshere-ns-2": "Талыллыбыт бөлөххө (namespace) бу '''$1''' сирэйгэ сигэнэр сирэйдэр суохтар.",
+       "linkshere-2": "'''$2''' билэҕэ манна көрдөрүллүбүт сирэйдэр сигэнэллэр:",
+       "nolinkshere-2": "'''$2''' сирэйгэ сигэнэр сирэйдэр суохтар.",
+       "nolinkshere-ns-2": "Талыллыбыт бөлөххө (namespace) бу '''$2''' сирэйгэ сигэнэр сирэйдэр суохтар.",
        "isredirect": "көлбөрүтэр сирэй",
        "istemplate": "иһинээҕи",
        "isimage": "билэ сигэтэ",
index 16618df..8edca98 100644 (file)
@@ -35,6 +35,8 @@
        "tog-watchdefault": "ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱥᱟᱦᱴᱟᱠᱩ ᱟᱨ ᱨᱮᱫᱠᱩ ᱥᱮᱞᱮᱫ ᱢᱮ",
        "tog-watchmoves": "ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱥᱟᱦᱴᱟᱠᱩ ᱟᱨ ᱨᱮᱫᱠᱩ ᱚᱪᱟᱜᱽ ᱢᱮ",
        "tog-watchdeletion": "ᱤᱧᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹᱨᱮ ᱥᱟᱦᱴᱟᱠᱩ ᱟᱨ ᱨᱮᱫᱠᱩ ᱜᱮᱫ ᱜᱤᱰᱤᱭ ᱢᱮ",
+       "tog-watchuploads": "ᱱᱟᱶᱟ ᱨᱮᱫ ᱥᱮᱞᱮᱫᱽᱢᱮ ᱤᱧᱟᱜ ᱧᱮᱞ ᱞᱤᱥᱴᱤ ᱨᱤᱧ ᱞᱟᱫᱮᱭᱟ",
+       "tog-watchrollback": "ᱥᱟᱦᱴᱟ ᱥᱮᱞᱮᱫᱽᱢᱮ ᱡᱟᱦᱟᱸᱨᱮ ᱤᱧᱟᱜ ᱧᱮᱞ ᱞᱤᱥᱴᱤᱧ ᱟᱹᱪᱩᱨ ᱨᱩᱣᱟᱹᱲ ᱟᱠᱟᱫᱼᱟ",
        "tog-minordefault": "ᱮᱛᱦᱚᱵᱨᱮ ᱥᱟᱱᱟᱢ ᱥᱟᱯᱲᱟᱣᱠᱩ ᱦᱩᱰᱤᱧ ᱞᱮᱠᱟᱛᱮ ᱪᱤᱱᱦᱟᱹ ᱠᱟᱜ ᱢᱮ",
        "tog-previewontop": "ᱥᱟᱯᱲᱟᱣ ᱵᱟᱠᱥᱳ ᱞᱟᱦᱟᱨᱮ ᱩᱱᱩᱫᱩᱜ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "tog-previewonfirst": "ᱯᱟᱹᱦᱤᱞ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱩᱱᱩᱫᱩᱜ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "october-date": "ᱚᱠᱴᱚᱵᱚᱨ $1",
        "november-date": "ᱱᱚᱵᱷᱮᱢᱵᱚᱨ $1",
        "december-date": "ᱰᱤᱥᱮᱢᱵᱚᱨ $1",
+       "period-am": "ᱮᱹᱮᱢ",
+       "period-pm": "ᱯᱤᱹᱮᱢ",
        "pagecategories": "{{PLURAL:$1|ᱛᱷᱚᱠ|ᱛᱷᱚᱠᱠᱩ}}",
        "category_header": "ᱛᱷᱚᱠ ᱨᱮᱱ ᱥᱟᱦᱴᱟᱞᱩ \"$1\"",
        "subcategories": "ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ",
        "talk": "ᱜᱟᱞᱢᱟᱨᱟᱣ",
        "views": "ᱧᱮᱞᱚᱜᱚᱜ",
        "toolbox": "ᱦᱟᱹᱛᱭᱟᱹᱨ",
+       "tool-link-emailuser": "ᱤᱢᱮᱞᱟᱭᱢᱮ ᱱᱩᱭ {{GENDER:$1|ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ}}",
        "imagepage": "ᱨᱮᱫ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ",
        "mediawikipage": "ᱠᱷᱚᱵᱚᱨ ᱥᱟᱦᱴᱟ ᱧᱮᱞᱢᱮ",
        "templatepage": "ᱪᱷᱟᱸᱪ ᱥᱟᱦᱴᱟ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "pool-timeout": "Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana",
        "pool-queuefull": "Pool queue is full",
        "pool-errorunknown": "ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱦᱩᱲᱟᱹᱜ",
+       "poolcounter-usage-error": "ᱵᱮᱵᱷᱟᱨᱟᱜ ᱦᱩᱲᱟᱹᱜᱺ $1",
        "aboutsite": "{{SITENAME}} ᱵᱟᱵᱚᱛ",
        "aboutpage": "Project: ᱵᱟᱵᱚᱛ",
        "copyright": "ᱩᱱᱩᱫᱩᱜ ᱫᱚ ᱧᱟᱢᱚᱜ-ᱟ $1 ᱞᱮᱠᱟᱛᱮ  ᱵᱟᱝᱠᱷᱟᱱ ᱚᱞ ᱛᱟᱦᱮᱱᱟ",
        "retrievedfrom": "\"$1\" ᱠᱷᱚᱱ ᱧᱟᱢ ᱟᱹᱜᱩᱭ",
        "youhavenewmessages": "{{PLURAL:$3|ᱟᱢᱟᱜ ᱢᱮᱱᱟᱜ-ᱟ}} $1 ($2)᱾",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|ᱟᱢ ᱫᱚ}} $1 ᱠᱷᱚᱱ {{PLURAL:$3|ᱟᱨᱢᱤᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ|$3 ᱵᱷᱮᱵᱷᱟᱨᱩᱭᱟᱹ}} ($2) ᱾",
+       "youhavenewmessagesmanyusers": "ᱟᱭᱢᱟ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ ($2) ᱠᱷᱚᱱ ᱟᱢ ᱫᱚ $1",
        "newmessageslinkplural": "{{PLURAL:$1|ᱢᱤᱫ ᱱᱟᱶᱟ ᱢᱮᱥᱮᱡᱽ|999=ᱱᱟᱶᱟ ᱢᱮᱥᱮᱡᱽᱠᱚ}}",
        "newmessagesdifflinkplural": "ᱢᱩᱪᱟᱹᱫ {{PLURAL:$1|ᱵᱚᱫᱚᱞ|999=ᱵᱚᱫᱚᱞᱠᱚ}}",
        "youhavenewmessagesmulti": "ᱟᱢᱟᱜ ᱱᱟᱣᱟ ᱠᱷᱚᱵᱟᱨᱠᱚ ᱫᱚ $1 ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ",
        "hidetoc": "ᱫᱟᱱᱟᱝ",
        "collapsible-collapse": "ᱢᱩᱨᱪᱷᱟᱹᱣ ᱪᱟᱵᱟ",
        "collapsible-expand": "ᱯᱷᱟᱭᱞᱟᱣ",
+       "confirmable-confirm": "{{GENDER:$1|ᱟᱢ}} ᱴᱷᱟᱹᱣᱠᱟᱹ ᱭᱮᱜ-ᱟᱢ?",
        "confirmable-yes": "ᱦᱮᱸ",
        "confirmable-no": "ᱵᱟᱝ",
        "thisisdeleted": "ᱧᱮᱞ ᱥᱮ ᱨᱩᱭᱟᱹᱲ ᱫᱚᱲᱦᱟ $1?",
        "nospecialpagetext": "<strong>ᱟᱢ ᱫᱚ ᱡᱟᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱞᱟᱹᱜᱤᱫ ᱮᱢ ᱱᱮᱦᱚᱨ ᱟᱠᱟᱫᱟ ᱚᱱᱟᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ </strong>\nᱡᱟᱦᱟᱸ ᱥᱟᱦᱴᱟᱠᱩ ᱱᱚᱸᱰᱮ ᱢᱮᱱᱟᱜ-ᱟ ᱚᱱᱟᱨᱮᱱᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱱᱚᱸᱰᱮᱢ ᱧᱟᱢᱟ [[Special:SpecialPages|{{int:specialpages}}]]᱾",
        "error": "ᱦᱩᱲᱟᱹᱜ",
        "databaseerror": "ᱰᱟᱴᱟᱵᱮᱡᱽ ᱦᱩᱲᱟᱹᱜ",
+       "databaseerror-query": "ᱠᱩᱠᱞᱤ: $1",
+       "databaseerror-function": "ᱠᱟᱹᱢᱤ: $1",
        "databaseerror-error": "ᱦᱩᱲᱟᱹᱜ: $1",
        "laggedslavemode": "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
        "readonly": "ᱰᱟᱴᱟᱵᱮᱡᱽ ᱛᱟᱞᱟᱜᱮᱭᱟ",
        "virus-badscanner": "Vul konfigareson: baṅ orom vairas skenar: \"$1\"",
        "virus-scanfailed": "Esken baṅ hoelena (Code $1)",
        "virus-unknownscanner": "Baṅ urum anṭvayras:",
+       "cannotlogoutnow-title": "ᱱᱤᱛ ᱚᱰᱚᱠ ᱵᱟᱭ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ",
+       "cannotlogoutnow-text": "ᱚᱰᱚᱠᱚᱜ ᱫᱚ ᱵᱟᱭ ᱜᱟᱱᱚᱜᱼᱟ ᱡᱚᱠᱷᱚᱱ $1 ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱᱟ",
        "welcomeuser": "ᱥᱟᱹᱜᱩᱱ ᱫᱟᱨᱟᱢ, $1!",
-       "welcomecreation-msg": "Amaḱ ekaunṭ do̠ jhićena. Amaḱ pạsindko bodol alom hiṛińa.",
+       "welcomecreation-msg": "ᱟᱢᱟᱜ ᱮᱠᱟᱶᱩᱴ ᱫᱚ ᱛᱮᱭᱟᱨᱮᱱᱟ ᱾\nᱟᱢ ᱥᱟᱱᱟᱢᱮ ᱠᱷᱟᱱ ᱟᱢᱟᱜ {{SITENAME}} [[Special:Preferences|ᱠᱩᱥᱤᱠᱚ]] ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ ᱟᱢ ᱾",
        "yourname": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ:",
        "userlogin-yourname": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱧᱩᱛᱩᱢ",
        "userlogin-yourname-ph": "ᱟᱢᱟᱜ ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ ᱧᱤᱛᱩᱢ ᱵᱚᱞᱚᱭ ᱢᱮ",
        "createacct-yourpasswordagain": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱴᱷᱟᱹᱣᱠᱟᱹᱭ ᱢᱮ",
        "createacct-yourpasswordagain-ph": "ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱫᱽ ᱟᱫᱮᱨᱢᱮ ᱫᱚᱲᱦᱟ",
        "userlogin-remembermypassword": "ᱵᱚᱞᱚ ᱛᱷᱤᱨᱜᱮ ᱫᱚᱦᱚᱠᱟᱹᱧᱢᱮ",
+       "userlogin-signwithsecure": "ᱥᱤᱠᱣᱟᱹᱨ ᱠᱷᱚᱸᱡᱟ ᱵᱮᱵᱷᱟᱨ ᱢᱮ",
+       "cannotlogin-title": "ᱵᱚᱞᱚ ᱵᱟᱭ ᱜᱟᱱ ᱞᱮᱱᱟ",
+       "cannotlogin-text": "ᱵᱚᱞᱚ ᱵᱟᱭ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾",
+       "cannotloginnow-title": "ᱱᱤᱛ ᱵᱟᱝ ᱵᱚᱞᱚᱱᱟ",
+       "cannotloginnow-text": "ᱵᱚᱞᱚᱱ ᱫᱚ ᱵᱟᱭ ᱜᱟᱱᱚᱜᱼᱟ ᱡᱚᱠᱷᱚᱱ $1 ᱵᱮᱵᱷᱟᱨᱚᱜ ᱠᱟᱱᱟ",
+       "cannotcreateaccount-title": "ᱮᱠᱟᱶᱩᱴ ᱵᱟᱝ ᱛᱮᱭᱟᱨᱞᱮᱱᱟ",
        "yourdomainname": "ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢ:",
        "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.",
        "login": "ᱵᱚᱞᱚᱜ ᱢᱮ",
        "loginlanguagelabel": "ᱯᱟᱹᱨᱥᱤ: $1",
        "pt-login": "ᱵᱚᱞᱚᱜ ᱫᱩᱭᱟᱹᱨ",
        "pt-login-button": "ᱵᱚᱞᱚᱜ ᱢᱮ",
+       "pt-login-continue-button": "ᱞᱮᱛᱟᱲ ᱵᱚᱞᱚ ᱠᱚᱜᱼᱢᱮ",
        "pt-createaccount": "ᱴᱷᱟᱭ ᱵᱮᱱᱟᱣᱢᱮ",
        "pt-userlogout": "ᱚᱰᱚᱠᱚᱜ ᱢᱮ",
        "user-mail-no-addy": "Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.",
        "savechanges": "ᱵᱚᱫᱚᱞᱠᱚ ᱨᱩᱠᱷᱤᱭᱟᱹᱭ ᱢᱮ",
        "publishpage": "ᱥᱟᱦᱴᱟ ᱯᱟᱨᱥᱟᱞ ᱢᱮ",
        "publishchanges": "ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱨᱥᱟᱞ ᱢᱮ",
+       "savearticle-start": "ᱥᱟᱦᱴᱟ ᱨᱩᱠᱷᱭᱟᱹᱹᱹ",
+       "savechanges-start": "ᱵᱚᱫᱚᱞ ᱨᱩᱠᱷᱭᱟᱹᱹᱹ",
+       "publishpage-start": "ᱥᱟᱦᱴᱟ ᱯᱟᱨᱥᱟᱞᱹᱹᱹ",
+       "publishchanges-start": "ᱵᱚᱫᱚᱞᱠᱚ ᱯᱟᱨᱥᱟᱞ",
        "preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
        "showpreview": "ᱧᱮᱞᱡᱚᱝ ᱩᱫᱩᱜᱽᱢᱮ",
        "showdiff": "ᱵᱚᱫᱚᱞᱠᱩ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "edit-no-change": "ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱵᱟᱝ ᱦᱟᱛᱟᱣᱞᱮᱱᱟ ᱡᱮᱫᱟᱜ ᱡᱮ ᱚᱞᱨᱮ ᱡᱟᱸᱦᱟᱸᱱ ᱵᱚᱫᱚᱞ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾",
        "postedit-confirmation-created": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱛᱮᱭᱟᱨᱠᱟᱱᱟ᱾",
        "postedit-confirmation-restored": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱟᱹᱜᱩ ᱨᱩᱣᱟᱹᱲ ᱦᱩᱭᱠᱟᱱᱟ᱾",
+       "postedit-confirmation-saved": "ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱨᱩᱠᱷᱭᱟᱹᱭᱮᱱᱟ",
+       "postedit-confirmation-published": "ᱟᱢᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱫᱚ ᱯᱟᱨᱥᱟᱞᱮᱱᱟ",
        "edit-already-exists": "ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱵᱟᱝ ᱛᱮᱭᱟᱨ ᱞᱮᱱᱟ᱾\nᱱᱚᱣᱟ ᱫᱚ ᱞᱟᱦᱟ ᱠᱷᱚᱱ ᱢᱮᱱᱟᱜ ᱜᱮᱭᱟ᱾",
        "defaultmessagetext": "ᱯᱩᱭᱞᱩ ᱚᱞᱠᱟᱱ ᱠᱷᱚᱵᱚᱨ",
        "content-model-wikitext": "ᱣᱤᱠᱤ-ᱚᱞ",
        "deletedhist": "ᱜᱮᱫ ᱜᱤᱰᱤᱭᱟᱠᱟᱱ ᱱᱟᱜᱟᱢ",
        "revdelete-reasonotherlist": "ᱮᱴᱟᱜ ᱚᱡᱮ",
        "mergehistory-from": "ᱯᱷᱮᱰᱟᱛ ᱥᱟᱦᱴᱟᱺ",
+       "mergehistory-no-source": "ᱯᱷᱮᱰᱟᱛ ᱥᱟᱦᱴᱟ $1 ᱵᱟᱹᱱᱩᱜᱼᱟ ᱾",
+       "mergehistory-invalid-source": "ᱯᱷᱮᱰᱟᱛ ᱥᱟᱦᱴᱟ ᱫᱚ ᱡᱚᱛᱟᱛ ᱥᱟᱛᱟᱢ ᱦᱩᱭᱩᱜ ᱞᱟᱹᱠᱛᱤ",
        "mergehistory-reason": "ᱚᱡᱮ:",
        "mergelog": "ᱞᱚᱜᱽ ᱢᱮᱥᱟ",
        "revertmerge": "ᱵᱟᱝ ᱢᱤᱛ",
        "search-result-category-size": "{{PLURAL:$1|1 ᱥᱚᱦᱮᱫ|$1 ᱥᱚᱦᱮᱫᱠᱩ}} ({{PLURAL:$2|1 ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠ|$ 2 ᱦᱩᱰᱤᱧ ᱛᱷᱚᱠᱠᱩ}}, {{PLURAL:$3|1 ᱨᱮᱫ|$3 ᱨᱮᱫᱠᱩ}})",
        "search-redirect": "(ᱥᱚᱡᱷᱮ ᱦᱤᱡᱩᱜ-ᱟ $1 ᱠᱷᱚᱱ)",
        "search-section": "(ᱦᱟᱹᱴᱤᱧ $1)",
+       "search-category": "(ᱛᱷᱚᱠ $1)",
        "search-file-match": "(ᱢᱤᱫᱩᱜᱟᱜ ᱨᱮᱫ ᱩᱱᱩᱫᱩᱜ)",
        "search-suggest": "ᱪᱮᱫ ᱮᱢ ᱢᱮᱱ ᱚᱪᱚᱭᱮᱫᱟ: $1",
        "search-interwiki-caption": "ᱥᱟᱶᱛᱮᱱ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱷᱚᱱ ᱚᱨᱡᱚ",
        "prefs-setemail": "ᱤᱢᱮᱞ ᱵᱩᱴᱟᱹ ᱡᱚᱲᱟᱣᱢᱮ",
        "saveprefs": "ᱨᱩᱠᱷᱤᱭᱟᱹᱭᱢᱮ",
        "searchresultshead": "ᱥᱮᱸᱫᱽᱨᱟ",
+       "timezonelegend": "ᱮᱞᱟᱠᱟ ᱚᱠᱛᱚᱺ",
+       "localtime": "ᱴᱚᱴᱷᱟ ᱚᱠᱛᱚᱺ",
+       "timezoneuseserverdefault": "ᱡᱟᱣᱞᱮᱠᱟ ($1) ᱣᱤᱠᱤ ᱵᱮᱵᱷᱟᱨ",
+       "timezoneuseoffset": "ᱮᱴᱟᱜᱟᱜ (ᱚᱯᱷᱥᱮᱴ ᱥᱚᱫᱚᱨ)",
+       "servertime": "ᱥᱚᱨᱵᱷᱚᱨ ᱚᱠᱛᱚᱺ",
+       "guesstimezone": "ᱵᱨᱟᱣᱡᱟᱨ ᱠᱷᱚᱱ ᱯᱮᱨᱮᱡ",
        "timezoneregion-africa": "ᱟᱯᱷᱨᱤᱠᱟ",
        "timezoneregion-america": "ᱟᱢᱮᱨᱤᱠᱟ",
+       "timezoneregion-antarctica": "ᱟᱱᱴᱟᱨᱠᱴᱤᱠᱟ",
+       "timezoneregion-arctic": "ᱟᱨᱠᱴᱤᱠ",
        "timezoneregion-asia": "ᱮᱥᱤᱭᱟ",
+       "timezoneregion-atlantic": "ᱟᱴᱞᱟᱱᱴᱤᱠ ᱢᱟᱦᱟᱫᱚᱨᱭᱟ",
        "timezoneregion-australia": "ᱚᱥᱴᱨᱮᱞᱤᱭᱟ",
+       "timezoneregion-europe": "ᱤᱣᱨᱚᱯ",
+       "timezoneregion-indian": "ᱥᱤᱧᱚᱛ ᱢᱟᱦᱟᱫᱚᱨᱭᱟ",
+       "timezoneregion-pacific": "ᱯᱮᱥᱤᱯᱷᱤᱠ ᱢᱟᱦᱟᱫᱚᱨᱭᱟ",
        "prefs-searchoptions": "ᱥᱮᱸᱫᱽᱨᱟ",
        "prefs-files": "ᱨᱮᱫᱠᱚ",
        "youremail": "Email:",
        "whatlinkshere": "ᱱᱚᱸᱰᱮ ᱫᱚ ᱪᱮᱫ ᱡᱚᱱᱚᱲ ᱠᱳ",
        "whatlinkshere-title": "ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱠᱚᱫᱚ \"$1\" ᱨᱮ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ",
        "whatlinkshere-page": "ᱥᱟᱦᱴᱟ:",
-       "linkshere-2": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ <strong>$1</strong> ᱥᱟᱶ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :",
-       "nolinkshere-2": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ <strong>$1</strong>.",
+       "linkshere-2": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ <strong>$2</strong> ᱥᱟᱶ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :",
+       "nolinkshere-2": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ <strong>$2</strong>.",
        "isredirect": "ᱵᱟᱝ ᱥᱚᱡᱽᱦᱮ ᱥᱟᱦᱴᱟ",
        "istemplate": "ᱥᱮᱞᱮᱫ",
        "isimage": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ",
index 52e2f63..74d2c60 100644 (file)
        "whatlinkshere": "Pàginas chi ligant a custa",
        "whatlinkshere-title": "Pàginas chi ligant a \"$1\"",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere-2": "Is pàginas chi sighint ligant a '''$1''':",
-       "nolinkshere-2": "Peruna pàgina ligat a '''$1'''.",
-       "nolinkshere-ns-2": "Peruna pàgina ligat a '''$1''' in su nùmene-logu seberadu.",
+       "linkshere-2": "Is pàginas chi sighint ligant a '''$2''':",
+       "nolinkshere-2": "Peruna pàgina ligat a '''$2'''.",
+       "nolinkshere-ns-2": "Peruna pàgina ligat a '''$2''' in su nùmene-logu seberadu.",
        "isredirect": "pàgina de reindiritzamentu",
        "istemplate": "inclusione",
        "isimage": "ligòngiu a documentu",
index 9903b2a..a5169a9 100644 (file)
        "whatlinkshere": "Chi punta ccà",
        "whatlinkshere-title": "Pàggini ca pùntanu a \"$1\"",
        "whatlinkshere-page": "Pàggina:",
-       "linkshere-2": "Sti pàggini hannu nu liami a '''$1''':",
-       "nolinkshere-2": "Nudda pàggina havi nu liami a '''$1'''.",
-       "nolinkshere-ns-2": "Nun ci sugnu pàggini chi puntano a '''$1''' ntô namespace silizziunatu.",
+       "linkshere-2": "Sti pàggini hannu nu liami a '''$2''':",
+       "nolinkshere-2": "Nudda pàggina havi nu liami a '''$2'''.",
+       "nolinkshere-ns-2": "Nun ci sugnu pàggini chi puntano a '''$2''' ntô namespace silizziunatu.",
        "isredirect": "pàggina di rinnirizzamentu",
        "istemplate": "nclusioni",
        "isimage": "lijami ô file",
index b09b2ef..0a31d2c 100644 (file)
        "whatlinkshere": "Whit airts here",
        "whatlinkshere-title": "Pages that link til \"$1\"",
        "whatlinkshere-page": "Page:",
-       "linkshere-2": "The follaein pages link til <strong>$1</strong>:",
-       "nolinkshere-2": "Nae pages link wi '''$1'''.",
-       "nolinkshere-ns-2": "No pages aiet til <strong>$1</strong> in the chosen namespace.",
+       "linkshere-2": "The follaein pages link til <strong>$2</strong>:",
+       "nolinkshere-2": "Nae pages link wi '''$2'''.",
+       "nolinkshere-ns-2": "No pages aiet til <strong>$2</strong> in the chosen namespace.",
        "isredirect": "reguidal page",
        "istemplate": "transclusion",
        "isimage": "file airtin",
index deec6e6..9349673 100644 (file)
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
        "whatlinkshere-title": "\"$1\" سان ڳنڍيندڙ صفحا",
        "whatlinkshere-page": "صفحو:",
-       "linkshere-2": "هيٺيان صفحا <strong>$1</strong> سان ڳنڍيل آهن:",
-       "nolinkshere-2": "'''$1''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
+       "linkshere-2": "هيٺيان صفحا <strong>$2</strong> سان ڳنڍيل آهن:",
+       "nolinkshere-2": "'''$2''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
        "isredirect": "چورڻو صفحو",
        "istemplate": "شموليت",
        "isimage": "فائيل جو ڳنڍڻو",
index 6976bd4..69d562c 100644 (file)
        "whatlinkshere": "Puntani inogghi",
        "whatlinkshere-title": "Pàgini chi pùntani a \"$1\"",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere-2": "Li sighenti pàgini cuntenani cullegamenti a '''$1''':",
-       "nolinkshere-2": "Nisciuna pàgina cunteni dei cullegamenti chi pùntani a '''$1'''.",
-       "nolinkshere-ns-2": "Nò vi so pàgini chi pùntani a '''$1''' i' lu namespace sciubaraddu.",
+       "linkshere-2": "Li sighenti pàgini cuntenani cullegamenti a '''$2''':",
+       "nolinkshere-2": "Nisciuna pàgina cunteni dei cullegamenti chi pùntani a '''$2'''.",
+       "nolinkshere-ns-2": "Nò vi so pàgini chi pùntani a '''$2''' i' lu namespace sciubaraddu.",
        "isredirect": "rinviu",
        "istemplate": "incrusioni",
        "isimage": "Cullegamentu a file",
index c39abf8..96567b5 100644 (file)
        "whatlinkshere": "بەسیارەگان وە ئێرە",
        "whatlinkshere-title": "ئەو پەڕەیلە ک وە «$1» بەسیار دێرن",
        "whatlinkshere-page": "پەڕە:",
-       "linkshere-2": "ئەی پەڕەیلە بەستیار دێرن وە '''$1''':",
-       "nolinkshere-2": "هۊچ لاپەڕەێگ بەسیار وە '''$1''' نەێرێد .",
+       "linkshere-2": "ئەی پەڕەیلە بەستیار دێرن وە '''$2''':",
+       "nolinkshere-2": "هۊچ لاپەڕەێگ بەسیار وە '''$2''' نەێرێد .",
        "isredirect": "پەڕەێ ڕەوانەکەر",
        "istemplate": "ناوتەپیاێەگان (transclusions)",
        "isimage": "بەسیار پەڕگە",
index a33423a..b91def8 100644 (file)
        "sp-contributions-submit": "Oza",
        "whatlinkshere": "Siiddut mat čujuhit deike",
        "whatlinkshere-title": "Siiddut mat čujuhit $1",
-       "linkshere-2": "Čuovvovaš siidduin lea liŋka siidui <strong>$1</strong>:",
-       "nolinkshere-2": "Siidui <strong>$1</strong> eai leat liŋkkat.",
-       "nolinkshere-ns-2": "Siidui <strong>$1</strong> eai leat liŋkkat válljejuvvon nammagomuvuođas.",
+       "linkshere-2": "Čuovvovaš siidduin lea liŋka siidui <strong>$2</strong>:",
+       "nolinkshere-2": "Siidui <strong>$2</strong> eai leat liŋkkat.",
+       "nolinkshere-ns-2": "Siidui <strong>$2</strong> eai leat liŋkkat válljejuvvon nammagomuvuođas.",
        "isredirect": "ođđasitstivrensiidu",
        "istemplate": "lasihuvvon mállevuođđui",
        "whatlinkshere-prev": "← {{PLURAL:$1|ovddit siidu|$1 ovddit siiddu}}",
index 6e99960..6352a81 100644 (file)
        "whatlinkshere": "Kaŋ ga dobu ne",
        "whatlinkshere-title": "Moɲey kaŋ ga dobu \"$1\" ga",
        "whatlinkshere-page": "Moo:",
-       "linkshere-2": "Moɲey wey ga dobu <strong>$1</strong> ga:",
-       "nolinkshere-2": "Mooyaŋ kul ši dobu <strong>$1</strong> ga.",
-       "nolinkshere-ns-2": "Mooyaŋ kul ši dobu <strong>$1</strong> ga maafarru suubantaa ra.",
+       "linkshere-2": "Moɲey wey ga dobu <strong>$2</strong> ga:",
+       "nolinkshere-2": "Mooyaŋ kul ši dobu <strong>$2</strong> ga.",
+       "nolinkshere-ns-2": "Mooyaŋ kul ši dobu <strong>$2</strong> ga maafarru suubantaa ra.",
        "isredirect": "moo kuubi",
        "istemplate": "kanandiyan",
        "isimage": "tuku dobu",
index d489059..e0651c2 100644 (file)
        "whatlinkshere": "Sosėjė̄ straipsnē",
        "whatlinkshere-title": "Poslapē, katrėi ruod i \"$1\"",
        "whatlinkshere-page": "Poslapis:",
-       "linkshere-2": "Anėi poslapē ruod i '''$1''':",
-       "nolinkshere-2": "I '''$1''' nūruodu nier.",
-       "nolinkshere-ns-2": "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''$1'''.",
+       "linkshere-2": "Anėi poslapē ruod i '''$2''':",
+       "nolinkshere-2": "I '''$2''' nūruodu nier.",
+       "nolinkshere-ns-2": "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''$2'''.",
        "isredirect": "nusokėma poslapis",
        "istemplate": "īspraudėms",
        "isimage": "abruozdielė nūruoda",
index d775349..394189b 100644 (file)
        "whatlinkshere": "Što upućuje ovamo",
        "whatlinkshere-title": "Stranice koje vode / Странице које воде до $1",
        "whatlinkshere-page": "Stranica:",
-       "linkshere-2": "Sljedeće stranice vode na '''$1''':",
-       "nolinkshere-2": "Nema linkova na '''$1'''.",
-       "nolinkshere-ns-2": "Nijedna stranica nije povezana sa '''$1''' u odabranom imenskom prostoru.",
+       "linkshere-2": "Sljedeće stranice vode na '''$2''':",
+       "nolinkshere-2": "Nema linkova na '''$2'''.",
+       "nolinkshere-ns-2": "Nijedna stranica nije povezana sa '''$2''' u odabranom imenskom prostoru.",
        "isredirect": "preusmjeri stranicu",
        "istemplate": "kao šablon",
        "isimage": "link na datoteku",
index 1e52adb..512ff17 100644 (file)
        "whatlinkshere": "ⵎⴰⴷ ⵉⵜⵜⴰⵡⵉⵏ ⵙ ⵖⵉⴷ",
        "whatlinkshere-title": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵜⴰⵡⵉⵏⵉⵏ ⵙ \"$1\"",
        "whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
-       "linkshere-2": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⴹⴼⴰⵔⵏⵉⵏ ⴰⵔ ⵜⵜⴰⵡⵉⵏⵜ ⵙ <strong>$1</strong>:",
-       "nolinkshere-2": "ⵓⵍⴰ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵓⵔ ⴰⵔ ⵜⴻⵜⵜⴰⵡⵉ ⵙ <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Ur tlla kra n tasna izdin d  '''$1''' ɣ tɣult l-ittuystayn.",
+       "linkshere-2": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⴹⴼⴰⵔⵏⵉⵏ ⴰⵔ ⵜⵜⴰⵡⵉⵏⵜ ⵙ <strong>$2</strong>:",
+       "nolinkshere-2": "ⵓⵍⴰ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵓⵔ ⴰⵔ ⵜⴻⵜⵜⴰⵡⵉ ⵙ <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Ur tlla kra n tasna izdin d  '''$2''' ɣ tɣult l-ittuystayn.",
        "isredirect": "Tasna immutin",
        "istemplate": "Illa gis",
        "isimage": "ⴰⵍⵉⵏⴽ ⵏ ⵓⴼⴰⵢⵍⵓ",
index 62a1800..9a4cbf4 100644 (file)
        "whatlinkshere": "ႁဵင်းၵွင်ႉ ဢၼ်မီးတီႈၼႆႈပဵၼ်သင်",
        "whatlinkshere-title": "ၼႃႈလိၵ်ႈၸိူဝ်းလိင်ႉၸူး \"$1\"",
        "whatlinkshere-page": "ၼႃႈလိၵ်ႈ",
-       "linkshere-2": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>$1</strong>:",
-       "nolinkshere-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>$1</strong>.",
-       "nolinkshere-ns-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>$1</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
+       "linkshere-2": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>$2</strong>:",
+       "nolinkshere-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>$2</strong>.",
+       "nolinkshere-ns-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>$2</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
        "isredirect": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
        "istemplate": "တူဝ်ၶဝ်ႈပႃး",
        "isimage": "ၾၢႆႇၵွင်ႉ",
index 277a0c9..8cf99a8 100644 (file)
        "whatlinkshere": "මෙතනට සබැඳෙන්නේ කුමක්ද",
        "whatlinkshere-title": "\"$1\" වෙත සබැ‍ඳෙන පිටු",
        "whatlinkshere-page": "පිටුව:",
-       "linkshere-2": "ඉදිරියෙහි දැක්වෙන පිටු, '''$1''' වෙත සබැඳෙයි:",
-       "nolinkshere-2": "'''$1''' වෙත කිසිදු පිටුවක් සබැඳී නොමැත.",
-       "nolinkshere-ns-2": "තෝරාගෙන ඇති නාම-අවකාශය තුලදී, කිසිදු පිටුවක්, '''$1''' වෙත නොබැඳෙයි.",
+       "linkshere-2": "ඉදිරියෙහි දැක්වෙන පිටු, '''$2''' වෙත සබැඳෙයි:",
+       "nolinkshere-2": "'''$2''' වෙත කිසිදු පිටුවක් සබැඳී නොමැත.",
+       "nolinkshere-ns-2": "තෝරාගෙන ඇති නාම-අවකාශය තුලදී, කිසිදු පිටුවක්, '''$2''' වෙත නොබැඳෙයි.",
        "isredirect": "පිටුව යළි-යොමුකරන්න",
        "istemplate": "අන්තහ්කරණය",
        "isimage": "ගොනු සබැඳිය",
index 7518cc7..7ddb1c1 100644 (file)
        "whatlinkshere": "Odkazy na túto stránku",
        "whatlinkshere-title": "Stránky odkazujúce na „$1“",
        "whatlinkshere-page": "Page:",
-       "linkshere-2": "Nasledujúce stránky odkazujú na '''$1''':",
-       "nolinkshere-2": "Žiadne stránky neodkazujú na '''$1'''.",
-       "nolinkshere-ns-2": "Žiadne stránky neodkazujú na '''$1''' vo zvolenom mennom priestore.",
+       "linkshere-2": "Nasledujúce stránky odkazujú na '''$2''':",
+       "nolinkshere-2": "Žiadne stránky neodkazujú na '''$2'''.",
+       "nolinkshere-ns-2": "Žiadne stránky neodkazujú na '''$2''' vo zvolenom mennom priestore.",
        "isredirect": "presmerovacia stránka",
        "istemplate": "použitá",
        "isimage": "odkaz na súbor",
index 588058b..ad84553 100644 (file)
        "whatlinkshere": "مربوط ورقے",
        "whatlinkshere-title": "«$1» دے نال جُڑے ہوے ورقے",
        "whatlinkshere-page": "ورقہ",
-       "linkshere-2": "<strong>$1</strong> نال درج ذیل ورقے مربوط ہن:",
-       "nolinkshere-2": "<strong>$1</strong> نال کوئی ورقہ مربوط کائنی۔",
+       "linkshere-2": "<strong>$2</strong> نال درج ذیل ورقے مربوط ہن:",
+       "nolinkshere-2": "<strong>$2</strong> نال کوئی ورقہ مربوط کائنی۔",
        "isredirect": "ورقہ ریڈائریکٹ کرو",
        "istemplate": "شامل شدہ",
        "isimage": "فائل دا ربط",
index db23653..0410602 100644 (file)
        "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Seznam uporabnikov",
        "listusers-editsonly": "Pokaži samo uporabnike z urejanji",
+       "listusers-temporarygroupsonly": "Pokaži samo uporabnike v začasnih uporabniških skupinah",
        "listusers-creationsort": "Razvrsti po datumu ustvaritve",
        "listusers-desc": "Razvrsti padajoče",
        "usereditcount": "$1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "apisandbox-dynamic-parameters-add-label": "Dodaj parameter:",
        "apisandbox-dynamic-parameters-add-placeholder": "Ime parametra",
        "apisandbox-dynamic-error-exists": "Parameter z imenom »$1« že obstaja.",
+       "apisandbox-templated-parameter-reason": "Ta [[Special:ApiHelp/main#main/templatedparams|parameter s predlogo]] je ponujen na podlagi {{PLURAL:$1|vrednosti}} $2.",
        "apisandbox-deprecated-parameters": "Zastareli parametri",
        "apisandbox-fetch-token": "Samodejno izpolni žeton",
        "apisandbox-add-multi": "Dodaj",
        "whatlinkshere-title": "Strani, ki se povezujejo na $1",
        "whatlinkshere-page": "Stran:",
        "linkshere-2": "Na '''$1''' kažejo naslednje strani:",
-       "nolinkshere-2": "Nobena stran ne kaže na '''$1'''.",
-       "nolinkshere-ns-2": "Nobena stran se ne povezuje na '''$1''' v izbranem imenskem prostoru.",
+       "nolinkshere-2": "Nobena stran ne kaže na <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Nobena stran se ne povezuje na <strong>$2</strong> v izbranem imenskem prostoru.",
        "isredirect": "preusmeritvena stran",
        "istemplate": "vključitev",
        "isimage": "povezava na datoteko",
        "pagedata-text": "Ta stran nudi podatkovni vmesnik do strani. Prosimo, navedite naslov strani v URL-ju z uporabo skladnje podstrani.\n* Pogajanje o vsebini se nanaša na glavo Accept vašega odjemalca. To pomeni, da bomo podatke strani posredovali v obliki, ki vašemu odjemalcu bolj ustreza.",
        "pagedata-not-acceptable": "Nismo našli ujemajoče oblike. Podprte vrste MIME: $1",
        "pagedata-bad-title": "Neveljaven naslov: $1.",
-       "unregistered-user-config": "Iz varnostnih razlogov uporabniških podstrani JavaScript, CSS in JSON ne moremo naložiti neregistriranim uporabnikom."
+       "unregistered-user-config": "Iz varnostnih razlogov uporabniških podstrani JavaScript, CSS in JSON ne moremo naložiti neregistriranim uporabnikom.",
+       "passwordpolicies": "Pravilniki gesel",
+       "passwordpolicies-summary": "To je seznam trenutno veljavnih pravilnikov gesel za uporabniške skupine, opredeljene v tem wikiju.",
+       "passwordpolicies-group": "Skupina",
+       "passwordpolicies-policies": "Pravilniki",
+       "passwordpolicies-policy-minimalpasswordlength": "Geslo mora dolgo biti vsaj $1 {{PLURAL:$1|znak|znaka|znake|znakov}}",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Geslo mora biti dolgo vsaj $1 {{PLURAL:$1|znak|znaka|znake|znakov}}, da je omogočena prijava",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Geslo ne more biti enako kot uporabniško ime",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Geslo se ne sme ujemati s posebej prepovedanimi gesli",
+       "passwordpolicies-policy-maximalpasswordlength": "Geslo ne sme biti daljše od $1 {{PLURAL:$1|znak|znaka|znake|znakov}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "Geslo ne sme biti {{PLURAL:$1|1=popularno geslo|na seznamu $1 popularnih gesel}}"
 }
index e468f4d..3246c7f 100644 (file)
        "whatlinkshere-title": "Seyta, de uff „$1“ verlinka",
        "whatlinkshere-page": "Seite:",
        "linkshere-2": "De folgenden Seyta verlinka uff '''„$1“''':",
-       "nolinkshere-2": "Kenne Seite verlinkt uff '''„$1“'''.",
-       "nolinkshere-ns-2": "Kenne Seite verlinkt uff '''„$1“''' eim gewählta Noamasraum.",
+       "nolinkshere-2": "Kenne Seite verlinkt uff '''„$2“'''.",
+       "nolinkshere-ns-2": "Kenne Seite verlinkt uff '''„$2“''' eim gewählta Noamasraum.",
        "isredirect": "Weiterleitungsseyte",
        "istemplate": "Vorlageneinbindung",
        "isimage": "Dateilink",
index 1aac592..80d1c4c 100644 (file)
        "whatlinkshere-title": "Boggaga la xiriiro \"$1\"",
        "whatlinkshere-page": "Bogga:",
        "linkshere-2": "Bogyaashaan waxey la xiriiraan  '''$1''':",
-       "nolinkshere-2": "Boggag la xiriiro   '''$1''' ma jirto.",
+       "nolinkshere-2": "Boggag la xiriiro   '''$2''' ma jirto.",
        "isredirect": "bogga loo sii toosiyay",
        "istemplate": "ku jiri kara",
        "isimage": "faylka la xiriiro",
index a0cf5bf..34d6dad 100644 (file)
        "whatlinkshere-title": "Faqe që lidhen tek $1",
        "whatlinkshere-page": "Faqja:",
        "linkshere-2": "Faqet e mëposhtme lidhen këtu '''$1''':",
-       "nolinkshere-2": "Asnjë faqe nuk lidhet tek '''$1'''.",
-       "nolinkshere-ns-2": "Nuk ka faqe në hapësirën e zgjedhur që lidhen tek '''$1'''.",
+       "nolinkshere-2": "Asnjë faqe nuk lidhet tek '''$2'''.",
+       "nolinkshere-ns-2": "Nuk ka faqe në hapësirën e zgjedhur që lidhen tek '''$2'''.",
        "isredirect": "faqe përcjellëse",
        "istemplate": "përfshirë",
        "isimage": "Lidhja e dokumentit",
index d802e94..3074297 100644 (file)
        "longpageerror": "<strong>Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.</strong>\nСтраница не може бити сачувана.",
        "readonlywarning": "<strong>Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.</strong>\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nСистемски администратор је навео следеће објашњење: $1",
        "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
-       "semiprotectedpagewarning": "<strong>Ð\9dапомена:</strong> Ð\9eва Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°Ñ\88Ñ\82иÑ\9bена, Ñ\82ако Ð´Ð° Ñ\81амо Ñ\80егиÑ\81Ñ\82Ñ\80овани ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\98е Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð·Ð°Ð¿Ð¸Ñ\81 Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83 Ñ\98е Ð¿Ñ\80иказан Ð¸Ñ\81под:",
+       "semiprotectedpagewarning": "<strong>Ð\9dапомена:</strong> Ð¾Ð²Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\98е Ð·Ð°Ñ\88Ñ\82иÑ\9bена, Ñ\82ако Ð´Ð° Ñ\81амо Ñ\80егиÑ\81Ñ\82Ñ\80овани ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\98е Ñ\83Ñ\80еÑ\92Ñ\83Ñ\98Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð·Ð°Ð¿Ð¸Ñ\81 Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83 Ñ\98е Ð¿Ñ\80иказан Ð¸Ñ\81под ÐºÐ°Ð¾ Ñ\80еÑ\84еÑ\80енÑ\86а:",
        "cascadeprotectedwarning": "<strong>Упозорење:</strong> Ова страница је заштићена тако да је могу уређивати само корисници са [[Special:ListGroupRights|одређеним правима]] (администратори), јер је иста укључена у {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом” заштитом:",
        "titleprotectedwarning": "<strong>Упозорење: ову страницу могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].</strong>\nПоследњи запис у дневнику је приказан испод:",
        "templatesused": "{{PLURAL:$1|Шаблон који се користи|Шаблони који се користе}} на овој страници:",
        "whatlinkshere-title": "Странице које су повезане са „$1”",
        "whatlinkshere-page": "Страница:",
        "linkshere-2": "Следеће странице имају везу до <strong>$1</strong>:",
-       "nolinkshere-2": "Ниједна страница није повезана са: <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Ниједна страница не води до '''$1''' у изабраном именском простору.",
+       "nolinkshere-2": "Ниједна страница није повезана са: <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Ниједна страница не води до '''$2''' у изабраном именском простору.",
        "isredirect": "преусмерење",
        "istemplate": "укључивање",
        "isimage": "веза до датотеке",
index ddd4b1e..9ad3948 100644 (file)
        "whatlinkshere-title": "Stranice koje su povezane sa „$1”",
        "whatlinkshere-page": "Stranica:",
        "linkshere-2": "Sledeće stranice imaju vezu do '''$1''':",
-       "nolinkshere-2": "Nijedna stranica nije povezana sa: '''$1'''.",
-       "nolinkshere-ns-2": "Nijedna stranica ne vodi do '''$1''' u izabranom imenskom prostoru.",
+       "nolinkshere-2": "Nijedna stranica nije povezana sa: '''$2'''.",
+       "nolinkshere-ns-2": "Nijedna stranica ne vodi do '''$2''' u izabranom imenskom prostoru.",
        "isredirect": "preusmerenje",
        "istemplate": "uključivanje",
        "isimage": "veza ka datoteci",
index 7d99603..ae3041b 100644 (file)
        "whatlinkshere": "San e miti kon dyaso",
        "whatlinkshere-title": "Papira di e sori go na $1",
        "linkshere-2": "Den papira disi e miti go na '''$1''':",
-       "nolinkshere-2": "No wan papira e miti kon na '''$1'''.",
+       "nolinkshere-2": "No wan papira e miti kon na '''$2'''.",
        "isredirect": "papira fu drai go",
        "istemplate": "poti leki wan template",
        "whatlinkshere-prev": "{{PLURAL:$1|a wan|den $1}} di psa",
index 78536c6..0db1b16 100644 (file)
        "whatlinkshere-title": "Sieden, do der ap \"$1\" linkje",
        "whatlinkshere-page": "Siede:",
        "linkshere-2": "Do foulgjende Sieden ferwiese hierhäär:  '''$1''': <br /><small>(Moonige Sieden wäide eventuell moorfooldich liested, konnen in säildene Falle oawers uk miste. Dät kumt fon oolde Failere in dän Software häär, man skoadet fääre niks.)</small>",
-       "nolinkshere-2": "Naan Artikkel ferwiest hierhäär: '''$1'''.",
-       "nolinkshere-ns-2": "Neen Siede ferlinket ap '''„$1“''' in dän wäälde Noomensruum.",
+       "nolinkshere-2": "Naan Artikkel ferwiest hierhäär: '''$2'''.",
+       "nolinkshere-ns-2": "Neen Siede ferlinket ap '''„$2“''' in dän wäälde Noomensruum.",
        "isredirect": "Fäärelaitengs-Siede",
        "istemplate": "Foarloagenienbiendenge",
        "isimage": "Doatäilink",
index f76272f..a77076f 100644 (file)
        "whatlinkshere-title": "«$1» питкә йебәргән питләр",
        "whatlinkshere-page": "Пит:",
        "linkshere-2": "''$1''' питкә киләсе питләр тайанатылар:",
-       "nolinkshere-2": "$1 питкә пер питтән тә ссылка йуҡ.",
+       "nolinkshere-2": "$2 питкә пер питтән тә ссылка йуҡ.",
        "isredirect": "йусыҡлау пит",
        "istemplate": "ҡушылыу",
        "isimage": "файллы ссылка",
index 0e93458..04d55e5 100644 (file)
        "subject-preview": "Pramidang subyék:",
        "previewerrortext": "Aya éror nalika nyobaan nyawang robahan anjeun.",
        "blockedtitle": "Pamaké dipeungpeuk",
-       "blockedtext": "'''Ngaran pamaké atawa alamat IP anjeun dipeungpeuk.'''\n\nDipeungpeuk ku $1.\nAlesanana ''$2''.\n\n* Mimiti dipeungpeuk : $8\n* dipeungpeuk kadaluarsa dina: $6\n* Sasaran nudipeungpeuk : $7\n\nAnjeun bisa nepungan $1 atawa salasahiji [[{{MediaWiki:Grouppage-sysop}}|kuncén]] séjén pikeun nyawalakeun hal ieu.\n'''Catet''': yén anjeun teu bisa maké fungsi \"surélékan pamaké ieu\" mun anjeun teu ngadaptarkeun alamat surélék nu sah kana [[Special:Preferences|préferénsi pamaké]] anjeun.\n\nAlamat IP anjeun $3 jeung ID na #$5.\nLampirkeun informasi ieu dina unggal ''query'' anjeun.",
+       "blockedtext": "<strong>Ngaran pamaké atawa alamat IP anjeun dipeungpeuk.</strong>\n\nDipeungpeuk ku $1.\nAlesanana <em>$2</em>.\n\n* Mimiti dipeungpeuk: $8\n* Anggeusan dipeungpeuk: $6\n* Sasaran anu dipeungpeuk: $7\n\nAnjeun bisa ngontak $1 atawa [[{{MediaWiki:Grouppage-sysop}}|kuncén]] lianna pikeun nyawalakeun ieu hal.\nAnjeun teu bisa maké fitur \"{{int:emailuser}}\" mun anjeun teu ngadaptarkeun alamat surélék nu sah dina [[Special:Preferences|préferénsi akun]] anjeun sarta henteu dipeungpeuk tina migunakeun éta fitur.\nAlamat IP anjeun $3, kalayan ID peungpeukna #$5.\nLampirkeun informasi ieu dina unggal kueri anjeun.",
        "autoblockedtext": "Alamat IP anjeun otomatis dipeungpeuk sabab dipaké ku pamaké séjén nu geus dipeungpeuk ku $1, kalawan alesan:\n\n:''$2''\n\n*Mimiti dipeungpeuk: $8\n*Kadaluwarsa peungpeuk: $6\n*Sasaran peungpeuk: $7\n\nAnjeun bisa nepungan $1 atawa [[{{MediaWiki:Grouppage-sysop}}|kuncé]] lianna pikeun ngabadamikeun ieu peungpeukan.\n\nCatet yén anjeun moal bisa migunakeun fitur \"surélékan ieu pamaké\" mun alamat surélék anu didaptarkeun dina [[Special:Preferences|préferénsi pamaké]]na teu sah, sarta teu dipeungpeuk tina migunakeun ieu fitur.\n\nAlamat IP Anjeun ayeuna nyaéta $3, sarta ID peungpeukan anjeun #$5.\nMangga sebatkeun éta ID dina pamundut-pamundut anjeun.",
        "blockednoreason": "taya alesan",
        "whitelistedittext": "Anjeun kudu asup $1 sangkan bisa ngédit.",
        "recentchangeslinked-feed": "Parobahan nu patali",
        "recentchangeslinked-toolbox": "Parobahan nu patali",
        "recentchangeslinked-title": "Parobahan patali ka \"$1\"",
-       "recentchangeslinked-summary": "Ieu kaca husus ngabéréndélkeun parobahan anyar anu numbu ti kaca husus (atawa uesi katagori husus). Kaca anu [[Special:Watchlist|diawaskeun]] némbongan '''kandel'''.",
+       "recentchangeslinked-summary": "Asupkeun ngaran kaca pikeun nempo parobahan anu nutumbu ka atawa ti éta kaca. (Pikeun nempo anggota kategori, asupkeun {{ns:category}}:Ngaran kategori). Parobahan kaca-kaca anu [[Special:Watchlist|diawaskeun]] némbongan <strong>kandel</strong>.",
        "recentchangeslinked-page": "Ngaran kaca:",
        "recentchangeslinked-to": "Témbongkeun parobahan ka kaca-kaca nu ditumbukeun ka kaca nu dimaksud",
        "recentchanges-page-added-to-category": "[[:$1]] ditambahkeun kana kategori",
        "filehist-comment": "Kamandang",
        "imagelinks": "Pamakéan berkas",
        "linkstoimage": "Kaca ieu  {{PLURAL:$1|numbu|$1 numbu}} ka gambar ieu :",
-       "linkstoimage-more": "Leuwih ti $1 {{PLURAL:$1|kaca nutumbu|kaca nutumbu}} ka ieu berkas.\nBéréndélan di handap némbongkeun {{PLURAL:$1|tutumbu kaca kahiji|$1 tutumbu kaca}} ka ieu berkas hungkul.\n[[Special:WhatLinksHere/$2|Béréndélan lengkepna]] aya.",
+       "linkstoimage-more": "Leuwih ti $1 {{PLURAL:$1|kaca nutumbu|kaca nutumbu}} ka ieu berkas.\nBéréndélan di handap némbongkeun {{PLURAL:$1|tutumbu kaca kahiji|$1 tutumbu kaca kahiji}} ka ieu berkas hungkul.\n[[Special:WhatLinksHere/$2|Béréndélan lengkepna]] ogé aya.",
        "nolinkstoimage": "Teu aya kaca anu nutumbu ka ieu berkas.",
        "morelinkstoimage": "Témbong [[Special:WhatLinksHere/$1|tutumbu lianna]] ka ieu berkas.",
        "linkstoimage-redirect": "$1 (pangalihan berkas) $2",
        "unwatchthispage": "Eureun ngawaskeun",
        "notanarticle": "Sanés kaca eusi",
        "notvisiblerev": "Révisi geus dihapus",
-       "watchlist-details": "Aya {{PLURAL:$1|$1 kaca|$1 kaca}} dina daptar awaseun (pleus kaca obrolanna).",
+       "watchlist-details": "Aya {{PLURAL:$1|$1 kaca|$1 kaca}} dina Awaseun anjeun (kaasup kaca obrolan).",
        "wlheader-enotif": "Iber surélék diaktifkeun.",
-       "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
-       "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
+       "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun <strong>kandel</strong>.",
+       "wlnote": "Di handap ieu mangrupa {{PLURAL:$1|robahan|robahan}} <strong>$1</strong> panungtung salila {{PLURAL:$2|jam|<strong>$2</strong> jam}}, ti $3, $4.",
        "wlshowlast": "Témbongkeun $1 jam $2 poé panungtung",
        "watchlist-hide": "Sumputkeun",
        "watchlist-submit": "Témbongkeun",
        "whatlinkshere-title": "Kaca anu nutumbu ka \"$1\"",
        "whatlinkshere-page": "Kaca:",
        "linkshere-2": "Kaca di handap ieu numbu ka '''$1''':",
-       "nolinkshere-2": "Euweuh kaca anu nutumbu ka <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Euweuh kaca anu nutumbu ka <strong>$1</strong> dina ruang-nama anu dipilih.",
+       "nolinkshere-2": "Euweuh kaca anu nutumbu ka <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Euweuh kaca anu nutumbu ka <strong>$2</strong> dina ruang-nama anu dipilih.",
        "isredirect": "Kaca alihan",
        "istemplate": "ku citakan",
        "isimage": "tutumbu berkas",
        "pageinfo-few-visiting-watchers": "Rék aya atawa henteuna pamariksa kaca nu nyorang éditan kiwari",
        "pageinfo-redirects-name": "Jumlah pindahan ka ieu kaca",
        "pageinfo-subpages-name": "Nomor subkaca ieu kaca",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|pindahan|pindahan}}; $3 {{PLURAL:$3|non-pindahan|non-pindahan}})",
        "pageinfo-firstuser": "Panyieun kaca",
        "pageinfo-firsttime": "Tanggal panyieunan kaca",
        "pageinfo-lastuser": "Pangédit panungtung",
index 3765b04..4088a67 100644 (file)
        "dellogpage": "Raderingslogg",
        "dellogpagetext": "Nedan listas de senaste raderingarna.",
        "deletionlog": "raderingslogg",
+       "log-name-create": "Sidskapandelogg",
+       "log-description-create": "Nedan listas de senaste skapade sidorna.",
+       "logentry-create-create": "$1 {{GENDER:$2|skapade}} sidan $3",
        "reverted": "Återgått till tidigare version",
        "deletecomment": "Anledning:",
        "deleteotherreason": "Annan/ytterligare anledning:",
        "whatlinkshere-title": "Sidor som länkar till \"$1\"",
        "whatlinkshere-page": "Sida:",
        "linkshere-2": "Följande sidor länkar till <strong>$1</strong>:",
-       "nolinkshere-2": "Inga sidor länkar till <strong>$1</strong>.",
-       "nolinkshere-ns-2": "Inga sidor i den angivna namnrymden länkar till <strong>$1</strong>.",
+       "nolinkshere-2": "Inga sidor länkar till <strong>$2</strong>.",
+       "nolinkshere-ns-2": "Inga sidor i den angivna namnrymden länkar till <strong>$2</strong>.",
        "isredirect": "omdirigeringssida",
        "istemplate": "inkluderad som mall",
        "isimage": "fillänk",
index ae02942..68ec74d 100644 (file)
        "whatlinkshere-title": "Kurasa zilizounganishwa na \"$1\"",
        "whatlinkshere-page": "Ukurasa:",
        "linkshere-2": "Kurasa zifuatazo zimeunganishwa na '''$1''':",
-       "nolinkshere-2": "Hakuna kurasa zilizounganishwa na '''$1'''.",
-       "nolinkshere-ns-2": "!!FUZZY!!!!FUZZY!!Hakuna kurasa zilizounganishwa na '''$1''' katika eneo la wiki lililochaguliwa.",
+       "nolinkshere-2": "Hakuna kurasa zilizounganishwa na '''$2'''.",
+       "nolinkshere-ns-2": "Hakuna kurasa zilizounganishwa na '''$2''' katika eneo la wiki lililochaguliwa.",
        "isredirect": "elekeza ukurasa",
        "istemplate": "jumuisho",
        "isimage": "kiungo cha faili",
index a393e81..bd5501d 100644 (file)
        "whatlinkshere-title": "Zajty, kere linkujům na \"$1\"",
        "whatlinkshere-page": "Zajta:",
        "linkshere-2": "Nastympůjůnce zajty sóm adrésůwane do '''$1''':",
-       "nolinkshere-2": "Żodno zajta ńy je adrésowana do '''$1'''.",
-       "nolinkshere-ns-2": "Žodno zajta ńy je adresowano do '''$1''' we wybrany přestřyni mjan.",
+       "nolinkshere-2": "Żodno zajta ńy je adrésowana do '''$2'''.",
+       "nolinkshere-ns-2": "Žodno zajta ńy je adresowano do '''$2''' we wybrany přestřyni mjan.",
        "isredirect": "překerowujůnca zajta",
        "istemplate": "dołůnczony muster",
        "isimage": "Link do plika",
index b2ffaad..40681ad 100644 (file)
        "whatlinkshere-title": "\"$1\" பக்கத்துக்கு இணைக்கப்பட்டவை",
        "whatlinkshere-page": "பக்கம்:",
        "linkshere-2": "'''$1''' பின்வரும் பக்கங்களில் இப்பக்கம் இணைக்கப்பட்டுள்ளது:",
-       "nolinkshere-2": "'''$1''' எந்தப் பக்கத்திலும் இந்தப் பக்கம் இணைக்கப்படவில்லை.",
-       "nolinkshere-ns-2": "தெரிவு செய்யப்பட்ட பெயர்வெளியில் '''$1''' பக்கத்துக்கு இணைக்கப்பட்ட பக்கங்கள் எதுவுமில்லை.",
+       "nolinkshere-2": "'''$2''' எந்தப் பக்கத்திலும் இந்தப் பக்கம் இணைக்கப்படவில்லை.",
+       "nolinkshere-ns-2": "தெரிவு செய்யப்பட்ட பெயர்வெளியில் '''$2''' பக்கத்துக்கு இணைக்கப்பட்ட பக்கங்கள் எதுவுமில்லை.",
        "isredirect": "வழிமாற்றுப் பக்கம்",
        "istemplate": "உள்ளிடப்பட்டுள்ளது",
        "isimage": "கோப்பு இணைப்பு",
index 1abd0a4..2bdb839 100644 (file)
        "whatlinkshere-title": "Aniy ’mubuy sa zngayan tay \"$1\"",
        "whatlinkshere-page": "Zngayan",
        "linkshere-2": "Zngayan tay suruw qaniy ga aniy p’ubuy sa <strong>$1</strong>:",
-       "nolinkshere-2": "Ungat zngazyan ’mubuy squw <strong>$1</strong>.",
+       "nolinkshere-2": "Ungat zngazyan ’mubuy squw <strong>$2</strong>.",
        "isredirect": "t’ringun pawsa’ sa zngayan",
        "istemplate": "’nagal sa",
        "isimage": "’ubuy sa biru’ na ana nanu’ zayzyuwaw",
index 581b6af..9e8ee96 100644 (file)
        "whatlinkshere-title": "\"$1\" ಕ್ಕ್ ಸಂಪರ್ಕ ಕೊರ್ಪಿನ ಪುಟೊಕುಲು",
        "whatlinkshere-page": "ಪುಟೊ:",
        "linkshere-2": "</strong>$1<strong>ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಕುಲು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
-       "nolinkshere-2": "'''$1''' ಗ್ ವಾ ಪುಟೊಕುಲೆಡ್ಲಾ ಲಿಂಕ್ ಇಜ್ಜಿ.",
+       "nolinkshere-2": "'''$2''' ಗ್ ವಾ ಪುಟೊಕುಲೆಡ್ಲಾ ಲಿಂಕ್ ಇಜ್ಜಿ.",
        "isredirect": "ಪಿರ ನಿರ್ದೇಶನೊದ ಪುಟೊ",
        "istemplate": "ಸೇರಾವುನೆ",
        "isimage": "ಫೈಲ್‍ದ ಕೊಂಡಿ",
index ad2fb34..17574bf 100644 (file)
        "whatlinkshere-title": "\"$1\"కి లింకున్న పుటలు",
        "whatlinkshere-page": "పేజీ:",
        "linkshere-2": "కింది పేజీల నుండి <strong>$1</strong>కు లింకులు ఉన్నాయి:",
-       "nolinkshere-2": "'''$1'''కు ఏ పేజీ నుండీ లింకు లేదు.",
-       "nolinkshere-ns-2": "'''$1''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
+       "nolinkshere-2": "'''$2'''కు ఏ పేజీ నుండీ లింకు లేదు.",
+       "nolinkshere-ns-2": "'''$2''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
        "isredirect": "దారిమార్పు పుట",
        "istemplate": "పేజీకి జతపరిచారు",
        "isimage": "దస్త్రపు లంకె",
index c7931cf..65a9ecd 100644 (file)
        "whatlinkshere-title": "Саҳифаҳое ки ба $1 пайванд доранд",
        "whatlinkshere-page": "Саҳифа:",
        "linkshere-2": "Саҳифаҳои зерин ба '''$1''' пайванданд:",
-       "nolinkshere-2": "Ягон саҳифа ба '''$1''' пайванд нест.",
-       "nolinkshere-ns-2": "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''$1''' пайванд надорад.",
+       "nolinkshere-2": "Ягон саҳифа ба '''$2''' пайванд нест.",
+       "nolinkshere-ns-2": "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''$2''' пайванд надорад.",
        "isredirect": "саҳифаи тағйири масир",
        "istemplate": "истифодашуда дар саҳифа",
        "isimage": "пайванд ба парванда",
index 129b5a4..3877c1f 100644 (file)
        "whatlinkshere-title": "Sahifahoe ki ba $1 pajvand dorand",
        "whatlinkshere-page": "Sahifa:",
        "linkshere-2": "Sahifahoi zerin ba '''$1''' pajvandand:",
-       "nolinkshere-2": "Jagon sahifa ba '''$1''' pajvand nest.",
-       "nolinkshere-ns-2": "Heç sahifa az fazoinomi intixobşuda ba '''$1''' pajvand nadorad.",
+       "nolinkshere-2": "Jagon sahifa ba '''$2''' pajvand nest.",
+       "nolinkshere-ns-2": "Heç sahifa az fazoinomi intixobşuda ba '''$2''' pajvand nadorad.",
        "isredirect": "sahifai taƣjiri masir",
        "istemplate": "istifodaşuda dar sahifa",
        "isimage": "pajvandi aks",
index 9671e93..8e78d70 100644 (file)
        "whatlinkshere-title": "หน้าที่ลิงก์มา \"$1\"",
        "whatlinkshere-page": "หน้า:",
        "linkshere-2": "หน้าต่อไปนี้ลิงก์มา <strong>$1</strong>:",
-       "nolinkshere-2": "ไม่มีหน้าใดลิงก์มา <strong>$1</strong>",
-       "nolinkshere-ns-2": "ไม่มีหน้าใดลิงก์มา <strong>$1</strong> ในเนมสเปซที่เลือก",
+       "nolinkshere-2": "ไม่มีหน้าใดลิงก์มา <strong>$2</strong>",
+       "nolinkshere-ns-2": "ไม่มีหน้าใดลิงก์มา <strong>$2</strong> ในเนมสเปซที่เลือก",
        "isredirect": "หน้าเปลี่ยนทาง",
        "istemplate": "โดยใช้แม่แบบ",
        "isimage": "ลิงก์ไฟล์",
index 6d99da1..98e1cd2 100644 (file)
        "whatlinkshere-title": "\"$1\" makalasyna çykgyt berýän sahypalar",
        "whatlinkshere-page": "Sahypa:",
        "linkshere-2": "'''$1''' sahypasyna çykgyt berýän sahypalar:",
-       "nolinkshere-2": "'''$1''' sahypasyna çykgyt berýän sahypa ýok.",
-       "nolinkshere-ns-2": "Saýlanyp alynan at giňişliginde hiçbir sahypa '''$1''' sahypasyna çykgyt bermeýär.",
+       "nolinkshere-2": "'''$2''' sahypasyna çykgyt berýän sahypa ýok.",
+       "nolinkshere-ns-2": "Saýlanyp alynan at giňişliginde hiçbir sahypa '''$2''' sahypasyna çykgyt bermeýär.",
        "isredirect": "gönükdirme sahypasy",
        "istemplate": "atanaklaýyn girizme",
        "isimage": "faýl çykgydy",
index d3c3087..1ecb740 100644 (file)
        "whatlinkshere-title": "Mga pahinang kumakawing sa $1",
        "whatlinkshere-page": "Pahina:",
        "linkshere-2": "Nakakawing ang sumusunod na mga pahina sa '''$1''':",
-       "nolinkshere-2": "Walang pahinang nakakawing sa '''$1'''.",
-       "nolinkshere-ns-2": "Walang pahinang nakakawing sa '''$1''' mula sa loob ng napiling espasyo ng pangalan.",
+       "nolinkshere-2": "Walang pahinang nakakawing sa '''$2'''.",
+       "nolinkshere-ns-2": "Walang pahinang nakakawing sa '''$2''' mula sa loob ng napiling espasyo ng pangalan.",
        "isredirect": "pahinang panturo/panuto",
        "istemplate": "pagsasali",
        "isimage": "link ng file",
index fe377e5..e15dc54 100644 (file)
        "whatlinkshere-title": "Сәһифон, сәбон вардән бә \"$1\"",
        "whatlinkshere-page": "Сәһифә:",
        "linkshere-2": "Ым сәһифон сәбон вардән ијо ''$1''':",
-       "nolinkshere-2": "Бә ым сәһифә ҹо сәһифонку сәбонон нин '''$1'''.",
+       "nolinkshere-2": "Бә ым сәһифә ҹо сәһифонку сәбонон нин '''$2'''.",
        "isredirect": "унвони дәгиш кардә сәһифәје",
        "istemplate": "әловә",
        "isimage": "фајлинә сәбон",
index 7e5c073..475f797 100644 (file)
        "customcssprotected": "Bu sayfayı değiştirmeye yetkiniz bulunmamaktadır, çünkü bu sayfa başka bir kullanıcının kişisel ayarlarını içermektedir.",
        "customjsprotected": "Bu Java Script sayfasını değiştirmeye yetkiniz bulunmamaktadır, çünkü bu sayfa başka bir kullanıcının kişisel ayarlarını içermektedir.",
        "mycustomcssprotected": "Bu CSS sayfasını değiştirmeye yetkiniz yok.",
+       "mycustomjsonprotected": "Bu JSON sayfasını düzenleme izniniz yok.",
        "mycustomjsprotected": "Bu JavaScript sayfasını değiştirmeye yetkiniz yok.",
        "myprivateinfoprotected": "Sizin özel bilgilerinizi düzenleme yetkiniz yok.",
        "mypreferencesprotected": "Tercihlerinizi düzenlemek için yetkiniz yok.",
        "wrongpasswordempty": "Boş parola girdiniz. Lütfen tekrar deneyiniz.",
        "passwordtooshort": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
        "passwordtoolong": "Parolalar $1 karakterden uzun olamaz.",
-       "passwordtoopopular": "Sıklıkla seçilen parolalar kullanılamaz. Lütfen daha özgün bir parola belirleyin.",
+       "passwordtoopopular": "Yaygın olarak seçilen şifreler kullanılamaz. Lütfen tahmin edilmesi daha zor bir şifre seçin.",
        "password-name-match": "Parolanız kullanıcı adınızdan farklı olmalıdır.",
        "password-login-forbidden": "Bu kullanıcı adı ve parolanın kullanımı yasaklanmıştır.",
        "mailmypassword": "Parolayı sıfırla",
        "passwordremindertitle": "{{SITENAME}} için yeni geçici parola",
-       "passwordremindertext": "Birisi (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için yeni bir parola gönderilmesi istedi. \"$2\" kullanıcısına geçici olarak \"$3\" parolası oluşturuldu. Eğer bu sizin isteğiniz ise, oturum açıp yeni bir parola oluşturmanız gerekmektedir. Geçici parolanızın süresi {{PLURAL:$5|1 gün|$5 gün}} içinde dolacaktır.\n\nParola değişimini siz istemediyseniz veya parolanızı hatırladıysanız ve artık parolanızı değiştirmek istemiyorsanız; bu mesajı önemsemeyerek eski parolanızı kullanmaya devam edebilirsiniz.",
+       "passwordremindertext": "Birisi ($1 IP adresinden) {{SITENAME}} ($4) için yeni bir parola gönderilmesi istedi. \"$2\" kullanıcısına geçici olarak \"$3\" parolası oluşturuldu. Eğer bu sizin isteğiniz ise, oturum açıp yeni bir parola oluşturmanız gerekmektedir. Geçici parolanızın süresi {{PLURAL:$5|1 gün|$5 gün}} içinde dolacaktır.\n\nParola değişimini siz istemediyseniz veya parolanızı hatırladıysanız ve artık parolanızı değiştirmek istemiyorsanız; bu mesajı önemsemeyerek eski parolanızı kullanmaya devam edebilirsiniz.",
        "noemail": "\"$1\" adlı kullanıcıya kayıtlı bir e-posta adresi yok.",
        "noemailcreate": "Geçerli bir e-posta adresi sağlamalısınız",
        "passwordsent": "\"$1\" adına kayıtlı e-posta adresine yeni bir parola gönderildi. Oturumu, lütfen, iletiyi aldıktan sonra açın.",
        "botpasswords-insert-failed": "Bot adı \"$1\" eklenemedi. Zaten eklenmiş olmalı?",
        "botpasswords-update-failed": "Bot ismini \"$1\" olarak güncelleme başarısız oldu. Silinmiş olabilir mi?",
        "botpasswords-created-title": "Bot parolası oluşturuldu",
-       "botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" adlı botu için bot parolası oluşturuldu.",
+       "botpasswords-created-body": "\"$2\" adlı {{GENDER:$2|kullanıcının}} \"$1\" adlı botu için bot parolası oluşturuldu.",
        "botpasswords-updated-title": "Bot parolası güncellendi",
-       "botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası güncellendi.",
+       "botpasswords-updated-body": "\"$2\" adlı {{GENDER:$2|kullanıcının}} \"$1\" adlı botunun bot parolası güncellendi.",
        "botpasswords-deleted-title": "Bot parolası silindi",
        "botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" adlı botunun bot parolası silindi.",
        "botpasswords-newpassword": "<strong>$1</strong> ile oturum açmak için yeni şifre: <strong>$2</strong>. <em>İlerde başvurmak için lütfen kaydedin.</em>",
        "rcfilters-filter-minor-description": "Yazarın küçük olarak etiketlediği düzenlemeler.",
        "rcfilters-filter-major-label": "Küçük olmayan düzenlemeler",
        "rcfilters-filter-major-description": "Küçük olarak etiketlenmemiş düzenlemeler.",
+       "rcfilters-filtergroup-watchlist": "İzlenen sayfalar",
        "rcfilters-filter-watchlist-watched-label": "İzleme listesinde",
+       "rcfilters-filter-watchlist-watched-description": "İzleme listenizdeki sayfalarda değişiklikler.",
+       "rcfilters-filter-watchlist-watchednew-label": "Yeni İzleme listesi değişiklikleri",
+       "rcfilters-filter-watchlist-watchednew-description": "Değişiklikler gerçekleştiğinden beri ziyaret etmediğiniz izleme listenizdeki sayfalarda yapılan değişiklikler.",
        "rcfilters-filter-watchlist-notwatched-label": "İzleme listesinde değil",
+       "rcfilters-filter-watchlist-notwatched-description": "İzleme listenizdeki sayfalardaki değişiklikler hariç her şey.",
        "rcfilters-filtergroup-watchlistactivity": "İzleme listesi faaliyetleri",
        "rcfilters-filter-watchlistactivity-unseen-label": "Görülmemiş değişiklikler",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Değişiklikler gerçekleştiğinden beri ziyaret etmediğiniz sayfalardaki değişiklikler.",
        "rcfilters-filter-watchlistactivity-seen-label": "Görülmüş değişiklikler",
        "rcfilters-filtergroup-changetype": "Değişiklik türü",
        "rcfilters-filter-pageedits-label": "Sayfa düzenlemeleri",
        "rcfilters-exclude-button-off": "Seçileni hariç tut",
        "rcfilters-exclude-button-on": "Seçilen hariç",
        "rcfilters-view-tags": "Etiketli düzenlemeler",
+       "rcfilters-view-namespaces-tooltip": "Sonuçları ad alanına göre filtrele",
+       "rcfilters-view-tags-tooltip": "Sonuçları düzenleme etiketlerini kullanarak filtrele",
+       "rcfilters-view-return-to-default-tooltip": "Ana filtre menüsüne dön",
+       "rcfilters-view-tags-help-icon-tooltip": "Etiketli düzenlemeler hakkında daha fazla bilgi edin",
        "rcfilters-liveupdates-button": "Canlı güncelleme",
        "rcfilters-liveupdates-button-title-on": "Canlı güncellemeyi kapat",
        "rcfilters-liveupdates-button-title-off": "Yeni değişiklikleri yapıldıkları anda görüntüleyin",
        "rcfilters-watchlist-markseen-button": "Tüm değişiklileri görüldü olarak işaretle",
+       "rcfilters-watchlist-edit-watchlist-button": "İzlenen sayfaların listesini düzenle",
        "rcfilters-target-page-placeholder": "Bir sayfa (ya da kategori) adı girin",
        "rcnotefrom": "<strong>$3, $4</strong> tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır (<strong>$1</strong> tarhine kadar olanlar gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "apisandbox-examples": "Örnekler",
        "apisandbox-dynamic-parameters-add-label": "Parametre ekle:",
        "apisandbox-dynamic-parameters-add-placeholder": "Parametre adı",
+       "apisandbox-add-multi": "Ekle",
+       "apisandbox-submit-invalid-fields-title": "Bazı alanlar geçersiz",
        "apisandbox-results": "Sonuçlar",
        "apisandbox-request-url-label": "İstek URL:",
        "apisandbox-request-time": "İstek zamanı: $1",
        "whatlinkshere-page": "Sayfa:",
        "linkshere-2": "'''$1''' sayfasına bağlantısı olan sayfalar:",
        "nolinkshere-2": "'''$1''' sayfasına bağlantı veren sayfa yok.",
-       "nolinkshere-ns-2": "Seçilen ad alanında hiçbir sayfa '''$1''' sayfasına bağlanmıyor.",
+       "nolinkshere-ns-2": "Seçilen ad alanında hiçbir sayfa '''$2''' sayfasına bağlanmıyor.",
        "isredirect": "yönlendirme sayfası",
        "istemplate": "dönüştürülme",
        "isimage": "dosya bağlantısı",
index b262214..29466ce 100644 (file)
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|көн}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сәгать}}",
        "rcfilters-quickfilters": "Сакланган фильтрлар",
+       "rcfilters-quickfilters-placeholder-title": "Әлегә сакланылган фильтрлар юк",
        "rcfilters-savedqueries-remove": "Бетерү",
        "rcfilters-savedqueries-new-name-label": "Исем",
        "rcfilters-savedqueries-cancel-label": "Баш тарту",
        "protect-otherreason-op": "Башка сәбәп",
        "protect-dropdown": "* Гади яклау сәбәпләре\n** вандаллык\n** зур спам\n** кирәксез үзгәртүләр саны\n** популяр бит",
        "protect-edit-reasonlist": "Сәбәпләр исемлеген үзгәртү",
-       "protect-expiry-options": "1 сәгать:1 hour,1 көн:1 day,1 атна:1 week,2 атна:2 weeks,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 ел:1 year,вакытсыз:infinite",
+       "protect-expiry-options": "1 сәгать:1 hour,1 көн:1 day,1 атна:1 week,2 атна:2 weeks,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 ел:1 year,чикләүсез:infinite",
        "restriction-type": "Рөхсәт:",
        "restriction-level": "Мөмкинлек дәрәҗәсе:",
        "minimum-size": "Иң кечкенә зурлык",
        "sp-contributions-username": "Кулланучының IP адресы яки исеме:",
        "sp-contributions-toponly": "Соңгы юрамадагы үзгәртүләр генә күрсәтелсен",
        "sp-contributions-newonly": "Битләр ясау үзгәртмәләрен генә күрсәтү",
+       "sp-contributions-hideminor": "Кече үзгәртүләрне яшерергә",
        "sp-contributions-submit": "Эзләү",
        "whatlinkshere": "Бирегә нәрсә сылтый",
        "whatlinkshere-title": "$1 битенә сылтый торган битләр",
        "ipbenableautoblock": "Кулланучы кулланган IP адресларын автоматик рәвештә тыю",
        "ipbsubmit": "Бу кулланучыны тыю",
        "ipbother": "Башка вакыт:",
-       "ipboptions": "2 сәгать:2 hours,1 көн:1 day,3 көн:3 days,1 атна:1 week,2 атна:2 weeks,1 ай:1 month,3ай:3 months,6 ай:6 months,1 ел:1 year,чикләнмәгән:infinite",
+       "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": "Ялгыш IP адресы",
        "blockipsuccesssub": "Тыю башкарылган",
        "special-characters-group-lao": "Лаос",
        "special-characters-group-khmer": "Кһмер",
        "special-characters-group-canadianaboriginal": "Канада иҗек язуы",
+       "mw-widgets-dateinput-no-date": "Дата сайланмаган",
+       "mw-widgets-dateinput-placeholder-day": "ЕЕЕЕ-АА-КК",
+       "mw-widgets-dateinput-placeholder-month": "ЕЕЕЕ-АА",
+       "date-range-from": "Башлангыч дата:",
+       "date-range-to": "Соңгы дата:",
        "randomrootpage": "Очраклы төп бит",
        "log-action-filter-all": "Барысы",
        "log-action-filter-block-block": "Тыю",
index 0200aee..7b22d5a 100644 (file)
        "whatlinkshere-page": "بەت:",
        "linkshere-2": "تۆۋەندىكى بەتلەر '''$1'''غا ئۇلانغان:",
        "nolinkshere-2": "'''$1'''غا ئۇلانغان بەت يوق.",
-       "nolinkshere-ns-2": "تاللانغان ئات بوشلۇقىدا '''$1''' غا ئۇلانغان بەت يوق.",
+       "nolinkshere-ns-2": "تاللانغان ئات بوشلۇقىدا '''$2''' غا ئۇلانغان بەت يوق.",
        "isredirect": "قايتا نىشان بەلگىلەنگەن بەت",
        "istemplate": "ئۆز ئىچىگە ئالغان",
        "isimage": "ھۆججەت ئۇلانما",
index e62ebec..a8fe9b5 100644 (file)
        "whatlinkshere-page": "Сторінка:",
        "linkshere-2": "Такі сторінки посилаються на '''$1''':",
        "nolinkshere-2": "На статтю '''$1''' не вказує жодна стаття.",
-       "nolinkshere-ns-2": "У вибраному просторі назв нема сторінок, що посилаються на '''$1'''.",
+       "nolinkshere-ns-2": "У вибраному просторі назв нема сторінок, що посилаються на '''$2'''.",
        "isredirect": "сторінка-перенаправлення",
        "istemplate": "включення",
        "isimage": "посилання на файл",
index fa0f81b..9a3c4c8 100644 (file)
        "whatlinkshere-page": "صفحہ:",
        "linkshere-2": "<strong>$1</strong> سے درج ذیل صفحات مربوط ہیں:",
        "nolinkshere-2": "<strong>$1</strong> سے کوئی صفحہ مربوط نہیں ہے۔",
-       "nolinkshere-ns-2": "منتخب نام فضا میں <strong>$1</strong> سے مربوط کوئی صفحہ نہیں ہے۔",
+       "nolinkshere-ns-2": "منتخب نام فضا میں <strong>$2</strong> سے مربوط کوئی صفحہ نہیں ہے۔",
        "isredirect": "رجوع مکرر صفحہ",
        "istemplate": "شامل شدہ",
        "isimage": "فائل کا ربط",
index 71afccf..b9b1fad 100644 (file)
        "whatlinkshere-page": "Sahifa:",
        "linkshere-2": "Quyidagi sahifalar '''$1''' sahifasiga bogʻlangan:",
        "nolinkshere-2": "'''$1''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
-       "nolinkshere-ns-2": "Tanlangan nomfazoda '''$1'''ga bog‘langan sahifalar mavjud emas.",
+       "nolinkshere-ns-2": "Tanlangan nomfazoda '''$2'''ga bog‘langan sahifalar mavjud emas.",
        "isredirect": "yoʻnaltiruvchi sahifa",
        "istemplate": "qoʻshimcha",
        "isimage": "faylli havola",
index 5b5357a..393c186 100644 (file)
        "whatlinkshere-page": "Pagina:",
        "linkshere-2": "Ste pagine qua le ponta a '''$1''':",
        "nolinkshere-2": "Nissuna pagina la contien colegamenti che punta a '''$1'''.",
-       "nolinkshere-ns-2": "No ghe xe pagine che punta a '''$1''' nel namespace selezionà.",
+       "nolinkshere-ns-2": "No ghe xe pagine che punta a '''$2''' nel namespace selezionà.",
        "isredirect": "Pagina de rimando",
        "istemplate": "inclusion",
        "isimage": "colegamento verso file",
index 28e0f1d..f271042 100644 (file)
        "whatlinkshere-page": "Lehtpol’:",
        "linkshere-2": "Nened lehtpoled kosketadas '''$1''':",
        "nolinkshere-2": "'''$1'''-lehtpol't ei kosketa ni üks' lehtpol'.",
-       "nolinkshere-ns-2": "'''$1'''-lehtpol't ei kosketa ni üks' lehtpol' valitud nimiavarudes.",
+       "nolinkshere-ns-2": "'''$2'''-lehtpol't ei kosketa ni üks' lehtpol' valitud nimiavarudes.",
        "isredirect": "Oigendai lehtpol'",
        "istemplate": "mülütand",
        "isimage": "Kosketuz failale",
index 097cc73..77d540f 100644 (file)
        "whatlinkshere-page": "Trang:",
        "linkshere-2": "Các trang sau liên kết đến '''$1''':",
        "nolinkshere-2": "Không có trang nào liên kết đến '''$1'''.",
-       "nolinkshere-ns-2": "Không có trang nào liên kết đến '''$1''' trong không gian tên đã chọn.",
+       "nolinkshere-ns-2": "Không có trang nào liên kết đến '''$2''' trong không gian tên đã chọn.",
        "isredirect": "trang đổi hướng",
        "istemplate": "được nhúng vào",
        "isimage": "liên kết tập tin",
index 3526cd8..36701d0 100644 (file)
        "whatlinkshere-page": "Pad:",
        "linkshere-2": "Pads sököl payümons ko '''$1''':",
        "nolinkshere-2": "Pads nonik peyümons lü '''$1'''.",
-       "nolinkshere-ns-2": "Pads nonik yumons lü pad: '''$1''' in nemaspad pevälöl.",
+       "nolinkshere-ns-2": "Pads nonik yumons lü pad: '''$2''' in nemaspad pevälöl.",
        "isredirect": "lüodükömapad",
        "istemplate": "ninükam",
        "isimage": "yüm ragiva",
index fbac9a3..b440b81 100644 (file)
        "whatlinkshere-page": "Leht:",
        "linkshere-2": "Lehe <b>$1</b> pääle näütäseq lingiq lehti päält:",
        "nolinkshere-2": "Lehe <b>$1</b> pääle näütä-i linke ütegi lehe päält.",
-       "nolinkshere-ns-2": "Valitun nimeruumin näütä-i ütegi lehe päält linke lehe '''$1''' pääle.",
+       "nolinkshere-ns-2": "Valitun nimeruumin näütä-i ütegi lehe päält linke lehe '''$2''' pääle.",
        "isredirect": "ümbresaatmislehekülg",
        "istemplate": "pruugit näüdüssen",
        "isimage": "teedüstülink",
index 80f245a..1b58d1d 100644 (file)
        "whatlinkshere-page": "Xët :",
        "linkshere-2": "Xët yii ci suuf am nañ ab lëkkalekaay buy jëm <b>$1</b> :",
        "nolinkshere-2": "Amul wenn xët wu lëkkalook wii <b>$1</b>.",
-       "nolinkshere-ns-2": "Amul wenn xët wu lëkkalook wii '''$1''' ci barabu tur bi nga tànn.",
+       "nolinkshere-ns-2": "Amul wenn xët wu lëkkalook wii '''$2''' ci barabu tur bi nga tànn.",
        "isredirect": "Xëtu jubluwaat",
        "istemplate": "mboole",
        "isimage": "lëkkalekaayu dencukaay bi",
index bbd22ed..25e900d 100644 (file)
        "whatlinkshere-page": "בלאַט:",
        "linkshere-2": "די פאָלגנדיקע בלעטער פאַרבינדן צום בלאַט '''$1''':",
        "nolinkshere-2": "קיין שום בלאַט פאַרבינדט נישט צו '''$1'''.",
-       "nolinkshere-ns-2": "קיין בלעטער פאַרבינדן נישט צו '''$1''' אינעם אויסגעקליבענעם נאָמענטייל.",
+       "nolinkshere-ns-2": "קיין בלעטער פאַרבינדן נישט צו <strong>$2</strong> אינעם אויסגעקליבענעם נאָמענטייל.",
        "isredirect": "ווײַטערפירן בלאט",
        "istemplate": "אײַנשליסן",
        "isimage": "!טעקע לינק",
index 0618976..f7c46ff 100644 (file)
        "whatlinkshere-page": "Ojúewé:",
        "linkshere-2": "Àwọn ojúewé wọ̀nyí jápọ̀ mọ́ '''$1''':",
        "nolinkshere-2": "Kò sí ojúewé tó jápọ̀ mọ́ '''$1'''.",
-       "nolinkshere-ns-2": "Kò sí ojúewé kankan tó jápọ̀ mọ́ '''$1''' nínú orúkọàyè yíyàn.",
+       "nolinkshere-ns-2": "Kò sí ojúewé kankan tó jápọ̀ mọ́ '''$2''' nínú orúkọàyè yíyàn.",
        "isredirect": "àtúnjúwe ojúewé",
        "istemplate": "ìkómọ́ra",
        "isimage": "ìjápọ̀ fáìlì",
index 243da62..ac3b4c7 100644 (file)
        "whatlinkshere-page": "頁:",
        "linkshere-2": "呢啲頁連結到'''$1''':",
        "nolinkshere-2": "無一頁連結到'''$1'''。",
-       "nolinkshere-ns-2": "響已經揀咗嘅空間名無嘢連結到'''$1'''。",
+       "nolinkshere-ns-2": "響已經揀咗嘅空間名無嘢連結到'''$2'''。",
        "isredirect": "跳轉頁",
        "istemplate": "包含",
        "isimage": "檔案連結",
index f81d57a..50cc2fb 100644 (file)
        "dellogpage": "删除日志",
        "dellogpagetext": "下面是最近的删除的列表。",
        "deletionlog": "删除日志",
+       "log-name-create": "页面创建日志",
+       "log-description-create": "下方是最近的页面创建列表。",
+       "logentry-create-create": "$1{{GENDER:$2|创建了}}页面$3",
        "reverted": "恢复到较早的版本",
        "deletecomment": "原因:",
        "deleteotherreason": "其他/附加原因:",
        "whatlinkshere-page": "页面:",
        "linkshere-2": "以下页面链接至<strong>$1</strong>:",
        "nolinkshere-2": "没有页面链接至<strong>$1</strong>。",
-       "nolinkshere-ns-2": "在所选的名字空间内没有页面链接到<strong>$1</strong>。",
+       "nolinkshere-ns-2": "在所选的名字空间内没有页面链接到<strong>$2</strong>。",
        "isredirect": "重定向页面",
        "istemplate": "嵌入",
        "isimage": "文件链接",
        "watchlistedit-clear-done": "您的监视列表已清空。",
        "watchlistedit-clear-jobqueue": "您的监视列表正在清空。这需要花一些时间!",
        "watchlistedit-clear-removed": "$1个标题已移除:",
-       "watchlistedit-too-many": "这里显示了太多页面。",
+       "watchlistedit-too-many": "页面太多,无法显示。",
        "watchlisttools-clear": "清空监视列表",
        "watchlisttools-view": "查看相关更改",
        "watchlisttools-edit": "查看并编辑监视列表",
index 5faa030..0955a7e 100644 (file)
        "dellogpage": "刪除日誌",
        "dellogpagetext": "以下為最近刪除記錄的清單。",
        "deletionlog": "刪除日誌",
+       "log-name-create": "頁面建立日誌",
+       "log-description-create": "以下為最近頁面建立的清單。",
+       "logentry-create-create": "$1 {{GENDER:$2|已建立}}頁面 $3",
        "reverted": "還原到較早的版本",
        "deletecomment": "原因:",
        "deleteotherreason": "其它/額外的原因:",
        "whatlinkshere-page": "頁面:",
        "linkshere-2": "以下頁面連結至 <strong>$1</strong>:",
        "nolinkshere-2": "沒有頁面連結至 <strong>$1</strong>。",
-       "nolinkshere-ns-2": "已選擇的命名空間中沒有頁面連結到 $1。",
+       "nolinkshere-ns-2": "已選擇的命名空間中沒有頁面連結到 <strong>$2</strong>。",
        "isredirect": "重新導向頁面",
        "istemplate": "引用",
        "isimage": "檔案連結",
        "watchlistedit-clear-done": "已清空您的監視清單。",
        "watchlistedit-clear-jobqueue": "您的監視列表正在清空。這需要花一些時間!",
        "watchlistedit-clear-removed": "已移除 $1 個標題:",
-       "watchlistedit-too-many": "太多要在此處顯示的頁面。",
+       "watchlistedit-too-many": "頁面太多,無法顯示。",
        "watchlisttools-clear": "清空監視清單",
        "watchlisttools-view": "檢視相關變更",
        "watchlisttools-edit": "檢視並編輯監視清單",
index d82cde7..5c69ac3 100644 (file)
@@ -194,5 +194,5 @@ $specialPageAliases = [
 # South Africa uses space for thousands and comma for decimal
 # Reference: AWS Reël 7.4 p. 52, 2002 edition
 # glibc is wrong in this respect in some versions
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $linkTrail = "/^([a-z]+)(.*)$/sD";
index ea807fd..c54c613 100644 (file)
@@ -65,7 +65,7 @@ $dateFormats = [
 
 # Per discussion on https://translatewiki.net/wiki/Thread:Support/Customization_of number format
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", # nbsp
+       ',' => "\u{00A0}", # nbsp
        '.' => ','
 ];
 
index ee2bbb3..00295fe 100644 (file)
@@ -233,7 +233,7 @@ $dateFormats = [
 ];
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", # nbsp
+       ',' => "\u{00A0}", # nbsp
        '.' => ','
 ];
 $minimumGroupingDigits = 2;
index 383a3cd..5c49964 100644 (file)
@@ -217,5 +217,5 @@ $bookstoreList = [
 
 $linkTrail = '/^([a-zабвгдежзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $minimumGroupingDigits = 2;
index d7614cc..2aef1ed 100644 (file)
@@ -164,5 +164,5 @@ $dateFormats = [
        'dmy both' => 'j M Y "da" H:i',
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $linkTrail = "/^((?:c\'h|C\'H|C\'h|c’h|C’H|C’h|[a-zA-ZàâçéèêîôûäëïöüùñÇÉÂÊÎÔÛÄËÏÖÜÀÈÙÑ])+)(.*)$/sDu";
diff --git a/languages/messages/MessagesBtm.php b/languages/messages/MessagesBtm.php
new file mode 100644 (file)
index 0000000..c2d1d6c
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Mandailing (Batak Mandailing)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'id';
index affcc83..6a2e41d 100644 (file)
@@ -383,4 +383,4 @@ $bookstoreList = [
 # Písmena, která se mají objevit jako část odkazu ve formě '[[jazyk]]y' atd:
 $linkTrail = '/^([a-záčďéěíňóřšťúůýž]+)(.*)$/sDu';
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
index 0ce25e2..2e96cc8 100644 (file)
@@ -275,7 +275,7 @@ $magicWords = [
        'url_query'                 => [ '0', 'INFORMPETO', 'QUERY' ],
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $datePreferences = false;
 $defaultDateFormat = 'dmy';
index e0676a6..0d8258e 100644 (file)
@@ -302,7 +302,7 @@ $dateFormats = [
        'dmy both' => 'H:i j M Y',
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $minimumGroupingDigits = 2;
 
 $linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
index d2f8f32..63365fd 100644 (file)
@@ -258,7 +258,7 @@ $magicWords = [
        'formatdate'                => [ '0', 'kuupäevavormindus', 'formatdate', 'dateformat' ],
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $minimumGroupingDigits = 2;
 
 $linkTrail = '/^([äöõšüža-z]+)(.*)$/sDu';
index b019fd6..5fbc47b 100644 (file)
@@ -245,7 +245,7 @@ $magicWords = [
        'protectionlevel'           => [ '1', 'SUOJAUSTASO', 'PROTECTIONLEVEL' ],
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $datePreferences = [
        'default',
index 3e3cf80..9844a5e 100644 (file)
@@ -316,4 +316,4 @@ $dateFormats = [
        'ymd both' => 'Y F j à H:i',
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
index 0ac1caf..fc160b4 100644 (file)
@@ -301,4 +301,4 @@ $dateFormats = [
        'ymd both' => 'Y F j "a" H:i',
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
index 9846686..717538b 100644 (file)
@@ -104,4 +104,4 @@ $dateFormats = [
        'dmy both' => 'j "di" M Y "a lis" H:i',
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
index 7fcfad8..6cab75d 100644 (file)
@@ -40,7 +40,7 @@ $namespaceAliases = [
 ];
 
 $fallback8bitEncoding = "iso8859-2";
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $specialPageAliases = [
        'Activeusers'               => [ 'Aktív_felhasználók', 'Aktív_szerkesztők' ],
index 34306d3..1eeaa60 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", # nbsp
+       ',' => "\u{00A0}", # nbsp
        '.' => ','
 ];
 $minimumGroupingDigits = 2;
index c3a2905..3192e2a 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $namespaceNames = [
        NS_MEDIA            => 'Multimedia',
index e73a2fc..fdbce22 100644 (file)
@@ -32,7 +32,7 @@ $namespaceAliases = [
        'Discussioni_immagine' => NS_FILE_TALK,
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $dateFormats = [
        'mdy time' => 'H:i',
index 2c7cb9e..397af46 100644 (file)
@@ -11,7 +11,7 @@
 $fallback = 'kk-latn, kk-cyrl';
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0",
+       ',' => "\u{00A0}",
        '.' => ',',
 ];
 $minimumGroupingDigits = 2;
index c559d02..aeaa06a 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0",
+       ',' => "\u{00A0}",
        '.' => ',',
 ];
 $minimumGroupingDigits = 2;
index 36e8ecb..9c2b84e 100644 (file)
@@ -15,7 +15,7 @@
 $fallback = 'kk-cyrl';
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0",
+       ',' => "\u{00A0}",
        '.' => ',',
 ];
 
index 291ed14..c96c94d 100644 (file)
@@ -94,7 +94,7 @@ $namespaceAliases = [
        'Katejorije_Klaaf'      => NS_CATEGORY_TALK,
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $minimumGroupingDigits = 2;
 
 $linkTrail = '/^([äöüėëijßəğåůæœça-z]+)(.*)$/sDu';
index 1fa3e11..e6bedd0 100644 (file)
@@ -51,7 +51,7 @@ $namespaceAliases = [
        'Disputatio_Imaginis' => NS_FILE_TALK,
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0" ];
+$separatorTransformTable = [ ',' => "\u{00A0}" ];
 
 $dateFormats = [
        'mdy time' => 'H:i',
index 9b4aa82..ae72fac 100644 (file)
@@ -12,7 +12,7 @@
 $fallback = 'ru';
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", # nbsp
+       ',' => "\u{00A0}", # nbsp
        '.' => ','
 ];
 
index 6a71ca7..a92dc02 100644 (file)
@@ -19,4 +19,4 @@ $namespaceGenderAliases = [];
 $linkPrefixExtension = true;
 
 # Same as the French (T10485)
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
index b79f9d8..68d41c0 100644 (file)
@@ -171,7 +171,7 @@ $magicWords = [
 ];
 
 $fallback8bitEncoding = 'windows-1257';
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $dateFormats = [
        'ymd time' => 'H:i',
index 94aac60..6d8e198 100644 (file)
@@ -63,7 +63,7 @@ $namespaceGenderAliases = [
        NS_USER_TALK => [ 'male' => 'Dalībnieka_diskusija', 'female' => 'Dalībnieces_diskusija' ]
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 /**
  * A list of date format preference keys, which can be selected in user
index b51839d..c172d08 100644 (file)
@@ -323,6 +323,6 @@ $digitTransformTable = [
        '9' => '९', # &#x096f;
 ];
 
-$linkTrail = "/^([\xE0\xA4\x80-\xE0\xA5\xA3\xE0\xA5\xB1-\xE0\xA5\xBF\xEF\xBB\xBF\xE2\x80\x8D]+)(.*)$/sDu";
+$linkTrail = "/^([\u{0900}-\u{0963}\u{0971}-\u{097F}\u{FEFF}\u{200D}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
index 66f0527..002dcac 100644 (file)
@@ -82,7 +82,7 @@ $namespaceAliases = [
        'Bildediskusjon' => NS_FILE_TALK,
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
 
 $datePreferenceMigrationMap = [
index 816cff0..9107b9a 100644 (file)
@@ -317,7 +317,7 @@ $specialPageAliases = [
 ];
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0",
+       ',' => "\u{00A0}",
        '.' => ','
 ];
 $linkTrail = '/^([æøåa-z]+)(.*)$/sDu';
index eb8ed88..16edc8e 100644 (file)
@@ -286,6 +286,6 @@ $dateFormats = [
        'oc normal both' => 'j F "de" Y "a" H.i',
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $linkTrail = "/^([a-zàâçéèêîôû]+)(.*)$/sDu";
index 1af008f..dcc9a44 100644 (file)
@@ -121,7 +121,7 @@ $dateFormats = [
 $fallback8bitEncoding = 'iso-8859-2';
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // T4749
+       ',' => "\u{00A0}", // T4749
        '.' => ','
 ];
 $minimumGroupingDigits = 2;
index 78503cc..f57f322 100644 (file)
@@ -110,7 +110,7 @@ $dateFormats = [
        'dmy both' => 'H\hi\m\i\n \d\e j \d\e F \d\e Y',
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 $linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # T23168, T29633
 
 $specialPageAliases = [
index 61625e1..499e936 100644 (file)
@@ -120,7 +120,7 @@ $dateFormats = [
 
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $specialPageAliases = [
        'Activeusers'               => [ 'Usuários_ativos' ],
index 1abecad..b513648 100644 (file)
@@ -417,7 +417,7 @@ $bookstoreList = [
 ];
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", # nbsp
+       ',' => "\u{00A0}", # nbsp
        '.' => ','
 ];
 $minimumGroupingDigits = 2;
index 8e1d476..4859719 100644 (file)
@@ -134,6 +134,6 @@ $magicWords = [
        'img_link'                  => [ '1', 'liŋka=$1', 'link=$1' ],
 ];
 
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 $linkTrail = '/^(:?[a-zàáâçčʒǯđðéèêëǧǥȟíìîïıǩŋñóòôõßšŧúùûýÿüžþæøåäö]+)(.*)$/sDu';
index 0399bfa..847a13d 100644 (file)
@@ -285,7 +285,7 @@ $namespaceGenderAliases = [
 ];
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0",
+       ',' => "\u{00A0}",
        '.' => ','
 ];
 
index d2ce357..5511dab 100644 (file)
@@ -321,7 +321,7 @@ $magicWords = [
 
 $linkTrail = '/^([a-zåäöéÅÄÖÉ]+)(.*)$/sDu';
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", // T4749
+       ',' => "\u{00A0}", // T4749
        '.' => ','
 ];
 
index f089896..48a96c4 100644 (file)
@@ -80,6 +80,6 @@ $magicWords = [
        'url_wiki'                  => [ '0', 'விக்கி', 'WIKI' ],
 ];
 
-$linkTrail = "/^([\xE0\xAE\x80-\xE0\xAF\xBF]+)(.*)$/sDu";
+$linkTrail = "/^([\u{0B80}-\u{0BFF}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
index 4f385cf..47bc707 100644 (file)
@@ -144,6 +144,6 @@ $magicWords = [
        'special'                   => [ '0', 'ప్రత్యేక', 'special' ],
 ];
 
-$linkTrail = "/^([\xE0\xB0\x81-\xE0\xB1\xAF]+)(.*)$/sDu";
+$linkTrail = "/^([\u{0C01}-\u{0C6F}]+)(.*)$/sDu";
 
 $digitGroupingPattern = "##,##,###";
index 46d5dcb..cdfe308 100644 (file)
@@ -44,4 +44,4 @@ $namespaceGenderAliases = [];
 
 $linkTrail = '/^([a-zа-яёӝӟӥӧӵ]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
index 68d37c9..2b68572 100644 (file)
@@ -55,7 +55,7 @@
  */
 
 $separatorTransformTable = [
-       ',' => "\xc2\xa0", # nbsp
+       ',' => "\u{00A0}", # nbsp
        '.' => ','
 ];
 $minimumGroupingDigits = 2;
index 53d8efa..1720545 100644 (file)
@@ -121,5 +121,5 @@ $dateFormats = [
  */
 $separatorTransformTable = [
        '.' => ',',
-       ',' => "\xc2\xa0", # nbsp
+       ',' => "\u{00A0}", # nbsp
 ];
index 68f3ae7..f42dd8c 100644 (file)
@@ -79,7 +79,7 @@ $specialPageAliases = [
 # definixha del cogne po les limeros
 # (number format definition)
 # en: 12,345.67 -> wa: 12 345,67
-$separatorTransformTable = [ ',' => "\xc2\xa0", '.' => ',' ];
+$separatorTransformTable = [ ',' => "\u{00A0}", '.' => ',' ];
 
 # $linkTrail = '/^([a-zåâêîôûçéèA-ZÅÂÊÎÔÛÇÉÈ]+)(.*)$/sDu';
 $linkTrail = '/^([a-zåâêîôûçéè]+)(.*)$/sDu';
index 13fee9c..80fd7b9 100644 (file)
@@ -202,6 +202,11 @@ abstract class Maintenance {
 
        /**
         * Do the actual work. All child classes will need to implement this
+        *
+        * @return bool|null True for success, false for failure. Not returning
+        *   a value, or returning null, is also interpreted as success. Returning
+        *   false for failure will cause doMaintenance.php to exit the process
+        *   with a non-zero exit status.
         */
        abstract public function execute();
 
diff --git a/maintenance/archives/patch-archive-ar_rev_id-unique.sql b/maintenance/archives/patch-archive-ar_rev_id-unique.sql
new file mode 100644 (file)
index 0000000..0f07627
--- /dev/null
@@ -0,0 +1,4 @@
+-- T193180: ar_rev_id should be unique
+
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
+DROP INDEX /*i*/ar_revid ON /*_*/archive;
index 54ed3aa..b933434 100644 (file)
@@ -123,15 +123,9 @@ TEXT
        protected function cleanupTable( $tableParams ) {
                $table = $tableParams[0];
                $prefix = $tableParams[1];
-               $idField = isset( $tableParams['idField'] ) ?
-                       $tableParams['idField'] :
-                       "{$prefix}_id";
-               $nsField = isset( $tableParams['nsField'] ) ?
-                       $tableParams['nsField'] :
-                       "{$prefix}_namespace";
-               $titleField = isset( $tableParams['titleField'] ) ?
-                       $tableParams['titleField'] :
-                       "{$prefix}_title";
+               $idField = $tableParams['idField'] ?? "{$prefix}_id";
+               $nsField = $tableParams['nsField'] ?? "{$prefix}_namespace";
+               $titleField = $tableParams['titleField'] ?? "{$prefix}_title";
 
                $this->outputStatus( "Looking for invalid $titleField entries in $table...\n" );
 
index 038b28c..24ca86d 100644 (file)
@@ -53,9 +53,14 @@ class CleanupSpam extends Maintenance {
                $wgUser->addGroup( 'bot' );
 
                $spec = $this->getArg();
-               $like = LinkFilter::makeLikeArray( $spec );
-               if ( !$like ) {
-                       $this->fatalError( "Not a valid hostname specification: $spec" );
+
+               $likes = [];
+               foreach ( [ 'http://', 'https://' ] as $prot ) {
+                       $like = LinkFilter::makeLikeArray( $spec, $prot );
+                       if ( !$like ) {
+                               $this->fatalError( "Not a valid hostname specification: $spec" );
+                       }
+                       $likes[$prot] = $like;
                }
 
                if ( $this->hasOption( 'all' ) ) {
@@ -63,15 +68,24 @@ class CleanupSpam extends Maintenance {
                        $this->output( "Finding spam on " . count( $wgLocalDatabases ) . " wikis\n" );
                        $found = false;
                        foreach ( $wgLocalDatabases as $wikiID ) {
+                               /** @var $dbr Database */
                                $dbr = $this->getDB( DB_REPLICA, [], $wikiID );
 
-                               $count = $dbr->selectField( 'externallinks', 'COUNT(*)',
-                                       [ 'el_index' . $dbr->buildLike( $like ) ], __METHOD__ );
-                               if ( $count ) {
-                                       $found = true;
-                                       $cmd = wfShellWikiCmd( "$IP/maintenance/cleanupSpam.php",
-                                               [ '--wiki', $wikiID, $spec ] );
-                                       passthru( "$cmd | sed 's/^/$wikiID:  /'" );
+                               foreach ( $likes as $like ) {
+                                       $count = $dbr->selectField(
+                                               'externallinks',
+                                               'COUNT(*)',
+                                               [ 'el_index' . $dbr->buildLike( $like ) ],
+                                               __METHOD__
+                                       );
+                                       if ( $count ) {
+                                               $found = true;
+                                               $cmd = wfShellWikiCmd(
+                                                       "$IP/maintenance/cleanupSpam.php",
+                                                       [ '--wiki', $wikiID, $spec ]
+                                               );
+                                               passthru( "$cmd | sed 's/^/$wikiID:  /'" );
+                                       }
                                }
                        }
                        if ( $found ) {
@@ -82,13 +96,21 @@ class CleanupSpam extends Maintenance {
                } else {
                        // Clean up spam on this wiki
 
+                       $count = 0;
+                       /** @var $dbr Database */
                        $dbr = $this->getDB( DB_REPLICA );
-                       $res = $dbr->select( 'externallinks', [ 'DISTINCT el_from' ],
-                               [ 'el_index' . $dbr->buildLike( $like ) ], __METHOD__ );
-                       $count = $dbr->numRows( $res );
-                       $this->output( "Found $count articles containing $spec\n" );
-                       foreach ( $res as $row ) {
-                               $this->cleanupArticle( $row->el_from, $spec );
+                       foreach ( $likes as $prot => $like ) {
+                               $res = $dbr->select(
+                                       'externallinks',
+                                       [ 'DISTINCT el_from' ],
+                                       [ 'el_index' . $dbr->buildLike( $like ) ],
+                                       __METHOD__
+                               );
+                               $count = $dbr->numRows( $res );
+                               $this->output( "Found $count articles containing $spec\n" );
+                               foreach ( $res as $row ) {
+                                       $this->cleanupArticle( $row->el_from, $spec, $prot );
+                               }
                        }
                        if ( $count ) {
                                $this->output( "Done\n" );
@@ -96,7 +118,13 @@ class CleanupSpam extends Maintenance {
                }
        }
 
-       private function cleanupArticle( $id, $domain ) {
+       /**
+        * @param int $id
+        * @param string $domain
+        * @param string $protocol
+        * @throws MWException
+        */
+       private function cleanupArticle( $id, $domain, $protocol ) {
                $title = Title::newFromID( $id );
                if ( !$title ) {
                        $this->error( "Internal error: no page for ID $id" );
@@ -109,7 +137,7 @@ class CleanupSpam extends Maintenance {
                $currentRevId = $rev->getId();
 
                while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT )
-                       || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) )
+                       || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain, $protocol ) )
                ) {
                        $rev = $rev->getPrevious();
                }
index 3c7ffba..3374893 100644 (file)
@@ -337,9 +337,7 @@ class CopyFileBackend extends Maintenance {
                $dPathSha1 = sha1( $dPath );
                if ( $this->statCache !== null ) {
                        // All dst files are already in stat cache
-                       $dstStat = isset( $this->statCache[$dPathSha1] )
-                               ? $this->statCache[$dPathSha1]
-                               : false;
+                       $dstStat = $this->statCache[$dPathSha1] ?? false;
                } else {
                        $dstStat = $dst->getFileStat( [ 'src' => $dPath ] );
                }
index f3fb32c..1f1a4c7 100644 (file)
@@ -91,7 +91,7 @@ $maintenance->checkRequiredExtensions();
 $maintenance->setAgentAndTriggers();
 
 // Do the work
-$maintenance->execute();
+$success = $maintenance->execute();
 
 // Potentially debug globals
 $maintenance->globals();
@@ -111,3 +111,8 @@ if ( isset( $lbFactory ) ) {
        $lbFactory->commitMasterChanges( 'doMaintenance' );
        $lbFactory->shutdown( $lbFactory::SHUTDOWN_NO_CHRONPROT );
 }
+
+// Exit with an error status if execute() returned false
+if ( $success === false ) {
+       exit( 1 );
+}
index ae2ee42..d4f9c2d 100644 (file)
@@ -59,7 +59,7 @@ class DeprecatedInterfaceFinder extends FileAwareNodeVisitor {
                // Sort results by version, then by filename, then by name.
                foreach ( $this->foundNodes as $version => &$nodes ) {
                        uasort( $nodes, function ( $a, $b ) {
-                               return ( $a['filename'] . $a['name'] ) < ( $b['filename'] . $b['name'] ) ? -1 : 1;
+                               return ( $a['filename'] . $a['name'] ) <=> ( $b['filename'] . $b['name'] );
                        } );
                }
                ksort( $this->foundNodes );
index e2dc9b8..ff3e2fc 100644 (file)
@@ -276,9 +276,7 @@ class GenerateSitemap extends Maintenance {
         * @return string
         */
        function priority( $namespace ) {
-               return isset( $this->priorities[$namespace] )
-                       ? $this->priorities[$namespace]
-                       : $this->guessPriority( $namespace );
+               return $this->priorities[$namespace] ?? $this->guessPriority( $namespace );
        }
 
        /**
@@ -541,7 +539,7 @@ class GenerateSitemap extends Maintenance {
         */
        function generateLimit( $namespace ) {
                // T19961: make a title with the longest possible URL in this namespace
-               $title = Title::makeTitle( $namespace, str_repeat( "\xf0\xa8\xae\x81", 63 ) . "\xe5\x96\x83" );
+               $title = Title::makeTitle( $namespace, str_repeat( "\u{28B81}", 63 ) . "\u{5583}" );
 
                $this->limit = [
                        strlen( $this->openFile() ),
index c8fb629..c6a5c68 100644 (file)
@@ -508,18 +508,18 @@ class Languages {
                $this->loadGeneralMessages();
                $this->loadMessages( $code );
                $wrongChars = [
-                       '[LRM]' => "\xE2\x80\x8E",
-                       '[RLM]' => "\xE2\x80\x8F",
-                       '[LRE]' => "\xE2\x80\xAA",
-                       '[RLE]' => "\xE2\x80\xAB",
-                       '[POP]' => "\xE2\x80\xAC",
-                       '[LRO]' => "\xE2\x80\xAD",
-                       '[RLO]' => "\xE2\x80\xAB",
-                       '[ZWSP]' => "\xE2\x80\x8B",
-                       '[NBSP]' => "\xC2\xA0",
-                       '[WJ]' => "\xE2\x81\xA0",
-                       '[BOM]' => "\xEF\xBB\xBF",
-                       '[FFFD]' => "\xEF\xBF\xBD",
+                       '[LRM]' => "\u{200E}",
+                       '[RLM]' => "\u{200F}",
+                       '[LRE]' => "\u{202A}",
+                       '[RLE]' => "\u{202B}",
+                       '[POP]' => "\u{202C}",
+                       '[LRO]' => "\u{202D}",
+                       '[RLO]' => "\u{202B}",
+                       '[ZWSP]' => "\u{200B}",
+                       '[NBSP]' => "\u{00A0}",
+                       '[WJ]' => "\u{2060}",
+                       '[BOM]' => "\u{FEFF}",
+                       '[FFFD]' => "\u{FFFD}",
                ];
                $wrongRegExp = '/(' . implode( '|', array_values( $wrongChars ) ) . ')/sDu';
                $wrongCharsMessages = [];
index 784ba0e..e70060e 100644 (file)
@@ -30,7 +30,7 @@ require_once __DIR__ . '/commandLine.inc';
 
 $debug = isset( $options['debug'] );
 $help = isset( $options['help'] );
-$cache = isset( $options['cache'] ) ? $options['cache'] : null;
+$cache = $options['cache'] ?? null;
 
 if ( $help ) {
        mccShowUsage();
index fbe207d..f7db574 100644 (file)
@@ -290,7 +290,7 @@ CREATE TABLE /*_*/archive (
 CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
 CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
 
 
 --
diff --git a/maintenance/mysql.php b/maintenance/mysql.php
new file mode 100644 (file)
index 0000000..6d0882a
--- /dev/null
@@ -0,0 +1,184 @@
+<?php
+/**
+ * Execute the MySQL client binary, connecting to the wiki's DB.
+ * Note that this will not do table prefixing or variable substitution.
+ * To safely run schema patches, use sql.php.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+use MediaWiki\Shell\Shell;
+use MediaWiki\MediaWikiServices;
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * @ingroup Maintenance
+ */
+class MysqlMaintenance extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( "Execute the MySQL client binary. " .
+                       "Non-option arguments will be passed through to mysql." );
+               $this->addOption( 'write', 'Connect to the master database', false, false );
+               $this->addOption( 'group', 'Specify query group', false, false );
+               $this->addOption( 'host', 'Connect to a specific MySQL server', false, true );
+               $this->addOption( 'list-hosts', 'List the available DB hosts', false, false );
+               $this->addOption( 'cluster', 'Use an external cluster by name', false, true );
+               $this->addOption( 'wikidb',
+                       'The database wiki ID to use if not the current one', false, true );
+
+               // Fake argument for help message
+               $this->addArg( '-- mysql_option ...', 'Options to pass to mysql', false );
+       }
+
+       public function execute() {
+               $dbName = $this->getOption( 'wikidb', false );
+               $lbf = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+               if ( $this->hasOption( 'cluster' ) ) {
+                       try {
+                               $lb = $lbf->getExternalLB( $this->getOption( 'cluster' ) );
+                       } catch ( InvalidArgumentException $e ) {
+                               $this->error( "Error: invalid cluster" );
+                               exit( 1 );
+                       }
+               } else {
+                       $lb = $lbf->getMainLB( $dbName );
+               }
+               if ( $this->hasOption( 'list-hosts' ) ) {
+                       $serverCount = $lb->getServerCount();
+                       for ( $index = 0; $index < $serverCount; ++$index ) {
+                               echo $lb->getServerName( $index ) . "\n";
+                       }
+                       exit( 0 );
+               }
+               if ( $this->hasOption( 'host' ) ) {
+                       $host = $this->getOption( 'host' );
+                       $serverCount = $lb->getServerCount();
+                       for ( $index = 0; $index < $serverCount; ++$index ) {
+                               $serverInfo = $lb->getServerInfo( $index );
+
+                               if ( $lb->getServerName( $index ) === $host ) {
+                                       break;
+                               }
+                       }
+                       if ( $index >= $serverCount ) {
+                               $this->error( "Error: Host not configured: \"$host\"" );
+                               exit( 1 );
+                       }
+               } elseif ( $this->hasOption( 'write' ) ) {
+                       $index = $lb->getWriterIndex();
+               } else {
+                       $group = $this->getOption( 'group', false );
+                       $index = $lb->getReaderIndex( $group, $dbName );
+                       if ( $index === false ) {
+                               $this->error( "Error: unable to get reader index" );
+                               exit( 1 );
+                       }
+               }
+
+               if ( $lb->getServerType( $index ) !== 'mysql' ) {
+                       $this->error( "Error: this script only works with MySQL/MariaDB" );
+                       exit( 1 );
+               }
+
+               $status = $this->runMysql( $lb->getServerInfo( $index ), $dbName );
+               exit( $status );
+       }
+
+       /**
+        * Run the mysql client for the given server info
+        *
+        * @param array $info
+        * @param string|false The DB name, or false to use the main wiki DB
+        *
+        * @return The desired exit status
+        */
+       private function runMysql( $info, $dbName ) {
+               // Write the password to an option file to avoid disclosing it to other
+               // processes running on the system
+               $tmpFile = TempFSFile::factory( 'mw-mysql', 'ini' );
+               chmod( $tmpFile->getPath(), 0600 );
+               file_put_contents( $tmpFile->getPath(), "[client]\npassword={$info['password']}\n" );
+
+               // stdin/stdout need to be the actual file descriptors rather than
+               // PHP's pipe wrappers so that mysql can use them as an interactive
+               // terminal.
+               $desc = [
+                       0 => STDIN,
+                       1 => STDOUT,
+                       2 => STDERR,
+               ];
+
+               // Split host and port as in DatabaseMysqli::mysqlConnect()
+               $realServer = $info['host'];
+               $hostAndPort = IP::splitHostAndPort( $realServer );
+               $socket = false;
+               $port = false;
+               if ( $hostAndPort ) {
+                       $realServer = $hostAndPort[0];
+                       if ( $hostAndPort[1] ) {
+                               $port = $hostAndPort[1];
+                       }
+               } elseif ( substr_count( $realServer, ':' ) == 1 ) {
+                       // If we have a colon and something that's not a port number
+                       // inside the hostname, assume it's the socket location
+                       $hostAndSocket = explode( ':', $realServer, 2 );
+                       $realServer = $hostAndSocket[0];
+                       $socket = $hostAndSocket[1];
+               }
+
+               if ( $dbName === false ) {
+                       $dbName = $info['dbname'];
+               }
+
+               $args = [
+                       'mysql',
+                       "--defaults-extra-file={$tmpFile->getPath()}",
+                       "--user={$info['user']}",
+                       "--database={$dbName}",
+               ];
+               if ( $socket !== false ) {
+                       $args[] = "--socket={$socket}";
+               } else {
+                       $args[] = "--host={$realServer}";
+               }
+               if ( $port !== false ) {
+                       $args[] = "--port={$port}";
+               }
+
+               $args = array_merge( $args, $this->mArgs );
+
+               $pipes = [];
+               $proc = proc_open( Shell::escape( $args ), $desc, $pipes );
+               if ( $proc === false ) {
+                       $this->error( "Unable to execute mysql" );
+                       return 1;
+               }
+               $ret = proc_close( $proc );
+               if ( $ret === -1 ) {
+                       $this->error( "proc_close() returned -1" );
+                       return 1;
+               }
+               return $ret;
+       }
+}
+
+$maintClass = MysqlMaintenance::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index bbe4469..71241e7 100644 (file)
@@ -161,17 +161,8 @@ class NamespaceDupes extends Maintenance {
                // break the tie by sorting by name
                $origSpaces = $spaces;
                uksort( $spaces, function ( $a, $b ) use ( $origSpaces ) {
-                       if ( $origSpaces[$a] < $origSpaces[$b] ) {
-                               return -1;
-                       } elseif ( $origSpaces[$a] > $origSpaces[$b] ) {
-                               return 1;
-                       } elseif ( $a < $b ) {
-                               return -1;
-                       } elseif ( $a > $b ) {
-                               return 1;
-                       } else {
-                               return 0;
-                       }
+                       return $origSpaces[$a] <=> $origSpaces[$b]
+                               ?: $a <=> $b;
                } );
 
                $ok = true;
diff --git a/maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql b/maintenance/oracle/archives/patch-archive-ar_rev_id-unique.sql
new file mode 100644 (file)
index 0000000..c1cccc2
--- /dev/null
@@ -0,0 +1,6 @@
+-- T193180: ar_rev_id should be unique
+
+define mw_prefix='{$wgDBprefix}';
+
+CREATE UNIQUE INDEX &mw_prefix.archive_i04 ON &mw_prefix.archive (ar_rev_id);
+DROP INDEX &mw_prefix.archive_i03;
index 6e36752..612f089 100644 (file)
@@ -271,7 +271,7 @@ ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk2 FOREIGN KEY
 CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX &mw_prefix.archive_i02 ON &mw_prefix.archive (ar_user_text,ar_timestamp);
 CREATE INDEX &mw_prefix.ar_actor_timestamp ON &mw_prefix.archive (ar_actor,ar_timestamp);
-CREATE INDEX &mw_prefix.archive_i03 ON &mw_prefix.archive (ar_rev_id);
+CREATE UNIQUE INDEX &mw_prefix.archive_i04 ON &mw_prefix.archive (ar_rev_id);
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.archive_seq_trg BEFORE INSERT ON &mw_prefix.archive
        FOR EACH ROW WHEN (new.ar_id IS NULL)
index cf0eb2f..2f56772 100644 (file)
@@ -263,6 +263,7 @@ ALTER SEQUENCE archive_ar_id_seq OWNED BY archive.ar_id;
 CREATE INDEX archive_name_title_timestamp ON archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX archive_user_text            ON archive (ar_user_text);
 CREATE INDEX archive_actor                ON archive (ar_actor);
+CREATE UNIQUE INDEX ar_revid_uniq ON archive (ar_rev_id);
 
 
 CREATE TABLE slots (
index af8a280..73bc4d9 100644 (file)
@@ -50,7 +50,7 @@ class RenameDbPrefix extends Maintenance {
                } else {
                        // Use nice safe, sane, prefixes
                        preg_match( '/^[a-zA-Z]+_$/', $this->getOption( 'old' ), $m );
-                       $old = isset( $m[0] ) ? $m[0] : false;
+                       $old = $m[0] ?? false;
                }
                // Allow for no new prefix
                if ( $this->getOption( 'new', 0 ) === '0' ) {
@@ -58,7 +58,7 @@ class RenameDbPrefix extends Maintenance {
                } else {
                        // Use nice safe, sane, prefixes
                        preg_match( '/^[a-zA-Z]+_$/', $this->getOption( 'new' ), $m );
-                       $new = isset( $m[0] ) ? $m[0] : false;
+                       $new = $m[0] ?? false;
                }
 
                if ( $old === false || $new === false ) {
diff --git a/maintenance/sqlite/archives/patch-archive-ar_rev_id-unique.sql b/maintenance/sqlite/archives/patch-archive-ar_rev_id-unique.sql
new file mode 100644 (file)
index 0000000..9677dbb
--- /dev/null
@@ -0,0 +1,4 @@
+-- T193180: ar_rev_id should be unique
+
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
+DROP INDEX /*i*/ar_revid;
index 9bb554c..639ef58 100644 (file)
@@ -43,7 +43,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
        } else {
                $maxID = $dbw->selectField( 'text', 'MAX(old_id)', '', $fname );
        }
-       $minID = isset( $options['s'] ) ? $options['s'] : 1;
+       $minID = $options['s'] ?? 1;
 
        moveToExternal( $cluster, $maxID, $minID );
 }
index c3ed4fc..7cac728 100644 (file)
@@ -45,7 +45,7 @@ if ( isset( $options['limit'] ) ) {
        $limit = 1000;
        $untilHappy = true;
 }
-$type = isset( $options['type'] ) ? $options['type'] : ConcatenatedGzipHistoryBlob::class;
+$type = $options['type'] ?? ConcatenatedGzipHistoryBlob::class;
 
 $dbr = $this->getDB( DB_REPLICA );
 $revQuery = Revision::getQueryInfo( [ 'page', 'text' ] );
index 36b6f5b..2dd48ca 100644 (file)
@@ -122,7 +122,7 @@ class TrackBlobs {
                return [
                        'cluster' => $m[1],
                        'id' => intval( $m[2] ),
-                       'hash' => isset( $m[3] ) ? $m[3] : null
+                       'hash' => $m[3] ?? null
                ];
        }
 
index 53c1529..d8a47cb 100644 (file)
@@ -667,7 +667,7 @@ CREATE INDEX /*i*/ar_actor_timestamp ON /*_*/archive (ar_actor,ar_timestamp);
 
 -- Index for linking archive rows with tables that normally link with revision
 -- rows, such as change_tag.
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+CREATE UNIQUE INDEX /*i*/ar_revid_uniq ON /*_*/archive (ar_rev_id);
 
 --
 -- Slots represent an n:m relation between revisions and content objects.
index 1491e62..3c4d1f9 100644 (file)
@@ -51,7 +51,7 @@ class UpdateSpecialPages extends Maintenance {
 
                foreach ( QueryPage::getPages() as $page ) {
                        list( $class, $special ) = $page;
-                       $limit = isset( $page[2] ) ? $page[2] : null;
+                       $limit = $page[2] ?? null;
 
                        # --list : just show the name of pages
                        if ( $this->hasOption( 'list' ) ) {
index ca8c1bb..9ebd57b 100644 (file)
@@ -291,24 +291,26 @@ function compare_point( profile_point $a, profile_point $b ) {
        global $sort;
 
        switch ( $sort ) {
+               // Sorted ascending:
                case 'name':
                        return strcmp( $a->name(), $b->name() );
+               // Sorted descending:
                case 'time':
-                       return $a->time() > $b->time() ? -1 : 1;
+                       return $b->time() <=> $a->time();
                case 'memory':
-                       return $a->memory() > $b->memory() ? -1 : 1;
+                       return $b->memory() <=> $a->memory();
                case 'count':
-                       return $a->count() > $b->count() ? -1 : 1;
+                       return $b->count() <=> $a->count();
                case 'time_per_call':
-                       return $a->timePerCall() > $b->timePerCall() ? -1 : 1;
+                       return $b->timePerCall() <=> $a->timePerCall();
                case 'memory_per_call':
-                       return $a->memoryPerCall() > $b->memoryPerCall() ? -1 : 1;
+                       return $b->memoryPerCall() <=> $a->memoryPerCall();
                case 'calls_per_req':
-                       return $a->callsPerRequest() > $b->callsPerRequest() ? -1 : 1;
+                       return $b->callsPerRequest() <=> $a->callsPerRequest();
                case 'time_per_req':
-                       return $a->timePerRequest() > $b->timePerRequest() ? -1 : 1;
+                       return $b->timePerRequest() <=> $a->timePerRequest();
                case 'memory_per_req':
-                       return $a->memoryPerRequest() > $b->memoryPerRequest() ? -1 : 1;
+                       return $b->memoryPerRequest() <=> $a->memoryPerRequest();
        }
 }
 
index eb42311..082603a 100644 (file)
                options = options || {};
 
                this.each( function () {
-                       var $collapsible, collapseText, expandText, $caption, $toggle, actionHandler, buildDefaultToggleLink,
-                               $toggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
+                       var $collapsible, collapseText, expandText, $caption, $toggle, actionHandler,
+                               buildDefaultToggleLink, $firstItem, collapsibleId, $customTogglers, firstval;
 
                        // Ensure class "mw-collapsible" is present in case .makeCollapsible()
                        // is called on element(s) that don't have it yet.
                                        .attr( {
                                                role: 'button',
                                                tabindex: 0
-                                       } )
-                                       .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
+                                       } );
                        };
 
                        // Check if this element has a custom position for the toggle link
                                        togglingHandler( $( this ), $collapsible, e, opts );
                                };
 
-                               $toggleLink = $customTogglers
-                                       .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
-                                       .prop( 'tabIndex', 0 );
+                               $toggle = $customTogglers;
 
                        } else {
                                // If this is not a custom case, do the default: wrap the
 
                                                // If there is no toggle link, add it to the end of the caption
                                                if ( !$toggle.length ) {
-                                                       $toggleLink = buildDefaultToggleLink().appendTo( $caption );
-                                               } else {
-                                                       $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
-                                                               .prop( 'tabIndex', 0 );
+                                                       $toggle = buildDefaultToggleLink().appendTo( $caption );
                                                }
                                        } else {
                                                // The toggle-link will be in one of the cells (td or th) of the first row
 
                                                // If theres no toggle link, add it to the last cell
                                                if ( !$toggle.length ) {
-                                                       $toggleLink = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
-                                               } else {
-                                                       $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
-                                                               .prop( 'tabIndex', 0 );
+                                                       $toggle = buildDefaultToggleLink().prependTo( $firstItem.eq( -1 ) );
                                                }
                                        }
 
                                        $collapsible.find( '> .mw-collapsible-toggle' ).length === 0
                                ) {
                                        // special case of one collapsible in <li> tag
-                                       $toggleLink = buildDefaultToggleLink();
-                                       $collapsible.before( $toggleLink );
+                                       $toggle = buildDefaultToggleLink();
+                                       $collapsible.before( $toggle );
                                } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
                                        // The toggle-link will be in the first list-item
                                        $firstItem = $collapsible.find( 'li:first' );
                                                if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
                                                        $firstItem.prop( 'value', '1' );
                                                }
-                                               $toggleLink = buildDefaultToggleLink();
-                                               $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
-                                       } else {
-                                               $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
-                                                       .prop( 'tabIndex', 0 );
+                                               $toggle = buildDefaultToggleLink();
+                                               $toggle.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent().prependTo( $collapsible );
                                        }
 
                                } else { // <div>, <p> etc.
 
                                        // If theres no toggle link, add it
                                        if ( !$toggle.length ) {
-                                               $toggleLink = buildDefaultToggleLink().prependTo( $collapsible );
-                                       } else {
-                                               $toggleLink = $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
-                                                       .prop( 'tabIndex', 0 );
+                                               $toggle = buildDefaultToggleLink().prependTo( $collapsible );
                                        }
                                }
                        }
 
+                       // Attach event handlers to togglelink
+                       $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+                               .prop( 'tabIndex', 0 );
+
                        $( this ).data( 'mw-collapsible', {
                                collapse: function () {
-                                       actionHandler.call( $toggleLink.get( 0 ), null, { wasCollapsed: false } );
+                                       actionHandler.call( $toggle.get( 0 ), null, { wasCollapsed: false } );
                                },
                                expand: function () {
-                                       actionHandler.call( $toggleLink.get( 0 ), null, { wasCollapsed: true } );
+                                       actionHandler.call( $toggle.get( 0 ), null, { wasCollapsed: true } );
                                },
                                toggle: function () {
-                                       actionHandler.call( $toggleLink.get( 0 ), null, null );
+                                       actionHandler.call( $toggle.get( 0 ), null, null );
                                }
                        } );
 
                        if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
                                // One toggler can hook to multiple elements, and one element can have
                                // multiple togglers. This is the sanest way to handle that.
-                               actionHandler.call( $toggleLink.get( 0 ), null, { wasCollapsed: false } );
+                               actionHandler.call( $toggle.get( 0 ), null, { wasCollapsed: false } );
                        }
 
                } );
index dcaae3e..2b76187 100644 (file)
                rWhitespace = /[ _\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+/g,
 
                // From MediaWikiTitleCodec::splitTitleString() in PHP
-               rStripCharacters = /[\u00AD\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g,
+               rUnicodeBidi = /[\u200E\u200F\u202A-\u202E]/g,
 
                /**
                 * Slightly modified from Flinfo. Credit goes to Lupo and Flominator.
                        namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
 
                        title = title
-                               // Strip soft hyphens and Unicode directional formatting characters
-                               .replace( rStripCharacters, '' )
+                               // Strip Unicode bidi override characters
+                               .replace( rUnicodeBidi, '' )
                                // Normalise whitespace to underscores and remove duplicates
                                .replace( rWhitespace, '_' )
                                // Trim underscores
index 1db7c1d..f210a44 100644 (file)
@@ -6,6 +6,8 @@
        &.oo-ui-toggleWidget-on {
                position: relative;
                overflow: hidden;
+               z-index: 0;
+
                &:after {
                        content: '';
                        mix-blend-mode: screen;
index ce1dae6..97175da 100644 (file)
@@ -143,8 +143,7 @@ class ParserTestRunner {
 
                $this->keepUploads = !empty( $options['keep-uploads'] );
 
-               $this->fileBackendName = isset( $options['file-backend'] ) ?
-                       $options['file-backend'] : false;
+               $this->fileBackendName = $options['file-backend'] ?? false;
 
                $this->runDisabled = !empty( $options['run-disabled'] );
                $this->runParsoid = !empty( $options['run-parsoid'] );
@@ -465,7 +464,7 @@ class ParserTestRunner {
                        if ( is_int( $name ) ) {
                                $value();
                        } else {
-                               $saved[$name] = isset( $GLOBALS[$name] ) ? $GLOBALS[$name] : null;
+                               $saved[$name] = $GLOBALS[$name] ?? null;
                                $GLOBALS[$name] = $value;
                        }
                }
@@ -537,7 +536,7 @@ class ParserTestRunner {
         * @return bool
         */
        public function isSetupDone( $funcName ) {
-               return isset( $this->setupDone[$funcName] ) ? $this->setupDone[$funcName] : false;
+               return $this->setupDone[$funcName] ?? false;
        }
 
        /**
@@ -837,7 +836,7 @@ class ParserTestRunner {
                }
 
                $local = isset( $opts['local'] );
-               $preprocessor = isset( $opts['preprocessor'] ) ? $opts['preprocessor'] : null;
+               $preprocessor = $opts['preprocessor'] ?? null;
                $parser = $this->getParser( $preprocessor );
                $title = Title::newFromText( $titleText );
 
index 216d7e5..b109e39 100644 (file)
@@ -28869,7 +28869,7 @@ foo {{echo|<span>bar</span> [[Category:baz]]}} bar
 # of the categories in wikitext
 # Do not remove these characters in edits.
 #
-# As part of the serialization, these Unicode directional formatting characters will get stripped.
+# As part of the serialization, these bidi characters will get stripped.
 !! test
 RTL (\u200f) and LTR (\u200e) markers around category tags should be stripped
 !! options
@@ -30875,27 +30875,3 @@ header
 *foo
 footer
 !! end
-
-!! test
-Check soft hyphens as entities (&shy;) in displaytitle (T66528)
-!! options
-showtitle
-title=[[Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechymenokichlepikossyphophattoperisteralektryonoptekephalliokigklopeleiolagoiosiraiobaphetraganopterygon]]
-!! wikitext
-{{DISPLAYTITLE:Lopado&shy;temacho&shy;selacho&shy;galeo&shy;kranio&shy;leipsano&shy;drim&shy;hypo&shy;trimmato&shy;silphio&shy;parao&shy;melito&shy;katakechy&shy;meno&shy;kichl&shy;epi&shy;kossypho&shy;phatto&shy;perister&shy;alektryon&shy;opte&shy;kephallio&shy;kigklo&shy;peleio&shy;lagoio&shy;siraio&shy;baphe&shy;tragano&shy;pterygon}}
-!! html/php
-Lopado&#173;temacho&#173;selacho&#173;galeo&#173;kranio&#173;leipsano&#173;drim&#173;hypo&#173;trimmato&#173;silphio&#173;parao&#173;melito&#173;katakechy&#173;meno&#173;kichl&#173;epi&#173;kossypho&#173;phatto&#173;perister&#173;alektryon&#173;opte&#173;kephallio&#173;kigklo&#173;peleio&#173;lagoio&#173;siraio&#173;baphe&#173;tragano&#173;pterygon
-
-!! end
-
-!! test
-Check soft hyphens as Unicode characters (U+00AD) in displaytitle (T66528)
-!! options
-showtitle
-title=[[Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechymenokichlepikossyphophattoperisteralektryonoptekephalliokigklopeleiolagoiosiraiobaphetraganopterygon]]
-!! wikitext
-{{DISPLAYTITLE:Lopado­temacho­selacho­galeo­kranio­leipsano­drim­hypo­trimmato­silphio­parao­melito­katakechy­meno­kichl­epi­kossypho­phatto­perister­alektryon­opte­kephallio­kigklo­peleio­lagoio­siraio­baphe­tragano­pterygon}}
-!! html/php
-Lopado­temacho­selacho­galeo­kranio­leipsano­drim­hypo­trimmato­silphio­parao­melito­katakechy­meno­kichl­epi­kossypho­phatto­perister­alektryon­opte­kephallio­kigklo­peleio­lagoio­siraio­baphe­tragano­pterygon
-
-!! end
index bd0461a..5f71287 100644 (file)
@@ -48,10 +48,8 @@ return [
                        'maintenance/cleanupTable.inc',
                        'maintenance/CodeCleanerGlobalsPass.inc',
                        'maintenance/commandLine.inc',
-                       'maintenance/importImages.inc',
                        'maintenance/sqlite.inc',
                        'maintenance/userDupes.inc',
-                       'maintenance/userOptions.inc',
                        'maintenance/language/checkLanguage.inc',
                        'maintenance/language/languages.inc',
                ]
index a27e9f9..b4707e6 100644 (file)
@@ -950,13 +950,12 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                $singletons = $wrappedProvider->singletons;
                if ( $provider instanceof MonologSpi ) {
                        if ( !isset( $this->loggers[$channel] ) ) {
-                               $this->loggers[$channel] = isset( $singletons['loggers'][$channel] )
-                                       ? $singletons['loggers'][$channel] : null;
+                               $this->loggers[$channel] = $singletons['loggers'][$channel] ?? null;
                        }
                        $singletons['loggers'][$channel] = $logger;
                } elseif ( $provider instanceof LegacySpi ) {
                        if ( !isset( $this->loggers[$channel] ) ) {
-                               $this->loggers[$channel] = isset( $singletons[$channel] ) ? $singletons[$channel] : null;
+                               $this->loggers[$channel] = $singletons[$channel] ?? null;
                        }
                        $singletons[$channel] = $logger;
                } else {
@@ -1410,8 +1409,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         */
        private function setUpSchema( IMaintainableDatabase $db ) {
                // Undo any active overrides.
-               $oldOverrides = isset( $db->_schemaOverrides ) ? $db->_schemaOverrides
-                       : self::$schemaOverrideDefaults;
+               $oldOverrides = $db->_schemaOverrides ?? self::$schemaOverrideDefaults;
 
                if ( $oldOverrides['alter'] || $oldOverrides['create'] || $oldOverrides['drop'] ) {
                        $this->undoSchemaOverrides( $db, $oldOverrides );
@@ -1545,7 +1543,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                if ( $db ) {
                        $userTables = [ 'user', 'user_groups', 'user_properties', 'actor' ];
                        $pageTables = [ 'page', 'revision', 'ip_changes', 'revision_comment_temp',
-                               'revision_actor_temp', 'comment' ];
+                               'revision_actor_temp', 'comment', 'archive' ];
                        $coreDBDataTables = array_merge( $userTables, $pageTables );
 
                        // If any of the user or page tables were marked as used, we should clear all of them.
@@ -1821,7 +1819,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                uasort(
                        $array,
                        function ( $a, $b ) {
-                               return serialize( $a ) > serialize( $b ) ? 1 : -1;
+                               return serialize( $a ) <=> serialize( $b );
                        }
                );
        }
diff --git a/tests/phpunit/data/xmp/1.result.php b/tests/phpunit/data/xmp/1.result.php
deleted file mode 100644 (file)
index c91fe29..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-               'Flash' => '9'
-       ]
-];
diff --git a/tests/phpunit/data/xmp/1.xmp b/tests/phpunit/data/xmp/1.xmp
deleted file mode 100644 (file)
index 66e1542..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/2.result.php b/tests/phpunit/data/xmp/2.result.php
deleted file mode 100644 (file)
index c91fe29..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-               'Flash' => '9'
-       ]
-];
diff --git a/tests/phpunit/data/xmp/2.xmp b/tests/phpunit/data/xmp/2.xmp
deleted file mode 100644 (file)
index 0fa6a89..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Fired>True</exif:Fired> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/3-invalid.result.php b/tests/phpunit/data/xmp/3-invalid.result.php
deleted file mode 100644 (file)
index 701661f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-       ]
-];
diff --git a/tests/phpunit/data/xmp/3-invalid.xmp b/tests/phpunit/data/xmp/3-invalid.xmp
deleted file mode 100644 (file)
index 2425e25..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<!--
-This file has an invalid flash compoenent (one of the values are a qualifier)
--->
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
->
-<exif:DigitalZoomRatio>
-
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:foobarbaz>fred</exif:foobarbaz>
-
-</rdf:Description>
-
-</exif:DigitalZoomRatio>
-
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Mode><rdf:Description>
-<rdf:value>1</rdf:value>
-<exif:Fired>False</exif:Fired> <!-- qualifier. should be ignored-->
-</rdf:Description>
-</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/3.result.php b/tests/phpunit/data/xmp/3.result.php
deleted file mode 100644 (file)
index c91fe29..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-               'Flash' => '9'
-       ]
-];
diff --git a/tests/phpunit/data/xmp/3.xmp b/tests/phpunit/data/xmp/3.xmp
deleted file mode 100644 (file)
index 2cf1988..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
->
-<exif:DigitalZoomRatio>
-
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:foobarbaz>fred</exif:foobarbaz>
-
-</rdf:Description>
-
-</exif:DigitalZoomRatio>
-
-<exif:Flash>
-<rdf:Description exif:Return="0">
-<exif:Fired>True</exif:Fired> 
-<exif:Mode><rdf:Description>
-<rdf:value>1</rdf:value>
-<exif:Fired>False</exif:Fired> <!-- qualifier. should be ignored-->
-</rdf:Description>
-</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></rdf:Description></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/4.result.php b/tests/phpunit/data/xmp/4.result.php
deleted file mode 100644 (file)
index 701661f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-       ]
-];
diff --git a/tests/phpunit/data/xmp/4.xmp b/tests/phpunit/data/xmp/4.xmp
deleted file mode 100644 (file)
index 29eb614..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<!-- Valid output is just the DigitalZoomRatio
-as the flash is a qualifier
---> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
- <exif:DigitalZoomRatio>
-<rdf:Description>
-<rdf:value>
-0/10
-</rdf:value>
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash>
-</rdf:Description>
-</exif:DigitalZoomRatio>
-</rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/5.result.php b/tests/phpunit/data/xmp/5.result.php
deleted file mode 100644 (file)
index 701661f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-       ]
-];
diff --git a/tests/phpunit/data/xmp/5.xmp b/tests/phpunit/data/xmp/5.xmp
deleted file mode 100644 (file)
index 3cc61d6..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
- <exif:DigitalZoomRatio>
-<rdf:Description rdf:value="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash>
-</rdf:Description>
-</exif:DigitalZoomRatio>
-</rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/6.result.php b/tests/phpunit/data/xmp/6.result.php
deleted file mode 100644 (file)
index c91fe29..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-               'Flash' => '9'
-       ]
-];
diff --git a/tests/phpunit/data/xmp/6.xmp b/tests/phpunit/data/xmp/6.xmp
deleted file mode 100644 (file)
index f435ab2..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
-<exif:DigitalZoomRatio>
-0/10
-</exif:DigitalZoomRatio>
-</rdf:Description>
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/">
-
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/7.result.php b/tests/phpunit/data/xmp/7.result.php
deleted file mode 100644 (file)
index ad88df3..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-$result = [
-       'xmp-exif' =>
-       [
-               'CameraOwnerName' => 'Me!',
-       ],
-       'xmp-general' =>
-       [
-               'LicenseUrl' => 'http://creativecommons.com/cc-by-2.9',
-               'ImageDescription' =>
-               [
-                       'x-default' => 'Test image for the cc: xmp: xmpRights: namespaces in xmp',
-                       '_type' => 'lang',
-               ],
-               'ObjectName' =>
-               [
-                       'x-default' => 'xmp core/xmp rights/cc ns test',
-                       '_type' => 'lang',
-               ],
-               'DateTimeDigitized' => '2005:04:03',
-               'Software' => 'The one true editor: Vi (ok i used gimp)',
-               'Identifier' =>
-               [
-                       0 => 'http://example.com/identifierurl',
-                       1 => 'urn:sha1:342524abcdef',
-                       '_type' => 'ul',
-               ],
-               'Label' => 'Test image',
-               'DateTimeMetadata' => '2011:05:12',
-               'DateTime' => '2007:03:04 06:34:10',
-               'Nickname' => 'My little xmp test image',
-               'Rating' => '5',
-               'RightsCertificate' => 'http://example.com/rights-certificate/',
-               'Copyrighted' => 'True',
-               'CopyrightOwner' =>
-               [
-                       0 => 'Bawolff is copyright owner',
-                       '_type' => 'ul',
-               ],
-               'UsageTerms' =>
-               [
-                       'x-default' => 'do whatever you want',
-                       'en-gb' => 'Do whatever you want in british english',
-                       '_type' => 'lang',
-               ],
-               'WebStatement' => 'http://example.com/web_statement',
-       ],
-       'xmp-deprecated' =>
-       [
-               'Identifier' => 'http://example.com/identifierurl/wrong',
-       ],
-];
diff --git a/tests/phpunit/data/xmp/7.xmp b/tests/phpunit/data/xmp/7.xmp
deleted file mode 100644 (file)
index e18e13d..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
-  xmlns:aux='http://ns.adobe.com/exif/1.0/aux/'>
-  <aux:OwnerName>Me!</aux:OwnerName>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
-  xmlns:cc='http://creativecommons.org/ns#'>
-  <cc:license>http://creativecommons.com/cc-by-2.9</cc:license>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
-  xmlns:dc='http://purl.org/dc/elements/1.1/'>
-  <dc:description>
-   <rdf:Alt>
-    <rdf:li xml:lang='x-default'>Test image for the cc: xmp: xmpRights: namespaces in xmp</rdf:li>
-   </rdf:Alt>
-  </dc:description>
-  <dc:identifier>http://example.com/identifierurl/wrong</dc:identifier>
-  <dc:title>
-   <rdf:Alt>
-    <rdf:li xml:lang='x-default'>xmp core/xmp rights/cc ns test</rdf:li>
-   </rdf:Alt>
-  </dc:title>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
-  xmlns:xmp='http://ns.adobe.com/xap/1.0/'>
-  <xmp:CreateDate>2005-04-03</xmp:CreateDate>
-  <xmp:CreatorTool>The one true editor: Vi (ok i used gimp)</xmp:CreatorTool>
-  <xmp:Identifier>
-   <rdf:Bag>
-    <rdf:li>http://example.com/identifierurl
-</rdf:li>
-    <rdf:li>urn:sha1:342524abcdef</rdf:li>
-   </rdf:Bag>
-  </xmp:Identifier>
-  <xmp:Label>Test image</xmp:Label>
-  <xmp:MetadataDate>2011-05-12</xmp:MetadataDate>
-  <xmp:ModifyDate>2007-03-04T12:34:10-06:00</xmp:ModifyDate>
-  <xmp:Nickname>My little xmp test image</xmp:Nickname>
-  <xmp:Rating>7</xmp:Rating>
- </rdf:Description>
-
- <rdf:Description rdf:about=''
-  xmlns:xmpRights='http://ns.adobe.com/xap/1.0/rights/'>
-  <xmpRights:Certificate>http://example.com/rights-certificate/</xmpRights:Certificate>
-  <xmpRights:Marked>True</xmpRights:Marked>
-  <xmpRights:Owner>
-   <rdf:Bag>
-    <rdf:li>Bawolff is copyright owner</rdf:li>
-   </rdf:Bag>
-  </xmpRights:Owner>
-  <xmpRights:UsageTerms>
-   <rdf:Alt>
-    <rdf:li xml:lang='x-default'>do whatever you want</rdf:li>
-    <rdf:li xml:lang='en-GB'>Do whatever you want in british english</rdf:li>
-   </rdf:Alt>
-  </xmpRights:UsageTerms>
-  <xmpRights:WebStatement>http://example.com/web_statement</xmpRights:WebStatement>
- </rdf:Description>
-</rdf:RDF>
-</x:xmpmeta>
-<?xpacket end='r'?>
diff --git a/tests/phpunit/data/xmp/README b/tests/phpunit/data/xmp/README
deleted file mode 100644 (file)
index bd94917..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains a bunch of XMP files
-as well as a bunch of php files containing what the
-parsed version of the XMP looks like.
diff --git a/tests/phpunit/data/xmp/bag-for-seq.result.php b/tests/phpunit/data/xmp/bag-for-seq.result.php
deleted file mode 100644 (file)
index 3d8eeb0..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-$result = [
-       'xmp-general' => [
-               'Artist' => [
-                       '_type' => 'ul',
-                       0 => 'The author',
-               ]
-       ]
-];
diff --git a/tests/phpunit/data/xmp/bag-for-seq.xmp b/tests/phpunit/data/xmp/bag-for-seq.xmp
deleted file mode 100644 (file)
index c6ed5b7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xpacket begin=""?> <x:xmpmeta xmlns:x="adobe:ns:meta/"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:creator> <rdf:Bag> <rdf:li>The author</rdf:li> </rdf:Bag> </dc:creator> </rdf:Description> </rdf:RDF> </x:xmpmeta>
diff --git a/tests/phpunit/data/xmp/doctype-included.result.php b/tests/phpunit/data/xmp/doctype-included.result.php
deleted file mode 100644 (file)
index d4ac654..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-$result = [];
diff --git a/tests/phpunit/data/xmp/doctype-included.xmp b/tests/phpunit/data/xmp/doctype-included.xmp
deleted file mode 100644 (file)
index 8c94675..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <!DOCTYPE x:xmpmeta [ <!ENTITY lol "lollollollollollollollollollollol"> ]>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/doctype-not-included.xmp b/tests/phpunit/data/xmp/doctype-not-included.xmp
deleted file mode 100644 (file)
index 9a40b4b..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        ">
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/flash.result.php b/tests/phpunit/data/xmp/flash.result.php
deleted file mode 100644 (file)
index 3150d5c..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-               'Flash' => '127'
-       ]
-];
diff --git a/tests/phpunit/data/xmp/flash.xmp b/tests/phpunit/data/xmp/flash.xmp
deleted file mode 100644 (file)
index b1373cc..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>3</exif:Return> <exif:Mode>3</exif:Mode> <exif:Function>True</exif:Function> <exif:RedEyeMode>True</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/gps.result.php b/tests/phpunit/data/xmp/gps.result.php
deleted file mode 100644 (file)
index 6bc35f5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'GPSAltitude' => -3.14159265301,
-               'GPSDOP' => '5/1',
-               'GPSLatitude' => 88.51805555,
-               'GPSLongitude' => -21.12356945,
-               'GPSVersionID' => '2.2.0.0'
-       ]
-];
diff --git a/tests/phpunit/data/xmp/gps.xmp b/tests/phpunit/data/xmp/gps.xmp
deleted file mode 100644 (file)
index e52d2c8..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
-<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 7.30'>
-<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
-
- <rdf:Description rdf:about=''
-  xmlns:exif='http://ns.adobe.com/exif/1.0/'>
-  <exif:GPSAltitude>103993/33102</exif:GPSAltitude>
-  <exif:GPSAltitudeRef>1</exif:GPSAltitudeRef>
-  <exif:GPSDOP>5/1</exif:GPSDOP>
-  <exif:GPSLatitude>88,31.083333N</exif:GPSLatitude>
-  <exif:GPSLongitude>21,7.414167W</exif:GPSLongitude>
-  <exif:GPSVersionID>2.2.0.0</exif:GPSVersionID>
- </rdf:Description>
-
-</rdf:RDF>
-</x:xmpmeta>
-<?xpacket end='w'?>
diff --git a/tests/phpunit/data/xmp/invalid-child-not-struct.result.php b/tests/phpunit/data/xmp/invalid-child-not-struct.result.php
deleted file mode 100644 (file)
index 701661f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-       ]
-];
diff --git a/tests/phpunit/data/xmp/invalid-child-not-struct.xmp b/tests/phpunit/data/xmp/invalid-child-not-struct.xmp
deleted file mode 100644 (file)
index 6aa0c10..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:DigitalZoomRatio="0/10">
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode>
-
- </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/no-namespace.result.php b/tests/phpunit/data/xmp/no-namespace.result.php
deleted file mode 100644 (file)
index 8e33102..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'FNumber' => '28/10',
-       ]
-];
diff --git a/tests/phpunit/data/xmp/no-namespace.xmp b/tests/phpunit/data/xmp/no-namespace.xmp
deleted file mode 100644 (file)
index 7d6cdb2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-<!-- Testing it handles random non-namespaced properties in files ok.
-     Some older photoshop's did not include the rdf: prefix on about. -->
-<rdf:Description
- about=""
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:FNumber="28/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/no-recognized-props.result.php b/tests/phpunit/data/xmp/no-recognized-props.result.php
deleted file mode 100644 (file)
index 824a242..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php
-$result = [];
diff --git a/tests/phpunit/data/xmp/no-recognized-props.xmp b/tests/phpunit/data/xmp/no-recognized-props.xmp
deleted file mode 100644 (file)
index 54e8090..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/not-exif-namespace"
- exif:FNumber="2/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/utf16BE.result.php b/tests/phpunit/data/xmp/utf16BE.result.php
deleted file mode 100644 (file)
index 5e876d9..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = [
-       'xmp-exif' =>
-               [
-                       'DigitalZoomRatio' => '0/10',
-               ],
-       'xmp-general' =>
-               [
-                       'Label' => '􊯍'
-               ],
-];
diff --git a/tests/phpunit/data/xmp/utf16BE.xmp b/tests/phpunit/data/xmp/utf16BE.xmp
deleted file mode 100644 (file)
index 0cf60d6..0000000
Binary files a/tests/phpunit/data/xmp/utf16BE.xmp and /dev/null differ
diff --git a/tests/phpunit/data/xmp/utf16LE.result.php b/tests/phpunit/data/xmp/utf16LE.result.php
deleted file mode 100644 (file)
index 5e876d9..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = [
-       'xmp-exif' =>
-               [
-                       'DigitalZoomRatio' => '0/10',
-               ],
-       'xmp-general' =>
-               [
-                       'Label' => '􊯍'
-               ],
-];
diff --git a/tests/phpunit/data/xmp/utf16LE.xmp b/tests/phpunit/data/xmp/utf16LE.xmp
deleted file mode 100644 (file)
index 66d71f4..0000000
Binary files a/tests/phpunit/data/xmp/utf16LE.xmp and /dev/null differ
diff --git a/tests/phpunit/data/xmp/utf32BE.result.php b/tests/phpunit/data/xmp/utf32BE.result.php
deleted file mode 100644 (file)
index 5e876d9..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = [
-       'xmp-exif' =>
-               [
-                       'DigitalZoomRatio' => '0/10',
-               ],
-       'xmp-general' =>
-               [
-                       'Label' => '􊯍'
-               ],
-];
diff --git a/tests/phpunit/data/xmp/utf32BE.xmp b/tests/phpunit/data/xmp/utf32BE.xmp
deleted file mode 100644 (file)
index 06afdf9..0000000
Binary files a/tests/phpunit/data/xmp/utf32BE.xmp and /dev/null differ
diff --git a/tests/phpunit/data/xmp/utf32LE.result.php b/tests/phpunit/data/xmp/utf32LE.result.php
deleted file mode 100644 (file)
index 5e876d9..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-$result = [
-       'xmp-exif' =>
-               [
-                       'DigitalZoomRatio' => '0/10',
-               ],
-       'xmp-general' =>
-               [
-                       'Label' => '􊯍'
-               ],
-];
diff --git a/tests/phpunit/data/xmp/utf32LE.xmp b/tests/phpunit/data/xmp/utf32LE.xmp
deleted file mode 100644 (file)
index bf2097f..0000000
Binary files a/tests/phpunit/data/xmp/utf32LE.xmp and /dev/null differ
diff --git a/tests/phpunit/data/xmp/xmpExt.result.php b/tests/phpunit/data/xmp/xmpExt.result.php
deleted file mode 100644 (file)
index c91fe29..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-$result = [ 'xmp-exif' =>
-       [
-               'DigitalZoomRatio' => '0/10',
-               'Flash' => '9'
-       ]
-];
diff --git a/tests/phpunit/data/xmp/xmpExt.xmp b/tests/phpunit/data/xmp/xmpExt.xmp
deleted file mode 100644 (file)
index da0383f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core
- 4.1.3-c001 49.282696, Mon Apr 02 2007 21:16:10        "> 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- xmlns:xmpNote="http://ns.adobe.com/xmp/note/"
- exif:DigitalZoomRatio="0/10"
- xmpNote:HasExtendedXMP="28C74E0AC2D796886759006FBE2E57B7">
-<exif:Flash rdf:parseType='Resource'>
-<exif:Fired>True</exif:Fired> <exif:Return>0</exif:Return> <exif:Mode>1</exif:Mode> <exif:Function>False</exif:Function> <exif:RedEyeMode>False</exif:RedEyeMode></exif:Flash> </rdf:Description> </rdf:RDF> </x:xmpmeta>           
-
-<?xpacket end="w"?>
diff --git a/tests/phpunit/data/xmp/xmpExt2.xmp b/tests/phpunit/data/xmp/xmpExt2.xmp
deleted file mode 100644 (file)
index 060abb2..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
-<rdf:Description
- rdf:about=""
- xmlns:exif="http://ns.adobe.com/exif/1.0/"
- exif:FNumber="2/10">
-</rdf:Description>
-</rdf:RDF>
-<?xpacket end="w"?>
index 09c1040..5d9f63d 100644 (file)
@@ -33,9 +33,7 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                $expected = $this->extractExpect( $server, $expectations );
 
                // save up global
-               $old = isset( $_SERVER['SERVER_SOFTWARE'] )
-                       ? $_SERVER['SERVER_SOFTWARE']
-                       : null;
+               $old = $_SERVER['SERVER_SOFTWARE'] ?? null;
                $_SERVER['SERVER_SOFTWARE'] = $server;
                wfUrlencode( null );
 
index 6695fce..974373b 100644 (file)
@@ -676,7 +676,7 @@ class HtmlTest extends MediaWikiTestCase {
                        $ret[] = [
                                $case[0],
                                $case[1], $case[2],
-                               isset( $case[3] ) ? $case[3] : ''
+                               $case[3] ?? ''
                        ];
                }
 
index ed34a8a..3bde5de 100644 (file)
@@ -211,7 +211,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
        public function testSearch( array $case ) {
                $this->searchProvision( null );
 
-               $namespaces = isset( $case['namespaces'] ) ? $case['namespaces'] : [];
+               $namespaces = $case['namespaces'] ?? [];
 
                if ( wfGetDB( DB_REPLICA )->getType() === 'postgres' ) {
                        // Postgres will sort lexicographically on utf8 code units (" " before "/")
@@ -235,7 +235,7 @@ class PrefixSearchTest extends MediaWikiLangTestCase {
        public function testSearchWithOffset( array $case ) {
                $this->searchProvision( null );
 
-               $namespaces = isset( $case['namespaces'] ) ? $case['namespaces'] : [];
+               $namespaces = $case['namespaces'] ?? [];
 
                $searcher = new StringPrefixSearch;
                $results = $searcher->search( $case['query'], 3, $namespaces, 1 );
index 0c178ca..24aee24 100644 (file)
@@ -62,9 +62,7 @@ class TestUserRegistry {
                sort( $groups );
                $key = implode( ',', $groups );
 
-               $testUser = isset( self::$testUsers[$key] )
-                       ? self::$testUsers[$key]
-                       : false;
+               $testUser = self::$testUsers[$key] ?? false;
 
                if ( !$testUser || !$testUser->getUser()->isLoggedIn() ) {
                        $id = self::getNextId();
index cce99ce..b1f4e0c 100644 (file)
@@ -272,8 +272,7 @@ class ApiBaseTest extends ApiTestCase {
                        $input !== null ? [ 'myParam' => $input ] : [] ) );
                $wrapper->mMainModule = new ApiMain( $context );
 
-               $parseLimits = isset( $options['parseLimits'] ) ?
-                       $options['parseLimits'] : true;
+               $parseLimits = $options['parseLimits'] ?? true;
 
                if ( !empty( $options['apihighlimits'] ) ) {
                        $context->setUser( self::$users['sysop']->getUser() );
@@ -1221,7 +1220,7 @@ class ApiBaseTest extends ApiTestCase {
                ];
 
                foreach ( $integerTests as $test ) {
-                       $desc = isset( $test[2] ) ? $test[2] : $test[0];
+                       $desc = $test[2] ?? $test[0];
                        $warnings = isset( $test[3] ) ?
                                [ [ 'apiwarn-badutf8', 'myParam' ] ] : [];
                        $returnArray["\"$desc\" as integer"] = [
index ea13a0d..0428335 100644 (file)
@@ -113,7 +113,7 @@ class ApiComparePagesTest extends ApiTestCase {
                                $value = self::$repl[$m[1]];
                        } else {
                                $value = preg_replace_callback( '/{{REPL:(.+?)}}/', function ( $m ) {
-                                       return isset( self::$repl[$m[1]] ) ? self::$repl[$m[1]] : $m[0];
+                                       return self::$repl[$m[1]] ?? $m[0];
                                }, $value );
                        }
                } elseif ( is_array( $value ) || is_object( $value ) ) {
index d17334b..584c60c 100644 (file)
@@ -491,7 +491,7 @@ class ApiMainTest extends ApiTestCase {
                $module->expects( $this->any() )
                        ->method( 'getConditionalRequestData' )
                        ->will( $this->returnCallback( function ( $condition ) use ( $conditions ) {
-                               return isset( $conditions[$condition] ) ? $conditions[$condition] : null;
+                               return $conditions[$condition] ?? null;
                        } ) );
 
                $ret = $priv->checkConditionalRequestHeaders( $module );
@@ -622,7 +622,7 @@ class ApiMainTest extends ApiTestCase {
                $module->expects( $this->any() )
                        ->method( 'getConditionalRequestData' )
                        ->will( $this->returnCallback( function ( $condition ) use ( $conditions ) {
-                               return isset( $conditions[$condition] ) ? $conditions[$condition] : null;
+                               return $conditions[$condition] ?? null;
                        } ) );
                $priv->mModule = $module;
 
@@ -630,7 +630,7 @@ class ApiMainTest extends ApiTestCase {
 
                foreach ( [ 'Last-Modified', 'ETag' ] as $header ) {
                        $this->assertEquals(
-                               isset( $headers[$header] ) ? $headers[$header] : null,
+                               $headers[$header] ?? null,
                                $response->getHeader( $header ),
                                $header
                        );
index 55f760f..d4aa805 100644 (file)
@@ -59,7 +59,7 @@ class ApiFormatBaseTest extends ApiFormatTestBase {
                if ( $options['name'] !== 'mockfm' ) {
                        $ct = 'text/x-mock';
                        $file = 'api-result.mock';
-                       $status = isset( $options['status'] ) ? $options['status'] : null;
+                       $status = $options['status'] ?? null;
                } elseif ( isset( $params['wrappedhtml'] ) ) {
                        $ct = 'text/mediawiki-api-prettyprint-wrapped';
                        $file = 'api-result-wrapped.json';
index 4169dab..ca20cb6 100644 (file)
@@ -37,13 +37,13 @@ abstract class ApiFormatTestBase extends MediaWikiTestCase {
                if ( is_string( $options ) ) {
                        $options = [ 'class' => $options ];
                }
-               $printerName = isset( $options['name'] ) ? $options['name'] : $this->printerName;
+               $printerName = $options['name'] ?? $this->printerName;
 
                $context = new RequestContext;
                $context->setRequest( new FauxRequest( $params, true ) );
                $main = new ApiMain( $context );
                if ( isset( $options['class'] ) ) {
-                       $factory = isset( $options['factory'] ) ? $options['factory'] : null;
+                       $factory = $options['factory'] ?? null;
                        $main->getModuleManager()->addModule( $printerName, 'format', $options['class'], $factory );
                }
                $result = $main->getResult();
index d4a5acf..9e7ef99 100644 (file)
@@ -30,7 +30,7 @@ class GenerateRandomImages extends Maintenance {
                ];
                $options = getopt( null, $getOptSpec );
 
-               $format = isset( $options['format'] ) ? $options['format'] : 'jpg';
+               $format = $options['format'] ?? 'jpg';
                unset( $options['format'] );
 
                $number = isset( $options['number'] ) ? intval( $options['number'] ) : 10;
index 1d0b471..82f3b92 100644 (file)
@@ -107,7 +107,7 @@ class ApiQueryUserContribsTest extends ApiTestCase {
                                $this->assertArrayHasKey( 'query', $apiResult[0], "Batching with limit $limit" );
                                $this->assertArrayHasKey( 'usercontribs', $apiResult[0]['query'],
                                        "Batching with limit $limit" );
-                               $continue = isset( $apiResult[0]['continue'] ) ? $apiResult[0]['continue'] : null;
+                               $continue = $apiResult[0]['continue'] ?? null;
                                foreach ( $apiResult[0]['query']['usercontribs'] as $page ) {
                                        $count++;
                                        $batchedIds[$page['user']][] = $page['revid'];
index cc16248..d481eb4 100644 (file)
@@ -1063,7 +1063,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        }
 
                        $state = $session->getSecret( 'AuthManager::authnState' );
-                       $maybeLink = isset( $state['maybeLink'] ) ? $state['maybeLink'] : [];
+                       $maybeLink = $state['maybeLink'] ?? [];
                        if ( $link && $response->status === AuthenticationResponse::RESTART ) {
                                $this->assertEquals(
                                        $response->createRequest->maybeLink,
index e5bb237..5c1a925 100644 (file)
@@ -41,7 +41,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         */
        public function testUserName( $userKey, $expectedGender ) {
                $genderCache = MediaWikiServices::getInstance()->getGenderCache();
-               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
+               $username = self::$nameMap[$userKey] ?? $userKey;
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
@@ -53,7 +53,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @covers GenderCache::getGenderOf
         */
        public function testUserObjects( $userKey, $expectedGender ) {
-               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
+               $username = self::$nameMap[$userKey] ?? $userKey;
                $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
@@ -79,7 +79,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @covers GenderCache::getGenderOf
         */
        public function testStripSubpages( $userKey, $expectedGender ) {
-               $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
+               $username = self::$nameMap[$userKey] ?? $userKey;
                $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $gender = $genderCache->getGenderOf( "$username/subpage" );
                $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
index f9e0bc9..417b468 100644 (file)
@@ -53,11 +53,11 @@ class CustomUppercaseCollationTest extends MediaWikiTestCase {
                        [ 'do', 'D' ],
                        [ 'Ao', 'A' ],
                        [ 'afdsa', 'A' ],
-                       [ "\xF3\xB3\x80\x80Foo", 'D' ],
-                       [ "\xF3\xB3\x80\x81Foo", 'C' ],
-                       [ "\xF3\xB3\x80\x82Foo", 'Cs' ],
-                       [ "\xF3\xB3\x80\x83Foo", 'B' ],
-                       [ "\xF3\xB3\x80\x84Foo", "\xF3\xB3\x80\x84" ],
+                       [ "\u{F3000}Foo", 'D' ],
+                       [ "\u{F3001}Foo", 'C' ],
+                       [ "\u{F3002}Foo", 'Cs' ],
+                       [ "\u{F3003}Foo", 'B' ],
+                       [ "\u{F3004}Foo", "\u{F3004}" ],
                        [ 'C', 'C' ],
                        [ 'Cz', 'C' ],
                        [ 'Cs', 'Cs' ],
index e9fc34f..0795609 100644 (file)
@@ -47,7 +47,7 @@ class DatabaseTestHelper extends Database {
 
                $this->profiler = new ProfilerStub( [] );
                $this->trxProfiler = new TransactionProfiler();
-               $this->cliMode = isset( $opts['cliMode'] ) ? $opts['cliMode'] : true;
+               $this->cliMode = $opts['cliMode'] ?? true;
                $this->connLogger = new \Psr\Log\NullLogger();
                $this->queryLogger = new \Psr\Log\NullLogger();
                $this->errorLogger = function ( Exception $e ) {
@@ -198,9 +198,7 @@ class DatabaseTestHelper extends Database {
        }
 
        protected function wasKnownStatementRollbackError() {
-               return isset( $this->lastError['wasKnownStatementRollbackError'] )
-                       ? $this->lastError['wasKnownStatementRollbackError']
-                       : false;
+               return $this->lastError['wasKnownStatementRollbackError'] ?? false;
        }
 
        function fieldInfo( $table, $field ) {
index 0395bff..fac3486 100644 (file)
@@ -393,6 +393,8 @@ class LBFactoryTest extends MediaWikiTestCase {
                $cp->shutdown( null, 'sync', $cpIndex );
 
                $this->assertEquals( null, $cpIndex, "CP write index retained" );
+
+               $this->assertEquals( '45e93a9c215c031d38b7c42d8e4700ca', $cp->getClientId() );
        }
 
        private function newLBFactoryMulti( array $baseOverride = [], array $serverOverride = [] ) {
@@ -419,7 +421,8 @@ class LBFactoryTest extends MediaWikiTestCase {
                                'test-db1' => $wgDBserver,
                        ],
                        'loadMonitorClass' => LoadMonitorNull::class,
-                       'localDomain' => new DatabaseDomain( $wgDBname, null, $wgDBprefix )
+                       'localDomain' => new DatabaseDomain( $wgDBname, null, $wgDBprefix ),
+                       'agent' => 'MW-UNIT-TESTS'
                ] );
        }
 
@@ -609,35 +612,65 @@ class LBFactoryTest extends MediaWikiTestCase {
 
        /**
         * @covers \Wikimedia\Rdbms\LBFactory::makeCookieValueFromCPIndex()
-        * @covers \Wikimedia\Rdbms\LBFactory::getCPIndexFromCookieValue()
+        * @covers \Wikimedia\Rdbms\LBFactory::getCPInfoFromCookieValue()
         */
        public function testCPPosIndexCookieValues() {
-               $this->assertEquals( '3@542', LBFactory::makeCookieValueFromCPIndex( 3, 542 ) );
-
                $time = 1526522031;
+               $agentId = md5( 'Ramsey\'s Loyal Presa Canario' );
+
+               $lbFactory = $this->newLBFactoryMulti();
+               $this->assertEquals(
+                       '3@542#c47dcfb0566e7d7bc110a6128a45c93a',
+                       LBFactory::makeCookieValueFromCPIndex( 3, 542, $agentId )
+               );
+
+               $lbFactory = $this->newLBFactoryMulti();
+               $lbFactory->setRequestInfo( [ 'IPAddress' => '10.64.24.52', 'UserAgent' => 'meow' ] );
+               $this->assertEquals(
+                       '1@542#c47dcfb0566e7d7bc110a6128a45c93a',
+                       LBFactory::makeCookieValueFromCPIndex( 1, 542, $agentId )
+               );
                $this->assertSame(
                        5,
-                       LBFactory::getCPIndexFromCookieValue( "5", $time - 10 )
+                       LBFactory::getCPInfoFromCookieValue( "5", $time - 10 )['index'],
+                       'No time set'
                );
                $this->assertSame(
                        null,
-                       LBFactory::getCPIndexFromCookieValue( "0", $time - 10 )
+                       LBFactory::getCPInfoFromCookieValue( "0", $time - 10 )['index'],
+                       'Bad index'
                );
+
                $this->assertSame(
                        2,
-                       LBFactory::getCPIndexFromCookieValue( "2@$time", $time - 10 )
+                       LBFactory::getCPInfoFromCookieValue( "2@$time", $time - 10 )['index'],
+                       'Fresh'
                );
                $this->assertSame(
                        2,
-                       LBFactory::getCPIndexFromCookieValue( "2@$time", $time + 9 - 10 )
+                       LBFactory::getCPInfoFromCookieValue( "2@$time", $time + 9 - 10 )['index'],
+                       'Almost stale'
+               );
+               $this->assertSame(
+                       null,
+                       LBFactory::getCPInfoFromCookieValue( "0@$time", $time + 9 - 10 )['index'],
+                       'Almost stale; bad index'
                );
                $this->assertSame(
                        null,
-                       LBFactory::getCPIndexFromCookieValue( "0@$time", $time + 9 - 10 )
+                       LBFactory::getCPInfoFromCookieValue( "2@$time", $time + 11 - 10 )['index'],
+                       'Stale'
+               );
+
+               $this->assertSame(
+                       $agentId,
+                       LBFactory::getCPInfoFromCookieValue( "5@$time#$agentId", $time - 10 )['clientId'],
+                       'Live (client ID)'
                );
                $this->assertSame(
                        null,
-                       LBFactory::getCPIndexFromCookieValue( "2@$time", $time + 11 - 10 )
+                       LBFactory::getCPInfoFromCookieValue( "5@$time", $time + 11 - 10 )['clientId'],
+                       'Stale (client ID)'
                );
        }
 }
index 354dae2..c711291 100644 (file)
@@ -35,7 +35,7 @@ class CSSMinTest extends MediaWikiTestCase {
        public static function provideSerializeStringValue() {
                return [
                        [ 'Hello World!', '"Hello World!"' ],
-                       [ "Null\0Null", "\"Null\xEF\xBF\xBDNull\"" ],
+                       [ "Null\0Null", "\"Null\u{FFFD}Null\"" ],
                        [ '"', '"\\""' ],
                        [ "'", '"\'"' ],
                        [ "\\", '"\\\\"' ],
@@ -43,9 +43,9 @@ class CSSMinTest extends MediaWikiTestCase {
                        [ "Space  tab \t space", '"Space  tab \\9  space"' ],
                        [ "Line\nfeed", '"Line\\a feed"' ],
                        [ "Return\rreturn", '"Return\\d return"' ],
-                       [ "Next\xc2\x85line", "\"Next\xc2\x85line\"" ],
+                       [ "Next\u{0085}line", "\"Next\u{0085}line\"" ],
                        [ "Del\x7fDel", '"Del\\7f Del"' ],
-                       [ "nb\xc2\xa0sp", "\"nb\xc2\xa0sp\"" ],
+                       [ "nb\u{00A0}sp", "\"nb\u{00A0}sp\"" ],
                        [ "AMP&amp;AMP", "\"AMP&amp;AMP\"" ],
                        [ '!"#$%&\'()*+,-./0123456789:;<=>?', '"!\\"#$%&\'()*+,-./0123456789:;<=>?"' ],
                        [ '@[\\]^_`{|}~', '"@[\\\\]^_`{|}~"' ],
index 4320d80..b6709a0 100644 (file)
@@ -10,6 +10,8 @@ class BagOStuffTest extends MediaWikiTestCase {
        /** @var BagOStuff */
        private $cache;
 
+       const TEST_KEY = 'test';
+
        protected function setUp() {
                parent::setUp();
 
@@ -23,7 +25,7 @@ class BagOStuffTest extends MediaWikiTestCase {
                        $this->cache = new HashBagOStuff;
                }
 
-               $this->cache->delete( wfMemcKey( 'test' ) );
+               $this->cache->delete( $this->cache->makeKey( self::TEST_KEY ) );
        }
 
        /**
@@ -63,42 +65,34 @@ class BagOStuffTest extends MediaWikiTestCase {
        /**
         * @covers BagOStuff::merge
         * @covers BagOStuff::mergeViaLock
+        * @covers BagOStuff::mergeViaCas
         */
        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';
+               $key = $this->cache->makeKey( self::TEST_KEY );
+               $callback = function ( BagOStuff $cache, $key, $oldVal ) {
+                       return ( $oldVal === false ) ? 'merged' : $oldVal . 'merged';
                };
 
                // merge on non-existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
+               $merged = $this->cache->merge( $key, $callback, 5 );
                $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'merged' );
+               $this->assertEquals( 'merged', $this->cache->get( $key ) );
 
                // merge on existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
+               $merged = $this->cache->merge( $key, $callback, 5 );
                $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
+               $this->assertEquals( 'mergedmerged', $this->cache->get( $key ) );
+       }
 
+       /**
+        * @covers BagOStuff::merge
+        * @covers BagOStuff::mergeViaLock
+        */
+       public function testMerge_fork() {
+               $key = $this->cache->makeKey( self::TEST_KEY );
+               $callback = function ( BagOStuff $cache, $key, $oldVal ) {
+                       return ( $oldVal === false ) ? 'merged' : $oldVal . 'merged';
+               };
                /*
                 * Test concurrent merges by forking this process, if:
                 * - not manually called with --use-bagostuff
@@ -111,33 +105,39 @@ class BagOStuffTest extends MediaWikiTestCase {
                $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();
+                       $pid = null;
+                       // Function to start merge(), run another merge() midway through, then finish
+                       $outerFunc = function ( BagOStuff $cache, $key, $oldVal ) use ( $callback, &$pid ) {
+                               $pid = pcntl_fork();
+                               if ( $pid == -1 ) {
+                                       return false;
+                               } elseif ( $pid ) {
+                                       pcntl_wait( $status );
+
+                                       return $callback( $cache, $key, $oldVal );
+                               } else {
+                                       $this->cache->merge( $key, $callback, 0, 1 );
+                                       // Bail out of the outer merge() in the child process since it does not
+                                       // need to attempt to write anything. Success is checked by the parent.
+                                       parent::tearDown(); // avoid phpunit notices
+                                       exit;
+                               }
+                       };
+
+                       // attempt a merge - this should fail
+                       $merged = $this->cache->merge( $key, $outerFunc, 0, 1 );
+
                        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;
+                               return; // can't fork, ignore this test...
                        }
+
+                       // 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
+                       $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
+               } else {
+                       $this->markTestSkipped( 'No pcntl methods available' );
                }
        }
 
@@ -145,10 +145,10 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::changeTTL
         */
        public function testChangeTTL() {
-               $key = wfMemcKey( 'test' );
+               $key = $this->cache->makeKey( self::TEST_KEY );
                $value = 'meow';
 
-               $this->cache->add( $key, $value );
+               $this->cache->add( $key, $value, 5 );
                $this->assertTrue( $this->cache->changeTTL( $key, 5 ) );
                $this->assertEquals( $this->cache->get( $key ), $value );
                $this->cache->delete( $key );
@@ -159,8 +159,8 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::add
         */
        public function testAdd() {
-               $key = wfMemcKey( 'test' );
-               $this->assertTrue( $this->cache->add( $key, 'test' ) );
+               $key = $this->cache->makeKey( self::TEST_KEY );
+               $this->assertTrue( $this->cache->add( $key, 'test', 5 ) );
        }
 
        /**
@@ -169,16 +169,18 @@ class BagOStuffTest extends MediaWikiTestCase {
        public function testGet() {
                $value = [ 'this' => 'is', 'a' => 'test' ];
 
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, $value );
+               $key = $this->cache->makeKey( self::TEST_KEY );
+               $this->cache->add( $key, $value, 5 );
                $this->assertEquals( $this->cache->get( $key ), $value );
        }
 
        /**
+        * @covers BagOStuff::get
+        * @covers BagOStuff::set
         * @covers BagOStuff::getWithSetCallback
         */
        public function testGetWithSetCallback() {
-               $key = wfMemcKey( 'test' );
+               $key = $this->cache->makeKey( self::TEST_KEY );
                $value = $this->cache->getWithSetCallback(
                        $key,
                        30,
@@ -195,8 +197,8 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::incr
         */
        public function testIncr() {
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, 0 );
+               $key = $this->cache->makeKey( self::TEST_KEY );
+               $this->cache->add( $key, 0, 5 );
                $this->cache->incr( $key );
                $expectedValue = 1;
                $actualValue = $this->cache->get( $key );
@@ -207,7 +209,7 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::incrWithInit
         */
        public function testIncrWithInit() {
-               $key = wfMemcKey( 'test' );
+               $key = $this->cache->makeKey( self::TEST_KEY );
                $val = $this->cache->incrWithInit( $key, 0, 1, 3 );
                $this->assertEquals( 3, $val, "Correct init value" );
 
@@ -224,18 +226,24 @@ class BagOStuffTest extends MediaWikiTestCase {
                $value3 = [ 'testing a key that may be encoded when sent to cache backend' ];
                $value4 = [ 'another test where chars in key will be encoded' ];
 
-               $key1 = wfMemcKey( 'test1' );
-               $key2 = wfMemcKey( 'test2' );
+               $key1 = $this->cache->makeKey( 'test-1' );
+               $key2 = $this->cache->makeKey( 'test-2' );
                // internally, MemcachedBagOStuffs will encode to will-%25-encode
-               $key3 = wfMemcKey( 'will-%-encode' );
-               $key4 = wfMemcKey(
+               $key3 = $this->cache->makeKey( 'will-%-encode' );
+               $key4 = $this->cache->makeKey(
                        '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 );
+               // cleanup
+               $this->cache->delete( $key1 );
+               $this->cache->delete( $key2 );
+               $this->cache->delete( $key3 );
+               $this->cache->delete( $key4 );
+
+               $this->cache->add( $key1, $value1, 5 );
+               $this->cache->add( $key2, $value2, 5 );
+               $this->cache->add( $key3, $value3, 5 );
+               $this->cache->add( $key4, $value4, 5 );
 
                $this->assertEquals(
                        [ $key1 => $value1, $key2 => $value2, $key3 => $value3, $key4 => $value4 ],
@@ -253,7 +261,7 @@ class BagOStuffTest extends MediaWikiTestCase {
         * @covers BagOStuff::getScopedLock
         */
        public function testGetScopedLock() {
-               $key = wfMemcKey( 'test' );
+               $key = $this->cache->makeKey( self::TEST_KEY );
                $value1 = $this->cache->getScopedLock( $key, 0 );
                $value2 = $this->cache->getScopedLock( $key, 0 );
 
index 078b7b3..662bb96 100644 (file)
@@ -21,7 +21,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
        use MediaWikiCoversValidator;
        use PHPUnit4And6Compat;
 
-       /** @var TimeAdjustableWANObjectCache */
+       /** @var WANObjectCache */
        private $cache;
        /** @var BagOStuff */
        private $internalCache;
@@ -29,8 +29,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
        protected function setUp() {
                parent::setUp();
 
-               $this->cache = new TimeAdjustableWANObjectCache( [
-                       'cache' => new TimeAdjustableHashBagOStuff(),
+               $this->cache = new WANObjectCache( [
+                       'cache' => new HashBagOStuff(),
                        'pool' => 'testcache-hash',
                        'relayer' => new EventRelayerNull( [] )
                ] );
@@ -224,10 +224,11 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 0, $wasSet, "Value not regenerated" );
 
-               $priorTime = microtime( true ); // reference time
-               $cache->setTime( $priorTime );
+               $mockWallClock = microtime( true );
+               $priorTime = $mockWallClock; // reference time
+               $cache->setMockTime( $mockWallClock );
 
-               $cache->addTime( 1 );
+               $mockWallClock += 1;
 
                $wasSet = 0;
                $v = $cache->getWithSetCallback(
@@ -242,8 +243,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $t2 = $cache->getCheckKeyTime( $cKey2 );
                $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
 
-               $priorTime = $cache->addTime( 0.01 );
-
+               $mockWallClock += 0.01;
+               $priorTime = $mockWallClock; // reference time
                $wasSet = 0;
                $v = $cache->getWithSetCallback(
                        $key, 30, $func, [ 'checkKeys' => [ $cKey1, $cKey2 ] ] + $extOpts
@@ -284,7 +285,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        return 'xxx' . $wasSet;
                };
 
-               $now = microtime( true ); // reference time
+               $mockWallClock = microtime( true );
+               $priorTime = $mockWallClock; // reference time
 
                $wasSet = 0;
                $key = wfRandomString();
@@ -294,7 +296,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( false, $oldValReceived, "Callback got no stale value" );
                $this->assertEquals( null, $oldAsOfReceived, "Callback got no stale value" );
 
-               $cache->addTime( 40 );
+               $mockWallClock += 40;
                $v = $cache->getWithSetCallback(
                        $key, 30, $checkFunc, [ 'staleTTL' => 50 ] + $extOpts );
                $this->assertEquals( 'xxx2', $v, "Value still returned after expired" );
@@ -302,7 +304,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 'xxx1', $oldValReceived, "Callback got stale value" );
                $this->assertNotEquals( null, $oldAsOfReceived, "Callback got stale value" );
 
-               $cache->addTime( 260 );
+               $mockWallClock += 260;
                $v = $cache->getWithSetCallback(
                        $key, 30, $checkFunc, [ 'staleTTL' => 50 ] + $extOpts );
                $this->assertEquals( 'xxx3', $v, "Value still returned after expired" );
@@ -310,12 +312,12 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( false, $oldValReceived, "Callback got no stale value" );
                $this->assertEquals( null, $oldAsOfReceived, "Callback got no stale value" );
 
+               $mockWallClock = ( $priorTime - $cache::HOLDOFF_TTL - 1 );
                $wasSet = 0;
                $key = wfRandomString();
                $checkKey = $cache->makeKey( 'template', 'X' );
-               $cache->setTime( $now - $cache::HOLDOFF_TTL - 1 );
                $cache->touchCheckKey( $checkKey ); // init check key
-               $cache->setTime( $now );
+               $mockWallClock = $priorTime;
                $v = $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_INDEFINITE,
@@ -327,7 +329,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( false, $oldValReceived, "Callback got no stale value" );
                $this->assertEquals( null, $oldAsOfReceived, "Callback got no stale value" );
 
-               $cache->addTime( $cache::TTL_HOUR ); // some time passes
+               $mockWallClock += $cache::TTL_HOUR; // some time passes
                $v = $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_INDEFINITE,
@@ -338,7 +340,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 1, $wasSet, "Cached value returned" );
 
                $cache->touchCheckKey( $checkKey ); // make key stale
-               $cache->addTime( 0.01 ); // ~1 week left of grace (barely stale to avoid refreshes)
+               $mockWallClock += 0.01; // ~1 week left of grace (barely stale to avoid refreshes)
 
                $v = $cache->getWithSetCallback(
                        $key,
@@ -350,8 +352,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 1, $wasSet, "Value still returned after expired (in grace)" );
 
                // Change of refresh increase to unity as staleness approaches graceTTL
-
-               $cache->addTime( $cache::TTL_WEEK ); // 8 days of being stale
+               $mockWallClock += $cache::TTL_WEEK; // 8 days of being stale
                $v = $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_INDEFINITE,
@@ -408,17 +409,17 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        $asycList[] = $callback;
                };
                $cache = new NearExpiringWANObjectCache( [
-                       'cache'        => new TimeAdjustableHashBagOStuff(),
+                       'cache'        => new HashBagOStuff(),
                        'pool'         => 'empty',
                        'asyncHandler' => $asyncHandler
                ] );
 
-               $now = microtime( true ); // reference time
-               $cache->setTime( $now );
+               $mockWallClock = microtime( true );
+               $priorTime = $mockWallClock; // reference time
+               $cache->setMockTime( $mockWallClock );
 
                $wasSet = 0;
                $key = wfRandomString();
-               $checkKey = wfRandomString();
                $opts = [ 'lowTTL' => 100 ];
                $v = $cache->getWithSetCallback( $key, 300, $func, $opts );
                $this->assertEquals( $value, $v, "Value returned" );
@@ -427,7 +428,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 1, $wasSet, "Cached value used" );
                $this->assertEquals( $v, $value, "Value cached" );
 
-               $cache->setTime( $now + 250 );
+               $mockWallClock += 250;
                $v = $cache->getWithSetCallback( $key, 300, $func, $opts );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Stale value used" );
@@ -441,11 +442,12 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( $value, $v, "New value stored" );
 
                $cache = new PopularityRefreshingWANObjectCache( [
-                       'cache'   => new TimeAdjustableHashBagOStuff(),
+                       'cache'   => new HashBagOStuff(),
                        'pool'    => 'empty'
                ] );
 
-               $cache->setTime( $now );
+               $mockWallClock = $priorTime;
+               $cache->setMockTime( $mockWallClock );
 
                $wasSet = 0;
                $key = wfRandomString();
@@ -453,18 +455,22 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $v = $cache->getWithSetCallback( $key, 60, $func, $opts );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value calculated" );
-               $cache->setTime( $now + 30 );
+
+               $mockWallClock += 30;
+
                $v = $cache->getWithSetCallback( $key, 60, $func, $opts );
                $this->assertEquals( 1, $wasSet, "Value cached" );
 
+               $mockWallClock = $priorTime;
                $wasSet = 0;
                $key = wfRandomString();
                $opts = [ 'hotTTR' => 10 ];
-               $cache->setTime( $now );
                $v = $cache->getWithSetCallback( $key, 60, $func, $opts );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value calculated" );
-               $cache->setTime( $now + 30 );
+
+               $mockWallClock += 30;
+
                $v = $cache->getWithSetCallback( $key, 60, $func, $opts );
                $this->assertEquals( $value, $v, "Value returned" );
                $this->assertEquals( 2, $wasSet, "Value re-calculated" );
@@ -538,10 +544,11 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
                $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in process cache" );
 
-               $priorTime = microtime( true ); // reference time
-               $cache->setTime( $priorTime );
+               $mockWallClock = microtime( true );
+               $priorTime = $mockWallClock; // reference time
+               $cache->setMockTime( $mockWallClock );
 
-               $cache->addTime( 1 );
+               $mockWallClock += 1;
 
                $wasSet = 0;
                $keyedIds = new ArrayIterator( [ $keyB => 'efef' ] );
@@ -557,7 +564,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $t2 = $cache->getCheckKeyTime( $cKey2 );
                $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
 
-               $priorTime = $cache->addTime( 0.01 );
+               $mockWallClock += 0.01;
+               $priorTime = $mockWallClock;
                $value = "@43636$";
                $wasSet = 0;
                $keyedIds = new ArrayIterator( [ $keyC => 43636 ] );
@@ -707,10 +715,11 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
                $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in process cache" );
 
-               $priorTime = microtime( true ); // reference time
-               $cache->setTime( $priorTime );
+               $mockWallClock = microtime( true );
+               $priorTime = $mockWallClock; // reference time
+               $cache->setMockTime( $mockWallClock );
 
-               $cache->addTime( 1 );
+               $mockWallClock += 1;
 
                $wasSet = 0;
                $keyedIds = new ArrayIterator( [ $keyB => 'efef' ] );
@@ -724,7 +733,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $t2 = $cache->getCheckKeyTime( $cKey2 );
                $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
 
-               $priorTime = $cache->addTime( 0.01 );
+               $mockWallClock += 0.01;
+               $priorTime = $mockWallClock;
                $value = "@43636$";
                $wasSet = 0;
                $keyedIds = new ArrayIterator( [ $keyC => 43636 ] );
@@ -959,10 +969,11 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $cKey1 = wfRandomString();
                $cKey2 = wfRandomString();
 
-               $priorTime = microtime( true ); // reference time
-               $cache->setTime( $priorTime );
+               $mockWallClock = microtime( true );
+               $priorTime = $mockWallClock; // reference time
+               $cache->setMockTime( $mockWallClock );
 
-               $cache->addTime( 1 );
+               $mockWallClock += 1;
 
                $curTTLs = [];
                $this->assertEquals(
@@ -978,7 +989,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
                $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
 
-               $cache->addTime( 1 );
+               $mockWallClock += 1;
 
                $curTTLs = [];
                $this->assertEquals(
@@ -1005,7 +1016,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $value1 = wfRandomString();
                $value2 = wfRandomString();
 
-               $cache->setTime( microtime( true ) );
+               $mockWallClock = microtime( true );
+               $cache->setMockTime( $mockWallClock );
 
                // Fake initial check key to be set in the past. Otherwise we'd have to sleep for
                // several seconds during the test to assert the behaviour.
@@ -1013,7 +1025,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        $cache->touchCheckKey( $checkKey, WANObjectCache::HOLDOFF_NONE );
                }
 
-               $cache->addTime( 0.100 );
+               $mockWallClock += 0.100;
 
                $cache->set( 'key1', $value1, 10 );
                $cache->set( 'key2', $value2, 10 );
@@ -1035,7 +1047,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertGreaterThanOrEqual( 9.5, $curTTLs['key2'], 'Initial ttls' );
                $this->assertLessThanOrEqual( 10.5, $curTTLs['key2'], 'Initial ttls' );
 
-               $cache->addTime( 0.100 );
+               $mockWallClock += 0.100;
                $cache->touchCheckKey( $check1 );
 
                $curTTLs = [];
@@ -1292,15 +1304,16 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $cache = $this->cache;
                $key = wfRandomString();
 
-               $priorTime = microtime( true ); // reference time
-               $cache->setTime( $priorTime );
+               $mockWallClock = microtime( true );
+               $priorTime = $mockWallClock; // reference time
+               $cache->setMockTime( $mockWallClock );
 
-               $newTime = $cache->addTime( 0.100 );
+               $mockWallClock += 0.100;
                $t0 = $cache->getCheckKeyTime( $key );
                $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
 
-               $priorTime = $newTime;
-               $newTime = $cache->addTime( 0.100 );
+               $priorTime = $mockWallClock;
+               $mockWallClock += 0.100;
                $cache->touchCheckKey( $key );
                $t1 = $cache->getCheckKeyTime( $key );
                $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
@@ -1308,7 +1321,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $t2 = $cache->getCheckKeyTime( $key );
                $this->assertEquals( $t1, $t2, 'Check key time did not change' );
 
-               $cache->addTime( 0.100 );
+               $mockWallClock += 0.100;
                $cache->touchCheckKey( $key );
                $t3 = $cache->getCheckKeyTime( $key );
                $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
@@ -1316,7 +1329,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $t4 = $cache->getCheckKeyTime( $key );
                $this->assertEquals( $t3, $t4, 'Check key time did not change' );
 
-               $cache->addTime( 0.100 );
+               $mockWallClock += 0.100;
                $cache->resetCheckKey( $key );
                $t5 = $cache->getCheckKeyTime( $key );
                $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
@@ -1683,43 +1696,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
        }
 }
 
-class TimeAdjustableHashBagOStuff extends HashBagOStuff {
-       private $timeOverride = 0;
-
-       public function setTime( $time ) {
-               $this->timeOverride = $time;
-       }
-
-       protected function getCurrentTime() {
-               return $this->timeOverride ?: parent::getCurrentTime();
-       }
-}
-
-class TimeAdjustableWANObjectCache extends WANObjectCache {
-       private $timeOverride = 0;
-
-       public function setTime( $time ) {
-               $this->timeOverride = $time;
-               if ( $this->cache instanceof TimeAdjustableHashBagOStuff ) {
-                       $this->cache->setTime( $time );
-               }
-       }
-
-       public function addTime( $time ) {
-               $this->timeOverride += $time;
-               if ( $this->cache instanceof TimeAdjustableHashBagOStuff ) {
-                       $this->cache->setTime( $this->timeOverride );
-               }
-
-               return $this->timeOverride;
-       }
-
-       protected function getCurrentTime() {
-               return $this->timeOverride ?: parent::getCurrentTime();
-       }
-}
-
-class NearExpiringWANObjectCache extends TimeAdjustableWANObjectCache {
+class NearExpiringWANObjectCache extends WANObjectCache {
        const CLOCK_SKEW = 1;
 
        protected function worthRefreshExpiring( $curTTL, $lowTTL ) {
@@ -1727,7 +1704,7 @@ class NearExpiringWANObjectCache extends TimeAdjustableWANObjectCache {
        }
 }
 
-class PopularityRefreshingWANObjectCache extends TimeAdjustableWANObjectCache {
+class PopularityRefreshingWANObjectCache extends WANObjectCache {
        protected function worthRefreshPopular( $asOf, $ageNew, $timeTillRefresh, $now ) {
                return ( ( $now - $asOf ) > $timeTillRefresh );
        }
index 93192d0..a86a1c9 100644 (file)
@@ -79,12 +79,12 @@ class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase {
 
                        // unicode chars
                        [
-                               self::createUnicodeString( '`\u0001a\uFFFFb`' ),
-                               self::createUnicodeString( '\u0001a\uFFFFb' )
+                               "`\u{0001}a\u{FFFF}b`",
+                               "\u{0001}a\u{FFFF}b"
                        ],
                        [
-                               self::createUnicodeString( '`\u0001\uFFFF`' ),
-                               self::createUnicodeString( '\u0001\u0000\uFFFF\u0000' )
+                               "`\u{0001}\u{FFFF}`",
+                               "\u{0001}\u{0000}\u{FFFF}\u{0000}"
                        ],
                        [ '`☃`', '☃' ],
                        [ '`メインページ`', 'メインページ' ],
@@ -97,10 +97,6 @@ class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase {
                ];
        }
 
-       private static function createUnicodeString( $str ) {
-               return json_decode( '"' . $str . '"' );
-       }
-
        private function getMockForViews() {
                $db = $this->getMockBuilder( DatabaseMysqli::class )
                        ->disableOriginalConstructor()
index 84c0c1c..d9919e1 100644 (file)
@@ -53,10 +53,10 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->select(
                        $sql['tables'],
                        $sql['fields'],
-                       isset( $sql['conds'] ) ? $sql['conds'] : [],
+                       $sql['conds'] ?? [],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : [],
-                       isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
+                       $sql['options'] ?? [],
+                       $sql['join_conds'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -266,10 +266,10 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->selectRowCount(
                        $sql['tables'],
                        $sql['field'],
-                       isset( $sql['conds'] ) ? $sql['conds'] : [],
+                       $sql['conds'] ?? [],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : [],
-                       isset( $sql['join_conds'] ) ? $sql['join_conds'] : []
+                       $sql['options'] ?? [],
+                       $sql['join_conds'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -363,7 +363,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['values'],
                        $sql['conds'],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : []
+                       $sql['options'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -531,7 +531,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['table'],
                        $sql['rows'],
                        __METHOD__,
-                       isset( $sql['options'] ) ? $sql['options'] : []
+                       $sql['options'] ?? []
                );
                $this->assertLastSql( $sqlText );
        }
@@ -587,9 +587,9 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['varMap'],
                        $sql['conds'],
                        __METHOD__,
-                       isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
-                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
-                       isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
+                       $sql['insertOptions'] ?? [],
+                       $sql['selectOptions'] ?? [],
+                       $sql['selectJoinConds'] ?? []
                );
                $this->assertLastSql( $sqlTextNative );
 
@@ -603,9 +603,9 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $sql['varMap'],
                        $sql['conds'],
                        __METHOD__,
-                       isset( $sql['insertOptions'] ) ? $sql['insertOptions'] : [],
-                       isset( $sql['selectOptions'] ) ? $sql['selectOptions'] : [],
-                       isset( $sql['selectJoinConds'] ) ? $sql['selectJoinConds'] : []
+                       $sql['insertOptions'] ?? [],
+                       $sql['selectOptions'] ?? [],
+                       $sql['selectJoinConds'] ?? []
                );
                $this->assertLastSqlDb( implode( '; ', [ $sqlSelect, 'BEGIN', $sqlInsert, 'COMMIT' ] ), $dbWeb );
        }
@@ -1012,10 +1012,10 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                        $params['table'],
                        $params['vars'],
                        $params['permute_conds'],
-                       isset( $params['extra_conds'] ) ? $params['extra_conds'] : '',
+                       $params['extra_conds'] ?? '',
                        'FNAME',
-                       isset( $params['options'] ) ? $params['options'] : [],
-                       isset( $params['join_conds'] ) ? $params['join_conds'] : []
+                       $params['options'] ?? [],
+                       $params['join_conds'] ?? []
                ) );
                $this->assertEquals( $expect, $sql );
        }
diff --git a/tests/phpunit/includes/libs/xmp/XMPTest.php b/tests/phpunit/includes/libs/xmp/XMPTest.php
deleted file mode 100644 (file)
index 73fd471..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-<?php
-
-/**
- * @group Media
- * @covers XMPReader
- */
-class XMPTest extends PHPUnit\Framework\TestCase {
-
-       use MediaWikiCoversValidator;
-
-       protected function setUp() {
-               parent::setUp();
-               # Requires libxml to do XMP parsing
-               if ( !extension_loaded( 'exif' ) ) {
-                       $this->markTestSkipped( "PHP extension 'exif' is not loaded, skipping." );
-               }
-       }
-
-       /**
-        * Put XMP in, compare what comes out...
-        *
-        * @param string $xmp The actual xml data.
-        * @param array $expected Expected result of parsing the xmp.
-        * @param string $info Short sentence on what's being tested.
-        *
-        * @throws Exception
-        * @dataProvider provideXMPParse
-        *
-        * @covers XMPReader::parse
-        */
-       public function testXMPParse( $xmp, $expected, $info ) {
-               if ( !is_string( $xmp ) || !is_array( $expected ) ) {
-                       throw new Exception( "Invalid data provided to " . __METHOD__ );
-               }
-               $reader = new XMPReader;
-               $reader->parse( $xmp );
-               $this->assertEquals( $expected, $reader->getResults(), $info, 0.0000000001 );
-       }
-
-       public static function provideXMPParse() {
-               $xmpPath = __DIR__ . '/../../../data/xmp/';
-               $data = [];
-
-               // $xmpFiles format: array of arrays with first arg file base name,
-               // with the actual file having .xmp on the end for the xmp
-               // and .result.php on the end for a php file containing the result
-               // array. Second argument is some info on what's being tested.
-               $xmpFiles = [
-                       [ '1', 'parseType=Resource test' ],
-                       [ '2', 'Structure with mixed attribute and element props' ],
-                       [ '3', 'Extra qualifiers (that should be ignored)' ],
-                       [ '3-invalid', 'Test ignoring qualifiers that look like normal props' ],
-                       [ '4', 'Flash as qualifier' ],
-                       [ '5', 'Flash as qualifier 2' ],
-                       [ '6', 'Multiple rdf:Description' ],
-                       [ '7', 'Generic test of several property types' ],
-                       [ 'flash', 'Test of Flash property' ],
-                       [ 'invalid-child-not-struct', 'Test child props not in struct or ignored' ],
-                       [ 'no-recognized-props', 'Test namespace and no recognized props' ],
-                       [ 'no-namespace', 'Test non-namespaced attributes are ignored' ],
-                       [ 'bag-for-seq', "Allow bag's instead of seq's. (T29105)" ],
-                       [ 'utf16BE', 'UTF-16BE encoding' ],
-                       [ 'utf16LE', 'UTF-16LE encoding' ],
-                       [ 'utf32BE', 'UTF-32BE encoding' ],
-                       [ 'utf32LE', 'UTF-32LE encoding' ],
-                       [ 'xmpExt', 'Extended XMP missing second part' ],
-                       [ 'gps', 'Handling of exif GPS parameters in XMP' ],
-               ];
-
-               $xmpFiles[] = [ 'doctype-included', 'XMP includes doctype' ];
-
-               foreach ( $xmpFiles as $file ) {
-                       $xmp = file_get_contents( $xmpPath . $file[0] . '.xmp' );
-                       // I'm not sure if this is the best way to handle getting the
-                       // result array, but it seems kind of big to put directly in the test
-                       // file.
-                       $result = null;
-                       include $xmpPath . $file[0] . '.result.php';
-                       $data[] = [ $xmp, $result, '[' . $file[0] . '.xmp] ' . $file[1] ];
-               }
-
-               return $data;
-       }
-
-       /** Test ExtendedXMP block support. (Used when the XMP has to be split
-        * over multiple jpeg segments, due to 64k size limit on jpeg segments.
-        *
-        * @todo This is based on what the standard says. Need to find a real
-        * world example file to double check the support for this is right.
-        *
-        * @covers XMPReader::parseExtended
-        */
-       public function testExtendedXMP() {
-               $xmpPath = __DIR__ . '/../../../data/xmp/';
-               $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
-               $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
-               $md5sum = '28C74E0AC2D796886759006FBE2E57B7'; // of xmpExt2.xmp
-               $length = pack( 'N', strlen( $extendedXMP ) );
-               $offset = pack( 'N', 0 );
-               $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
-               $reader = new XMPReader();
-               $reader->parse( $standardXMP );
-               $reader->parseExtended( $extendedPacket );
-               $actual = $reader->getResults();
-
-               $expected = [
-                       'xmp-exif' => [
-                               'DigitalZoomRatio' => '0/10',
-                               'Flash' => 9,
-                               'FNumber' => '2/10',
-                       ]
-               ];
-
-               $this->assertEquals( $expected, $actual );
-       }
-
-       /**
-        * This test has an extended XMP block with a wrong guid (md5sum)
-        * and thus should only return the StandardXMP, not the ExtendedXMP.
-        *
-        * @covers XMPReader::parseExtended
-        */
-       public function testExtendedXMPWithWrongGUID() {
-               $xmpPath = __DIR__ . '/../../../data/xmp/';
-               $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
-               $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
-               $md5sum = '28C74E0AC2D796886759006FBE2E57B9'; // Note last digit.
-               $length = pack( 'N', strlen( $extendedXMP ) );
-               $offset = pack( 'N', 0 );
-               $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
-               $reader = new XMPReader();
-               $reader->parse( $standardXMP );
-               $reader->parseExtended( $extendedPacket );
-               $actual = $reader->getResults();
-
-               $expected = [
-                       'xmp-exif' => [
-                               'DigitalZoomRatio' => '0/10',
-                               'Flash' => 9,
-                       ]
-               ];
-
-               $this->assertEquals( $expected, $actual );
-       }
-
-       /**
-        * Have a high offset to simulate a missing packet,
-        * which should cause it to ignore the ExtendedXMP packet.
-        *
-        * @covers XMPReader::parseExtended
-        */
-       public function testExtendedXMPMissingPacket() {
-               $xmpPath = __DIR__ . '/../../../data/xmp/';
-               $standardXMP = file_get_contents( $xmpPath . 'xmpExt.xmp' );
-               $extendedXMP = file_get_contents( $xmpPath . 'xmpExt2.xmp' );
-
-               $md5sum = '28C74E0AC2D796886759006FBE2E57B7'; // of xmpExt2.xmp
-               $length = pack( 'N', strlen( $extendedXMP ) );
-               $offset = pack( 'N', 2048 );
-               $extendedPacket = $md5sum . $length . $offset . $extendedXMP;
-
-               $reader = new XMPReader();
-               $reader->parse( $standardXMP );
-               $reader->parseExtended( $extendedPacket );
-               $actual = $reader->getResults();
-
-               $expected = [
-                       'xmp-exif' => [
-                               'DigitalZoomRatio' => '0/10',
-                               'Flash' => 9,
-                       ]
-               ];
-
-               $this->assertEquals( $expected, $actual );
-       }
-
-       /**
-        * Test for multi-section, hostile XML
-        * @covers XMPReader::checkParseSafety
-        */
-       public function testCheckParseSafety() {
-               // Test for detection
-               $xmpPath = __DIR__ . '/../../../data/xmp/';
-               $file = fopen( $xmpPath . 'doctype-included.xmp', 'rb' );
-               $valid = false;
-               $reader = new XMPReader();
-               do {
-                       $chunk = fread( $file, 10 );
-                       $valid = $reader->parse( $chunk, feof( $file ) );
-               } while ( !feof( $file ) );
-               $this->assertFalse( $valid, 'Check that doctype is detected in fragmented XML' );
-               $this->assertEquals(
-                       [],
-                       $reader->getResults(),
-                       'Check that doctype is detected in fragmented XML'
-               );
-               fclose( $file );
-               unset( $reader );
-
-               // Test for false positives
-               $file = fopen( $xmpPath . 'doctype-not-included.xmp', 'rb' );
-               $valid = false;
-               $reader = new XMPReader();
-               do {
-                       $chunk = fread( $file, 10 );
-                       $valid = $reader->parse( $chunk, feof( $file ) );
-               } while ( !feof( $file ) );
-               $this->assertTrue(
-                       $valid,
-                       'Check for false-positive detecting doctype in fragmented XML'
-               );
-               $this->assertEquals(
-                       [
-                               'xmp-exif' => [
-                                       'DigitalZoomRatio' => '0/10',
-                                       'Flash' => '9'
-                               ]
-                       ],
-                       $reader->getResults(),
-                       'Check that doctype is detected in fragmented XML'
-               );
-       }
-}
diff --git a/tests/phpunit/includes/libs/xmp/XMPValidateTest.php b/tests/phpunit/includes/libs/xmp/XMPValidateTest.php
deleted file mode 100644 (file)
index 746f68a..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-use Psr\Log\NullLogger;
-
-/**
- * @group Media
- */
-class XMPValidateTest extends PHPUnit\Framework\TestCase {
-
-       use MediaWikiCoversValidator;
-
-       /**
-        * @dataProvider provideDates
-        * @covers XMPValidate::validateDate
-        */
-       public function testValidateDate( $value, $expected ) {
-               // The method should modify $value.
-               $validate = new XMPValidate( new NullLogger() );
-               $validate->validateDate( [], $value, true );
-               $this->assertEquals( $expected, $value );
-       }
-
-       public static function provideDates() {
-               /* For reference valid date formats are:
-                * YYYY
-                * YYYY-MM
-                * YYYY-MM-DD
-                * YYYY-MM-DDThh:mmTZD
-                * YYYY-MM-DDThh:mm:ssTZD
-                * YYYY-MM-DDThh:mm:ss.sTZD
-                * (Time zone is optional)
-                */
-               return [
-                       [ '1992', '1992' ],
-                       [ '1992-04', '1992:04' ],
-                       [ '1992-02-01', '1992:02:01' ],
-                       [ '2011-09-29', '2011:09:29' ],
-                       [ '1982-12-15T20:12', '1982:12:15 20:12' ],
-                       [ '1982-12-15T20:12Z', '1982:12:15 20:12' ],
-                       [ '1982-12-15T20:12+02:30', '1982:12:15 22:42' ],
-                       [ '1982-12-15T01:12-02:30', '1982:12:14 22:42' ],
-                       [ '1982-12-15T20:12:11', '1982:12:15 20:12:11' ],
-                       [ '1982-12-15T20:12:11Z', '1982:12:15 20:12:11' ],
-                       [ '1982-12-15T20:12:11+01:10', '1982:12:15 21:22:11' ],
-                       [ '2045-12-15T20:12:11', '2045:12:15 20:12:11' ],
-                       [ '1867-06-01T15:00:00', '1867:06:01 15:00:00' ],
-                       /* some invalid ones */
-                       [ '2001--12', null ],
-                       [ '2001-5-12', null ],
-                       [ '2001-5-12TZ', null ],
-                       [ '2001-05-12T15', null ],
-                       [ '2001-12T15:13', null ],
-               ];
-       }
-}
index 786d761..883af71 100644 (file)
@@ -33,19 +33,19 @@ abstract class LogFormatterTestCase extends MediaWikiLangTestCase {
                        // no log_id because no insert in database
                        'log_type' => $data['type'],
                        'log_action' => $data['action'],
-                       'log_timestamp' => isset( $data['timestamp'] ) ? $data['timestamp'] : wfTimestampNow(),
-                       'log_user' => isset( $data['user'] ) ? $data['user'] : 0,
-                       'log_user_text' => isset( $data['user_text'] ) ? $data['user_text'] : 'User',
-                       'log_actor' => isset( $data['actor'] ) ? $data['actor'] : 0,
-                       'log_namespace' => isset( $data['namespace'] ) ? $data['namespace'] : NS_MAIN,
-                       'log_title' => isset( $data['title'] ) ? $data['title'] : 'Main_Page',
-                       'log_page' => isset( $data['page'] ) ? $data['page'] : 0,
-                       'log_comment_text' => isset( $data['comment'] ) ? $data['comment'] : '',
+                       'log_timestamp' => $data['timestamp'] ?? wfTimestampNow(),
+                       'log_user' => $data['user'] ?? 0,
+                       'log_user_text' => $data['user_text'] ?? 'User',
+                       'log_actor' => $data['actor'] ?? 0,
+                       'log_namespace' => $data['namespace'] ?? NS_MAIN,
+                       'log_title' => $data['title'] ?? 'Main_Page',
+                       'log_page' => $data['page'] ?? 0,
+                       'log_comment_text' => $data['comment'] ?? '',
                        'log_comment_data' => null,
                        'log_params' => $legacy
                                ? LogPage::makeParamBlob( $data['params'] )
                                : LogEntryBase::makeParamBlob( $data['params'] ),
-                       'log_deleted' => isset( $data['deleted'] ) ? $data['deleted'] : 0,
+                       'log_deleted' => $data['deleted'] ?? 0,
                ];
        }
 
index 40c4e1e..68539b5 100644 (file)
@@ -96,6 +96,8 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
         * @covers WikiPage::doEditUpdates
         */
        public function testDoEditContent() {
+               $this->setMwGlobals( 'wgPageCreationLog', true );
+
                $page = $this->newPage( __METHOD__ );
                $title = $page->getTitle();
 
@@ -108,13 +110,21 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
 
                $page->doEditContent( $content, "[[testing]] 1" );
 
+               $id = $page->getId();
+
+               // Test page creation logging
+               $this->assertSelect(
+                       'logging',
+                       [ 'log_type', 'log_action' ],
+                       [ 'log_page' => $id ],
+                       [ [ 'create', 'create' ] ]
+               );
+
                $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
-               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
+               $this->assertTrue( $id > 0, "WikiPage should have new page id" );
                $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
                $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
 
-               $id = $page->getId();
-
                # ------------------------
                $dbr = wfGetDB( DB_REPLICA );
                $res = $dbr->select( 'pagelinks', '*', [ 'pl_from' => $id ] );
index c917882..0ea4e2b 100644 (file)
@@ -4,8 +4,6 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
        /**
         * @covers ResourceLoaderModule::getVersionHash
-        * @covers ResourceLoaderModule::getModifiedTime
-        * @covers ResourceLoaderModule::getModifiedHash
         */
        public function testGetVersionHash() {
                $context = $this->getResourceLoaderContext();
index ca4fb34..6983704 100644 (file)
@@ -463,7 +463,7 @@ mw.loader.register( [
                        $this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
                }
 
-               $extraQuery = isset( $case['extraQuery'] ) ? $case['extraQuery'] : [];
+               $extraQuery = $case['extraQuery'] ?? [];
                $context = $this->getResourceLoaderContext( $extraQuery );
                $rl = $context->getResourceLoader();
                $rl->register( $case['modules'] );
index 8b8ba0c..d84fcd7 100644 (file)
@@ -101,7 +101,7 @@ abstract class AbstractChangesListSpecialPageTestCase extends MediaWikiTestCase
                $output->method( 'redirect' )->willReturnCallback(
                        function ( $url ) use ( &$redirectQuery, &$redirected ) {
                                $urlParts = wfParseUrl( $url );
-                               $query = isset( $urlParts[ 'query' ] ) ? $urlParts[ 'query' ] : '';
+                               $query = $urlParts[ 'query' ] ?? '';
                                parse_str( $query, $redirectQuery );
                                $redirected = true;
                        }
index c272551..e1b98ec 100644 (file)
@@ -104,13 +104,6 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        // names ending in "a" to be female.
                        [ NS_USER, 'Lisa_Müller', '', '', 'de', 'Benutzerin:Lisa Müller' ],
                        [ NS_MAIN, 'FooBar', '', 'remotetestiw', 'en', 'remotetestiw:FooBar' ],
-                       // Strip soft hyphen and Unicode directional formatting characters
-                       [ NS_MAIN, "Foo\xC2\xAD\xD8\x9C\xE2\x80\x8E\xE2\x80\x8F\xE2\x80\xAA\xE2\x80\xAB" .
-                               "\xE2\x80\xAC\xE2\x80\xAD\xE2\x80\xAE\xE2\x81\xA6\xE2\x81\xA7" .
-                               "\xE2\x81\xA8\xE2\x81\xA9bar", '', '', 'en',
-                               "Foo\xC2\xAD\xD8\x9C\xE2\x80\x8E\xE2\x80\x8F\xE2\x80\xAA\xE2\x80\xAB" .
-                               "\xE2\x80\xAC\xE2\x80\xAD\xE2\x80\xAE\xE2\x81\xA6\xE2\x81\xA7" .
-                               "\xE2\x81\xA8\xE2\x81\xA9bar", 'Foobar' ],
                ];
        }
 
index 8653bcd..7e29c92 100644 (file)
@@ -1593,9 +1593,9 @@ class LanguageTest extends LanguageClassesTestCase {
         * @covers Language::embedBidi()
         */
        public function testEmbedBidi() {
-               $lre = "\xE2\x80\xAA"; // U+202A LEFT-TO-RIGHT EMBEDDING
-               $rle = "\xE2\x80\xAB"; // U+202B RIGHT-TO-LEFT EMBEDDING
-               $pdf = "\xE2\x80\xAC"; // U+202C POP DIRECTIONAL FORMATTING
+               $lre = "\u{202A}"; // U+202A LEFT-TO-RIGHT EMBEDDING
+               $rle = "\u{202B}"; // U+202B RIGHT-TO-LEFT EMBEDDING
+               $pdf = "\u{202C}"; // U+202C POP DIRECTIONAL FORMATTING
                $lang = $this->getLang();
                $this->assertEquals(
                        '123',
index e37f67d..db96fd5 100644 (file)
@@ -44,9 +44,9 @@ function cssfilter( $val ) {
 $params = array_map( 'cssfilter', $_GET );
 
 // Defaults
-$selector = isset( $params['selector'] ) ? $params['selector'] : '.mw-test-example';
-$property = isset( $params['prop'] ) ? $params['prop'] : 'float';
-$value = isset( $params['val'] ) ? $params['val'] : 'right';
+$selector = $params['selector'] ?? '.mw-test-example';
+$property = $params['prop'] ?? 'float';
+$value = $params['val'] ?? 'right';
 $wait = isset( $params['wait'] ) ? (int)$params['wait'] : 0; // seconds
 
 sleep( $wait );
index e8db4e1..d6fe744 100644 (file)
                title = new mw.Title( 'Foo \u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000 bar' );
                assert.equal( title.getMain(), 'Foo_bar', 'Merge multiple types of whitespace/underscores into a single underscore' );
 
-               title = new mw.Title( 'Foo\u00AD\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069bar' );
-               assert.equal( title.getMain(), 'Foobar', 'Strip soft hyphen and Unicode directional formatting characters' );
+               title = new mw.Title( 'Foo\u200E\u200F\u202A\u202B\u202C\u202D\u202Ebar' );
+               assert.equal( title.getMain(), 'Foobar', 'Strip Unicode bidi override characters' );
 
                // Regression test: Previously it would only detect an extension if there is no space after it
                title = new mw.Title( 'Example.js  ' );
                                },
                                {
                                        fileName: 'BI\u200EDI.jpg',
-                                       typeOfName: 'Name containing Unicode directional formatting characters',
+                                       typeOfName: 'Name containing BIDI overrides',
                                        nameText: 'BIDI',
                                        prefixedText: 'File:BIDI.jpg'
                                },
index a3c9d84..b59116e 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -94,7 +94,7 @@ function wfStreamThumb( array $params ) {
 
        $headers = []; // HTTP headers to send
 
-       $fileName = isset( $params['f'] ) ? $params['f'] : '';
+       $fileName = $params['f'] ?? '';
 
        // Backwards compatibility parameters
        if ( isset( $params['w'] ) ) {
@@ -244,7 +244,7 @@ function wfStreamThumb( array $params ) {
                }
        }
 
-       $rel404 = isset( $params['rel404'] ) ? $params['rel404'] : null;
+       $rel404 = $params['rel404'] ?? null;
        unset( $params['r'] ); // ignore 'r' because we unconditionally pass File::RENDER
        unset( $params['f'] ); // We're done with 'f' parameter.
        unset( $params['rel404'] ); // moved to $rel404
@@ -648,7 +648,7 @@ function wfThumbError( $status, $msgHtml, $msgText = null, $context = [] ) {
        if ( $wgShowHostnames ) {
                header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );
                $url = htmlspecialchars(
-                       isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '',
+                       $_SERVER['REQUEST_URI'] ?? '',
                        ENT_NOQUOTES
                );
                $hostname = htmlspecialchars( wfHostname(), ENT_NOQUOTES );