Merge "installer: Hide binary/utf-8 charset option from users"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 1 Jun 2018 21:25:58 +0000 (21:25 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 1 Jun 2018 21:25:58 +0000 (21:25 +0000)
576 files changed:
.phpcs.xml
RELEASE-NOTES-1.32
autoload.php
composer.json
includes/AjaxDispatcher.php
includes/Block.php
includes/CommentStore.php
includes/EditPage.php
includes/FauxRequest.php
includes/GlobalFunctions.php
includes/Html.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/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/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/WebInstallerExistingWiki.php
includes/installer/i18n/be-tarask.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/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/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/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/field/MySQLField.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/lbfactory/LBFactorySimple.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/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/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/SpecialWhatlinkshere.php
includes/specials/formfields/UploadSourceField.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/upload/UploadBase.php
includes/user/BotPassword.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/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/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
maintenance/Maintenance.php
maintenance/cleanupInvalidDbKeys.php
maintenance/copyFileBackend.php
maintenance/doMaintenance.php
maintenance/findDeprecated.php
maintenance/generateSitemap.php
maintenance/mcc.php
maintenance/namespaceDupes.php
maintenance/renameDbPrefix.php
maintenance/storage/moveToExternal.php
maintenance/storage/testCompression.php
maintenance/storage/trackBlobs.php
maintenance/updateSpecialPages.php
profileinfo.php
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less
tests/parser/ParserTestRunner.php
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/db/DatabaseTestHelper.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.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/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php
tests/qunit/data/styleTest.css.php
thumb.php

index a5535f6..7d8bec6 100644 (file)
@@ -82,6 +82,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>*/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>
index dca8311..bd43daf 100644 (file)
@@ -39,8 +39,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 ====
@@ -131,6 +134,8 @@ because of Phabricator reports.
   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.
 
 === Deprecations in 1.32 ===
 * Use of a StartProfiler.php file is deprecated in favour of placing
@@ -159,6 +164,8 @@ 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 ===
 * …
index f1b3ae0..67cd3b9 100644 (file)
@@ -1279,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',
@@ -1681,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..3ed41cf 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": {
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 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 00e35b1..8fcd11e 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 );
@@ -1516,7 +1516,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 +2241,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( [] )
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 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..1642377 100644 (file)
@@ -939,7 +939,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 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 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..23a5da5 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
                );
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..3fb7d8b 100644 (file)
@@ -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..728c237 100644 (file)
@@ -97,7 +97,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 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 ce9aabb..e3c6435 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-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 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 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..ca0e721 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;
        }
 
        /**
@@ -484,11 +485,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 +703,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 +718,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 +785,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 +808,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 f720010..432e6d6 100644 (file)
@@ -396,9 +396,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..099f172 100644 (file)
@@ -330,7 +330,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 +342,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 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 e8ec250..2ee3419 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'] : '',
+                       'IPAddress' => $_SERVER[ 'REMOTE_ADDR' ] ?? '',
+                       'UserAgent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
                        'ChronologyProtection' => 'true',
                        // phpcs:ignore MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals -- library can't use $wgRequest
-                       'ChronologyPositionIndex' => isset( $_GET['cpPosIndex'] ) ? $_GET['cpPosIndex'] : null
+                       'ChronologyPositionIndex' => $_GET['cpPosIndex'] ?? null
                ];
 
-               $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();
        }
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 d5195ef..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 {
@@ -1204,7 +1192,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function getServerType( $i ) {
-               return isset( $this->servers[$i]['type'] ) ? $this->servers[$i]['type'] : 'unknown';
+               return $this->servers[$i]['type'] ?? 'unknown';
        }
 
        public function getMasterPos() {
@@ -1305,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 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..5c1f92c 100644 (file)
@@ -3311,9 +3311,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..0a9e9c8 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 ) {
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 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..3f10c11 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
         *
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..57ca2f4 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
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 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 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 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 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 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..9d2bdb2 100644 (file)
@@ -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;
        }
 
        /**
@@ -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 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..1ae6538 100644 (file)
        "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..a56e2dc 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 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..ba3b759 100644 (file)
        "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 '''$2''':",
+       "nolinkshere-2": "Nenguna páxina enllaza a '''$2'''.",
+       "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",
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..cbfa950 100644 (file)
        "ignorewarnings": "Ігнараваць усе папярэджаньні",
        "minlength1": "Назва файлу павінна ўтрымліваць хаця б адну літару.",
        "illegalfilename": "Назва файлу «$1» зьмяшчае сымбалі, якія нельга выкарыстоўваць у назвах старонак. Калі ласка, зьмяніце назву файлу і паспрабуйце загрузіць яго зноў.",
-       "filename-toolong": "Назвы файлаў ня могуць быць даўжэй 240 байтаў.",
+       "filename-toolong": "Назвы файлаў ня могуць быць даўжэй за 240 байтаў.",
        "badfilename": "Назва файла была зьмененая на «$1».",
        "filetype-mime-mismatch": "Пашырэньне файла «.$1» не адпавядае выяўленаму MIME-тыпу файла ($2).",
        "filetype-badmime": "Загрузка файлаў тыпу MIME «$1» забароненая.",
        "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..e7485d6 100644 (file)
        "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..180ecd5 100644 (file)
        "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..b78c8fe 100644 (file)
        "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..6e158c1 100644 (file)
        "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",
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..76f7fdc 100644 (file)
        "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..ab7e2ec 100644 (file)
        "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..ce92179 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 837e3b5..37a682d 100644 (file)
        "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..3bcbe3c 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 '''$2''':",
+       "nolinkshere-2": "Neniu paĝo ligas al '''$2'''.",
+       "nolinkshere-ns-2": "Neniuj paĝoj ligas al '''$2''' en la elektita nomspaco.",
        "isredirect": "alidirektilo",
        "istemplate": "inkludo",
        "isimage": "ligilo al dosiero",
index 2fac3ff..eb198d7 100644 (file)
        "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..4c69684 100644 (file)
        "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..42dc32d 100644 (file)
        "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..a9a70f9 100644 (file)
        "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 \"'''$2'''\":",
+       "nolinkshere-2": "Ningunha páxina liga con \"'''$2'''\".",
+       "nolinkshere-ns-2": "Ningunha páxina liga con \"'''$2'''\" 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..0df7ceb 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": "קישור לקובץ",
        "blockipsuccesstext": "{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.<br />\nניתן לעיין ב[[Special:BlockList|רשימת החסומים]] כדי לצפות בחסימות.",
        "ipb-blockingself": "החשבון שלך ייחסם! האם ברצונך לעשות זאת?",
        "ipb-confirmhideuser": "החשבון ייחסם עם האפשרות \"הסתרת משתמש\". זה יעלים את שם המשתמש בכל הרשימות ופעולות היומן. האם ברצונך לעשות זאת?",
-       "ipb-confirmaction": "אם {{GENDER:|אתה בטוח שברצונך|את בטוחה שברצונך|אתם בטוחים שברצונכם}} לעשות זאת, אנא {{GENDER:|סמן|סמני|סמנו}} את השדה \"{{int:ipb-confirm}}\" שמופיע למטה.",
+       "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": "חיפוש",
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..eb4b171 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 verso <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..4fe040b 100644 (file)
        "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..090f8f2 100644 (file)
        "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",
index 1400381..c3ee89b 100644 (file)
        "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": "ер оагӀув éшар",
        "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": "Доакъашхочоа каьхат",
        "usermessage-editor": "Системан дIакхоачадар",
        "watchlist": "Зем",
        "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)",
        "whatlinkshere": "Тӏатовжамаш укхаза",
        "whatlinkshere-title": "«$1» яхача оагӏонна тӏатовжаш йола оагӏонаш",
        "whatlinkshere-page": "ОагIув:",
-       "linkshere-2": "«'''$1'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
-       "nolinkshere-2": "Кхыйолча оагӏонашкара '''$1''' яхача оагӏон тIатовжамаш доацаш да.",
+       "linkshere-2": "«'''$2'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
+       "nolinkshere-2": "Кхыйолча оагӏонашкара '''$2''' яхача оагӏон тIатовжамаш доацаш да.",
        "isredirect": "дIа-хьа хьожавара оагIув",
        "istemplate": "юкъейоалаяр",
        "isimage": "Файлови тӏатовжам",
        "exif-exposureprogram-1": "Кара",
        "exif-scenecapturetype-1": "Ландшафт",
        "exif-scenecapturetype-2": "Сага сурт",
+       "exif-dc-rights": "Бокъонаш",
        "exif-iimcategory-edu": "Дешарца Iомадар",
        "exif-iimcategory-evn": "Гонахье",
        "exif-iimcategory-hth": "УнахцIано",
index 359c6aa..6d8a23e 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",
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..226a3c8 100644 (file)
        "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 '''$2'''.",
+       "nolinkshere-ns-2": "Non vi sono pagine che puntano a '''$2''' nel namespace selezionato.",
        "isredirect": "redirect",
        "istemplate": "inclusione",
        "isimage": "collegamento al file",
index 2c02c2a..f116e44 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 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..c438f97 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 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..fe7b8f6 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": "계정 만들기",
        "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 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..9e5010b 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 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..4356bbc 100644 (file)
        "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..47316b4 100644 (file)
        "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..1f08aad 100644 (file)
        "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",
index 011b3cf..00983a6 100644 (file)
        "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..cf1c817 100644 (file)
                        "Acamicamacaraca",
                        "Avatar6",
                        "Akapochtli",
-                       "ديفيد"
+                       "ديفيد",
+                       "Daimona Eaytoy"
                ]
        },
        "sidebar": "{{notranslate}}",
        "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..51e0ffe 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 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..0d94241 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 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..f3059ee 100644 (file)
        "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 '''$2'''.",
+       "nolinkshere-ns-2": "Nobena stran se ne povezuje na '''$2''' v izbranem imenskem prostoru.",
        "isredirect": "preusmeritvena stran",
        "istemplate": "vključitev",
        "isimage": "povezava na datoteko",
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..299a137 100644 (file)
        "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..bf662d2 100644 (file)
        "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",
index 3765b04..c12487e 100644 (file)
        "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..e09751e 100644 (file)
        "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 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..286de20 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 5faa030..4455823 100644 (file)
        "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": "檔案連結",
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();
 
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 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..b3e7aec 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 );
        }
 
        /**
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 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;
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 ) {
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 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 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 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..da5cfb1 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 );
@@ -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 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 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 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 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 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 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 );