Merge "Permit case independent unit test directories"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 2 Sep 2019 17:08:22 +0000 (17:08 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 2 Sep 2019 17:08:22 +0000 (17:08 +0000)
573 files changed:
.phan/config.php
.phan/internal_stubs/intl.phan_php [new file with mode: 0644]
.phan/stubs/excimer.php
INSTALL
RELEASE-NOTES-1.34
composer.json
includes/AutoLoader.php
includes/DefaultSettings.php
includes/EditPage.php
includes/FauxRequest.php
includes/FileDeleteForm.php
includes/GlobalFunctions.php
includes/LinkFilter.php
includes/Linker.php
includes/MediaWiki.php
includes/MediaWikiServices.php
includes/Message/MessageFormatterFactory.php [new file with mode: 0644]
includes/Message/TextFormatter.php [new file with mode: 0644]
includes/MovePage.php
includes/OutputPage.php
includes/Permissions/PermissionManager.php
includes/ProxyLookup.php
includes/Rest/HeaderContainer.php
includes/Rest/LocalizedHttpException.php [new file with mode: 0644]
includes/Revision/RenderedRevision.php
includes/Revision/RevisionRenderer.php
includes/Revision/RevisionStore.php
includes/ServiceWiring.php
includes/Setup.php
includes/Storage/BlobStore.php
includes/Storage/SqlBlobStore.php
includes/Title.php
includes/WebRequest.php
includes/WikiMap.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiEditPage.php
includes/api/ApiImportReporter.php
includes/api/ApiMain.php
includes/api/ApiMessageTrait.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiPageSet.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiStashEdit.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiValidatePassword.php
includes/api/SearchApi.php
includes/api/i18n/mk.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/auth/AuthenticationRequest.php
includes/auth/Throttler.php
includes/block/AbstractBlock.php
includes/block/CompositeBlock.php
includes/cache/BacklinkCache.php
includes/cache/CacheHelper.php
includes/cache/MessageCache.php
includes/cache/localisation/LCStoreCDB.php
includes/cache/localisation/LocalisationCache.php
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/content/ContentHandler.php
includes/content/FileContentHandler.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/RequestContext.php
includes/diff/ArrayDiffFormatter.php
includes/diff/DiffEngine.php
includes/diff/DiffOp.php
includes/exception/MWException.php
includes/exception/MWExceptionRenderer.php
includes/export/DumpNamespaceFilter.php
includes/export/DumpPipeOutput.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/RepoGroup.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/UnregisteredLocalFile.php
includes/gallery/ImageGalleryBase.php
includes/historyblob/ConcatenatedGzipHistoryBlob.php
includes/historyblob/DiffHistoryBlob.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLAutoCompleteSelectField.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/http/GuzzleHttpRequest.php
includes/http/HttpRequestFactory.php
includes/http/MWHttpRequest.php
includes/import/WikiImporter.php
includes/installer/CliInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/i18n/nap.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/ThumbnailRenderJob.php
includes/language/Message.php
includes/language/MessageLocalizer.php
includes/libs/ExplodeIterator.php
includes/libs/GenericArrayObject.php
includes/libs/HashRing.php
includes/libs/MWMessagePack.php
includes/libs/MappedIterator.php
includes/libs/Message/IMessageFormatterFactory.php [new file with mode: 0644]
includes/libs/Message/ITextFormatter.php [new file with mode: 0644]
includes/libs/Message/ListParam.php [new file with mode: 0644]
includes/libs/Message/ListType.php [new file with mode: 0644]
includes/libs/Message/MessageParam.php [new file with mode: 0644]
includes/libs/Message/MessageValue.php [new file with mode: 0644]
includes/libs/Message/ParamType.php [new file with mode: 0644]
includes/libs/Message/TextParam.php [new file with mode: 0644]
includes/libs/XhprofData.php
includes/libs/filebackend/FileBackend.php
includes/libs/filebackend/FileBackendMultiWrite.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/http/MultiHttpClient.php
includes/libs/lockmanager/QuorumLockManager.php
includes/libs/mime/MSCompoundFileReader.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/HashBagOStuff.php
includes/libs/objectcache/MediumSpecificBagOStuff.php
includes/libs/objectcache/MemcachedBagOStuff.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/RedisBagOStuff.php
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/libs/objectcache/wancache/WANObjectCache.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMysqli.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/IDatabase.php
includes/libs/rdbms/database/position/MySQLMasterPos.php
includes/libs/rdbms/database/resultwrapper/IResultWrapper.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/stats/SamplingStatsdClient.php
includes/logging/BlockLogFormatter.php
includes/logging/LogEntryBase.php
includes/logging/LogPager.php
includes/logging/ManualLogEntry.php
includes/logging/PatrolLog.php
includes/media/ExifBitmapHandler.php
includes/media/FormatMetadata.php
includes/media/GIFMetadataExtractor.php
includes/media/IPTC.php
includes/media/TiffHandler.php
includes/media/WebPHandler.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/CategoryPage.php
includes/page/ImageHistoryPseudoPager.php
includes/page/ImagePage.php
includes/page/PageArchive.php
includes/page/WikiPage.php
includes/parser/LinkHolderArray.php
includes/parser/PPDPart.php
includes/parser/PPDPart_Hash.php
includes/parser/PPDStackElement_Hash.php
includes/parser/PPFrame.php
includes/parser/PPFrame_DOM.php
includes/parser/Parser.php
includes/preferences/DefaultPreferencesFactory.php
includes/profiler/ProfilerExcimer.php
includes/rcfeed/FormattedRCFeed.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/DerivativeResourceLoaderContext.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderOOUIImageModule.php
includes/revisiondelete/RevDelList.php
includes/revisionlist/RevisionListBase.php
includes/search/SearchEngine.php
includes/session/SessionManager.php
includes/shell/Command.php
includes/shell/Shell.php
includes/site/Site.php
includes/skins/BaseTemplate.php
includes/specialpage/AuthManagerSpecialPage.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/FormSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBotPasswords.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialListFiles.php
includes/specials/SpecialListGroupRights.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialWhatLinksHere.php
includes/specials/forms/UploadForm.php
includes/specials/helpers/ImportReporter.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/ImageListPager.php
includes/specials/pagers/NewFilesPager.php
includes/upload/UploadBase.php
includes/user/PasswordReset.php
includes/user/User.php
includes/user/UserNamePrefixSearch.php
includes/utils/AvroValidator.php
includes/utils/ClassCollector.php
includes/utils/ZipDirectoryReader.php
includes/widget/ComplexTitleInputWidget.php
includes/widget/search/SearchFormWidget.php
languages/Language.php
languages/LanguageConverter.php
languages/data/Names.php
languages/i18n/ace.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/ami.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/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/ban.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/bto.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/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/ee.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/exif/ar.json
languages/i18n/exif/ast.json
languages/i18n/exif/bn.json
languages/i18n/exif/da.json
languages/i18n/exif/fr.json
languages/i18n/exif/gl.json
languages/i18n/exif/he.json
languages/i18n/exif/ko.json
languages/i18n/exif/lb.json
languages/i18n/exif/lus.json
languages/i18n/exif/mk.json
languages/i18n/exif/pt-br.json
languages/i18n/exif/pt.json
languages/i18n/exif/roa-tara.json
languages/i18n/exif/zh-hant.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/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/hyw.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/khw.json
languages/i18n/kiu.json
languages/i18n/kjp.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/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/liv.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/ltg.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/mni.json
languages/i18n/mnw.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/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/nqo.json
languages/i18n/nso.json
languages/i18n/nys.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pcd.json
languages/i18n/pdc.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/sei.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/shn.json
languages/i18n/shy-latn.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/tet.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/to.json
languages/i18n/tpi.json
languages/i18n/tr.json
languages/i18n/tru.json
languages/i18n/trv.json
languages/i18n/ts.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/tyv.json
languages/i18n/tzm.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/vmf.json
languages/i18n/vo.json
languages/i18n/vot.json
languages/i18n/vro.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/wuu.json
languages/i18n/xal.json
languages/i18n/xmf.json
languages/i18n/xsy.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zea.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/categoryChangesAsRdf.php
maintenance/convertExtensionToRegistration.php
maintenance/copyFileBackend.php
maintenance/generateSitemap.php
maintenance/importDump.php
maintenance/includes/TextPassDumper.php
maintenance/mergeMessageFileList.php
maintenance/populateArchiveRevId.php
maintenance/populateRevisionSha1.php
maintenance/rebuildmessages.php
maintenance/sql.php
maintenance/storage/compressOld.php
maintenance/storage/recompressTracked.php
maintenance/updateCollation.php
maintenance/updateExtensionJsonSchema.php
tests/common/TestsAutoLoader.php
tests/phpunit/MediaWikiIntegrationTestCase.php
tests/phpunit/MediaWikiTestCaseTrait.php
tests/phpunit/bootstrap.php
tests/phpunit/includes/Message/TextFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/Storage/SqlBlobStoreTest.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiTestCaseUpload.php [deleted file]
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/auth/UserDataAuthenticationRequestTest.php
tests/phpunit/includes/block/CompositeBlockTest.php
tests/phpunit/includes/filerepo/LocalRepoTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/HashRingTest.php
tests/phpunit/includes/libs/Message/MessageValueTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/ContribsPagerTest.php
tests/phpunit/includes/specials/ImageListPagerTest.php
tests/phpunit/includes/specials/SpecialWatchlistTest.php
tests/phpunit/includes/specials/pagers/BlockListPagerTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php

index 8746ada..e02dba7 100644 (file)
@@ -76,71 +76,42 @@ $cfg['exclude_analysis_directory_list'] = [
 ];
 
 $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
-       // approximate error count: 18
-       "PhanAccessMethodInternal",
-       // approximate error count: 17
-       "PhanCommentParamOnEmptyParamList",
-       // approximate error count: 29
-       "PhanCommentParamWithoutRealParam",
-       // approximate error count: 2
-       "PhanCompatibleNegativeStringOffset",
-       // approximate error count: 21
-       "PhanParamReqAfterOpt",
-       // approximate error count: 26
-       "PhanParamSignatureMismatch",
-       // approximate error count: 4
-       "PhanParamSignatureMismatchInternal",
-       // approximate error count: 127
-       "PhanParamTooMany",
-       // approximate error count: 2
-       "PhanTraitParentReference",
-       // approximate error count: 30
-       "PhanTypeArraySuspicious",
-       // approximate error count: 27
-       "PhanTypeArraySuspiciousNullable",
-       // approximate error count: 26
-       "PhanTypeComparisonFromArray",
-       // approximate error count: 63
-       "PhanTypeInvalidDimOffset",
-       // approximate error count: 7
-       "PhanTypeInvalidLeftOperandOfIntegerOp",
-       // approximate error count: 2
-       "PhanTypeInvalidRightOperandOfIntegerOp",
-       // approximate error count: 154
-       "PhanTypeMismatchArgument",
-       // approximate error count: 27
-       "PhanTypeMismatchArgumentInternal",
-       // approximate error count: 2
-       "PhanTypeMismatchDimEmpty",
-       // approximate error count: 27
-       "PhanTypeMismatchDimFetch",
-       // approximate error count: 10
-       "PhanTypeMismatchForeach",
-       // approximate error count: 77
-       "PhanTypeMismatchProperty",
-       // approximate error count: 84
-       "PhanTypeMismatchReturn",
-       // approximate error count: 12
-       "PhanTypeObjectUnsetDeclaredProperty",
-       // approximate error count: 9
-       "PhanTypeSuspiciousNonTraversableForeach",
-       // approximate error count: 3
-       "PhanTypeSuspiciousStringExpression",
+       // approximate error count: 19
+       "PhanParamReqAfterOpt", // False positives with nullables, ref phan issue #3159
+       // approximate error count: 110
+       "PhanParamTooMany", // False positives with variargs. Unsuppress after dropping HHVM
+
        // approximate error count: 22
+       "PhanAccessMethodInternal",
+       // approximate error count: 36
        "PhanUndeclaredConstant",
-       // approximate error count: 3
-       "PhanUndeclaredInvokeInCallable",
-       // approximate error count: 237
+       // approximate error count: 60
+       "PhanTypeMismatchArgument",
+       // approximate error count: 219
        "PhanUndeclaredMethod",
-       // approximate error count: 846
+       // approximate error count: 752
        "PhanUndeclaredProperty",
-       // approximate error count: 2
-       "PhanUndeclaredVariableAssignOp",
-       // approximate error count: 55
-       "PhanUndeclaredVariableDim",
 ] );
 
 $cfg['ignore_undeclared_variables_in_global_scope'] = true;
-$cfg['globals_type_map']['IP'] = 'string';
+$cfg['globals_type_map'] = array_merge( $cfg['globals_type_map'], [
+       'IP' => 'string',
+       'wgGalleryOptions' => 'array',
+       'wgDummyLanguageCodes' => 'string[]',
+       'wgNamespaceProtection' => 'array<string,string|string[]>',
+       'wgNamespaceAliases' => 'array<string,int>',
+       'wgLockManagers' => 'array[]',
+       'wgForeignFileRepos' => 'array[]',
+       'wgDefaultUserOptions' => 'array',
+       'wgSkipSkins' => 'string[]',
+       'wgLogTypes' => 'string[]',
+       'wgLogNames' => 'array<string,string>',
+       'wgLogHeaders' => 'array<string,string>',
+       'wgLogActionsHandlers' => 'array<string,class-string>',
+       'wgPasswordPolicy' => 'array<string,array<string,string|array>>',
+       'wgVirtualRestConfig' => 'array<string,array>',
+       'wgWANObjectCaches' => 'array[]',
+       'wgLocalInterwikis' => 'string[]',
+] );
 
 return $cfg;
diff --git a/.phan/internal_stubs/intl.phan_php b/.phan/internal_stubs/intl.phan_php
new file mode 100644 (file)
index 0000000..cffb005
--- /dev/null
@@ -0,0 +1,1791 @@
+<?php
+// These stubs were generated by the phan stub generator.
+// @phan-stub-for-extension intl@7.3.4
+
+namespace {
+class Collator {
+
+    // constants
+    const DEFAULT_VALUE = -1;
+    const PRIMARY = 0;
+    const SECONDARY = 1;
+    const TERTIARY = 2;
+    const DEFAULT_STRENGTH = 2;
+    const QUATERNARY = 3;
+    const IDENTICAL = 15;
+    const OFF = 16;
+    const ON = 17;
+    const SHIFTED = 20;
+    const NON_IGNORABLE = 21;
+    const LOWER_FIRST = 24;
+    const UPPER_FIRST = 25;
+    const FRENCH_COLLATION = 0;
+    const ALTERNATE_HANDLING = 1;
+    const CASE_FIRST = 2;
+    const CASE_LEVEL = 3;
+    const NORMALIZATION_MODE = 4;
+    const STRENGTH = 5;
+    const HIRAGANA_QUATERNARY_MODE = 6;
+    const NUMERIC_COLLATION = 7;
+    const SORT_REGULAR = 0;
+    const SORT_STRING = 1;
+    const SORT_NUMERIC = 2;
+
+    // properties
+    public $name;
+
+    // methods
+    public function __construct($arg1) {}
+    public static function create($arg1) {}
+    public function compare($arg1, $arg2) {}
+    public function sort(array &$arr, $flags = null) {}
+    public function sortWithSortKeys(array &$arr) {}
+    public function asort(array &$arr, $flags = null) {}
+    public function getAttribute($arg1) {}
+    public function setAttribute($arg1, $arg2) {}
+    public function getStrength() {}
+    public function setStrength($arg1) {}
+    public function getLocale($arg1) {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+    public function getSortKey($arg1) {}
+}
+
+class IntlBreakIterator implements \Traversable {
+
+    // constants
+    const DONE = -1;
+    const WORD_NONE = 0;
+    const WORD_NONE_LIMIT = 100;
+    const WORD_NUMBER = 100;
+    const WORD_NUMBER_LIMIT = 200;
+    const WORD_LETTER = 200;
+    const WORD_LETTER_LIMIT = 300;
+    const WORD_KANA = 300;
+    const WORD_KANA_LIMIT = 400;
+    const WORD_IDEO = 400;
+    const WORD_IDEO_LIMIT = 500;
+    const LINE_SOFT = 0;
+    const LINE_SOFT_LIMIT = 100;
+    const LINE_HARD = 100;
+    const LINE_HARD_LIMIT = 200;
+    const SENTENCE_TERM = 0;
+    const SENTENCE_TERM_LIMIT = 100;
+    const SENTENCE_SEP = 100;
+    const SENTENCE_SEP_LIMIT = 200;
+
+    // methods
+    private function __construct() {}
+    public static function createWordInstance($locale = null) {}
+    public static function createLineInstance($locale = null) {}
+    public static function createCharacterInstance($locale = null) {}
+    public static function createSentenceInstance($locale = null) {}
+    public static function createTitleInstance($locale = null) {}
+    public static function createCodePointInstance() {}
+    public function getText() {}
+    public function setText($text) {}
+    public function first() {}
+    public function last() {}
+    public function previous() {}
+    public function next($offset = null) {}
+    public function current() {}
+    public function following($offset) {}
+    public function preceding($offset) {}
+    public function isBoundary($offset) {}
+    public function getLocale($locale_type) {}
+    public function getPartsIterator($key_type = null) {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+}
+
+class IntlCalendar {
+
+    // constants
+    const FIELD_ERA = 0;
+    const FIELD_YEAR = 1;
+    const FIELD_MONTH = 2;
+    const FIELD_WEEK_OF_YEAR = 3;
+    const FIELD_WEEK_OF_MONTH = 4;
+    const FIELD_DATE = 5;
+    const FIELD_DAY_OF_YEAR = 6;
+    const FIELD_DAY_OF_WEEK = 7;
+    const FIELD_DAY_OF_WEEK_IN_MONTH = 8;
+    const FIELD_AM_PM = 9;
+    const FIELD_HOUR = 10;
+    const FIELD_HOUR_OF_DAY = 11;
+    const FIELD_MINUTE = 12;
+    const FIELD_SECOND = 13;
+    const FIELD_MILLISECOND = 14;
+    const FIELD_ZONE_OFFSET = 15;
+    const FIELD_DST_OFFSET = 16;
+    const FIELD_YEAR_WOY = 17;
+    const FIELD_DOW_LOCAL = 18;
+    const FIELD_EXTENDED_YEAR = 19;
+    const FIELD_JULIAN_DAY = 20;
+    const FIELD_MILLISECONDS_IN_DAY = 21;
+    const FIELD_IS_LEAP_MONTH = 22;
+    const FIELD_FIELD_COUNT = 23;
+    const FIELD_DAY_OF_MONTH = 5;
+    const DOW_SUNDAY = 1;
+    const DOW_MONDAY = 2;
+    const DOW_TUESDAY = 3;
+    const DOW_WEDNESDAY = 4;
+    const DOW_THURSDAY = 5;
+    const DOW_FRIDAY = 6;
+    const DOW_SATURDAY = 7;
+    const DOW_TYPE_WEEKDAY = 0;
+    const DOW_TYPE_WEEKEND = 1;
+    const DOW_TYPE_WEEKEND_OFFSET = 2;
+    const DOW_TYPE_WEEKEND_CEASE = 3;
+    const WALLTIME_FIRST = 1;
+    const WALLTIME_LAST = 0;
+    const WALLTIME_NEXT_VALID = 2;
+
+    // methods
+    private function __construct() {}
+    public static function createInstance($timeZone = null, $locale = null) {}
+    public static function getKeywordValuesForLocale($key, $locale, $commonlyUsed) {}
+    public static function getNow() {}
+    public static function getAvailableLocales() {}
+    public function get($field) {}
+    public function getTime() {}
+    public function setTime($date) {}
+    public function add($field, $amount) {}
+    public function setTimeZone($timeZone) {}
+    public function after(\IntlCalendar $calendar) {}
+    public function before(\IntlCalendar $calendar) {}
+    public function set($fieldOrYear, $valueOrMonth, $dayOfMonth = null, $hour = null, $minute = null, $second = null) {}
+    public function roll($field, $amountOrUpOrDown) {}
+    public function clear($field = null) {}
+    public function fieldDifference($when, $field) {}
+    public function getActualMaximum($field) {}
+    public function getActualMinimum($field) {}
+    public function getDayOfWeekType($dayOfWeek) {}
+    public function getFirstDayOfWeek() {}
+    public function getGreatestMinimum($field) {}
+    public function getLeastMaximum($field) {}
+    public function getLocale($localeType) {}
+    public function getMaximum($field) {}
+    public function getMinimalDaysInFirstWeek() {}
+    public function getMinimum($field) {}
+    public function getTimeZone() {}
+    public function getType() {}
+    public function getWeekendTransition($dayOfWeek) {}
+    public function inDaylightTime() {}
+    public function isEquivalentTo(\IntlCalendar $calendar) {}
+    public function isLenient() {}
+    public function isSet($field) {}
+    public function isWeekend($date = null) {}
+    public function setFirstDayOfWeek($dayOfWeek) {}
+    public function setLenient($isLenient) {}
+    public function setMinimalDaysInFirstWeek($numberOfDays) {}
+    public function equals(\IntlCalendar $calendar) {}
+    public function getRepeatedWallTimeOption() {}
+    public function getSkippedWallTimeOption() {}
+    public function setRepeatedWallTimeOption($wallTimeOption) {}
+    public function setSkippedWallTimeOption($wallTimeOption) {}
+    public static function fromDateTime($dateTime) {}
+    public function toDateTime() {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+}
+
+class IntlChar {
+
+    // constants
+    const UNICODE_VERSION = '11.0';
+    const CODEPOINT_MIN = 0;
+    const CODEPOINT_MAX = 1114111;
+    const NO_NUMERIC_VALUE = -123456789.0;
+    const PROPERTY_ALPHABETIC = 0;
+    const PROPERTY_BINARY_START = 0;
+    const PROPERTY_ASCII_HEX_DIGIT = 1;
+    const PROPERTY_BIDI_CONTROL = 2;
+    const PROPERTY_BIDI_MIRRORED = 3;
+    const PROPERTY_DASH = 4;
+    const PROPERTY_DEFAULT_IGNORABLE_CODE_POINT = 5;
+    const PROPERTY_DEPRECATED = 6;
+    const PROPERTY_DIACRITIC = 7;
+    const PROPERTY_EXTENDER = 8;
+    const PROPERTY_FULL_COMPOSITION_EXCLUSION = 9;
+    const PROPERTY_GRAPHEME_BASE = 10;
+    const PROPERTY_GRAPHEME_EXTEND = 11;
+    const PROPERTY_GRAPHEME_LINK = 12;
+    const PROPERTY_HEX_DIGIT = 13;
+    const PROPERTY_HYPHEN = 14;
+    const PROPERTY_ID_CONTINUE = 15;
+    const PROPERTY_ID_START = 16;
+    const PROPERTY_IDEOGRAPHIC = 17;
+    const PROPERTY_IDS_BINARY_OPERATOR = 18;
+    const PROPERTY_IDS_TRINARY_OPERATOR = 19;
+    const PROPERTY_JOIN_CONTROL = 20;
+    const PROPERTY_LOGICAL_ORDER_EXCEPTION = 21;
+    const PROPERTY_LOWERCASE = 22;
+    const PROPERTY_MATH = 23;
+    const PROPERTY_NONCHARACTER_CODE_POINT = 24;
+    const PROPERTY_QUOTATION_MARK = 25;
+    const PROPERTY_RADICAL = 26;
+    const PROPERTY_SOFT_DOTTED = 27;
+    const PROPERTY_TERMINAL_PUNCTUATION = 28;
+    const PROPERTY_UNIFIED_IDEOGRAPH = 29;
+    const PROPERTY_UPPERCASE = 30;
+    const PROPERTY_WHITE_SPACE = 31;
+    const PROPERTY_XID_CONTINUE = 32;
+    const PROPERTY_XID_START = 33;
+    const PROPERTY_CASE_SENSITIVE = 34;
+    const PROPERTY_S_TERM = 35;
+    const PROPERTY_VARIATION_SELECTOR = 36;
+    const PROPERTY_NFD_INERT = 37;
+    const PROPERTY_NFKD_INERT = 38;
+    const PROPERTY_NFC_INERT = 39;
+    const PROPERTY_NFKC_INERT = 40;
+    const PROPERTY_SEGMENT_STARTER = 41;
+    const PROPERTY_PATTERN_SYNTAX = 42;
+    const PROPERTY_PATTERN_WHITE_SPACE = 43;
+    const PROPERTY_POSIX_ALNUM = 44;
+    const PROPERTY_POSIX_BLANK = 45;
+    const PROPERTY_POSIX_GRAPH = 46;
+    const PROPERTY_POSIX_PRINT = 47;
+    const PROPERTY_POSIX_XDIGIT = 48;
+    const PROPERTY_CASED = 49;
+    const PROPERTY_CASE_IGNORABLE = 50;
+    const PROPERTY_CHANGES_WHEN_LOWERCASED = 51;
+    const PROPERTY_CHANGES_WHEN_UPPERCASED = 52;
+    const PROPERTY_CHANGES_WHEN_TITLECASED = 53;
+    const PROPERTY_CHANGES_WHEN_CASEFOLDED = 54;
+    const PROPERTY_CHANGES_WHEN_CASEMAPPED = 55;
+    const PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED = 56;
+    const PROPERTY_BINARY_LIMIT = 65;
+    const PROPERTY_BIDI_CLASS = 4096;
+    const PROPERTY_INT_START = 4096;
+    const PROPERTY_BLOCK = 4097;
+    const PROPERTY_CANONICAL_COMBINING_CLASS = 4098;
+    const PROPERTY_DECOMPOSITION_TYPE = 4099;
+    const PROPERTY_EAST_ASIAN_WIDTH = 4100;
+    const PROPERTY_GENERAL_CATEGORY = 4101;
+    const PROPERTY_JOINING_GROUP = 4102;
+    const PROPERTY_JOINING_TYPE = 4103;
+    const PROPERTY_LINE_BREAK = 4104;
+    const PROPERTY_NUMERIC_TYPE = 4105;
+    const PROPERTY_SCRIPT = 4106;
+    const PROPERTY_HANGUL_SYLLABLE_TYPE = 4107;
+    const PROPERTY_NFD_QUICK_CHECK = 4108;
+    const PROPERTY_NFKD_QUICK_CHECK = 4109;
+    const PROPERTY_NFC_QUICK_CHECK = 4110;
+    const PROPERTY_NFKC_QUICK_CHECK = 4111;
+    const PROPERTY_LEAD_CANONICAL_COMBINING_CLASS = 4112;
+    const PROPERTY_TRAIL_CANONICAL_COMBINING_CLASS = 4113;
+    const PROPERTY_GRAPHEME_CLUSTER_BREAK = 4114;
+    const PROPERTY_SENTENCE_BREAK = 4115;
+    const PROPERTY_WORD_BREAK = 4116;
+    const PROPERTY_BIDI_PAIRED_BRACKET_TYPE = 4117;
+    const PROPERTY_INT_LIMIT = 4121;
+    const PROPERTY_GENERAL_CATEGORY_MASK = 8192;
+    const PROPERTY_MASK_START = 8192;
+    const PROPERTY_MASK_LIMIT = 8193;
+    const PROPERTY_NUMERIC_VALUE = 12288;
+    const PROPERTY_DOUBLE_START = 12288;
+    const PROPERTY_DOUBLE_LIMIT = 12289;
+    const PROPERTY_AGE = 16384;
+    const PROPERTY_STRING_START = 16384;
+    const PROPERTY_BIDI_MIRRORING_GLYPH = 16385;
+    const PROPERTY_CASE_FOLDING = 16386;
+    const PROPERTY_ISO_COMMENT = 16387;
+    const PROPERTY_LOWERCASE_MAPPING = 16388;
+    const PROPERTY_NAME = 16389;
+    const PROPERTY_SIMPLE_CASE_FOLDING = 16390;
+    const PROPERTY_SIMPLE_LOWERCASE_MAPPING = 16391;
+    const PROPERTY_SIMPLE_TITLECASE_MAPPING = 16392;
+    const PROPERTY_SIMPLE_UPPERCASE_MAPPING = 16393;
+    const PROPERTY_TITLECASE_MAPPING = 16394;
+    const PROPERTY_UNICODE_1_NAME = 16395;
+    const PROPERTY_UPPERCASE_MAPPING = 16396;
+    const PROPERTY_BIDI_PAIRED_BRACKET = 16397;
+    const PROPERTY_STRING_LIMIT = 16398;
+    const PROPERTY_SCRIPT_EXTENSIONS = 28672;
+    const PROPERTY_OTHER_PROPERTY_START = 28672;
+    const PROPERTY_OTHER_PROPERTY_LIMIT = 28673;
+    const PROPERTY_INVALID_CODE = -1;
+    const CHAR_CATEGORY_UNASSIGNED = 0;
+    const CHAR_CATEGORY_GENERAL_OTHER_TYPES = 0;
+    const CHAR_CATEGORY_UPPERCASE_LETTER = 1;
+    const CHAR_CATEGORY_LOWERCASE_LETTER = 2;
+    const CHAR_CATEGORY_TITLECASE_LETTER = 3;
+    const CHAR_CATEGORY_MODIFIER_LETTER = 4;
+    const CHAR_CATEGORY_OTHER_LETTER = 5;
+    const CHAR_CATEGORY_NON_SPACING_MARK = 6;
+    const CHAR_CATEGORY_ENCLOSING_MARK = 7;
+    const CHAR_CATEGORY_COMBINING_SPACING_MARK = 8;
+    const CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER = 9;
+    const CHAR_CATEGORY_LETTER_NUMBER = 10;
+    const CHAR_CATEGORY_OTHER_NUMBER = 11;
+    const CHAR_CATEGORY_SPACE_SEPARATOR = 12;
+    const CHAR_CATEGORY_LINE_SEPARATOR = 13;
+    const CHAR_CATEGORY_PARAGRAPH_SEPARATOR = 14;
+    const CHAR_CATEGORY_CONTROL_CHAR = 15;
+    const CHAR_CATEGORY_FORMAT_CHAR = 16;
+    const CHAR_CATEGORY_PRIVATE_USE_CHAR = 17;
+    const CHAR_CATEGORY_SURROGATE = 18;
+    const CHAR_CATEGORY_DASH_PUNCTUATION = 19;
+    const CHAR_CATEGORY_START_PUNCTUATION = 20;
+    const CHAR_CATEGORY_END_PUNCTUATION = 21;
+    const CHAR_CATEGORY_CONNECTOR_PUNCTUATION = 22;
+    const CHAR_CATEGORY_OTHER_PUNCTUATION = 23;
+    const CHAR_CATEGORY_MATH_SYMBOL = 24;
+    const CHAR_CATEGORY_CURRENCY_SYMBOL = 25;
+    const CHAR_CATEGORY_MODIFIER_SYMBOL = 26;
+    const CHAR_CATEGORY_OTHER_SYMBOL = 27;
+    const CHAR_CATEGORY_INITIAL_PUNCTUATION = 28;
+    const CHAR_CATEGORY_FINAL_PUNCTUATION = 29;
+    const CHAR_CATEGORY_CHAR_CATEGORY_COUNT = 30;
+    const CHAR_DIRECTION_LEFT_TO_RIGHT = 0;
+    const CHAR_DIRECTION_RIGHT_TO_LEFT = 1;
+    const CHAR_DIRECTION_EUROPEAN_NUMBER = 2;
+    const CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR = 3;
+    const CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR = 4;
+    const CHAR_DIRECTION_ARABIC_NUMBER = 5;
+    const CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR = 6;
+    const CHAR_DIRECTION_BLOCK_SEPARATOR = 7;
+    const CHAR_DIRECTION_SEGMENT_SEPARATOR = 8;
+    const CHAR_DIRECTION_WHITE_SPACE_NEUTRAL = 9;
+    const CHAR_DIRECTION_OTHER_NEUTRAL = 10;
+    const CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING = 11;
+    const CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE = 12;
+    const CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC = 13;
+    const CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING = 14;
+    const CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE = 15;
+    const CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT = 16;
+    const CHAR_DIRECTION_DIR_NON_SPACING_MARK = 17;
+    const CHAR_DIRECTION_BOUNDARY_NEUTRAL = 18;
+    const CHAR_DIRECTION_FIRST_STRONG_ISOLATE = 19;
+    const CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE = 20;
+    const CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE = 21;
+    const CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE = 22;
+    const CHAR_DIRECTION_CHAR_DIRECTION_COUNT = 23;
+    const BLOCK_CODE_NO_BLOCK = 0;
+    const BLOCK_CODE_BASIC_LATIN = 1;
+    const BLOCK_CODE_LATIN_1_SUPPLEMENT = 2;
+    const BLOCK_CODE_LATIN_EXTENDED_A = 3;
+    const BLOCK_CODE_LATIN_EXTENDED_B = 4;
+    const BLOCK_CODE_IPA_EXTENSIONS = 5;
+    const BLOCK_CODE_SPACING_MODIFIER_LETTERS = 6;
+    const BLOCK_CODE_COMBINING_DIACRITICAL_MARKS = 7;
+    const BLOCK_CODE_GREEK = 8;
+    const BLOCK_CODE_CYRILLIC = 9;
+    const BLOCK_CODE_ARMENIAN = 10;
+    const BLOCK_CODE_HEBREW = 11;
+    const BLOCK_CODE_ARABIC = 12;
+    const BLOCK_CODE_SYRIAC = 13;
+    const BLOCK_CODE_THAANA = 14;
+    const BLOCK_CODE_DEVANAGARI = 15;
+    const BLOCK_CODE_BENGALI = 16;
+    const BLOCK_CODE_GURMUKHI = 17;
+    const BLOCK_CODE_GUJARATI = 18;
+    const BLOCK_CODE_ORIYA = 19;
+    const BLOCK_CODE_TAMIL = 20;
+    const BLOCK_CODE_TELUGU = 21;
+    const BLOCK_CODE_KANNADA = 22;
+    const BLOCK_CODE_MALAYALAM = 23;
+    const BLOCK_CODE_SINHALA = 24;
+    const BLOCK_CODE_THAI = 25;
+    const BLOCK_CODE_LAO = 26;
+    const BLOCK_CODE_TIBETAN = 27;
+    const BLOCK_CODE_MYANMAR = 28;
+    const BLOCK_CODE_GEORGIAN = 29;
+    const BLOCK_CODE_HANGUL_JAMO = 30;
+    const BLOCK_CODE_ETHIOPIC = 31;
+    const BLOCK_CODE_CHEROKEE = 32;
+    const BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS = 33;
+    const BLOCK_CODE_OGHAM = 34;
+    const BLOCK_CODE_RUNIC = 35;
+    const BLOCK_CODE_KHMER = 36;
+    const BLOCK_CODE_MONGOLIAN = 37;
+    const BLOCK_CODE_LATIN_EXTENDED_ADDITIONAL = 38;
+    const BLOCK_CODE_GREEK_EXTENDED = 39;
+    const BLOCK_CODE_GENERAL_PUNCTUATION = 40;
+    const BLOCK_CODE_SUPERSCRIPTS_AND_SUBSCRIPTS = 41;
+    const BLOCK_CODE_CURRENCY_SYMBOLS = 42;
+    const BLOCK_CODE_COMBINING_MARKS_FOR_SYMBOLS = 43;
+    const BLOCK_CODE_LETTERLIKE_SYMBOLS = 44;
+    const BLOCK_CODE_NUMBER_FORMS = 45;
+    const BLOCK_CODE_ARROWS = 46;
+    const BLOCK_CODE_MATHEMATICAL_OPERATORS = 47;
+    const BLOCK_CODE_MISCELLANEOUS_TECHNICAL = 48;
+    const BLOCK_CODE_CONTROL_PICTURES = 49;
+    const BLOCK_CODE_OPTICAL_CHARACTER_RECOGNITION = 50;
+    const BLOCK_CODE_ENCLOSED_ALPHANUMERICS = 51;
+    const BLOCK_CODE_BOX_DRAWING = 52;
+    const BLOCK_CODE_BLOCK_ELEMENTS = 53;
+    const BLOCK_CODE_GEOMETRIC_SHAPES = 54;
+    const BLOCK_CODE_MISCELLANEOUS_SYMBOLS = 55;
+    const BLOCK_CODE_DINGBATS = 56;
+    const BLOCK_CODE_BRAILLE_PATTERNS = 57;
+    const BLOCK_CODE_CJK_RADICALS_SUPPLEMENT = 58;
+    const BLOCK_CODE_KANGXI_RADICALS = 59;
+    const BLOCK_CODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS = 60;
+    const BLOCK_CODE_CJK_SYMBOLS_AND_PUNCTUATION = 61;
+    const BLOCK_CODE_HIRAGANA = 62;
+    const BLOCK_CODE_KATAKANA = 63;
+    const BLOCK_CODE_BOPOMOFO = 64;
+    const BLOCK_CODE_HANGUL_COMPATIBILITY_JAMO = 65;
+    const BLOCK_CODE_KANBUN = 66;
+    const BLOCK_CODE_BOPOMOFO_EXTENDED = 67;
+    const BLOCK_CODE_ENCLOSED_CJK_LETTERS_AND_MONTHS = 68;
+    const BLOCK_CODE_CJK_COMPATIBILITY = 69;
+    const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A = 70;
+    const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS = 71;
+    const BLOCK_CODE_YI_SYLLABLES = 72;
+    const BLOCK_CODE_YI_RADICALS = 73;
+    const BLOCK_CODE_HANGUL_SYLLABLES = 74;
+    const BLOCK_CODE_HIGH_SURROGATES = 75;
+    const BLOCK_CODE_HIGH_PRIVATE_USE_SURROGATES = 76;
+    const BLOCK_CODE_LOW_SURROGATES = 77;
+    const BLOCK_CODE_PRIVATE_USE_AREA = 78;
+    const BLOCK_CODE_PRIVATE_USE = 78;
+    const BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS = 79;
+    const BLOCK_CODE_ALPHABETIC_PRESENTATION_FORMS = 80;
+    const BLOCK_CODE_ARABIC_PRESENTATION_FORMS_A = 81;
+    const BLOCK_CODE_COMBINING_HALF_MARKS = 82;
+    const BLOCK_CODE_CJK_COMPATIBILITY_FORMS = 83;
+    const BLOCK_CODE_SMALL_FORM_VARIANTS = 84;
+    const BLOCK_CODE_ARABIC_PRESENTATION_FORMS_B = 85;
+    const BLOCK_CODE_SPECIALS = 86;
+    const BLOCK_CODE_HALFWIDTH_AND_FULLWIDTH_FORMS = 87;
+    const BLOCK_CODE_OLD_ITALIC = 88;
+    const BLOCK_CODE_GOTHIC = 89;
+    const BLOCK_CODE_DESERET = 90;
+    const BLOCK_CODE_BYZANTINE_MUSICAL_SYMBOLS = 91;
+    const BLOCK_CODE_MUSICAL_SYMBOLS = 92;
+    const BLOCK_CODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS = 93;
+    const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B = 94;
+    const BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT = 95;
+    const BLOCK_CODE_TAGS = 96;
+    const BLOCK_CODE_CYRILLIC_SUPPLEMENT = 97;
+    const BLOCK_CODE_CYRILLIC_SUPPLEMENTARY = 97;
+    const BLOCK_CODE_TAGALOG = 98;
+    const BLOCK_CODE_HANUNOO = 99;
+    const BLOCK_CODE_BUHID = 100;
+    const BLOCK_CODE_TAGBANWA = 101;
+    const BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A = 102;
+    const BLOCK_CODE_SUPPLEMENTAL_ARROWS_A = 103;
+    const BLOCK_CODE_SUPPLEMENTAL_ARROWS_B = 104;
+    const BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B = 105;
+    const BLOCK_CODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS = 106;
+    const BLOCK_CODE_KATAKANA_PHONETIC_EXTENSIONS = 107;
+    const BLOCK_CODE_VARIATION_SELECTORS = 108;
+    const BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A = 109;
+    const BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B = 110;
+    const BLOCK_CODE_LIMBU = 111;
+    const BLOCK_CODE_TAI_LE = 112;
+    const BLOCK_CODE_KHMER_SYMBOLS = 113;
+    const BLOCK_CODE_PHONETIC_EXTENSIONS = 114;
+    const BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS = 115;
+    const BLOCK_CODE_YIJING_HEXAGRAM_SYMBOLS = 116;
+    const BLOCK_CODE_LINEAR_B_SYLLABARY = 117;
+    const BLOCK_CODE_LINEAR_B_IDEOGRAMS = 118;
+    const BLOCK_CODE_AEGEAN_NUMBERS = 119;
+    const BLOCK_CODE_UGARITIC = 120;
+    const BLOCK_CODE_SHAVIAN = 121;
+    const BLOCK_CODE_OSMANYA = 122;
+    const BLOCK_CODE_CYPRIOT_SYLLABARY = 123;
+    const BLOCK_CODE_TAI_XUAN_JING_SYMBOLS = 124;
+    const BLOCK_CODE_VARIATION_SELECTORS_SUPPLEMENT = 125;
+    const BLOCK_CODE_ANCIENT_GREEK_MUSICAL_NOTATION = 126;
+    const BLOCK_CODE_ANCIENT_GREEK_NUMBERS = 127;
+    const BLOCK_CODE_ARABIC_SUPPLEMENT = 128;
+    const BLOCK_CODE_BUGINESE = 129;
+    const BLOCK_CODE_CJK_STROKES = 130;
+    const BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT = 131;
+    const BLOCK_CODE_COPTIC = 132;
+    const BLOCK_CODE_ETHIOPIC_EXTENDED = 133;
+    const BLOCK_CODE_ETHIOPIC_SUPPLEMENT = 134;
+    const BLOCK_CODE_GEORGIAN_SUPPLEMENT = 135;
+    const BLOCK_CODE_GLAGOLITIC = 136;
+    const BLOCK_CODE_KHAROSHTHI = 137;
+    const BLOCK_CODE_MODIFIER_TONE_LETTERS = 138;
+    const BLOCK_CODE_NEW_TAI_LUE = 139;
+    const BLOCK_CODE_OLD_PERSIAN = 140;
+    const BLOCK_CODE_PHONETIC_EXTENSIONS_SUPPLEMENT = 141;
+    const BLOCK_CODE_SUPPLEMENTAL_PUNCTUATION = 142;
+    const BLOCK_CODE_SYLOTI_NAGRI = 143;
+    const BLOCK_CODE_TIFINAGH = 144;
+    const BLOCK_CODE_VERTICAL_FORMS = 145;
+    const BLOCK_CODE_NKO = 146;
+    const BLOCK_CODE_BALINESE = 147;
+    const BLOCK_CODE_LATIN_EXTENDED_C = 148;
+    const BLOCK_CODE_LATIN_EXTENDED_D = 149;
+    const BLOCK_CODE_PHAGS_PA = 150;
+    const BLOCK_CODE_PHOENICIAN = 151;
+    const BLOCK_CODE_CUNEIFORM = 152;
+    const BLOCK_CODE_CUNEIFORM_NUMBERS_AND_PUNCTUATION = 153;
+    const BLOCK_CODE_COUNTING_ROD_NUMERALS = 154;
+    const BLOCK_CODE_SUNDANESE = 155;
+    const BLOCK_CODE_LEPCHA = 156;
+    const BLOCK_CODE_OL_CHIKI = 157;
+    const BLOCK_CODE_CYRILLIC_EXTENDED_A = 158;
+    const BLOCK_CODE_VAI = 159;
+    const BLOCK_CODE_CYRILLIC_EXTENDED_B = 160;
+    const BLOCK_CODE_SAURASHTRA = 161;
+    const BLOCK_CODE_KAYAH_LI = 162;
+    const BLOCK_CODE_REJANG = 163;
+    const BLOCK_CODE_CHAM = 164;
+    const BLOCK_CODE_ANCIENT_SYMBOLS = 165;
+    const BLOCK_CODE_PHAISTOS_DISC = 166;
+    const BLOCK_CODE_LYCIAN = 167;
+    const BLOCK_CODE_CARIAN = 168;
+    const BLOCK_CODE_LYDIAN = 169;
+    const BLOCK_CODE_MAHJONG_TILES = 170;
+    const BLOCK_CODE_DOMINO_TILES = 171;
+    const BLOCK_CODE_SAMARITAN = 172;
+    const BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED = 173;
+    const BLOCK_CODE_TAI_THAM = 174;
+    const BLOCK_CODE_VEDIC_EXTENSIONS = 175;
+    const BLOCK_CODE_LISU = 176;
+    const BLOCK_CODE_BAMUM = 177;
+    const BLOCK_CODE_COMMON_INDIC_NUMBER_FORMS = 178;
+    const BLOCK_CODE_DEVANAGARI_EXTENDED = 179;
+    const BLOCK_CODE_HANGUL_JAMO_EXTENDED_A = 180;
+    const BLOCK_CODE_JAVANESE = 181;
+    const BLOCK_CODE_MYANMAR_EXTENDED_A = 182;
+    const BLOCK_CODE_TAI_VIET = 183;
+    const BLOCK_CODE_MEETEI_MAYEK = 184;
+    const BLOCK_CODE_HANGUL_JAMO_EXTENDED_B = 185;
+    const BLOCK_CODE_IMPERIAL_ARAMAIC = 186;
+    const BLOCK_CODE_OLD_SOUTH_ARABIAN = 187;
+    const BLOCK_CODE_AVESTAN = 188;
+    const BLOCK_CODE_INSCRIPTIONAL_PARTHIAN = 189;
+    const BLOCK_CODE_INSCRIPTIONAL_PAHLAVI = 190;
+    const BLOCK_CODE_OLD_TURKIC = 191;
+    const BLOCK_CODE_RUMI_NUMERAL_SYMBOLS = 192;
+    const BLOCK_CODE_KAITHI = 193;
+    const BLOCK_CODE_EGYPTIAN_HIEROGLYPHS = 194;
+    const BLOCK_CODE_ENCLOSED_ALPHANUMERIC_SUPPLEMENT = 195;
+    const BLOCK_CODE_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT = 196;
+    const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C = 197;
+    const BLOCK_CODE_MANDAIC = 198;
+    const BLOCK_CODE_BATAK = 199;
+    const BLOCK_CODE_ETHIOPIC_EXTENDED_A = 200;
+    const BLOCK_CODE_BRAHMI = 201;
+    const BLOCK_CODE_BAMUM_SUPPLEMENT = 202;
+    const BLOCK_CODE_KANA_SUPPLEMENT = 203;
+    const BLOCK_CODE_PLAYING_CARDS = 204;
+    const BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS = 205;
+    const BLOCK_CODE_EMOTICONS = 206;
+    const BLOCK_CODE_TRANSPORT_AND_MAP_SYMBOLS = 207;
+    const BLOCK_CODE_ALCHEMICAL_SYMBOLS = 208;
+    const BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D = 209;
+    const BLOCK_CODE_ARABIC_EXTENDED_A = 210;
+    const BLOCK_CODE_ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS = 211;
+    const BLOCK_CODE_CHAKMA = 212;
+    const BLOCK_CODE_MEETEI_MAYEK_EXTENSIONS = 213;
+    const BLOCK_CODE_MEROITIC_CURSIVE = 214;
+    const BLOCK_CODE_MEROITIC_HIEROGLYPHS = 215;
+    const BLOCK_CODE_MIAO = 216;
+    const BLOCK_CODE_SHARADA = 217;
+    const BLOCK_CODE_SORA_SOMPENG = 218;
+    const BLOCK_CODE_SUNDANESE_SUPPLEMENT = 219;
+    const BLOCK_CODE_TAKRI = 220;
+    const BLOCK_CODE_BASSA_VAH = 221;
+    const BLOCK_CODE_CAUCASIAN_ALBANIAN = 222;
+    const BLOCK_CODE_COPTIC_EPACT_NUMBERS = 223;
+    const BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_EXTENDED = 224;
+    const BLOCK_CODE_DUPLOYAN = 225;
+    const BLOCK_CODE_ELBASAN = 226;
+    const BLOCK_CODE_GEOMETRIC_SHAPES_EXTENDED = 227;
+    const BLOCK_CODE_GRANTHA = 228;
+    const BLOCK_CODE_KHOJKI = 229;
+    const BLOCK_CODE_KHUDAWADI = 230;
+    const BLOCK_CODE_LATIN_EXTENDED_E = 231;
+    const BLOCK_CODE_LINEAR_A = 232;
+    const BLOCK_CODE_MAHAJANI = 233;
+    const BLOCK_CODE_MANICHAEAN = 234;
+    const BLOCK_CODE_MENDE_KIKAKUI = 235;
+    const BLOCK_CODE_MODI = 236;
+    const BLOCK_CODE_MRO = 237;
+    const BLOCK_CODE_MYANMAR_EXTENDED_B = 238;
+    const BLOCK_CODE_NABATAEAN = 239;
+    const BLOCK_CODE_OLD_NORTH_ARABIAN = 240;
+    const BLOCK_CODE_OLD_PERMIC = 241;
+    const BLOCK_CODE_ORNAMENTAL_DINGBATS = 242;
+    const BLOCK_CODE_PAHAWH_HMONG = 243;
+    const BLOCK_CODE_PALMYRENE = 244;
+    const BLOCK_CODE_PAU_CIN_HAU = 245;
+    const BLOCK_CODE_PSALTER_PAHLAVI = 246;
+    const BLOCK_CODE_SHORTHAND_FORMAT_CONTROLS = 247;
+    const BLOCK_CODE_SIDDHAM = 248;
+    const BLOCK_CODE_SINHALA_ARCHAIC_NUMBERS = 249;
+    const BLOCK_CODE_SUPPLEMENTAL_ARROWS_C = 250;
+    const BLOCK_CODE_TIRHUTA = 251;
+    const BLOCK_CODE_WARANG_CITI = 252;
+    const BLOCK_CODE_COUNT = 292;
+    const BLOCK_CODE_INVALID_CODE = -1;
+    const BPT_NONE = 0;
+    const BPT_OPEN = 1;
+    const BPT_CLOSE = 2;
+    const BPT_COUNT = 3;
+    const EA_NEUTRAL = 0;
+    const EA_AMBIGUOUS = 1;
+    const EA_HALFWIDTH = 2;
+    const EA_FULLWIDTH = 3;
+    const EA_NARROW = 4;
+    const EA_WIDE = 5;
+    const EA_COUNT = 6;
+    const UNICODE_CHAR_NAME = 0;
+    const UNICODE_10_CHAR_NAME = 1;
+    const EXTENDED_CHAR_NAME = 2;
+    const CHAR_NAME_ALIAS = 3;
+    const CHAR_NAME_CHOICE_COUNT = 4;
+    const SHORT_PROPERTY_NAME = 0;
+    const LONG_PROPERTY_NAME = 1;
+    const PROPERTY_NAME_CHOICE_COUNT = 2;
+    const DT_NONE = 0;
+    const DT_CANONICAL = 1;
+    const DT_COMPAT = 2;
+    const DT_CIRCLE = 3;
+    const DT_FINAL = 4;
+    const DT_FONT = 5;
+    const DT_FRACTION = 6;
+    const DT_INITIAL = 7;
+    const DT_ISOLATED = 8;
+    const DT_MEDIAL = 9;
+    const DT_NARROW = 10;
+    const DT_NOBREAK = 11;
+    const DT_SMALL = 12;
+    const DT_SQUARE = 13;
+    const DT_SUB = 14;
+    const DT_SUPER = 15;
+    const DT_VERTICAL = 16;
+    const DT_WIDE = 17;
+    const DT_COUNT = 18;
+    const JT_NON_JOINING = 0;
+    const JT_JOIN_CAUSING = 1;
+    const JT_DUAL_JOINING = 2;
+    const JT_LEFT_JOINING = 3;
+    const JT_RIGHT_JOINING = 4;
+    const JT_TRANSPARENT = 5;
+    const JT_COUNT = 6;
+    const JG_NO_JOINING_GROUP = 0;
+    const JG_AIN = 1;
+    const JG_ALAPH = 2;
+    const JG_ALEF = 3;
+    const JG_BEH = 4;
+    const JG_BETH = 5;
+    const JG_DAL = 6;
+    const JG_DALATH_RISH = 7;
+    const JG_E = 8;
+    const JG_FEH = 9;
+    const JG_FINAL_SEMKATH = 10;
+    const JG_GAF = 11;
+    const JG_GAMAL = 12;
+    const JG_HAH = 13;
+    const JG_TEH_MARBUTA_GOAL = 14;
+    const JG_HAMZA_ON_HEH_GOAL = 14;
+    const JG_HE = 15;
+    const JG_HEH = 16;
+    const JG_HEH_GOAL = 17;
+    const JG_HETH = 18;
+    const JG_KAF = 19;
+    const JG_KAPH = 20;
+    const JG_KNOTTED_HEH = 21;
+    const JG_LAM = 22;
+    const JG_LAMADH = 23;
+    const JG_MEEM = 24;
+    const JG_MIM = 25;
+    const JG_NOON = 26;
+    const JG_NUN = 27;
+    const JG_PE = 28;
+    const JG_QAF = 29;
+    const JG_QAPH = 30;
+    const JG_REH = 31;
+    const JG_REVERSED_PE = 32;
+    const JG_SAD = 33;
+    const JG_SADHE = 34;
+    const JG_SEEN = 35;
+    const JG_SEMKATH = 36;
+    const JG_SHIN = 37;
+    const JG_SWASH_KAF = 38;
+    const JG_SYRIAC_WAW = 39;
+    const JG_TAH = 40;
+    const JG_TAW = 41;
+    const JG_TEH_MARBUTA = 42;
+    const JG_TETH = 43;
+    const JG_WAW = 44;
+    const JG_YEH = 45;
+    const JG_YEH_BARREE = 46;
+    const JG_YEH_WITH_TAIL = 47;
+    const JG_YUDH = 48;
+    const JG_YUDH_HE = 49;
+    const JG_ZAIN = 50;
+    const JG_FE = 51;
+    const JG_KHAPH = 52;
+    const JG_ZHAIN = 53;
+    const JG_BURUSHASKI_YEH_BARREE = 54;
+    const JG_FARSI_YEH = 55;
+    const JG_NYA = 56;
+    const JG_ROHINGYA_YEH = 57;
+    const JG_MANICHAEAN_ALEPH = 58;
+    const JG_MANICHAEAN_AYIN = 59;
+    const JG_MANICHAEAN_BETH = 60;
+    const JG_MANICHAEAN_DALETH = 61;
+    const JG_MANICHAEAN_DHAMEDH = 62;
+    const JG_MANICHAEAN_FIVE = 63;
+    const JG_MANICHAEAN_GIMEL = 64;
+    const JG_MANICHAEAN_HETH = 65;
+    const JG_MANICHAEAN_HUNDRED = 66;
+    const JG_MANICHAEAN_KAPH = 67;
+    const JG_MANICHAEAN_LAMEDH = 68;
+    const JG_MANICHAEAN_MEM = 69;
+    const JG_MANICHAEAN_NUN = 70;
+    const JG_MANICHAEAN_ONE = 71;
+    const JG_MANICHAEAN_PE = 72;
+    const JG_MANICHAEAN_QOPH = 73;
+    const JG_MANICHAEAN_RESH = 74;
+    const JG_MANICHAEAN_SADHE = 75;
+    const JG_MANICHAEAN_SAMEKH = 76;
+    const JG_MANICHAEAN_TAW = 77;
+    const JG_MANICHAEAN_TEN = 78;
+    const JG_MANICHAEAN_TETH = 79;
+    const JG_MANICHAEAN_THAMEDH = 80;
+    const JG_MANICHAEAN_TWENTY = 81;
+    const JG_MANICHAEAN_WAW = 82;
+    const JG_MANICHAEAN_YODH = 83;
+    const JG_MANICHAEAN_ZAYIN = 84;
+    const JG_STRAIGHT_WAW = 85;
+    const JG_COUNT = 102;
+    const GCB_OTHER = 0;
+    const GCB_CONTROL = 1;
+    const GCB_CR = 2;
+    const GCB_EXTEND = 3;
+    const GCB_L = 4;
+    const GCB_LF = 5;
+    const GCB_LV = 6;
+    const GCB_LVT = 7;
+    const GCB_T = 8;
+    const GCB_V = 9;
+    const GCB_SPACING_MARK = 10;
+    const GCB_PREPEND = 11;
+    const GCB_REGIONAL_INDICATOR = 12;
+    const GCB_COUNT = 18;
+    const WB_OTHER = 0;
+    const WB_ALETTER = 1;
+    const WB_FORMAT = 2;
+    const WB_KATAKANA = 3;
+    const WB_MIDLETTER = 4;
+    const WB_MIDNUM = 5;
+    const WB_NUMERIC = 6;
+    const WB_EXTENDNUMLET = 7;
+    const WB_CR = 8;
+    const WB_EXTEND = 9;
+    const WB_LF = 10;
+    const WB_MIDNUMLET = 11;
+    const WB_NEWLINE = 12;
+    const WB_REGIONAL_INDICATOR = 13;
+    const WB_HEBREW_LETTER = 14;
+    const WB_SINGLE_QUOTE = 15;
+    const WB_DOUBLE_QUOTE = 16;
+    const WB_COUNT = 23;
+    const SB_OTHER = 0;
+    const SB_ATERM = 1;
+    const SB_CLOSE = 2;
+    const SB_FORMAT = 3;
+    const SB_LOWER = 4;
+    const SB_NUMERIC = 5;
+    const SB_OLETTER = 6;
+    const SB_SEP = 7;
+    const SB_SP = 8;
+    const SB_STERM = 9;
+    const SB_UPPER = 10;
+    const SB_CR = 11;
+    const SB_EXTEND = 12;
+    const SB_LF = 13;
+    const SB_SCONTINUE = 14;
+    const SB_COUNT = 15;
+    const LB_UNKNOWN = 0;
+    const LB_AMBIGUOUS = 1;
+    const LB_ALPHABETIC = 2;
+    const LB_BREAK_BOTH = 3;
+    const LB_BREAK_AFTER = 4;
+    const LB_BREAK_BEFORE = 5;
+    const LB_MANDATORY_BREAK = 6;
+    const LB_CONTINGENT_BREAK = 7;
+    const LB_CLOSE_PUNCTUATION = 8;
+    const LB_COMBINING_MARK = 9;
+    const LB_CARRIAGE_RETURN = 10;
+    const LB_EXCLAMATION = 11;
+    const LB_GLUE = 12;
+    const LB_HYPHEN = 13;
+    const LB_IDEOGRAPHIC = 14;
+    const LB_INSEPARABLE = 15;
+    const LB_INSEPERABLE = 15;
+    const LB_INFIX_NUMERIC = 16;
+    const LB_LINE_FEED = 17;
+    const LB_NONSTARTER = 18;
+    const LB_NUMERIC = 19;
+    const LB_OPEN_PUNCTUATION = 20;
+    const LB_POSTFIX_NUMERIC = 21;
+    const LB_PREFIX_NUMERIC = 22;
+    const LB_QUOTATION = 23;
+    const LB_COMPLEX_CONTEXT = 24;
+    const LB_SURROGATE = 25;
+    const LB_SPACE = 26;
+    const LB_BREAK_SYMBOLS = 27;
+    const LB_ZWSPACE = 28;
+    const LB_NEXT_LINE = 29;
+    const LB_WORD_JOINER = 30;
+    const LB_H2 = 31;
+    const LB_H3 = 32;
+    const LB_JL = 33;
+    const LB_JT = 34;
+    const LB_JV = 35;
+    const LB_CLOSE_PARENTHESIS = 36;
+    const LB_CONDITIONAL_JAPANESE_STARTER = 37;
+    const LB_HEBREW_LETTER = 38;
+    const LB_REGIONAL_INDICATOR = 39;
+    const LB_COUNT = 43;
+    const NT_NONE = 0;
+    const NT_DECIMAL = 1;
+    const NT_DIGIT = 2;
+    const NT_NUMERIC = 3;
+    const NT_COUNT = 4;
+    const HST_NOT_APPLICABLE = 0;
+    const HST_LEADING_JAMO = 1;
+    const HST_VOWEL_JAMO = 2;
+    const HST_TRAILING_JAMO = 3;
+    const HST_LV_SYLLABLE = 4;
+    const HST_LVT_SYLLABLE = 5;
+    const HST_COUNT = 6;
+    const FOLD_CASE_DEFAULT = 0;
+    const FOLD_CASE_EXCLUDE_SPECIAL_I = 1;
+
+    // methods
+    public static function chr($codepoint) {}
+    public static function ord($character) {}
+    public static function hasBinaryProperty($codepoint, $property) {}
+    public static function isUAlphabetic($codepoint) {}
+    public static function isULowercase($codepoint) {}
+    public static function isUUppercase($codepoint) {}
+    public static function isUWhiteSpace($codepoint) {}
+    public static function getIntPropertyValue($codepoint, $property) {}
+    public static function getIntPropertyMinValue($property) {}
+    public static function getIntPropertyMaxValue($property) {}
+    public static function getNumericValue($codepoint) {}
+    public static function islower($codepoint) {}
+    public static function isupper($codepoint) {}
+    public static function istitle($codepoint) {}
+    public static function isdigit($codepoint) {}
+    public static function isalpha($codepoint) {}
+    public static function isalnum($codepoint) {}
+    public static function isxdigit($codepoint) {}
+    public static function ispunct($codepoint) {}
+    public static function isgraph($codepoint) {}
+    public static function isblank($codepoint) {}
+    public static function isdefined($codepoint) {}
+    public static function isspace($codepoint) {}
+    public static function isJavaSpaceChar($codepoint) {}
+    public static function isWhitespace($codepoint) {}
+    public static function iscntrl($codepoint) {}
+    public static function isISOControl($codepoint) {}
+    public static function isprint($codepoint) {}
+    public static function isbase($codepoint) {}
+    public static function charDirection($codepoint) {}
+    public static function isMirrored($codepoint) {}
+    public static function charMirror($codepoint) {}
+    public static function getBidiPairedBracket($codepoint) {}
+    public static function charType($codepoint) {}
+    public static function enumCharTypes($callback = null) {}
+    public static function getCombiningClass($codepoint) {}
+    public static function charDigitValue($codepoint) {}
+    public static function getBlockCode($codepoint) {}
+    public static function charName($codepoint, $nameChoice = null) {}
+    public static function charFromName($characterName, $nameChoice = null) {}
+    public static function enumCharNames($start, $limit, $callback, $nameChoice = null) {}
+    public static function getPropertyName($property, $nameChoice = null) {}
+    public static function getPropertyEnum($alias) {}
+    public static function getPropertyValueName($property, $value, $nameChoice = null) {}
+    public static function getPropertyValueEnum($property, $name) {}
+    public static function isIDStart($codepoint) {}
+    public static function isIDPart($codepoint) {}
+    public static function isIDIgnorable($codepoint) {}
+    public static function isJavaIDStart($codepoint) {}
+    public static function isJavaIDPart($codepoint) {}
+    public static function tolower($codepoint) {}
+    public static function toupper($codepoint) {}
+    public static function totitle($codepoint) {}
+    public static function foldCase($codepoint, $options = null) {}
+    public static function digit($codepoint, $radix = null) {}
+    public static function forDigit($digit, $radix = null) {}
+    public static function charAge($codepoint) {}
+    public static function getUnicodeVersion() {}
+    public static function getFC_NFKC_Closure($codepoint) {}
+}
+
+class IntlCodePointBreakIterator extends \IntlBreakIterator {
+
+    // constants
+    const DONE = -1;
+    const WORD_NONE = 0;
+    const WORD_NONE_LIMIT = 100;
+    const WORD_NUMBER = 100;
+    const WORD_NUMBER_LIMIT = 200;
+    const WORD_LETTER = 200;
+    const WORD_LETTER_LIMIT = 300;
+    const WORD_KANA = 300;
+    const WORD_KANA_LIMIT = 400;
+    const WORD_IDEO = 400;
+    const WORD_IDEO_LIMIT = 500;
+    const LINE_SOFT = 0;
+    const LINE_SOFT_LIMIT = 100;
+    const LINE_HARD = 100;
+    const LINE_HARD_LIMIT = 200;
+    const SENTENCE_TERM = 0;
+    const SENTENCE_TERM_LIMIT = 100;
+    const SENTENCE_SEP = 100;
+    const SENTENCE_SEP_LIMIT = 200;
+
+    // methods
+    public function getLastCodePoint() {}
+}
+
+class IntlDateFormatter {
+
+    // constants
+    const FULL = 0;
+    const LONG = 1;
+    const MEDIUM = 2;
+    const SHORT = 3;
+    const NONE = -1;
+    const GREGORIAN = 1;
+    const TRADITIONAL = 0;
+
+    // methods
+    public function __construct($locale, $datetype, $timetype, $timezone = null, $calendar = null, $pattern = null) {}
+    public static function create($locale, $datetype, $timetype, $timezone = null, $calendar = null, $pattern = null) {}
+    public function getDateType() {}
+    public function getTimeType() {}
+    public function getCalendar() {}
+    public function getCalendarObject() {}
+    public function setCalendar($which) {}
+    public function getTimeZoneId() {}
+    public function getTimeZone() {}
+    public function setTimeZone($zone) {}
+    public function setPattern($pattern) {}
+    public function getPattern() {}
+    public function getLocale() {}
+    public function setLenient($lenient) {}
+    public function isLenient() {}
+    public function format($args = null, $array = null) {}
+    public static function formatObject($object, $format = null, $locale = null) {}
+    public function parse($string, &$position = null) {}
+    public function localtime($string, &$position = null) {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+}
+
+class IntlException extends \Exception {
+
+    // properties
+    protected $message;
+    protected $code;
+    protected $file;
+    protected $line;
+}
+
+class IntlGregorianCalendar extends \IntlCalendar {
+
+    // constants
+    const FIELD_ERA = 0;
+    const FIELD_YEAR = 1;
+    const FIELD_MONTH = 2;
+    const FIELD_WEEK_OF_YEAR = 3;
+    const FIELD_WEEK_OF_MONTH = 4;
+    const FIELD_DATE = 5;
+    const FIELD_DAY_OF_YEAR = 6;
+    const FIELD_DAY_OF_WEEK = 7;
+    const FIELD_DAY_OF_WEEK_IN_MONTH = 8;
+    const FIELD_AM_PM = 9;
+    const FIELD_HOUR = 10;
+    const FIELD_HOUR_OF_DAY = 11;
+    const FIELD_MINUTE = 12;
+    const FIELD_SECOND = 13;
+    const FIELD_MILLISECOND = 14;
+    const FIELD_ZONE_OFFSET = 15;
+    const FIELD_DST_OFFSET = 16;
+    const FIELD_YEAR_WOY = 17;
+    const FIELD_DOW_LOCAL = 18;
+    const FIELD_EXTENDED_YEAR = 19;
+    const FIELD_JULIAN_DAY = 20;
+    const FIELD_MILLISECONDS_IN_DAY = 21;
+    const FIELD_IS_LEAP_MONTH = 22;
+    const FIELD_FIELD_COUNT = 23;
+    const FIELD_DAY_OF_MONTH = 5;
+    const DOW_SUNDAY = 1;
+    const DOW_MONDAY = 2;
+    const DOW_TUESDAY = 3;
+    const DOW_WEDNESDAY = 4;
+    const DOW_THURSDAY = 5;
+    const DOW_FRIDAY = 6;
+    const DOW_SATURDAY = 7;
+    const DOW_TYPE_WEEKDAY = 0;
+    const DOW_TYPE_WEEKEND = 1;
+    const DOW_TYPE_WEEKEND_OFFSET = 2;
+    const DOW_TYPE_WEEKEND_CEASE = 3;
+    const WALLTIME_FIRST = 1;
+    const WALLTIME_LAST = 0;
+    const WALLTIME_NEXT_VALID = 2;
+
+    // methods
+    public function __construct($timeZoneOrYear = null, $localeOrMonth = null, $dayOfMonth = null, $hour = null, $minute = null, $second = null) {}
+    public function setGregorianChange($date) {}
+    public function getGregorianChange() {}
+    public function isLeapYear($year) {}
+}
+
+class IntlIterator implements \Iterator, \Traversable {
+
+    // methods
+    public function current() {}
+    public function key() {}
+    public function next() {}
+    public function rewind() {}
+    public function valid() {}
+}
+
+class IntlPartsIterator extends \IntlIterator {
+
+    // constants
+    const KEY_SEQUENTIAL = 0;
+    const KEY_LEFT = 1;
+    const KEY_RIGHT = 2;
+
+    // methods
+    public function getBreakIterator() {}
+}
+
+class IntlRuleBasedBreakIterator extends \IntlBreakIterator {
+
+    // constants
+    const DONE = -1;
+    const WORD_NONE = 0;
+    const WORD_NONE_LIMIT = 100;
+    const WORD_NUMBER = 100;
+    const WORD_NUMBER_LIMIT = 200;
+    const WORD_LETTER = 200;
+    const WORD_LETTER_LIMIT = 300;
+    const WORD_KANA = 300;
+    const WORD_KANA_LIMIT = 400;
+    const WORD_IDEO = 400;
+    const WORD_IDEO_LIMIT = 500;
+    const LINE_SOFT = 0;
+    const LINE_SOFT_LIMIT = 100;
+    const LINE_HARD = 100;
+    const LINE_HARD_LIMIT = 200;
+    const SENTENCE_TERM = 0;
+    const SENTENCE_TERM_LIMIT = 100;
+    const SENTENCE_SEP = 100;
+    const SENTENCE_SEP_LIMIT = 200;
+
+    // methods
+    public function __construct($rules, $areCompiled = null) {}
+    public function getRules() {}
+    public function getRuleStatus() {}
+    public function getRuleStatusVec() {}
+    public function getBinaryRules() {}
+}
+
+class IntlTimeZone {
+
+    // constants
+    const DISPLAY_SHORT = 1;
+    const DISPLAY_LONG = 2;
+    const DISPLAY_SHORT_GENERIC = 3;
+    const DISPLAY_LONG_GENERIC = 4;
+    const DISPLAY_SHORT_GMT = 5;
+    const DISPLAY_LONG_GMT = 6;
+    const DISPLAY_SHORT_COMMONLY_USED = 7;
+    const DISPLAY_GENERIC_LOCATION = 8;
+    const TYPE_ANY = 0;
+    const TYPE_CANONICAL = 1;
+    const TYPE_CANONICAL_LOCATION = 2;
+
+    // methods
+    private function __construct() {}
+    public static function createTimeZone($zoneId) {}
+    public static function fromDateTimeZone($zoneId) {}
+    public static function createDefault() {}
+    public static function getGMT() {}
+    public static function getUnknown() {}
+    public static function createEnumeration($countryOrRawOffset = null) {}
+    public static function countEquivalentIDs($zoneId) {}
+    public static function createTimeZoneIDEnumeration($zoneType, $region = null, $rawOffset = null) {}
+    public static function getCanonicalID($zoneId, &$isSystemID = null) {}
+    public static function getRegion($zoneId) {}
+    public static function getTZDataVersion() {}
+    public static function getEquivalentID($zoneId, $index) {}
+    public function getID() {}
+    public function useDaylightTime() {}
+    public function getOffset($date, $local, &$rawOffset, &$dstOffset) {}
+    public function getRawOffset() {}
+    public function hasSameRules(\IntlTimeZone $otherTimeZone) {}
+    public function getDisplayName($isDaylight = null, $style = null, $locale = null) {}
+    public function getDSTSavings() {}
+    public function toDateTimeZone() {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+    public static function getWindowsID($timezone) {}
+    public static function getIDForWindowsID($timezone, $region = null) {}
+}
+
+class Locale {
+
+    // constants
+    const ACTUAL_LOCALE = 0;
+    const VALID_LOCALE = 1;
+    const DEFAULT_LOCALE = NULL;
+    const LANG_TAG = 'language';
+    const EXTLANG_TAG = 'extlang';
+    const SCRIPT_TAG = 'script';
+    const REGION_TAG = 'region';
+    const VARIANT_TAG = 'variant';
+    const GRANDFATHERED_LANG_TAG = 'grandfathered';
+    const PRIVATE_TAG = 'private';
+
+    // properties
+    public $name;
+
+    // methods
+    public static function getDefault() {}
+    public static function setDefault($locale) {}
+    public static function getPrimaryLanguage($locale) {}
+    public static function getScript($locale) {}
+    public static function getRegion($locale) {}
+    public static function getKeywords($locale) {}
+    public static function getDisplayScript($locale, $in_locale = null) {}
+    public static function getDisplayRegion($locale, $in_locale = null) {}
+    public static function getDisplayName($locale, $in_locale = null) {}
+    public static function getDisplayLanguage($locale, $in_locale = null) {}
+    public static function getDisplayVariant($locale, $in_locale = null) {}
+    public static function composeLocale($subtags) {}
+    public static function parseLocale($locale) {}
+    public static function getAllVariants($locale) {}
+    public static function filterMatches($langtag, $locale, $canonicalize = null) {}
+    public static function lookup($langtag, $locale, $canonicalize = null, $default = null) {}
+    public static function canonicalize($locale) {}
+    public static function acceptFromHttp($header) {}
+}
+
+class MessageFormatter {
+
+    // methods
+    public function __construct($locale, $pattern) {}
+    public static function create($locale, $pattern) {}
+    public function format($args) {}
+    public static function formatMessage($locale, $pattern, $args) {}
+    public function parse($source) {}
+    public static function parseMessage($locale, $pattern, $args) {}
+    public function setPattern($pattern) {}
+    public function getPattern() {}
+    public function getLocale() {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+}
+
+class Normalizer {
+
+    // constants
+    const NONE = 2;
+    const FORM_D = 4;
+    const NFD = 4;
+    const FORM_KD = 8;
+    const NFKD = 8;
+    const FORM_C = 16;
+    const NFC = 16;
+    const FORM_KC = 32;
+    const NFKC = 32;
+    const FORM_KC_CF = 48;
+    const NFKC_CF = 48;
+
+    // properties
+    public $name;
+
+    // methods
+    public static function normalize($input, $form = null) {}
+    public static function isNormalized($input, $form = null) {}
+    public static function getRawDecomposition($input) {}
+}
+
+class NumberFormatter {
+
+    // constants
+    const PATTERN_DECIMAL = 0;
+    const DECIMAL = 1;
+    const CURRENCY = 2;
+    const PERCENT = 3;
+    const SCIENTIFIC = 4;
+    const SPELLOUT = 5;
+    const ORDINAL = 6;
+    const DURATION = 7;
+    const PATTERN_RULEBASED = 9;
+    const IGNORE = 0;
+    const DEFAULT_STYLE = 1;
+    const ROUND_CEILING = 0;
+    const ROUND_FLOOR = 1;
+    const ROUND_DOWN = 2;
+    const ROUND_UP = 3;
+    const ROUND_HALFEVEN = 4;
+    const ROUND_HALFDOWN = 5;
+    const ROUND_HALFUP = 6;
+    const PAD_BEFORE_PREFIX = 0;
+    const PAD_AFTER_PREFIX = 1;
+    const PAD_BEFORE_SUFFIX = 2;
+    const PAD_AFTER_SUFFIX = 3;
+    const PARSE_INT_ONLY = 0;
+    const GROUPING_USED = 1;
+    const DECIMAL_ALWAYS_SHOWN = 2;
+    const MAX_INTEGER_DIGITS = 3;
+    const MIN_INTEGER_DIGITS = 4;
+    const INTEGER_DIGITS = 5;
+    const MAX_FRACTION_DIGITS = 6;
+    const MIN_FRACTION_DIGITS = 7;
+    const FRACTION_DIGITS = 8;
+    const MULTIPLIER = 9;
+    const GROUPING_SIZE = 10;
+    const ROUNDING_MODE = 11;
+    const ROUNDING_INCREMENT = 12;
+    const FORMAT_WIDTH = 13;
+    const PADDING_POSITION = 14;
+    const SECONDARY_GROUPING_SIZE = 15;
+    const SIGNIFICANT_DIGITS_USED = 16;
+    const MIN_SIGNIFICANT_DIGITS = 17;
+    const MAX_SIGNIFICANT_DIGITS = 18;
+    const LENIENT_PARSE = 19;
+    const POSITIVE_PREFIX = 0;
+    const POSITIVE_SUFFIX = 1;
+    const NEGATIVE_PREFIX = 2;
+    const NEGATIVE_SUFFIX = 3;
+    const PADDING_CHARACTER = 4;
+    const CURRENCY_CODE = 5;
+    const DEFAULT_RULESET = 6;
+    const PUBLIC_RULESETS = 7;
+    const DECIMAL_SEPARATOR_SYMBOL = 0;
+    const GROUPING_SEPARATOR_SYMBOL = 1;
+    const PATTERN_SEPARATOR_SYMBOL = 2;
+    const PERCENT_SYMBOL = 3;
+    const ZERO_DIGIT_SYMBOL = 4;
+    const DIGIT_SYMBOL = 5;
+    const MINUS_SIGN_SYMBOL = 6;
+    const PLUS_SIGN_SYMBOL = 7;
+    const CURRENCY_SYMBOL = 8;
+    const INTL_CURRENCY_SYMBOL = 9;
+    const MONETARY_SEPARATOR_SYMBOL = 10;
+    const EXPONENTIAL_SYMBOL = 11;
+    const PERMILL_SYMBOL = 12;
+    const PAD_ESCAPE_SYMBOL = 13;
+    const INFINITY_SYMBOL = 14;
+    const NAN_SYMBOL = 15;
+    const SIGNIFICANT_DIGIT_SYMBOL = 16;
+    const MONETARY_GROUPING_SEPARATOR_SYMBOL = 17;
+    const TYPE_DEFAULT = 0;
+    const TYPE_INT32 = 1;
+    const TYPE_INT64 = 2;
+    const TYPE_DOUBLE = 3;
+    const TYPE_CURRENCY = 4;
+
+    // properties
+    public $name;
+
+    // methods
+    public function __construct($locale, $style, $pattern = null) {}
+    public static function create($locale, $style, $pattern = null) {}
+    public function format($num, $type = null) {}
+    public function parse($string, $type = null, &$position = null) {}
+    public function formatCurrency($num, $currency) {}
+    public function parseCurrency($string, &$currency, &$position = null) {}
+    public function setAttribute($attr, $value) {}
+    public function getAttribute($attr) {}
+    public function setTextAttribute($attr, $value) {}
+    public function getTextAttribute($attr) {}
+    public function setSymbol($attr, $symbol) {}
+    public function getSymbol($attr) {}
+    public function setPattern($pattern) {}
+    public function getPattern() {}
+    public function getLocale($type = null) {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+}
+
+class ResourceBundle implements \Traversable {
+
+    // methods
+    public function __construct($locale, $bundlename, $fallback = null) {}
+    public static function create($locale, $bundlename, $fallback = null) {}
+    public function get($index, $fallback = null) {}
+    public function count() {}
+    public static function getLocales($bundlename) {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+}
+
+class Spoofchecker {
+
+    // constants
+    const SINGLE_SCRIPT_CONFUSABLE = 1;
+    const MIXED_SCRIPT_CONFUSABLE = 2;
+    const WHOLE_SCRIPT_CONFUSABLE = 4;
+    const ANY_CASE = 8;
+    const SINGLE_SCRIPT = 16;
+    const INVISIBLE = 32;
+    const CHAR_LIMIT = 64;
+    const ASCII = 268435456;
+    const HIGHLY_RESTRICTIVE = 805306368;
+    const MODERATELY_RESTRICTIVE = 1073741824;
+    const MINIMALLY_RESTRICTIVE = 1342177280;
+    const UNRESTRICTIVE = 1610612736;
+    const SINGLE_SCRIPT_RESTRICTIVE = 536870912;
+
+    // methods
+    public function __construct() {}
+    public function isSuspicious($text, &$error = null) {}
+    public function areConfusable($s1, $s2, &$error = null) {}
+    public function setAllowedLocales($locale_list) {}
+    public function setChecks($checks) {}
+    public function setRestrictionLevel($level) {}
+}
+
+class Transliterator {
+
+    // constants
+    const FORWARD = 0;
+    const REVERSE = 1;
+
+    // properties
+    public $id;
+
+    // methods
+    private function __construct() {}
+    public static function create($id, $direction = null) {}
+    public static function createFromRules($rules, $direction = null) {}
+    public function createInverse() {}
+    public static function listIDs() {}
+    public function transliterate($subject, $start = null, $end = null) {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+}
+
+class UConverter {
+
+    // constants
+    const REASON_UNASSIGNED = 0;
+    const REASON_ILLEGAL = 1;
+    const REASON_IRREGULAR = 2;
+    const REASON_RESET = 3;
+    const REASON_CLOSE = 4;
+    const REASON_CLONE = 5;
+    const UNSUPPORTED_CONVERTER = -1;
+    const SBCS = 0;
+    const DBCS = 1;
+    const MBCS = 2;
+    const LATIN_1 = 3;
+    const UTF8 = 4;
+    const UTF16_BigEndian = 5;
+    const UTF16_LittleEndian = 6;
+    const UTF32_BigEndian = 7;
+    const UTF32_LittleEndian = 8;
+    const EBCDIC_STATEFUL = 9;
+    const ISO_2022 = 10;
+    const LMBCS_1 = 11;
+    const LMBCS_2 = 12;
+    const LMBCS_3 = 13;
+    const LMBCS_4 = 14;
+    const LMBCS_5 = 15;
+    const LMBCS_6 = 16;
+    const LMBCS_8 = 17;
+    const LMBCS_11 = 18;
+    const LMBCS_16 = 19;
+    const LMBCS_17 = 20;
+    const LMBCS_18 = 21;
+    const LMBCS_19 = 22;
+    const LMBCS_LAST = 22;
+    const HZ = 23;
+    const SCSU = 24;
+    const ISCII = 25;
+    const US_ASCII = 26;
+    const UTF7 = 27;
+    const BOCU1 = 28;
+    const UTF16 = 29;
+    const UTF32 = 30;
+    const CESU8 = 31;
+    const IMAP_MAILBOX = 32;
+
+    // methods
+    public function __construct($destination_encoding = null, $source_encoding = null) {}
+    public function setSourceEncoding($encoding) {}
+    public function setDestinationEncoding($encoding) {}
+    public function getSourceEncoding() {}
+    public function getDestinationEncoding() {}
+    public function getSourceType() {}
+    public function getDestinationType() {}
+    public function getSubstChars() {}
+    public function setSubstChars($chars) {}
+    public function toUCallback($reason, $source, $codeUnits, &$error) {}
+    public function fromUCallback($reason, $source, $codePoint, &$error) {}
+    public function convert($str, $reverse = null) {}
+    public static function transcode($str, $toEncoding, $fromEncoding, array $options = null) {}
+    public function getErrorCode() {}
+    public function getErrorMessage() {}
+    public static function reasonText($reason = null) {}
+    public static function getAvailable() {}
+    public static function getAliases($name) {}
+    public static function getStandards() {}
+}
+
+function collator_asort(\Collator $object, array &$arr, $sort_flags = null) {}
+function collator_compare(\Collator $object, $arg1, $arg2) {}
+function collator_create($arg1) {}
+function collator_get_attribute(\Collator $object, $arg1) {}
+function collator_get_error_code(\Collator $object) {}
+function collator_get_error_message(\Collator $object) {}
+function collator_get_locale(\Collator $object, $arg1) {}
+function collator_get_sort_key(\Collator $object, $arg1) {}
+function collator_get_strength(\Collator $object) {}
+function collator_set_attribute(\Collator $object, $arg1, $arg2) {}
+function collator_set_strength(\Collator $object, $arg1) {}
+function collator_sort(\Collator $object, array &$arr, $sort_flags = null) {}
+function collator_sort_with_sort_keys(\Collator $coll, array &$arr) {}
+function datefmt_create($locale, $date_type, $time_type, $timezone_str = null, $calendar = null, $pattern = null) {}
+function datefmt_format($args = null, $array = null) {}
+function datefmt_format_object($object, $format = null, $locale = null) {}
+function datefmt_get_calendar($mf) {}
+function datefmt_get_calendar_object($mf) {}
+function datefmt_get_datetype($mf) {}
+function datefmt_get_error_code($nf) {}
+function datefmt_get_error_message($coll) {}
+function datefmt_get_locale($mf) {}
+function datefmt_get_pattern($mf) {}
+function datefmt_get_timetype($mf) {}
+function datefmt_get_timezone($mf) {}
+function datefmt_get_timezone_id($mf) {}
+function datefmt_is_lenient($mf) {}
+function datefmt_localtime($formatter, $string, &$position = null) {}
+function datefmt_parse($formatter, $string, &$position = null) {}
+function datefmt_set_calendar($mf, $calendar) {}
+function datefmt_set_lenient($mf) {}
+function datefmt_set_pattern($mf, $pattern) {}
+function datefmt_set_timezone($mf, $timezone) {}
+function grapheme_extract($arg1, $arg2, $arg3 = null, $arg4 = null, &$arg5 = null) {}
+function grapheme_stripos($haystack, $needle, $offset = null) {}
+function grapheme_stristr($haystack, $needle, $before_needle = null) {}
+function grapheme_strlen($string) {}
+function grapheme_strpos($haystack, $needle, $offset = null) {}
+function grapheme_strripos($haystack, $needle, $offset = null) {}
+function grapheme_strrpos($haystack, $needle, $offset = null) {}
+function grapheme_strstr($haystack, $needle, $before_needle = null) {}
+function grapheme_substr($string, $start, $length = null) {}
+function idn_to_ascii($domain, $option = null, $variant = null, &$idn_info = null) {}
+function idn_to_utf8($domain, $option = null, $variant = null, &$idn_info = null) {}
+function intl_error_name($arg1) {}
+function intl_get_error_code() {}
+function intl_get_error_message() {}
+function intl_is_failure($arg1) {}
+function intlcal_add(\IntlCalendar $calendar, $field, $amount) {}
+function intlcal_after(\IntlCalendar $calendar, \IntlCalendar $otherCalendar) {}
+function intlcal_before(\IntlCalendar $calendar, \IntlCalendar $otherCalendar) {}
+function intlcal_clear(\IntlCalendar $calendar, $field = null) {}
+function intlcal_create_instance($timeZone = null, $locale = null) {}
+function intlcal_equals(\IntlCalendar $calendar, \IntlCalendar $otherCalendar) {}
+function intlcal_field_difference(\IntlCalendar $calendar, $when, $field) {}
+function intlcal_from_date_time($dateTime) {}
+function intlcal_get(\IntlCalendar $calendar, $field) {}
+function intlcal_get_actual_maximum(\IntlCalendar $calendar, $field) {}
+function intlcal_get_actual_minimum(\IntlCalendar $calendar, $field) {}
+function intlcal_get_available_locales() {}
+function intlcal_get_day_of_week_type(\IntlCalendar $calendar, $dayOfWeek) {}
+function intlcal_get_error_code(\IntlCalendar $calendar) {}
+function intlcal_get_error_message(\IntlCalendar $calendar) {}
+function intlcal_get_first_day_of_week(\IntlCalendar $calendar) {}
+function intlcal_get_greatest_minimum(\IntlCalendar $calendar, $field) {}
+function intlcal_get_keyword_values_for_locale($key, $locale, $commonlyUsed) {}
+function intlcal_get_least_maximum(\IntlCalendar $calendar, $field) {}
+function intlcal_get_locale(\IntlCalendar $calendar, $localeType) {}
+function intlcal_get_maximum(\IntlCalendar $calendar, $field) {}
+function intlcal_get_minimal_days_in_first_week(\IntlCalendar $calendar) {}
+function intlcal_get_minimum(\IntlCalendar $calendar, $field) {}
+function intlcal_get_now() {}
+function intlcal_get_repeated_wall_time_option(\IntlCalendar $calendar) {}
+function intlcal_get_skipped_wall_time_option(\IntlCalendar $calendar) {}
+function intlcal_get_time(\IntlCalendar $calendar) {}
+function intlcal_get_time_zone(\IntlCalendar $calendar) {}
+function intlcal_get_type(\IntlCalendar $calendar) {}
+function intlcal_get_weekend_transition(\IntlCalendar $calendar, $dayOfWeek) {}
+function intlcal_in_daylight_time(\IntlCalendar $calendar) {}
+function intlcal_is_equivalent_to(\IntlCalendar $calendar, \IntlCalendar $otherCalendar) {}
+function intlcal_is_lenient(\IntlCalendar $calendar) {}
+function intlcal_is_set(\IntlCalendar $calendar, $field) {}
+function intlcal_is_weekend(\IntlCalendar $calendar, $date = null) {}
+function intlcal_roll(\IntlCalendar $calendar, $field, $amountOrUpOrDown = null) {}
+function intlcal_set(\IntlCalendar $calendar, $fieldOrYear, $valueOrMonth, $dayOfMonth = null, $hour = null, $minute = null, $second = null) {}
+function intlcal_set_first_day_of_week(\IntlCalendar $calendar, $dayOfWeek) {}
+function intlcal_set_lenient(\IntlCalendar $calendar, $isLenient) {}
+function intlcal_set_minimal_days_in_first_week(\IntlCalendar $calendar, $numberOfDays) {}
+function intlcal_set_repeated_wall_time_option(\IntlCalendar $calendar, $wallTimeOption) {}
+function intlcal_set_skipped_wall_time_option(\IntlCalendar $calendar, $wallTimeOption) {}
+function intlcal_set_time(\IntlCalendar $calendar, $date) {}
+function intlcal_set_time_zone(\IntlCalendar $calendar, $timeZone) {}
+function intlcal_to_date_time(\IntlCalendar $calendar) {}
+function intlgregcal_create_instance($timeZoneOrYear = null, $localeOrMonth = null, $dayOfMonth = null, $hour = null, $minute = null, $second = null) {}
+function intlgregcal_get_gregorian_change(\IntlGregorianCalendar $calendar) {}
+function intlgregcal_is_leap_year(\IntlGregorianCalendar $calendar, $year) {}
+function intlgregcal_set_gregorian_change(\IntlGregorianCalendar $calendar, $date) {}
+function intltz_count_equivalent_ids($zoneId) {}
+function intltz_create_default() {}
+function intltz_create_enumeration($countryOrRawOffset = null) {}
+function intltz_create_time_zone($zoneId) {}
+function intltz_create_time_zone_id_enumeration($zoneType, $region = null, $rawOffset = null) {}
+function intltz_from_date_time_zone(\DateTimeZone $dateTimeZone) {}
+function intltz_get_canonical_id($zoneId, &$isSystemID = null) {}
+function intltz_get_display_name(\IntlTimeZone $timeZone, $isDaylight = null, $style = null, $locale = null) {}
+function intltz_get_dst_savings(\IntlTimeZone $timeZone) {}
+function intltz_get_equivalent_id($zoneId, $index) {}
+function intltz_get_error_code(\IntlTimeZone $timeZone) {}
+function intltz_get_error_message(\IntlTimeZone $timeZone) {}
+function intltz_get_gmt() {}
+function intltz_get_id(\IntlTimeZone $timeZone) {}
+function intltz_get_offset(\IntlTimeZone $timeZone, $date, $local, &$rawOffset, &$dstOffset) {}
+function intltz_get_raw_offset(\IntlTimeZone $timeZone) {}
+function intltz_get_region($zoneId) {}
+function intltz_get_tz_data_version() {}
+function intltz_get_unknown() {}
+function intltz_has_same_rules(\IntlTimeZone $timeZone, \IntlTimeZone $otherTimeZone = null) {}
+function intltz_to_date_time_zone(\IntlTimeZone $timeZone) {}
+function intltz_use_daylight_time(\IntlTimeZone $timeZone) {}
+function locale_accept_from_http($arg1) {}
+function locale_canonicalize($arg1) {}
+function locale_compose($arg1) {}
+function locale_filter_matches($langtag, $locale, $canonicalize = null) {}
+function locale_get_all_variants($arg1) {}
+function locale_get_default() {}
+function locale_get_display_language($locale, $in_locale = null) {}
+function locale_get_display_name($locale, $in_locale = null) {}
+function locale_get_display_region($locale, $in_locale = null) {}
+function locale_get_display_script($locale, $in_locale = null) {}
+function locale_get_display_variant($locale, $in_locale = null) {}
+function locale_get_keywords($arg1) {}
+function locale_get_primary_language($arg1) {}
+function locale_get_region($arg1) {}
+function locale_get_script($arg1) {}
+function locale_lookup($langtag, $locale, $canonicalize = null, $def = null) {}
+function locale_parse($arg1) {}
+function locale_set_default($arg1) {}
+function msgfmt_create($locale, $pattern) {}
+function msgfmt_format($nf, $args) {}
+function msgfmt_format_message($locale, $pattern, $args) {}
+function msgfmt_get_error_code($nf) {}
+function msgfmt_get_error_message($coll) {}
+function msgfmt_get_locale($mf) {}
+function msgfmt_get_pattern($mf) {}
+function msgfmt_parse($nf, $source) {}
+function msgfmt_parse_message($locale, $pattern, $source) {}
+function msgfmt_set_pattern($mf, $pattern) {}
+function normalizer_get_raw_decomposition($input) {}
+function normalizer_is_normalized($input, $form = null) {}
+function normalizer_normalize($input, $form = null) {}
+function numfmt_create($locale, $style, $pattern = null) {}
+function numfmt_format($nf, $num, $type = null) {}
+function numfmt_format_currency($nf, $num, $currency) {}
+function numfmt_get_attribute($nf, $attr) {}
+function numfmt_get_error_code($nf) {}
+function numfmt_get_error_message($nf) {}
+function numfmt_get_locale($nf, $type = null) {}
+function numfmt_get_pattern($nf) {}
+function numfmt_get_symbol($nf, $attr) {}
+function numfmt_get_text_attribute($nf, $attr) {}
+function numfmt_parse($formatter, $string, $type = null, &$position = null) {}
+function numfmt_parse_currency($formatter, $string, &$currency, &$position = null) {}
+function numfmt_set_attribute($nf, $attr, $value) {}
+function numfmt_set_pattern($nf, $pattern) {}
+function numfmt_set_symbol($nf, $attr, $symbol) {}
+function numfmt_set_text_attribute($nf, $attr, $value) {}
+function resourcebundle_count($bundle) {}
+function resourcebundle_create($locale, $bundlename, $fallback = null) {}
+function resourcebundle_get($bundle, $index, $fallback = null) {}
+function resourcebundle_get_error_code($bundle) {}
+function resourcebundle_get_error_message($bundle) {}
+function resourcebundle_locales($bundlename) {}
+function transliterator_create($id, $direction = null) {}
+function transliterator_create_from_rules($rules, $direction = null) {}
+function transliterator_create_inverse(\Transliterator $orig_trans) {}
+function transliterator_get_error_code(\Transliterator $trans) {}
+function transliterator_get_error_message(\Transliterator $trans) {}
+function transliterator_list_ids() {}
+function transliterator_transliterate($trans, $subject, $start = null, $end = null) {}
+const GRAPHEME_EXTR_COUNT = 0;
+const GRAPHEME_EXTR_MAXBYTES = 1;
+const GRAPHEME_EXTR_MAXCHARS = 2;
+const IDNA_ALLOW_UNASSIGNED = 1;
+const IDNA_CHECK_BIDI = 4;
+const IDNA_CHECK_CONTEXTJ = 8;
+const IDNA_DEFAULT = 0;
+const IDNA_ERROR_BIDI = 2048;
+const IDNA_ERROR_CONTEXTJ = 4096;
+const IDNA_ERROR_DISALLOWED = 128;
+const IDNA_ERROR_DOMAIN_NAME_TOO_LONG = 4;
+const IDNA_ERROR_EMPTY_LABEL = 1;
+const IDNA_ERROR_HYPHEN_3_4 = 32;
+const IDNA_ERROR_INVALID_ACE_LABEL = 1024;
+const IDNA_ERROR_LABEL_HAS_DOT = 512;
+const IDNA_ERROR_LABEL_TOO_LONG = 2;
+const IDNA_ERROR_LEADING_COMBINING_MARK = 64;
+const IDNA_ERROR_LEADING_HYPHEN = 8;
+const IDNA_ERROR_PUNYCODE = 256;
+const IDNA_ERROR_TRAILING_HYPHEN = 16;
+const IDNA_NONTRANSITIONAL_TO_ASCII = 16;
+const IDNA_NONTRANSITIONAL_TO_UNICODE = 32;
+const IDNA_USE_STD3_RULES = 2;
+const INTL_ICU_DATA_VERSION = '63.1';
+const INTL_ICU_VERSION = '63.1';
+const INTL_IDNA_VARIANT_2003 = 0;
+const INTL_IDNA_VARIANT_UTS46 = 1;
+const INTL_MAX_LOCALE_LEN = 156;
+const ULOC_ACTUAL_LOCALE = 0;
+const ULOC_VALID_LOCALE = 1;
+const U_AMBIGUOUS_ALIAS_WARNING = -122;
+const U_BAD_VARIABLE_DEFINITION = 65536;
+const U_BRK_ASSIGN_ERROR = 66053;
+const U_BRK_ERROR_LIMIT = 66062;
+const U_BRK_ERROR_START = 66048;
+const U_BRK_HEX_DIGITS_EXPECTED = 66049;
+const U_BRK_INIT_ERROR = 66058;
+const U_BRK_INTERNAL_ERROR = 66048;
+const U_BRK_MALFORMED_RULE_TAG = 66061;
+const U_BRK_MISMATCHED_PAREN = 66055;
+const U_BRK_NEW_LINE_IN_QUOTED_STRING = 66056;
+const U_BRK_RULE_EMPTY_SET = 66059;
+const U_BRK_RULE_SYNTAX = 66051;
+const U_BRK_SEMICOLON_EXPECTED = 66050;
+const U_BRK_UNCLOSED_SET = 66052;
+const U_BRK_UNDEFINED_VARIABLE = 66057;
+const U_BRK_UNRECOGNIZED_OPTION = 66060;
+const U_BRK_VARIABLE_REDFINITION = 66054;
+const U_BUFFER_OVERFLOW_ERROR = 15;
+const U_CE_NOT_FOUND_ERROR = 21;
+const U_COLLATOR_VERSION_MISMATCH = 28;
+const U_DIFFERENT_UCA_VERSION = -121;
+const U_ENUM_OUT_OF_SYNC_ERROR = 25;
+const U_ERROR_LIMIT = 66818;
+const U_ERROR_WARNING_LIMIT = -119;
+const U_ERROR_WARNING_START = -128;
+const U_FILE_ACCESS_ERROR = 4;
+const U_FMT_PARSE_ERROR_LIMIT = 65812;
+const U_FMT_PARSE_ERROR_START = 65792;
+const U_IDNA_ACE_PREFIX_ERROR = 66564;
+const U_IDNA_CHECK_BIDI_ERROR = 66562;
+const U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR = 66568;
+const U_IDNA_ERROR_LIMIT = 66569;
+const U_IDNA_ERROR_START = 66560;
+const U_IDNA_LABEL_TOO_LONG_ERROR = 66566;
+const U_IDNA_PROHIBITED_ERROR = 66560;
+const U_IDNA_STD3_ASCII_RULES_ERROR = 66563;
+const U_IDNA_UNASSIGNED_ERROR = 66561;
+const U_IDNA_VERIFICATION_ERROR = 66565;
+const U_IDNA_ZERO_LENGTH_LABEL_ERROR = 66567;
+const U_ILLEGAL_ARGUMENT_ERROR = 1;
+const U_ILLEGAL_CHARACTER = 65567;
+const U_ILLEGAL_CHAR_FOUND = 12;
+const U_ILLEGAL_CHAR_IN_SEGMENT = 65564;
+const U_ILLEGAL_ESCAPE_SEQUENCE = 18;
+const U_ILLEGAL_PAD_POSITION = 65800;
+const U_INDEX_OUTOFBOUNDS_ERROR = 8;
+const U_INTERNAL_PROGRAM_ERROR = 5;
+const U_INTERNAL_TRANSLITERATOR_ERROR = 65568;
+const U_INVALID_CHAR_FOUND = 10;
+const U_INVALID_FORMAT_ERROR = 3;
+const U_INVALID_FUNCTION = 65570;
+const U_INVALID_ID = 65569;
+const U_INVALID_PROPERTY_PATTERN = 65561;
+const U_INVALID_RBT_SYNTAX = 65560;
+const U_INVALID_STATE_ERROR = 27;
+const U_INVALID_TABLE_FILE = 14;
+const U_INVALID_TABLE_FORMAT = 13;
+const U_INVARIANT_CONVERSION_ERROR = 26;
+const U_MALFORMED_EXPONENTIAL_PATTERN = 65795;
+const U_MALFORMED_PRAGMA = 65562;
+const U_MALFORMED_RULE = 65537;
+const U_MALFORMED_SET = 65538;
+const U_MALFORMED_SYMBOL_REFERENCE = 65539;
+const U_MALFORMED_UNICODE_ESCAPE = 65540;
+const U_MALFORMED_VARIABLE_DEFINITION = 65541;
+const U_MALFORMED_VARIABLE_REFERENCE = 65542;
+const U_MEMORY_ALLOCATION_ERROR = 7;
+const U_MESSAGE_PARSE_ERROR = 6;
+const U_MISMATCHED_SEGMENT_DELIMITERS = 65543;
+const U_MISPLACED_ANCHOR_START = 65544;
+const U_MISPLACED_COMPOUND_FILTER = 65558;
+const U_MISPLACED_CURSOR_OFFSET = 65545;
+const U_MISPLACED_QUANTIFIER = 65546;
+const U_MISSING_OPERATOR = 65547;
+const U_MISSING_RESOURCE_ERROR = 2;
+const U_MISSING_SEGMENT_CLOSE = 65548;
+const U_MULTIPLE_ANTE_CONTEXTS = 65549;
+const U_MULTIPLE_COMPOUND_FILTERS = 65559;
+const U_MULTIPLE_CURSORS = 65550;
+const U_MULTIPLE_DECIMAL_SEPARATORS = 65793;
+const U_MULTIPLE_DECIMAL_SEPERATORS = 65793;
+const U_MULTIPLE_EXPONENTIAL_SYMBOLS = 65794;
+const U_MULTIPLE_PAD_SPECIFIERS = 65798;
+const U_MULTIPLE_PERCENT_SYMBOLS = 65796;
+const U_MULTIPLE_PERMILL_SYMBOLS = 65797;
+const U_MULTIPLE_POST_CONTEXTS = 65551;
+const U_NO_SPACE_AVAILABLE = 20;
+const U_NO_WRITE_PERMISSION = 30;
+const U_PARSE_ERROR = 9;
+const U_PARSE_ERROR_LIMIT = 65571;
+const U_PARSE_ERROR_START = 65536;
+const U_PATTERN_SYNTAX_ERROR = 65799;
+const U_PRIMARY_TOO_LONG_ERROR = 22;
+const U_REGEX_BAD_ESCAPE_SEQUENCE = 66307;
+const U_REGEX_BAD_INTERVAL = 66312;
+const U_REGEX_ERROR_LIMIT = 66326;
+const U_REGEX_ERROR_START = 66304;
+const U_REGEX_INTERNAL_ERROR = 66304;
+const U_REGEX_INVALID_BACK_REF = 66314;
+const U_REGEX_INVALID_FLAG = 66315;
+const U_REGEX_INVALID_STATE = 66306;
+const U_REGEX_LOOK_BEHIND_LIMIT = 66316;
+const U_REGEX_MAX_LT_MIN = 66313;
+const U_REGEX_MISMATCHED_PAREN = 66310;
+const U_REGEX_NUMBER_TOO_BIG = 66311;
+const U_REGEX_PROPERTY_SYNTAX = 66308;
+const U_REGEX_RULE_SYNTAX = 66305;
+const U_REGEX_SET_CONTAINS_STRING = 66317;
+const U_REGEX_UNIMPLEMENTED = 66309;
+const U_RESOURCE_TYPE_MISMATCH = 17;
+const U_RULE_MASK_ERROR = 65557;
+const U_SAFECLONE_ALLOCATED_WARNING = -126;
+const U_SORT_KEY_TOO_SHORT_WARNING = -123;
+const U_STANDARD_ERROR_LIMIT = 31;
+const U_STATE_OLD_WARNING = -125;
+const U_STATE_TOO_OLD_ERROR = 23;
+const U_STRINGPREP_CHECK_BIDI_ERROR = 66562;
+const U_STRINGPREP_PROHIBITED_ERROR = 66560;
+const U_STRINGPREP_UNASSIGNED_ERROR = 66561;
+const U_STRING_NOT_TERMINATED_WARNING = -124;
+const U_TOO_MANY_ALIASES_ERROR = 24;
+const U_TRAILING_BACKSLASH = 65552;
+const U_TRUNCATED_CHAR_FOUND = 11;
+const U_UNCLOSED_SEGMENT = 65563;
+const U_UNDEFINED_SEGMENT_REFERENCE = 65553;
+const U_UNDEFINED_VARIABLE = 65554;
+const U_UNEXPECTED_TOKEN = 65792;
+const U_UNMATCHED_BRACES = 65801;
+const U_UNQUOTED_SPECIAL = 65555;
+const U_UNSUPPORTED_ATTRIBUTE = 65803;
+const U_UNSUPPORTED_ERROR = 16;
+const U_UNSUPPORTED_ESCAPE_SEQUENCE = 19;
+const U_UNSUPPORTED_PROPERTY = 65802;
+const U_UNTERMINATED_QUOTE = 65556;
+const U_USELESS_COLLATOR_ERROR = 29;
+const U_USING_DEFAULT_WARNING = -127;
+const U_USING_FALLBACK_WARNING = -128;
+const U_VARIABLE_RANGE_EXHAUSTED = 65565;
+const U_VARIABLE_RANGE_OVERLAP = 65566;
+const U_ZERO_ERROR = 0;
+}
index e87d4cd..d663a44 100644 (file)
@@ -22,7 +22,7 @@ class ExcimerProfiler {
        }
        public function stop() {
        }
-       public function getLog() {
+       public function getLog() : ExcimerLog {
        }
        public function flush() {
        }
@@ -33,8 +33,14 @@ class ExcimerLog {
        }
        function formatCollapsed() {
        }
+       /**
+        * @return array[]
+        */
        function aggregateByFunction() {
        }
+       /**
+        * @return int
+        */
        function getEventCount() {
        }
        function current() {
diff --git a/INSTALL b/INSTALL
index bf64ab7..07dd9c3 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -5,8 +5,16 @@ Installing MediaWiki
 Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 "in-place", as long as you have the necessary prerequisites available.
 
-Required software:
-* Web server with PHP 7.0.0 or HHVM 3.18.5 or higher.
+Required software as of MediaWiki 1.34.0:
+
+* Web server with PHP 7.0.13 or higher, plus the following extesnsions:
+** ctype
+** dom
+** fileinfo
+** iconv
+** json
+** mbstring
+** xml
 * A SQL server, the following types are supported
 ** MySQL 5.5.8 or higher
 ** PostgreSQL 9.2 or higher
index e57dacc..275f4c2 100644 (file)
@@ -485,7 +485,15 @@ because of Phabricator reports.
 == Compatibility ==
 MediaWiki 1.34 requires PHP 7.0.13 or later. Although HHVM 3.18.5 or later is
 supported, it is generally advised to use PHP 7.0.13 or later for long term
-support.
+support. It also requires the following PHP extensions:
+
+* ctype
+* dom
+* fileinfo
+* iconv
+* json
+* mbstring
+* xml
 
 MySQL/MariaDB is the recommended DBMS. PostgreSQL or SQLite can also be used,
 but support for them is somewhat less mature.
index 98e7ebf..dad3c5c 100644 (file)
@@ -20,6 +20,7 @@
                "composer/semver": "1.5.0",
                "cssjanus/cssjanus": "1.3.0",
                "ext-ctype": "*",
+               "ext-dom": "*",
                "ext-fileinfo": "*",
                "ext-iconv": "*",
                "ext-json": "*",
index b893bc9..abbc62c 100644 (file)
@@ -134,6 +134,7 @@ class AutoLoader {
                        'MediaWiki\\Edit\\' => __DIR__ . '/edit/',
                        'MediaWiki\\EditPage\\' => __DIR__ . '/editpage/',
                        'MediaWiki\\Linker\\' => __DIR__ . '/linker/',
+                       'MediaWiki\\Message\\' => __DIR__ . '/Message',
                        'MediaWiki\\Permissions\\' => __DIR__ . '/Permissions/',
                        'MediaWiki\\Preferences\\' => __DIR__ . '/preferences/',
                        'MediaWiki\\Rest\\' => __DIR__ . '/Rest/',
@@ -143,6 +144,7 @@ class AutoLoader {
                        'MediaWiki\\Sparql\\' => __DIR__ . '/sparql/',
                        'MediaWiki\\Storage\\' => __DIR__ . '/Storage/',
                        'MediaWiki\\Tidy\\' => __DIR__ . '/tidy/',
+                       'Wikimedia\\Message\\' => __DIR__ . '/libs/Message/',
                        'Wikimedia\\ParamValidator\\' => __DIR__ . '/libs/ParamValidator/',
                        'Wikimedia\\Services\\' => __DIR__ . '/libs/services/',
                ];
index 9577a48..5a874d5 100644 (file)
@@ -1278,7 +1278,7 @@ $wgMaxAnimatedGifArea = 1.25e7;
  *  $wgTiffThumbnailType = [ 'jpg', 'image/jpeg' ];
  * @endcode
  */
-$wgTiffThumbnailType = false;
+$wgTiffThumbnailType = [];
 
 /**
  * If rendered thumbnail files are older than this timestamp, they
@@ -5231,13 +5231,16 @@ $wgGroupPermissions['bureaucrat']['noratelimit'] = true;
 # $wgGroupPermissions['sysop']['deletelogentry'] = true;
 # $wgGroupPermissions['sysop']['deleterevision'] = true;
 // To hide usernames from users and Sysops
-$wgGroupPermissions['suppress']['hideuser'] = true;
+$wgGroupPermissions['suppress']['hideuser'] = true;
 // To hide revisions/log items from users and Sysops
-$wgGroupPermissions['suppress']['suppressrevision'] = true;
+$wgGroupPermissions['suppress']['suppressrevision'] = true;
 // To view revisions/log items hidden from users and Sysops
-$wgGroupPermissions['suppress']['viewsuppressed'] = true;
+$wgGroupPermissions['suppress']['viewsuppressed'] = true;
 // For private suppression log access
-# $wgGroupPermissions['suppress']['suppressionlog'] = true;
+$wgGroupPermissions['suppress']['suppressionlog'] = true;
+// Basic rights for revision delete
+$wgGroupPermissions['suppress']['deleterevision'] = true;
+$wgGroupPermissions['suppress']['deletelogentry'] = true;
 
 /**
  * The developer group is deprecated, but can be activated if need be
index e51fc52..541541a 100644 (file)
@@ -1127,7 +1127,7 @@ class EditPage {
         * @return string|null
         */
        protected function importContentFormData( &$request ) {
-               return; // Don't do anything, EditPage already extracted wpTextbox1
+               return null; // Don't do anything, EditPage already extracted wpTextbox1
        }
 
        /**
@@ -4166,7 +4166,7 @@ ERROR;
         *  - 'legacy-name' (optional): short name for backwards-compatibility
         * @param array $checked Array of checkbox name (matching the 'legacy-name') => bool,
         *   where bool indicates the checked status of the checkbox
-        * @return array
+        * @return array[]
         */
        public function getCheckboxesDefinition( $checked ) {
                $checkboxes = [];
index ecbc6e3..78f6ca9 100644 (file)
@@ -88,6 +88,7 @@ class FauxRequest extends WebRequest {
 
        /**
         * @return array
+        * @suppress PhanParamSignatureMismatch
         */
        public function getValues() {
                return $this->data;
index 8272ccf..75eedcc 100644 (file)
@@ -181,7 +181,7 @@ class FileDeleteForm {
                                $logEntry->setPerformer( $user );
                                $logEntry->setTarget( $title );
                                $logEntry->setComment( $logComment );
-                               $logEntry->setTags( $tags );
+                               $logEntry->addTags( $tags );
                                $logid = $logEntry->insert();
                                $logEntry->publish( $logid );
 
@@ -212,7 +212,7 @@ class FileDeleteForm {
                                                $logEntry->setPerformer( $user );
                                                $logEntry->setTarget( clone $title );
                                                $logEntry->setComment( $reason );
-                                               $logEntry->setTags( $tags );
+                                               $logEntry->addTags( $tags );
                                                $logid = $logEntry->insert();
                                                $dbw->onTransactionPreCommitOrIdle(
                                                        function () use ( $logEntry, $logid ) {
@@ -261,6 +261,7 @@ class FileDeleteForm {
                );
                $options = Xml::listDropDownOptionsOoui( $options );
 
+               $fields = [];
                $fields[] = new OOUI\LabelWidget( [ 'label' => new OOUI\HtmlSnippet(
                        $this->prepareMessage( 'filedelete-intro' ) ) ]
                );
index cc998c7..2cde173 100644 (file)
@@ -1127,6 +1127,7 @@ function wfLogProfilingData() {
        if ( isset( $ctx['forwarded_for'] ) ||
                isset( $ctx['client_ip'] ) ||
                isset( $ctx['from'] ) ) {
+               // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
                $ctx['proxy'] = $_SERVER['REMOTE_ADDR'];
        }
 
@@ -2115,6 +2116,7 @@ function wfEscapeShellArg( ...$args ) {
  *     including errors from limit.sh
  *   - profileMethod: By default this function will profile based on the calling
  *     method. Set this to a string for an alternative method to profile from
+ * @phan-param array{duplicateStderr?:bool,profileMethod?:string} $options
  *
  * @return string Collected stdout as a string
  * @deprecated since 1.30 use class MediaWiki\Shell\Shell
@@ -2133,6 +2135,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = [],
        }
 
        $includeStderr = isset( $options['duplicateStderr'] ) && $options['duplicateStderr'];
+       // @phan-suppress-next-line PhanTypeInvalidDimOffset
        $profileMethod = $options['profileMethod'] ?? wfGetCaller();
 
        try {
@@ -2189,6 +2192,7 @@ function wfShellExecWithStderr( $cmd, &$retval = null, $environ = [], $limits =
  * @param array $options Associative array of options:
  *     'php': The path to the php executable
  *     'wrapper': Path to a PHP wrapper to handle the maintenance script
+ * @phan-param array{php?:string,wrapper?:string} $options
  * @return string
  */
 function wfShellWikiCmd( $script, array $parameters = [], array $options = [] ) {
@@ -2196,6 +2200,7 @@ function wfShellWikiCmd( $script, array $parameters = [], array $options = [] )
        // Give site config file a chance to run the script in a wrapper.
        // The caller may likely want to call wfBasename() on $script.
        Hooks::run( 'wfShellWikiCmd', [ &$script, &$parameters, &$options ] );
+       // @phan-suppress-next-line PhanTypeInvalidDimOffset
        $cmd = [ $options['php'] ?? $wgPhpCli ];
        if ( isset( $options['wrapper'] ) ) {
                $cmd[] = $options['wrapper'];
@@ -2892,6 +2897,7 @@ function wfUnpack( $format, $data, $length = false ) {
        $result = unpack( $format, $data );
        Wikimedia\restoreWarnings();
 
+       // @phan-suppress-next-line PhanTypeComparisonFromArray Phan issue #3160
        if ( $result === false ) {
                // If it cannot extract the packed data.
                throw new MWException( "unpack could not unpack binary data" );
index 6ad9b31..c46df94 100644 (file)
@@ -292,7 +292,7 @@ class LinkFilter {
                // The constant prefix is smaller than el_index_60, so we use a LIKE
                // for a prefix search.
                return [
-                       "{$p}_index_60" . $db->buildLike( [ $index, $db->anyString() ] ),
+                       "{$p}_index_60" . $db->buildLike( $index, $db->anyString() ),
                        "{$p}_index" . $db->buildLike( $like ),
                ];
        }
@@ -338,6 +338,7 @@ class LinkFilter {
                        }
                }
 
+               $like = [];
                $like[] = $bits['scheme'] . $bits['delimiter'] . $bits['host'];
 
                if ( $subdomains ) {
index 03d2516..1a5058d 100644 (file)
@@ -688,13 +688,14 @@ class Linker {
                if ( $label == '' ) {
                        $label = $title->getPrefixedText();
                }
+               $repoGroup = MediaWikiServices::getInstance()->getRepoGroup();
                $currentExists = $time
-                       && MediaWikiServices::getInstance()->getRepoGroup()->findFile( $title ) !== false;
+                       && $repoGroup->findFile( $title ) !== false;
 
                if ( ( $wgUploadMissingFileUrl || $wgUploadNavigationUrl || $wgEnableUploads )
                        && !$currentExists
                ) {
-                       if ( RepoGroup::singleton()->getLocalRepo()->checkRedirect( $title ) ) {
+                       if ( $repoGroup->getLocalRepo()->checkRedirect( $title ) ) {
                                // We already know it's a redirect, so mark it accordingly
                                return self::link(
                                        $title,
@@ -1040,7 +1041,7 @@ class Linker {
                }
 
                $userTalkPage = new TitleValue( NS_USER_TALK, strtr( $userText, ' ', '_' ) );
-               $moreLinkAttribs['class'] = 'mw-usertoollinks-talk';
+               $moreLinkAttribs = [ 'class' => 'mw-usertoollinks-talk' ];
 
                return self::link( $userTalkPage,
                        wfMessage( 'talkpagelinktext' )->escaped(),
@@ -1062,7 +1063,7 @@ class Linker {
                }
 
                $blockPage = SpecialPage::getTitleFor( 'Block', $userText );
-               $moreLinkAttribs['class'] = 'mw-usertoollinks-block';
+               $moreLinkAttribs = [ 'class' => 'mw-usertoollinks-block' ];
 
                return self::link( $blockPage,
                        wfMessage( 'blocklink' )->escaped(),
@@ -1083,7 +1084,7 @@ class Linker {
                }
 
                $emailPage = SpecialPage::getTitleFor( 'Emailuser', $userText );
-               $moreLinkAttribs['class'] = 'mw-usertoollinks-mail';
+               $moreLinkAttribs = [ 'class' => 'mw-usertoollinks-mail' ];
                return self::link( $emailPage,
                        wfMessage( 'emaillink' )->escaped(),
                        $moreLinkAttribs
index 7a6987e..f91477a 100644 (file)
@@ -745,7 +745,7 @@ class MediaWiki {
                        Profiler::instance()->logDataPageOutputOnly();
                } catch ( Exception $e ) {
                        // An error may already have been shown in run(), so just log it to be safe
-                       MWExceptionHandler::rollbackMasterChangesAndLog( $e );
+                       MWExceptionHandler::logException( $e );
                }
 
                // Disable WebResponse setters for post-send processing (T191537).
index 3b80e58..8f4ddf6 100644 (file)
@@ -19,6 +19,7 @@ use MediaWiki\Block\BlockRestrictionStore;
 use MediaWiki\FileBackend\FSFile\TempFSFileFactory;
 use MediaWiki\FileBackend\LockManager\LockManagerGroupFactory;
 use MediaWiki\Http\HttpRequestFactory;
+use Wikimedia\Message\IMessageFormatterFactory;
 use MediaWiki\Page\MovePageFactory;
 use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Preferences\PreferencesFactory;
@@ -718,6 +719,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'MessageCache' );
        }
 
+       /**
+        * @since 1.34
+        * @return IMessageFormatterFactory
+        */
+       public function getMessageFormatterFactory() {
+               return $this->getService( 'MessageFormatterFactory' );
+       }
+
        /**
         * @since 1.28
         * @return MimeAnalyzer
diff --git a/includes/Message/MessageFormatterFactory.php b/includes/Message/MessageFormatterFactory.php
new file mode 100644 (file)
index 0000000..101224a
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+namespace MediaWiki\Message;
+
+use Wikimedia\Message\IMessageFormatterFactory;
+use Wikimedia\Message\ITextFormatter;
+
+/**
+ * The MediaWiki-specific implementation of IMessageFormatterFactory
+ */
+class MessageFormatterFactory implements IMessageFormatterFactory {
+       private $textFormatters = [];
+
+       /**
+        * Required parameters may be added to this function without deprecation.
+        * External callers should use MediaWikiServices::getMessageFormatterFactory().
+        *
+        * @internal
+        */
+       public function __construct() {
+       }
+
+       public function getTextFormatter( $langCode ): ITextFormatter {
+               if ( !isset( $this->textFormatters[$langCode] ) ) {
+                       $this->textFormatters[$langCode] = new TextFormatter( $langCode );
+               }
+               return $this->textFormatters[$langCode];
+       }
+}
diff --git a/includes/Message/TextFormatter.php b/includes/Message/TextFormatter.php
new file mode 100644 (file)
index 0000000..f5eeb16
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+
+namespace MediaWiki\Message;
+
+use Wikimedia\Message\ITextFormatter;
+use Wikimedia\Message\ListParam;
+use Wikimedia\Message\MessageParam;
+use Wikimedia\Message\MessageValue;
+use Wikimedia\Message\ParamType;
+use Message;
+
+/**
+ * The MediaWiki-specific implementation of ITextFormatter
+ */
+class TextFormatter implements ITextFormatter {
+       /** @var string */
+       private $langCode;
+
+       /**
+        * Construct a TextFormatter.
+        *
+        * The type signature may change without notice as dependencies are added
+        * to the constructor. External callers should use
+        * MediaWikiServices::getMessageFormatterFactory()
+        *
+        * @internal
+        */
+       public function __construct( $langCode ) {
+               $this->langCode = $langCode;
+       }
+
+       /**
+        * Allow the Message class to be mocked in tests by constructing objects in
+        * a protected method.
+        *
+        * @internal
+        * @param string $key
+        * @return Message
+        */
+       protected function createMessage( $key ) {
+               return new Message( $key );
+       }
+
+       public function getLangCode() {
+               return $this->langCode;
+       }
+
+       private static function convertParam( MessageParam $param ) {
+               if ( $param instanceof ListParam ) {
+                       $convertedElements = [];
+                       foreach ( $param->getValue() as $element ) {
+                               $convertedElements[] = self::convertParam( $element );
+                       }
+                       return Message::listParam( $convertedElements, $param->getListType() );
+               } elseif ( $param instanceof MessageParam ) {
+                       if ( $param->getType() === ParamType::TEXT ) {
+                               return $param->getValue();
+                       } else {
+                               return [ $param->getType() => $param->getValue() ];
+                       }
+               } else {
+                       throw new \InvalidArgumentException( 'Invalid message parameter type' );
+               }
+       }
+
+       public function format( MessageValue $mv ) {
+               $message = $this->createMessage( $mv->getKey() );
+               foreach ( $mv->getParams() as $param ) {
+                       $message->params( self::convertParam( $param ) );
+               }
+               $message->inLanguage( $this->langCode );
+               return $message->text();
+       }
+}
index e6faace..4180e32 100644 (file)
@@ -446,7 +446,7 @@ class MovePage {
                                $status = Status::newFatal( 'movepage-max-pages', $wgMaximumMovedPages );
                                $perTitleStatus[$oldSubpage->getPrefixedText()] = $status;
                                $topStatus->merge( $status );
-                               $topStatus->setOk( true );
+                               $topStatus->setOK( true );
                                break;
                        }
 
@@ -479,7 +479,7 @@ class MovePage {
                        }
                        $perTitleStatus[$oldSubpage->getPrefixedText()] = $status;
                        $topStatus->merge( $status );
-                       $topStatus->setOk( true );
+                       $topStatus->setOK( true );
                }
 
                $topStatus->value = $perTitleStatus;
@@ -598,7 +598,7 @@ class MovePage {
                                '4::oldtitle' => $this->oldTitle->getPrefixedText(),
                        ] );
                        $logEntry->setRelations( [ 'pr_id' => $logRelationsValues ] );
-                       $logEntry->setTags( $changeTags );
+                       $logEntry->addTags( $changeTags );
                        $logId = $logEntry->insert();
                        $logEntry->publish( $logId );
                }
@@ -895,7 +895,7 @@ class MovePage {
                # Log the move
                $logid = $logEntry->insert();
 
-               $logEntry->setTags( $changeTags );
+               $logEntry->addTags( $changeTags );
                $logEntry->publish( $logid );
 
                return $nullRevision;
index 9af16d3..1703565 100644 (file)
@@ -44,7 +44,7 @@ use Wikimedia\WrappedStringList;
  * @todo document
  */
 class OutputPage extends ContextSource {
-       /** @var array Should be private. Used with addMeta() which adds "<meta>" */
+       /** @var string[][] Should be private. Used with addMeta() which adds "<meta>" */
        protected $mMetatags = [];
 
        /** @var array */
@@ -1820,14 +1820,10 @@ class OutputPage extends ContextSource {
         * @param string $text Wikitext
         * @param Title $title
         * @param bool $linestart Is this the start of a line?
-        * @param bool $tidy Whether to use tidy.
-        *             Setting this to false (or omitting it) is deprecated
-        *             since 1.32; all wikitext should be tidied.
         * @param bool $interface Whether it is an interface message
         *   (for example disables conversion)
         * @param string $wrapperClass if not empty, wraps the output in
         *   a `<div class="$wrapperClass">`
-        * @private
         */
        private function addWikiTextTitleInternal(
                $text, Title $title, $linestart, $interface, $wrapperClass = null
index 37791d0..0a8e515 100644 (file)
@@ -85,8 +85,8 @@ class PermissionManager {
        /** @var NamespaceInfo */
        private $nsInfo;
 
-       /** @var string[] Cached results of getAllRights() */
-       private $allRights = false;
+       /** @var string[]|null Cached results of getAllRights() */
+       private $allRights;
 
        /** @var string[][] Cached user rights */
        private $usersRights = null;
@@ -1220,7 +1220,8 @@ class PermissionManager {
         * Check if user is allowed to make any action
         *
         * @param UserIdentity $user
-        * // TODO: HHVM can't create mocks with variable params @param string ...$actions
+        * // TODO: HHVM bug T228695#5450847 @param string ...$actions
+        * @suppress PhanCommentParamWithoutRealParam
         * @return bool True if user is allowed to perform *any* of the given actions
         * @since 1.34
         */
@@ -1238,7 +1239,8 @@ class PermissionManager {
         * Check if user is allowed to make all actions
         *
         * @param UserIdentity $user
-        * // TODO: HHVM can't create mocks with variable params @param string ...$actions
+        * // TODO: HHVM bug T228695#5450847 @param string ...$actions
+        * @suppress PhanCommentParamWithoutRealParam
         * @return bool True if user is allowed to perform *all* of the given actions
         * @since 1.34
         */
@@ -1469,7 +1471,7 @@ class PermissionManager {
         * @return string[] Array of permission names
         */
        public function getAllPermissions() {
-               if ( $this->allRights === false ) {
+               if ( $this->allRights === null ) {
                        if ( count( $this->options->get( 'AvailableRights' ) ) ) {
                                $this->allRights = array_unique( array_merge(
                                        $this->coreRights,
index 246ae95..7450bb9 100644 (file)
@@ -58,7 +58,7 @@ class ProxyLookup {
         */
        public function isConfiguredProxy( $ip ) {
                // Quick check of known singular proxy servers
-               if ( in_array( $ip, $this->proxyServers ) ) {
+               if ( in_array( $ip, $this->proxyServers, true ) ) {
                        return true;
                }
 
index a71f6a6..528bac1 100644 (file)
@@ -51,7 +51,6 @@ class HeaderContainer {
         * better served by an HTTP header parsing library which provides the full
         * parse tree.
         *
-        * @param string $name The header name
         * @param string|string[] $value The input header value
         * @return array
         */
diff --git a/includes/Rest/LocalizedHttpException.php b/includes/Rest/LocalizedHttpException.php
new file mode 100644 (file)
index 0000000..10d3a40
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+namespace MediaWiki\Rest;
+
+use Wikimedia\Message\MessageValue;
+
+class LocalizedHttpException extends HttpException {
+       public function __construct( MessageValue $message, $code = 500 ) {
+               parent::__construct( 'Localized exception with key ' . $message->getKey(), $code );
+       }
+}
index 3bc8dda..ba229d1 100644 (file)
@@ -185,6 +185,7 @@ class RenderedRevision implements SlotRenderingProvider {
         * @param array $hints Hints given as an associative array. Known keys:
         *      - 'generate-html' => bool: Whether the caller is interested in output HTML (as opposed
         *        to just meta-data). Default is to generate HTML.
+        * @phan-param array{generate-html?:bool} $hints
         *
         * @return ParserOutput
         */
@@ -212,6 +213,7 @@ class RenderedRevision implements SlotRenderingProvider {
         * @param array $hints Hints given as an associative array. Known keys:
         *      - 'generate-html' => bool: Whether the caller is interested in output HTML (as opposed
         *        to just meta-data). Default is to generate HTML.
+        * @phan-param array{generate-html?:bool} $hints
         *
         * @throws SuppressedDataException if the content is not accessible for the audience
         *         specified in the constructor.
index 3c3b6a9..ea90255 100644 (file)
@@ -95,6 +95,7 @@ class RevisionRenderer {
         *        matched the $rev and $options. This mechanism is intended as a temporary stop-gap,
         *        for the time until caches have been changed to store RenderedRevision states instead
         *        of ParserOutput objects.
+        * @phan-param array{use-master?:bool,audience?:int,known-revision-output?:ParserOutput} $hints
         *
         * @return RenderedRevision|null The rendered revision, or null if the audience checks fails.
         */
@@ -108,6 +109,7 @@ class RevisionRenderer {
                        throw new InvalidArgumentException( 'Mismatching wiki ID ' . $rev->getWikiId() );
                }
 
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                $audience = $hints['audience']
                        ?? ( $forUser ? RevisionRecord::FOR_THIS_USER : RevisionRecord::FOR_PUBLIC );
 
@@ -121,6 +123,7 @@ class RevisionRenderer {
                        $options = ParserOptions::newCanonical( $forUser ?: 'canonical' );
                }
 
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                $useMaster = $hints['use-master'] ?? false;
 
                $dbIndex = $useMaster
index 9e8dfe7..818a536 100644 (file)
@@ -2324,6 +2324,7 @@ class RevisionStore
         *  - tables: (string[]) to include in the `$table` to `IDatabase->select()`
         *  - fields: (string[]) to include in the `$vars` to `IDatabase->select()`
         *  - joins: (array) to include in the `$join_conds` to `IDatabase->select()`
+        * @phan-return array{tables:string[],fields:string[],joins:array}
         */
        public function getQueryInfo( $options = [] ) {
                $ret = [
index 1acd038..d081629 100644 (file)
@@ -53,6 +53,8 @@ use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Linker\LinkRendererFactory;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Message\IMessageFormatterFactory;
+use MediaWiki\Message\MessageFormatterFactory;
 use MediaWiki\Page\MovePageFactory;
 use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Preferences\PreferencesFactory;
@@ -358,6 +360,11 @@ return [
                );
        },
 
+       'MessageFormatterFactory' =>
+       function ( MediaWikiServices $services ) : IMessageFormatterFactory {
+               return new MessageFormatterFactory();
+       },
+
        'MimeAnalyzer' => function ( MediaWikiServices $services ) : MimeAnalyzer {
                $logger = LoggerFactory::getInstance( 'Mime' );
                $mainConfig = $services->getMainConfig();
index 2267800..1e65f52 100644 (file)
@@ -386,6 +386,7 @@ $wgSkipSkins[] = 'apioutput';
 if ( $wgLocalInterwiki ) {
        // Hard deprecated in 1.34.
        wfDeprecated( '$wgLocalInterwiki – use $wgLocalInterwikis instead', '1.23' );
+       // @phan-suppress-next-line PhanUndeclaredVariableDim
        array_unshift( $wgLocalInterwikis, $wgLocalInterwiki );
 }
 
@@ -789,14 +790,6 @@ if ( $wgCommandLineMode ) {
 $wgMemc = ObjectCache::getLocalClusterInstance();
 $messageMemc = wfGetMessageCacheStorage();
 
-wfDebugLog( 'caches',
-       'cluster: ' . get_class( $wgMemc ) .
-       ', WAN: ' . ( $wgMainWANCache === CACHE_NONE ? 'CACHE_NONE' : $wgMainWANCache ) .
-       ', stash: ' . $wgMainStash .
-       ', message: ' . get_class( $messageMemc ) .
-       ', session: ' . get_class( ObjectCache::getInstance( $wgSessionCacheType ) )
-);
-
 // Most of the config is out, some might want to run hooks here.
 Hooks::run( 'SetupAfterCache' );
 
index 8b1112b..78885db 100644 (file)
@@ -22,6 +22,8 @@
 
 namespace MediaWiki\Storage;
 
+use StatusValue;
+
 /**
  * Service for loading and storing data blobs.
  *
@@ -95,6 +97,19 @@ interface BlobStore {
         */
        public function getBlob( $blobAddress, $queryFlags = 0 );
 
+       /**
+        * A batched version of BlobStore::getBlob.
+        *
+        * @param string[] $blobAddresses An array of blob addresses.
+        * @param int $queryFlags See IDBAccessObject.
+        * @throws BlobAccessException
+        * @return StatusValue A status with a map of blobAddress => binary blob data or null
+        *         if fetching the blob has failed. Fetch failures errors are the
+        *         warnings in the status object.
+        * @since 1.34
+        */
+       public function getBlobBatch( $blobAddresses, $queryFlags = 0 );
+
        /**
         * Stores an arbitrary blob of data and returns an address that can be used with
         * getBlob() to retrieve the same blob of data,
index d1b688b..8c011df 100644 (file)
 
 namespace MediaWiki\Storage;
 
+use AppendIterator;
 use DBAccessObjectUtils;
 use IDBAccessObject;
 use IExpiringStore;
 use InvalidArgumentException;
 use Language;
 use MWException;
+use StatusValue;
 use WANObjectCache;
 use ExternalStoreAccess;
 use Wikimedia\Assert\Assert;
@@ -277,92 +279,170 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
        public function getBlob( $blobAddress, $queryFlags = 0 ) {
                Assert::parameterType( 'string', $blobAddress, '$blobAddress' );
 
-               // No negative caching; negative hits on text rows may be due to corrupted replica DBs
+               $error = null;
                $blob = $this->cache->getWithSetCallback(
                        $this->getCacheKey( $blobAddress ),
                        $this->getCacheTTL(),
-                       function ( $unused, &$ttl, &$setOpts ) use ( $blobAddress, $queryFlags ) {
+                       function ( $unused, &$ttl, &$setOpts ) use ( $blobAddress, $queryFlags, &$error ) {
                                // Ignore $setOpts; blobs are immutable and negatives are not cached
-                               return $this->fetchBlob( $blobAddress, $queryFlags );
+                               list( $result, $errors ) = $this->fetchBlobs( [ $blobAddress ], $queryFlags );
+                               // No negative caching; negative hits on text rows may be due to corrupted replica DBs
+                               $error = $errors[$blobAddress] ?? null;
+                               return $result[$blobAddress];
                        },
                        [ 'pcGroup' => self::TEXT_CACHE_GROUP, 'pcTTL' => IExpiringStore::TTL_PROC_LONG ]
                );
 
-               if ( $blob === false ) {
-                       throw new BlobAccessException( 'Failed to load blob from address ' . $blobAddress );
+               if ( $error ) {
+                       throw new BlobAccessException( $error );
                }
 
+               Assert::postcondition( is_string( $blob ), 'Blob must not be null' );
                return $blob;
        }
 
+       /**
+        * A batched version of BlobStore::getBlob.
+        *
+        * @param string[] $blobAddresses An array of blob addresses.
+        * @param int $queryFlags See IDBAccessObject.
+        * @throws BlobAccessException
+        * @return StatusValue A status with a map of blobAddress => binary blob data or null
+        *         if fetching the blob has failed. Fetch failures errors are the
+        *         warnings in the status object.
+        * @since 1.34
+        */
+       public function getBlobBatch( $blobAddresses, $queryFlags = 0 ) {
+               $errors = null;
+               $addressByCacheKey = $this->cache->makeMultiKeys(
+                       $blobAddresses,
+                       function ( $blobAddress ) {
+                               return $this->getCacheKey( $blobAddress );
+                       }
+               );
+               $blobsByCacheKey = $this->cache->getMultiWithUnionSetCallback(
+                       $addressByCacheKey,
+                       $this->getCacheTTL(),
+                       function ( array $blobAddresses, array &$ttls, array &$setOpts ) use ( $queryFlags, &$errors ) {
+                               // Ignore $setOpts; blobs are immutable and negatives are not cached
+                               list( $result, $errors ) = $this->fetchBlobs( $blobAddresses, $queryFlags );
+                               return $result;
+                       },
+                       [ 'pcGroup' => self::TEXT_CACHE_GROUP, 'pcTTL' => IExpiringStore::TTL_PROC_LONG ]
+               );
+
+               // Remap back to incoming blob addresses. The return value of the
+               // WANObjectCache::getMultiWithUnionSetCallback is keyed on the internal
+               // keys from WANObjectCache::makeMultiKeys, so we need to remap them
+               // before returning to the client.
+               $blobsByAddress = [];
+               foreach ( $blobsByCacheKey as $cacheKey => $blob ) {
+                       $blobsByAddress[ $addressByCacheKey[ $cacheKey ] ] = $blob !== false ? $blob : null;
+               }
+
+               $result = StatusValue::newGood( $blobsByAddress );
+               if ( $errors ) {
+                       foreach ( $errors as $error ) {
+                               $result->warning( 'internalerror', $error );
+                       }
+               }
+               return $result;
+       }
+
        /**
         * MCR migration note: this corresponds to Revision::fetchText
         *
-        * @param string $blobAddress
+        * @param string[] $blobAddresses
         * @param int $queryFlags
         *
         * @throws BlobAccessException
-        * @return string|false
-        */
-       private function fetchBlob( $blobAddress, $queryFlags ) {
-               list( $schema, $id, ) = self::splitBlobAddress( $blobAddress );
+        * @return array [ $result, $errors ] A map of blob addresses to successfully fetched blobs
+        *         or false if fetch failed, plus and array of errors
+        */
+       private function fetchBlobs( $blobAddresses, $queryFlags ) {
+               $textIdToBlobAddress = [];
+               $result = [];
+               $errors = [];
+               foreach ( $blobAddresses as $blobAddress ) {
+                       list( $schema, $id ) = self::splitBlobAddress( $blobAddress );
+                       //TODO: MCR: also support 'ex' schema with ExternalStore URLs, plus flags encoded in the URL!
+                       if ( $schema === 'tt' ) {
+                               $textId = intval( $id );
+                               $textIdToBlobAddress[$textId] = $blobAddress;
+                       } else {
+                               $errors[$blobAddress] = "Unknown blob address schema: $schema";
+                               $result[$blobAddress] = false;
+                               continue;
+                       }
 
-               //TODO: MCR: also support 'ex' schema with ExternalStore URLs, plus flags encoded in the URL!
-               if ( $schema === 'tt' ) {
-                       $textId = intval( $id );
-               } else {
-                       // XXX: change to better exceptions! That makes migration more difficult, though.
-                       throw new BlobAccessException( "Unknown blob address schema: $schema" );
+                       if ( !$textId || $id !== (string)$textId ) {
+                               $errors[$blobAddress] = "Bad blob address: $blobAddress";
+                               $result[$blobAddress] = false;
+                       }
                }
 
-               if ( !$textId || $id !== (string)$textId ) {
-                       // XXX: change to better exceptions! That makes migration more difficult, though.
-                       throw new BlobAccessException( "Bad blob address: $blobAddress" );
+               $textIds = array_keys( $textIdToBlobAddress );
+               if ( !$textIds ) {
+                       return [ $result, $errors ];
                }
-
                // Callers doing updates will pass in READ_LATEST as usual. Since the text/blob tables
                // do not normally get rows changed around, set READ_LATEST_IMMUTABLE in those cases.
                $queryFlags |= DBAccessObjectUtils::hasFlags( $queryFlags, self::READ_LATEST )
                        ? self::READ_LATEST_IMMUTABLE
                        : 0;
-
                list( $index, $options, $fallbackIndex, $fallbackOptions ) =
                        DBAccessObjectUtils::getDBOptions( $queryFlags );
-
                // Text data is immutable; check replica DBs first.
-               $row = $this->getDBConnection( $index )->selectRow(
+               $dbConnection = $this->getDBConnection( $index );
+               $rows = $dbConnection->select(
                        'text',
-                       [ 'old_text', 'old_flags' ],
-                       [ 'old_id' => $textId ],
+                       [ 'old_id', 'old_text', 'old_flags' ],
+                       [ 'old_id' => $textIds ],
                        __METHOD__,
                        $options
                );
 
-               // Fallback to DB_MASTER in some cases if the row was not found, using the appropriate
+               // Fallback to DB_MASTER in some cases if not all the rows were found, using the appropriate
                // options, such as FOR UPDATE to avoid missing rows due to REPEATABLE-READ.
-               if ( !$row && $fallbackIndex !== null ) {
-                       $row = $this->getDBConnection( $fallbackIndex )->selectRow(
+               if ( $dbConnection->numRows( $rows ) !== count( $textIds ) && $fallbackIndex !== null ) {
+                       $fetchedTextIds = [];
+                       foreach ( $rows as $row ) {
+                               $fetchedTextIds[] = $row->old_id;
+                       }
+                       $missingTextIds = array_diff( $textIds, $fetchedTextIds );
+                       $dbConnection = $this->getDBConnection( $fallbackIndex );
+                       $rowsFromFallback = $dbConnection->select(
                                'text',
-                               [ 'old_text', 'old_flags' ],
-                               [ 'old_id' => $textId ],
+                               [ 'old_id', 'old_text', 'old_flags' ],
+                               [ 'old_id' => $missingTextIds ],
                                __METHOD__,
                                $fallbackOptions
                        );
+                       $appendIterator = new AppendIterator();
+                       $appendIterator->append( $rows );
+                       $appendIterator->append( $rowsFromFallback );
+                       $rows = $appendIterator;
                }
 
-               if ( !$row ) {
-                       wfWarn( __METHOD__ . ": No text row with ID $textId." );
-                       return false;
+               foreach ( $rows as $row ) {
+                       $blobAddress = $textIdToBlobAddress[$row->old_id];
+                       $blob = $this->expandBlob( $row->old_text, $row->old_flags, $blobAddress );
+                       if ( $blob === false ) {
+                               $errors[$blobAddress] = "Bad data in text row {$row->old_id}.";
+                       }
+                       $result[$blobAddress] = $blob;
                }
 
-               $blob = $this->expandBlob( $row->old_text, $row->old_flags, $blobAddress );
-
-               if ( $blob === false ) {
-                       wfLogWarning( __METHOD__ . ": Bad data in text row $textId." );
-                       return false;
+               // If we're still missing some of the rows, set errors for missing blobs.
+               if ( count( $result ) !== count( $blobAddresses ) ) {
+                       foreach ( $blobAddresses as $blobAddress ) {
+                               if ( !isset( $result[$blobAddress ] ) ) {
+                                       $errors[$blobAddress] = "Unable to fetch blob at $blobAddress";
+                                       $result[$blobAddress] = false;
+                               }
+                       }
                }
-
-               return $blob;
+               return [ $result, $errors ];
        }
 
        /**
index 96f196f..f621e66 100644 (file)
@@ -178,8 +178,8 @@ class Title implements LinkTarget, IDBAccessObject {
        /** @var bool Whether a page has any subpages */
        private $mHasSubpages;
 
-       /** @var bool The (string) language code of the page's language and content code. */
-       private $mPageLanguage = false;
+       /** @var array|null The (string) language code of the page's language and content code. */
+       private $mPageLanguage;
 
        /** @var string|bool|null The page language code from the database, null if not saved in
         * the database or false if not loaded, yet.
@@ -1250,6 +1250,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * @param int|int[] $namespaces,... The namespaces to check for
         * @return bool
         * @since 1.19
+        * @suppress PhanCommentParamOnEmptyParamList Cannot make variadic due to HHVM bug, T191668#5263929
         */
        public function inNamespaces( /* ... */ ) {
                $namespaces = func_get_args();
@@ -2954,7 +2955,7 @@ class Title implements LinkTarget, IDBAccessObject {
                }
 
                $dbr = wfGetDB( DB_REPLICA );
-               $conds['page_namespace'] = $this->mNamespace;
+               $conds = [ 'page_namespace' => $this->mNamespace ];
                $conds[] = 'page_title ' . $dbr->buildLike( $this->mDbkeyform . '/', $dbr->anyString() );
                $options = [];
                if ( $limit > -1 ) {
@@ -3162,7 +3163,7 @@ class Title implements LinkTarget, IDBAccessObject {
                $this->mLatestID = false;
                $this->mContentModel = false;
                $this->mEstimateRevisions = null;
-               $this->mPageLanguage = false;
+               $this->mPageLanguage = null;
                $this->mDbPageLanguage = false;
                $this->mIsBigDeletion = null;
        }
@@ -3531,7 +3532,7 @@ class Title implements LinkTarget, IDBAccessObject {
                $method = $auth ? 'moveSubpagesIfAllowed' : 'moveSubpages';
                $result = $mp->$method( $wgUser, $reason, $createRedirect, $changeTags );
 
-               if ( !$result->isOk() ) {
+               if ( !$result->isOK() ) {
                        return $result->getErrorsArray();
                }
 
index defe07e..bbaa10f 100644 (file)
@@ -39,7 +39,10 @@ use MediaWiki\Session\SessionManager;
  * @ingroup HTTP
  */
 class WebRequest {
-       protected $data, $headers = [];
+       /** @var array */
+       protected $data;
+       /** @var array */
+       protected $headers = [];
 
        /**
         * Flag to make WebRequest::getHeader return an array of values.
index 0363877..dba60f2 100644 (file)
@@ -256,7 +256,7 @@ class WikiMap {
         * Get the wiki ID of a database domain
         *
         * This is like DatabaseDomain::getId() without encoding (for legacy reasons) and
-        * without the schema if it is the generic installer default of "mediawiki"/"dbo"
+        * without the schema if it is the generic installer default of "mediawiki"
         *
         * @see $wgDBmwschema
         * @see PostgresInstaller
@@ -272,7 +272,7 @@ class WikiMap {
                // the installer default then it is probably the case that the schema is the same for
                // all wikis in the farm. Historically, any wiki farm had to make the database/prefix
                // combination unique per wiki. Ommit the schema if it does not seem wiki specific.
-               if ( !in_array( $domain->getSchema(), [ null, 'mediawiki', 'dbo' ], true ) ) {
+               if ( !in_array( $domain->getSchema(), [ null, 'mediawiki' ], true ) ) {
                        // This means a site admin may have specifically taylored the schemas.
                        // Domain IDs might use the form <DB>-<project>- or <DB>-<project>-<language>_,
                        // meaning that the schema portion must be accounted for to disambiguate wikis.
index 2f66277..9a3f75e 100644 (file)
@@ -306,9 +306,10 @@ class ApiAuthManagerHelper {
 
        /**
         * Clean up a field array for output
-        * @param ApiBase $module For context and parameters 'mergerequestfields'
-        *  and 'messageformat'
         * @param array $fields
+        * @codingStandardsIgnoreStart
+        * @phan-param array{type:string,options:array,value:string,label:Message,help:Message,optional:bool,sensitive:bool,skippable:bool} $fields
+        * @codingStandardsIgnoreEnd
         * @return array
         */
        private function formatFields( array $fields ) {
index 8b6a3e5..d8134bb 100644 (file)
@@ -274,7 +274,7 @@ abstract class ApiBase extends ContextSource {
        /** @var array Maps extension paths to info arrays */
        private static $extensionInfo = null;
 
-       /** @var int[][][] Cache for self::filterIDs() */
+       /** @var stdClass[][] Cache for self::filterIDs() */
        private static $filterIDsCache = [];
 
        /** $var array Map of web UI block messages to corresponding API messages and codes */
index 2c1564e..755f319 100644 (file)
@@ -141,6 +141,7 @@ class ApiBlock extends ApiBase {
                }
 
                list( $target, /*...*/ ) = SpecialBlock::getTargetAndType( $params['user'] );
+               $res = [];
                $res['user'] = $params['user'];
                $res['userID'] = $target instanceof User ? $target->getId() : 0;
 
index 3f63a00..fdf9cf1 100644 (file)
@@ -62,9 +62,7 @@ class ApiEditPage extends ApiBase {
 
                                /** @var Title $newTitle */
                                foreach ( $titles as $id => $newTitle ) {
-                                       if ( !isset( $titles[$id - 1] ) ) {
-                                               $titles[$id - 1] = $oldTitle;
-                                       }
+                                       $titles[ $id - 1 ] = $titles[ $id - 1 ] ?? $oldTitle;
 
                                        $redirValues[] = [
                                                'from' => $titles[$id - 1]->getPrefixedText(),
@@ -380,6 +378,7 @@ class ApiEditPage extends ApiBase {
                $status = $ep->attemptSave( $result );
                $wgRequest = $oldRequest;
 
+               $r = [];
                switch ( $status->value ) {
                        case EditPage::AS_HOOK_ERROR:
                        case EditPage::AS_HOOK_ERROR_EXPECTED:
index be53c67..c4a432c 100644 (file)
@@ -34,6 +34,7 @@ class ApiImportReporter extends ImportReporter {
         * @param int $successCount
         * @param array $pageInfo
         * @return void
+        * @suppress PhanParamSignatureMismatch
         */
        public function reportPage( $title, $foreignTitle, $revisionCount, $successCount, $pageInfo ) {
                // Add a result entry
index 641aa9f..574d83b 100644 (file)
@@ -153,6 +153,7 @@ class ApiMain extends ApiBase {
        private $mModule;
 
        private $mCacheMode = 'private';
+       /** @var array */
        private $mCacheControl = [];
        private $mParamsUsed = [];
        private $mParamsSensitive = [];
index 73e4ac2..147b3bd 100644 (file)
@@ -22,6 +22,7 @@
  * Trait to implement the IApiMessage interface for Message subclasses
  * @since 1.27
  * @ingroup API
+ * @phan-file-suppress PhanTraitParentReference
  */
 trait ApiMessageTrait {
 
index d8f48b8..74c6f8f 100644 (file)
@@ -59,9 +59,10 @@ class ApiMove extends ApiBase {
                }
                $toTalk = $toTitle->getTalkPageIfDefined();
 
+               $repoGroup = MediaWikiServices::getInstance()->getRepoGroup();
                if ( $toTitle->getNamespace() == NS_FILE
-                       && !RepoGroup::singleton()->getLocalRepo()->findFile( $toTitle )
-                       && MediaWikiServices::getInstance()->getRepoGroup()->findFile( $toTitle )
+                       && !$repoGroup->getLocalRepo()->findFile( $toTitle )
+                       && $repoGroup->findFile( $toTitle )
                ) {
                        if ( !$params['ignorewarnings'] &&
                                 $this->getPermissionManager()->userHasRight( $user, 'reupload-shared' ) ) {
@@ -207,7 +208,7 @@ class ApiMove extends ApiBase {
                $mp = new MovePage( $fromTitle, $toTitle );
                $result =
                        $mp->moveSubpagesIfAllowed( $this->getUser(), $reason, !$noredirect, $changeTags );
-               if ( !$result->isOk() ) {
+               if ( !$result->isOK() ) {
                        // This means the whole thing failed
                        return [ 'errors' => $this->getErrorFormatter()->arrayFromStatus( $result ) ];
                }
index 8e2837b..0ba4a0e 100644 (file)
@@ -96,6 +96,7 @@ class ApiOpenSearch extends ApiBase {
                        // Trim extracts, if necessary
                        $length = $this->getConfig()->get( 'OpenSearchDescriptionLength' );
                        foreach ( $results as &$r ) {
+                               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                                if ( is_string( $r['extract'] ) && !$r['extract trimmed'] ) {
                                        $r['extract'] = self::trimExtract( $r['extract'], $length );
                                }
@@ -111,6 +112,8 @@ class ApiOpenSearch extends ApiBase {
         * @param string $search the search query
         * @param array $params api request params
         * @return array search results. Keys are integers.
+        * @phan-return array<array{title:Title,extract:false,image:false,url:string}>
+        *  Note that phan annotations don't support keys containing a space.
         */
        private function search( $search, array $params ) {
                $searchEngine = $this->buildSearchEngine( $params );
@@ -247,6 +250,7 @@ class ApiOpenSearch extends ApiBase {
                                        if ( is_string( $r['extract'] ) && $r['extract'] !== '' ) {
                                                $item['Description'] = $r['extract'];
                                        }
+                                       // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
                                        if ( is_array( $r['image'] ) && isset( $r['image']['source'] ) ) {
                                                $item['Image'] = array_intersect_key( $r['image'], $imageKeys );
                                        }
index c604322..6afb018 100644 (file)
@@ -77,6 +77,7 @@ class ApiPageSet extends ApiBase {
        private $mGeneratorData = []; // [ns][dbkey] => data array
        private $mFakePageId = -1;
        private $mCacheMode = 'public';
+       /** @var array */
        private $mRequestedPageFields = [];
        /** @var int */
        private $mDefaultNamespace = NS_MAIN;
index f82a559..6c1eb0f 100644 (file)
@@ -35,7 +35,10 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
         */
        private $rootTitle;
 
-       private $params, $cont, $redirect;
+       private $params;
+       /** @var array */
+       private $cont;
+       private $redirect;
        private $bl_ns, $bl_from, $bl_from_ns, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
 
        /**
@@ -306,7 +309,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                        }
 
                        if ( is_null( $resultPageSet ) ) {
-                               $a['pageid'] = (int)$row->page_id;
+                               $a = [ 'pageid' => (int)$row->page_id ];
                                ApiQueryBase::addTitleInfo( $a, Title::makeTitle( $row->page_namespace, $row->page_title ) );
                                if ( $row->page_is_redirect ) {
                                        $a['redirect'] = true;
@@ -323,6 +326,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        /**
         * @param ApiPageSet $resultPageSet
         * @return void
+        * @suppress PhanTypeInvalidDimOffset
         */
        private function run( $resultPageSet = null ) {
                $this->params = $this->extractRequestParams( false );
index 547a4e8..79347e6 100644 (file)
@@ -127,6 +127,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                'cl_to' . $sort
                        ] );
                }
+               $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
                $res = $this->select( __METHOD__ );
 
index 1af4d95..eb787d1 100644 (file)
@@ -368,7 +368,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
                                $pageID = $newPageID++;
                                $pageMap[$row->ar_namespace][$row->ar_title] = $pageID;
-                               $a['revisions'] = [ $rev ];
+                               $a = [ 'revisions' => [ $rev ] ];
                                ApiResult::setIndexedTagName( $a['revisions'], 'rev' );
                                $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
                                ApiQueryBase::addTitleInfo( $a, $title );
index ac7e5cc..98474c7 100644 (file)
@@ -118,6 +118,7 @@ class ApiQueryInfo extends ApiQueryBase {
                return $this->tokenFunctions;
        }
 
+       /** @var string[] */
        protected static $cachedTokens = [];
 
        /**
index ab8d93a..12d7435 100644 (file)
@@ -34,7 +34,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
        const WL_UNREAD_LIMIT = 1000;
 
+       /** @var array */
        private $params = [];
+       /** @var array */
        private $prop = [];
 
        public function __construct( ApiQuery $query, $moduleName ) {
index 8e26d37..ce51a67 100644 (file)
@@ -332,8 +332,8 @@ class ApiQueryUsers extends ApiQueryBase {
                                }
                        }
 
-                       $fit = $result->addValue( [ 'query', $this->getModuleName() ],
-                               null, $data[$u] );
+                       // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
+                       $fit = $result->addValue( [ 'query', $this->getModuleName() ], null, $data[$u] );
                        if ( !$fit ) {
                                if ( $useNames ) {
                                        $this->setContinueEnumParameter( 'users',
index c3cf5f1..478b0bc 100644 (file)
@@ -131,9 +131,6 @@ class ApiStashEdit extends ApiBase {
                        return;
                }
 
-               // The user will abort the AJAX request by pressing "save", so ignore that
-               ignore_user_abort( true );
-
                if ( $user->pingLimiter( 'stashedit' ) ) {
                        $status = 'ratelimited';
                } else {
index 0718ac8..15c2564 100644 (file)
@@ -86,11 +86,13 @@ class ApiUnblock extends ApiBase {
                        $this->dieStatus( $this->errorArrayToStatus( $retval ) );
                }
 
-               $res['id'] = $block->getId();
                $target = $block->getType() == DatabaseBlock::TYPE_AUTO ? '' : $block->getTarget();
-               $res['user'] = $target instanceof User ? $target->getName() : $target;
-               $res['userid'] = $target instanceof User ? $target->getId() : 0;
-               $res['reason'] = $params['reason'];
+               $res = [
+                       'id' => $block->getId(),
+                       'user' => $target instanceof User ? $target->getName() : $target,
+                       'userid' => $target instanceof User ? $target->getId() : 0,
+                       'reason' => $params['reason']
+               ];
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
        }
 
index ba9be81..9ef17e6 100644 (file)
@@ -84,10 +84,12 @@ class ApiUndelete extends ApiBase {
 
                $this->setWatch( $params['watchlist'], $titleObj );
 
-               $info['title'] = $titleObj->getPrefixedText();
-               $info['revisions'] = (int)$retval[0];
-               $info['fileversions'] = (int)$retval[1];
-               $info['reason'] = $retval[2];
+               $info = [
+                       'title' => $titleObj->getPrefixedText(),
+                       'revisions' => (int)$retval[0],
+                       'fileversions' => (int)$retval[1],
+                       'reason' => $retval[2]
+               ];
                $this->getResult()->addValue( null, $this->getModuleName(), $info );
        }
 
index b15b998..3a54772 100644 (file)
@@ -793,6 +793,7 @@ class ApiUpload extends ApiBase {
                        }
                }
 
+               $result = [];
                // No errors, no warnings: do the upload
                if ( $this->mParams['async'] ) {
                        $progress = UploadBase::getSessionStatus( $this->getUser(), $this->mParams['filekey'] );
index 89ec6cb..3aaae70 100644 (file)
@@ -112,6 +112,7 @@ class ApiUserrights extends ApiBase {
 
                $form = $this->getUserRightsPage();
                $form->setContext( $this->getContext() );
+               $r = [];
                $r['user'] = $user->getName();
                $r['userid'] = $user->getId();
                list( $r['added'], $r['removed'] ) = $form->doSaveUserGroups(
index 943149d..c36759a 100644 (file)
@@ -33,6 +33,7 @@ class ApiValidatePassword extends ApiBase {
                        $user = $this->getUser();
                }
 
+               $r = [];
                $validity = $user->checkPasswordValidity( $params['password'] );
                $r['validity'] = $validity->isGood() ? 'Good' : ( $validity->isOK() ? 'Change' : 'Invalid' );
                $messages = array_merge(
index 02abb1e..6f46c56 100644 (file)
@@ -99,6 +99,7 @@ trait SearchApi {
         *
         * @return array array containing available additional api param definitions.
         *  Empty if profiles are not supported by the searchEngine implementation.
+        * @suppress PhanTypeMismatchDimFetch
         */
        private function buildProfileApiParam() {
                $configs = $this->getSearchProfileParams();
@@ -119,6 +120,7 @@ trait SearchApi {
                                if ( isset( $profile['desc-message'] ) ) {
                                        $helpMessages[$profile['name']] = $profile['desc-message'];
                                }
+
                                if ( !empty( $profile['default'] ) ) {
                                        $defaultProfile = $profile['name'];
                                }
index 2845340..59553e9 100644 (file)
@@ -48,6 +48,8 @@
        "apihelp-compare-param-totitle": "Втор наслов за споредба.",
        "apihelp-compare-param-toid": "Втора назнака на страница за споредба.",
        "apihelp-compare-param-torev": "Бтора преработка за споредба.",
+       "apihelp-compare-param-topst": "Направи преобразување пред зачувување на <var>totext</var>.",
+       "apihelp-compare-paramvalue-prop-diff": "HTML на разликата.",
        "apihelp-compare-example-1": "Дај разлика помеѓу преработките 1 и 2",
        "apihelp-createaccount-summary": "Создај нова корисничка сметка.",
        "apihelp-delete-summary": "Избриши страница.",
        "apihelp-query+watchlistraw-param-dir": "Насока на исписот.",
        "apihelp-revisiondelete-param-suppress": "Дали се притајуваат податоци од администраторите на ист начин како и за останатите.",
        "apihelp-revisiondelete-param-tags": "Ознаки за примена врз ставката во дневникот на бришења.",
+       "apihelp-rollback-param-title": "Наслов на страницата што сакате да ја отповикате. Не може да се користи заедно со <var>$1pageid</var>.",
+       "apihelp-rollback-param-pageid": "Назнака на страницата што сакате да ја отповикате. Не може да се користи заедно со <var>$1title</var>.",
+       "apihelp-setpagelanguage-param-reason": "Причина за промената.",
        "apihelp-stashedit-param-section": "Број на поднасловот. <kbd>0</kbd> за првиот, <kbd>new</kbd> за нов.",
        "apihelp-stashedit-param-sectiontitle": "Назив за нов поднаслов.",
        "apihelp-stashedit-param-text": "Содржина на страницата.",
        "apihelp-stashedit-param-contentmodel": "Содржински модел на новата содржина.",
        "apihelp-stashedit-param-contentformat": "Форматот за серијализација на содржината што се користи во вносниот текст.",
+       "apihelp-stashedit-param-summary": "Опис на промената.",
+       "apihelp-tag-summary": "Додавање или отстранување ознаки за промени од поединечни преработки или дневнички записи.",
        "apihelp-tag-param-reason": "Причина за промената.",
        "apihelp-unblock-summary": "Одблокирај корисник.",
        "apihelp-unblock-param-user": "Корисничко име, IP-адреса или IP-опсег за одблокирање. Не може да се користи заедно со <var>$1id</var> или <var>$1userid</var>.",
        "api-help-right-apihighlimits": "Употреба на повисоки ограничувања за приложни барања (бавни барања: $1; брзи барања: $2). Ограничувањата за бавни барања важат и за повеќевредносни параметри.",
        "apierror-badgenerator-unknown": "Непознат <kbd>generator=$1</kbd>.",
        "apierror-badquery": "Неважечко барање.",
+       "apierror-cannotviewtitle": "Не ви е дозволено да ја прегледате $1.",
+       "apierror-cantblock": "Немате дозвола за блокирање корисници.",
+       "apierror-cantchangecontentmodel": "Немате дозвола за менување содржинскиот модел на страница.",
+       "apierror-cantimport-upload": "Немате дозвола да увезувате подигнати страници.",
+       "apierror-cantimport": "Немате дозвола за увезуваање страници.",
        "apierror-copyuploadbaddomain": "Подигањето преку URL не е дозволено од овој домен.",
        "apierror-copyuploadbadurl": "Подигањето не е дозволено од оваа URL-адреса.",
        "apierror-emptynewsection": "Создавањето на нови празни поднаслови не е дозволено.",
index 0ad7687..6e2c1f1 100644 (file)
        "apiwarn-deprecation-missingparam": "Foi usado um formato antigo para a saída, porque <var>$1</var> não foi especificado. Este formato foi descontinuado e de futuro será sempre usado o formato novo.",
        "apiwarn-deprecation-parameter": "O parâmetro <var>$1</var> é obsoleto.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está depreciado desde o MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> quando for criar novos documentos HTML, ou <kbd>prop=modules|jsconfigvars</kbd> quando for atualizar um documento no lado do cliente.",
+       "apiwarn-deprecation-post-without-content-type": "Um pedido POST foi feito sem um cabeçalho <code>Content-Type</code>. Isto não funciona de forma fiável.",
        "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> via GET está obsoleto. Use o POST em vez disso.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> está obsoleto. Por favor, use <kbd>$2</kbd> em vez.",
        "apiwarn-difftohidden": "Não foi possível diferenciar r$1: o conteúdo está oculto.",
index 6c30749..8e31b51 100644 (file)
        "apiwarn-deprecation-missingparam": "Foi usado um formato antigo para a saída, porque <var>$1</var> não foi especificado. Este formato foi descontinuado e de futuro será sempre usado o formato novo.",
        "apiwarn-deprecation-parameter": "O parâmetro <var>$1</var> foi descontinuado.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> está obsoleto desde o MediaWiki 1.28. Use <kbd>prop=headhtml</kbd> ao criar novos documentos de HTML, ou <kbd>prop=modules|jsconfigvars</kbd> ao atualizar um documento no lado do cliente.",
+       "apiwarn-deprecation-post-without-content-type": "Um pedido POST foi feito sem um cabeçalho <code>Content-Type</code>. Isto não funciona de forma fiável.",
        "apiwarn-deprecation-purge-get": "O uso de <kbd>action=purge</kbd> através de um GET foi descontinuado. Em substituição, use um POST.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> foi descontinuado. Em substituição, use <kbd>$2</kbd>, por favor.",
        "apiwarn-difftohidden": "Não foi possível criar uma lista das diferenças em relação à r$1: o conteúdo está ocultado.",
index 4200341..1a2442c 100644 (file)
@@ -122,6 +122,7 @@ abstract class AuthenticationRequest {
         * a 'password' field).
         *
         * @return array As above
+        * @phan-return array<string,array{type:string,options?:array,value?:string,label:Message,help:Message,optional?:bool,sensitive?:bool,skippable?:bool}>
         */
        abstract public function getFieldInfo();
 
@@ -297,6 +298,7 @@ abstract class AuthenticationRequest {
         * @param AuthenticationRequest[] $reqs
         * @return array
         * @throws \UnexpectedValueException If fields cannot be merged
+        * @suppress PhanTypeInvalidDimOffset
         */
        public static function mergeFieldInfo( array $reqs ) {
                $merged = [];
@@ -337,12 +339,13 @@ abstract class AuthenticationRequest {
                                }
 
                                $options['sensitive'] = !empty( $options['sensitive'] );
+                               $type = $options['type'];
 
                                if ( !array_key_exists( $name, $merged ) ) {
                                        $merged[$name] = $options;
-                               } elseif ( $merged[$name]['type'] !== $options['type'] ) {
+                               } elseif ( $merged[$name]['type'] !== $type ) {
                                        throw new \UnexpectedValueException( "Field type conflict for \"$name\", " .
-                                               "\"{$merged[$name]['type']}\" vs \"{$options['type']}\""
+                                               "\"{$merged[$name]['type']}\" vs \"$type\""
                                        );
                                } else {
                                        if ( isset( $options['options'] ) ) {
index 9d0175a..7128fe2 100644 (file)
@@ -40,7 +40,7 @@ class Throttler implements LoggerAwareInterface {
        /**
         * See documentation of $wgPasswordAttemptThrottle for format. Old (pre-1.27) format is not
         * allowed here.
-        * @var array
+        * @var array[]
         * @see https://www.mediawiki.org/wiki/Manual:$wgPasswordAttemptThrottle
         */
        protected $conditions;
@@ -179,7 +179,7 @@ class Throttler implements LoggerAwareInterface {
        /**
         * Handles B/C for $wgPasswordAttemptThrottle.
         * @param array $throttleConditions
-        * @return array
+        * @return array[]
         * @see $wgPasswordAttemptThrottle for structure
         */
        protected static function normalizeThrottleConditions( $throttleConditions ) {
index 4d4bb07..fa91909 100644 (file)
@@ -250,8 +250,9 @@ abstract class AbstractBlock {
         * may be overridden according to global configs.
         *
         * @since 1.33
-        * @param string $right Right to check
-        * @return bool|null null if unrecognized right or unset property
+        * @param string $right
+        * @return bool|null The block applies to the right, or null if
+        *  unsure (e.g. unrecognized right or unset property)
         */
        public function appliesToRight( $right ) {
                $config = RequestContext::getMain()->getConfig();
index 3f3e2d3..6f49f17 100644 (file)
@@ -164,9 +164,28 @@ class CompositeBlock extends AbstractBlock {
 
        /**
         * @inheritDoc
+        *
+        * Determines whether the CompositeBlock applies to a right by checking
+        * whether the original blocks apply to that right. Each block can report
+        * true (applies), false (does not apply) or null (unsure). Then:
+        * - If any original blocks apply, this block applies
+        * - If no original blocks apply but any are unsure, this block is unsure
+        * - If all blocks do not apply, this block does not apply
         */
        public function appliesToRight( $right ) {
-               return $this->methodReturnsValue( __FUNCTION__, true, $right );
+               $isUnsure = false;
+
+               foreach ( $this->originalBlocks as $block ) {
+                       $appliesToRight = $block->appliesToRight( $right );
+
+                       if ( $appliesToRight ) {
+                               return true;
+                       } elseif ( $appliesToRight === null ) {
+                               $isUnsure = true;
+                       }
+               }
+
+               return $isUnsure ? null : false;
        }
 
        /**
index c2fb52a..2696302 100644 (file)
@@ -135,7 +135,7 @@ class BacklinkCache {
                $this->partitionCache = [];
                $this->fullResultCache = [];
                $this->wanCache->touchCheckKey( $this->makeCheckKey() );
-               unset( $this->db );
+               $this->db = null;
        }
 
        /**
@@ -153,7 +153,7 @@ class BacklinkCache {
         * @return IDatabase
         */
        protected function getDB() {
-               if ( !isset( $this->db ) ) {
+               if ( $this->db === null ) {
                        $this->db = wfGetDB( DB_REPLICA );
                }
 
index d798ddb..d1261a8 100644 (file)
@@ -82,9 +82,9 @@ class CacheHelper implements ICacheHelper {
         * Function that gets called when initialization is done.
         *
         * @since 1.20
-        * @var callable
+        * @var callable|null
         */
-       protected $onInitHandler = false;
+       protected $onInitHandler;
 
        /**
         * Elements to build a cache key with.
@@ -183,7 +183,7 @@ class CacheHelper implements ICacheHelper {
                        $this->hasCached = is_array( $cachedChunks );
                        $this->cachedChunks = $this->hasCached ? $cachedChunks : [];
 
-                       if ( $this->onInitHandler !== false ) {
+                       if ( $this->onInitHandler !== null ) {
                                call_user_func( $this->onInitHandler, $this->hasCached );
                        }
                }
index 3a6d892..848d9c9 100644 (file)
@@ -1191,6 +1191,7 @@ class MessageCache {
                        $class = $wgParserConf['class'];
                        if ( $class == ParserDiffTest::class ) {
                                # Uncloneable
+                               // @phan-suppress-next-line PhanTypeMismatchProperty
                                $this->mParser = new $class( $wgParserConf );
                        } else {
                                $this->mParser = clone $parser;
index aad9439..fd9af39 100644 (file)
@@ -33,7 +33,7 @@ use Cdb\Writer;
  */
 class LCStoreCDB implements LCStore {
 
-       /** @var Reader[] */
+       /** @var Reader[]|false[] */
        private $readers;
 
        /** @var Writer */
index ffc7cd0..2646845 100644 (file)
@@ -731,6 +731,7 @@ class LocalisationCache {
                                if ( in_array( $key, self::$mergeableMapKeys ) ) {
                                        $value = $value + $fallbackValue;
                                } elseif ( in_array( $key, self::$mergeableListKeys ) ) {
+                                       // @phan-suppress-next-line PhanTypeMismatchArgumentInternal
                                        $value = array_unique( array_merge( $fallbackValue, $value ) );
                                } elseif ( in_array( $key, self::$mergeableAliasListKeys ) ) {
                                        $value = array_merge_recursive( $value, $fallbackValue );
@@ -826,7 +827,7 @@ class LocalisationCache {
                if ( !$code ) {
                        throw new MWException( "Invalid language code requested" );
                }
-               $this->recachedLangs[$code] = true;
+               $this->recachedLangs[ $code ] = true;
 
                # Initial values
                $initialData = array_fill_keys( self::$allKeys, null );
@@ -835,16 +836,11 @@ class LocalisationCache {
 
                # Load the primary localisation from the source file
                $data = $this->readSourceFilesAndRegisterDeps( $code, $deps );
-               if ( $data === false ) {
-                       $this->logger->debug( __METHOD__ . ": no localisation file for $code, using fallback to en" );
-                       $coreData['fallback'] = 'en';
-               } else {
-                       $this->logger->debug( __METHOD__ . ": got localisation for $code from source" );
+               $this->logger->debug( __METHOD__ . ": got localisation for $code from source" );
 
-                       # Merge primary localisation
-                       foreach ( $data as $key => $value ) {
-                               $this->mergeItem( $key, $coreData[$key], $value );
-                       }
+               # Merge primary localisation
+               foreach ( $data as $key => $value ) {
+                       $this->mergeItem( $key, $coreData[ $key ], $value );
                }
 
                # Fill in the fallback if it's not there already
@@ -932,16 +928,14 @@ class LocalisationCache {
                                # Load the secondary localisation from the source file to
                                # avoid infinite cycles on cyclic fallbacks
                                $fbData = $this->readSourceFilesAndRegisterDeps( $csCode, $deps );
-                               if ( $fbData !== false ) {
-                                       # Only merge the keys that make sense to merge
-                                       foreach ( self::$allKeys as $key ) {
-                                               if ( !isset( $fbData[$key] ) ) {
-                                                       continue;
-                                               }
-
-                                               if ( is_null( $coreData[$key] ) || $this->isMergeableKey( $key ) ) {
-                                                       $this->mergeItem( $key, $csData[$key], $fbData[$key] );
-                                               }
+                               # Only merge the keys that make sense to merge
+                               foreach ( self::$allKeys as $key ) {
+                                       if ( !isset( $fbData[ $key ] ) ) {
+                                               continue;
+                                       }
+
+                                       if ( is_null( $coreData[ $key ] ) || $this->isMergeableKey( $key ) ) {
+                                               $this->mergeItem( $key, $csData[ $key ], $fbData[ $key ] );
                                        }
                                }
                        }
index 62cf39e..e461762 100644 (file)
@@ -265,7 +265,7 @@ class EnhancedChangesList extends ChangesList {
                                $block[0], $block[0]->unpatrolled, $block[0]->watched );
                }
 
-               $queryParams['curid'] = $curId;
+               $queryParams = [ 'curid' => $curId ];
 
                # Sub-entries
                $lines = [];
@@ -632,7 +632,7 @@ class EnhancedChangesList extends ChangesList {
        protected function recentChangesBlockLine( $rcObj ) {
                $data = [];
 
-               $query['curid'] = $rcObj->mAttribs['rc_cur_id'];
+               $query = [ 'curid' => $rcObj->mAttribs['rc_cur_id'] ];
 
                $type = $rcObj->mAttribs['rc_type'];
                $logType = $rcObj->mAttribs['rc_log_type'];
index 0c6a3d1..1d590d9 100644 (file)
@@ -90,16 +90,17 @@ class RecentChange implements Taggable {
         */
        const SEND_FEED = false;
 
+       /** @var array */
        public $mAttribs = [];
        public $mExtra = [];
 
        /**
-        * @var Title
+        * @var Title|false
         */
        public $mTitle = false;
 
        /**
-        * @var User
+        * @var User|false
         */
        private $mPerformer = false;
 
index 30c2f7a..9ee000d 100644 (file)
@@ -1001,7 +1001,7 @@ class ChangeTags {
                }
                $logEntry->setParameters( $params );
                $logEntry->setRelations( [ 'Tag' => $tag ] );
-               $logEntry->setTags( $logEntryTags );
+               $logEntry->addTags( $logEntryTags );
 
                $logId = $logEntry->insert( $dbw );
                $logEntry->publish( $logId );
index ea5ab78..f1df087 100644 (file)
@@ -280,8 +280,10 @@ abstract class ContentHandler {
                        }
 
                        if ( !( $handler instanceof ContentHandler ) ) {
-                               throw new MWException( "$classOrCallback from \$wgContentHandlers is not " .
-                                       "compatible with ContentHandler" );
+                               throw new MWException(
+                                       var_export( $classOrCallback, true ) . " from \$wgContentHandlers is not " .
+                                       "compatible with ContentHandler"
+                               );
                        }
                }
 
@@ -1258,6 +1260,7 @@ abstract class ContentHandler {
         * @since 1.28
         */
        public function getFieldsForSearchIndex( SearchEngine $engine ) {
+               $fields = [];
                $fields['category'] = $engine->makeSearchFieldMapping(
                        'category',
                        SearchIndexField::INDEX_TYPE_TEXT
index 6a1cc62..f3f9a97 100644 (file)
@@ -11,6 +11,7 @@ use MediaWiki\MediaWikiServices;
 class FileContentHandler extends WikitextContentHandler {
 
        public function getFieldsForSearchIndex( SearchEngine $engine ) {
+               $fields = [];
                $fields['file_media_type'] =
                        $engine->makeSearchFieldMapping( 'file_media_type', SearchIndexField::INDEX_TYPE_KEYWORD );
                $fields['file_media_type']->setFlag( SearchIndexField::FLAG_CASEFOLD );
index 6182538..a21f404 100644 (file)
@@ -163,6 +163,7 @@ abstract class ContextSource implements IContextSource {
         * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
         *   or a MessageSpecifier.
         * @param mixed $args,...
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return Message
         */
        public function msg( $key /* $args */ ) {
index d32617e..e4340ce 100644 (file)
@@ -257,6 +257,7 @@ class DerivativeContext extends ContextSource implements MutableContext {
         * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
         *   or a MessageSpecifier.
         * @param mixed $args,... Arguments to wfMessage
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return Message
         */
        public function msg( $key ) {
index 6eeac1c..e6a856c 100644 (file)
@@ -411,6 +411,7 @@ class RequestContext implements IContextSource, MutableContext {
         * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
         *   or a MessageSpecifier.
         * @param mixed $args,...
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return Message
         */
        public function msg( $key ) {
index 70a963b..188135f 100644 (file)
@@ -34,6 +34,7 @@ class ArrayDiffFormatter extends DiffFormatter {
         * @param Diff $diff A Diff object.
         *
         * @return array[] List of associative arrays, each describing a difference.
+        * @suppress PhanParamSignatureMismatch
         */
        public function format( $diff ) {
                $oldline = 1;
index ce507d7..6ebec1c 100644 (file)
@@ -47,7 +47,9 @@ use MediaWiki\Diff\ComplexityException;
 class DiffEngine {
 
        // Input variables
+       /** @var string[] */
        private $from;
+       /** @var string[] */
        private $to;
        private $m;
        private $n;
@@ -361,6 +363,7 @@ class DiffEngine {
                         */
                        $max = min( $this->m, $this->n );
                        for ( $forwardBound = 0; $forwardBound < $max
+                               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                                && $this->from[$forwardBound] === $this->to[$forwardBound];
                                ++$forwardBound
                        ) {
index 2a1f3e1..df2792f 100644 (file)
@@ -42,12 +42,12 @@ abstract class DiffOp {
        public $type;
 
        /**
-        * @var string[]
+        * @var string[]|false
         */
        public $orig;
 
        /**
-        * @var string[]
+        * @var string[]|false
         */
        public $closing;
 
index c16d9f7..29227c8 100644 (file)
@@ -79,7 +79,7 @@ class MWException extends Exception {
                $res = false;
                if ( $this->useMessageCache() ) {
                        try {
-                               $res = wfMessage( $key, $params )->text();
+                               $res = wfMessage( $key, ...$params )->text();
                        } catch ( Exception $e ) {
                        }
                }
index c52a867..5515ef0 100644 (file)
@@ -199,7 +199,7 @@ class MWExceptionRenderer {
 
                // FIXME: Keep logic in sync with MWException::msg.
                try {
-                       $res = wfMessage( $key, $params )->text();
+                       $res = wfMessage( $key, ...$params )->text();
                } catch ( Exception $e ) {
                        $res = wfMsgReplaceArgs( $fallback, $params );
                        // If an exception happens inside message rendering,
index 0b8afa2..f99746e 100644 (file)
@@ -35,7 +35,7 @@ class DumpNamespaceFilter extends DumpFilter {
 
        /**
         * @param DumpOutput &$sink
-        * @param array $param
+        * @param string $param
         * @throws MWException
         */
        function __construct( &$sink, $param ) {
@@ -61,7 +61,7 @@ class DumpNamespaceFilter extends DumpFilter {
                        "NS_CATEGORY"       => NS_CATEGORY,
                        "NS_CATEGORY_TALK"  => NS_CATEGORY_TALK ];
 
-               if ( $param { 0 } == '!' ) {
+               if ( $param[0] == '!' ) {
                        $this->invert = true;
                        $param = substr( $param, 1 );
                }
index a353c44..0521c5a 100644 (file)
@@ -32,6 +32,7 @@ use MediaWiki\Shell\Shell;
  */
 class DumpPipeOutput extends DumpFileOutput {
        protected $command, $filename;
+       /** @var resource|bool */
        protected $procOpenResource = false;
 
        /**
index 314c4c3..655fd0d 100644 (file)
@@ -176,10 +176,10 @@ class ForeignAPIRepo extends FileRepo {
 
        /**
         * @param string $virtualUrl
-        * @return false
+        * @return array
         */
        function getFileProps( $virtualUrl ) {
-               return false;
+               return [];
        }
 
        /**
index bb65b0a..5ed937f 100644 (file)
@@ -209,20 +209,16 @@ class LocalRepo extends FileRepo {
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
-                               if ( $title instanceof Title ) {
-                                       $row = $dbr->selectRow(
-                                               [ 'page', 'redirect' ],
-                                               [ 'rd_namespace', 'rd_title' ],
-                                               [
-                                                       'page_namespace' => $title->getNamespace(),
-                                                       'page_title' => $title->getDBkey(),
-                                                       'rd_from = page_id'
-                                               ],
-                                               $method
-                                       );
-                               } else {
-                                       $row = false;
-                               }
+                               $row = $dbr->selectRow(
+                                       [ 'page', 'redirect' ],
+                                       [ 'rd_namespace', 'rd_title' ],
+                                       [
+                                               'page_namespace' => $title->getNamespace(),
+                                               'page_title' => $title->getDBkey(),
+                                               'rd_from = page_id'
+                                       ],
+                                       $method
+                               );
 
                                return ( $row && $row->rd_namespace == NS_FILE )
                                        ? Title::makeTitle( $row->rd_namespace, $row->rd_title )->getDBkey()
index e474ad3..96df29f 100644 (file)
@@ -115,6 +115,8 @@ class RepoGroup {
         *                   user is allowed to view them. Otherwise, such files will not
         *                   be found.
         *   latest:         If true, load from the latest available data into File objects
+        * @phan-param array{time?:mixed,ignoreRedirect?:bool,private?:bool,latest?:bool} $options
+        * @suppress PhanTypeInvalidDimOffset
         * @return File|bool False if title is not found
         */
        function findFile( $title, $options = [] ) {
index 5f6a0cb..d14e0de 100644 (file)
@@ -305,7 +305,7 @@ abstract class File implements IDBAccessObject {
         * @return string
         */
        public function getName() {
-               if ( !isset( $this->name ) ) {
+               if ( $this->name === null ) {
                        $this->assertRepoDefined();
                        $this->name = $this->repo->getNameFromTitle( $this->title );
                }
@@ -1521,7 +1521,7 @@ abstract class File implements IDBAccessObject {
         * @return string
         */
        function getHashPath() {
-               if ( !isset( $this->hashPath ) ) {
+               if ( $this->hashPath === null ) {
                        $this->assertRepoDefined();
                        $this->hashPath = $this->repo->getHashPath( $this->getName() );
                }
index ab8ef2f..99ead16 100644 (file)
@@ -75,6 +75,7 @@ class ForeignAPIFile extends File {
                                ? count( $data['query']['redirects'] ) - 1
                                : -1;
                        if ( $lastRedirect >= 0 ) {
+                               // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
                                $newtitle = Title::newFromText( $data['query']['redirects'][$lastRedirect]['to'] );
                                $img = new self( $newtitle, $repo, $info, true );
                                $img->redirectedFrom( $title->getDBkey() );
index 6143c31..0ef6034 100644 (file)
@@ -344,6 +344,7 @@ class LocalFile extends File {
                                $this->loadFromDB( self::READ_NORMAL );
 
                                $fields = $this->getCacheFields( '' );
+                               $cacheVal = [];
                                $cacheVal['fileExists'] = $this->fileExists;
                                if ( $this->fileExists ) {
                                        foreach ( $fields as $field ) {
@@ -1079,6 +1080,7 @@ class LocalFile extends File {
        /**
         * Delete cached transformed files for the current version only.
         * @param array $options
+        * @phan-param array{forThumbRefresh?:bool} $options
         */
        public function purgeThumbnails( $options = [] ) {
                $files = $this->getThumbnails();
@@ -1090,6 +1092,7 @@ class LocalFile extends File {
                array_shift( $urls ); // don't purge directory
 
                // Give media handler a chance to filter the file purge list
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                if ( !empty( $options['forThumbRefresh'] ) ) {
                        $handler = $this->getHandler();
                        if ( $handler ) {
@@ -1758,7 +1761,7 @@ class LocalFile extends File {
 
                                        # Add change tags, if any
                                        if ( $tags ) {
-                                               $logEntry->setTags( $tags );
+                                               $logEntry->addTags( $tags );
                                        }
 
                                        # Uploads can be patrolled
@@ -1946,8 +1949,8 @@ class LocalFile extends File {
                        // Now switch the object
                        $this->title = $target;
                        // Force regeneration of the name and hashpath
-                       unset( $this->name );
-                       unset( $this->hashPath );
+                       $this->name = null;
+                       $this->hashPath = null;
                }
 
                return $status;
index 2865ce5..4292ea0 100644 (file)
@@ -43,7 +43,7 @@ class UnregisteredLocalFile extends File {
        /** @var bool|string */
        protected $mime;
 
-       /** @var array Dimension data */
+       /** @var array[]|bool[] Dimension data */
        protected $dims;
 
        /** @var bool|string Handler-specific metadata which will be saved in the img_metadata field */
@@ -108,7 +108,7 @@ class UnregisteredLocalFile extends File {
 
        /**
         * @param int $page
-        * @return bool
+        * @return array|bool
         */
        private function cachePageDimensions( $page = 1 ) {
                $page = (int)$page;
index 991ef79..c6d8ddf 100644 (file)
@@ -75,7 +75,7 @@ abstract class ImageGalleryBase extends ContextSource {
        protected $mHideBadImages;
 
        /**
-        * @var Parser Registered parser object for output callbacks
+        * @var Parser|false Registered parser object for output callbacks
         */
        public $mParser;
 
@@ -88,8 +88,8 @@ abstract class ImageGalleryBase extends ContextSource {
        /** @var array */
        protected $mAttribs = [];
 
-       /** @var bool */
-       private static $modeMapping = false;
+       /** @var array */
+       private static $modeMapping;
 
        /**
         * Get a new image gallery. This is the method other callers
@@ -121,7 +121,7 @@ abstract class ImageGalleryBase extends ContextSource {
        }
 
        private static function loadModes() {
-               if ( self::$modeMapping === false ) {
+               if ( self::$modeMapping === null ) {
                        self::$modeMapping = [
                                'traditional' => TraditionalImageGallery::class,
                                'nolines' => NolinesImageGallery::class,
index 7824872..6e760fa 100644 (file)
  * Improves compression ratio by concatenating like objects before gzipping
  */
 class ConcatenatedGzipHistoryBlob implements HistoryBlob {
-       public $mVersion = 0, $mCompressed = false, $mItems = [], $mDefaultHash = '';
+       public $mVersion = 0;
+       public $mCompressed = false;
+       /**
+        * @var array|string
+        * @fixme Why are some methods treating it as an array, and others as a string, unconditionally?
+        */
+       public $mItems = [];
+       public $mDefaultHash = '';
        public $mSize = 0;
        public $mMaxSize = 10000000;
        public $mMaxCount = 100;
index 8d92fe5..5173916 100644 (file)
@@ -155,14 +155,13 @@ class DiffHistoryBlob implements HistoryBlob {
                                        $seqName = 'main';
                                }
                        }
-                       $seq =& $sequences[$seqName];
-                       $tail = $seq['tail'];
+
+                       $tail = $sequences[$seqName]['tail'];
                        $diff = $this->diff( $tail, $text );
-                       $seq['diffs'][] = $diff;
-                       $seq['map'][] = $i;
-                       $seq['tail'] = $text;
+                       $sequences[$seqName]['diffs'][] = $diff;
+                       $sequences[$seqName]['map'][] = $i;
+                       $sequences[$seqName]['tail'] = $text;
                }
-               unset( $seq ); // unlink dangerous alias
 
                // Knit the sequences together
                $tail = '';
@@ -333,7 +332,7 @@ class DiffHistoryBlob implements HistoryBlob {
                // addItem() doesn't work if mItems is partially filled from mDiffs
                $this->mFrozen = true;
                $info = unserialize( gzinflate( $this->mCompressed ) );
-               unset( $this->mCompressed );
+               $this->mCompressed = null;
 
                if ( !$info ) {
                        // Empty object
index ed151e6..04be6c4 100644 (file)
@@ -242,6 +242,10 @@ class HTMLForm extends ContextSource {
 
        protected $mUseMultipart = false;
        protected $mHiddenFields = [];
+       /**
+        * @var array[]
+        * @phan-var array<array{name:string,value:string,label-message?:string,label?:string,label-raw?:string,id?:string,attribs?:array,flags?:string|string[],framed?:bool}>
+        */
        protected $mButtons = [];
 
        protected $mWrapperLegend = false;
@@ -294,6 +298,7 @@ class HTMLForm extends ContextSource {
         *
         * @param string $displayFormat
         * @param mixed $arguments,... Additional arguments to pass to the constructor.
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return HTMLForm
         */
        public static function factory( $displayFormat/*, $arguments...*/ ) {
@@ -982,6 +987,9 @@ class HTMLForm extends ContextSource {
         *  - attribs: (array, optional) Additional HTML attributes.
         *  - flags: (string|string[], optional) OOUI flags.
         *  - framed: (boolean=true, optional) OOUI framed attribute.
+        * @codingStandardsIgnoreStart
+        * @phan-param array{name:string,value:string,label-message?:string,label?:string,label-raw?:string,id?:string,attribs?:array,flags?:string|string[],framed?:bool} $data
+        * @codingStandardsIgnoreEnd
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        public function addButton( $data ) {
index 590b9e7..91c6e6a 100644 (file)
@@ -5,6 +5,7 @@
  * be a subclass of this.
  */
 abstract class HTMLFormField {
+       /** @var array|array[] */
        public $mParams;
 
        protected $mValidationCallback;
index 63e77ce..41c0b3c 100644 (file)
@@ -29,6 +29,8 @@
  * The old name of autocomplete-data[-messages] was autocomplete[-messages] which is still
  * recognized but deprecated since MediaWiki 1.29 since it conflicts with how autocomplete is
  * used in HTMLTextField.
+ *
+ * @phan-file-suppress PhanTypeMismatchProperty This is doing weird things with mClass
  */
 class HTMLAutoCompleteSelectField extends HTMLTextField {
        protected $autocompleteData = [];
@@ -166,6 +168,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
 
                        $ret = $select->getHTML() . "<br />\n";
 
+                       // @phan-suppress-next-line PhanTypeMismatchDimEmpty
                        $this->mClass[] = 'mw-htmlform-hide-if';
                }
 
@@ -178,6 +181,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
                        }
                }
 
+               // @phan-suppress-next-line PhanTypeMismatchDimEmpty
                $this->mClass[] = 'mw-htmlform-autocomplete';
                $ret .= parent::getInputHTML( $valInSelect ? '' : $value );
                $this->mClass = $oldClass;
index 8e51858..595b71e 100644 (file)
@@ -77,6 +77,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
         * mParams['columns'] is an array with column labels as keys and column tags as values.
         *
         * @param array $value Array of the options that should be checked
+        * @suppress PhanParamSignatureMismatch
         *
         * @return string
         */
index 1c4a785..c373f45 100644 (file)
@@ -137,6 +137,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
         * @since 1.28
         * @param string[] $value
         * @return string|OOUI\CheckboxMultiselectInputWidget
+        * @suppress PhanParamSignatureMismatch
         */
        public function getInputOOUI( $value ) {
                $this->mParent->getOutput()->addModules( 'oojs-ui-widgets' );
index 3af7f56..fa6dad7 100644 (file)
@@ -41,6 +41,7 @@ class GuzzleHttpRequest extends MWHttpRequest {
 
        protected $handler = null;
        protected $sink = null;
+       /** @var array */
        protected $guzzleOptions = [ 'http_errors' => false ];
 
        /**
index 8e5567b..8433df6 100644 (file)
@@ -58,10 +58,14 @@ class HttpRequestFactory {
         *    - password            Password for HTTP Basic Authentication
         *    - originalRequest     Information about the original request (as a WebRequest object or
         *                          an associative array with 'ip' and 'userAgent').
+        * @codingStandardsIgnoreStart
+        * @phan-param array{timeout?:int,connectTimeout?:int,postData?:array,proxy?:string,noProxy?:bool,sslVerifyHost?:bool,sslVerifyCert?:bool,caInfo?:string,maxRedirects?:int,followRedirects?:bool,userAgent?:string,logger?:\Psr\Logger\LoggerInterface,username?:string,password?:string,originalRequest?:WebRequest|array{ip:string,userAgent:string}} $options
+        * @codingStandardsIgnoreEnd
         * @param string $caller The method making this request, for profiling
         * @throws RuntimeException
         * @return MWHttpRequest
         * @see MWHttpRequest::__construct
+        * @suppress PhanUndeclaredTypeParameter
         */
        public function create( $url, array $options = [], $caller = __METHOD__ ) {
                if ( !Http::$httpEngine ) {
index 41ea1dc..3a2f982 100644 (file)
@@ -46,6 +46,7 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
        protected $sslVerifyCert = true;
        protected $caInfo = null;
        protected $method = "GET";
+       /** @var array */
        protected $reqHeaders = [];
        protected $url;
        protected $parsedUrl;
@@ -63,6 +64,7 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
        protected $headerList = [];
        protected $respVersion = "0.9";
        protected $respStatus = "200 Ok";
+       /** @var string[][] */
        protected $respHeaders = [];
 
        /** @var StatusValue */
@@ -86,6 +88,9 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
        /**
         * @param string $url Url to use. If protocol-relative, will be expanded to an http:// URL
         * @param array $options (optional) extra params to pass (see HttpRequestFactory::create())
+        * @codingStandardsIgnoreStart
+        * @phan-param array{timeout?:int,connectTimeout?:int,postData?:array,proxy?:string,noProxy?:bool,sslVerifyHost?:bool,sslVerifyCert?:bool,caInfo?:string,maxRedirects?:int,followRedirects?:bool,userAgent?:string,logger?:LoggerInterface,username?:string,password?:string,originalRequest?:WebRequest|array{ip:string,userAgent:string},method?:string} $options
+        * @codingStandardsIgnoreEnd
         * @param string $caller The method making this request, for profiling
         * @param Profiler|null $profiler An instance of the profiler for profiling, or null
         * @throws Exception
@@ -98,6 +103,7 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
                $this->url = wfExpandUrl( $url, PROTO_HTTP );
                $this->parsedUrl = wfParseUrl( $this->url );
 
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                $this->logger = $options['logger'] ?? new NullLogger();
 
                if ( !$this->parsedUrl || !Http::isValidURI( $this->url ) ) {
@@ -139,6 +145,7 @@ abstract class MWHttpRequest implements LoggerAwareInterface {
                                // ensure that MWHttpRequest::method is always
                                // uppercased. T38137
                                if ( $o == 'method' ) {
+                                       // @phan-suppress-next-line PhanTypeInvalidDimOffset
                                        $options[$o] = strtoupper( $options[$o] );
                                }
                                $this->$o = $options[$o];
index 68f5b9b..0d1cc68 100644 (file)
@@ -738,6 +738,9 @@ class WikiImporter {
                return $this->logItemCallback( $revision );
        }
 
+       /**
+        * @suppress PhanTypeInvalidDimOffset Phan not reading the reference inside the hook
+        */
        private function handlePage() {
                // Handle page data.
                $this->debug( "Enter page handler." );
index 99d594d..424c9d7 100644 (file)
@@ -190,7 +190,7 @@ class CliInstaller extends Installer {
                // PerformInstallation bails on a fatal, so make sure the last item
                // completed before giving 'next.' Likewise, only provide back on failure
                $lastStepStatus = end( $result );
-               if ( $lastStepStatus->isOk() ) {
+               if ( $lastStepStatus->isOK() ) {
                        return Status::newGood();
                } else {
                        return $lastStepStatus;
index de7a347..8a9cd05 100644 (file)
@@ -419,6 +419,7 @@ abstract class DatabaseUpdater {
 
                foreach ( $updates as $funcList ) {
                        list( $func, $args, $origParams ) = $funcList;
+                       // @phan-suppress-next-line PhanUndeclaredInvokeInCallable
                        $func( ...$args );
                        flush();
                        $this->updatesSkipped[] = $origParams;
index de15456..c719c76 100644 (file)
@@ -1270,7 +1270,7 @@ abstract class Installer {
         *
         * @param string $directory Directory to search in, relative to $IP, must be either "extensions"
         *     or "skins"
-        * @return array [ $extName => [ 'screenshots' => [ '...' ] ]
+        * @return array[][] [ $extName => [ 'screenshots' => [ '...' ] ]
         */
        public function findExtensions( $directory = 'extensions' ) {
                switch ( $directory ) {
@@ -1607,11 +1607,11 @@ abstract class Installer {
 
                        // If we've hit some sort of fatal, we need to bail.
                        // Callback already had a chance to do output above.
-                       if ( !$status->isOk() ) {
+                       if ( !$status->isOK() ) {
                                break;
                        }
                }
-               if ( $status->isOk() ) {
+               if ( $status->isOK() ) {
                        $this->showMessage(
                                'config-install-db-success'
                        );
index 03e0e99..c2d349a 100644 (file)
@@ -4,7 +4,8 @@
                        "C.R.",
                        "Chelin",
                        "Macofe",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Ruthven"
                ]
        },
        "config-desc": "'O prugramma d'istallazione 'e MediaWiki",
        "config-db-web-account": "Cunto d' 'o database pe' ne fà acciesso web",
        "config-db-web-help": "Scigliete 'o nomme utente e passwrod ca 'o web server ausarrà pe' se cullegà 'o server database, pe' tramente ca se fa' operazione normale d' 'o wiki.",
        "config-db-web-account-same": "Aúsa 'o stisso cunto comme quanno s'è fatta 'a installazione",
-       "config-db-web-create": "Crìa 'o cunto si nun esiste ancora",
+       "config-db-web-create": "Crìa 'o cunto si nun esiste perzi",
        "config-db-web-no-create-privs": "'O cunto ausato pe' ne fà l'installazione nun tene diritte necessarie pe' ne putè crià n'atu cunto.\n'O cunto zegnàto ccà adda esistere già.",
        "config-mysql-engine": "Mutore d'astipo:",
        "config-mysql-innodb": "InnoDB (fosse 'o cunzigliato)",
index c87dedc..29086e6 100644 (file)
@@ -135,7 +135,7 @@ abstract class Job implements RunnableJob {
                        // When constructing this class for submitting to the queue,
                        // normalise the $title arg of old job classes as part of $params.
                        $params['namespace'] = $title->getNamespace();
-                       $params['title'] = $title->getDBKey();
+                       $params['title'] = $title->getDBkey();
                }
 
                $this->command = $command;
index 06cd04c..7bc97d8 100644 (file)
@@ -397,7 +397,8 @@ class JobQueueGroup {
        }
 
        /**
-        * @return JobQueue[]
+        * @return array[]
+        * @phan-return array<string,array{queue:JobQueue,types:array<string,class-string>}>
         */
        protected function getCoalescedQueues() {
                global $wgJobTypeConf;
index adb4221..709a67b 100644 (file)
@@ -309,7 +309,7 @@ class JobRunner implements LoggerAwareInterface {
                }
                // Always attempt to call teardown() even if Job throws exception.
                try {
-                       $job->teardown( $status );
+                       $job->tearDown( $status );
                } catch ( Exception $e ) {
                        MWExceptionHandler::logException( $e );
                }
index 85e3af9..28e6433 100644 (file)
@@ -108,7 +108,8 @@ class ThumbnailRenderJob extends Job {
 
                // T203135 We don't wait for the request to complete, as this is mostly fire & forget.
                // Looking at the HTTP status of requests that take less than 1s is a sanity check.
-               $request = MWHttpRequest::factory( $thumbUrl,
+               $request = MediaWikiServices::getInstance()->getHttpRequestFactory()->create(
+                       $thumbUrl,
                        [ 'method' => 'HEAD', 'followRedirects' => true, 'timeout' => 1 ],
                        __METHOD__
                );
index 12007fa..35cc348 100644 (file)
@@ -158,6 +158,8 @@ use MediaWiki\MediaWikiServices;
  * @see https://www.mediawiki.org/wiki/Localisation
  *
  * @since 1.17
+ * @phan-file-suppress PhanCommentParamOnEmptyParamList Cannot make variadic due to HHVM bug,
+ *   T191668#5263929
  */
 class Message implements MessageSpecifier, Serializable {
        /** Use message text as-is */
@@ -404,6 +406,7 @@ class Message implements MessageSpecifier, Serializable {
         *
         * @param string|string[]|MessageSpecifier $key
         * @param mixed $param,... Parameters as strings.
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         *
         * @return Message
         */
index 9a1796b..fc51439 100644 (file)
@@ -36,6 +36,7 @@ interface MessageLocalizer {
         * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
         *   or a MessageSpecifier.
         * @param mixed $params,... Normal message parameters
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return Message
         */
        public function msg( $key /*...*/ );
index d4abdc8..7d2c5d6 100644 (file)
@@ -89,7 +89,7 @@ class ExplodeIterator implements Iterator {
        }
 
        /**
-        * @return string
+        * @return void
         */
        public function next() {
                if ( $this->endPos === false ) {
@@ -103,8 +103,6 @@ class ExplodeIterator implements Iterator {
                        }
                }
                $this->refreshCurrent();
-
-               return $this->current;
        }
 
        /**
index a9b26ac..2e0a2af 100644 (file)
@@ -211,6 +211,7 @@ abstract class GenericArrayObject extends ArrayObject {
         * @param string $serialization
         *
         * @return array
+        * @suppress PhanParamSignatureMismatchInternal The stub appears to be wrong
         */
        public function unserialize( $serialization ) {
                $serializationData = unserialize( $serialization );
index f8ab6a3..94413c2 100644 (file)
@@ -129,6 +129,12 @@ class HashRing implements Serializable {
                        throw new InvalidArgumentException( "Invalid ring source specified." );
                }
 
+               // Short-circuit for the common single-location case. Note that if there was only one
+               // location and it was ejected from the live ring, getLiveRing() would have error out.
+               if ( count( $this->weightByLocation ) == 1 ) {
+                       return ( $limit > 0 ) ? [ $ring[0][self::KEY_LOCATION] ] : [];
+               }
+
                // Locate the node index for this item's position on the hash ring
                $itemIndex = $this->findNodeIndexForPosition( $this->getItemPosition( $item ), $ring );
 
index 107672e..cb9e647 100644 (file)
@@ -134,6 +134,7 @@ class MWMessagePack {
                                                // int64
                                                // pack() does not support 64-bit ints either so pack into two 32-bits
                                                $p1 = pack( 'l', $value & 0xFFFFFFFF );
+                                               // @phan-suppress-next-line PhanTypeInvalidLeftOperandOfIntegerOp
                                                $p2 = pack( 'l', ( $value >> 32 ) & 0xFFFFFFFF );
                                                return self::$bigendian
                                                        ? pack( 'Ca4a4', 0xD3, $p1, $p2 )
index 4a62e72..9d53a86 100644 (file)
@@ -45,9 +45,10 @@ class MappedIterator extends FilterIterator {
         * the base iterator (post-callback) and will return true if that value should be
         * included in iteration of the MappedIterator (otherwise it will be filtered out).
         *
-        * @param Iterator|Array $iter
+        * @param Iterator|array $iter
         * @param callable $vCallback Value transformation callback
         * @param array $options Options map (includes "accept") (since 1.22)
+        * @phan-param array{accept?:callable} $options
         * @throws UnexpectedValueException
         */
        public function __construct( $iter, $vCallback, array $options = [] ) {
@@ -60,6 +61,7 @@ class MappedIterator extends FilterIterator {
                }
                parent::__construct( $baseIterator );
                $this->vCallback = $vCallback;
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                $this->aCallback = $options['accept'] ?? null;
        }
 
diff --git a/includes/libs/Message/IMessageFormatterFactory.php b/includes/libs/Message/IMessageFormatterFactory.php
new file mode 100644 (file)
index 0000000..337ea82
--- /dev/null
@@ -0,0 +1,18 @@
+<?php
+
+namespace Wikimedia\Message;
+
+/**
+ * A simple factory providing a message formatter for a given language code.
+ *
+ * @see ITextFormatter
+ */
+interface IMessageFormatterFactory {
+       /**
+        * Get a text message formatter for a given language.
+        *
+        * @param string $langCode The language code
+        * @return ITextFormatter
+        */
+       public function getTextFormatter( $langCode ): ITextFormatter;
+}
diff --git a/includes/libs/Message/ITextFormatter.php b/includes/libs/Message/ITextFormatter.php
new file mode 100644 (file)
index 0000000..00f6e99
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+
+namespace Wikimedia\Message;
+
+/**
+ * ITextFormatter is a simplified interface to the Message class. It converts
+ * MessageValue message specifiers to localized text in a certain language.
+ *
+ * MessageValue supports message keys, and parameters with a wide variety of
+ * types. It does not expose any details of how messages are retrieved from
+ * storage or what format they are stored in.
+ *
+ * Thus, TextFormatter supports single message keys, but not the concept of
+ * presence or absence of a key from storage. So it does not support
+ * fallback sequences of multiple keys.
+ *
+ * The caller cannot modify the details of message translation, such as which
+ * of multiple sources the message is taken from. Any such flags may be injected
+ * into the factory constructor.
+ *
+ * Implementations of TextFormatter are not required to perfectly format
+ * any message in any language. Implementations should make a best effort to
+ * produce human-readable text.
+ *
+ * @package MediaWiki\MessageFormatter
+ */
+interface ITextFormatter {
+       /**
+        * Get the internal language code in which format() is
+        * @return string
+        */
+       function getLangCode();
+
+       /**
+        * Convert a MessageValue to text.
+        *
+        * The result is not safe for use as raw HTML.
+        *
+        * @param MessageValue $message
+        * @return string
+        */
+       function format( MessageValue $message );
+}
diff --git a/includes/libs/Message/ListParam.php b/includes/libs/Message/ListParam.php
new file mode 100644 (file)
index 0000000..c6a9c65
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+namespace Wikimedia\Message;
+
+/**
+ * The class for list parameters
+ */
+class ListParam extends MessageParam {
+       private $listType;
+
+       /**
+        * @param string $listType One of the ListType constants:
+        *   - ListType::COMMA: A comma-separated list
+        *   - ListType::SEMICOLON: A semicolon-separated list
+        *   - ListType::PIPE: A pipe-separated list
+        *   - ListType::TEXT: A natural language list, separated by commas and
+        *     the word "and".
+        * @param (MessageParam|string)[] $elements An array of parameters
+        */
+       public function __construct( $listType, array $elements ) {
+               $this->type = ParamType::LIST;
+               $this->listType = $listType;
+               $this->value = [];
+               foreach ( $elements as $element ) {
+                       if ( $element instanceof MessageParam ) {
+                               $this->value[] = $element;
+                       } elseif ( is_scalar( $element ) ) {
+                               $this->value[] = new TextParam( ParamType::TEXT, $element );
+                       } else {
+                               throw new \InvalidArgumentException(
+                                       'ListParam elements must be MessageParam or scalar' );
+                       }
+               }
+       }
+
+       /**
+        * Get the type of the list
+        *
+        * @return string One of the ListType constants
+        */
+       public function getListType() {
+               return $this->listType;
+       }
+
+       public function dump() {
+               $contents = '';
+               foreach ( $this->value as $element ) {
+                       $contents .= $element->dump();
+               }
+               return "<{$this->type} listType=\"{$this->listType}\">$contents</{$this->type}>";
+       }
+}
diff --git a/includes/libs/Message/ListType.php b/includes/libs/Message/ListType.php
new file mode 100644 (file)
index 0000000..60f3a82
--- /dev/null
@@ -0,0 +1,22 @@
+<?php
+
+namespace Wikimedia\Message;
+
+/**
+ * The constants used to specify list types. The values of the constants are an
+ * unstable implementation detail and correspond to the names of the list types
+ * in the Message class.
+ */
+class ListType {
+       /** A comma-separated list */
+       const COMMA = 'comma';
+
+       /** A semicolon-separated list */
+       const SEMICOLON = 'semicolon';
+
+       /** A pipe-separated list */
+       const PIPE = 'pipe';
+
+       /** A natural-language list separated by "and" */
+       const AND = 'text';
+}
diff --git a/includes/libs/Message/MessageParam.php b/includes/libs/Message/MessageParam.php
new file mode 100644 (file)
index 0000000..8162212
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+namespace Wikimedia\Message;
+
+/**
+ * The base class for message parameters.
+ */
+abstract class MessageParam {
+       protected $type;
+       protected $value;
+
+       /**
+        * Get the type of the parameter.
+        *
+        * @return string One of the ParamType constants
+        */
+       public function getType() {
+               return $this->type;
+       }
+
+       /**
+        * Get the input value of the parameter
+        *
+        * @return int|float|string|array
+        */
+       public function getValue() {
+               return $this->value;
+       }
+
+       /**
+        * Dump the object for testing/debugging
+        *
+        * @return string
+        */
+       abstract public function dump();
+}
diff --git a/includes/libs/Message/MessageValue.php b/includes/libs/Message/MessageValue.php
new file mode 100644 (file)
index 0000000..13b97f2
--- /dev/null
@@ -0,0 +1,258 @@
+<?php
+
+namespace Wikimedia\Message;
+
+/**
+ * A MessageValue holds a key and an array of parameters
+ */
+class MessageValue {
+       /** @var string */
+       private $key;
+
+       /** @var MessageParam[] */
+       private $params;
+
+       /**
+        * @param string $key
+        * @param array $params Each element of the parameter array
+        *   may be either a MessageParam or a scalar. If it is a scalar, it is
+        *   converted to a parameter of type TEXT.
+        */
+       public function __construct( $key, $params = [] ) {
+               $this->key = $key;
+               $this->params = [];
+               $this->params( ...$params );
+       }
+
+       /**
+        * Get the message key
+        *
+        * @return string
+        */
+       public function getKey() {
+               return $this->key;
+       }
+
+       /**
+        * Get the parameter array
+        *
+        * @return MessageParam[]
+        */
+       public function getParams() {
+               return $this->params;
+       }
+
+       /**
+        * Chainable mutator which adds text parameters and MessageParam parameters
+        *
+        * @param mixed ...$values Scalar or MessageParam values
+        * @return MessageValue
+        */
+       public function params( ...$values ) {
+               foreach ( $values as $value ) {
+                       if ( $value instanceof MessageParam ) {
+                               $this->params[] = $value;
+                       } else {
+                               $this->params[] = new TextParam( ParamType::TEXT, $value );
+                       }
+               }
+               return $this;
+       }
+
+       /**
+        * Chainable mutator which adds text parameters with a common type
+        *
+        * @param string $type One of the ParamType constants
+        * @param mixed ...$values Scalar values
+        * @return MessageValue
+        */
+       public function textParamsOfType( $type, ...$values ) {
+               foreach ( $values as $value ) {
+                       $this->params[] = new TextParam( $type, $value );
+               }
+               return $this;
+       }
+
+       /**
+        * Chainable mutator which adds list parameters with a common type
+        *
+        * @param string $listType One of the ListType constants
+        * @param array ...$values Each value should be an array of list items.
+        * @return MessageValue
+        */
+       public function listParamsOfType( $listType, ...$values ) {
+               foreach ( $values as $value ) {
+                       $this->params[] = new ListParam( $listType, $value );
+               }
+               return $this;
+       }
+
+       /**
+        * Chainable mutator which adds parameters of type text.
+        *
+        * @param string ...$values
+        * @return MessageValue
+        */
+       public function textParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::TEXT, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds numeric parameters
+        *
+        * @param mixed ...$values
+        * @return MessageValue
+        */
+       public function numParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::NUM, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds parameters which are a duration specified
+        * in seconds. This is similar to timePeriodParams() except that the result
+        * will be more verbose.
+        *
+        * @param int|float ...$values
+        * @return MessageValue
+        */
+       public function longDurationParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::DURATION_LONG, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds parameters which are a time period in seconds.
+        * This is similar to durationParams() except that the result will be more
+        * compact.
+        *
+        * @param int|float ...$values
+        * @return MessageValue
+        */
+       public function shortDurationParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::DURATION_SHORT, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds parameters which are an expiry timestamp
+        * as used in the MediaWiki database schema.
+        *
+        * @param string ...$values
+        * @return MessageValue
+        */
+       public function expiryParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::EXPIRY, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds parameters which are a number of bytes.
+        *
+        * @param int ...$values
+        * @return MessageValue
+        */
+       public function sizeParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::SIZE, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds parameters which are a number of bits per
+        * second.
+        *
+        * @param int|float ...$values
+        * @return MessageValue
+        */
+       public function bitrateParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::BITRATE, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds parameters of type "raw".
+        *
+        * @param mixed ...$values
+        * @return MessageValue
+        */
+       public function rawParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::RAW, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds parameters of type "plaintext".
+        */
+       public function plaintextParams( ...$values ) {
+               return $this->textParamsOfType( ParamType::PLAINTEXT, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds comma lists. Each comma list is an array of
+        * list elements, and each list element is either a MessageParam or a
+        * string. String parameters are converted to parameters of type "text".
+        *
+        * The list parameters thus created are formatted as a comma-separated list,
+        * or some local equivalent.
+        *
+        * @param (MessageParam|string)[] ...$values
+        * @return MessageValue
+        */
+       public function commaListParams( ...$values ) {
+               return $this->listParamsOfType( ListType::COMMA, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds semicolon lists. Each semicolon list is an
+        * array of list elements, and each list element is either a MessageParam
+        * or a string. String parameters are converted to parameters of type
+        * "text".
+        *
+        * The list parameters thus created are formatted as a semicolon-separated
+        * list, or some local equivalent.
+        *
+        * @param (MessageParam|string)[] ...$values
+        * @return MessageValue
+        */
+       public function semicolonListParams( ...$values ) {
+               return $this->listParamsOfType( ListType::SEMICOLON, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds pipe lists. Each pipe list is an array of
+        * list elements, and each list element is either a MessageParam or a
+        * string. String parameters are converted to parameters of type "text".
+        *
+        * The list parameters thus created are formatted as a pipe ("|") -separated
+        * list, or some local equivalent.
+        *
+        * @param (MessageParam|string)[] ...$values
+        * @return MessageValue
+        */
+       public function pipeListParams( ...$values ) {
+               return $this->listParamsOfType( ListType::PIPE, ...$values );
+       }
+
+       /**
+        * Chainable mutator which adds text lists. Each text list is an array of
+        * list elements, and each list element is either a MessageParam or a
+        * string. String parameters are converted to parameters of type "text".
+        *
+        * The list parameters thus created, when formatted, are joined as in natural
+        * language. In English, this means a comma-separated list, with the last
+        * two elements joined with "and".
+        *
+        * @param (MessageParam|string)[] ...$values
+        * @return MessageValue
+        */
+       public function textListParams( ...$values ) {
+               return $this->listParamsOfType( ListType::AND, ...$values );
+       }
+
+       /**
+        * Dump the object for testing/debugging
+        *
+        * @return string
+        */
+       public function dump() {
+               $contents = '';
+               foreach ( $this->params as $param ) {
+                       $contents .= $param->dump();
+               }
+               return '<message key="' . htmlspecialchars( $this->key ) . '">' .
+                       $contents . '</message>';
+       }
+}
diff --git a/includes/libs/Message/ParamType.php b/includes/libs/Message/ParamType.php
new file mode 100644 (file)
index 0000000..890ef38
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+namespace Wikimedia\Message;
+
+/**
+ * The constants used to specify parameter types. The values of the constants
+ * are an unstable implementation detail, and correspond to the names of the
+ * parameter types in the Message class.
+ */
+class ParamType {
+       /** A simple text parameter */
+       const TEXT = 'text';
+
+       /** A number, to be formatted using local digits and separators */
+       const NUM = 'num';
+
+       /** A number of seconds, to be formatted as natural language text. */
+       const DURATION_LONG = 'duration';
+
+       /** A number of seconds, to be formatted in an abbreviated way. */
+       const DURATION_SHORT = 'timeperiod';
+
+       /**
+        * An expiry time for a block. The input is either a timestamp in one
+        * of the formats accepted by the Wikimedia\Timestamp library, or
+        * "infinity" for an infinite block.
+        */
+       const EXPIRY = 'expiry';
+
+       /** A number of bytes. */
+       const SIZE = 'size';
+
+       /** A number of bits per second. */
+       const BITRATE = 'bitrate';
+
+       /** The list type (ListParam) */
+       const LIST = 'list';
+
+       /**
+        * A text parameter which is substituted after preprocessing, and so is
+        * not available to the preprocessor and cannot be modified by it.
+        */
+       const RAW = 'raw';
+
+       /** Reserved for future use. */
+       const PLAINTEXT = 'plaintext';
+}
diff --git a/includes/libs/Message/TextParam.php b/includes/libs/Message/TextParam.php
new file mode 100644 (file)
index 0000000..c1a1f08
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+namespace Wikimedia\Message;
+
+class TextParam extends MessageParam {
+       /**
+        * Construct a text parameter
+        *
+        * @param string $type May be one of:
+        *   - ParamType::TEXT: A simple text parameter
+        *   - ParamType::NUM: A number, to be formatted using local digits and
+        *     separators
+        *   - ParamType::DURATION_LONG: A number of seconds, to be formatted as natural
+        *     language text.
+        *   - ParamType::DURATION_SHORT: A number of seconds, to be formatted in an
+        *     abbreviated way.
+        *   - ParamType::EXPIRY: An expiry time for a block. The input is either
+        *     a timestamp in one of the formats accepted by the Wikimedia\Timestamp
+        *     library, or "infinity" for an infinite block.
+        *   - ParamType::SIZE: A number of bytes.
+        *   - ParamType::BITRATE: A number of bits per second.
+        *   - ParamType::RAW: A text parameter which is substituted after
+        *     preprocessing, and so is not available to the preprocessor and cannot
+        *     be modified by it.
+        *   - ParamType::PLAINTEXT: Reserved for future use.
+        *
+        * @param string|int|float $value
+        */
+       public function __construct( $type, $value ) {
+               $this->type = $type;
+               $this->value = $value;
+       }
+
+       public function dump() {
+               return "<{$this->type}>" . htmlspecialchars( $this->value ) . "</{$this->type}>";
+       }
+}
index 90e52f0..56e6b19 100644 (file)
@@ -43,13 +43,13 @@ class XhprofData {
 
        /**
         * Per-function inclusive data.
-        * @var array $inclusive
+        * @var array[] $inclusive
         */
        protected $inclusive;
 
        /**
         * Per-function inclusive and exclusive data.
-        * @var array $complete
+        * @var array[] $complete
         */
        protected $complete;
 
@@ -153,7 +153,7 @@ class XhprofData {
         * - max: Maximum value
         * - variance: Variance (spread) of the values
         *
-        * @return array
+        * @return array[]
         * @see getRawData()
         * @see getCompleteMetrics()
         */
@@ -239,7 +239,7 @@ class XhprofData {
         * metrics have an additional 'exclusive' measurement which is the total
         * minus the totals of all child function calls.
         *
-        * @return array
+        * @return array[]
         * @see getRawData()
         * @see getInclusiveMetrics()
         */
index 905e925..428fec6 100644 (file)
@@ -428,7 +428,11 @@ abstract class FileBackend implements LoggerAwareInterface {
         *   - b) predicted operation errors occurred and 'force' was not set
         *
         * @param array $ops List of operations to execute in order
+        * @codingStandardsIgnoreStart
+        * @phan-param array{ignoreMissingSource?:bool,overwrite?:bool,overwriteSame?:bool,headers?:bool} $ops
         * @param array $opts Batch operation options
+        * @phan-param array{force?:bool,nonLocking?:bool,nonJournaled?:bool,parallelize?:bool,bypassReadOnly?:bool,preserveCache?:bool} $opts
+        * @codingStandardsIgnoreEnd
         * @return StatusValue
         */
        final public function doOperations( array $ops, array $opts = [] ) {
@@ -666,7 +670,9 @@ abstract class FileBackend implements LoggerAwareInterface {
         * considered "OK" as long as no fatal errors occurred.
         *
         * @param array $ops Set of operations to execute
+        * @phan-param array{ignoreMissingSource?:bool,headers?:bool} $ops
         * @param array $opts Batch operation options
+        * @phan-param array{bypassReadOnly?:bool} $opts
         * @return StatusValue
         * @since 1.20
         */
index 27ad870..9bfb5c5 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup FileBackend
  */
 
+use Wikimedia\Timestamp\ConvertibleTimestamp;
+
 /**
  * @brief Proxy backend that mirrors writes to several internal backends.
  *
@@ -57,9 +59,11 @@ class FileBackendMultiWrite extends FileBackend {
        /** @var bool */
        protected $asyncWrites = false;
 
-       /* Possible internal backend consistency checks */
+       /** @var int Compare file sizes among backends */
        const CHECK_SIZE = 1;
+       /** @var int Compare file mtimes among backends */
        const CHECK_TIME = 2;
+       /** @var int Compare file hashes among backends */
        const CHECK_SHA1 = 4;
 
        /**
@@ -139,10 +143,8 @@ class FileBackendMultiWrite extends FileBackend {
 
                $mbe = $this->backends[$this->masterIndex]; // convenience
 
-               // Try to lock those files for the scope of this function...
-               $scopeLock = null;
+               // Acquire any locks as needed
                if ( empty( $opts['nonLocking'] ) ) {
-                       // Try to lock those files for the scope of this function...
                        /** @noinspection PhpUnusedLocalVariableInspection */
                        $scopeLock = $this->getScopedLocksForOps( $ops, $status );
                        if ( !$status->isOK() ) {
@@ -152,28 +154,30 @@ class FileBackendMultiWrite extends FileBackend {
                // Clear any cache entries (after locks acquired)
                $this->clearCache();
                $opts['preserveCache'] = true; // only locked files are cached
-               // Get the list of paths to read/write...
+               // Get the list of paths to read/write
                $relevantPaths = $this->fileStoragePathsForOps( $ops );
-               // Check if the paths are valid and accessible on all backends...
+               // Check if the paths are valid and accessible on all backends
                $status->merge( $this->accessibilityCheck( $relevantPaths ) );
                if ( !$status->isOK() ) {
                        return $status; // abort
                }
-               // Do a consistency check to see if the backends are consistent...
+               // Do a consistency check to see if the backends are consistent
                $syncStatus = $this->consistencyCheck( $relevantPaths );
                if ( !$syncStatus->isOK() ) {
-                       wfDebugLog( 'FileOperation', static::class .
-                               " failed sync check: " . FormatJson::encode( $relevantPaths ) );
-                       // Try to resync the clone backends to the master on the spot...
-                       if ( $this->autoResync === false
-                               || !$this->resyncFiles( $relevantPaths, $this->autoResync )->isOK()
+                       $this->logger->error(
+                               __METHOD__ . ": failed sync check: " . FormatJson::encode( $relevantPaths )
+                       );
+                       // Try to resync the clone backends to the master on the spot
+                       if (
+                               $this->autoResync === false ||
+                               !$this->resyncFiles( $relevantPaths, $this->autoResync )->isOK()
                        ) {
                                $status->merge( $syncStatus );
 
                                return $status; // abort
                        }
                }
-               // Actually attempt the operation batch on the master backend...
+               // Actually attempt the operation batch on the master backend
                $realOps = $this->substOpBatchPaths( $ops, $mbe );
                $masterStatus = $mbe->doOperations( $realOps, $opts );
                $status->merge( $masterStatus );
@@ -191,16 +195,18 @@ class FileBackendMultiWrite extends FileBackend {
                                        // Bind $scopeLock to the callback to preserve locks
                                        DeferredUpdates::addCallableUpdate(
                                                function () use ( $backend, $realOps, $opts, $scopeLock, $relevantPaths ) {
-                                                       wfDebugLog( 'FileOperationReplication',
+                                                       $this->logger->error(
                                                                "'{$backend->getName()}' async replication; paths: " .
-                                                               FormatJson::encode( $relevantPaths ) );
+                                                               FormatJson::encode( $relevantPaths )
+                                                       );
                                                        $backend->doOperations( $realOps, $opts );
                                                }
                                        );
                                } else {
-                                       wfDebugLog( 'FileOperationReplication',
+                                       $this->logger->error(
                                                "'{$backend->getName()}' sync replication; paths: " .
-                                               FormatJson::encode( $relevantPaths ) );
+                                               FormatJson::encode( $relevantPaths )
+                                       );
                                        $status->merge( $backend->doOperations( $realOps, $opts ) );
                                }
                        }
@@ -218,6 +224,9 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Check that a set of files are consistent across all internal backends
         *
+        * This method should only be called if the files are locked or the backend
+        * is in read-only mode
+        *
         * @param array $paths List of storage paths
         * @return StatusValue
         */
@@ -227,58 +236,75 @@ class FileBackendMultiWrite extends FileBackend {
                        return $status; // skip checks
                }
 
-               // Preload all of the stat info in as few round trips as possible...
+               // Preload all of the stat info in as few round trips as possible
                foreach ( $this->backends as $backend ) {
                        $realPaths = $this->substPaths( $paths, $backend );
                        $backend->preloadFileStat( [ 'srcs' => $realPaths, 'latest' => true ] );
                }
 
-               $mBackend = $this->backends[$this->masterIndex];
                foreach ( $paths as $path ) {
                        $params = [ 'src' => $path, 'latest' => true ];
-                       $mParams = $this->substOpPaths( $params, $mBackend );
-                       // Stat the file on the 'master' backend
-                       $mStat = $mBackend->getFileStat( $mParams );
+                       // Get the state of the file on the master backend
+                       $masterBackend = $this->backends[$this->masterIndex];
+                       $masterParams = $this->substOpPaths( $params, $masterBackend );
+                       $masterStat = $masterBackend->getFileStat( $masterParams );
+                       if ( $masterStat === self::UNKNOWN ) {
+                               $status->fatal( 'backend-fail-stat', $path );
+                               continue;
+                       }
                        if ( $this->syncChecks & self::CHECK_SHA1 ) {
-                               $mSha1 = $mBackend->getFileSha1Base36( $mParams );
+                               $masterSha1 = $masterBackend->getFileSha1Base36( $masterParams );
+                               if ( ( $masterSha1 !== false ) !== (bool)$masterStat ) {
+                                       $status->fatal( 'backend-fail-hash', $path );
+                                       continue;
+                               }
                        } else {
-                               $mSha1 = false;
+                               $masterSha1 = null; // unused
                        }
+
                        // Check if all clone backends agree with the master...
-                       foreach ( $this->backends as $index => $cBackend ) {
+                       foreach ( $this->backends as $index => $cloneBackend ) {
                                if ( $index === $this->masterIndex ) {
                                        continue; // master
                                }
-                               $cParams = $this->substOpPaths( $params, $cBackend );
-                               $cStat = $cBackend->getFileStat( $cParams );
-                               if ( $mStat ) { // file is in master
-                                       if ( !$cStat ) { // file should exist
+
+                               // Get the state of the file on the clone backend
+                               $cloneParams = $this->substOpPaths( $params, $cloneBackend );
+                               $cloneStat = $cloneBackend->getFileStat( $cloneParams );
+
+                               if ( $masterStat ) {
+                                       // File exists in the master backend
+                                       if ( !$cloneStat ) {
+                                               // File is missing from the clone backend
                                                $status->fatal( 'backend-fail-synced', $path );
-                                               continue;
-                                       }
-                                       if ( ( $this->syncChecks & self::CHECK_SIZE )
-                                               && $cStat['size'] != $mStat['size']
-                                       ) { // wrong size
+                                       } elseif (
+                                               ( $this->syncChecks & self::CHECK_SIZE ) &&
+                                               $cloneStat['size'] !== $masterStat['size']
+                                       ) {
+                                               // File in the clone backend is different
                                                $status->fatal( 'backend-fail-synced', $path );
-                                               continue;
-                                       }
-                                       if ( $this->syncChecks & self::CHECK_TIME ) {
-                                               $mTs = wfTimestamp( TS_UNIX, $mStat['mtime'] );
-                                               $cTs = wfTimestamp( TS_UNIX, $cStat['mtime'] );
-                                               if ( abs( $mTs - $cTs ) > 30 ) { // outdated file somewhere
-                                                       $status->fatal( 'backend-fail-synced', $path );
-                                                       continue;
-                                               }
-                                       }
-                                       if (
+                                       } elseif (
+                                               ( $this->syncChecks & self::CHECK_TIME ) &&
+                                               abs(
+                                                       ConvertibleTimestamp::convert( TS_UNIX, $masterStat['mtime'] ) -
+                                                       ConvertibleTimestamp::convert( TS_UNIX, $cloneStat['mtime'] )
+                                               ) > 30
+                                       ) {
+                                               // File in the clone backend is significantly newer or older
+                                               $status->fatal( 'backend-fail-synced', $path );
+                                       } elseif (
                                                ( $this->syncChecks & self::CHECK_SHA1 ) &&
-                                               $cBackend->getFileSha1Base36( $cParams ) !== $mSha1
-                                       ) { // wrong SHA1
+                                               $cloneBackend->getFileSha1Base36( $cloneParams ) !== $masterSha1
+                                       ) {
+                                               // File in the clone backend is different
+                                               $status->fatal( 'backend-fail-synced', $path );
+                                       }
+                               } else {
+                                       // File does not exist in the master backend
+                                       if ( $cloneStat ) {
+                                               // Stray file exists in the clone backend
                                                $status->fatal( 'backend-fail-synced', $path );
-                                               continue;
                                        }
-                               } elseif ( $cStat ) { // file is not in master; file should not exist
-                                       $status->fatal( 'backend-fail-synced', $path );
                                }
                        }
                }
@@ -314,6 +340,8 @@ class FileBackendMultiWrite extends FileBackend {
         * Check that a set of files are consistent across all internal backends
         * and re-synchronize those files against the "multi master" if needed.
         *
+        * This method should only be called if the files are locked
+        *
         * @param array $paths List of storage paths
         * @param string|bool $resyncMode False, True, or "conservative"; see __construct()
         * @return StatusValue
@@ -321,58 +349,83 @@ class FileBackendMultiWrite extends FileBackend {
        public function resyncFiles( array $paths, $resyncMode = true ) {
                $status = $this->newStatus();
 
-               $mBackend = $this->backends[$this->masterIndex];
+               $fname = __METHOD__;
                foreach ( $paths as $path ) {
-                       $mPath = $this->substPaths( $path, $mBackend );
-                       $mSha1 = $mBackend->getFileSha1Base36( [ 'src' => $mPath, 'latest' => true ] );
-                       $mStat = $mBackend->getFileStat( [ 'src' => $mPath, 'latest' => true ] );
-                       if ( $mStat === null || ( $mSha1 !== false && !$mStat ) ) { // sanity
-                               $status->fatal( 'backend-fail-internal', $this->name );
-                               wfDebugLog( 'FileOperation', __METHOD__
-                                       . ': File is not available on the master backend' );
-                               continue; // file is not available on the master backend...
+                       $params = [ 'src' => $path, 'latest' => true ];
+                       // Get the state of the file on the master backend
+                       $masterBackend = $this->backends[$this->masterIndex];
+                       $masterParams = $this->substOpPaths( $params, $masterBackend );
+                       $masterPath = $masterParams['src'];
+                       $masterStat = $masterBackend->getFileStat( $masterParams );
+                       if ( $masterStat === self::UNKNOWN ) {
+                               $status->fatal( 'backend-fail-stat', $path );
+                               $this->logger->error( "$fname: file '$masterPath' is not available" );
+                               continue;
+                       }
+                       $masterSha1 = $masterBackend->getFileSha1Base36( $masterParams );
+                       if ( ( $masterSha1 !== false ) !== (bool)$masterStat ) {
+                               $status->fatal( 'backend-fail-hash', $path );
+                               $this->logger->error( "$fname: file '$masterPath' hash does not match stat" );
+                               continue;
                        }
+
                        // Check of all clone backends agree with the master...
-                       foreach ( $this->backends as $index => $cBackend ) {
+                       foreach ( $this->backends as $index => $cloneBackend ) {
                                if ( $index === $this->masterIndex ) {
                                        continue; // master
                                }
-                               $cPath = $this->substPaths( $path, $cBackend );
-                               $cSha1 = $cBackend->getFileSha1Base36( [ 'src' => $cPath, 'latest' => true ] );
-                               $cStat = $cBackend->getFileStat( [ 'src' => $cPath, 'latest' => true ] );
-                               if ( $cStat === null || ( $cSha1 !== false && !$cStat ) ) { // sanity
-                                       $status->fatal( 'backend-fail-internal', $cBackend->getName() );
-                                       wfDebugLog( 'FileOperation', __METHOD__ .
-                                               ': File is not available on the clone backend' );
-                                       continue; // file is not available on the clone backend...
+
+                               // Get the state of the file on the clone backend
+                               $cloneParams = $this->substOpPaths( $params, $cloneBackend );
+                               $clonePath = $cloneParams['src'];
+                               $cloneStat = $cloneBackend->getFileStat( $cloneParams );
+                               if ( $cloneStat === self::UNKNOWN ) {
+                                       $status->fatal( 'backend-fail-stat', $path );
+                                       $this->logger->error( "$fname: file '$clonePath' is not available" );
+                                       continue;
                                }
-                               if ( $mSha1 === $cSha1 ) {
-                                       // already synced; nothing to do
-                               } elseif ( $mSha1 !== false ) { // file is in master
-                                       if ( $resyncMode === 'conservative'
-                                               && $cStat && $cStat['mtime'] > $mStat['mtime']
+                               $cloneSha1 = $cloneBackend->getFileSha1Base36( $cloneParams );
+                               if ( ( $cloneSha1 !== false ) !== (bool)$cloneStat ) {
+                                       $status->fatal( 'backend-fail-hash', $path );
+                                       $this->logger->error( "$fname: file '$clonePath' hash does not match stat" );
+                                       continue;
+                               }
+
+                               if ( $masterSha1 === $cloneSha1 ) {
+                                       // File is either the same in both backends or absent from both backends
+                                       $this->logger->debug( "$fname: file '$clonePath' matches '$masterPath'" );
+                               } elseif ( $masterSha1 !== false ) {
+                                       // File is either missing from or different in the clone backend
+                                       if (
+                                               $resyncMode === 'conservative' &&
+                                               $cloneStat &&
+                                               $cloneStat['mtime'] > $masterStat['mtime']
                                        ) {
+                                               // Do not replace files with older ones; reduces the risk of data loss
                                                $status->fatal( 'backend-fail-synced', $path );
-                                               continue; // don't rollback data
+                                       } else {
+                                               // Copy the master backend file to the clone backend in overwrite mode
+                                               $fsFile = $masterBackend->getLocalReference( $masterParams );
+                                               $status->merge( $cloneBackend->quickStore( [
+                                                       'src' => $fsFile,
+                                                       'dst' => $clonePath
+                                               ] ) );
                                        }
-                                       $fsFile = $mBackend->getLocalReference(
-                                               [ 'src' => $mPath, 'latest' => true ] );
-                                       $status->merge( $cBackend->quickStore(
-                                               [ 'src' => $fsFile->getPath(), 'dst' => $cPath ]
-                                       ) );
-                               } elseif ( $mStat === false ) { // file is not in master
+                               } elseif ( $masterStat === false ) {
+                                       // Stray file exists in the clone backend
                                        if ( $resyncMode === 'conservative' ) {
+                                               // Do not delete stray files; reduces the risk of data loss
                                                $status->fatal( 'backend-fail-synced', $path );
-                                               continue; // don't delete data
+                                       } else {
+                                               // Delete the stay file from the clone backend
+                                               $status->merge( $cloneBackend->quickDelete( [ 'src' => $clonePath ] ) );
                                        }
-                                       $status->merge( $cBackend->quickDelete( [ 'src' => $cPath ] ) );
                                }
                        }
                }
 
                if ( !$status->isOK() ) {
-                       wfDebugLog( 'FileOperation', static::class .
-                               " failed to resync: " . FormatJson::encode( $paths ) );
+                       $this->logger->error( "$fname: failed to resync: " . FormatJson::encode( $paths ) );
                }
 
                return $status;
@@ -488,7 +541,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        protected function doQuickOperationsInternal( array $ops ) {
                $status = $this->newStatus();
-               // Do the operations on the master backend; setting StatusValue fields...
+               // Do the operations on the master backend; setting StatusValue fields
                $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
                $masterStatus = $this->backends[$this->masterIndex]->doQuickOperations( $realOps );
                $status->merge( $masterStatus );
index 9b901dd..e637565 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup FileBackend
  */
+
 use Wikimedia\AtEase\AtEase;
 use Wikimedia\Timestamp\ConvertibleTimestamp;
 
@@ -119,6 +120,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return StatusValue
         */
        final public function createInternal( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                if ( strlen( $params['content'] ) > $this->maxFileSizeInternal() ) {
                        $status = $this->newStatus( 'backend-fail-maxsize',
@@ -160,6 +162,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return StatusValue
         */
        final public function storeInternal( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
                        $status = $this->newStatus( 'backend-fail-maxsize',
@@ -202,6 +205,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return StatusValue
         */
        final public function copyInternal( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->doCopyInternal( $params );
                $this->clearCache( [ $params['dst'] ] );
@@ -234,6 +238,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return StatusValue
         */
        final public function deleteInternal( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->doDeleteInternal( $params );
                $this->clearCache( [ $params['src'] ] );
@@ -268,6 +273,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return StatusValue
         */
        final public function moveInternal( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->doMoveInternal( $params );
                $this->clearCache( [ $params['src'], $params['dst'] ] );
@@ -314,6 +320,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return StatusValue
         */
        final public function describeInternal( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                if ( count( $params['headers'] ) ) {
                        $status = $this->doDescribeInternal( $params );
@@ -347,10 +354,12 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function concatenate( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
                // Try to lock the source files for the scope of this function
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scopeLockS = $this->getScopedFileLocks( $params['srcs'], LockManager::LOCK_UW, $status );
                if ( $status->isOK() ) {
                        // Actually do the file concatenation...
@@ -440,6 +449,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doPrepare( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
@@ -475,6 +485,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doSecure( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
@@ -510,6 +521,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doPublish( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
@@ -545,6 +557,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doClean( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
@@ -569,6 +582,7 @@ abstract class FileBackendStore extends FileBackend {
 
                // Attempt to lock this directory...
                $filesLockEx = [ $params['dir'] ];
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $scopedLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
                if ( !$status->isOK() ) {
                        return $status; // abort
@@ -601,6 +615,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function fileExists( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
 
@@ -608,6 +623,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getFileTimestamp( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
 
@@ -615,6 +631,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getFileSize( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $stat = $this->getFileStat( $params );
 
@@ -626,6 +643,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $path === null ) {
                        return false; // invalid storage path
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                $latest = !empty( $params['latest'] ); // use latest data?
@@ -699,6 +717,7 @@ abstract class FileBackendStore extends FileBackend {
        abstract protected function doGetFileStat( array $params );
 
        public function getFileContentsMulti( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
@@ -728,6 +747,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $path === null ) {
                        return false; // invalid storage path
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
                if ( $this->cheapCache->hasField( $path, 'xattr', self::CACHE_TTL ) ) {
@@ -759,6 +779,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $path === null ) {
                        return false; // invalid storage path
                }
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $latest = !empty( $params['latest'] ); // use latest data?
                if ( $this->cheapCache->hasField( $path, 'sha1', self::CACHE_TTL ) ) {
@@ -790,6 +811,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getFileProps( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $fsFile = $this->getLocalReference( $params );
                $props = $fsFile ? $fsFile->getProps() : FSFile::placeholderProps();
@@ -798,6 +820,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getLocalReferenceMulti( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
@@ -841,6 +864,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function getLocalCopyMulti( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                $params = $this->setConcurrencyFlags( $params );
@@ -866,6 +890,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function streamFile( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
@@ -1089,6 +1114,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doOperationsInternal( array $ops, array $opts ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
@@ -1103,7 +1129,7 @@ abstract class FileBackendStore extends FileBackend {
                        // Build up a list of files to lock...
                        $paths = $this->getPathsToLockForOpsInternal( $performOps );
                        // Try to lock those files for the scope of this function...
-
+                       /** @noinspection PhpUnusedLocalVariableInspection */
                        $scopeLock = $this->getScopedFileLocks( $paths, 'mixed', $status );
                        if ( !$status->isOK() ) {
                                return $status; // abort
@@ -1156,6 +1182,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final protected function doQuickOperationsInternal( array $ops ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $status = $this->newStatus();
 
@@ -1222,6 +1249,7 @@ abstract class FileBackendStore extends FileBackend {
         * @throws FileBackendError
         */
        final public function executeOpHandlesInternal( array $fileOpHandles ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                foreach ( $fileOpHandles as $fileOpHandle ) {
@@ -1250,7 +1278,7 @@ abstract class FileBackendStore extends FileBackend {
         */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                if ( count( $fileOpHandles ) ) {
-                       throw new LogicException( "Backend does not support asynchronous operations." );
+                       throw new FileBackendError( "Backend does not support asynchronous operations." );
                }
 
                return [];
@@ -1326,6 +1354,7 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        final public function preloadFileStat( array $params ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
                $success = true; // no network errors
 
@@ -1672,6 +1701,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param array $items
         */
        final protected function primeContainerCache( array $items ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                $paths = []; // list of storage paths
@@ -1769,6 +1799,7 @@ abstract class FileBackendStore extends FileBackend {
         * @param array $items List of storage paths
         */
        final protected function primeFileCache( array $items ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
                $ps = $this->scopedProfileSection( __METHOD__ . "-{$this->name}" );
 
                $paths = []; // list of storage paths
index e576c64..6d6451e 100644 (file)
@@ -884,6 +884,7 @@ class SwiftFileBackend extends FileBackendStore {
                                throw new FileBackendError( "Iterator page I/O error." );
                        }
                        $objects = $status->value;
+                       // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach
                        foreach ( $objects as $object ) { // files and directories
                                if ( substr( $object, -1 ) === '/' ) {
                                        $dirs[] = $object; // directories end in '/'
@@ -905,6 +906,7 @@ class SwiftFileBackend extends FileBackendStore {
 
                        $objects = $status->value;
 
+                       // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach
                        foreach ( $objects as $object ) { // files
                                $objectDir = $getParentDir( $object ); // directory of object
 
@@ -1047,6 +1049,7 @@ class SwiftFileBackend extends FileBackendStore {
                                $stat = $this->getFileStat( $params );
                        }
 
+                       // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
                        return $stat['xattr'];
                } else {
                        return false;
index 2e418b9..6b1ef89 100644 (file)
@@ -150,7 +150,7 @@ class MultiHttpClient implements LoggerAwareInterface {
         * This is true for the request headers and the response headers. Integer-indexed
         * method/URL entries will also be changed to use the corresponding string keys.
         *
-        * @param array $reqs Map of HTTP request arrays
+        * @param array[] $reqs Map of HTTP request arrays
         * @param array $opts
         *   - connTimeout     : connection timeout per request (seconds)
         *   - reqTimeout      : post-connection timeout per request (seconds)
@@ -182,14 +182,18 @@ class MultiHttpClient implements LoggerAwareInterface {
         *
         * @see MultiHttpClient::runMulti()
         *
-        * @param array $reqs Map of HTTP request arrays
+        * @param array[] $reqs Map of HTTP request arrays
         * @param array $opts
         *   - connTimeout     : connection timeout per request (seconds)
         *   - reqTimeout      : post-connection timeout per request (seconds)
         *   - usePipelining   : whether to use HTTP pipelining if possible
         *   - maxConnsPerHost : maximum number of concurrent connections (per host)
+        * @codingStandardsIgnoreStart
+        * @phan-param array{connTimeout?:int,reqTimeout?:int,usePipelining?:bool,maxConnsPerHost?:int} $opts
+        * @codingStandardsIgnoreEnd
         * @return array $reqs With response array populated for each
         * @throws Exception
+        * @suppress PhanTypeInvalidDimOffset
         */
        private function runMultiCurl( array $reqs, array $opts = [] ) {
                $chm = $this->getCurlMulti();
@@ -293,6 +297,7 @@ class MultiHttpClient implements LoggerAwareInterface {
         *   - reqTimeout     : default request timeout
         * @return resource
         * @throws Exception
+        * @suppress PhanTypeMismatchArgumentInternal
         */
        protected function getCurlHandle( array &$req, array $opts = [] ) {
                $ch = curl_init();
@@ -399,6 +404,7 @@ class MultiHttpClient implements LoggerAwareInterface {
                                $name = strtolower( $name );
                                $value = trim( $value );
                                if ( isset( $req['response']['headers'][$name] ) ) {
+                                       // @phan-suppress-next-line PhanTypeInvalidDimOffset
                                        $req['response']['headers'][$name] .= ', ' . $value;
                                } else {
                                        $req['response']['headers'][$name] = $value;
@@ -498,7 +504,7 @@ class MultiHttpClient implements LoggerAwareInterface {
                                'error' => '',
                        ];
 
-                       if ( !$sv->isOk() ) {
+                       if ( !$sv->isOK() ) {
                                $svErrors = $sv->getErrors();
                                if ( isset( $svErrors[0] ) ) {
                                        $req['response']['error'] = $svErrors[0]['message'];
@@ -507,6 +513,7 @@ class MultiHttpClient implements LoggerAwareInterface {
                                        if ( isset( $svErrors[0]['params'][0] ) ) {
                                                if ( is_numeric( $svErrors[0]['params'][0] ) ) {
                                                        if ( isset( $svErrors[0]['params'][1] ) ) {
+                                                               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                                                                $req['response']['reason'] = $svErrors[0]['params'][1];
                                                        }
                                                } else {
@@ -529,7 +536,7 @@ class MultiHttpClient implements LoggerAwareInterface {
        /**
         * Normalize request information
         *
-        * @param array $reqs the requests to normalize
+        * @param array[] $reqs the requests to normalize
         */
        private function normalizeRequests( array &$reqs ) {
                foreach ( $reqs as &$req ) {
index 950b283..6478a61 100644 (file)
@@ -38,7 +38,7 @@ abstract class QuorumLockManager extends LockManager {
        final protected function doLockByType( array $pathsByType ) {
                $status = StatusValue::newGood();
 
-               $pathsToLock = []; // (bucket => type => paths)
+               $pathsByTypeByBucket = []; // (bucket => type => paths)
                // Get locks that need to be acquired (buckets => locks)...
                foreach ( $pathsByType as $type => $paths ) {
                        foreach ( $paths as $path ) {
@@ -46,23 +46,27 @@ abstract class QuorumLockManager extends LockManager {
                                        ++$this->locksHeld[$path][$type];
                                } else {
                                        $bucket = $this->getBucketFromPath( $path );
-                                       $pathsToLock[$bucket][$type][] = $path;
+                                       $pathsByTypeByBucket[$bucket][$type][] = $path;
                                }
                        }
                }
 
+               // Acquire locks in each bucket in bucket order to reduce contention. Any blocking
+               // mutexes during the acquisition step will not involve circular waiting on buckets.
+               ksort( $pathsByTypeByBucket );
+
                $lockedPaths = []; // files locked in this attempt (type => paths)
                // Attempt to acquire these locks...
-               foreach ( $pathsToLock as $bucket => $pathsToLockByType ) {
+               foreach ( $pathsByTypeByBucket as $bucket => $bucketPathsByType ) {
                        // Try to acquire the locks for this bucket
-                       $status->merge( $this->doLockingRequestBucket( $bucket, $pathsToLockByType ) );
+                       $status->merge( $this->doLockingRequestBucket( $bucket, $bucketPathsByType ) );
                        if ( !$status->isOK() ) {
                                $status->merge( $this->doUnlockByType( $lockedPaths ) );
 
                                return $status;
                        }
                        // Record these locks as active
-                       foreach ( $pathsToLockByType as $type => $paths ) {
+                       foreach ( $bucketPathsByType as $type => $paths ) {
                                foreach ( $paths as $path ) {
                                        $this->locksHeld[$path][$type] = 1; // locked
                                        // Keep track of what locks were made in this attempt
@@ -77,7 +81,7 @@ abstract class QuorumLockManager extends LockManager {
        protected function doUnlockByType( array $pathsByType ) {
                $status = StatusValue::newGood();
 
-               $pathsToUnlock = []; // (bucket => type => paths)
+               $pathsByTypeByBucket = []; // (bucket => type => paths)
                foreach ( $pathsByType as $type => $paths ) {
                        foreach ( $paths as $path ) {
                                if ( !isset( $this->locksHeld[$path][$type] ) ) {
@@ -88,7 +92,7 @@ abstract class QuorumLockManager extends LockManager {
                                        if ( $this->locksHeld[$path][$type] <= 0 ) {
                                                unset( $this->locksHeld[$path][$type] );
                                                $bucket = $this->getBucketFromPath( $path );
-                                               $pathsToUnlock[$bucket][$type][] = $path;
+                                               $pathsByTypeByBucket[$bucket][$type][] = $path;
                                        }
                                        if ( $this->locksHeld[$path] === [] ) {
                                                unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
@@ -99,8 +103,8 @@ abstract class QuorumLockManager extends LockManager {
 
                // Remove these specific locks if possible, or at least release
                // all locks once this process is currently not holding any locks.
-               foreach ( $pathsToUnlock as $bucket => $pathsToUnlockByType ) {
-                       $status->merge( $this->doUnlockingRequestBucket( $bucket, $pathsToUnlockByType ) );
+               foreach ( $pathsByTypeByBucket as $bucket => $bucketPathsByType ) {
+                       $status->merge( $this->doUnlockingRequestBucket( $bucket, $bucketPathsByType ) );
                }
                if ( $this->locksHeld === [] ) {
                        $status->merge( $this->releaseAllLocks() );
index 0383def..34d612a 100644 (file)
@@ -149,6 +149,7 @@ class MSCompoundFileReader {
                        $this->error( 'invalid signature: ' . bin2hex( $this->header['header_signature'] ),
                                self::ERROR_INVALID_SIGNATURE );
                }
+               // @phan-suppress-next-line PhanTypeInvalidRightOperandOfIntegerOp
                $this->sectorLength = 1 << $this->header['sector_shift'];
                $this->readDifat();
                $this->readDirectory();
@@ -177,11 +178,22 @@ class MSCompoundFileReader {
                );
        }
 
+       /**
+        * @param int $offset
+        * @param int[] $struct
+        * @return array
+        */
        private function unpackOffset( $offset, $struct ) {
                $block = $this->readOffset( $offset, array_sum( $struct ) );
                return $this->unpack( $block, 0, $struct );
        }
 
+       /**
+        * @param string $block
+        * @param int $offset
+        * @param int[] $struct
+        * @return array
+        */
        private function unpack( $block, $offset, $struct ) {
                $data = [];
                foreach ( $struct as $key => $length ) {
@@ -220,6 +232,7 @@ class MSCompoundFileReader {
        }
 
        private function readSector( $sectorId ) {
+               // @phan-suppress-next-line PhanTypeInvalidRightOperandOfIntegerOp
                return $this->readOffset( $this->sectorOffset( $sectorId ), 1 << $this->header['sector_shift'] );
        }
 
index f25287f..9d66326 100644 (file)
@@ -150,7 +150,8 @@ class XmlTypeCheck {
        }
 
        /**
-        * @param string $fname the filename
+        * @param string $xml
+        * @param bool $isFile
         */
        private function validateFromInput( $xml, $isFile ) {
                $reader = new XMLReader();
index 42da5f0..ad3f681 100644 (file)
@@ -91,6 +91,7 @@ abstract class BagOStuff implements IExpiringStore, IStoreKeyEncoder, LoggerAwar
         *   - asyncHandler: Callable to use for scheduling tasks after the web request ends.
         *      In CLI mode, it should run the task immediately.
         * @param array $params
+        * @phan-param array{logger?:Psr\Log\LoggerInterface,asyncHandler?:callable} $params
         */
        public function __construct( array $params = [] ) {
                $this->setLogger( $params['logger'] ?? new NullLogger() );
index 6d0940b..0f7011d 100644 (file)
@@ -47,6 +47,10 @@ class HashBagOStuff extends MediumSpecificBagOStuff {
        /**
         * @param array $params Additional parameters include:
         *   - maxKeys : only allow this many keys (using oldest-first eviction)
+        * @codingStandardsIgnoreStart
+        * @phan-param array{logger?:Psr\Log\LoggerInterface,asyncHandler?:callable,keyspace?:string,reportDupes?:bool,syncTimeout?:int,segmentationSize?:int,segmentedValueMaxSize?:int,maxKeys?:int} $params
+        * @codingStandardsIgnoreEnd
+        * @suppress PhanTypeInvalidDimOffset
         */
        function __construct( $params = [] ) {
                $params['segmentationSize'] = $params['segmentationSize'] ?? INF;
index 9d36187..252c089 100644 (file)
@@ -73,6 +73,9 @@ abstract class MediumSpecificBagOStuff extends BagOStuff {
         *      This should be configured to a reasonable size give the site traffic and the
         *      amount of I/O between application and cache servers that the network can handle.
         * @param array $params
+        * @codingStandardsIgnoreStart
+        * @phan-param array{logger?:Psr\Log\LoggerInterface,asyncHandler?:callable,keyspace?:string,reportDupes?:bool,syncTimeout?:int,segmentationSize?:int,segmentedValueMaxSize?:int} $params
+        * @codingStandardsIgnoreEnd
         */
        public function __construct( array $params = [] ) {
                parent::__construct( $params );
index dc40931..40f2836 100644 (file)
@@ -49,29 +49,25 @@ abstract class MemcachedBagOStuff extends MediumSpecificBagOStuff {
                // custom prefixes used by thing like WANObjectCache, limit to 205.
                $charsLeft = 205 - strlen( $keyspace ) - count( $args );
 
-               $args = array_map(
-                       function ( $arg ) use ( &$charsLeft ) {
-                               $arg = strtr( $arg, ' ', '_' );
+               foreach ( $args as &$arg ) {
+                       $arg = strtr( $arg, ' ', '_' );
 
-                               // Make sure %, #, and non-ASCII chars are escaped
-                               $arg = preg_replace_callback(
-                                       '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/',
-                                       function ( $m ) {
-                                               return rawurlencode( $m[0] );
-                                       },
-                                       $arg
-                               );
+                       // Make sure %, #, and non-ASCII chars are escaped
+                       $arg = preg_replace_callback(
+                               '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/',
+                               function ( $m ) {
+                                       return rawurlencode( $m[0] );
+                               },
+                               $arg
+                       );
 
-                               // 33 = 32 characters for the MD5 + 1 for the '#' prefix.
-                               if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) {
-                                       $arg = '#' . md5( $arg );
-                               }
+                       // 33 = 32 characters for the MD5 + 1 for the '#' prefix.
+                       if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) {
+                               $arg = '#' . md5( $arg );
+                       }
 
-                               $charsLeft -= strlen( $arg );
-                               return $arg;
-                       },
-                       $args
-               );
+                       $charsLeft -= strlen( $arg );
+               }
 
                if ( $charsLeft < 0 ) {
                        return $keyspace . ':BagOStuff-long-key:##' . md5( implode( ':', $args ) );
index d0aa380..51f7316 100644 (file)
@@ -61,6 +61,7 @@ class MultiWriteBagOStuff extends BagOStuff {
         *      invalidation uses logical TTLs, invalidation uses etag/timestamp
         *      validation against the DB, or merge() is used to handle races.
         * @param array $params
+        * @phan-param array{caches:array<int,array|BagOStuff>,replication:string} $params
         * @throws InvalidArgumentException
         */
        public function __construct( $params ) {
index 57a2507..aaed69f 100644 (file)
@@ -28,6 +28,7 @@
  *
  * @ingroup Cache
  * @ingroup Redis
+ * @phan-file-suppress PhanTypeComparisonFromArray It's unclear whether exec() can return false
  */
 class RedisBagOStuff extends MediumSpecificBagOStuff {
        /** @var RedisConnectionPool */
index 0b5ac46..ff87829 100644 (file)
@@ -33,16 +33,26 @@ use Wikimedia\ObjectFactory;
  */
 class ReplicatedBagOStuff extends BagOStuff {
        /** @var BagOStuff */
-       protected $writeStore;
+       private $writeStore;
        /** @var BagOStuff */
-       protected $readStore;
+       private $readStore;
+
+       /** @var int Seconds to read from the master source for a key after writing to it */
+       private $consistencyWindow;
+       /** @var float[] Map of (key => UNIX timestamp) */
+       private $lastKeyWrites = [];
+
+       /** @var int Max expected delay (in seconds) for writes to reach replicas */
+       const MAX_WRITE_DELAY = 5;
 
        /**
         * Constructor. Parameters are:
-        *   - writeFactory : ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
-        *                    This object will be used for writes (e.g. the master DB).
-        *   - readFactory  : ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
-        *                    This object will be used for reads (e.g. a replica DB).
+        *   - writeFactory: ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
+        *      This object will be used for writes (e.g. the master DB).
+        *   - readFactory: ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
+        *      This object will be used for reads (e.g. a replica DB).
+        *   - sessionConsistencyWindow: Seconds to read from the master source for a key
+        *      after writing to it. [Default: ReplicatedBagOStuff::MAX_WRITE_DELAY]
         *
         * @param array $params
         * @throws InvalidArgumentException
@@ -53,19 +63,18 @@ class ReplicatedBagOStuff extends BagOStuff {
                if ( !isset( $params['writeFactory'] ) ) {
                        throw new InvalidArgumentException(
                                __METHOD__ . ': the "writeFactory" parameter is required' );
-               }
-               if ( !isset( $params['readFactory'] ) ) {
+               } elseif ( !isset( $params['readFactory'] ) ) {
                        throw new InvalidArgumentException(
                                __METHOD__ . ': the "readFactory" parameter is required' );
                }
 
-               $opts = [ 'reportDupes' => false ]; // redundant
+               $this->consistencyWindow = $params['sessionConsistencyWindow'] ?? self::MAX_WRITE_DELAY;
                $this->writeStore = ( $params['writeFactory'] instanceof BagOStuff )
                        ? $params['writeFactory']
-                       : ObjectFactory::getObjectFromSpec( $opts + $params['writeFactory'] );
+                       : ObjectFactory::getObjectFromSpec( $params['writeFactory'] );
                $this->readStore = ( $params['readFactory'] instanceof BagOStuff )
                        ? $params['readFactory']
-                       : ObjectFactory::getObjectFromSpec( $opts + $params['readFactory'] );
+                       : ObjectFactory::getObjectFromSpec( $params['readFactory'] );
                $this->attrMap = $this->mergeFlagMaps( [ $this->readStore, $this->writeStore ] );
        }
 
@@ -76,28 +85,41 @@ class ReplicatedBagOStuff extends BagOStuff {
        }
 
        public function get( $key, $flags = 0 ) {
-               return $this->fieldHasFlags( $flags, self::READ_LATEST )
+               return (
+                       $this->hadRecentSessionWrite( [ $key ] ) ||
+                       $this->fieldHasFlags( $flags, self::READ_LATEST )
+               )
                        ? $this->writeStore->get( $key, $flags )
                        : $this->readStore->get( $key, $flags );
        }
 
        public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->set( $key, $value, $exptime, $flags );
        }
 
        public function delete( $key, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->delete( $key, $flags );
        }
 
        public function add( $key, $value, $exptime = 0, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->add( $key, $value, $exptime, $flags );
        }
 
        public function merge( $key, callable $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->merge( $key, $callback, $exptime, $attempts, $flags );
        }
 
        public function changeTTL( $key, $exptime = 0, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->changeTTL( $key, $exptime, $flags );
        }
 
@@ -118,37 +140,52 @@ class ReplicatedBagOStuff extends BagOStuff {
        }
 
        public function getMulti( array $keys, $flags = 0 ) {
-               return $this->fieldHasFlags( $flags, self::READ_LATEST )
+               return (
+                       $this->hadRecentSessionWrite( $keys ) ||
+                       $this->fieldHasFlags( $flags, self::READ_LATEST )
+               )
                        ? $this->writeStore->getMulti( $keys, $flags )
                        : $this->readStore->getMulti( $keys, $flags );
        }
 
        public function setMulti( array $data, $exptime = 0, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( array_keys( $data ) );
+
                return $this->writeStore->setMulti( $data, $exptime, $flags );
        }
 
        public function deleteMulti( array $keys, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( $keys );
+
                return $this->writeStore->deleteMulti( $keys, $flags );
        }
 
        public function changeTTLMulti( array $keys, $exptime, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( $keys );
+
                return $this->writeStore->changeTTLMulti( $keys, $exptime, $flags );
        }
 
        public function incr( $key, $value = 1, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->incr( $key, $value, $flags );
        }
 
        public function decr( $key, $value = 1, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->decr( $key, $value, $flags );
        }
 
        public function incrWithInit( $key, $exptime, $value = 1, $init = null, $flags = 0 ) {
+               $this->remarkRecentSessionWrite( [ $key ] );
+
                return $this->writeStore->incrWithInit( $key, $exptime, $value, $init, $flags );
        }
 
        public function getLastError() {
-               return ( $this->writeStore->getLastError() != self::ERR_NONE )
+               return ( $this->writeStore->getLastError() !== self::ERR_NONE )
                        ? $this->writeStore->getLastError()
                        : $this->readStore->getLastError();
        }
@@ -179,4 +216,40 @@ class ReplicatedBagOStuff extends BagOStuff {
                $this->writeStore->setMockTime( $time );
                $this->readStore->setMockTime( $time );
        }
+
+       /**
+        * @param string[] $keys
+        * @return bool
+        */
+       private function hadRecentSessionWrite( array $keys ) {
+               $now = $this->getCurrentTime();
+               foreach ( $keys as $key ) {
+                       $ts = $this->lastKeyWrites[$key] ?? 0;
+                       if ( $ts && ( $now - $ts ) <= $this->consistencyWindow ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string[] $keys
+        */
+       private function remarkRecentSessionWrite( array $keys ) {
+               $now = $this->getCurrentTime();
+               foreach ( $keys as $key ) {
+                       unset( $this->lastKeyWrites[$key] ); // move to the end
+                       $this->lastKeyWrites[$key] = $now;
+               }
+               // Prune out the map if the first key is obsolete
+               if ( ( $now - reset( $this->lastKeyWrites ) ) > $this->consistencyWindow ) {
+                       $this->lastKeyWrites = array_filter(
+                               $this->lastKeyWrites,
+                               function ( $timestamp ) use ( $now ) {
+                                       return ( ( $now - $timestamp ) <= $this->consistencyWindow );
+                               }
+                       );
+               }
+       }
 }
index b88b496..2ce216d 100644 (file)
@@ -578,10 +578,14 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         *   - version: Integer version number signifiying the format of the value.
         *      Default: null
         *   - walltime: How long the value took to generate in seconds. Default: 0.0
+        * @codingStandardsIgnoreStart
+        * @phan-param array{lag?:int,since?:int,pending?:bool,lockTSE?:int,staleTTL?:int,creating?:bool,version?:?string,walltime?:int|float} $opts
+        * @codingStandardsIgnoreEnd
         * @note Options added in 1.28: staleTTL
         * @note Options added in 1.33: creating
         * @note Options added in 1.34: version, walltime
         * @return bool Success
+        * @suppress PhanTypeInvalidDimOffset
         */
        final public function set( $key, $value, $ttl = self::TTL_INDEFINITE, array $opts = [] ) {
                $now = $this->getCurrentTime();
@@ -1246,11 +1250,15 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         *      most sense for values that are moderately to highly expensive to regenerate and easy
         *      to query for dependency timestamps. The use of "pcTTL" reduces timestamp queries.
         *      Default: null.
+        * @codingStandardsIgnoreStart
+        * @phan-param array{checkKeys?:string[],graceTTL?:int,lockTSE?:int,busyValue?:mixed,pcTTL?:int,pcGroup?:string,version?:int,minAsOf?:int,hotTTR?:int,lowTTL?:int,ageNew?:int,staleTTL?:int,touchedCallback?:callable} $opts
+        * @codingStandardsIgnoreEnd
         * @return mixed Value found or written to the key
         * @note Options added in 1.28: version, busyValue, hotTTR, ageNew, pcGroup, minAsOf
         * @note Options added in 1.31: staleTTL, graceTTL
         * @note Options added in 1.33: touchedCallback
         * @note Callable type hints are not used to avoid class-autoloading
+        * @suppress PhanTypeInvalidDimOffset
         */
        final public function getWithSetCallback( $key, $ttl, $callback, array $opts = [] ) {
                $version = $opts['version'] ?? null;
@@ -1305,6 +1313,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         *   - Cached or regenerated value version number or null if not versioned
         *   - Timestamp of the current cached value at the key or null if there is no value
         * @note Callable type hints are not used to avoid class-autoloading
+        * @suppress PhanTypeArraySuspicious
         */
        private function fetchOrRegenerate( $key, $ttl, $callback, array $opts ) {
                $checkKeys = $opts['checkKeys'] ?? [];
@@ -1441,6 +1450,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                                $this->setInterimValue( $key, $value, $lockTSE, $version, $walltime );
                        } else {
                                $finalSetOpts = [
+                                       // @phan-suppress-next-line PhanTypeInvalidDimOffset
                                        'since' => $setOpts['since'] ?? $preCallbackTime,
                                        'version' => $version,
                                        'staleTTL' => $staleTTL,
@@ -2421,6 +2431,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         *   - curTTL: remaining time-to-live (negative if tombstoned) or null if there is no value
         *   - version: value version number or null if the if there is no value
         *   - tombAsOf: UNIX timestamp of the tombstone or null if there is no tombstone
+        * @phan-return array{0:mixed,1:array{asOf:?mixed,curTTL:?int|float,version:?mixed,tombAsOf:?mixed}}
         */
        private function unwrap( $wrapped, $now ) {
                $value = false;
index 084500a..6aa3f6f 100644 (file)
@@ -1487,6 +1487,8 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                $this->trxAtomicCounter = 0;
                $this->trxIdleCallbacks = []; // T67263; transaction already lost
                $this->trxPreCommitCallbacks = []; // T67263; transaction already lost
+               // Clear additional subclass fields
+               $this->doHandleSessionLossPreconnect();
                // @note: leave trxRecurringCallbacks in place
                if ( $this->trxDoneWrites ) {
                        $this->trxProfiler->transactionWritingOut(
@@ -1499,6 +1501,13 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                }
        }
 
+       /**
+        * Reset any additional subclass trx* and session* fields
+        */
+       protected function doHandleSessionLossPreconnect() {
+               // no-op
+       }
+
        /**
         * Clean things up after session (and thus transaction) loss after reconnect
         */
@@ -3522,7 +3531,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        if ( in_array( $entry[2], $sectionIds, true ) ) {
                                $callback = $entry[0];
                                $this->trxEndCallbacks[$key][0] = function () use ( $callback ) {
-                                       // @phan-suppress-next-line PhanInfiniteRecursion No recursion at all here, phan is confused
+                                       // @phan-suppress-next-line PhanInfiniteRecursion, PhanUndeclaredInvokeInCallable
                                        return $callback( self::TRIGGER_ROLLBACK, $this );
                                };
                                // This "on resolution" callback no longer belongs to a section.
@@ -3647,6 +3656,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                try {
                                        ++$count;
                                        list( $phpCallback ) = $callback;
+                                       // @phan-suppress-next-line PhanUndeclaredInvokeInCallable
                                        $phpCallback( $this );
                                } catch ( Exception $ex ) {
                                        ( $this->errorLogger )( $ex );
@@ -3682,6 +3692,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                        foreach ( $callbacks as $entry ) {
                                if ( $sectionIds === null || in_array( $entry[2], $sectionIds, true ) ) {
                                        try {
+                                               // @phan-suppress-next-line PhanUndeclaredInvokeInCallable
                                                $entry[0]( $trigger, $this );
                                        } catch ( Exception $ex ) {
                                                ( $this->errorLogger )( $ex );
index 8931ae2..106772b 100644 (file)
@@ -33,6 +33,7 @@ use stdClass;
  * @ingroup Database
  * @since 1.22
  * @see Database
+ * @phan-file-suppress PhanParamSignatureMismatch resource vs mysqli_result
  */
 class DatabaseMysqli extends DatabaseMysqlBase {
        /**
index 2977291..657d308 100644 (file)
@@ -55,7 +55,7 @@ class DatabaseSqlite extends Database {
        protected $lockMgr;
 
        /** @var array List of shared database already attached to this connection */
-       private $alreadyAttached = [];
+       private $sessionAttachedDbs = [];
 
        /** @var string[] See https://www.sqlite.org/lang_transaction.html */
        private static $VALID_TRX_MODES = [ '', 'DEFERRED', 'IMMEDIATE', 'EXCLUSIVE' ];
@@ -182,6 +182,7 @@ class DatabaseSqlite extends Database {
                        if ( in_array( $sync, [ 'EXTRA', 'FULL', 'NORMAL', 'OFF' ], true ) ) {
                                $this->query( "PRAGMA synchronous = $sync", __METHOD__, $flags );
                        }
+                       $this->attachDatabasesFromTableAliases();
                } catch ( Exception $e ) {
                        throw $this->newExceptionAfterConnectError( $e->getMessage() );
                }
@@ -1124,12 +1125,23 @@ class DatabaseSqlite extends Database {
 
        public function setTableAliases( array $aliases ) {
                parent::setTableAliases( $aliases );
+               if ( $this->isOpen() ) {
+                       $this->attachDatabasesFromTableAliases();
+               }
+       }
+
+       /**
+        * Issue ATTATCH statements for all unattached foreign DBs in table aliases
+        */
+       private function attachDatabasesFromTableAliases() {
                foreach ( $this->tableAliases as $params ) {
-                       if ( isset( $this->alreadyAttached[$params['dbname']] ) ) {
-                               continue;
+                       if (
+                               $params['dbname'] !== $this->getDBname() &&
+                               !isset( $this->sessionAttachedDbs[$params['dbname']] )
+                       ) {
+                               $this->attachDatabase( $params['dbname'] );
+                               $this->sessionAttachedDbs[$params['dbname']] = true;
                        }
-                       $this->attachDatabase( $params['dbname'] );
-                       $this->alreadyAttached[$params['dbname']] = true;
                }
        }
 
@@ -1147,6 +1159,10 @@ class DatabaseSqlite extends Database {
                return true;
        }
 
+       protected function doHandleSessionLossPreconnect() {
+               $this->sessionAttachedDbs = [];
+       }
+
        /**
         * @return PDO
         */
index b4eb89a..41f7cb6 100644 (file)
@@ -902,7 +902,7 @@ interface IDatabase {
         *   that field to. The data will be quoted by IDatabase::addQuotes().
         *   Values with integer keys form unquoted SET statements, which can be used for
         *   things like "field = field + 1" or similar computed values.
-        * @param array $conds An array of conditions (WHERE). See
+        * @param array|string $conds An array of conditions (WHERE). See
         *   IDatabase::select() for the details of the format of condition
         *   arrays. Use '*' to update all rows.
         * @param string $fname The function name of the caller (from __METHOD__),
@@ -959,7 +959,7 @@ interface IDatabase {
         * @param array $valuedata
         * @param string $valuename
         *
-        * @return string
+        * @return array|string
         * @deprecated Since 1.33
         */
        public function aggregateValue( $valuedata, $valuename = 'value' );
@@ -1287,7 +1287,7 @@ interface IDatabase {
         * @param string $joinTable The other table.
         * @param string $delVar The variable to join on, in the first table.
         * @param string $joinVar The variable to join on, in the second table.
-        * @param array $conds Condition array of field names mapped to variables,
+        * @param array|string $conds Condition array of field names mapped to variables,
         *   ANDed together in the WHERE clause
         * @param string $fname Calling function name (use __METHOD__) for logs/profiling
         * @throws DBError If an error occurs, see IDatabase::query()
index 54eca79..fa2c1db 100644 (file)
@@ -17,7 +17,7 @@ use UnexpectedValueException;
  * @see https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html
  */
 class MySQLMasterPos implements DBMasterPos {
-       /** @var int One of (BINARY_LOG, GTID_MYSQL, GTID_MARIA) */
+       /** @var string One of (BINARY_LOG, GTID_MYSQL, GTID_MARIA) */
        private $style;
        /** @var string|null Base name of all Binary Log files */
        private $binLog;
index 616fed9..9557251 100644 (file)
@@ -76,6 +76,7 @@ interface IResultWrapper extends Iterator {
 
        /**
         * @return stdClass
+        * @suppress PhanParamSignatureMismatchInternal
         */
        function next();
 }
index 77467f0..36e961a 100644 (file)
@@ -160,6 +160,9 @@ abstract class LBFactory implements ILBFactory {
        }
 
        public function destroy() {
+               /** @noinspection PhpUnusedLocalVariableInspection */
+               $scope = ScopedCallback::newScopedIgnoreUserAbort();
+
                $this->forEachLBCallMethod( 'disable' );
        }
 
@@ -177,6 +180,9 @@ abstract class LBFactory implements ILBFactory {
                &$cpIndex = null,
                &$cpClientId = null
        ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
+               $scope = ScopedCallback::newScopedIgnoreUserAbort();
+
                $chronProt = $this->getChronologyProtector();
                if ( $mode === self::SHUTDOWN_CHRONPROT_SYNC ) {
                        $this->shutdownChronologyProtector( $chronProt, $workCallback, 'sync', $cpIndex );
@@ -250,6 +256,9 @@ abstract class LBFactory implements ILBFactory {
 
        final public function beginMasterChanges( $fname = __METHOD__ ) {
                $this->assertTransactionRoundStage( self::ROUND_CURSORY );
+               /** @noinspection PhpUnusedLocalVariableInspection */
+               $scope = ScopedCallback::newScopedIgnoreUserAbort();
+
                $this->trxRoundStage = self::ROUND_BEGINNING;
                if ( $this->trxRoundId !== false ) {
                        throw new DBTransactionError(
@@ -265,6 +274,9 @@ abstract class LBFactory implements ILBFactory {
 
        final public function commitMasterChanges( $fname = __METHOD__, array $options = [] ) {
                $this->assertTransactionRoundStage( self::ROUND_CURSORY );
+               /** @noinspection PhpUnusedLocalVariableInspection */
+               $scope = ScopedCallback::newScopedIgnoreUserAbort();
+
                $this->trxRoundStage = self::ROUND_COMMITTING;
                if ( $this->trxRoundId !== false && $this->trxRoundId !== $fname ) {
                        throw new DBTransactionError(
@@ -272,8 +284,6 @@ abstract class LBFactory implements ILBFactory {
                                "$fname: transaction round '{$this->trxRoundId}' still running"
                        );
                }
-               /** @noinspection PhpUnusedLocalVariableInspection */
-               $scope = ScopedCallback::newScopedIgnoreUserAbort(); // try to ignore client aborts
                // Run pre-commit callbacks and suppress post-commit callbacks, aborting on failure
                do {
                        $count = 0; // number of callbacks executed this iteration
@@ -299,6 +309,9 @@ abstract class LBFactory implements ILBFactory {
        }
 
        final public function rollbackMasterChanges( $fname = __METHOD__ ) {
+               /** @noinspection PhpUnusedLocalVariableInspection */
+               $scope = ScopedCallback::newScopedIgnoreUserAbort();
+
                $this->trxRoundStage = self::ROUND_ROLLING_BACK;
                $this->trxRoundId = false;
                // Actually perform the rollback on all master DB connections and revert DBO_TRX
@@ -673,6 +686,9 @@ abstract class LBFactory implements ILBFactory {
        }
 
        public function closeAll() {
+               /** @noinspection PhpUnusedLocalVariableInspection */
+               $scope = ScopedCallback::newScopedIgnoreUserAbort();
+
                $this->forEachLBCallMethod( 'closeAll' );
        }
 
index 066d4b4..f60e8db 100644 (file)
@@ -68,7 +68,9 @@ class LoadBalancer implements ILoadBalancer {
        /** @var DatabaseDomain Local DB domain ID and default for selectDB() calls */
        private $localDomain;
 
-       /** @var Database[][][] Map of (connection category => server index => IDatabase[]) */
+       /**
+        * @var IDatabase[][][]|Database[][][] Map of (connection category => server index => IDatabase[])
+        */
        private $conns;
 
        /** @var array[] Map of (server index => server config array) */
@@ -99,7 +101,7 @@ class LoadBalancer implements ILoadBalancer {
        private $tableAliases = [];
        /** @var string[] Map of (index alias => index) */
        private $indexAliases = [];
-       /** @var array[] Map of (name => callable) */
+       /** @var callable[] Map of (name => callable) */
        private $trxRecurringCallbacks = [];
        /** @var bool[] Map of (domain => whether to use "temp tables only" mode) */
        private $tempTablesOnlyMode = [];
@@ -1301,23 +1303,7 @@ class LoadBalancer implements ILoadBalancer {
                $server['flags'] = $server['flags'] ?? IDatabase::DBO_DEFAULT;
 
                // Create a live connection object
-               try {
-                       $conn = Database::factory( $server['type'], $server );
-                       // Log when many connection are made on requests
-                       ++$this->connectionCounter;
-                       $currentConnCount = $this->getCurrentConnectionCount();
-                       if ( $currentConnCount >= self::CONN_HELD_WARN_THRESHOLD ) {
-                               $this->perfLogger->warning(
-                                       __METHOD__ . ": {connections}+ connections made (master={masterdb})",
-                                       [ 'connections' => $currentConnCount, 'masterdb' => $masterName ]
-                               );
-                       }
-               } catch ( DBConnectionError $e ) {
-                       // FIXME: This is probably the ugliest thing I have ever done to
-                       // PHP. I'm half-expecting it to segfault, just out of disgust. -- TS
-                       $conn = $e->db;
-               }
-
+               $conn = Database::factory( $server['type'], $server, Database::NEW_UNCONNECTED );
                $conn->setLBInfo( $server );
                $conn->setLazyMasterHandle(
                        $this->getLazyConnectionRef( self::DB_MASTER, [], $conn->getDomainID() )
@@ -1325,6 +1311,13 @@ class LoadBalancer implements ILoadBalancer {
                $conn->setTableAliases( $this->tableAliases );
                $conn->setIndexAliases( $this->indexAliases );
 
+               try {
+                       $conn->initConnection();
+                       ++$this->connectionCounter;
+               } catch ( DBConnectionError $e ) {
+                       // ignore; let the DB handle the logging
+               }
+
                if ( $server['serverIndex'] === $this->getWriterIndex() ) {
                        if ( $this->trxRoundId !== false ) {
                                $this->applyTransactionRoundFlags( $conn );
@@ -1336,6 +1329,19 @@ class LoadBalancer implements ILoadBalancer {
 
                $this->lazyLoadReplicationPositions(); // session consistency
 
+               // Log when many connection are made on requests
+               $count = $this->getCurrentConnectionCount();
+               if ( $count >= self::CONN_HELD_WARN_THRESHOLD ) {
+                       $this->perfLogger->warning(
+                               __METHOD__ . ": {connections}+ connections made (master={masterdb})",
+                               [
+                                       'connections' => $count,
+                                       'dbserver' => $conn->getServer(),
+                                       'masterdb' => $conn->getLBInfo( 'clusterMasterHost' )
+                               ]
+                       );
+               }
+
                return $conn;
        }
 
@@ -1498,6 +1504,11 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function closeAll() {
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
+
                $fname = __METHOD__;
                $this->forEachOpenConnection( function ( IDatabase $conn ) use ( $fname ) {
                        $host = $conn->getServer();
@@ -1544,6 +1555,10 @@ class LoadBalancer implements ILoadBalancer {
        public function finalizeMasterChanges( $fname = __METHOD__, $owner = null ) {
                $this->assertOwnership( $fname, $owner );
                $this->assertTransactionRoundStage( [ self::ROUND_CURSORY, self::ROUND_FINALIZED ] );
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
 
                $this->trxRoundStage = self::ROUND_ERROR; // "failed" until proven otherwise
                // Loop until callbacks stop adding callbacks on other connections
@@ -1569,6 +1584,10 @@ class LoadBalancer implements ILoadBalancer {
        public function approveMasterChanges( array $options, $fname = __METHOD__, $owner = null ) {
                $this->assertOwnership( $fname, $owner );
                $this->assertTransactionRoundStage( self::ROUND_FINALIZED );
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
 
                $limit = $options['maxWriteDuration'] ?? 0;
 
@@ -1609,6 +1628,10 @@ class LoadBalancer implements ILoadBalancer {
                        );
                }
                $this->assertTransactionRoundStage( self::ROUND_CURSORY );
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
 
                // Clear any empty transactions (no writes/callbacks) from the implicit round
                $this->flushMasterSnapshots( $fname );
@@ -1628,12 +1651,13 @@ class LoadBalancer implements ILoadBalancer {
        public function commitMasterChanges( $fname = __METHOD__, $owner = null ) {
                $this->assertOwnership( $fname, $owner );
                $this->assertTransactionRoundStage( self::ROUND_APPROVED );
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
 
                $failures = [];
 
-               /** @noinspection PhpUnusedLocalVariableInspection */
-               $scope = ScopedCallback::newScopedIgnoreUserAbort(); // try to ignore client aborts
-
                $restore = ( $this->trxRoundId !== false );
                $this->trxRoundId = false;
                $this->trxRoundStage = self::ROUND_ERROR; // "failed" until proven otherwise
@@ -1676,6 +1700,10 @@ class LoadBalancer implements ILoadBalancer {
                                "Transaction should be in the callback stage (not '{$this->trxRoundStage}')"
                        );
                }
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
 
                $oldStage = $this->trxRoundStage;
                $this->trxRoundStage = self::ROUND_ERROR; // "failed" until proven otherwise
@@ -1746,6 +1774,10 @@ class LoadBalancer implements ILoadBalancer {
                                "Transaction should be in the callback stage (not '{$this->trxRoundStage}')"
                        );
                }
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
 
                $e = null;
 
@@ -1764,6 +1796,10 @@ class LoadBalancer implements ILoadBalancer {
 
        public function rollbackMasterChanges( $fname = __METHOD__, $owner = null ) {
                $this->assertOwnership( $fname, $owner );
+               if ( $this->ownerId === null ) {
+                       /** @noinspection PhpUnusedLocalVariableInspection */
+                       $scope = ScopedCallback::newScopedIgnoreUserAbort();
+               }
 
                $restore = ( $this->trxRoundId !== false );
                $this->trxRoundId = false;
index 6494c26..172ead3 100644 (file)
@@ -84,7 +84,7 @@ class SamplingStatsdClient extends StatsdClient {
                        $data = [ $data ];
                }
                if ( !$data ) {
-                       return;
+                       return 0;
                }
                foreach ( $data as $item ) {
                        if ( !( $item instanceof StatsdDataInterface ) ) {
@@ -109,7 +109,7 @@ class SamplingStatsdClient extends StatsdClient {
                try {
                        $fp = $this->getSender()->open();
                        if ( !$fp ) {
-                               return;
+                               return 0;
                        }
                        foreach ( $data as $message ) {
                                $written += $this->getSender()->write( $fp, $message );
index ead290f..d27643c 100644 (file)
@@ -262,6 +262,10 @@ class BlockLogFormatter extends LogFormatter {
                return $params;
        }
 
+       /**
+        * @inheritDoc
+        * @suppress PhanTypeInvalidDimOffset
+        */
        public function formatParametersForApi() {
                $ret = parent::formatParametersForApi();
                if ( isset( $ret['flags'] ) ) {
index 170fc29..4fff1de 100644 (file)
@@ -64,7 +64,7 @@ abstract class LogEntryBase implements LogEntry {
         *
         * @since 1.26
         * @param string $blob
-        * @return array
+        * @return array|false
         */
        public static function extractParams( $blob ) {
                return unserialize( $blob );
index 15b149e..3871047 100644 (file)
@@ -258,7 +258,7 @@ class LogPager extends ReverseChronologicalPager {
                                $params[] = $db->anyString();
                        }
                        array_pop( $params ); // Get rid of the last % we added.
-                       $this->mConds[] = 'log_title' . $db->buildLike( $params );
+                       $this->mConds[] = 'log_title' . $db->buildLike( ...$params );
                } elseif ( $pattern && !$wgMiserMode ) {
                        $this->mConds[] = 'log_title' . $db->buildLike( $title->getDBkey(), $db->anyString() );
                        $this->pattern = $pattern;
index 1d0bbfd..5326705 100644 (file)
@@ -191,18 +191,20 @@ class ManualLogEntry extends LogEntryBase implements Taggable {
                        wfDebug( 'Overwriting existing ManualLogEntry tags' );
                }
                $this->tags = [];
-               if ( $tags !== null ) {
-                       $this->addTags( $tags );
-               }
+               $this->addTags( $tags );
        }
 
        /**
         * Add change tags for the log entry
         *
         * @since 1.33
-        * @param string|string[] $tags Tags to apply
+        * @param string|string[]|null $tags Tags to apply
         */
        public function addTags( $tags ) {
+               if ( $tags === null ) {
+                       return;
+               }
+
                if ( is_string( $tags ) ) {
                        $tags = [ $tags ];
                }
index d737a4b..9392220 100644 (file)
@@ -63,7 +63,7 @@ class PatrolLog {
                $entry->setTarget( $rc->getTitle() );
                $entry->setParameters( self::buildParams( $rc, $auto ) );
                $entry->setPerformer( $user );
-               $entry->setTags( $tags );
+               $entry->addTags( $tags );
                $logid = $entry->insert();
                if ( !$auto ) {
                        $entry->publish( $logid, 'udp' );
index fa9e1dc..9058340 100644 (file)
@@ -80,7 +80,7 @@ class ExifBitmapHandler extends BitmapHandler {
 
        /**
         * @param File $image
-        * @param array $metadata
+        * @param string $metadata
         * @return bool|int
         */
        public function isMetadataValid( $image, $metadata ) {
index f328760..3993795 100644 (file)
@@ -98,6 +98,7 @@ class FormatMetadata extends ContextSource {
         *   Exif::getFilteredData() or BitmapMetadataHandler )
         * @return array
         * @since 1.23
+        * @suppress PhanTypeArraySuspiciousNullable
         */
        public function makeFormattedData( $tags ) {
                $resolutionunit = !isset( $tags['ResolutionUnit'] ) || $tags['ResolutionUnit'] == 2 ? 2 : 3;
index 591ccf1..4e5c4ea 100644 (file)
@@ -282,6 +282,7 @@ class GIFMetadataExtractor {
                }
                $buf = unpack( 'C', $data )[1];
                $bpp = ( $buf & 7 ) + 1;
+               // @phan-suppress-next-line PhanTypeInvalidLeftOperandOfIntegerOp
                $buf >>= 7;
 
                $have_map = $buf & 1;
index 683ded1..c32db28 100644 (file)
@@ -36,6 +36,7 @@ class IPTC {
         *
         * @param string $rawData The app13 block from jpeg containing iptc/iim data
         * @return array IPTC metadata array
+        * @suppress PhanTypeArraySuspicious
         */
        static function parse( $rawData ) {
                $parsed = iptcparse( $rawData );
index 15c4dbf..880d382 100644 (file)
@@ -62,7 +62,7 @@ class TiffHandler extends ExifBitmapHandler {
         * @param string $ext
         * @param string $mime
         * @param array|null $params
-        * @return bool
+        * @return array
         */
        public function getThumbType( $ext, $mime, $params = null ) {
                global $wgTiffThumbnailType;
index 295a978..854c249 100644 (file)
@@ -182,6 +182,7 @@ class WebPHandler extends BitmapHandler {
         * Decodes a lossless chunk header
         * @param string $header First few bytes of the header, expected to be at least 13 bytes long
         * @return bool|array See WebPHandler::decodeHeader
+        * @suppress PhanTypeInvalidLeftOperandOfIntegerOp
         */
        public static function decodeLosslessChunkHeader( $header ) {
                // Bytes 0-3 are 'VP8L'
index 8ffe824..5e99ac9 100644 (file)
@@ -319,6 +319,7 @@ class ObjectCache {
         * @param array $params
         * @return WANObjectCache
         * @throws UnexpectedValueException
+        * @suppress PhanTypeMismatchReturn
         */
        public static function newWANCacheFromParams( array $params ) {
                global $wgCommandLineMode, $wgSecretKey;
index e634edc..d713396 100644 (file)
@@ -144,7 +144,7 @@ class SqlBagOStuff extends MediumSpecificBagOStuff {
                        $this->numServerShards = count( $this->serverInfos );
                } else {
                        // Default to using the main wiki's database servers
-                       $this->serverInfos = false;
+                       $this->serverInfos = [];
                        $this->numServerShards = 1;
                        $this->attrMap[self::ATTR_SYNCWRITES] = self::QOS_SYNCWRITES_BE;
                }
index d8cd1c5..3628c7b 100644 (file)
@@ -1935,6 +1935,7 @@ class Article implements Page {
                );
                $options = Xml::listDropDownOptionsOoui( $options );
 
+               $fields = [];
                $fields[] = new OOUI\FieldLayout(
                        new OOUI\DropdownInputWidget( [
                                'name' => 'wpDeleteReasonList',
index 491726b..dda13d3 100644 (file)
 /**
  * Special handling for category description pages, showing pages,
  * subcategories and file that belong to the category
+ *
+ * @property WikiCategoryPage $mPage Set by overwritten newPage() in this class
  */
 class CategoryPage extends Article {
        # Subclasses can change this to override the viewer class.
        protected $mCategoryViewerClass = CategoryViewer::class;
 
-       /**
-        * @var WikiCategoryPage
-        */
-       protected $mPage;
-
        /**
         * @param Title $title
         * @return WikiCategoryPage
index 799c33a..17a6d51 100644 (file)
@@ -77,7 +77,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        }
 
        public function getQueryInfo() {
-               return false;
+               return [];
        }
 
        /**
index 2e43e8c..d3f0638 100644 (file)
@@ -27,6 +27,8 @@ use Wikimedia\Rdbms\ResultWrapper;
  * Class for viewing MediaWiki file description pages
  *
  * @ingroup Media
+ *
+ * @property WikiFilePage $mPage Set by overwritten newPage() in this class
  */
 class ImagePage extends Article {
        /** @var File|false */
@@ -41,11 +43,6 @@ class ImagePage extends Article {
        /** @var bool */
        protected $mExtraDescription = false;
 
-       /**
-        * @var WikiFilePage
-        */
-       protected $mPage;
-
        /**
         * @param Title $title
         * @return WikiFilePage
index d69a433..40c63d2 100644 (file)
@@ -461,7 +461,7 @@ class PageArchive {
                $logEntry->setPerformer( $user );
                $logEntry->setTarget( $this->title );
                $logEntry->setComment( $comment );
-               $logEntry->setTags( $tags );
+               $logEntry->addTags( $tags );
                $logEntry->setParameters( [
                        ':assoc:count' => [
                                'revisions' => $textRestored,
index 4607535..4f0f2e2 100644 (file)
@@ -68,7 +68,9 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public $mLatest = false;
 
-       /** @var PreparedEdit Map of cache fields (text, parser output, ect) for a proposed/new edit */
+       /**
+        * @var PreparedEdit|false Map of cache fields (text, parser output, ect) for a proposed/new edit
+        */
        public $mPreparedEdit = false;
 
        /**
@@ -2390,7 +2392,7 @@ class WikiPage implements Page, IDBAccessObject {
                if ( !is_null( $nullRevision ) ) {
                        $logEntry->setAssociatedRevId( $nullRevision->getId() );
                }
-               $logEntry->setTags( $tags );
+               $logEntry->addTags( $tags );
                if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
                        $logEntry->setRelations( [ $logRelationsField => $logRelationsValues ] );
                }
@@ -2791,7 +2793,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $logEntry->setPerformer( $deleter );
                        $logEntry->setTarget( $logTitle );
                        $logEntry->setComment( $reason );
-                       $logEntry->setTags( $tags );
+                       $logEntry->addTags( $tags );
                        $logid = $logEntry->insert();
 
                        $dbw->onTransactionPreCommitOrIdle(
index 6416449..5eb799e 100644 (file)
@@ -48,6 +48,7 @@ class LinkHolderArray {
         * Reduce memory usage to reduce the impact of circular references
         */
        public function __destruct() {
+               // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach
                foreach ( $this as $name => $value ) {
                        unset( $this->$name );
                }
index 1873730..b56527a 100644 (file)
@@ -33,6 +33,9 @@ class PPDPart {
        //   commentEnd   Past-the-end input pointer for the last comment encountered
        //   visualEnd    Past-the-end input pointer for the end of the accumulator minus comments
 
+       /**
+        * @param string $out
+        */
        public function __construct( $out = '' ) {
                $this->out = $out;
        }
index 7507f06..327dd77 100644 (file)
@@ -25,6 +25,9 @@
 // phpcs:ignore Squiz.Classes.ValidClassName.NotCamelCaps
 class PPDPart_Hash extends PPDPart {
 
+       /**
+        * @param string $out
+        */
        public function __construct( $out = '' ) {
                if ( $out !== '' ) {
                        $accum = [ $out ];
index 26351b2..816548c 100644 (file)
@@ -35,9 +35,11 @@ class PPDStackElement_Hash extends PPDStackElement {
         *
         * @param int|bool $openingCount
         * @return array
+        * @suppress PhanParamSignatureMismatch
         */
        public function breakSyntax( $openingCount = false ) {
                if ( $this->open == "\n" ) {
+                       // @phan-suppress-next-line PhanTypeMismatchArgumentInternal
                        $accum = array_merge( [ $this->savedPrefix ], $this->parts[0]->out );
                } else {
                        if ( $openingCount === false ) {
@@ -59,6 +61,7 @@ class PPDStackElement_Hash extends PPDStackElement {
                                } else {
                                        $accum[++$lastIndex] = '|';
                                }
+                               // @phan-suppress-next-line PhanTypeMismatchForeach
                                foreach ( $part->out as $node ) {
                                        if ( is_string( $node ) && is_string( $accum[$lastIndex] ) ) {
                                                $accum[$lastIndex] .= $node;
index 79c7c3b..3f147f0 100644 (file)
@@ -69,6 +69,7 @@ interface PPFrame {
         * @param string $sep
         * @param int $flags
         * @param string|PPNode $args,...
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return string
         */
        public function implodeWithFlags( $sep, $flags /*, ... */ );
@@ -77,6 +78,7 @@ interface PPFrame {
         * Implode with no flags specified
         * @param string $sep
         * @param string|PPNode $args,...
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return string
         */
        public function implode( $sep /*, ... */ );
@@ -85,20 +87,22 @@ interface PPFrame {
         * Makes an object that, when expand()ed, will be the same as one obtained
         * with implode()
         * @param string $sep
-        * @param string|PPNode $args,...
+        * @param string|PPNode ...$args
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return PPNode
         */
-       public function virtualImplode( $sep /*, ... */ );
+       public function virtualImplode( $sep /* ...$args */ );
 
        /**
         * Virtual implode with brackets
         * @param string $start
         * @param string $sep
         * @param string $end
-        * @param string|PPNode $args,...
+        * @param string|PPNode ...$args
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return PPNode
         */
-       public function virtualBracketedImplode( $start, $sep, $end /*, ... */ );
+       public function virtualBracketedImplode( $start, $sep, $end /* ...$args */ );
 
        /**
         * Returns true if there are no arguments in this frame
index e3c12eb..00bfe98 100644 (file)
@@ -458,6 +458,7 @@ class PPFrame_DOM implements PPFrame {
         * @param string $sep
         * @param string|PPNode_DOM|DOMNode ...$args
         * @return array
+        * @suppress PhanParamSignatureMismatch
         */
        public function virtualImplode( $sep, ...$args ) {
                $out = [];
@@ -489,6 +490,7 @@ class PPFrame_DOM implements PPFrame {
         * @param string $end
         * @param string|PPNode_DOM|DOMNode ...$args
         * @return array
+        * @suppress PhanParamSignatureMismatch
         */
        public function virtualBracketedImplode( $start, $sep, $end, ...$args ) {
                $out = [ $start ];
index a19f86c..962313e 100644 (file)
@@ -411,8 +411,10 @@ class Parser {
         */
        public function __destruct() {
                if ( isset( $this->mLinkHolders ) ) {
+                       // @phan-suppress-next-line PhanTypeObjectUnsetDeclaredProperty
                        unset( $this->mLinkHolders );
                }
+               // @phan-suppress-next-line PhanTypeSuspiciousNonTraversableForeach
                foreach ( $this as $name => $value ) {
                        unset( $this->$name );
                }
@@ -2008,6 +2010,7 @@ class Parser {
         */
        public function replaceExternalLinks( $text ) {
                $bits = preg_split( $this->mExtLinkBracketedRegex, $text, -1, PREG_SPLIT_DELIM_CAPTURE );
+               // @phan-suppress-next-line PhanTypeComparisonFromArray See phan issue #3161
                if ( $bits === false ) {
                        throw new MWException( "PCRE needs to be compiled with "
                                . "--enable-unicode-properties in order for MediaWiki to function" );
@@ -4268,6 +4271,7 @@ class Parser {
         * @param bool $isMain
         * @return mixed|string
         * @private
+        * @suppress PhanTypeInvalidDimOffset
         */
        public function formatHeadings( $text, $origText, $isMain = true ) {
                # Inhibit editsection links if requested in the page
@@ -5574,6 +5578,7 @@ class Parser {
                Hooks::run( 'ParserMakeImageParams', [ $title, $file, &$params, $this ] );
 
                # Linker does the rest
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                $time = $options['time'] ?? false;
                $ret = Linker::makeImageLink( $this, $title, $file, $params['frame'], $params['handler'],
                        $time, $descQuery, $this->mOptions->getThumbSize() );
index 00c2903..8c44a5e 100644 (file)
@@ -540,6 +540,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
 
                if ( $this->options->get( 'EnableEmail' ) ) {
                        if ( $canViewPrivateInfo ) {
+                               $helpMessages = [];
                                $helpMessages[] = $this->options->get( 'EmailConfirmToEdit' )
                                                ? 'prefs-help-email-required'
                                                : 'prefs-help-email';
@@ -1726,6 +1727,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
         */
        protected function getTimeZoneList( Language $language ) {
                $identifiers = DateTimeZone::listIdentifiers();
+               // @phan-suppress-next-line PhanTypeComparisonFromArray See phan issue #3162
                if ( $identifiers === false ) {
                        return [];
                }
index 20f9a78..ab59efe 100644 (file)
@@ -1,7 +1,9 @@
 <?php
 
 class ProfilerExcimer extends Profiler {
+       /** @var ExcimerProfiler */
        private $cpuProf;
+       /** @var ExcimerProfiler */
        private $realProf;
        private $period;
 
index d0b7ae3..9b5b29e 100644 (file)
@@ -61,6 +61,7 @@ abstract class FormattedRCFeed extends RCFeed {
                        // @codeCoverageIgnoreStart
                        // T109544 - If a feed formatter returns null, this will otherwise cause an
                        // error in at least RedisPubSubFeedEngine. Not sure best to handle this.
+                       // @phan-suppress-next-line PhanTypeMismatchReturn
                        return;
                        // @codeCoverageIgnoreEnd
                }
index 3e65f6c..07fe318 100644 (file)
@@ -306,16 +306,6 @@ class ExtensionRegistry {
                                $autoloadNamespaces
                        );
 
-                       if ( isset( $info['AutoloadClasses'] ) ) {
-                               $autoload = $this->processAutoLoader( $dir, $info['AutoloadClasses'] );
-                               $GLOBALS['wgAutoloadClasses'] += $autoload;
-                               $autoloadClasses += $autoload;
-                       }
-                       if ( isset( $info['AutoloadNamespaces'] ) ) {
-                               $autoloadNamespaces += $this->processAutoLoader( $dir, $info['AutoloadNamespaces'] );
-                               AutoLoader::$psr4Namespaces += $autoloadNamespaces;
-                       }
-
                        // get all requirements/dependencies for this extension
                        $requires = $processor->getRequirements( $info, $this->checkDev );
 
index b11bd6f..d84a92a 100644 (file)
@@ -35,6 +35,7 @@ class DerivativeResourceLoaderContext extends ResourceLoaderContext {
         */
        private $context;
 
+       /** @var int|array */
        protected $modules = self::INHERIT_VALUE;
        protected $language = self::INHERIT_VALUE;
        protected $direction = self::INHERIT_VALUE;
@@ -54,6 +55,7 @@ class DerivativeResourceLoaderContext extends ResourceLoaderContext {
                if ( $this->modules === self::INHERIT_VALUE ) {
                        return $this->context->getModules();
                }
+
                return $this->modules;
        }
 
index e17b393..e5a0d61 100644 (file)
@@ -424,6 +424,7 @@ JAVASCRIPT;
                                $idx = -1;
                                foreach ( $grpModules as $name => $module ) {
                                        $shouldEmbed = $module->shouldEmbedModule( $context );
+                                       // @phan-suppress-next-line PhanTypeInvalidDimOffset
                                        if ( !$moduleSets || $moduleSets[$idx][0] !== $shouldEmbed ) {
                                                $moduleSets[++$idx] = [ $shouldEmbed, [] ];
                                        }
index c3948cb..95b8ff0 100644 (file)
@@ -55,6 +55,7 @@ class ResourceLoaderContext implements MessageLocalizer {
        protected $direction;
        protected $hash;
        protected $userObj;
+       /** @var ResourceLoaderImage|false */
        protected $imageObj;
 
        /**
@@ -214,6 +215,7 @@ class ResourceLoaderContext implements MessageLocalizer {
         * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
         *   or a MessageSpecifier.
         * @param mixed $args,...
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return Message
         */
        public function msg( $key ) {
index c6d4cdf..9c204fc 100644 (file)
@@ -98,7 +98,7 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
                if ( $module ) {
                        $dataPath = $this->getThemeImagesPath( $theme, $module );
                        if ( !$dataPath ) {
-                               return false;
+                               return [];
                        }
                } else {
                        // Backwards-compatibility for things that probably shouldn't have used this class...
@@ -137,6 +137,7 @@ class ResourceLoaderOOUIImageModule extends ResourceLoaderImageModule {
                                        $dataPath->getRemoteBasePath()
                                );
                        } else {
+                               // @phan-suppress-next-line PhanTypeSuspiciousStringExpression
                                $path = dirname( $dataPath ) . '/' . $path;
                        }
                };
index 680ae8e..dc43aed 100644 (file)
@@ -394,7 +394,7 @@ abstract class RevDelList extends RevisionListBase {
                }
                $logEntry->setRelations( $relations );
                // Apply change tags to the log entry
-               $logEntry->setTags( $params['tags'] );
+               $logEntry->addTags( $params['tags'] );
                $logId = $logEntry->insert();
                $logEntry->publish( $logId );
        }
index fb379c9..db13446 100644 (file)
@@ -107,6 +107,7 @@ abstract class RevisionListBase extends ContextSource implements Iterator {
        /**
         * Move the iteration pointer to the next list item, and return it.
         * @return Revision
+        * @suppress PhanParamSignatureMismatchInternal
         */
        public function next() {
                $this->res->next();
index 87a7861..66e59e5 100644 (file)
@@ -727,6 +727,7 @@ abstract class SearchEngine {
         * @param string $profileType the type of profiles
         * @param User|null $user the user requesting the list of profiles
         * @return array|null the list of profiles or null if none available
+        * @phan-return null|array{name:string,desc-message:string,default?:bool}
         */
        public function getProfiles( $profileType, User $user = null ) {
                return null;
index c635b97..fc117a8 100644 (file)
@@ -287,6 +287,7 @@ final class SessionManager implements SessionManagerInterface {
                                        "$provider returned empty session info with id flagged unsafe"
                                );
                        }
+                       // @phan-suppress-next-line PhanTypeInvalidDimOffset
                        $compare = $infos ? SessionInfo::compare( $infos[0], $info ) : -1;
                        if ( $compare > 0 ) {
                                continue;
@@ -410,6 +411,7 @@ final class SessionManager implements SessionManagerInterface {
                                $provider->setConfig( $this->config );
                                $provider->setManager( $this );
                                if ( isset( $this->sessionProviders[(string)$provider] ) ) {
+                                       // @phan-suppress-next-line PhanTypeSuspiciousStringExpression
                                        throw new \UnexpectedValueException( "Duplicate provider name \"$provider\"" );
                                }
                                $this->sessionProviders[(string)$provider] = $provider;
index 4ba7868..60eae42 100644 (file)
@@ -429,7 +429,8 @@ class Command {
 
                        // clear get_last_error without actually raising an error
                        // from https://www.php.net/manual/en/function.error-get-last.php#113518
-                       // TODO replace with clear_last_error when requirements are bumped to PHP7
+                       // TODO replace with error_clear_last after dropping HHVM
+                       // @phan-suppress-next-line PhanTypeMismatchArgumentInternal
                        set_error_handler( function () {
                        }, 0 );
                        AtEase::suppressWarnings();
index 19fa1da..74d77a8 100644 (file)
@@ -230,6 +230,7 @@ class Shell {
         * @param array $options Associative array of options:
         *     'php': The path to the php executable
         *     'wrapper': Path to a PHP wrapper to handle the maintenance script
+        * @phan-param array{php?:string,wrapper?:string} $options
         * @return Command
         */
        public static function makeScriptCommand( $script, $parameters, $options = [] ): Command {
@@ -237,6 +238,7 @@ class Shell {
                // Give site config file a chance to run the script in a wrapper.
                // The caller may likely want to call wfBasename() on $script.
                Hooks::run( 'wfShellWikiCmd', [ &$script, &$parameters, &$options ] );
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                $cmd = [ $options['php'] ?? $wgPhpCli ];
                if ( isset( $options['wrapper'] ) ) {
                        $cmd[] = $options['wrapper'];
index ec13765..bcf8b32 100644 (file)
@@ -89,7 +89,7 @@ class Site implements Serializable {
         *
         * @since 1.21
         *
-        * @var array[]
+        * @var array[]|false
         */
        protected $localIds = [];
 
index cad69a5..bee4aff 100644 (file)
@@ -33,6 +33,7 @@ abstract class BaseTemplate extends QuickTemplate {
         *
         * @param string $name Message name
         * @param mixed $params,... Message params
+        * @suppress PhanCommentParamWithoutRealParam HHVM bug T228695#5450847
         * @return Message
         */
        public function getMsg( $name /* ... */ ) {
@@ -443,8 +444,10 @@ abstract class BaseTemplate extends QuickTemplate {
         * @param array $item Array of list item data containing some of a specific set of keys.
         * The "id", "class" and "itemtitle" keys will be used as attributes for the list item,
         * if "active" contains a value of true a "active" class will also be appended to class.
+        * @phan-param array{id?:string,class?:string,itemtitle?:string,active?:bool} $item
         *
         * @param array $options
+        * @phan-param array{tag?:string} $options
         *
         * If you want something other than a "<li>" you can pass a tag name such as
         * "tag" => "span" in the $options array to change the tag used.
@@ -513,6 +516,7 @@ abstract class BaseTemplate extends QuickTemplate {
                if ( isset( $item['itemtitle'] ) ) {
                        $attrs['title'] = $item['itemtitle'];
                }
+               // @phan-suppress-next-line PhanTypeInvalidDimOffset
                return Html::rawElement( $options['tag'] ?? 'li', $attrs, $html );
        }
 
index ba7785c..9934150 100644 (file)
@@ -435,10 +435,11 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
                                if ( is_string( reset( $status ) ) ) {
                                        $status = Status::newFatal( ...$status );
                                } elseif ( is_array( reset( $status ) ) ) {
-                                       $status = Status::newGood();
+                                       $ret = Status::newGood();
                                        foreach ( $status as $message ) {
-                                               $status->fatal( ...$message );
+                                               $ret->fatal( ...$message );
                                        }
+                                       $status = $ret;
                                } else {
                                        throw new UnexpectedValueException( 'invalid HTMLForm::trySubmit() return value: '
                                                . 'first element of array is ' . gettype( reset( $status ) ) );
@@ -508,7 +509,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
         * Generates a HTMLForm descriptor array from a set of authentication requests.
         * @param AuthenticationRequest[] $requests
         * @param string $action AuthManager action name (one of the AuthManager::ACTION_* constants)
-        * @return array
+        * @return array[]
         */
        protected function getAuthFormDescriptor( $requests, $action ) {
                $fieldInfo = AuthenticationRequest::mergeFieldInfo( $requests );
@@ -599,7 +600,7 @@ abstract class AuthManagerSpecialPage extends SpecialPage {
        /**
         * Adds a sequential tabindex starting from 1 to all form elements. This way the user can
         * use the tab key to traverse the form without having to step through all links and such.
-        * @param array &$formDescriptor
+        * @param array[] &$formDescriptor
         */
        protected function addTabIndex( &$formDescriptor ) {
                $i = 1;
index 3893e92..0954c45 100644 (file)
@@ -1133,7 +1133,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *
         * There is light processing to simplify core maintenance.
         * @param array $definition
-        * @phan-param array<int,array{class:string}> $definition
+        * @phan-param array<int,array{class:string,filters:array}> $definition
         */
        protected function registerFiltersFromDefinitions( array $definition ) {
                $autoFillPriority = -1;
index 939460f..fb69f63 100644 (file)
@@ -150,10 +150,11 @@ abstract class FormSpecialPage extends SpecialPage {
        /**
         * Process the form on POST submission.
         * @param array $data
-        * @param HTMLForm $form
+        * @param HTMLForm|null $form
+        * @suppress PhanCommentParamWithoutRealParam Many implementations don't have $form
         * @return bool|string|array|Status As documented for HTMLForm::trySubmit.
         */
-       abstract public function onSubmit( array $data /* $form = null */ );
+       abstract public function onSubmit( array $data /* HTMLForm $form = null */ );
 
        /**
         * Do something exciting on successful processing of the form, most likely to show a
index d609d22..62818a1 100644 (file)
@@ -209,6 +209,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
 
        /**
         * @param string|null $subPage
+        * @suppress PhanTypeObjectUnsetDeclaredProperty
         */
        public function execute( $subPage ) {
                if ( $this->mPosted ) {
index f6b8b90..4c9c428 100644 (file)
@@ -64,7 +64,7 @@ class SpecialAllMessages extends SpecialPage {
                $opts->fetchValuesFromRequest( $this->getRequest() );
                $opts->validateIntBounds( 'limit', 0, 5000 );
 
-               $pager = new AllMessagesTablePager( $this->getContext(), $opts );
+               $pager = new AllMessagesTablePager( $this->getContext(), $opts, $this->getLinkRenderer() );
 
                $formDescriptor = [
                        'prefix' => [
index 59d2806..3a266f2 100644 (file)
@@ -1031,7 +1031,7 @@ class SpecialBlock extends FormSpecialPage {
                $logId = $logEntry->insert();
 
                if ( !empty( $data['Tags'] ) ) {
-                       $logEntry->setTags( $data['Tags'] );
+                       $logEntry->addTags( $data['Tags'] );
                }
 
                $logEntry->publish( $logId );
index 7f075ed..6059cea 100644 (file)
@@ -316,6 +316,8 @@ class SpecialBotPasswords extends FormSpecialPage {
                        'restrictions' => $data['restrictions'],
                        'grants' => array_merge(
                                MWGrants::getHiddenGrants(),
+                               // @phan-suppress-next-next-line PhanTypeMismatchArgumentInternal See phan issue #3163,
+                               // it's probably failing to infer the type of $data['grants']
                                preg_replace( '/^grant-/', '', $data['grants'] )
                        )
                ] );
index 9d5f430..4599b22 100644 (file)
@@ -213,7 +213,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                'hideMinor' => $this->opts['hideMinor'],
                                'nsInvert' => $this->opts['nsInvert'],
                                'associated' => $this->opts['associated'],
-                       ] );
+                       ], $this->getLinkRenderer() );
 
                        if ( IP::isValidRange( $target ) && !$pager->isQueryableRange( $target ) ) {
                                // Valid range, but outside CIDR limit.
@@ -364,6 +364,7 @@ class SpecialContributions extends IncludableSpecialPage {
 
                $linkRenderer = $sp->getLinkRenderer();
 
+               $tools = [];
                # No talk pages for IP ranges.
                if ( !$isRange ) {
                        $tools['user-talk'] = $linkRenderer->makeLink(
index 902bfd7..e9bf6a2 100644 (file)
@@ -93,7 +93,8 @@ class DeletedContributionsPage extends SpecialPage {
 
                $this->getForm();
 
-               $pager = new DeletedContribsPager( $this->getContext(), $target, $opts->getValue( 'namespace' ) );
+               $pager = new DeletedContribsPager( $this->getContext(), $target, $opts->getValue( 'namespace' ),
+                       $this->getLinkRenderer() );
                if ( !$pager->getNumRows() ) {
                        $out->addWikiMsg( 'nocontribs' );
 
index 480e81a..717edc3 100644 (file)
@@ -639,6 +639,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $linkRenderer = $this->getLinkRenderer();
                $link = $linkRenderer->makeLink( $title );
 
+               $tools = [];
                $tools['talk'] = $linkRenderer->makeLink(
                        $title->getTalkPage(),
                        $this->msg( 'talkpagelinktext' )->text()
index 94f4753..02a468b 100644 (file)
@@ -46,7 +46,8 @@ class SpecialListFiles extends IncludableSpecialPage {
                        $userName,
                        $search,
                        $this->including(),
-                       $showAll
+                       $showAll,
+                       $this->getLinkRenderer()
                );
 
                $out = $this->getOutput();
index 7f00311..33641cd 100644 (file)
@@ -264,6 +264,7 @@ class SpecialListGroupRights extends SpecialPage {
                ];
 
                foreach ( $changeGroups as $messageKey => $changeGroup ) {
+                       // @phan-suppress-next-line PhanTypeComparisonFromArray
                        if ( $changeGroup === true ) {
                                // For grep: listgrouprights-addgroup-all, listgrouprights-removegroup-all,
                                // listgrouprights-addgroup-self-all, listgrouprights-removegroup-self-all
index 85f65bb..6da362d 100644 (file)
@@ -285,11 +285,9 @@ class MovePageForm extends UnlistedSpecialPage {
                        # Is the title semi-protected?
                        if ( $this->oldTitle->isSemiProtected( 'move' ) ) {
                                $noticeMsg = 'semiprotectedpagemovewarning';
-                               $classes[] = 'mw-textarea-sprotected';
                        } else {
                                # Then it must be protected based on static groups (regular)
                                $noticeMsg = 'protectedpagemovewarning';
-                               $classes[] = 'mw-textarea-protected';
                        }
                        $out->addHTML( "<div class='mw-warning-with-logexcerpt'>\n" );
                        $out->addWikiMsg( $noticeMsg );
@@ -307,8 +305,9 @@ class MovePageForm extends UnlistedSpecialPage {
                // mediawiki.special.movePage module
 
                $immovableNamespaces = [];
+               $namespaceInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
                foreach ( array_keys( $this->getLanguage()->getNamespaces() ) as $nsId ) {
-                       if ( !MediaWikiServices::getInstance()->getNamespaceInfo()->isMovable( $nsId ) ) {
+                       if ( !$namespaceInfo->isMovable( $nsId ) ) {
                                $immovableNamespaces[] = $nsId;
                        }
                }
@@ -536,11 +535,14 @@ class MovePageForm extends UnlistedSpecialPage {
                        return;
                }
 
+               $services = MediaWikiServices::getInstance();
+
                # Show a warning if the target file exists on a shared repo
+               $repoGroup = $services->getRepoGroup();
                if ( $nt->getNamespace() == NS_FILE
                        && !( $this->moveOverShared && $user->isAllowed( 'reupload-shared' ) )
-                       && !RepoGroup::singleton()->getLocalRepo()->findFile( $nt )
-                       && MediaWikiServices::getInstance()->getRepoGroup()->findFile( $nt )
+                       && !$repoGroup->getLocalRepo()->findFile( $nt )
+                       && $repoGroup->findFile( $nt )
                ) {
                        $this->showForm( [ [ 'file-exists-sharedrepo' ] ] );
 
@@ -570,8 +572,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                        // Delete an associated image if there is
                        if ( $nt->getNamespace() == NS_FILE ) {
-                               $file = MediaWikiServices::getInstance()->getRepoGroup()->getLocalRepo()
-                                       ->newFile( $nt );
+                               $file = $repoGroup->getLocalRepo()->newFile( $nt );
                                $file->load( File::READ_LATEST );
                                if ( $file->exists() ) {
                                        $file->delete( $reason, false, $user );
@@ -606,7 +607,7 @@ class MovePageForm extends UnlistedSpecialPage {
                        $this->moveTalk = false;
                }
                if ( $this->moveSubpages ) {
-                       $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+                       $permissionManager = $services->getPermissionManager();
                        $this->moveSubpages = $permissionManager->userCan( 'move-subpages', $user, $ot );
                }
 
@@ -672,7 +673,7 @@ class MovePageForm extends UnlistedSpecialPage {
                 */
 
                // @todo FIXME: Use Title::moveSubpages() here
-               $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
+               $nsInfo = $services->getNamespaceInfo();
                $dbr = wfGetDB( DB_MASTER );
                if ( $this->moveSubpages && (
                        $nsInfo->hasSubpages( $nt->getNamespace() ) || (
@@ -749,7 +750,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                        $mp = new MovePage( $oldSubpage, $newSubpage );
                        # This was copy-pasted from Renameuser, bleh.
-                       if ( $newSubpage->exists() && !$mp->isValidMove()->isOk() ) {
+                       if ( $newSubpage->exists() && !$mp->isValidMove()->isOK() ) {
                                $link = $linkRenderer->makeKnownLink( $newSubpage );
                                $extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped();
                        } else {
index ecbbfd5..29e7789 100644 (file)
@@ -102,7 +102,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                        $this->buildForm( $context );
                }
 
-               $pager = new NewFilesPager( $context, $opts );
+               $pager = new NewFilesPager( $context, $opts, $this->getLinkRenderer() );
 
                $out->addHTML( $pager->getBody() );
                if ( !$this->including() ) {
index c0f004f..1f222f8 100644 (file)
@@ -253,7 +253,7 @@ class SpecialPageLanguage extends FormSpecialPage {
                $entry->setTarget( $title );
                $entry->setParameters( $logParams );
                $entry->setComment( $reason );
-               $entry->setTags( $tags );
+               $entry->addTags( $tags );
 
                $logid = $entry->insert();
                $entry->publish( $logid );
index 31c277a..9b8022b 100644 (file)
@@ -249,7 +249,7 @@ class SpecialUnblock extends SpecialPage {
                $logEntry->setComment( $data['Reason'] );
                $logEntry->setPerformer( $performer );
                if ( isset( $data['Tags'] ) ) {
-                       $logEntry->setTags( $data['Tags'] );
+                       $logEntry->addTags( $data['Tags'] );
                }
                $logEntry->setRelations( [ 'ipb_id' => $block->getId() ] );
                $logId = $logEntry->insert();
index 9a16a72..32be932 100644 (file)
@@ -247,6 +247,7 @@ class SpecialUndelete extends SpecialPage {
 
                $out->enableOOUI();
 
+               $fields = [];
                $fields[] = new OOUI\ActionFieldLayout(
                        new OOUI\TextInputWidget( [
                                'name' => 'prefix',
@@ -768,6 +769,7 @@ class SpecialUndelete extends SpecialPage {
                }
 
                if ( $this->mAllowed && ( $haveRevisions || $haveFiles ) ) {
+                       $fields = [];
                        $fields[] = new OOUI\Layout( [
                                'content' => new OOUI\HtmlSnippet( $this->msg( 'undeleteextrahelp' )->parseAsBlock() )
                        ] );
index 87534eb..a45ccca 100644 (file)
@@ -464,7 +464,7 @@ class UserrightsPage extends SpecialPage {
                ] );
                $logid = $logEntry->insert();
                if ( count( $tags ) ) {
-                       $logEntry->setTags( $tags );
+                       $logEntry->addTags( $tags );
                }
                $logEntry->publish( $logid );
        }
index 18c10bf..2840086 100644 (file)
@@ -117,6 +117,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $fetchlinks = ( !$hidelinks || !$hideredirs );
 
                // Build query conds in concert for all three tables...
+               $conds = [];
                $conds['pagelinks'] = [
                        'pl_namespace' => $target->getNamespace(),
                        'pl_title' => $target->getDBkey(),
@@ -229,6 +230,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                // Read the rows into an array and remove duplicates
                // templatelinks comes second so that the templatelinks row overwrites the
                // pagelinks row, so we get (inclusion) rather than nothing
+               $rows = [];
                if ( $fetchlinks ) {
                        foreach ( $plRes as $row ) {
                                $row->is_template = 0;
index be28417..1e5f816 100644 (file)
@@ -40,6 +40,7 @@ class UploadForm extends HTMLForm {
 
        protected $mMaxFileSize = [];
 
+       /** @var array */
        protected $mMaxUploadSize = [];
 
        public function __construct( array $options = [], IContextSource $context = null,
index 8063804..938b159 100644 (file)
@@ -30,6 +30,9 @@ class ImportReporter extends ContextSource {
        private $mOriginalLogCallback = null;
        private $mOriginalPageOutCallback = null;
        private $mLogItemCount = 0;
+       private $mPageCount;
+       private $mIsUpload;
+       private $mInterwiki;
 
        /**
         * @param WikiImporter $importer
@@ -160,7 +163,7 @@ class ImportReporter extends ContextSource {
                        // Make sure the null revision will be tagged as well
                        $logEntry->setAssociatedRevId( $nullRevId );
                        if ( count( $this->logTags ) ) {
-                               $logEntry->setTags( $this->logTags );
+                               $logEntry->addTags( $this->logTags );
                        }
                        $logid = $logEntry->insert();
                        $logEntry->publish( $logid );
index 45d77ce..c804b09 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Linker\LinkRenderer;
 use Wikimedia\Rdbms\FakeResultWrapper;
 
 /**
@@ -58,9 +59,12 @@ class AllMessagesTablePager extends TablePager {
        /**
         * @param IContextSource|null $context
         * @param FormOptions $opts
+        * @param LinkRenderer $linkRenderer
         */
-       public function __construct( IContextSource $context = null, FormOptions $opts ) {
-               parent::__construct( $context );
+       public function __construct( IContextSource $context = null, FormOptions $opts,
+               LinkRenderer $linkRenderer
+       ) {
+               parent::__construct( $context, $linkRenderer );
 
                $this->mIndexField = 'am_title';
                // FIXME: Why does this need to be set to DIR_DESCENDING to produce ascending ordering?
@@ -354,7 +358,7 @@ class AllMessagesTablePager extends TablePager {
        }
 
        function getQueryInfo() {
-               return '';
+               return [];
        }
 
 }
index 77b7326..6faf22b 100644 (file)
@@ -70,6 +70,12 @@ class BlockListPager extends TablePager {
                return $headers;
        }
 
+       /**
+        * @param string $name
+        * @param string $value
+        * @return string
+        * @suppress PhanTypeArraySuspiciousNullable,PhanTypeArraySuspicious
+        */
        function formatValue( $name, $value ) {
                static $msg = null;
                if ( $msg === null ) {
@@ -132,6 +138,7 @@ class BlockListPager extends TablePager {
                                        /* User preference timezone */true
                                ) );
                                if ( $this->getUser()->isAllowed( 'block' ) ) {
+                                       $links = [];
                                        if ( $row->ipb_auto ) {
                                                $links[] = $linkRenderer->makeKnownLink(
                                                        SpecialPage::getTitleFor( 'Unblock' ),
index b80a584..d76dfb8 100644 (file)
@@ -24,6 +24,7 @@
  * @ingroup Pager
  */
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
@@ -97,7 +98,9 @@ class ContribsPager extends RangeChronologicalPager {
         */
        private $templateParser;
 
-       public function __construct( IContextSource $context, array $options ) {
+       public function __construct( IContextSource $context, array $options,
+               LinkRenderer $linkRenderer = null
+       ) {
                // Set ->target before calling parent::__construct() so
                // parent can call $this->getIndexField() and get the right result. Set
                // the rest too just to keep things simple.
@@ -112,7 +115,7 @@ class ContribsPager extends RangeChronologicalPager {
                $this->newOnly = !empty( $options['newOnly'] );
                $this->hideMinor = !empty( $options['hideMinor'] );
 
-               parent::__construct( $context );
+               parent::__construct( $context, $linkRenderer );
 
                $msgs = [
                        'diff',
@@ -439,16 +442,6 @@ class ContribsPager extends RangeChronologicalPager {
                return $this->tagFilter;
        }
 
-       /**
-        * @deprecated since 1.34, redundant.
-        *
-        * @return string "users"
-        */
-       public function getContribs() {
-               // Brought back for backwards compatibility, see T231540.
-               return 'users';
-       }
-
        /**
         * @return string
         */
index 7dbfae8..cd6294d 100644 (file)
@@ -22,6 +22,7 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
@@ -60,8 +61,10 @@ class DeletedContribsPager extends IndexPager {
         */
        protected $mNavigationBar;
 
-       public function __construct( IContextSource $context, $target, $namespace = false ) {
-               parent::__construct( $context );
+       public function __construct( IContextSource $context, $target, $namespace = false,
+               LinkRenderer $linkRenderer
+       ) {
+               parent::__construct( $context, $linkRenderer );
                $msgs = [ 'deletionlog', 'undeleteviewlink', 'diff' ];
                foreach ( $msgs as $msg ) {
                        $this->messages[$msg] = $this->msg( $msg )->text();
index 81b7808..5de3ecb 100644 (file)
@@ -22,6 +22,7 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
@@ -51,7 +52,7 @@ class ImageListPager extends TablePager {
        protected $mTableName = 'image';
 
        public function __construct( IContextSource $context, $userName = null, $search = '',
-               $including = false, $showAll = false
+               $including = false, $showAll = false, LinkRenderer $linkRenderer
        ) {
                $this->setContext( $context );
 
@@ -96,7 +97,7 @@ class ImageListPager extends TablePager {
                        $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                }
 
-               parent::__construct();
+               parent::__construct( $context, $linkRenderer );
        }
 
        /**
index 2cb2b4a..f1b0b9a 100644 (file)
@@ -22,6 +22,7 @@
 /**
  * @ingroup Pager
  */
+use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
 
 class NewFilesPager extends RangeChronologicalPager {
@@ -39,9 +40,12 @@ class NewFilesPager extends RangeChronologicalPager {
        /**
         * @param IContextSource $context
         * @param FormOptions $opts
+        * @param LinkRenderer $linkRenderer
         */
-       public function __construct( IContextSource $context, FormOptions $opts ) {
-               parent::__construct( $context );
+       public function __construct( IContextSource $context, FormOptions $opts,
+               LinkRenderer $linkRenderer
+       ) {
+               parent::__construct( $context, $linkRenderer );
 
                $this->opts = $opts;
                $this->setLimit( $opts->getValue( 'limit' ) );
index fb9dcf5..3368e29 100644 (file)
@@ -1763,7 +1763,6 @@ abstract class UploadBase {
         * Check a block of CSS or CSS fragment for anything that looks like
         * it is bringing in remote code.
         * @param string $value a string of CSS
-        * @param bool $propOnly only check css properties (start regex with :)
         * @return bool true if the CSS contains an illegal string, false if otherwise
         */
        private static function checkCssFragment( $value ) {
index aada319..fd8eb3f 100644 (file)
@@ -70,8 +70,6 @@ class PasswordReset implements LoggerAwareInterface {
        /**
         * Check if a given user has permission to use this functionality.
         * @param User $user
-        * @param bool $displayPassword If set, also check whether the user is allowed to reset the
-        *   password of another user and see the temporary password.
         * @since 1.29 Second argument for displayPassword removed.
         * @return StatusValue
         */
index b0ee5cb..82f2ddc 100644 (file)
@@ -110,12 +110,6 @@ class User implements IDBAccessObject, UserIdentity {
                'mActorId',
        ];
 
-       /**
-        * @var string[]
-        * @var string[] Cached results of getAllRights()
-        */
-       protected static $mAllRights = false;
-
        /** Cache variables */
        // @{
        /** @var int */
@@ -3602,6 +3596,7 @@ class User implements IDBAccessObject, UserIdentity {
         *
         * @param string $permissions,... Permissions to test
         * @return bool True if user is allowed to perform *any* of the given actions
+        * @suppress PhanCommentParamOnEmptyParamList Cannot make variadic due to HHVM bug, T191668#5263929
         */
        public function isAllowedAny() {
                return MediaWikiServices::getInstance()
@@ -3614,6 +3609,7 @@ class User implements IDBAccessObject, UserIdentity {
         * ->getPermissionManager()->userHasAllRights(...) instead
         * @param string $permissions,... Permissions to test
         * @return bool True if the user is allowed to perform *all* of the given actions
+        * @suppress PhanCommentParamOnEmptyParamList Cannot make variadic due to HHVM bug, T191668#5263929
         */
        public function isAllowedAll() {
                return MediaWikiServices::getInstance()
@@ -5117,6 +5113,7 @@ class User implements IDBAccessObject, UserIdentity {
         * @return bool
         */
        public function addNewUserLogEntryAutoCreate() {
+               wfDeprecated( __METHOD__, '1.27' );
                $this->addNewUserLogEntry( 'autocreate' );
 
                return true;
index b7d5058..c185bab 100644 (file)
@@ -65,6 +65,6 @@ class UserNamePrefixSearch {
                        $joinConds
                );
 
-               return $res === false ? [] : $res;
+               return $res;
        }
 }
index 153b313..b2d6077 100644 (file)
@@ -124,6 +124,7 @@ class AvroValidator {
                                        $errors[] = $result;
                                }
                                if ( $errors ) {
+                                       // @phan-suppress-next-line PhanTypeMismatchReturn
                                        return [ "Expected any one of these to be true", $errors ];
                                }
                                return "No schemas provided to union";
index 12b8a70..cf62f6d 100644 (file)
@@ -39,7 +39,7 @@ class ClassCollector {
        protected $startToken;
 
        /**
-        * @var array List of tokens that are members of the current expect sequence
+        * @var array[]|string[] List of tokens that are members of the current expect sequence
         */
        protected $tokens;
 
@@ -126,7 +126,7 @@ class ClassCollector {
        /**
         * Accepts the next token in an expect sequence
         *
-        * @param array $token
+        * @param array|string $token
         */
        protected function tryEndExpect( $token ) {
                switch ( $this->startToken[0] ) {
index e7846f4..4207d41 100644 (file)
@@ -369,6 +369,7 @@ class ZipDirectoryReader {
         * Read the central directory at the given location
         * @param int $offset
         * @param int $size
+        * @suppress PhanTypeInvalidLeftOperandOfIntegerOp
         */
        function readCentralDirectory( $offset, $size ) {
                $block = $this->getBlock( $offset, $size );
index 392e46d..7737067 100644 (file)
@@ -20,6 +20,7 @@ class ComplexTitleInputWidget extends \OOUI\Widget {
         *   - array $config['namespace'] Configuration for the NamespaceInputWidget dropdown
         *     with list of namespaces
         *   - array $config['title'] Configuration for the TitleInputWidget text field
+        * @phan-param array{namespace?:array,title?:array} $config
         */
        public function __construct( array $config = [] ) {
                // Configuration initialization
index 62ee9cb..fedac4b 100644 (file)
@@ -148,6 +148,7 @@ class SearchFormWidget {
         * @param string $profile The currently selected profile
         * @param string $term The user provided search terms
         * @return string HTML
+        * @suppress PhanTypeArraySuspiciousNullable
         */
        protected function profileTabsHtml( $profile, $term ) {
                $bareterm = $this->startsWithImage( $term )
index bb256c9..7ee6a65 100644 (file)
@@ -61,7 +61,9 @@ class Language {
 
        public $mVariants, $mCode, $mLoaded = false;
        public $mMagicExtensions = [];
-       private $mHtmlCode = null, $mParentLanguage = false;
+       private $mHtmlCode = null;
+       /** @var Language|false */
+       private $mParentLanguage = false;
 
        public $dateFormatStrings = [];
        public $mExtendedSpecialPageAliases;
@@ -455,6 +457,7 @@ class Language {
        }
 
        function __construct() {
+               // @phan-suppress-next-line PhanTypeMismatchProperty
                $this->mConverter = new FakeConverter( $this );
                // Set the code to the name of the descendant
                if ( static::class === 'Language' ) {
@@ -467,6 +470,7 @@ class Language {
 
        /**
         * Reduce memory usage
+        * @suppress PhanTypeSuspiciousNonTraversableForeach
         */
        function __destruct() {
                foreach ( $this as $name => $value ) {
@@ -524,6 +528,7 @@ class Language {
                        }
 
                        # Sometimes a language will be localised but not actually exist on this wiki.
+                       // @phan-suppress-next-line PhanTypeMismatchForeach
                        foreach ( $this->namespaceNames as $key => $text ) {
                                if ( !isset( $validNamespaces[$key] ) ) {
                                        unset( $this->namespaceNames[$key] );
@@ -532,6 +537,7 @@ class Language {
 
                        # The above mixing may leave namespaces out of canonical order.
                        # Re-order by namespace ID number...
+                       // @phan-suppress-next-line PhanTypeMismatchArgumentInternal
                        ksort( $this->namespaceNames );
 
                        Hooks::run( 'LanguageGetNamespaces', [ &$this->namespaceNames ] );
@@ -3232,6 +3238,7 @@ class Language {
                $fallbackChain = array_reverse( $fallbackChain );
                foreach ( $fallbackChain as $code ) {
                        if ( isset( $newWords[$code] ) ) {
+                               // @phan-suppress-next-line PhanTypeMismatchProperty
                                $this->mMagicExtensions = $newWords[$code] + $this->mMagicExtensions;
                        }
                }
index 61a967d..350aa67 100644 (file)
@@ -63,8 +63,7 @@ class LanguageConverter {
        public $mTablesLoaded = false;
 
        /**
-        * @var ReplacementArray[]
-        * @phan-var array<string,ReplacementArray>
+        * @var ReplacementArray[]|bool[]
         */
        public $mTables;
 
@@ -958,7 +957,7 @@ class LanguageConverter {
                }
 
                $this->mTablesLoaded = true;
-               $this->mTables = false;
+               $this->mTables = null;
                $cache = ObjectCache::getInstance( $wgLanguageConverterCacheType );
                $cacheKey = $cache->makeKey( 'conversiontables', $this->mMainLanguageCode );
                if ( $fromCache ) {
@@ -996,6 +995,7 @@ class LanguageConverter {
         */
        private function reloadTables() {
                if ( $this->mTables ) {
+                       // @phan-suppress-next-line PhanTypeObjectUnsetDeclaredProperty
                        unset( $this->mTables );
                }
 
index 00f35b2..353127d 100644 (file)
@@ -95,7 +95,7 @@ class Names {
                'bh' => 'भोजपुरी', # Bihari macro language. Falls back to Bhojpuri (bho)
                'bho' => 'भोजपुरी', # Bhojpuri
                'bi' => 'Bislama', # Bislama
-               'bjn' => 'Bahasa Banjar', # Banjarese
+               'bjn' => 'Banjar', # Banjarese
                'bm' => 'bamanankan', # Bambara
                'bn' => 'বাংলা', # Bengali
                'bo' => 'བོད་ཡིག', # Tibetan
@@ -414,7 +414,7 @@ class Names {
                'st' => 'Sesotho', # Southern Sotho
                'sty' => 'cебертатар', # Siberian Tatar
                'stq' => 'Seeltersk', # Saterland Frisian
-               'su' => 'Basa Sunda', # Sundanese
+               'su' => 'Sunda', # Sundanese
                'sv' => 'svenska', # Swedish
                'sw' => 'Kiswahili', # Swahili
                'szl' => 'ślůnski', # Silesian
index 7f55386..65c46bb 100644 (file)
        "watchthispage": "Kalön ôn nyoë",
        "unwatch": "Bateuë kalön",
        "watchlist-details": "Na {{PLURAL:$1|$1 laman}} lam dapeuta keunalön-neuh (rôh laman marit).",
-       "wlshowlast": "Peuleumah $1 jeum $2 uroe seuneulheueh",
        "watchlist-hide": "Peusom",
        "watchlist-options": "Peuniléh dapeuta kalön",
        "watching": "Kalön...",
index 4c20604..9b06853 100644 (file)
        "watch": "راقب",
        "unwatch": "أوقف المراقبة",
        "watchlist-details": "{{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} في قائمة مراقبتك، بدون عد صفحات النقاش.",
-       "wlshowlast": "عرض آخر $1 ساعات $2 أيام",
        "watchlist-options": "خيارات قائمة المراقبة",
        "actioncomplete": "انتهاء العملية",
        "actionfailed": "الفعل فشل",
index 4eb941f..636fc59 100644 (file)
        "wlheader-enotif": "E-pos kennisgewings is aangeskakel.",
        "wlheader-showupdated": "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys.",
        "wlnote": "Hier volg die laaste {{PLURAL:$1|verandering|<strong>$1</strong> veranderings}} binne die laaste {{PLURAL:$2|uur|<strong>$2</strong> ure}}, soos op $3 om $4.",
-       "wlshowlast": "Wys afgelope $1 ure, $2 dae",
        "watchlist-hide": "Versteek",
        "watchlist-submit": "Wys",
        "wlshowtime": "Wys laaste:",
        "imgmultigoto": "Gaan na bladsy $1",
        "img-lang-default": "(standaard taal)",
        "img-lang-go": "OK",
-       "ascending_abbrev": "op",
-       "descending_abbrev": "af",
        "table_pager_next": "Volgende bladsy",
        "table_pager_prev": "Vorige bladsy",
        "table_pager_first": "Eerste bladsy",
index 6b88056..1e2ada3 100644 (file)
        "wlheader-enotif": "mawawah tuway imyiyo(email) patakus sasahicaan.",
        "wlheader-showupdated": "i tisuwan sazikuz tu ciwsace sazikuzay misumad tu kasabelih a u <strong>kibetulay</strong> paazih",
        "wlnote": "isasa’ay {{PLURAL:$1|u nazikuzay a sumad|u nazikuzay <strong>$1</strong> sumad}} i inazikuzay {{PLURAL:$2|tuki|<strong>$2</strong> tuki}}, itawya $3, $4.",
-       "wlshowlast": "paazih capi demaid $1 tuki $2 demiad",
        "watchlist-hide": "midimut",
        "watchlist-submit": "paazih",
        "wlshowtime": "apaazihay a tuki-tenes:",
        "img-lang-default": "(pataayaw tu kawaw a kamu)",
        "img-lang-info": "paazih tina zunga i $1. $2",
        "img-lang-go": "mileku",
-       "ascending_abbrev": "masalaylay adidi’ay katukuh tabakiay",
-       "descending_abbrev": "masalaylay tabakiay katukuh adidi’ay",
        "table_pager_next": "zikuzan a belih",
        "table_pager_first": "sakacacay a belih",
        "table_pager_last": "sazikuzay a kasabelih",
index b185335..3d0da95 100644 (file)
        "watchthispage": "Mbikëqyr këtë faqe",
        "unwatch": "Çmbikqyre",
        "watchlist-details": "{{PLURAL:$1|$1 faqe|$1 faqe}} në listën tuej të mbikëqyrjes, pa i numrue faqet e diskutimit.",
-       "wlshowlast": "Trego $1 orët $2 ditët  e fundit",
        "watchlist-options": "Opcionet e listës së mbikëqyrjes",
        "watching": "Tuj mbikqyrë...",
        "unwatching": "Tuj çmbikqyrë...",
index 5d2548d..20d72d8 100644 (file)
        "wlheader-enotif": "የ-ኢሜል ማስታወቂያ እንዲሠራ ተደርጓል።",
        "wlheader-showupdated": "መጨረሻ ከጎበኟቸው ጀምሮ የተቀየሩት ገጾች በ'''ጉልህ ፊደላት''' ይታያሉ",
        "wlnote": "ባለፉት <b>$2</b> ሰዓቶች የተደረጉት $1 መጨረሻ ለውጦች እታች ይገኛሉ።",
-       "wlshowlast": "ያለፉት $1 ሰዓት፤ $2 ቀን፤  ይታዩ።",
        "watchlist-options": "የዝርዝሩ ምርጫዎች",
        "watching": "እየተጨመረ ነው...",
        "unwatching": "እየተወገደ ነው...",
index 3ce25eb..e9634e3 100644 (file)
        "watchlist-details": "o pirorodan to ’a’arawen a tilid iso i, $1 ko felih (halo- kalalicay a felih )。",
        "wlheader-showupdated": "O pakarikoray nisongila’an a minengneng ato nisalofan a felih i, oya <strong>kifetolay sorit </strong> ko sapasapinang.",
        "wlnote": " i kalaenoay nani $3 $4 i ka’ayaway i <strong>$2</strong> mihalakaan i ’ayaw no pinapina a tatokian  <strong>$1</strong> kina--- a mifalic.",
-       "wlshowlast": "pahapinang to ngata $1 a tatokian $2 a romi’ad",
        "watchlist-hide": " himed",
        "watchlist-submit": "pahapinang",
        "enotif_reset": " pahapinangen kona felih a maemin o matiri’ay to",
index 847c189..7b105b8 100644 (file)
        "wlheader-enotif": "A notificación por correu electronico ye activata",
        "wlheader-showupdated": "Las pachinas cambiadas dende a suya zaguer vesita s'amuestran en '''negreta'''",
        "wlnote": "Contino se i {{PLURAL:$1|amuestra o solo cambeo|amuestran os zaguers '''$1''' cambeos}} feitos en {{PLURAL:$2|a zaguer hora|as zagueras '''$2''' horas}}, o $3 a las $4.",
-       "wlshowlast": "Amostrar as zagueras $1 horas, $2 días u",
        "watchlist-options": "Opcions d'a lista de seguimiento",
        "watching": "Cosirando...",
        "unwatching": "Deixar de cosirar...",
        "imgmultipagenext": "pachina siguient →",
        "imgmultigo": "Ir-ie!",
        "imgmultigoto": "Ir t'a pachina $1",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Pachina siguient",
        "table_pager_prev": "Pachina anterior",
        "table_pager_first": "Primera pachina",
index 161fabe..69b7580 100644 (file)
        "unwatchthispage": "Ablinnan behealdunge",
        "watchlist-details": "{{PLURAL:$1|Þǣr is $1 tramet|Þǣr sind $1 trameta}} on þīnum behealdunggetæle, nā sunderlīce arīmedum mōtunga trametum.",
        "wlnote": "Niðer {{PLURAL:$1|is sēo nīwoste andwendung|sind þā nīwostan '''$1''' andwendunga}} in {{PLURAL:$2|þǣre nīwostan tīde|þǣm nīwostum '''$2''' tīda}}, fram $4 of $3.",
-       "wlshowlast": "Īwan þā nīwostan $1 tīda $2 daga",
        "watchlist-options": "Behealdungtæles cyras",
        "watching": "Behealdende...",
        "unwatching": "Ablinnende behealdunge...",
index e5bb385..300dc82 100644 (file)
        "watchlist-details": " {{PLURAL:$1|$1 पृष्ठ}} आपन॑ के ध्यानसूची म॑ छै (वार्ता पृष्ठऽ के अलावा)।",
        "wlheader-showupdated": "आपन॑ के देखला गेला के बाद जोन पृष्ठऽ म॑ बदलाव होतै, ओकरऽ कड़ी <strong>गहरा</strong> रंग के दिखतै।",
        "wlnote": "$3 क॑ $4 बजे तलक पिछला <strong>$2</strong> {{PLURAL:$2|घंटा|घंटां}} म॑ {{PLURAL:$1|हुआ एक|होलै <strong>$1</strong>}} परिवर्तन निम्न {{PLURAL:$1|छै|छैं}}।",
-       "wlshowlast": "पिछला $1 घंटा $2 दिन  देखऽ",
        "watchlist-options": "ध्यानसूची विकल्प",
        "watching": "ध्यान दय रहलॊ छै...",
        "unwatching": "ध्यान हटाय रहलॊ छियै...",
index 2ece1bd..52b77fd 100644 (file)
        "nocreate-loggedin": "أنت لا تمتلك الصلاحية لإنشاء صفحات جديدة.",
        "sectioneditnotsupported-title": "تعديل الأقسام غير مدعوم",
        "sectioneditnotsupported-text": "تعديل الأقسام غير مدعوم في هذه الصفحة",
+       "modeleditnotsupported-title": "التحرير غير مدعوم",
+       "modeleditnotsupported-text": "التحرير غير مدعوم لنموذج المحتوى $1.",
        "permissionserrors": "خطأ في السماح",
        "permissionserrorstext": "لا تمتلك الصلاحية لفعل هذا، {{PLURAL:$1||للسبب التالي|للسببين التاليين|للأسباب التالية}}:",
        "permissionserrorstext-withaction": "ليست لك الصلاحية ل$2; لل{{PLURAL:$1||سبب التالي|سببين التاليين|أسباب التالية}}:",
        "content-model-json": "جسون",
        "content-json-empty-object": "كائن فارغ",
        "content-json-empty-array": "مصفوفة فارغة",
+       "unsupported-content-model": "<strong>تحذير:</strong> نموذج المحتوى $1 غير مدعوم في هذا الويكي.",
+       "unsupported-content-diff": "الفروق غير مدعومة لنموذج المحتوى $1.",
+       "unsupported-content-diff2": "الفروق بين نموذجي المحتوى $1 و$2 غير مدعومة في هذا الويكي.",
        "deprecated-self-close-category": "صفحات تستخدم وسوم HTML غير صالحة",
        "deprecated-self-close-category-desc": "هذه الصفحة تحتوي على وسوم HTML مغلقة ذاتيا، مثل  <code>&lt;b/></code> أو <code>&lt;span/></code>. سلوك هذه سيتغير سريعا ليكون متوافقا مع معيار HTML5، لذا فاستخدامهم في نص الويكي ينبغي أن يتم الاستغناء عنه.",
        "duplicate-args-warning": "<strong>تنبيه:</strong> المدخل \"$3\" ل[[:$1]] المستعمل في [[:$2]] مكرر. آخر قيمة مكرر منه هي المعتمدة.",
        "wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
        "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط <strong>الغليظ</strong>.",
        "wlnote": "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر <strong>$1</strong> تغييرات|آخر <strong>$1</strong> تغييرا|آخر <strong>$1</strong> تغيير}} في {{PLURAL:$2||<strong>الساعة</strong> الماضية|<strong>الساعتين</strong> الماضيتين|ال<strong>$2</strong> ساعات الماضية|ال<strong>$2</strong> ساعة الماضية}} وفقاً ل$3، $4.",
-       "wlshowlast": "عرض آخر $1 ساعات $2 يوما",
        "watchlist-hide": "إخفاء",
        "watchlist-submit": "أظهر",
        "wlshowtime": "الفترة الزمنية للعرض:",
        "sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك أعد إرسال الاستمارة مرة أخرى.",
        "changecontentmodel": "تغيير نموذج المحتوى لصفحة",
        "changecontentmodel-legend": "غير نموذج المحتوى",
-       "changecontentmodel-title-label": "عنوان الصفحة",
+       "changecontentmodel-title-label": "عنوان الصفحة:",
        "changecontentmodel-current-label": "نموذج المحتوى الحالي:",
-       "changecontentmodel-model-label": "نموذج محتوى جديد",
+       "changecontentmodel-model-label": "نموذج محتوى جديد:",
        "changecontentmodel-reason-label": "السبب:",
        "changecontentmodel-submit": "تغيير",
        "changecontentmodel-success-title": "نموذج المحتوى تم تغييره",
        "img-lang-default": "(اللغة الافتراضية)",
        "img-lang-info": "ترجم هذه الصورة إلى $1. $2",
        "img-lang-go": "اذهب",
-       "ascending_abbrev": "تصاعدي",
-       "descending_abbrev": "تنازلي",
        "table_pager_next": "الصفحة التالية",
        "table_pager_prev": "الصفحة السابقة",
        "table_pager_first": "الصفحة الأولى",
index e4beb81..3960826 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܪ̈ܗܝܬܟ, ܫܒܘܩ ܡܢ ܦܐܬܬ̈ܐ ܕܡܡܠܠܐ.",
        "wlheader-showupdated": "ܦܐܬܬ̈ܐ ܕܐܫܬܚܠܦܢ ܡܢ ܒܬܪ ܣܘܥܪܢܐ ܐܚܪܝܐ ܠܗܝܢ ܡܬܓܠܚܢ ܒܣܪܛܐ '''ܚܠܝܡܐ'''",
        "wlnote": "ܠܬܚܬ {{PLURAL:$1|ܫܘܚܠܦܐ ܐܚܪܝܐ| '''$1''' ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ}} {{PLURAL:$2|ܒܫܥܬܐ ܐܚܪܝܬܐ|'''$2''' ܒܫܥܬ̈ܐ ܐܚܪ̈ܝܬܐ}}, ܠܦܘܬ $3, $4.",
-       "wlshowlast": "ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ",
        "watchlist-options": "ܨܒܝܢܝܘܬ̈ܐ ܕܪ̈ܗܝܬܐ",
        "watching": "ܪܗܝܐ...",
        "unwatching": "ܠܚܝ ܪܗܝܐ...",
        "imgmultipagenext": "← ܫܘܚܠܦܐ ܕܒܬܪ",
        "imgmultigo": "ܙܠ!",
        "imgmultigoto": "ܙܠ ܠܦܐܬܐ $1",
-       "ascending_abbrev": "ܡܣܩܐܝܬ",
-       "descending_abbrev": "ܡܚܬܐܝܬ",
        "table_pager_next": "ܦܐܬܐ ܕܒܬܪ",
        "table_pager_prev": "ܦܐܬܐ ܕܩܕܡ",
        "table_pager_first": "ܦܐܬܐ ܩܕܡܝܬܐ",
index 2f03957..d603a97 100644 (file)
        "unwatchthispage": "Llaytuwelan",
        "notanarticle": "Trokiñdungu wülngiñ nu",
        "watchlist-details": "{{PLURAL:$1|$1 wülngiñ}} tami llaytun wif mew. Inantukulay nütramkawün ñi wülngiñ.",
-       "wlshowlast": "Pengelün kalekünun rupalu $1 ora, $2 antü",
        "watchlist-options": "Llaytun wif ñi dullin",
        "watching": "Llaytumekey...",
        "unwatching": "Llaytumekewelay...",
index b041cf3..e0cb754 100644 (file)
        "watch": "تبع",
        "unwatch": "ما تزيدش تعس",
        "watchlist-details": "{{PLURAL:$1||باجه وحده|باجتين|$1 باجات|$1 باجه}} في ليستت مراقبتك، (زدلها باجات النقاش).",
-       "wlshowlast": "بين آخر $1 سوايع $2 يامات",
        "watchlist-submit": "ورّي",
        "wlshowhideminor": "تبديلة خفيفة",
        "wlshowhidepatr": "$1 التبديلات المعسوسه",
index 7648d9d..fd99dc8 100644 (file)
        "watchlist-details": "{{PLURAL:$1|ṣefḫa weḫda|$1 de ṣ-ṣefḫaṫ}} kaynin fe l-lista dyal s-suivi dyalṫek, bla ma nḫesbo ṣ-ṣefḫaṫ dyal n-niqaċ.",
        "wlheader-enotif": "l-iĝlam bl-email mtloq.",
        "wlheader-showupdated": "ṣ-ṣfaḫi lli ṫġyyeraṫ mn aĥir ẓiyaṛa ṫaĝk mkṫoba b-ĥatt '''ġliḍ'''",
-       "wlshowlast": "Werri  l-$1 de s-swayeĝ o l-$2 iyam l-leĥĥrin, ola werri",
        "watchlist-options": "Lé-Opsyon de l-lista dyal s-suivi",
        "watching": "Kayraqeb...",
        "unwatching": "Nihayaṫ 's-suivi...",
        "imgmultipagenext": "sfha jaya →",
        "imgmultigo": "sir !",
        "imgmultigoto": "sir lsfha $1",
-       "ascending_abbrev": "tassaaodi",
-       "descending_abbrev": "tanazoli",
        "table_pager_next": "Ṣefḫa li jaya",
        "table_pager_prev": "sfha li sbqat",
        "table_pager_first": "sfha lowla",
index b722150..4bba0c1 100644 (file)
        "wlheader-enotif": "*خاصية الاعلام بالايميل متفعلة",
        "wlheader-showupdated": "الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط <strong>التخين</strong>",
        "wlnote": "تحت فى {{PLURAL:$1|آخر تغيير|آخر <strong>$1</strong> تغيير}} فى آخر {{PLURAL:$2|ساعه|<strong>$1</strong> ساعه}}، من الوقت $3، $4.",
-       "wlshowlast": "عرض اخر $1 ساعات $2 ايام",
        "watchlist-options": "اختيارات قايمة المراقبة",
        "watching": "بيراقب...",
        "unwatching": "بيبطل مراقبه...",
        "imgmultipagenext": "الصفحه اللى بعد كده →",
        "imgmultigo": "روح!",
        "imgmultigoto": "روح لصفحة $1",
-       "ascending_abbrev": "طالع",
-       "descending_abbrev": "نازل",
        "table_pager_next": "الصفحه اللى بعد كده",
        "table_pager_prev": "الصفحة اللى فاتت",
        "table_pager_first": "أول صفحة",
index 62a3961..bf951b4 100644 (file)
        "wlheader-enotif": "ইমেইল জাননী সক্ৰিয় কৰা হৈছে।",
        "wlheader-showupdated": "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
        "wlnote": "তলত $3, $4 তাৰিখত বিগত {{PLURAL:$2|১ ঘণ্টাত|<strong>$2</strong> ঘণ্টাত}} সংঘটিত {{PLURAL:$1|শেহতীয়া এটা পৰিৱৰ্তন|শেহতীয়া <strong>$1টা</strong> পৰিৱৰ্তন}} দেখুওৱা হ'ল।",
-       "wlshowlast": "যোৱা $1 ঘণ্টা $2 দিন  চাওক",
        "wlshowhidecategorization": "পৃষ্ঠা শ্ৰেণীকৰণ",
        "watchlist-options": "লক্ষ্য-তালিকা পছন্দসমূহ",
        "watching": "চকু দিয়া হৈছে.....",
        "imgmultigoto": "$1 পৃষ্ঠালৈ যাওক",
        "img-lang-default": "(ডিফল্ট ভাষা)",
        "img-lang-go": "যাওক",
-       "ascending_abbrev": "আৰোহণ",
-       "descending_abbrev": "অৱতৰণ",
        "table_pager_next": "পৰৱৰ্তী পৃষ্ঠা",
        "table_pager_prev": "পূৰ্বৱৰ্তী পৃষ্ঠা",
        "table_pager_first": "প্ৰথম পৃষ্ঠা",
index cdf1f01..469cb7e 100644 (file)
        "watchthis": "Vixilar esta páxina",
        "savearticle": "Guardar la páxina",
        "savechanges": "Guardar los cambios",
-       "publishpage": "Publicar la páxina",
+       "publishpage": "Espublizar páxina",
        "publishchanges": "Espublizar los cambeos",
        "savearticle-start": "Guardar la páxina...",
        "savechanges-start": "Guardar los cambios...",
-       "publishpage-start": "Publicar la páxina...",
-       "publishchanges-start": "Publicar los cambios...",
+       "publishpage-start": "Espublizar páxina...",
+       "publishchanges-start": "Espublizar los cambeos...",
        "preview": "Vista previa",
        "showpreview": "Amosar previsualización",
        "showdiff": "Amosar cambeos",
        "nocreate-loggedin": "Nun tienes permisu pa crear páxines nueves.",
        "sectioneditnotsupported-title": "Nun hai sofitu pa editar seición",
        "sectioneditnotsupported-text": "La edición de seición nun tien sofitu nesta páxina.",
+       "modeleditnotsupported-title": "Ensin encontu pa edición",
+       "modeleditnotsupported-text": "Nun hai encontu pa la edición nel modelu de conteníu $1.",
        "permissionserrors": "Fallu de permisos",
        "permissionserrorstext": "Nun tien permisu pa facer eso {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
        "permissionserrorstext-withaction": "Nun tienes permisu pa $2 {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oxetu baleru",
        "content-json-empty-array": "Matriz balera",
+       "unsupported-content-model": "<strong>Atención:</strong> El modelu de conteníu $1 nun tien encontu nesta wiki.",
+       "unsupported-content-diff": "Nun hai encontu de diffs pal modelu de conteníu $1.",
+       "unsupported-content-diff2": "Esta wiki nun tien encontu pa diffs ente los modelos de conteníu $1 y $2.",
        "deprecated-self-close-category": "Páxines qu'utilicen etiquetes HTML autozarraes inválides",
        "deprecated-self-close-category-desc": "Esta páxina contien etiquetes HTML autozarraes inválides, tales como <code>&lt;b/></code> o <code>&lt;span/></code>. El comportamientu d'estes va camudar llueu pa ser coherente cola especificación d'HTML5, polo qu'el so usu nel testu wiki ta en desusu.",
        "duplicate-args-warning": "<strong>Avisu:</strong> [[:$1]] llama a [[:$2]] con más d'un valor pal parámetru «$3». Sólo va usase l'últimu valor dau.",
        "search-interwiki-more-results": "más resultaos",
        "search-relatedarticle": "Rellacionáu",
        "search-invalid-sort-order": "Nun se reconoció la ordenación por $1, aplicaráse la ordenación predeterminada. Los tipos d'ordenación válidos son: $2",
+       "search-unknown-profile": "Nun se reconoz el perfil de busca $1; va aplicase'l perfil de busca predetermináu.",
        "searchrelated": "rellacionáu",
        "searchall": "toos",
        "showingresults": "Abaxo s'{{PLURAL:$1|amuesa hasta <strong>un</strong> resultáu|amuesen <strong>$1</strong> resultaos}}, principando por #<strong>$2</strong>.",
        "rcfilters-filter-showlinkedto-label": "Amosar los cambios nes páxines qu'enllacen a",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Páxines qu'enllacen a</strong> la páxina seleicionada",
        "rcfilters-target-page-placeholder": "Escribe'l nome de la páxina (o categoría)",
+       "rcfilters-allcontents-label": "Tol conteníu",
+       "rcfilters-alldiscussions-label": "Tolos alderiques",
        "rcnotefrom": "Abaxo {{PLURAL:$5|tá'l cambiu|tan los cambios}} dende'l <strong>$3</strong>, a les <strong>$4</strong> (s'amuesen un máximu de <strong>$1</strong>).",
        "rclistfromreset": "Reaniciar la seleición de data",
        "rclistfrom": "Amosar los nuevos cambios dende'l $3 a les $2",
        "wlheader-enotif": "La notificación per corréu electrónicu ta activada.",
        "wlheader-showupdated": "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
        "wlnote": "Abaxo {{PLURAL:$1|tá'l caberu cambiu|tan los caberos <strong>$1</strong> cambios}} {{PLURAL:$2|na cabera hora|nes caberes <strong>$2</strong> hores}}, a día $3, a les $4.",
-       "wlshowlast": "Amosar les últimes $1 hores, los últimos $2 díes",
        "watchlist-hide": "Anubrir",
        "watchlist-submit": "Amosar",
        "wlshowtime": "Periodu de tiempu a amosar:",
        "changecontentmodel": "Cambiar el modelu de conteníu d'una páxina",
        "changecontentmodel-legend": "Cambiar el modelu de conteníu",
        "changecontentmodel-title-label": "Títulu de la páxina",
+       "changecontentmodel-current-label": "Modelu de conteníu actual:",
        "changecontentmodel-model-label": "Nuevu modelu de conteníu",
        "changecontentmodel-reason-label": "Motivu:",
        "changecontentmodel-submit": "Camudar",
        "block-log-flags-angry-autoblock": "autobloquéu ameyoráu activáu",
        "block-log-flags-hiddenname": "nome d'usuariu anubríu",
        "range_block_disabled": "La capacidá d'alministrador pa crear bloqueos d'intervalos ta desactivada.",
+       "ipb-prevent-user-talk-edit": "Tien de permitise editar la páxina d'alderique propia nun bloquéu parcial, sacantes qu'incluya una torga nel espaciu de nomes Usuariu alderique.",
        "ipb_expiry_invalid": "El tiempu de caducidá nun ye válidu.",
        "ipb_expiry_old": "La fecha de caducidá ta pasada.",
        "ipb_expiry_temp": "Los bloqueos a nomes d'usuariu tapecíos tienen de ser permanentes.",
        "move-page-legend": "Treslladar páxina",
        "movepagetext": "Usando'l siguiente formulariu vas renomar una páxina, treslladando'l so historial al nuevu nome.\nEl nome vieyu va convertise nuna páxina de redireición al títulu nuevu.\nPues actualizar les redireiciones qu'enllacien al títulu orixinal automáticamente.\nSi prefieres nun lo facer, asegúrate de que nun dexes [[Special:DoubleRedirects|redireiciones dobles]] o [[Special:BrokenRedirects|rotes]].\nTu yes el responsable de facer que los enllaces queden apuntando au se supón que tienen d'apuntar.\n\nRecuerda que la páxina <strong>nun</strong> va movese si yá hai una páxina col nuevu títulu, a nun ser que la mesma seya una redireición y nun tenga historial.\nEsto significa que pues volver a renomar una páxina col nome orixinal si t'enquivoques, y nun pues sobreescribir una páxina yá esistente.\n\n<strong>Nota:</strong>\nEsti pue ser un cambéu importante ya inesperáu pa una páxina popular;\npor favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
        "movepagetext-noredirectfixer": "Usando'l siguiente formulariu vas renomar una páxina, treslladando'l so historial al nuevu nome.\nEl nome vieyu va convertise nuna redireición al nuevu.\nAsegúrate de que nun dexes [[Special:DoubleRedirects|redireiciones dobles]] o [[Special:BrokenRedirects|rotes]].\nTu yes el responsable de facer que los enllaces queden apuntando au se supón qu'han apuntar.\n\nRecuerda que la páxina <strong>nun</strong> va movese si yá hai una páxina col nuevu títulu, a nun ser que tea balera o seya una redireición que nun tenga historial.\nEsto significa que pues volver a renomar una páxina col nome orixinal si t'enquivoques, y que nun pues sobreescribir una páxina yá esistente.\n\n<strong>Nota:</strong>\nEsti pue ser un cambéu importante y inesperáu pa una páxina popular;\npor favor, asegúrate d'entender les consecuencies de lo que vas facer enantes de siguir.",
+       "movepagetext-noredirectsupport": "Usando'l siguiente formulariu cambiaráse'l nome d'una páxina treslladando tol so historial al nome nuevu.\nYes responsable d'asegurate de que tolos enllaces siguen apuntando escontra onde tendríen de facelo.\n\nRecuerda que la páxina <strong>nun</strong> va treslladase si yá esiste una páxina col títulu nuevu.\nEsto significa que puedes devolver una páxina al so títulu orixinal si cometes un error, y que nun vas poder sustituir una páxina esistente.\n\n<strong>Atención:</strong>\nEsti pué ser un cambéu drásticu ya inesperáu para una páxina popular;\nasegúrate d'entender les consecuencies antes de siguir alantre.",
        "movepagetalktext": "Si marques esti cuadru, la páxina d'alderique asociada va treslladase automáticamente al títulu nuevu, a nun ser que yá esista una páxina d'alderique non vacia allí.\n\nNesti casu tendrás que treslladar o fusionar la páxina manualmente si lo desees.",
        "moveuserpage-warning": "'''Atención:''' Tas a piques de mover una páxina d'usuariu. Atalanta que namái se va mover la páxina y que ''nun'' se va renomar l'usuariu.",
        "movecategorypage-warning": "<strong>Avisu:</strong> Tas a piques de treslladar una páxina de categoría. Ten en cuenta que sólo se treslladará la páxina y que cualquier páxina que tuviera na categoría antigua <em>nun</em> se recategorizará na nueva.",
        "move-subpages": "Treslladar les subpáxines (hasta $1)",
        "move-talk-subpages": "Treslladar les subpáxines de la páxina d'alderique (hasta $1)",
        "movepage-page-exists": "La páxina $1 yá esiste y nun puede sustituise automáticamente.",
+       "movepage-source-doesnt-exist": "La páxina $1 nun esiste polo que nun puede treslladase.",
        "movepage-page-moved": "Treslladóse la páxina $1 a $2.",
        "movepage-page-unmoved": "Nun pudo treslladase la páxina $1 a $2.",
        "movepage-max-pages": "Treslladóse'l máximu de $1 {{PLURAL:$1|páxina|páxinees}} y nun van treslladase más automáticamente.",
        "delete_and_move_reason": "Desaniciada pa facer sitiu pa treslladar dende «[[$1]]»",
        "selfmove": "El títulu ye'l mesmu;\nnun puede treslladase una páxina a ella mesma.",
        "immobile-source-namespace": "Nun pueden treslladase páxines nel espaciu de nomes «$1».",
+       "immobile-source-namespace-iw": "Les páxines d'otres wikis nun pueden treslladase dende esta.",
        "immobile-target-namespace": "Nun pueden treslladase páxines al espaciu de nomes «$1».",
        "immobile-target-namespace-iw": "Nun puedes mover una páxina a un enllaz d'Interwiki.",
        "immobile-source-page": "Esta páxina nun ye treslladable.",
        "immobile-target-page": "Nun puede treslladase a esi títulu de destín.",
+       "movepage-invalid-target-title": "El nome solicitáu nun ye válidu.",
        "bad-target-model": "El destín deseáu utiliza un modelu de conteníu diferente. Nun se pue convertir de $1 a $2.",
        "imagenocrossnamespace": "Nun puede treslladase un ficheru a un espaciu de nomes que nun ye de ficheros.",
        "nonfile-cannot-move-to-file": "Nun se pue treslladar más que ficheros al espaciu de nomes de ficheros",
        "tooltip-ca-nstab-category": "Ver la páxina de categoría",
        "tooltip-minoredit": "Marcar como una edición menor",
        "tooltip-save": "Guardar los cambios",
-       "tooltip-publish": "Publicar los cambeos",
+       "tooltip-publish": "Espublizar los cambeos",
        "tooltip-preview": "Vista previa de los cambios, ¡usa esto enantes de guardar!",
        "tooltip-diff": "Amuesa los cambios que fixisti nel testu.",
        "tooltip-compareselectedversions": "Ver les diferencies ente les dos revisiones seleicionaes d'esta páxina.",
        "img-lang-default": "(llingua predeterminada)",
        "img-lang-info": "Representar esta imaxe en $1. $2",
        "img-lang-go": "Dir",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Páxina siguiente",
        "table_pager_prev": "Páxina anterior",
        "table_pager_first": "Primera páxina",
        "permanentlink": "Enllaz permanente",
        "permanentlink-revid": "ID de la revisión",
        "permanentlink-submit": "Dir a la revisión",
+       "newsection": "Seición nueva",
+       "newsection-page": "Páxina de destín",
+       "newsection-submit": "Dir a páxina",
        "dberr-problems": "¡Sentímoslo! Esti sitiu ta esperimentando dificultaes téuniques.",
        "dberr-again": "Tenta esperar dellos minutos y recargar.",
        "dberr-info": "(Nun hai accesu a la base de datos: $1)",
        "linkaccounts": "Enllazar cuentes",
        "linkaccounts-success-text": "Enllazóse la cuenta.",
        "linkaccounts-submit": "Enllazar cuentes",
+       "cannotunlink-no-provider-title": "Nun hai cuentes enllazaes que desenllazar",
+       "cannotunlink-no-provider": "Nun hai cuentes enllazaes que puedan desenllazase.",
        "unlinkaccounts": "Desenllazar cuentes",
        "unlinkaccounts-success": "Desenllazóse la cuenta.",
        "authenticationdatachange-ignored": "Nun se xestionó'l cambéu de los datos d'autentificacion. ¿Seique, nun se configuró un fornidor?",
        "edit-error-short": "Error: $1",
        "edit-error-long": "Errores:\n\n$1",
        "specialmute": "Silenciar",
+       "specialmute-success": "Anováronse les tos preferencies de silenciu. Mira tolos usuarios silenciaos [[Special:Preferences|nes tos preferencies]].",
        "specialmute-submit": "Confirmar",
+       "specialmute-label-mute-email": "Silenciar los correos electrónicos d'esti usuariu",
+       "specialmute-header": "Escueye les tos preferencies de silenciu pa <b>{{BIDI:[[User:$1|$1]]}}</b>.",
+       "specialmute-error-invalid-user": "Nun s'atopó'l nome d'usuariu solicitáu.",
+       "specialmute-error-no-options": "Les funciones de silenciu nun tán disponibles. Esto pué asoceder porque: nun confirmasti la to direición de corréu o un alministrador de la wiki desactivó funciones de corréu y/o de llista prieta de corréu pa esta wiki.",
+       "specialmute-email-footer": "P'alministrar les preferencies de corréu electrónicu pal usuariu {{BIDI:$2}} visita <$1>.",
+       "specialmute-login-required": "Anicia sesión pa cambiar les tos preferencies de silenciu.",
+       "mute-preferences": "Preferencies de silenciu",
        "revid": "revisión $1",
        "pageid": "ID de páxina $1",
        "interfaceadmin-info": "$1\n\nLos permisos pa editar los ficheros  CSS, JS y JSON globales del sitiu dixebráronse apocayá del permisu <code>editinterface</code>. Si nun entiendes por qué recibes esti error, llei [[mw:MediaWiki_1.32/interface-admin]].",
index 7d9b798..e6d2412 100644 (file)
        "wlheader-enotif": "Email walzera tir tegisa.",
        "wlheader-showupdated": "Bu betayanu mali rinafa ironokafa worara tir <strong>sulatcalakorafu</strong>.",
        "wlnote": "Valeveon tigid <strong>$1</strong> bocafa betara mali {{PLURAL:$2|ironokaf bartiv|<strong>$2</strong> ironokaf bartiv}}, wetce ra ke $3, $4.",
-       "wlshowlast": "Nedira va ironokaf $1 bartiv isu $2 viel",
        "watchlist-options": "Suzdaxolkeem",
        "watching": "Nedis...",
        "unwatching": "Menedis...",
        "imgmultipagenext": "direbu →",
        "imgmultigo": "Askí !",
        "imgmultigoto": "Grablera kal $1 bu",
-       "ascending_abbrev": "tid-",
-       "descending_abbrev": "tit-",
        "table_pager_next": "Radimefu bu",
        "table_pager_prev": "Abduefu bu",
        "table_pager_first": "Taneafu bu",
index fb1ec52..bdbe4b0 100644 (file)
        "wlheader-enotif": "ई-मेल नोटिफ़िकेशन सक्षम है।",
        "wlheader-showupdated": "पन्ना जवन आपकय द्वारा देखय जाएक बाद बदलि गा है '''बोल्ड''' मे देखाइ।",
        "wlnote": "$3 को $4 बजे तक पिछले <strong>$2</strong> {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हुआ एक|हुए <strong>$1</strong>}} परिवर्तन निम्न {{PLURAL:$1|है|हैं}}।",
-       "wlshowlast": "पिछला $1 घंटा $2 दिन  देखा जाय",
        "watchlist-hide": "लुकुवावा",
        "watchlist-submit": "देखावा",
        "wlshowtime": "अंतिम दिखाएँ:",
        "img-lang-default": "(डिफ़ॉल्ट भाषा)",
        "img-lang-info": "इस चित्र को $1. $2 में ढालें",
        "img-lang-go": "जावा जाय",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "अगला पन्ना",
        "table_pager_prev": "पिछला पन्ना",
        "table_pager_first": "पहिला पन्ना",
index d24fc8e..7e41483 100644 (file)
        "viewyourtext": "Bu səhifəyə <strong>etdiyiniz dəyişikliklərin</strong> mənbəyinə baxa və köçürə bilərsiniz.",
        "protectedinterface": "Bu səhifədə proqram təminatı üçün sistem məlumatları var və sui-istifadənin qarşısını almaq üçün mühafizə olunmalıdır.",
        "editinginterface": "<strong>Diqqət:</strong> Siz proqram təminatı üçün interfeys mətni olan səhifəni redaktə edirsiniz.\nOnun dəyişdirilməsi digər istifadəçilərin interfeysinin xarici görünüşünə təsir göstərəcək.",
-       "translateinterface": "Bütün vikilər üçün tərcümələri əlavə etmək və ya dəyişmək üçün, xahiş edirik MediaWiki lokallaşdırma layihəsi [https://translatewiki.net/ translatewiki.net]-i istifadə edin.",
+       "translateinterface": "Bütün vikilərə tərcümələr əlavə etmək və ya onları dəyişmək üçün xahiş edirik, MediaWiki lokallaşdırma layihəsi olan [https://translatewiki.net/ translatewiki.net] saytından istifadə edin.",
        "cascadeprotected": "Bu səhifə mühafizə olunub, çünki o, kaskad mühafizə olunan {{PLURAL:$1|aşağıdakı səhifədə|aşağıdakı səhifələrdə}} istifadə edilib:\n$2",
        "namespaceprotected": "Sizin adlarında $1 olan məqalələrdə redaktə etməyə icazəniz yoxdur.",
        "customcssprotected": "Bu səhifəni redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
        "wlheader-enotif": "E-məktubla bildiriş aktivdir.",
        "wlheader-showupdated": "Sizin son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlə''' göstərilmişdir.",
        "wlnote": "Aşağıda $3 tarixi və saat $4 üçün olan son {{PLURAL:$2|bir saatda|<strong>$2</strong> saatda}} edilmiş {{PLURAL:$1|son bir dəyişiklik|son <strong>$1</strong> dəyişiklik}} göstərilmişdir.",
-       "wlshowlast": "Son $1 saatı $2 günü göstər",
        "watchlist-hide": "Gizlət",
        "watchlist-submit": "Göstər",
        "wlshowhideminor": "kiçik redaktələr",
        "imgmultigo": "Seç!",
        "imgmultigoto": "$1 səhifəyə get",
        "img-lang-go": "Get",
-       "ascending_abbrev": "artma sırasına görə",
-       "descending_abbrev": "azalma sırasına görə",
        "table_pager_next": "Sonrakı səhifə",
        "table_pager_prev": "Əvvəlki səhifə",
        "table_pager_first": "İlk səhifə",
index e7843ef..ad42134 100644 (file)
        "wlheader-enotif": "ایمیل ایله بیلدیریش آچیلیب‌دیر.",
        "wlheader-showupdated": "سون گؤروشونوزدن سوْنرا ائدیلن دییشیکلیکلر '''قالین''' گؤرسدیلیب‌دیر.",
        "wlnote": "آشاغیداکی {{PLURAL:$1|بیر ديَیشیک‌لیک|<strong>$1</strong> ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|<strong>$2</strong> ساعتدا}} ائدیلمیشدیر. $3، $4",
-       "wlshowlast": "سون $1 ساعات $2 گون گؤستر",
        "watchlist-hide": "گیزلت",
        "wlshowtime": "بو تاریخه قدر گؤستر:",
        "wlshowhideminor": "کیچیک دَییشدیرمه‌لر",
        "img-lang-default": "(وارساییلان دیل)",
        "img-lang-info": "بو عکسی $1-ده گؤستر. $2",
        "img-lang-go": "گئت",
-       "ascending_abbrev": "آرتما سیراسینا گؤره",
-       "descending_abbrev": "آزالما سیراسینا گؤره",
        "table_pager_next": "سوْنراکی صفحه",
        "table_pager_prev": "قاباقکی صفحه",
        "table_pager_first": "بیرینجی صفحه‌‌",
index bbd9b2c..47496dd 100644 (file)
        "category-empty": "<em>Был категория әлегә буш.</em>",
        "hidden-categories": "{{PLURAL:$1|Йәшерен категория|Йәшерен категориялар}}",
        "hidden-category-category": "Йәшерен категориялар",
-       "category-subcat-count": "{{PLURAL:$2|Был категорияла тик киләһе эске категория ғына бар.|Барлығы $2 категориянан, был категорияла киләһе {{PLURAL:$1|эске категория|$1 эске категория}} күрһәтелә.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Был категорияла бер генә эске категория бар.|Был категориялағы барыһы $2 эске категорияның {{PLURAL:$1|$1 эске категорияһы}} күрһәтелгән.}}",
        "category-subcat-count-limited": "Был категорияға киләһе {{PLURAL:$1|эске категория|$1 эске категория}} ингән.",
-       "category-article-count": "{{PLURAL:$2|1=Ð\91Ñ\8bл ÐºÐ°Ñ\82егоÑ\80иÑ\8fла Ð±ÐµÑ\80 Ð³ÐµÐ½Ó\99 Ð±Ð¸Ñ\82 Ð±Ð°Ñ\80.|Ð\9aаÑ\82егоÑ\80иÑ\8fлаÒ\93Ñ\8b $2 Ð±Ð¸Ñ\82Ñ\82ең $1 Ð±Ð¸Ñ\82е күрһәтелгән.}}",
+       "category-article-count": "{{PLURAL:$2|1=Ð\91Ñ\8bл ÐºÐ°Ñ\82егоÑ\80иÑ\8fла Ð±ÐµÑ\80 Ð³ÐµÐ½Ó\99 Ð±Ð¸Ñ\82 Ð±Ð°Ñ\80.|Ð\91Ñ\8bл ÐºÐ°Ñ\82егоÑ\80иÑ\8fла Ð±Ñ\83лÒ\93ан $2 Ð±Ð¸Ñ\82Ñ\82ең {{PLURAL:$1|$1 Ð±Ð¸Ñ\82е}} күрһәтелгән.}}",
        "category-article-count-limited": "Был категорияла {{PLURAL:$1|$1 бит}} бар.",
        "category-file-count": "{{PLURAL:$2|Был категорияла бер генә файл бар.|Категориялағы $2 файлдың {{PLURAL:$1|$1 файлы күрһәтелгән}}.}}",
        "category-file-count-limited": "Был категорияла {{PLURAL:$1|$1 файл}} бар.",
        "wlheader-enotif": "Электрон почта аша белдереү индерелгән.",
        "wlheader-showupdated": "Һеҙҙең аҙаҡҡы кереүегеҙҙән һуң үҙгәргән биттәр '''ҡалын''' шрифт менән күрһәтелгән.",
        "wlnote": "Түбәндә $3 $4 ваҡытына тиклем аҙаҡҡы {{PLURAL:$2|1=сәғәт|'''$2''' сәғәт}} эсендә эшләнгән {{PLURAL:$1|1=үҙгәртеү|'''$1''' үҙгәртеү}} күрһәтелгән.",
-       "wlshowlast": "Һуңғы $1 сәғәт $2 көн эсендәгеһен күрһәтеү",
        "watchlist-hide": "Йәшереү",
        "watchlist-submit": "Күрһәтергә",
        "wlshowtime": "Күрһәтеү өсөн ваҡыт арауығы",
        "img-lang-default": "(килешеү буйынса тел)",
        "img-lang-info": "Был рәсемде $1 $2 телдәрендә күрһәтергә",
        "img-lang-go": "Күсергә",
-       "ascending_abbrev": "үҫеүгә табан",
-       "descending_abbrev": "кәмеүгә табан",
        "table_pager_next": "Киләһе бит",
        "table_pager_prev": "Алдағы бит",
        "table_pager_first": "Беренсе бит",
index 452c4ef..6aaeac8 100644 (file)
        "about": "Indik",
        "article": "Kaca daging",
        "newwindow": "(bukak ring jendela anyar)",
-       "cancel": "Buwung",
+       "cancel": "Wangdé",
        "moredotdotdot": "Lianan...",
        "mypage": "Kaca",
        "mytalk": "Pabligbagan",
        "ok": "OK",
        "retrievedfrom": "Kapolihang saking \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Jero madué}} $1 ($2)",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|You have}} $1 ring {{PLURAL:$3|another user|$3 users}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ida dané madué}} $1 saking {{PLURAL:$3|$3 sang anganggé lianan}} ($2).",
        "youhavenewmessagesmanyusers": "Jero madué $1 saking akéh sang anganggé ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|séwalapatra anyar abesik|999=séwalapatra anyar}}",
        "youhavenewmessagesmulti": "Ida dané madué séwalapatra anyar ring $1",
        "pt-createaccount": "Ngaryanin akun",
        "pt-userlogout": "Medal log",
        "botpasswords-label-create": "Ngae",
-       "botpasswords-label-cancel": "Buungan",
+       "botpasswords-label-cancel": "Wangdé",
        "botpasswords-label-delete": "Usap",
        "botpasswords-label-resetpassword": "Nyumu kruna sandi",
+       "resetpass-submit-cancel": "Wangdé",
        "passwordreset": "Nyumu kruna sandi",
        "bold_sample": "teks puniki mesurat tebel",
        "bold_tip": "teks puniki mesurat tebel",
        "prefs-help-email-others": "ida dane prasida milih anggen ngalugrain anak lianan ngubungin ida dane majalaran lembar penganggen utawi pangraos nenten ja perlu ngagah indik padewekan ida dane",
        "prefs-editor": "Sang anguah",
        "group-bot": "Bot",
+       "group-sysop": "Prajuru",
        "grouppage-bot": "{{ns:project}}:Bot",
        "right-edit": "Uah kaca",
        "right-writeapi": "nganggén API sasuratan",
        "action-browsearchive": "rereh kaca sané kausapin",
        "action-editprotected": "uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
        "action-editsemiprotected": "uah kaca sané kasaibin \"{{int:protect-level-autoconfirmed}}\"",
-       "nchanges": "$1{{PLURAL:$1|panguwahan|uwah-uwahan}}",
+       "nchanges": "$1 {{PLURAL:$1|uahan}}",
        "enhancedrc-history": "babad",
        "recentchanges": "Uahan sané mangkin",
        "recentchanges-legend": "Opsi uahan sané mangkin",
        "recentchanges-label-minor": "Punika uahan alit",
        "recentchanges-label-bot": "Uahan puniki kalaksanayang antuk bot",
        "recentchanges-label-unpatrolled": "Uahan puniki durung kapatroli",
-       "recentchanges-label-plusminus": "Pagentos akeh kaca manut ring bita",
+       "recentchanges-label-plusminus": "Agengnyané kacané kauahin antuk akéhnyané bita puniki",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taler cingak [[Special:NewPages|bacakan kaca anyar]])",
        "recentchanges-submit": "Sinahang",
        "rcfilters-activefilters-show": "Sinahang",
        "rcfilters-savedqueries-remove": "Usap",
+       "rcfilters-savedqueries-cancel-label": "Wangdé",
        "rcfilters-filter-minor-label": "Uahan alit",
        "rcfilters-filter-major-label": "Uahan tan alit",
        "rcfilters-filter-pageedits-label": "Uahan kaca",
        "uploadlogpage": "Log unggahan",
        "filedesc": "Ringkesan",
        "savefile": "Raksa berkas",
+       "upload-dialog-button-cancel": "Wangdé",
        "upload-dialog-button-save": "Raksa",
        "backend-fail-delete": "Tan prasida ngusapin berkas \"$1\".",
        "license": "kepahan lugra",
        "imagelinks": "Panganggén depukan",
        "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ring sor puniki nganggén depukan puniki:",
        "nolinkstoimage": "Nénten wénten kaca sané nganggén berkas puniki.",
+       "linkstoimage-redirect": "$1 (gingsiran berkas) $2",
        "sharedupload-desc-here": "Depukan puniki mawit saking $1 lan minab kaanggén olih proyék-proyék sané lianan. Déskripsinnyané ring [$2 kaca déskripsi depukannyané] kaarahin ring ungkur puniki.",
        "filepage-nofile": "Nentén wénten berkas sané mamurda sakadi punika",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "watch": "cingak",
        "unwatch": "tan sida maninjo",
        "watchlist-details": "{{PLURAL:$1|$1 kaca}} wénten ring bacakan pantauan ida dané (rumasuk kaca pabligbagan).",
-       "wlshowlast": "Sinahang $1 jam $2 rahina sané lintang",
        "watchlist-submit": "Sinahang",
        "wlshowhideminor": "uahan alit",
        "watchlist-options": "milih kepahan peninjo",
        "actioncomplete": "pelaksanan sampun wusan",
        "actionfailed": "pelaksana luput",
        "dellogpage": "log pangapus",
+       "rollback-confirmation-no": "Wangdé",
        "rollbacklink": "mabalik",
        "rollbacklinkcount": "balikang $1 {{PLURAL:$1|suratan}}",
        "changecontentmodel-title-label": "Murda kaca",
        "tooltip-t-upload": "Unggahang depukan",
        "tooltip-t-specialpages": "Bacakan makasami kaca kusus",
        "tooltip-t-print": "Vérsi cétak kaca puniki",
-       "tooltip-t-permalink": "Pranala ajeg anggén révisi puniki antuk kacané",
+       "tooltip-t-permalink": "Pranala ajeg anggén révisinnyané kacané puniki",
        "tooltip-ca-nstab-main": "Cingak kaca daging",
        "tooltip-ca-nstab-user": "Cingak kaca sang anganggé",
        "tooltip-ca-nstab-special": "Puniki kaca kusus tur nénten prasida kauwah",
        "previousdiff": "← Uahan sadurungnyané",
        "nextdiff": "Uahan sané pinih anyar →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|kaca}}",
-       "file-info-size": "$1x$2 piksel, ukuran depukan: $3, tipe MIME:$4",
+       "file-info-size": "$1x$2 piksel, agengnyané depukan: $3, soroh MIME:$4",
+       "file-info-size-pages": "$1 × $2 piksel, agengnyané berkas: $3, soroh MIME: $4, $5 {{PLURAL:$5|kaca}}",
        "file-nohires": "tan kasayagaang ukuran sane lewih ageng",
-       "svg-long-desc": "pupulan SVG, nominal $1 × $2 piksel, geden pupulan: $3",
+       "svg-long-desc": "Berkas SVG, jimbarnyané $1 × $2 piksel, agengnyané berkas: $3",
        "show-big-image": "Depukan sujati",
-       "show-big-image-preview": "agengnyané pratuduh:$1",
+       "show-big-image-preview": "Agengnyané pratuduh puniki: $1.",
        "show-big-image-other": "{{PLURAL:$2|Resolusi}} iianan: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "sunday-at": "Redite jam $1",
        "metadata-fields": "Widang métadata gambar sané kacantumang ring séwalapatra puniki jagi kalebuang ring tampilan kaca gambar ri tatkala tabél métadata kacenikang.\nSané lianan jagi kasenetang.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "namespacesall": "samian",
        "monthsall": "samian",
+       "confirmemail_invalidated": "Konfirmasi alamat email kawangdéang",
        "imgmultipagenext": "kaca salanturnyané →",
        "imgmultigo": "Ngrereh",
        "imgmultigoto": "Nuju kaca $1",
        "logentry-protect-protect": "$1 {{GENDER:$2|nyaibin}} $3 $4",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngunggahang}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ngunggahang}} vèrsi anyar saking $3",
+       "feedback-cancel": "Wangdé",
        "feedback-message": "Séwalapatra:",
        "searchsuggest-search": "Rereh ring {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|rahina}}",
index 3672f08..67059c7 100644 (file)
        "wlheader-enotif": "Da E-Mail-Benoochrichtigungsdeanst is aktivierd.",
        "wlheader-showupdated": "Seitn mid no ned oogschaugtn Endarunga wean '''fett''' gschriem.",
        "wlnote": "Es {{PLURAL:$1|foigt de letzte Endarung|foign de letztn <strong>$1</strong> Endarunga}} vo de letztn {{PLURAL:$2|Stunde|<strong>$2</strong> Stundn}}. Stand: $3, $4 Uah.",
-       "wlshowlast": "Zoag de Endarunga vo de letztn $1 Stund, $2 Dog.",
        "watchlist-options": "Mei Beobochta: Optiona",
        "watching": "Beówochten ...",
        "unwatching": "Néd Beówochten",
        "imgmultipagenext": "naxde Seiten →",
        "imgmultigo": "OK",
        "imgmultigoto": "Gee zua Seiten $1",
-       "ascending_abbrev": "auf",
-       "descending_abbrev": "ob",
        "table_pager_next": "Naxde Seiten",
        "table_pager_prev": "Vurherige Seiten",
        "table_pager_first": "Erste Seiten",
index fe13785..a9af2ef 100644 (file)
        "wlheader-enotif": "اخطار ایمیل فعالنت.",
        "wlheader-showupdated": "صفحات که عوض بوتگنت چه شمی آهری چارتن '''پررنگ''' پیش دراگ بنت.",
        "wlnote": "جهلء {{PLURAL:$1|آهرین تغییر هست|آهرین هست'''$1''' تغییرات}} ته آهرین {{PLURAL:$2|ساعت|'''$2''' ساعات}}.",
-       "wlshowlast": "پیش دار آهرین $1  ساعات $2 روچان",
        "watchlist-options": "چارگء لیستء گزینہ‌ئاں",
        "watching": "چارگئں",
        "unwatching": "چارگ نہ بیتگ",
        "imgmultipagenext": "اݔدگہ تاک →",
        "imgmultigo": "برا!",
        "imgmultigoto": "برو به صفحه  $1",
-       "ascending_abbrev": "بالادی",
-       "descending_abbrev": "جهلادی",
        "table_pager_next": "اݔدگہ تاک",
        "table_pager_prev": "پیشگین صفحه",
        "table_pager_first": "اولی صفحه",
index d6959f4..b3416ca 100644 (file)
        "wlheader-enotif": "E-surat na paisi pinagpaandar na.",
        "wlheader-showupdated": "Mga pahina na pinagriliwat poon kaidtong huri kang nagbisita sainda ipinapatanaw na '''mahîbog'''",
        "wlnote": "Sa ibaba kan {{PLURAL:$1|huring pagbabago|mga huring <strong>$1</strong> pagbabago}} sa nakalihis na {{PLURAL:$2|oras|'''$2''' mga oras}}, magpoon pa kan $3, $4.",
-       "wlshowlast": "Ipahilíng an nakalihis na $1 na mga oras mga $2 na mga aldaw",
        "watchlist-hide": "Itago",
        "watchlist-submit": "Ipahiling",
        "wlshowhideminor": "Sadit na kaliwatan",
        "img-lang-default": "(panugmad na lengguwahe)",
        "img-lang-info": "Giboha ining imahe sa $1. $2",
        "img-lang-go": "Dumani",
-       "ascending_abbrev": "skt",
-       "descending_abbrev": "ba",
        "table_pager_next": "Sunod na páhina",
        "table_pager_prev": "Nakaaging páhina",
        "table_pager_first": "Enot na páhina",
index 9124d3a..d250293 100644 (file)
        "blockednoreason": "прычына не пазначана",
        "blockedtext-composite": "<strong>Вашае імя ўдзельніка ці IP-адрас былі заблякаваныя.</strong>\n\nПададзеная прычына:\n\n:<em>$2</em>.\n\n* Пачатак блякаваньня: $8\n* Сканчэньне найдаўжэйшага з блякаваньняў: $6\n\n* $5\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, дадайце ўсе падрабязнасьці, прыведзеныя вышэй, у запыты, што вы будзеце рабіць.",
        "blockedtext-composite-ids": "Адпаведныя ідэнтыфікатары блякаваньня: $1 (ваш IP-адрас таксама можа знаходзіцца ў чорным сьпісе)",
+       "blockedtext-composite-no-ids": "Ваш ІП-адрас наяўны ў некалькіх чорных сьпісах",
        "blockedtext-composite-reason": "Маецца некалькі блякаваньняў вашага рахунку і/ці IP-адрасу",
        "whitelistedittext": "Вам трэба $1, каб рэдагаваць старонкі.",
        "confirmedittext": "Вы мусіце пацьвердзіць Ваш адрас электроннай пошты перад рэдагаваньнем старонак. Калі ласка, пазначце і пацьвердзіце адрас электроннай пошты праз Вашы [[Special:Preferences|налады]].",
        "nocreate-loggedin": "Вы ня маеце дазволу на стварэньне новых старонак.",
        "sectioneditnotsupported-title": "Рэдагаваньне сэкцыяў не падтрымліваецца",
        "sectioneditnotsupported-text": "Рэдагаваньне сэкцыяў не падтрымліваецца на гэтай старонцы.",
+       "modeleditnotsupported-title": "Рэдагаваньне ня падтрымоўваецца",
+       "modeleditnotsupported-text": "Рэдагаваньне ня падтрымоўваецца для мадэлі са зьместам $1",
        "permissionserrors": "Памылка дазволу",
        "permissionserrorstext": "Вы ня маеце дазволу на гэтае дзеяньне з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "permissionserrorstext-withaction": "Вы ня маеце дазволу на $2 з {{PLURAL:$1|1=наступнай прычыны|наступных прычынаў}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Пусты аб’ект",
        "content-json-empty-array": "Пусты масіў",
+       "unsupported-content-model": "<strong>Увага:</strong> Мадэль са зьместам $1 ня падтрымоўвацца на гэтай вікі.",
        "deprecated-self-close-category": "Старонкі зь няслушнымі самазакрытымі HTML-тэгамі",
        "deprecated-self-close-category-desc": "Старонка ўтрымлівае няслушныя самазакрытыя HTML-тэгі, такія як <code>&lt;b/></code> ці <code>&lt;span/></code>. Іх паводзіны ў хуткім часе будуць зьмененыя ў адпаведнасьці з спэцыфікацыяй HTML5, таму іх ўжываньне ў вікітэксьце лічыцца састарэлым.",
        "duplicate-args-warning": "<strong>Папярэджаньне:</strong> [[:$1]] выклікае [[:$2]] з больш чым адным значэньнем парамэтру «$3». Толькі апошняе з пададзеных значэньняў будзе ўжытае.",
        "rcfilters-clear-all-filters": "Ачысьціць усе фільтры",
        "rcfilters-show-new-changes": "Праглядзець новыя зьмены з $1",
        "rcfilters-search-placeholder": "Фільтар зьменаў (ужывайце мэню ці пошук дзеля назвы фільтру)",
+       "rcfilters-search-placeholder-mobile": "Фільтары",
        "rcfilters-invalid-filter": "Няслушны фільтар",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказаны ўвесь унёсак.",
        "rcfilters-filterlist-title": "Фільтры",
        "rcfilters-filter-showlinkedto-label": "Паказаць зьмены старонак, якія спасылаюцца на",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Старонкі, якія спасылаюцца на</strong> абраную старонку",
        "rcfilters-target-page-placeholder": "Увядзіце назву старонкі (ці катэгорыі)",
+       "rcfilters-allcontents-label": "Увесь зьмест",
+       "rcfilters-alldiscussions-label": "Усе абмеркаваньні",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfromreset": "Скінуць выбар даты",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "wlheader-enotif": "Апавяшчэньне праз электронную пошту ўключанае.",
        "wlheader-showupdated": "Старонкі, зьмененыя з часу вашага апошняга візыту, вылучаныя <strong>тоўстым</strong> шрыфтам.",
        "wlnote": "Ніжэй {{PLURAL:$1|паказаная <strong>$1</strong> апошняя зьмена|паказаныя <strong>$1</strong> апошнія зьмены|паказаныя <strong>$1</strong> апошніх зьменаў}} за <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзінаў}}, па стане на $4 $3.",
-       "wlshowlast": "Паказаць за апошнія $1 гадзінаў, $2 дзён",
        "watchlist-hide": "Схаваць",
        "watchlist-submit": "Паказаць",
        "wlshowtime": "Пэрыяд часу для паказу:",
        "changecontentmodel": "Зьмена мадэлі зьместу старонкі",
        "changecontentmodel-legend": "Зьмена мадэлі зьместу",
        "changecontentmodel-title-label": "Назва старонкі",
+       "changecontentmodel-current-label": "Бягучая мадэль зьместу:",
        "changecontentmodel-model-label": "Новая мадэль зьместу",
        "changecontentmodel-reason-label": "Прычына:",
        "changecontentmodel-submit": "Зьмяніць",
        "img-lang-default": "(мова па змоўчаньні)",
        "img-lang-info": "Паказаць гэтую выяву наступнай мовай: $1. $2",
        "img-lang-go": "Паказаць",
-       "ascending_abbrev": "узраст.",
-       "descending_abbrev": "зьмянш.",
        "table_pager_next": "Наступная старонка",
        "table_pager_prev": "Папярэдняя старонка",
        "table_pager_first": "Першая старонка",
        "permanentlink": "Сталая спасылка",
        "permanentlink-revid": "Ідэнтыфікатар вэрсіі",
        "permanentlink-submit": "Перайсьці да вэрсіі",
+       "newsection": "Новы разьдзел",
+       "newsection-page": "Мэтавая старонка",
+       "newsection-submit": "Перайсьці да старонкі",
        "dberr-problems": "Прабачце! На гэтым сайце ўзьніклі тэхнічныя цяжкасьці.",
        "dberr-again": "Паспрабуйце пачакаць некалькі хвілінаў і абнавіць.",
        "dberr-info": "(Немагчыма злучыцца з базай зьвестак: $1)",
index 1139f96..c356041 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": "Пароль для робата \"$1\", які належыць {{GENDER:$2|удзельніку|удзельніцы}} \"$2\", мусіць быць скінуты.",
        "resetpass_forbidden": "Не дазволена мяняць паролі",
        "resetpass_forbidden-reason": "Не дазволена мяняць паролі: $1",
        "resetpass-no-info": "Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.",
        "resetpass-expired": "Ваш пароль пратэрмінаваны. Калі ласка, устанавіце новы пароль для ўваходу ў сістэму.",
        "resetpass-expired-soft": "Ваш пароль пратэрмінаваны і яго трэба замяніць. Калі ласка, выберыце новы пароль зараз, ці націсніце \"{{int:authprovider-resetpass-skip-label}}\", каб змяніць яго пазней.",
        "resetpass-validity": "Ваш пароль няверны: $1 \n\nКалі ласка, устанавіце новы пароль для ўваходу ў сістэму.",
-       "resetpass-validity-soft": "Ваш пароль недапушчальны: $1\n\nКалі ласка, выберыце новы пароль зараз, або націсніце \"{{int:authprovider-resetpass-skip-label}}\", каб скінуць яго пазней.",
+       "resetpass-validity-soft": "Ваш пароль недапушчальны: $1\n\nКалі ласка, выберыце новы пароль зараз, або націсніце \"{{int:authprovider-resetpass-skip-label}}\", каб змяніць яго пазней.",
        "passwordreset": "Выслаць мне новы пароль",
        "passwordreset-text-one": "Запоўніце гэту форму, каб атрымаць часовы пароль па эл.пошце.",
        "passwordreset-text-many": "{{PLURAL:$1|Запоўніце адно з палёў, каб атрымаць тымчасовы пароль па электроннай пошце.}}",
        "autoblockedtext": "Ваш адрас IP быў аўтаматычна заблакаваны, таму што ім карыстаўся ўдзельнік, заблакаваны адміністратарам $1.\nПададзеная прычына блоку:\n\n:''$2''\n\n* Блок пастаўлены: $8\n* Блок канчаецца: $6\n* Атрымальнік блоку: $7\n\nВы можаце звярнуцца да $1 або да аднаго з іншых [[{{MediaWiki:Grouppage-sysop}}|адміністратараў]], каб паразмаўляць пра гэты блок.\n\nВы не зможаце дзеля гэтага карыстацца функцыяй ''{{:{{ns:mediawiki}}:emailuser/be}}'', калі гэта вам забаронена, або калі вы не наставілі правільнага пацверджанага адрасу эл.пошты ў сваіх [[Special:Preferences|настаўленнях]].\n\nВаш адрас IP: $3. Ваш нумар блоку: $5. Падавайце ўсе гэтыя звесткі ў кожным сваім звароце адносна гэтага блоку.",
        "systemblockedtext": "Вашае імя ўдзельніка ці IP-адрас былі аўтаматычна заблакаваныя MediaWiki.\nЗ наступнай прычыны:\n\n:<em>$2</em>\n\n* Пачатак блакіроўкі: $8\n* Заканчэнне блакіроўкі: $6\n* Мэта блакіравання: $7\n\nВаш цяперашні IP-адрас — $3.\nКалі ласка, уключайце ўсе пададзеныя вышэй дэталі ва ўсе запыты, што вы робіце.",
        "blockednoreason": "прычына не вызначана",
+       "blockedtext-composite-no-ids": "Ваш IP-адрас наяўны ў некалькіх чорных спісах",
+       "blockedtext-composite-reason": "Маецца некалькі блакіровак вашага рахунку і/ці IP-адрасу",
        "whitelistedittext": "Належыць $1 каб правіць старонкі.",
        "confirmedittext": "Вам трэба пацвердзіць свой адрас эл.пошты перад тым, як правіць старонкі.\nВызначце і пацвердзіце адрас ў сваіх [[Special:Preferences|настáўленнях]].",
        "nosuchsectiontitle": "Няма такога падраздзелу",
        "nocreate-loggedin": "Вам не дазволена ствараць новыя старонкі.",
        "sectioneditnotsupported-title": "Праўка раздзелу не падтрымліваецца",
        "sectioneditnotsupported-text": "Праўка раздзелу не падтрымліваецца на гэтай старонцы.",
+       "modeleditnotsupported-title": "Рэдагаванне не падтрымліваецца",
+       "modeleditnotsupported-text": "Рэдагаванне не падтрымліваецца для мадэлі змесціва $1.",
        "permissionserrors": "Памылка доступу",
        "permissionserrorstext": "Вам не дазволена гэтага рабіць, з наступн{{PLURAL:$1|ай прычыны|ых прычын}}:",
        "permissionserrorstext-withaction": "Вам не дазволена $2, з-за наступ{{PLURAL:$1|най прычыны|ных прычын}}:",
        "editpage-invalidcontentmodel-text": "Мадэль змесціва \"$1\" не падтрымліваецца.",
        "editpage-notsupportedcontentformat-title": "Фармат змесціва не падтрымліваецца",
        "editpage-notsupportedcontentformat-text": "Фармат змесціва $1 не падтрымліваецца мадэллю змесціва $2.",
+       "slot-name-main": "Галоўная",
        "content-model-wikitext": "вікі-тэкст",
        "content-model-text": "звычайны тэкст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Пусты аб’ект",
        "content-json-empty-array": "Пусты масіў",
+       "unsupported-content-model": "<strong>Увага:</strong> Мадэль змесціва $1 не падтрымліваецца на гэтай вікі.",
+       "unsupported-content-diff": "Адрозненні не падтрымліваюцца для мадэлі змесціва $1.",
+       "unsupported-content-diff2": "Адрозненні між мадэлямі змесціва $1 і $2 не падтрымліваюцца на гэтай вікі.",
        "deprecated-self-close-category": "Старонкі з недапушчальнымі самазакрытымі HTML-тэгамі",
        "deprecated-self-close-category-desc": "Старонка ўтрымлівае недапушчальныя самазакрытыя HTML-тэгі, такія як <code>&lt;b/></code> ці <code>&lt;span/></code>. Іх паводзіны ў хуткім часе будуць зменены ў адпаведнасці з спецыфікацыяй HTML5, таму іх ужыванне ў вікітэксце лічыцца састарэлым.",
        "duplicate-args-warning": "<strong>Увага:</strong> [[:$1]] выклікае [[:$2]] з больш чым адным значэннем для параметра \"$3\". Толькі апошняе з пададзеных значэнняў будзе ўжытае.",
        "rcfilters-clear-all-filters": "Ачысціць усе фільтры",
        "rcfilters-show-new-changes": "Паказаць навейшыя змяненні з $1",
        "rcfilters-search-placeholder": "Змяненні фільтра (выкарыстоўвайце меню ці шукайце па назве фільтра)",
+       "rcfilters-search-placeholder-mobile": "Фільтры",
        "rcfilters-invalid-filter": "Недапушчальны фільтр",
        "rcfilters-empty-filter": "Няма актыўных фільтраў. Паказваюцца ўсе праўкі.",
        "rcfilters-filterlist-title": "Фільтры",
        "rcfilters-preference-help": "Адкатвае рэдызайн інтэрфейсу 2017 года і ўсе інструменты, дададзеныя з тых часоў.",
        "rcfilters-watchlist-preference-label": "Выкарыстоўваць інтэрфейс без JavaScript",
        "rcfilters-watchlist-preference-help": "Адкатвае рэдызайн інтэрфейсу 2017 года і ўсе інструменты, дададзеныя з тых часоў.",
+       "rcfilters-filter-showlinkedfrom-label": "Паказаць змены на старонках, на якія спасылаецца",
+       "rcfilters-filter-showlinkedto-label": "Паказаць змены старонак, якія спасылаюцца на",
+       "rcfilters-target-page-placeholder": "Увядзіце назву старонкі (ці катэгорыі)",
+       "rcfilters-allcontents-label": "Увесь змест",
+       "rcfilters-alldiscussions-label": "Усе абмеркаванні",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|паказана змяненне|паказаны змены}} з <strong>$3, $4</strong> (не больш за <strong>$1</strong>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "wlheader-enotif": "Працуе апавяшчанне праз эл.пошту.",
        "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга наведвання, паказаны <strong>абрысам шрыфту</strong>.",
        "wlnote": "Ніжэй {{PLURAL:$1|паказана апошняя <strong>$1</strong> змена|паказаны апошнія <strong>$1</strong> змены|паказаны апошнія <strong>$1</strong> змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзін}}, на момант часу $3 $4.",
-       "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён",
        "watchlist-hide": "Схаваць",
        "watchlist-submit": "Паказаць",
        "wlshowtime": "Перыяд часу для паказу:",
        "sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса.\n\nВярніцеся на папярэднюю старонку, перазагрузіце яе і тады паспрабуйце зноў.",
        "changecontentmodel": "Змяніць мадэль змесціва старонкі",
        "changecontentmodel-legend": "Змяніць мадэль змесціва",
-       "changecontentmodel-title-label": "Назва старонкі",
-       "changecontentmodel-model-label": "Новая мадэль змесціва",
+       "changecontentmodel-title-label": "Назва старонкі:",
+       "changecontentmodel-current-label": "Бягучая мадэль змесціва:",
+       "changecontentmodel-model-label": "Новая мадэль змесціва:",
        "changecontentmodel-reason-label": "Прычына:",
        "changecontentmodel-submit": "Змяніць",
        "changecontentmodel-success-title": "Мадэль змесціва была зменена",
        "contribsub2": "Для $1 ($2)",
        "contributions-subtitle": "Для {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
+       "negative-namespace-not-supported": "Прасторы назваў з адмоўнымі значэннямі не падтрымліваюцца.",
        "nocontribs": "Не знойдзена змен, адпаведных зададзеным параметрам.",
        "uctop": "апошн.",
        "month": "Ад месяца (і раней):",
        "blocklink": "заблакаваць",
        "unblocklink": "адблакаваць",
        "change-blocklink": "змяніць блок",
+       "empty-username": "(імя ўдзельніка недаступна)",
        "contribslink": "уклад",
        "emaillink": "адправіць ліст",
        "autoblocker": "Аўтаматычны блок, таму што вашым адрасам IP нядаўна карыстаўся \"[[User:$1|$1]]\".\nПрычына блакіроўкі ўдзельніка $1: \"$2\"",
        "fix-double-redirects": "Абнавіць усе перасылкі, якія вядуць да пачатковай назвы",
        "move-leave-redirect": "Пакінуць перасылку са старой назвы",
        "protectedpagemovewarning": "<strong>Папярэджанне:</strong> Гэта старонка была змешчана пад ахову; пераназваць яе могуць толькі ўдзельнікі з паўнамоцтвамі адміністратараў.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
-       "semiprotectedpagemovewarning": "<strong>Ð\97аÑ\9eвага:</strong> Ð\93Ñ\8dÑ\82а Ñ\81Ñ\82аÑ\80онка Ð±Ñ\8bла Ð·Ð¼ÐµÑ\88Ñ\87ана Ð¿Ð°Ð´ Ð°Ñ\85овÑ\83; Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ñ\8fе Ð¿Ð°Ð´ Ñ\96нÑ\88Ñ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83 Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аваныя ўдзельнікі.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
+       "semiprotectedpagemovewarning": "<strong>Ð\97аÑ\9eвага:</strong> Ð\93Ñ\8dÑ\82а Ñ\81Ñ\82аÑ\80онка Ð±Ñ\8bла Ð·Ð¼ÐµÑ\88Ñ\87ана Ð¿Ð°Ð´ Ð°Ñ\85овÑ\83; Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c Ñ\8fе Ð¿Ð°Ð´ Ñ\96нÑ\88Ñ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83 Ð¼Ð¾Ð³Ñ\83Ñ\86Ñ\8c Ñ\82олÑ\8cкÑ\96 Ð°Ñ\9eÑ\82апаÑ\86веÑ\80джаныя ўдзельнікі.\nНіжэй для даведкі прыведзена апошні запіс журнала:",
        "move-over-sharedrepo": "Файл з назвай [[:$1]] ёсць у агульным сховішчы. Файл, перанесены пад такую назву, будзе перамагаць файл з агульнага сховішча.",
        "file-exists-sharedrepo": "Такая назва файла ўжо выкарыстана ў агульным сховішчы.\nВыберыце іншую назву.",
        "export": "Экспартаваць старонкі",
        "tooltip-summary": "Дайце кароткае апісанне",
        "common.css": "/** CSS, упісаны сюды, будзе дзейнічаць на карыстальнікаў усіх світаў */",
        "group-autoconfirmed.css": "/* Размешчаны тут CSS будзе прымяняцца для аўтапацверджаных удзельнікаў */",
+       "common.json": "/* JSON-код, упісаны сюды, будзе выконвацца для кожнага чытача, на кожным счытванні старонкі. */",
        "common.js": "/* Яваскрыпт, упісаны сюды, будзе выконвацца для кожнага чытача, на кожным счытванні старонкі. */",
        "group-autoconfirmed.js": "/* Размешчаны тут код JavaScript будзе прымяняцца для толькі аўтапацверджаных удзельнікаў */",
        "anonymous": "Ананімны{{PLURAL:$1| ўдзельнік|я ўдзельнікі}} на пляцоўцы {{SITENAME}}",
        "pageinfo-category-subcats": "Колькасць падкатэгорый",
        "pageinfo-category-files": "Колькасць файлаў",
        "pageinfo-user-id": "Ідэнтыфікатар удзельніка",
+       "pageinfo-file-hash": "Хэш-значэнне",
        "markaspatrolleddiff": "Пазначыць як ухваленае",
        "markaspatrolledtext": "Пазначыць старонку як ухваленую",
        "markaspatrolledtext-file": "Пазначыць версію файла як ухваленую",
        "img-lang-default": "(прадвызначаная мова)",
        "img-lang-info": "Паказаць гэту выяву на мове $1. $2",
        "img-lang-go": "Перайсці",
-       "ascending_abbrev": "да больш.",
-       "descending_abbrev": "да менш.",
        "table_pager_next": "Наступная старонка",
        "table_pager_prev": "Папярэдняя старонка",
        "table_pager_first": "Першая старонка",
        "redirect-file": "Назва файла",
        "redirect-logid": "ID журнала",
        "redirect-not-exists": "Значэнне не знойдзена",
+       "redirect-not-numeric": "Значэнне не лікавае",
        "fileduplicatesearch": "Пошук дублікатных файлаў",
        "fileduplicatesearch-summary": "Пошук дублікатных файлаў на падставе іх хэшаў.",
        "fileduplicatesearch-filename": "Назва файла:",
        "tags-edit-chosen-placeholder": "Выберыце біркі",
        "tags-edit-chosen-no-results": "Не знойдзена бірак, якія б адпавядалі запыту",
        "tags-edit-reason": "Прычына:",
+       "tags-edit-success": "Змены былі дастасаваныя.",
        "tags-edit-nooldid-title": "Недапушчальная мэтавая версія",
        "tags-edit-nooldid-text": "Вы або не пазначылі мэтавую версію для выканання гэтай функцыі, або пазначаная версія не існуе.",
        "tags-edit-none-selected": "Калі ласка, выберыце прынамсі адну бірку для дадання ці выдалення.",
        "permanentlink": "Пастаянная спасылка",
        "permanentlink-revid": "ідэнтыфікатар праўкі",
        "permanentlink-submit": "Перайсці да версіі",
+       "newsection-page": "Мэтавая старонка",
+       "newsection-submit": "Перайсці на старонку",
        "dberr-problems": "Прабачце, на пляцоўцы здарыліся тэхнічныя цяжкасці.",
        "dberr-again": "Паспрабуйце перачытаць праз некалькі хвілін.",
        "dberr-info": "(Немагчыма звязацца з базай даных: $1)",
        "htmlform-time-placeholder": "ЧЧ:ММ:СС",
        "htmlform-datetime-placeholder": "ГГГГ-ММ-ДД ЧЧ:ММ:СС",
        "htmlform-date-invalid": "Указанае вамі значэнне не похоже на дату. Паспрабуйце выкарыстоўваць фармат ГГГГ-ММ-ДД.",
+       "htmlform-time-invalid": "Указанае вамі значэнне не похоже на час. Паспрабуйце выкарыстоўваць фармат ГГ:ХХ:СС.",
        "htmlform-datetime-invalid": "Вамі выбрана значэнне не падобна на дату і час. Паспрабуйце выкарыстоўваць фармат ГГГГ-ММ-ДД ГГ-ММ-СС.",
        "htmlform-title-badnamespace": "[[:$1]] не ў прасторы назваў \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" - немагчымы загаловак для старонкі",
        "logentry-delete-restore": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3 ($4)",
        "logentry-delete-restore-nocount": "$1 {{GENDER:$2|аднавіў|аднавіла}} старонку $3",
        "restore-count-revisions": "{{PLURAL:$1|1 версія|$1 версіі|$1 версій}}",
+       "restore-count-files": "{{PLURAL:$1|1 файл|$1 файлы|$1 файлаў}}",
        "logentry-delete-event": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|запісу журнала|$5 запісаў журнала}} $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць {{PLURAL:$5|версіі|$5 версій|$5 версій}} старонкі $3: $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|змяніў|змяніла}} бачнасць запісаў журнала $3",
        "expandtemplates": "Разгортванне шаблонаў",
        "expand_templates_intro": "Гэта адмысловая старонка бярэ тэкст і разгортвае ў ім усе шаблоны рэкурсіўна.\nТаксама разгортвае падтрыманыя функцыі парсера кшталту\n<code><nowiki>{{</nowiki>#language:…}}</code> і зменныя віду\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nФактычна, яна разгортвае ў пэўнай ступені ўсё ў двайных фігурных дужках.",
        "expand_templates_title": "Загаловак старонкі, для {{FULLPAGENAME}} і г.д.:",
-       "expand_templates_input": "Уваходны тэкст:",
+       "expand_templates_input": "Уваходны вікітэкст:",
        "expand_templates_output": "Вынік",
        "expand_templates_xml_output": "Выніковы XML",
        "expand_templates_html_output": "Выніковы зыходны код HTML",
        "expand_templates_generate_xml": "Паказаць дрэва сінтаксічнага аналізу XML",
        "expand_templates_generate_rawhtml": "Паказаць зыходны код HTML",
        "expand_templates_preview": "Перадпаказ",
-       "expand_templates_input_missing": "Трэба ўвесці хоць які-небудзь тэкст.",
+       "expand_templates_input_missing": "Трэба ўвесці хоць які-небудзь вікітэкст.",
        "pagelanguage": "Змяніць мову старонкі",
        "pagelang-name": "Старонка",
        "pagelang-language": "Мова",
        "mediastatistics-header-executable": "Выкананыя",
        "mediastatistics-header-archive": "Сціснутыя фарматы",
        "mediastatistics-header-total": "Усе файлы",
+       "json-error-unknown": "Узнікла праблема з JSON. Памылка: $1",
        "json-error-state-mismatch": "Недапушчальны або некарэктны JSON",
        "json-error-syntax": "Памылка сінтаксісу",
        "headline-anchor-title": "Спасылка на гэты раздзел",
        "log-action-filter-contentmodel-change": "Змяненне мадэлі змесціва",
        "log-action-filter-contentmodel-new": "Стварэнне старонкі з нестандартнай мадэллю змесціва",
        "log-action-filter-delete-delete": "Выдаленне старонкі",
+       "log-action-filter-delete-delete_redir": "Перазапіс перасылкі",
        "log-action-filter-delete-restore": "Узнаўленне старонкі",
        "log-action-filter-delete-event": "Выдаленне лога",
        "log-action-filter-delete-revision": "Выдаленне перагляду",
        "log-action-filter-suppress-reblock": "Скрыванне ўдзельніка праз паўторнае блакіраванне",
        "log-action-filter-upload-upload": "Новая загрузка",
        "log-action-filter-upload-overwrite": "Паўторная загрузка",
+       "log-action-filter-upload-revert": "Адкаціць",
        "authmanager-authn-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
        "authmanager-authn-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць завераны.",
        "authmanager-authn-no-local-user": "Пададзеныя ўліковыя дадзеныя не звязаныя з ніводным удзельнікам на гэтай Вікі.",
        "authmanager-authn-autocreate-failed": "Аўтаматычнае стварэнне лакальнага ўліковага запісу не ўдалося: $1",
        "authmanager-change-not-supported": "Прадастаўленыя ўліковыя дадзеныя не могуць быць зменены, як нішто не будзе іх выкарыстоўваць.",
        "authmanager-create-disabled": "стварэнне рахунка не дазволена",
-       "authmanager-create-from-login": "Каб стварыць уліковы запіс, калі ласка, запоўніце палі ніжэй.",
+       "authmanager-create-from-login": "Каб стварыць уліковы запіс, калі ласка, запоўніце палі.",
        "authmanager-create-not-in-progress": "Праверка сапраўднасці не выконваецца або сесія перадачы дадзеных была страчана. Калі ласка, пачніце зноў з самага пачатку.",
        "authmanager-create-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для стварэння ўліковага запісу.",
        "authmanager-link-no-primary": "Прадастаўленыя ўліковыя дадзеныя не могуць быць выкарыстаны для прывязкі рахунку.",
        "revid": "версія $1",
        "pageid": "ID старонкі $1",
        "pagedata-title": "Дадзеныя старонкі",
+       "passwordpolicies-group": "Група",
+       "passwordpolicies-policies": "Палітыкі",
        "passwordpolicies-policyflag-forcechange": "мусіць быць зменены пры ўваходзе",
        "passwordpolicies-policyflag-suggestchangeonlogin": "прапанаваць змяненне пры ўваходзе"
 }
index c129d55..bc5c403 100644 (file)
        "wlheader-enotif": "Известяването по е-поща е включено.",
        "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в <strong>получер</strong>.",
        "wlnote": "{{PLURAL:$1|Показана е последната промяна|Показани са последните <strong>$1</strong> промени}} през {{PLURAL:$2|последния час|последните <strong>$2</strong> часа}}, започвайки от $3, $4.",
-       "wlshowlast": "Показване на последните $1 часа $2 дни",
        "watchlist-hide": "Скриване",
        "watchlist-submit": "Показване",
        "wlshowtime": "Период от време за показване:",
        "img-lang-opt": "$2 ($1)",
        "img-lang-default": "(език по подразбиране)",
        "img-lang-go": "Отваряне",
-       "ascending_abbrev": "възх",
-       "descending_abbrev": "низх",
        "table_pager_next": "Следваща страница",
        "table_pager_prev": "Предишна страница",
        "table_pager_first": "Първа страница",
index ebbed3e..b5ee9f0 100644 (file)
        "wlheader-enotif": "ایمیل ئی ناتیپشن پئال اینت.",
        "wlheader-showupdated": "تاکدیمان که شه شمی آخیرین دیستینا پد تغیر بوته انت '''پررنگ''' نشان داته بیئنت.",
        "wlnote": "بئ جهلگا {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که بئ {{PLURAL:$2|سائت|<strong>$2</strong> سائت}} دیمتیرا انجام بوته موجود اینت، آخیرین بازیابی تاریخ: $3، $4",
-       "wlshowlast": "نشان داتین آخیرئین $1 سائت $2 روچئ",
        "watchlist-hide": "چیهر داتین",
        "watchlist-options": "واچلیستئ آپشن",
        "watching": "بئ دیستینئ حالا...",
        "img-lang-default": "(پیش‌فرض ئین زبان)",
        "img-lang-info": "ارایه کورتین ای اکسی بی  $1 .  $2",
        "img-lang-go": "برا",
-       "ascending_abbrev": "صعودی",
-       "descending_abbrev": "نزولی",
        "table_pager_next": "دیگرین تاکدیم",
        "table_pager_prev": "دیمتیرین تاکدیم",
        "table_pager_first": "اولین تاکدیم",
index 14f41f9..30ebb28 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 पन्ना}} राउर धियानसूची में बा (आ वार्ता पन्ना)।",
        "wlheader-showupdated": "राउर अंतिम विजिट के बाद जवना पन्ना सभ में बदलाव भइल बा ऊ <strong>मोट अच्छर</strong> में देखावल जात बाड़ें।",
        "wlnote": "नीचे $3, $4 तक ले, आखिरी {{PLURAL:$2|घंटा|<strong>$2</strong> घंटा}} में भइल {{PLURAL:$1|अंतिम बदलाव बा|अंतिम <strong>$1</strong> बदलाव बाड़ें}}।",
-       "wlshowlast": "पछिला $1 घंटा $2 दिन देखावल जाय",
        "watchlist-hide": "छिपावल जाय",
        "watchlist-submit": "देखावल जाय",
        "wlshowtime": "डिस्प्ले के समय सीमा:",
index 829bcbb..937c0bb 100644 (file)
        "wlheader-enotif": "Suril pamadahan dipajahi.",
        "wlheader-showupdated": "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam <strong>hurup kandal</strong>.",
        "wlnote": "Dibawah ngini adalah {{PLURAL:$1|paubahan pahabisan|<strong>$1</strong> paubahan pahabisan}} dalam {{PLURAL:$2|sajam|<strong>$2</strong> jam}} par $3, $4.",
-       "wlshowlast": "Tampaiakan $1 jam $2 hari pahabisan",
        "watchlist-options": "Pilihan daptar itihan",
        "watching": "Maitihi...",
        "unwatching": "Kada jadi maitihi...",
        "imgmultipagenext": "halaman salanjutnya →",
        "imgmultigo": "Tulak!",
        "imgmultigoto": "Tulak ka tungkaran $1",
-       "ascending_abbrev": "naik",
-       "descending_abbrev": "turun",
        "table_pager_next": "Tungkaran salanjutnya",
        "table_pager_prev": "Tungkaran sabalumnya",
        "table_pager_first": "Tungkaran panambaian",
index 689ac74..a309520 100644 (file)
        "nocreate-loggedin": "আপনার নতুন পাতা তৈরি করার অনুমোদন নেই।",
        "sectioneditnotsupported-title": "অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
        "sectioneditnotsupported-text": "এই সম্পাদনা পাতায় অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
+       "modeleditnotsupported-title": "সম্পাদনা সমর্থিত নয়",
+       "modeleditnotsupported-text": "বিষয়বস্তুর রূপ $1-এর জন্য সম্পাদনা করা সমর্থিত নয়।",
        "permissionserrors": "অনুমতি ত্রুটি",
        "permissionserrorstext": "নিন্মলিখিত {{PLURAL:$1|কারণটির|কারণগুলির}} জন্য আপনার এটা করার অনুমতি নেই:",
        "permissionserrorstext-withaction": "আপনার $2 অনুমতি নেই, যার {{PLURAL:$1|কারণটি|কারণগুলি}} হল:",
        "content-model-css": "সিএসএস",
        "content-json-empty-object": "খালি বস্তু",
        "content-json-empty-array": "খালি অ্যারে",
+       "unsupported-content-model": "<strong>সতর্কতা:</strong> এই উইকিতে বিষয়বস্তুর রূপ $1 সমর্থিত নয়।",
+       "unsupported-content-diff": "বিষয়বস্তুর রূপ $1-এর জন্য পার্থক্য দেখানো সমর্থিত নয়।",
        "deprecated-self-close-category": "অবৈধ স্ব-বন্ধকৃত এইচটিএমএল ট্যাগ ব্যবহার করা পাতা",
        "deprecated-self-close-category-desc": "এই পাতাটি অবৈধ স্ব-বন্ধকৃত এইচটিএমএল ট্যাগ ধারন করে, যেমন <code>&lt;b/></code> বা <code>&lt;span/></code>। এইচটিএমএল৫-এর নির্দিষ্টকরণের সঙ্গে সামঞ্জস্যপূর্ণ হতে এইসবের আচরণ শীঘ্রই পরিবর্তন করা হবে, তাই উইকিপাঠ্যে তাদের ব্যবহার অবচিত হয়েছে।",
        "duplicate-args-warning": "<strong>সতর্কীকরণ:</strong> \"$3\" প্যারামিটারের জন্য একের অধিক মানসহ [[:$1]] [[:$2]] কে আহ্বান করছে। শুধুমাত্র প্রদত্ত শেষ মান ব্যবহৃত হবে।",
        "rcfilters-filter-showlinkedto-label": "এটিতে সংযোগকারী পাতাসমূহের পরিবর্তন দেখান",
        "rcfilters-filter-showlinkedto-option-label": "নির্বাচিত পাতাটিতে <strong>সংযোগকারী পাতাসমূহ</strong>",
        "rcfilters-target-page-placeholder": "একটি পাতার নাম (বা বিষয়শ্রেণী) লিখুন",
+       "rcfilters-allcontents-label": "সকল বিষয়বস্তু",
+       "rcfilters-alldiscussions-label": "সকল আলোচনা",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfromreset": "তারিখ নির্বাচন পুনঃস্থাপন করুন",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote": "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘন্টায়|<strong>$2</strong> ঘন্টায়}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবর্তন|শেষ <strong>$1টি</strong> পরিবর্তন}} দেখানো হল।",
-       "wlshowlast": "সর্বশেষ $1 ঘণ্টা $2 দিনে দেখাও",
        "watchlist-hide": "লুকিয়ে রাখা হোক",
        "watchlist-submit": "দেখাও",
        "wlshowtime": "প্রদর্শনের সময় কাল:",
        "changecontentmodel": "একটি পাতার বিষয়বস্তুর রূপ পরিবর্তন",
        "changecontentmodel-legend": "বিষয়বস্তুর রূপ পরিবর্তন করুন",
        "changecontentmodel-title-label": "পাতার শিরোনাম",
+       "changecontentmodel-current-label": "বর্তমান বিষয়বস্তুর রূপ:",
        "changecontentmodel-model-label": "পাতার বিষয়বস্তুর প্রতিরূপ",
        "changecontentmodel-reason-label": "কারণ:",
        "changecontentmodel-submit": "পরিবর্তন করুন",
        "immobile-target-namespace-iw": "পাতা স্থানান্তরের ক্ষেত্রে ইন্টারউইকি লিংক ব্যবহার করা যাবে না।",
        "immobile-source-page": "এই পাতাটির স্থানান্তর সম্ভব নয়।",
        "immobile-target-page": "গন্তব্য শিরোনামে স্থানান্তর করা যাবে না।",
+       "movepage-invalid-target-title": "অনুরোধকৃত নামটি অবৈধ।",
        "bad-target-model": "আকাঙ্ক্ষিত গন্তব্যটি একটি ভিন্ন সামগ্রীর মডেল ব্যবহার করে। $1 থেকে $2-এ রূপান্তর করা যাবে না।",
        "imagenocrossnamespace": "কোনো ফাইল ফাইলনয় এমন নামস্থানে স্থানান্তর সম্ভব নয়",
        "nonfile-cannot-move-to-file": "কোনো ফাইলনয় এমন কোনো পাতা ফাইল নামস্থানে স্থানান্তর সম্ভব নয়",
        "confirm-unwatch-top": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?",
        "confirm-rollback-button": "ঠিক আছে",
        "confirm-rollback-top": "এই পাতায় করা সম্পাদনাগুলি প্রত্যাবর্তন করবেন?",
+       "confirm-rollback-bottom": "এই ক্রিয়াটি তাত্ক্ষণিকভাবে এই পাতায় নির্বাচিত পরিবর্তনগুলি রোলব্যাক করবে।",
        "confirm-mcrrestore-title": "সংশোধনটি পুনরুদ্ধার করুন",
        "confirm-mcrundo-title": "একটি পরিবর্তন পূর্বাবস্থায় আনুন",
        "mcrundofailed": "পূর্বাবস্থায় ফেরা ব্যর্থ হয়েছে",
        "img-lang-default": "(ডিফল্ট ভাষা)",
        "img-lang-info": "$1 এ ছবিটি রেন্ডার করো। $2",
        "img-lang-go": "যাও",
-       "ascending_abbrev": "আরোহণ",
-       "descending_abbrev": "অবতরণ",
        "table_pager_next": "পরবর্তী পাতা",
        "table_pager_prev": "পূর্ববর্তী পাতা",
        "table_pager_first": "প্রথম পাতা",
index 88c0642..ef89699 100644 (file)
        "watchthispage": "དྲ་ངོས་འདི་ལ་གཟིགས།",
        "unwatch": "མི་བལྟ་བ།",
        "unwatchthispage": "བལྟ་བ་མཚམས་འཇོག",
-       "wlshowlast": "འདས་བའི་དུས་ཚོད་ $1 ནང་ཚུན་  ཉིན་མ་ $2 ནང་ཚུན་  སྟོན།",
        "watchlist-options": "ལྟ་ཐོའི་འདེམས་ཚན།",
        "watching": "ལྟ་ཐོར་འཇུག་བཞིན་པ་་་",
        "unwatching": "ལྟ་ཐོ་ལས་འདོར་བཞིན་པ་་་",
index 4685097..10cb897 100644 (file)
        "unwatch": "তালাবি নেই",
        "unwatchthispage": "তালাবি এরাদেনা",
        "watchlist-details": "{{PLURAL:$1|$1 পাতা|$1 পাতাহানি}} তর তালাবিত আসে, য়্যারির পাতা ধরানি নাসে।",
-       "wlshowlast": "গেলগা $1 ঘন্টা $2 দিনর  দেখাদে",
        "watchlist-options": "তালাবিত আসে পাতার পছনহানি",
        "watching": "চা...",
        "unwatching": "নাউচা...",
        "imgmultipagenext": "থাঙনার পাতাহান →",
        "imgmultigo": "হাত!",
        "imgmultigoto": "$1 পাতাহাত যাগা",
-       "ascending_abbrev": "কাহানি",
-       "descending_abbrev": "লামানি",
        "table_pager_next": "থাঙনার পাতাহান",
        "table_pager_prev": "আগাকার পাতাহান",
        "table_pager_first": "পয়লাকর পাতাহান",
index f1617f5..99a3e29 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 بٱلٛگاْ|$1 بٱلٛگیٱل}} مؽن لیست دیناگری ایسا,هؽڌا",
        "wlheader-showupdated": "بٱلٛگیٱلؽ کاْ دیناتٱر زاْ آخرین ساٛل اؽسا آلشڌ آڤیڌ ناْ<strong>پورٱنڳ</strong> نماونیڌاْ آڤیڌناْ",
        "wlnote": "ڤاْ لٱم {{PLURAL:$1|آلشڌؽ|<strong>$1</strong> آلشڌؽ}} کاْ ڤاْ {{PLURAL:$2|سات|<strong>$2</strong> سات}} رٱئڌاْ انجوم آڤؽڌ مۉجۊڌ هؽڌا،ؤرگار دوکرٱت ڤینی دینائی: $3، $4",
-       "wlshowlast": "نماونیڌن ٱخیری $1 سات $2 رۊز",
        "watchlist-hide": "قام کردن",
        "watchlist-submit": "نشوݩ دائن",
        "wlshowhideminor": "هیرداْ ڤیرایشت",
        "imgmultigo": "رۉڤا",
        "imgmultigoto": "رٱئڌن ڤاٛ بٱلٛگاْ $1",
        "img-lang-go": "رۉ",
-       "ascending_abbrev": "ری ڤا رو",
-       "descending_abbrev": "ری ڤا دڤوݩ",
        "table_pager_next": "بٱلگاْ نيايی",
        "table_pager_prev": "بٱلگاْ دیندایی",
        "table_pager_first": "سرتال",
index df8b5d1..2447773 100644 (file)
        "wlheader-enotif": "Gweredekaet eo ar c'has posteloù.",
        "wlheader-showupdated": "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
        "wlnote": "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} c'hoarvezet e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} diwezhañ, d'an $3 da $4.",
-       "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ",
        "watchlist-hide": "Kuzhat",
        "watchlist-submit": "Diskouez",
        "wlshowtime": "Prantad amzer war wel :",
        "img-lang-default": "(yezh dre ziouer)",
        "img-lang-info": "Diskouez ar skeudenn-mañ e $1. $2",
        "img-lang-go": "Mont",
-       "ascending_abbrev": "pignat",
-       "descending_abbrev": "diskenn",
        "table_pager_next": "Pajenn war-lerc'h",
        "table_pager_prev": "Pajenn gent",
        "table_pager_first": "Pajenn gentañ",
index 8e912c9..d376b9e 100644 (file)
        "wlheader-enotif": "Uključeno je obavještenje e-poštom.",
        "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili istaknute su <strong>podebljanim slovima</strong>.",
        "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su <strong>$1</strong> posljednje izmjene|su <strong>$1</strong> posljednjih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
-       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
        "wlshowtime": "Vremensko razdoblje za prikaz:",
        "img-lang-default": "(podrazumijevani jezik)",
        "img-lang-info": "Prikaži ovu sliku u $1. $2",
        "img-lang-go": "Idi",
-       "ascending_abbrev": "rast",
-       "descending_abbrev": "opad",
        "table_pager_next": "Sljedeća stranica",
        "table_pager_prev": "Prethodna stranica",
        "table_pager_first": "Prva stranica",
index 7e23758..cca63b2 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 page is|$1 alaman}} i pamataanmu (dot alaman parkobaran).",
        "wlheader-showupdated": "Laman na madung iubah sian parpudi Amu ligi, ipatidaon i huruf <strong> naapal </strong>.",
        "wlnote": "Itoruon {{PLURAL:$1|is the last change|ima parpudi<strong>$1</strong> parubaan}} i {{PLURAL:$2|hour|<strong>$2</strong> jom}}, i $3, $4.",
-       "wlshowlast": "Patidaon parpudi $1 jom $2 ari",
        "watchlist-options": "Opsi pamataan",
        "enotif_reset": "Tandai sude alaman namadung iligi",
        "dellogpage": "Apus log",
index be12af0..62b9f07 100644 (file)
        "emailccme": "Padarhi ako sa kopya ku kanakong mensahe",
        "emailsenttext": "A kanimong email naipadara na.",
        "watchlistfor2": "Para sa $1 $2",
-       "wlshowlast": "Ipabayad a huring $1 mga oras $2 mga aldow",
        "delete-confirm": "Puraon a $1",
        "deleteotherreason": "Iba/rugang na rason:",
        "protect-otherreason": "Iba/rugang na rason:",
index 1d77bf0..1da9b96 100644 (file)
        "wlheader-enotif": "La notificació per correu electrònic està habilitada.",
        "wlheader-showupdated": "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
        "wlnote": "A sota hi ha {{PLURAL:$1|el darrer canvi|els darrers <strong>$1</strong> canvis}} en {{PLURAL:$2|la darrera hora|les <strong>$2</strong> darreres hores}}, a $4 del $3.",
-       "wlshowlast": "Mostra les darreres $1 hores, els darrers $2 dies",
        "watchlist-hide": "Amaga",
        "watchlist-submit": "Mostra",
        "wlshowtime": "Període de temps per mostrar:",
        "img-lang-default": "(llengua per defecte)",
        "img-lang-info": "Dibuixa aquesta imatge en $1. $2",
        "img-lang-go": "Vés-hi",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Pàgina següent",
        "table_pager_prev": "Pàgina anterior",
        "table_pager_first": "Primera pàgina",
index f5cf86a..b0b7e01 100644 (file)
        "watchlist-details": "Nṳ̄ gì găng-sê-dăng {{PLURAL:$1|ô $1 gó|dŭ liāng ô $1 gó}} hiĕk-miêng (bău-guák tō̤-lâung-hiĕk).",
        "wlheader-enotif": "Ī-gĭng kŭi kó̤ diêng-piĕ tŭng-dĭ.",
        "wlheader-showupdated": "Ṳ̀-guō ô diê-siŏh-hiĕk, găk nṳ̄ muōi-muōi siŏh-huòi káng guó cī-hâiu, bô ké̤ṳk nè̤ng gāi kó̤, hī-siŏh-hiĕk gì biĕu-dà̤ cêu-sê <strong>cū-tā̤</strong>.",
-       "wlshowlast": "顯示最$1點鐘$2日",
        "watchlist-options": "監視單選項",
        "watching": "監視...",
        "deletepage": "刪頁",
        "imgmultipagenext": "下蜀頁 →",
        "imgmultigo": "去!",
        "imgmultigoto": "Kó̤ {{PLURAL:$1|tàu-siŏh-hiĕk|dâ̤ $1 hiĕk}}",
-       "ascending_abbrev": "升",
-       "descending_abbrev": "降",
        "table_pager_next": "下蜀頁",
        "table_pager_prev": "前蜀頁",
        "table_pager_first": "頭頁",
index e17b954..050fac0 100644 (file)
        "wlheader-enotif": "Электронан поште хаамаш байтар латина ду.",
        "wlheader-showupdated": "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
        "wlnote": "Гойту <strong>$2</strong> {{plural:$2|сахьтчохь}} бина {{PLURAL:$1|тӀеххьара '''$1''' хийцам}}, хан $3 $4",
-       "wlshowlast": "Гайта тӀаьххьара $1 сахьт $2 де",
        "watchlist-hide": "Къайлаяккха",
        "watchlist-submit": "Гайта",
        "wlshowtime": "Гаран хенан мур:",
        "img-lang-default": "(Ӏадйитаран кепаца болу мотт)",
        "img-lang-info": "Гайта хӀара сурт $1 $2 маттахь",
        "img-lang-go": "Кхочушдé",
-       "ascending_abbrev": "гар",
-       "descending_abbrev": "йина",
        "table_pager_next": "ТӀаьхьа йогӀу агӀо",
        "table_pager_prev": "Хьалха йоьду агӀо",
        "table_pager_first": "Хьалхара агӀо",
index 5e78a8f..7e55168 100644 (file)
        "watchthispage": "Bantayi kining panid",
        "unwatch": "Pasagdi",
        "watchlist-details": "{{PLURAL:$1|$1 ka panid|$1 ka mga panid}} ang imong gibantayan, way labot ang mga panid sa hisgot.",
-       "wlshowlast": "Ipakita ang miaging $1 ka oras $2 ka mga adlaw",
        "watchlist-hide": "Tagoa",
        "watchlist-options": "Mga opsyon sa akong gibantayan",
        "watching": "Gibantayan...",
index aad2607..f4ca5e3 100644 (file)
        "watchthispage": "Pulan este na påhina",
        "unwatch": "Basta mapulan",
        "watchlist-details": "{{PLURAL:$1|$1 påhina|$1 na påhina siha}} un pupulan, sin i påhinan kombetsasion siha.",
-       "wlshowlast": "Na'annok $1 na ora yan $2 na diha siha gi halacha",
        "watching": "Mamulan...",
        "unwatching": "Pumapara mamulan...",
        "deletepage": "Na'suha i påhina",
index d0cb5d0..34b49f5 100644 (file)
        "wlheader-enotif": "ئاگاداری بە ئیمەیل چالاکە.",
        "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دوایین سەردانت دەستکاری کراون بە <strong>ئەستوور</strong> نیشان دراون.",
        "wlnote": "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین <strong>$1</strong> گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|<strong>$2</strong> کاتژمێر}}دا ھەتا $4ی $3.",
-       "wlshowlast": "دوایین $1 کاتژمێری $2 ڕۆژ نیشان بدە",
        "watchlist-hide": "شاردراوە",
        "watchlist-submit": "نیشاندان",
        "wlshowtime": "ماوەی کات بۆ نیشاندان:",
        "imgmultigoto": "بڕۆ بۆ پەڕەی $1",
        "img-lang-default": "(زمانی بنچینەیی)",
        "img-lang-go": "بڕۆ",
-       "ascending_abbrev": "بەرەوە ژوور",
-       "descending_abbrev": "بەرەوە ژێر",
        "table_pager_next": "پەڕەی داهاتوو",
        "table_pager_prev": "پەڕەی پێشوو",
        "table_pager_first": "پەرەی یەکەم",
index 3b4287f..77374a6 100644 (file)
        "watchlistfor2": "Per $1 ($2)",
        "watch": "Suvità",
        "unwatch": "Ùn suvità micca",
-       "wlshowlast": "Mustrà l'ùltime $1 ore $2 ghjorni",
        "enotif_reset": "Marcà tutte e pagine visitate",
        "created": "creatu",
        "changed": "cambiatu",
index 6d90b59..ff9ef93 100644 (file)
        "watchthispage": "Bantayan ang mini nga pahina",
        "unwatch": "Di pagbantayan",
        "watchlist-details": "{{PLURAL:$1|$1 ka pahina|$1 ka mga pahina}} sa imo listahan sang ginabantayan, wala madala ang mga pahina sang istoryahanay.",
-       "wlshowlast": "Ipakita ang nagligad nga $1 ka mga oras $2 ka mga adlaw",
        "watchlist-options": "Pililian para sa listahan sang mga ginabantayan",
        "watching": "Ginabantayan...",
        "unwatching": "Wala ginabantayan...",
index bd3b698..b81a67f 100644 (file)
        "wlheader-enotif": "E-mail иле хабер берюв ачылды.",
        "wlheader-showupdated": "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
        "wlnote": "Ашагъыда саат $3, $4 ичюн сонъки {{PLURAL:$2|1=саат|'''$2''' саат}} ичинде япылгъан сонъки {{PLURAL:$1|1=денъиштирме|'''$1''' денъиштирме}} косьтериле.",
-       "wlshowlast": "Сонъки $1 саат ичюн, $2 кунь ичюн я да  косьтер",
        "watchlist-options": "Козетюв джедвели сазламалары",
        "watching": "Козетюв джедвелине кирсетильмекте...",
        "unwatching": "Козетюв джедвелинден ёкъ этильмекте...",
        "imgmultipagenext": "сонъраки саифе →",
        "imgmultigo": "Бар",
        "imgmultigoto": "$1 саифесине бар",
-       "ascending_abbrev": "кичиктен буюкке",
-       "descending_abbrev": "буюктен кичикке",
        "table_pager_next": "Сонъраки саифе",
        "table_pager_prev": "Эвельки саифе",
        "table_pager_first": "Ильк саифе",
index 5d016ef..e0326c5 100644 (file)
        "wlheader-enotif": "E-mail ile haber berüv açıldı.",
        "wlheader-showupdated": "Soñki ziyaretiñizden soñ deñiştirilgen saifeler '''qalın ariflernen''' kösterildi.",
        "wlnote": "Aşağıda saat $3, $4 içün soñki {{PLURAL:$2|saat|'''$2''' saat}} içinde yapılğan soñki {{PLURAL:$1|deñiştirme|'''$1''' deñiştirme}} kösterile.",
-       "wlshowlast": "Soñki $1 saat içün, $2 kün içün ya da  köster",
        "watchlist-options": "Közetüv cedveli sazlamaları",
        "watching": "Közetüv cedveline kirsetilmekte...",
        "unwatching": "Közetüv cedvelinden yoq etilmekte...",
        "imgmultipagenext": "soñraki saife →",
        "imgmultigo": "Bar",
        "imgmultigoto": "$1 saifesine bar",
-       "ascending_abbrev": "kiçikten büyükke",
-       "descending_abbrev": "büyükten kiçikke",
        "table_pager_next": "Soñraki saife",
        "table_pager_prev": "Evelki saife",
        "table_pager_first": "İlk saife",
index e1486a3..15f5ee1 100644 (file)
@@ -44,7 +44,8 @@
                        "Jan Růžička",
                        "Jaroslav Cerny",
                        "Slepi",
-                       "Tchoř"
+                       "Tchoř",
+                       "SimonV"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
        "wlheader-enotif": "Upozorňování e-mailem je zapnuto.",
        "wlheader-showupdated": "Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny <strong>tučně</strong>.",
        "wlnote": "Níže {{PLURAL:$1|je poslední změna|jsou poslední <strong>$1</strong> změny|je posledních <strong>$1</strong> změn}} za {{PLURAL:$2|poslední hodinu|poslední <strong>$2</strong> hodiny|posledních <strong>$2</strong> hodin}} do $4, $3.",
-       "wlshowlast": "Ukázat posledních $1 hodin $2 dnů",
        "watchlist-hide": "Skrýt",
        "watchlist-submit": "Zobrazit",
        "wlshowtime": "Zobrazené období:",
        "sessionfailure": "Nastal problém s vaším přihlášením;\nvámi požadovaná činnost byla zrušena jako prevence před neoprávněným přístupem.\nStiskněte tlačítko „zpět“, obnovte stránku, ze které jste přišli, a zkuste činnost znovu.",
        "changecontentmodel": "Změnit model obsahu stránky",
        "changecontentmodel-legend": "Změnit model obsahu",
-       "changecontentmodel-title-label": "Název stránky",
+       "changecontentmodel-title-label": "Název stránky:",
        "changecontentmodel-current-label": "Současný model obsahu:",
-       "changecontentmodel-model-label": "Nový model obsahu",
+       "changecontentmodel-model-label": "Nový model obsahu:",
        "changecontentmodel-reason-label": "Důvod:",
        "changecontentmodel-submit": "Změnit",
        "changecontentmodel-success-title": "Model obsahu byl změněn",
        "img-lang-default": "(implicitní jazyk)",
        "img-lang-info": "Vykreslit tento obrázek v jazyce $1 $2",
        "img-lang-go": "Provést",
-       "ascending_abbrev": "vzest.",
-       "descending_abbrev": "sest.",
        "table_pager_next": "Následující stránka",
        "table_pager_prev": "Předchozí stránka",
        "table_pager_first": "První stránka",
index df2608c..88dcf0e 100644 (file)
        "watchlist-details": "{{PLURAL:$1|Starna je |$1 Starnë są}} na twòji lësce ùzérónych starnów (diskùsëji téż)",
        "wlheader-showupdated": "Artiklë jakczé òstałë zmienioné òd Twòji slédny wizytë są wëapratnioné <strong>pògrëbieniém</strong>",
        "wlnote": "Niżi môsz wëskrzënioné {{PLURAL:$1|slédną zmianã|<strong>$1</strong> slédnëch zmianów}} zrobioné òb {{PLURAL:$2|gòdzënã|<strong>$2</strong> gòdzënë/gòdzënów}}, rëchùjąc òd $3 dnia $4.",
-       "wlshowlast": "Wëskrzëni zjinaczi z $1 gòdzënów $2 dni",
        "wlshowhidecategorization": "kategòrizacjã strón",
        "watchlist-options": "Òptacëje ùzérónych",
        "watching": "Ùzéróm...",
index ed3ed50..fc9a9bd 100644 (file)
        "wlheader-enotif": "Galluogwyd hysbysiadau trwy e-bost.",
        "wlheader-showupdated": "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
        "wlnote": "Isod, {{PLURAL:$1|yw'r golygiad diweddaraf |yw'r golygiadau diweddaraf <strong>$1</strong> changes}} yn y {{PLURAL:$2|hour|<strong>$2</strong> awr}}, fel ag y mae ar $3, $4.",
-       "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r newidiadau.",
        "watchlist-hide": "Cuddio",
        "watchlist-submit": "Dangos",
        "wlshowtime": "Dangos y cyfnod:",
        "img-lang-default": "(diofyn)",
        "img-lang-info": "Cynhyrchu'r ddelwedd yn yr iaith $1. $2",
        "img-lang-go": "Cynhyrcher",
-       "ascending_abbrev": "esgynnol",
-       "descending_abbrev": "am lawr",
        "table_pager_next": "Tudalen nesaf",
        "table_pager_prev": "Tudalen gynt",
        "table_pager_first": "Tudalen gyntaf",
index 909f059..b1a1cce 100644 (file)
        "wlheader-enotif": "E-mail-underretning er slået til.",
        "wlheader-showupdated": "Sider, der er ændret siden dit sidste besøg, er vist med '''fed skrift'''.",
        "wlnote": "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste <strong>$1</strong> ændringer}} i {{PLURAL:$2|den sidste time|de sidste <strong>$2</strong> timer}} op til den $3 kl. $4.",
-       "wlshowlast": "Vis de seneste $1 timer $2 dage",
        "watchlist-hide": "Skjul",
        "watchlist-submit": "Vis",
        "wlshowtime": "Vis seneste:",
        "sessionfailure-title": "Sessionsfejl",
        "sessionfailure": "Der lader til at være et problem med din loginsession; denne handling blev annulleret som en sikkerhedsforanstaltning mod kapring af sessionen. Genindsend venligst formularen.",
        "changecontentmodel-legend": "Ændr indholdsmodel",
-       "changecontentmodel-title-label": "Sidetitel",
-       "changecontentmodel-model-label": "Ny indholdsmodel",
+       "changecontentmodel-title-label": "Sidetitel:",
+       "changecontentmodel-model-label": "Ny indholdsmodel:",
        "changecontentmodel-reason-label": "Begrundelse:",
        "changecontentmodel-submit": "Ændr",
        "changecontentmodel-success-title": "Indholdsmodellen blev ændret",
        "img-lang-default": "(standardsprog)",
        "img-lang-info": "Gengiv dette billede på $1. $2",
        "img-lang-go": "Udfør",
-       "ascending_abbrev": "op",
-       "descending_abbrev": "ned",
        "table_pager_next": "Næste side",
        "table_pager_prev": "Forrige side",
        "table_pager_first": "Første side",
index 04d7238..08aaa49 100644 (file)
        "wlheader-enotif": "Der E-Mail-Benachrichtigungsdienst ist aktiviert.",
        "wlheader-showupdated": "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
        "wlnote": "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten <strong>$1</strong> Änderungen}} der letzten {{PLURAL:$2|Stunde|<strong>$2</strong> Stunden}}. Stand: $3, $4 Uhr.",
-       "wlshowlast": "Zeige die Änderungen der letzten $1 Stunden, $2 Tage.",
        "watchlist-hide": "Ausblenden",
        "watchlist-submit": "Anzeigen",
        "wlshowtime": "Anzuzeigende Zeitperiode:",
        "img-lang-default": "(Standardsprache)",
        "img-lang-info": "Dieses Bild in $1 rendern. $2",
        "img-lang-go": "Los",
-       "ascending_abbrev": "auf",
-       "descending_abbrev": "ab",
        "table_pager_next": "Nächste Seite",
        "table_pager_prev": "Vorherige Seite",
        "table_pager_first": "Erste Seite",
index f55de83..cda1db8 100644 (file)
        "wlheader-enotif": "E-mail xeber dayiş abiyo.",
        "wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
        "wlnote": "$3 saete $4 ra dıme {{PLURAL:$2|yew saete de|'''$2''' saetan de}} {{PLURAL:$1|vurnayışo peyên|vurnayışê '''$1''' peyêni}} cêrderê.",
-       "wlshowlast": "Peyni de  $1 seata u $2 roca  bıasne",
        "watchlist-hide": "Bınımne",
        "watchlist-submit": "Bımocne",
        "wlshowtime": "Periyoda zemani asenayışi:",
        "img-lang-default": "(zıwano hesabiyaye)",
        "img-lang-info": "Resimé $1, $2 ya teké pé ke.",
        "img-lang-go": "Şo",
-       "ascending_abbrev": "berz",
-       "descending_abbrev": "nızm",
        "table_pager_next": "Pela bahdoyêne",
        "table_pager_prev": "Pela veri",
        "table_pager_first": "Pela sıfteyêne",
index 24f3986..b9a48fc 100644 (file)
        "wlheader-enotif": "E-mailowa zdźěleńska słužba jo zmóžnjona.",
        "wlheader-showupdated": "Boki, kótarež su wót twójogo slědnego woglěda se změnili, pokazuju se '''tucnje'''.",
        "wlnote": "{{PLURAL:$1|Slědujo slědna změna|slědujotej '''$1''' slědnej změnje|slěduju slědne '''$1''' změny}} {{PLURAL:$2|slědneje góźiny|slědneju '''$2''' góźinowu|slědnych '''$2''' góźinow}}, staw: $3, $4.",
-       "wlshowlast": "Pokaž změny slědnych $1 góźinow, $2 dnjow abo  (w slědnych 30 dnjach).",
        "watchlist-options": "Opcije wobglědowańki",
        "watching": "Wobglědowaś …",
        "unwatching": "Njewobglědowaś …",
        "img-lang-default": "(standardna rěc)",
        "img-lang-info": "Toś ten wobraz w $1 kresliś. $2",
        "img-lang-go": "Wótpósłaś",
-       "ascending_abbrev": "górjej",
-       "descending_abbrev": "dołoj",
        "table_pager_next": "Pśiducy bok",
        "table_pager_prev": "Pjerwjejšny bok",
        "table_pager_first": "Prědny bok",
index 63279d3..e29eb53 100644 (file)
        "unwatch": "Awu intangan",
        "unwatchthispage": "Tingkod do mongintong",
        "watchlist-details": "{{PLURAL:$1|$1 bolikon|$1 bobolikon}} id lis piintangannu, bobolikon bolotok awu pinosuang.",
-       "wlshowlast": "Pokitono dohuri $1 jaam $2 tadau",
        "watchlist-options": "Pomilian lis piintangan",
        "watching": "Piintong...",
        "unwatching": "Awu piintong...",
index 2a7d910..71def46 100644 (file)
        "watch": "Le ŋku ɖe eŋu",
        "watchthispage": "Le ŋku ɖe axa sia ŋu",
        "wlnote": "Afisia wofia {{PLURAL:$1|tɔtrɔ '''1''' mamlea|tɔtrɔ '''$1''' mamleawo}} le {{PLURAL:$2|gaƒoƒo mamlea si|gaƒoƒo '''$2''' mamleawo siwo}} vayi la me.",
-       "wlshowlast": "Fia gaƒoƒo $1 ŋkeke $2 mamleawo.",
        "deletepage": "Tutu axa sia",
        "delete-confirm": "Tutu \"$1\"",
        "delete-legend": "Tutui",
index fdd409d..4cf6771 100644 (file)
        "watchthispage": "Và adrē a cla pàgina ché",
        "unwatch": "Andêr mìa adrē",
        "watchlist-details": "La lésta 'd quî tgnû 'd ôc specêl la gh'à {{PLURAL:$1|'na pàgina (e la relatîva pàgina 'd discusiòun)|$1 pagine (e al relatîvi  pàgini 'd discusiòun)}}.",
-       "wlshowlast": "Fà vèder al j ûltmi $1 ōri $2 dé",
        "watchlist-options": "Siēlti di tgnû sòt ôc specêl.",
        "created": "creät",
        "changed": "mudifegat",
        "confirm-unwatch-button": "Va bèin",
        "imgmultigo": "Và!",
        "imgmultigoto": "Và a la pàgina $1",
-       "ascending_abbrev": "crès",
-       "descending_abbrev": "câl",
        "table_pager_first": "Préma pàgina",
        "table_pager_last": "Ûltma pàgina",
        "table_pager_limit_submit": "Và",
index 802562d..18534a1 100644 (file)
        "wlheader-enotif": "Η ειδοποίηση ηλεκτρονικού ταχυδρομείου ενεργοποιήθηκε.",
        "wlheader-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
        "wlnote": "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι <strong>$1</strong> πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των <strong>$2</strong> τελευταίων ωρών}} ως προς τις $3 στις $4.",
-       "wlshowlast": "Εμφάνιση των τελευταίων $1 ωρών $2 ημερών",
        "watchlist-hide": "Απόκρυψη",
        "watchlist-submit": "Προβολή",
        "wlshowtime": "Περίοδος χρόνου για να εμφανιστεί:",
        "img-lang-default": "(προεπιλεγμένη γλώσσα)",
        "img-lang-info": "Απόδοση της εικόνας στα $1. $2",
        "img-lang-go": "Μετάβαση",
-       "ascending_abbrev": "αυξ",
-       "descending_abbrev": "φθιν",
        "table_pager_next": "Επόμενη σελίδα",
        "table_pager_prev": "Προηγούμενη σελίδα",
        "table_pager_first": "Πρώτη σελίδα",
index 3cb9c66..22f22fc 100644 (file)
        "backend-fail-contenttype": "Could not determine the content type of the file to store at \"$1\".",
        "backend-fail-batchsize": "The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.",
        "backend-fail-usable": "Could not read or write file \"$1\" due to insufficient permissions or missing directories/containers.",
+       "backend-fail-stat": "Could not read the status of file \"$1\".",
+       "backend-fail-hash": "Could determine the cryptographic hash of file \"$1\".",
        "filejournal-fail-dbconnect": "Could not connect to the journal database for storage backend \"$1\".",
        "filejournal-fail-dbquery": "Could not update the journal database for storage backend \"$1\".",
        "lockmanager-notlocked": "Could not unlock \"$1\"; it is not locked.",
        "sessionfailure": "There seems to be a problem with your login session;\nthis action has been canceled as a precaution against session hijacking.\nPlease resubmit the form.",
        "changecontentmodel" : "Change content model of a page",
        "changecontentmodel-legend": "Change content model",
-       "changecontentmodel-title-label": "Page title",
+       "changecontentmodel-title-label": "Page title:",
        "changecontentmodel-current-label": "Current content model:",
-       "changecontentmodel-model-label": "New content model",
+       "changecontentmodel-model-label": "New content model:",
        "changecontentmodel-reason-label": "Reason:",
        "changecontentmodel-submit": "Change",
        "changecontentmodel-success-title": "The content model was changed",
index b5aba09..a472dc5 100644 (file)
        "wlheader-enotif": "Retpoŝta sciigo estas ŝalta.",
        "wlheader-showupdated": "Paĝoj montriĝis per '''dikaj literoj''' kiuj estis ŝanĝitaj ekde vi laste vizitis.",
        "wlnote": "Jen la {{PLURAL:$1|lasta redakto|lastaj <strong>$1</strong> redaktoj}} dum la {{PLURAL:$2|lasta horo|lastaj <strong>$2</strong> horoj}}, ekde $3, $4.",
-       "wlshowlast": "Montri el lastaj $1 horoj $2 tagoj",
        "watchlist-hide": "Kaŝi",
        "watchlist-submit": "Montri",
        "wlshowtime": "Vidigenda tempodaŭro:",
        "img-lang-default": "(implicita lingvo)",
        "img-lang-info": "Bildigi tiun ĉi bildon en $1. $2",
        "img-lang-go": "Ek",
-       "ascending_abbrev": "sprn",
-       "descending_abbrev": "subn",
        "table_pager_next": "Sekva paĝo",
        "table_pager_prev": "Antaŭa paĝo",
        "table_pager_first": "Unua paĝo",
index 842ab45..c2d561f 100644 (file)
        "wlheader-enotif": "La notificación por correo está activada.",
        "wlheader-showupdated": "Las páginas modificadas desde tu última visita aparecen en <strong>negrita</strong>.",
        "wlnote": "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos <strong>$1</strong> cambios}} en {{PLURAL:$2|la última hora|las últimas <strong>$2</strong> horas}} desde las $4 del $3.",
-       "wlshowlast": "Ver los cambios de las últimas $1 horas, $2 días",
        "watchlist-hide": "Ocultar",
        "watchlist-submit": "Mostrar",
        "wlshowtime": "Período de tiempo para mostrar:",
        "img-lang-default": "(idioma predeterminado)",
        "img-lang-info": "Renderizar esta imagen en $1. $2",
        "img-lang-go": "Adelante",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Página siguiente",
        "table_pager_prev": "Página anterior",
        "table_pager_first": "Primera página",
index 2391a62..93bf174 100644 (file)
        "nocreate-loggedin": "Sul ei ole luba luua uusi lehekülgi.",
        "sectioneditnotsupported-title": "Alaosa redigeerimine pole lubatud.",
        "sectioneditnotsupported-text": "Sellel leheküljel pole alaosa redigeerimine lubatud.",
+       "modeleditnotsupported-title": "Redigeerimise toeta",
+       "modeleditnotsupported-text": "Sisumudeli $1 redigeerimise tugi puudub.",
        "permissionserrors": "Loatõrge",
        "permissionserrorstext": "Sul pole õigust seda teha {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
        "permissionserrorstext-withaction": "Sul pole lubatud {{lcfirst:$2}} {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tühi objekt",
        "content-json-empty-array": "Tühi massiiv",
+       "unsupported-content-model": "<strong>Hoiatus:</strong> Selles vikis puudub sisumudeli $1 tugi.",
+       "unsupported-content-diff": "Erinevuste vaates puudub sisumudeli $1 tugi.",
+       "unsupported-content-diff2": "Sisumudelite $1 ja $2 vaheliste erinevuste vaate tugi puudub selles vikis.",
        "deprecated-self-close-category": "Vigaste endassesuletud HTML-siltidega leheküljed",
        "deprecated-self-close-category-desc": "Leheküljel on endassesuletud HTML-silte nagu <code>&lt;b/></code> või <code>&lt;span/></code>. Nende kuvamisviis viiakse peagi vastavusse HTML5 spetsifikatsiooniga. Seetõttu selliseid silte vikitekstis enam kasutama ei peaks.",
        "duplicate-args-warning": "<strong>Hoiatus:</strong> [[:$1]] kutsub malli [[:$2]] nii, et parameetrile \"$3\" vastab rohkem kui üks väärtus. Väärtustest kasutatakse ainult viimast.",
        "rcfilters-filter-showlinkedto-label": "Näita muudatusi lehekülgedel, millel viidatakse leheküljele",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Leheküljed, mis viitavad</strong> valitud leheküljele",
        "rcfilters-target-page-placeholder": "Sisesta lehekülje pealkiri (või kategooria)",
+       "rcfilters-allcontents-label": "Kõik sisu",
+       "rcfilters-alldiscussions-label": "Kõik arutelud",
        "rcnotefrom": "Allpool on toodud {{PLURAL:$5|muudatus|muudatused}} alates: <strong>$3, kell $4</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
        "rclistfromreset": "Lähtesta kuupäeva valik",
        "rclistfrom": "Näita muudatusi alates: $3, kell $2",
        "wlheader-enotif": "E-posti teel teavitamine on lubatud.",
        "wlheader-showupdated": "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
        "wlnote": "Allpool on {{PLURAL:$1|viimane muudatus|viimased <strong>$1</strong> muudatust}} viimase {{PLURAL:$2|tunni|<strong>$2</strong> tunni}} jooksul seisuga $3, kell $4.",
-       "wlshowlast": "Näita viimast $1 tundi $2 päeva.",
        "watchlist-hide": "Peida",
        "watchlist-submit": "Näita",
        "wlshowtime": "Näita viimast:",
        "sessionfailure": "Näib, et sinu sisselogimisseanss on probleemne.\nSeansiärandamise vastase ettevaatusabinõuna on see toiming tühistatud.\nPalun saada vorm uuesti.",
        "changecontentmodel": "Lehekülje sisumudeli muutmine",
        "changecontentmodel-legend": "Sisumudeli muutmine",
-       "changecontentmodel-title-label": "Lehekülje pealkiri",
-       "changecontentmodel-model-label": "Uus sisumudel",
+       "changecontentmodel-title-label": "Lehekülje pealkiri:",
+       "changecontentmodel-current-label": "Praegune sisumudel:",
+       "changecontentmodel-model-label": "Uus sisumudel:",
        "changecontentmodel-reason-label": "Põhjus:",
        "changecontentmodel-submit": "Muuda",
        "changecontentmodel-success-title": "Sisumudel on muudetud",
        "block-log-flags-angry-autoblock": "Täiustatud automaatblokeerija sisse lülitatud",
        "block-log-flags-hiddenname": "kasutajanimi peidetud",
        "range_block_disabled": "Administraatori õigus blokeerida IP-aadresside vahemik on ära võetud.",
+       "ipb-prevent-user-talk-edit": "Kui osaline blokeering ei piira eraldi nimeruumi \"Kasutaja arutelu\" kasutust, siis peab see lubama enda arutelulehekülje redigeerimist.",
        "ipb_expiry_invalid": "Vigane aegumise tähtaeg.",
        "ipb_expiry_old": "Aegumistähtaeg on minevikus.",
        "ipb_expiry_temp": "Peidetud kasutajanime blokeeringud peavad olema alalised.",
        "lockedbyandtime": "(lukustas $1; $2, kell $3)",
        "move-page": "Lehekülje \"$1\" teisaldamine",
        "move-page-legend": "Lehekülje teisaldamine",
-       "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Märkus:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
+       "movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada, nii et selle ajalugu tõstetakse uue pealkirja alla.\nVana pealkirjaga leheküljest saab ümbersuunamine uue pealkirjaga leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, siis kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Märkus:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Hoiatus!</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
+       "movepagetext-noredirectsupport": "Allolevat vormi kasutades saad lehekülje ümber nimetada, nii et selle ajalugu tõstetakse uue pealkirja alla.\nSinu kohus on hoolitseda selle eest, et lingid viitaks jätkuvalt sinna, kuhu vaja.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Märkus:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
        "movepagetalktext": "Kui märgid selle ruudu, teisaldatakse arutelulehekülg automaatselt uue pealkirja alla. Seda välja arvatud juhul, kui uue pealkirja all on juba arutelulehekülg, mis pole tühi.\n\nSel juhul saad lehekülje soovi korral käsitsi teisaldada või liita.",
        "moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
        "movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
        "move-subpages": "Teisalda alamleheküljed (kuni $1)",
        "move-talk-subpages": "Teisalda arutelulehekülje alamleheküljed (kuni $1)",
        "movepage-page-exists": "Lehekülg $1 on juba olemas ja seda ei saa automaatselt üle kirjutada.",
+       "movepage-source-doesnt-exist": "Lehekülge \"$1\" pole olemas ja seda ei saa teisaldada.",
        "movepage-page-moved": "Lehekülg $1 on teisaldatud pealkirja $2 alla.",
        "movepage-page-unmoved": "Lehekülge $1 ei saanud teisaldada pealkirja $2 alla.",
        "movepage-max-pages": "Teisaldatud on $1 {{PLURAL:$1|lehekülg|lehekülge}}, mis on teisaldatavate lehekülgede ülemmäär. Rohkem lehekülgi automaatselt ei teisaldata.",
        "delete_and_move_reason": "Kustutatud, et tõsta asemele lehekülg \"[[$1]]\"",
        "selfmove": "Sama pealkiri;\nlehekülge ei saa teisaldada iseenda asemele.",
        "immobile-source-namespace": "Lehekülgi ei saa teisaldada nimeruumis $1",
+       "immobile-source-namespace-iw": "Selle viki kaudu ei saa teisaldada lehekülgi, mis asuvad teises vikis.",
        "immobile-target-namespace": "Lehekülgi ei saa teisaldada nimeruumi \"$1\"",
        "immobile-target-namespace-iw": "Keelelink ei ole sobiv koht lehekülje teisaldamiseks.",
        "immobile-source-page": "Lehekülg ei ole teisaldatav.",
        "immobile-target-page": "Soovitud pealkirja alla ei saa teisaldada.",
+       "movepage-invalid-target-title": "Päritud pealkiri on vigane.",
        "bad-target-model": "Soovitud sihtlehekülje sisumudel on erinev. {{ucfirst:$1}}i ei saa teisendada $2iks.",
        "imagenocrossnamespace": "Faili ei saa teisaldada mõnda muusse nimeruumi.",
        "nonfile-cannot-move-to-file": "Failinimeruumi saab ainult faile teisaldada.",
        "img-lang-default": "(vaikekeel)",
        "img-lang-info": "Viimistle pilt järgmises keeles: $1. $2",
        "img-lang-go": "Mine",
-       "ascending_abbrev": "tõusev",
-       "descending_abbrev": "laskuv",
        "table_pager_next": "Järgmine lehekülg",
        "table_pager_prev": "Eelmine lehekülg",
        "table_pager_first": "Esimene lehekülg",
        "permanentlink": "Püsilink",
        "permanentlink-revid": "Redaktsiooni identifikaator",
        "permanentlink-submit": "Mine redaktsiooni juurde",
+       "newsection": "Uus alaosa",
+       "newsection-page": "Sihtlehekülg",
+       "newsection-submit": "Mine leheküljele",
        "dberr-problems": "Kahjuks on sellel saidil tehnilisi probleeme",
        "dberr-again": "Oota mõni hetk ja laadi lehekülg uuesti.",
        "dberr-info": "(Juurdepääs andmebaasile puudub: $1)",
index 45d6705..1293bb1 100644 (file)
        "wlheader-enotif": "Posta bidezko ohartarazpena gaituta dago.",
        "wlheader-showupdated": "Bisitatu zenituen azken alditik aldaketak izan dituzten orriak '''letra lodiz''' nabarmenduta daude.",
        "wlnote": "Jarraian ageri {{PLURAL:$1|da|dira}} azken {{PLURAL:$2|ordubeteko|<strong>$2</strong> orduko}} {{PLURAL:$1|aldaketa|<strong>$1</strong> aldaketak}}. Data: $3, $4.",
-       "wlshowlast": "Erakutsi azken $1 orduak, azken $2 egunak",
        "watchlist-hide": "Ezkutatu",
        "watchlist-submit": "Erakutsi",
        "wlshowtime": "Erakusteko denboraldia:",
        "img-lang-default": "(berezko hizkuntza)",
        "img-lang-info": "Irudi hau $1 hizkuntzarekin errendatu. $2.",
        "img-lang-go": "Joan",
-       "ascending_abbrev": "gor",
-       "descending_abbrev": "behe",
        "table_pager_next": "Hurrengo orrialdea",
        "table_pager_prev": "Aurreko orrialdea",
        "table_pager_first": "Lehen orrialdea",
index 352efe1..96494ba 100644 (file)
        "exif-scenetype-1": "صورة ملتقطة بشكل مباشر",
        "exif-customrendered-0": "عملية عادية",
        "exif-customrendered-1": "عملية حسب الطلب",
+       "exif-customrendered-2": "HDR (لم يتم حفظ النسخة الأصلية)",
+       "exif-customrendered-3": "HDR (تم حفظ النسخة الأصلية)",
+       "exif-customrendered-4": "الأصلي (لـHDR)",
+       "exif-customrendered-6": "بانوراما",
+       "exif-customrendered-7": "بورتريه HDR",
+       "exif-customrendered-8": "بورتريه",
        "exif-exposuremode-0": "تعرض تلقائي",
        "exif-exposuremode-1": "تعرض يدوي",
        "exif-exposuremode-2": "سلسلة تلقائية",
index fad6f20..bcca9a2 100644 (file)
        "exif-scenetype-1": "Una imaxe fotografiada direutamente",
        "exif-customrendered-0": "Procesu normal",
        "exif-customrendered-1": "Procesu personalizáu",
+       "exif-customrendered-2": "HDR (nun se guardó l'orixinal)",
+       "exif-customrendered-3": "HDR (orixinal guardáu)",
+       "exif-customrendered-4": "Orixinal (pa HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Retratu HDR",
+       "exif-customrendered-8": "Retratu",
        "exif-exposuremode-0": "Esposición automática",
        "exif-exposuremode-1": "Esposición manual",
        "exif-exposuremode-2": "Puesta ente paréntesis automática",
index 0205ad0..bc0fe1c 100644 (file)
        "exif-scenetype-1": "সরাসরি ফটো তোলা ছবি",
        "exif-customrendered-0": "স্বাভাবিক প্রক্রিয়া",
        "exif-customrendered-1": "পছন্দমাফিক প্রক্রিয়া",
+       "exif-customrendered-8": "প্রতিকৃতি",
        "exif-exposuremode-0": "স্বয়ংক্রিয় আলোকসম্পাত",
        "exif-exposuremode-1": "হাতে করা আলোকসম্পাত",
        "exif-exposuremode-2": "স্বয়ংক্রিয় ব্র‌্যাকেট",
index bc3c797..5c723fe 100644 (file)
        "exif-scenetype-1": "Normal",
        "exif-customrendered-0": "Standard",
        "exif-customrendered-1": "Brugerdefineret",
+       "exif-customrendered-4": "Oprindelig (for HDR)",
+       "exif-customrendered-8": "Portræt",
        "exif-exposuremode-0": "Automatisk belysning",
        "exif-exposuremode-1": "Manuel belysning",
        "exif-exposuremode-2": "Belysningsrække",
index e97e583..af28ea6 100644 (file)
        "exif-scenetype-1": "Image photographiée directement",
        "exif-customrendered-0": "Procédé normal",
        "exif-customrendered-1": "Procédé personnalisé",
+       "exif-customrendered-2": "HDR (pas d’original enregistré)",
+       "exif-customrendered-3": "HDR (original enregistré)",
+       "exif-customrendered-4": "Original (pour HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Portrait HDR",
+       "exif-customrendered-8": "Portrait",
        "exif-exposuremode-0": "Automatique",
        "exif-exposuremode-1": "Manuelle",
        "exif-exposuremode-2": "Fourchette automatique",
index eb00793..8807c90 100644 (file)
        "exif-scenetype-1": "Unha imaxe fotografada directamente",
        "exif-customrendered-0": "Procesamento normal",
        "exif-customrendered-1": "Procesamento personalizado",
+       "exif-customrendered-2": "HDR (orixinal non gardado)",
+       "exif-customrendered-3": "HDR (orixinal gardado)",
+       "exif-customrendered-4": "Orixinal (para HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Retrato HDR",
+       "exif-customrendered-8": "Retrato",
        "exif-exposuremode-0": "Exposición automática",
        "exif-exposuremode-1": "Exposición manual",
        "exif-exposuremode-2": "Compensación automática da exposición",
index 0f51ec5..eec5096 100644 (file)
        "exif-scenetype-1": "תמונה שצולמה ישירות",
        "exif-customrendered-0": "תהליך רגיל",
        "exif-customrendered-1": "תהליך מותאם",
+       "exif-customrendered-2": "HDR (המקור לא נשמר)",
+       "exif-customrendered-3": "HDR (המקור נשמר)",
+       "exif-customrendered-4": "מקור (עבור HDR)",
+       "exif-customrendered-6": "פנורמה",
+       "exif-customrendered-7": "HDR בתצוגת דיוקן",
+       "exif-customrendered-8": "דיוקן",
        "exif-exposuremode-0": "חשיפה אוטומטית",
        "exif-exposuremode-1": "חשיפה ידנית",
        "exif-exposuremode-2": "מסגרת אוטומטית",
index f124df2..fd7cbe4 100644 (file)
@@ -8,7 +8,8 @@
                        "Kwj2772",
                        "Mooozi",
                        "아라",
-                       "Revi"
+                       "Revi",
+                       "Ykhwong"
                ]
        },
        "exif-imagewidth": "너비",
        "exif-scenetype-1": "직접 촬영한 그림",
        "exif-customrendered-0": "일반",
        "exif-customrendered-1": "사용자 지정 처리",
+       "exif-customrendered-2": "HDR (원본 저장 안 함)",
+       "exif-customrendered-3": "HDR (원본 저장)",
+       "exif-customrendered-4": "원본 (HDR용)",
+       "exif-customrendered-6": "파노라마",
        "exif-exposuremode-0": "자동 노출",
        "exif-exposuremode-1": "수동 노출",
        "exif-exposuremode-2": "자동 노출 브래킷",
index 2b8491a..b4eeb1f 100644 (file)
        "exif-scenetype-1": "D'Bild gouf fotograféiert",
        "exif-customrendered-0": "Standard",
        "exif-customrendered-1": "Benotzerdefinéiert",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-8": "Portrait",
        "exif-exposuremode-0": "Automatesch Beliichtung",
        "exif-exposuremode-1": "Manuell Beliichtung",
        "exif-exposuremode-2": "Beliichtungsserie",
index 93a96c9..132c659 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "RMizo"
+                       "RMizo",
+                       "INerdguyI"
                ]
        },
        "exif-imagewidth": "Zàuzáwng",
        "exif-writer": "Ziaktu",
        "exif-languagecode": "Ţawng",
        "exif-iimversion": "IIM chhuah",
-       "exif-iimcategory": "Pawl"
+       "exif-iimcategory": "Pawl",
+       "exif-customrendered-2": "HDR(original save a awm lo)",
+       "exif-customrendered-3": "HDR(original a in save)",
+       "exif-customrendered-4": "Original(HDR atan)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Portriat HDR",
+       "exif-customrendered-8": "Thlalak"
 }
index cad4da9..44c3330 100644 (file)
        "exif-scenetype-1": "Непосредно фотографирана слика",
        "exif-customrendered-0": "Нормален процес",
        "exif-customrendered-1": "Нестандарден процес",
+       "exif-customrendered-2": "HDR (без зачуван оригинал)",
+       "exif-customrendered-3": "HDR (со зачуван оригинал)",
+       "exif-customrendered-4": "Оригинал (за HDR)",
+       "exif-customrendered-6": "Панорама",
+       "exif-customrendered-7": "Портретен HDR",
+       "exif-customrendered-8": "Портрет",
        "exif-exposuremode-0": "Автоматско изложување",
        "exif-exposuremode-1": "Рачно изложување",
        "exif-exposuremode-2": "Автоматски со зададен распон",
index 20e1eb1..f963e7e 100644 (file)
        "exif-scenetype-1": "Imagem fotografada diretamente",
        "exif-customrendered-0": "Processo normal",
        "exif-customrendered-1": "Processo personalizado",
+       "exif-customrendered-2": "HDR (nenhum original salvo)",
+       "exif-customrendered-3": "HDR (original salvo)",
+       "exif-customrendered-4": "Original (para HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Retrato HDR",
+       "exif-customrendered-8": "Retrato",
        "exif-exposuremode-0": "Exposição automática",
        "exif-exposuremode-1": "Exposição manual",
        "exif-exposuremode-2": "Bracket automático",
index 757ca0c..7b86443 100644 (file)
        "exif-scenetype-1": "Imagem fotografada diretamente",
        "exif-customrendered-0": "Processo normal",
        "exif-customrendered-1": "Processo personalizado",
+       "exif-customrendered-2": "HDR (original não gravado)",
+       "exif-customrendered-3": "HDR (original gravado)",
+       "exif-customrendered-4": "Original (para HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Retrato HDR",
+       "exif-customrendered-8": "Retrato",
        "exif-exposuremode-0": "Exposição automática",
        "exif-exposuremode-1": "Exposição manual",
        "exif-exposuremode-2": "Bracket automático",
index 225aa79..d934ed6 100644 (file)
        "exif-scenetype-1": "Fotografije dirette",
        "exif-customrendered-0": "Processe normele",
        "exif-customrendered-1": "Processe personalizzete",
+       "exif-customrendered-2": "HDR (nisciune origgenale reggistrate)",
+       "exif-customrendered-3": "HDR (origgenale reggistrate)",
+       "exif-customrendered-4": "Origgenale (pe HDR)",
+       "exif-customrendered-6": "Panorameche",
+       "exif-customrendered-7": "Ritratte HDR",
+       "exif-customrendered-8": "Ritratte",
        "exif-exposuremode-0": "Auto esposizione",
        "exif-exposuremode-1": "Esposizione a mane",
        "exif-exposuremode-2": "Bracketing automateche",
index 8ebf8b1..2ccc002 100644 (file)
        "exif-scenetype-1": "直接照像圖片",
        "exif-customrendered-0": "一般程序",
        "exif-customrendered-1": "自訂程序",
+       "exif-customrendered-2": "HDR(原始未儲存)",
+       "exif-customrendered-3": "HDR(原始已儲存)",
+       "exif-customrendered-4": "原始(用於 HDR)",
+       "exif-customrendered-6": "全景",
+       "exif-customrendered-7": "人像 HDR",
+       "exif-customrendered-8": "人像",
        "exif-exposuremode-0": "自動曝光",
        "exif-exposuremode-1": "手動曝光",
        "exif-exposuremode-2": "自動包圍曝光",
index fb493be..5df7c15 100644 (file)
        "wlheader-enotif": "Se premitin notificacionis pol email.",
        "wlheader-showupdated": "Las páhinas que s'án emburacau dendi la úrtima vezi que las visoreasti son muestrás en '''negrina'''",
        "wlnote": "Embahu {{PLURAL:$1|es el úrtimu chambu|son los úrtimus '''$1''' chambus}} enas úrtimas {{PLURAL:$2|oras|'''$2''' oras}}.",
-       "wlshowlast": "Muestral úrtimus $1 oras $2 dias",
        "watchlist-options": "Ocionis de la mi lista e seguimientu",
        "watching": "Vehilandu...",
        "unwatching": "Abaldonandu la vehiláncia en...",
index 1c0cdf4..88a292c 100644 (file)
        "wlheader-enotif": "ایمیل‌های اعلان فعال است.",
        "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند <strong>پررنگ</strong> نمایش داده شده‌اند.",
        "wlnote": "در زیر {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که در {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
-       "wlshowlast": "نمایش آخرین $1 ساعت $2 روز",
        "watchlist-hide": "نهفتن",
        "watchlist-submit": "نمایش",
        "wlshowtime": "نمایش بازهٔ زمانی:",
        "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
        "delete-confirm": "حذف «$1»",
        "delete-legend": "حذف",
-       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک کردن آن هستید دارای یک تاریخچه همراه با $1 {{PLURAL:$1|بازبینی|بازبینی}} است:",
+       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال حذف کردن آن هستید دارای تاریخچه‌ای شامل $1 {{PLURAL:$1|نسخه}} است:",
        "historyaction-submit": "نمایش نسخه‌ها",
        "confirmdeletetext": "شما در حال حذف کردن یک صفحه یا تصویر از پایگاه‌های داده همراه با تمام تاریخچهٔ آن هستید.\nلطفاً این عمل را تأیید کنید و اطمینان حاصل کنید که عواقب این کار را می‌دانید و این عمل را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
        "actioncomplete": "عمل انجام شد",
        "rollback-success": "ویرایش‌های {{GENDER:$3|$1}} واگردانی شد؛\nصفحه به آخرین ویرایش {{GENDER:$4|$2}} برگردانده شد.",
        "sessionfailure-title": "خطای نشست کاربری",
        "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً فرم را از نو بارگذاری کنید.",
-       "changecontentmodel": "Ù\88Û\8cراÛ\8cØ´ Ù\86Ù\85Ù\88Ù\86Ù\87 محتوای یک صفحه",
+       "changecontentmodel": "Ù\88Û\8cراÛ\8cØ´ Ù\85دÙ\84 محتوای یک صفحه",
        "changecontentmodel-legend": "تغییر نوع محتوی",
        "changecontentmodel-title-label": "عنوان صفحه",
-       "changecontentmodel-model-label": "Ù\86Ù\85Ù\88Ù\86Ù\87 محتوای جدید",
+       "changecontentmodel-model-label": "Ù\85دÙ\84 محتوای جدید",
        "changecontentmodel-reason-label": "دلیل:",
        "changecontentmodel-submit": "تغییر",
        "changecontentmodel-success-title": "نمونه محتوی تغییر یافت",
        "log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
        "log-description-contentmodel": "این صفحه تغییرات محتوی صفحاتی که با محتوی غیر از پیش‌فرض ایجاد شده‌اند، را فهرست می‌کند.",
        "logentry-contentmodel-new": "صفحهٔ $3 با استفاده از مدل‌های محتوایی غیر پیش‌فرض «$5» توسط $1 {{GENDER:$2|ساخته شد}}",
-       "logentry-contentmodel-change": "Ù\86Ù\85Ù\88Ù\86Ù\87 محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
+       "logentry-contentmodel-change": "Ù\85دÙ\84 محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
        "logentry-contentmodel-change-revertlink": "واگردانی",
        "logentry-contentmodel-change-revert": "واگردانی",
        "protectlogpage": "سیاههٔ محافظت",
        "img-lang-default": "(زبان پیش‌فرض)",
        "img-lang-info": "ارائه این تصویر در  $1 .  $2",
        "img-lang-go": "برو",
-       "ascending_abbrev": "صعودی",
-       "descending_abbrev": "نزولی",
        "table_pager_next": "صفحهٔ بعدی",
        "table_pager_prev": "صفحهٔ قبل",
        "table_pager_first": "صفحهٔ نخست",
index 03db0b2..bc32b70 100644 (file)
        "wlheader-enotif": "Sähköposti-ilmoitus on käytössä.",
        "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on <strong>lihavoitu</strong>.",
        "wlnote": "Alla {{PLURAL:$1|on viimeisin muutos|ovat viimeisimmät <strong>$1</strong> muutosta}} edellisen {{PLURAL:$2|tunnin|<strong>$2</strong> tunnin}} ajalta $3 kello $4 lukien.",
-       "wlshowlast": "Näytä edelliset $1 tuntia tai $2 päivää",
        "watchlist-hide": "Piilota",
        "watchlist-submit": "Näytä",
        "wlshowtime": "Näytettävä aikajakso:",
        "img-lang-default": "(oletuskieli)",
        "img-lang-info": "Näytä tämä kuva kielellä $1. $2",
        "img-lang-go": "Suorita",
-       "ascending_abbrev": "nouseva",
-       "descending_abbrev": "laskeva",
        "table_pager_next": "Seuraava sivu",
        "table_pager_prev": "Edellinen sivu",
        "table_pager_first": "Ensimmäinen sivu",
index a4f91c4..74a6574 100644 (file)
        "wlheader-enotif": "Tað ber nú til at senda teldupost.",
        "wlheader-showupdated": "Síður sum eru broyttar síðan tú seinast vitjaði tær, eru vístar við '''feitum'''.",
        "wlnote": "Niðanfyri {{PLURAL:$1|stendur seinasta broytingin|standa seinastu '''$1''' broytingarnar}} seinasta/u {{PLURAL:$2| tíman|'''$2''' tímarnar}} hin $3 kl. $4",
-       "wlshowlast": "Vís seinastu $1 tímar $2 dagar",
        "watchlist-options": "Møguleikar í ansingarlistanum",
        "watching": "Eftirlitir...",
        "unwatching": "Strikar eftirlit...",
        "imgmultipagenext": "næsta síða →",
        "imgmultigo": "Far!",
        "imgmultigoto": "Far til síðu $1",
-       "ascending_abbrev": "upp",
-       "descending_abbrev": "nið",
        "table_pager_next": "Næsta síða",
        "table_pager_prev": "Fyrrverandi síða",
        "table_pager_first": "Fyrsta síða",
index 2413010..a4310e9 100644 (file)
        "nocreate-loggedin": "Vous n'avez pas la permission de créer de nouvelles pages.",
        "sectioneditnotsupported-title": "Modification de section non prise en charge",
        "sectioneditnotsupported-text": "La modification d’une section n’est pas prise en charge pour cette page.",
+       "modeleditnotsupported-title": "Modification non supportée",
+       "modeleditnotsupported-text": "La modification n’est pas supportée pour le modèle de contenu $1.",
        "permissionserrors": "Erreur de permissions",
        "permissionserrorstext": "Vous n'avez pas la permission d'effectuer l'opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
        "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
        "content-model-json": "JSON",
        "content-json-empty-object": "Objet vide",
        "content-json-empty-array": "Tableau vide",
+       "unsupported-content-model": "<strong>Attention :</strong> Le modèle de contenu $1 n’est pas supporté sur ce wiki.",
+       "unsupported-content-diff": "Les diffs ne sont pas supportés pour le modèle de contenu $1.",
+       "unsupported-content-diff2": "Les diffs entre les modèles de contenu $1 et $2 ne sont pas supportés sur ce wiki.",
        "deprecated-self-close-category": "Pages utilisant des balises HTML auto-fermantes non valides",
        "deprecated-self-close-category-desc": "La page contient des balises HTML auto-fermantes non valides, comme <code>&lt;b/></code> ou <code>&lt;span/></code>. Le comportement de celles-ci changera prochainement pour être en accord avec la spécification HTML5, donc leur utilisation dans le wikitexte est désuète.",
        "duplicate-args-warning": "<strong>Avertissement :</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre « $3 ». Seule la dernière valeur fournie sera utilisée.",
        "wlheader-enotif": "La notification par courriel est activée.",
        "wlheader-showupdated": "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en <strong>gras</strong>.",
        "wlnote": "Ci-dessous {{PLURAL:$1|figure la dernière modification effectuée|figurent les <strong>$1</strong> dernières modifications effectuées}} durant {{PLURAL:$2|la dernière heure|les <strong>$2</strong> dernières heures}}, jusqu'au $3, $4.",
-       "wlshowlast": "Montrer les dernières $1 heures, les derniers $2 jours",
        "watchlist-hide": "Masquer",
        "watchlist-submit": "Lister",
        "wlshowtime": "Période affichée :",
        "sessionfailure": "Votre session de connexion semble avoir des problèmes ;\ncette action a été annulée en prévention d'un piratage de session.\nVeuillez soumettre le formulaire de nouveau.",
        "changecontentmodel": "Modifier le modèle de contenu d’une page",
        "changecontentmodel-legend": "Modifier le modèle de contenu",
-       "changecontentmodel-title-label": "Titre de la page",
+       "changecontentmodel-title-label": "Titre de la page :",
        "changecontentmodel-current-label": "Modèle de contenu actuel :",
-       "changecontentmodel-model-label": "Nouveau modèle de contenu",
+       "changecontentmodel-model-label": "Nouveau modèle de contenu :",
        "changecontentmodel-reason-label": "Motif :",
        "changecontentmodel-submit": "Modifier",
        "changecontentmodel-success-title": "Le modèle de contenu a été modifié",
        "img-lang-default": "(langue par défaut)",
        "img-lang-info": "Afficher cette image en $1 $2.",
        "img-lang-go": "Lancer",
-       "ascending_abbrev": "crois.",
-       "descending_abbrev": "décr.",
        "table_pager_next": "Page suivante",
        "table_pager_prev": "Page précédente",
        "table_pager_first": "Première page",
index 8a8ead3..d2afe37 100644 (file)
        "wlheader-enotif": "La notificacion per mèssageria èlèctronica est activâye.",
        "wlheader-showupdated": "Les pâges que sont étâyes changiêes dês voutra dèrriére vesita sont montrâyes en <strong>grôs</strong>.",
        "wlnote": "Vê-que {{PLURAL:$1|lo dèrriér changement fêt|los <strong>$1</strong> dèrriérs changements fêts}} pendent {{PLURAL:$2|l’hora passâye|les <strong>$2</strong> hores passâyes}}, tant qu’u $3 a $4.",
-       "wlshowlast": "Montrar les $1 hores passâyes, los $2 jorns passâs",
        "watchlist-hide": "Cachiér",
        "watchlist-submit": "Montrar",
        "wlshowtime": "Temps a fâre vêre :",
        "img-lang-default": "(lengoua per dèfôt)",
        "img-lang-info": "Montrar cel’émâge en $1 $2.",
        "img-lang-go": "Emmodar",
-       "ascending_abbrev": "crès.",
-       "descending_abbrev": "dècr.",
        "table_pager_next": "Pâge aprés",
        "table_pager_prev": "Pâge devant",
        "table_pager_first": "Premiére pâge",
index 2fee01c..f867a5a 100644 (file)
        "wlheader-enotif": "Di e-mail siinst as aktiif.",
        "wlheader-showupdated": "Nei feranert sidjen wurd '''fäät''' uunwiset.",
        "wlnote": "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst <strong>$1</strong> feranrangen}} faan a leetst {{PLURAL:$2|stünj|<strong>$2</strong> stünjen}}. Stant: $3, klook $4.",
-       "wlshowlast": "Wise a feranrangen faan a leetst $1 stünjen, $2 daar.",
        "watchlist-submit": "Wise",
        "watchlist-options": "Iinstelangen för't uunwisin",
        "watching": "Uun't uug behual ...",
        "img-lang-default": "(standard spriak)",
        "img-lang-info": "Detdiar bil uun $1 amwerke. $2",
        "img-lang-go": "Widjer",
-       "ascending_abbrev": "ap",
-       "descending_abbrev": "deel",
        "table_pager_next": "Naist sidj",
        "table_pager_prev": "Leetst sidj (turag)",
        "table_pager_first": "Iarst sidj",
index da3d4eb..ac4eedc 100644 (file)
        "wlheader-enotif": "Notifiche par pueste eletroniche ativade.",
        "wlheader-showupdated": "Lis pagjinis gambiadis de ultime volte che tu lis âs cjaladis a son mostradis in '''gruessut'''",
        "wlnote": "Ca sot {{PLURAL:$1|al è il cambiament plui recent|a son i '''$1''' cambiaments plui recents}} {{PLURAL:$2|inte ultime ore|intes '''$2''' oris passadis}}.",
-       "wlshowlast": "Mostre ultimis $1 oris $2 zornadis",
        "watchlist-options": "Opzions pe liste dai tignûts di voli",
        "watching": "Daûr a zontâ aes pagjinis tignudis di voli...",
        "unwatching": "Daûr a gjavâ des pagjinis tignudis di voli...",
        "imgmultipagenext": "pagjine sucessive →",
        "imgmultigo": "Va!",
        "imgmultigoto": "Va ae pagjine $1",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "disc",
        "table_pager_next": "Pagjine sucessive",
        "table_pager_prev": "Pagjine precedente",
        "table_pager_first": "Prime pagjine",
index c77c550..a0983f1 100644 (file)
        "wlheader-enotif": "E-mailnotifikaasje is ynskeakele.",
        "wlheader-showupdated": "Siden dy't wizige binne nei't jo dy it lêst besocht hawwe, wurde <strong>fet</strong> werjûn.",
        "wlnote": "Hjirûnder {{PLURAL:$1|stiet de lêste feroaring|steane de lêste <strong>$1</strong> feroarings}} fan 'e lêste {{PLURAL:$2|oere|<strong>$2</strong> oeren}}, sûnt $3, $4.",
-       "wlshowlast": "Lit feroarings sjen fan de lêste $1 oeren $2 dagen",
        "watchlist-hide": "Ferbergje",
        "watchlist-submit": "Werjaan",
        "wlshowtime": "Tiidsperioade fan werjefte:",
index 721a554..88103d8 100644 (file)
        "wlheader-enotif": "Cumasaíodh fógraí riomhphoist.",
        "wlheader-showupdated": "Tá '''cló trom''' ar leathanaigh a athraíodh ón uair is deireanaí a d'fhéach tú orthu.",
        "wlnote": "Is {{PLURAL:$1|é seo thíos an t-athrú is déanaí|iad seo thíos an <strong>'''$1'''</strong> athrú is déanaí}} {{PLURAL:$2|san uair an chloig dheireanach|sa '''$2''' uair an chloig dheireanacha}}.",
-       "wlshowlast": "Líon na n-uaireanta is déanaí le taispeáint: $1. Líon na laethanta is déanaí le taispeáint: $2.",
        "watchlist-submit": "Taispeáin",
        "wlshowhideminor": "mionathruithe",
        "wlshowhidebots": "botaí",
index 048815b..9ac4cb6 100644 (file)
        "watchthispage": "Bak bu sayfaya",
        "unwatch": "Durgun sayfa izlemää",
        "watchlist-details": "Diil konuşmaa sayfaları {{PLURAL:$1|$1 sayfa|$1 sayfa}} bakmaa listanızda.",
-       "wlshowlast": "Bitki $1 saati $2 günü göster",
        "watchlist-options": "İzlemäk listası opţiyaları",
        "watching": "Bakılêr...",
        "unwatching": "Durgundurulêr...",
index a53a009..29a361e 100644 (file)
        "wlheader-enotif": "启动嘞email通知功能。",
        "wlheader-showupdated": "上回倷眵𠮶页面改动𠮶部分用'''粗体'''显到",
        "wlnote": "下底系最近'''$2'''钟头内𠮶最晏'''$1'''道修改:",
-       "wlshowlast": "显示近来$1钟头$2日𠮶改动",
        "watchlist-options": "监视清单选项",
        "watching": "眏到...",
        "unwatching": "莫眏到...",
        "imgmultipageprev": "← 上页",
        "imgmultipagenext": "下页 →",
        "imgmultigo": "确定!",
-       "ascending_abbrev": "增",
-       "descending_abbrev": "减",
        "table_pager_next": "下页",
        "table_pager_prev": "上页",
        "table_pager_first": "首页",
index 2c20ada..e7cd619 100644 (file)
        "wlheader-enotif": "啟動哩email通知功能。",
        "wlheader-showupdated": "上回倷眵嗰頁面改動嗰部分用'''粗體'''顯到",
        "wlnote": "下底係最近'''$2'''鐘頭內嗰最晏'''$1'''道修改:",
-       "wlshowlast": "顯示箇日子$1鐘頭$2日嗰改動",
        "watchlist-options": "監視清單選項",
        "watching": "眏到...",
        "unwatching": "莫眏到...",
        "imgmultipageprev": "← 上頁",
        "imgmultipagenext": "下頁 →",
        "imgmultigo": "確定!",
-       "ascending_abbrev": "增",
-       "descending_abbrev": "減",
        "table_pager_next": "下頁",
        "table_pager_prev": "上頁",
        "table_pager_first": "首頁",
index a1c1e4d..058d0ad 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 paj sa|$1}} annan zòt lis di swivi (plis paj-ya di diskisyon).",
        "wlheader-showupdated": "Paj-ya ki modifyé dipi zòt dannyé vizit sa afiché an <strong>gra</strong>.",
        "wlnote": "Anba {{PLURAL:$1|ka figiré dannyé modifikasyon-an ki éfègtchwé|ka figiré <strong>$1</strong> dannyé modifikasyon-yan ki éfègtchwé}} douran {{PLURAL:$2|dannyé lò-a|<strong>$2</strong> dannyé lò-ya}}, jouk $3, $4.",
-       "wlshowlast": "Montré dannyé $1 lò, dannyé $2 jou",
        "watchlist-options": "Opsyon di lis di swivi",
        "enotif_reset": "Marké tout paj-ya kou vizité",
        "dellogpage": "Journal dé siprésyon",
index 0bc0cc0..a025c24 100644 (file)
        "wlheader-enotif": "Tha brathan-naidheachd air a' phost-d an comas.",
        "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
        "wlnote": "Chì thu gu h-ìosal {{PLURAL:$1|a' $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.",
-       "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh",
        "watchlist-hide": "Falaich",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "img-lang-default": "(an cànan tùsail)",
        "img-lang-info": "Reandaraich an dealbh seo sa: $1. $2",
        "img-lang-go": "Siuthad",
-       "ascending_abbrev": "a' dìreadh",
-       "descending_abbrev": "a' teàrnadh",
        "table_pager_next": "An ath-dhuilleag",
        "table_pager_prev": "An duilleag roimhpe",
        "table_pager_first": "A' chiad duilleag",
index fd034d8..b4deae8 100644 (file)
        "systemblockedtext": "O seu nome de usuario ou enderezo IP foi bloqueado automaticamente polo sistema MediaWiki.\nO motivo do bloqueo é:\n\n:<em>$2</em>\n\n* Comezo do bloqueo: $8\n* Expiración do bloqueo: $6\n* Destinatario do bloqueo: $7\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos estes detalles en calquera consulta que realice.",
        "blockednoreason": "non se deu ningunha razón",
        "blockedtext-composite": "<strong>O seu nome de usuario ou enderezo IP foron bloqueados.</strong>\n\nO motivo dado é:\n\n:<em>$2</em>.\n\n* Comezo do bloqueo: $8\n* Remate do bloqueo máis longo: $6\n\n* $5\n\nO seu enderezo IP actual é $3.\nPor favor, inclúa todos os detalles de arriba en calquera contacto sobre este asunto.",
+       "blockedtext-composite-no-ids": "O seu enderezo IP aparece en múltiples listas negras",
        "blockedtext-composite-reason": "Existen varios bloqueos contra a súa conta ou enderezo IP",
        "whitelistedittext": "Debe $1 para poder editar páxinas.",
        "confirmedittext": "Debe confirmar o correo electrónico antes de comezar a editar. Por favor, configure e dea validez ao correo mediante as súas [[Special:Preferences|preferencias de usuario]].",
        "wlheader-enotif": "A notificación por correo electrónico está activada.",
        "wlheader-showupdated": "As páxinas que cambiaron desde a súa última visita móstranse en <strong>letra grosa</strong>.",
        "wlnote": "A continuación {{PLURAL:$1|está a última modificación|están as últimas <strong>$1</strong> modificacións}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} ata o $3 ás $4.",
-       "wlshowlast": "Amosar as últimas $1 horas e os últimos $2 días",
        "watchlist-hide": "Agochar",
        "watchlist-submit": "Amosar",
        "wlshowtime": "Período de tempo a amosar:",
        "img-lang-default": "(lingua por defecto)",
        "img-lang-info": "Renderizar esta imaxe en $1. $2",
        "img-lang-go": "Amosar",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Páxina seguinte",
        "table_pager_prev": "Páxina anterior",
        "table_pager_first": "Primeira páxina",
        "permanentlink": "Ligazón permanente",
        "permanentlink-revid": "ID da revisión",
        "permanentlink-submit": "Ir á revisión",
+       "newsection": "Nova sección",
+       "newsection-page": "Páxina de destino",
        "newsection-submit": "Ir á páxina",
        "dberr-problems": "Sentímolo! Este sitio está experimentando dificultades técnicas.",
        "dberr-again": "Por favor, agarde uns minutos e logo probe a cargar de novo a páxina.",
index ff52b26..76e0366 100644 (file)
        "watch": "नदर दवरात",
        "unwatch": "पळोवंक नासलें",
        "watchlist-details": "लक्ष {{PLURAL:$1|$1वळेरींतलें|$1 वळेंरींतली}} {{PLURAL:$1|$1पान|$1 पानां}} उलोवपाची पानां सोडून",
-       "wlshowlast": "फाटलें $1 वरांचें $2 दिसांचें  दाखयात",
        "watchlist-options": "सादुरवळेरींतलो पर्याय",
        "delete-legend": "काडून उडयात",
        "actioncomplete": "क्रिया पुराय जाल्या",
index e89fe68..3d8840d 100644 (file)
        "watchlist-details": "Tujea Sadurvollerint {{PLURAL:$1|$1 pan asa|$1 panam asat}} (te-bhair ulovpachim panam asat).",
        "wlheader-showupdated": "Tujea fatle bhette san bodol'lean tim panam '''datt''' dakhoileant.",
        "wlnote": "Sokoil {{PLURAL:$1|ho nimanno bodol|hem nimanneo <strong>$1</strong> bodol}} nimannea {{PLURAL:$2|horan|<strong>$2</strong> horanim}}, $3, $4 porian.‎",
-       "wlshowlast": "Xevottchim $1 voram $2 dis  dakhoi",
        "watchlist-options": "Sadurvollericheo poryay",
        "watching": "Disht dovortanv...",
        "unwatching": "Disht kaddthanv...",
index acbf821..58fddbe 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 halaman}} to dputari he'awasiyamu (duhengiyo halaman lo'iya).",
        "wlheader-showupdated": "Halaman ma loboli'a to pulitiyo nila'omu mowali bilohela to <strong>bold</strong>.",
        "wlnote": "To tibawa botiye {{PLURAL:$1|loboli'a|<strong>$1</strong> loboli'a}} pulitiyo to delomo {{PLURAL:$2|jam|<strong>$2</strong> jam}}, per $3, $4.",
-       "wlshowlast": "Popobilohe $1 jam $2 dulahe pulitiyo",
        "watchlist-options": "Tulawoto daputari he'awasiyalo",
        "enotif_reset": "Tuwoti nga'amila halaman ma nila'o",
        "dellogpage": "Log loluluto",
index 2306561..70648d7 100644 (file)
        "unwatch": "𐌿𐌽𐍅𐌹𐍄",
        "watchlist-details": "{{PLURAL:$1|$1 𐌻𐌰𐌿𐍆𐍃|$1 𐌻𐌰𐌿𐌱𐍉𐍃}} 𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽 (𐌾𐌰𐌷 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌴 𐌻𐌰𐌿𐌱𐍉𐍃)",
        "wlheader-showupdated": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳 𐍆𐍂𐌰𐌼 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌼𐌼𐌰 𐌼𐌴𐌻𐌰 𐌸𐌰𐍄𐌴𐌹 𐌲𐌰𐍅𐌴𐌹𐍃𐍉𐌳𐌴𐍃 𐌱𐌰𐌽𐌳𐍅𐌹𐌳𐌰𐌹 𐍃𐌹𐌽𐌳 𐌹𐌽 <strong>𐍃𐍅𐌹𐌽𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼</strong>.",
-       "wlshowlast": "𐌱𐌰𐌽𐌳𐍅𐌴𐌹 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 $1 𐍈𐌴𐌹𐌻𐍉𐍃, 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹 $2 𐌳𐌰𐌲𐍉𐍃",
        "watching": "𐍅𐌹𐍄𐌰𐌽𐌳𐍃...",
        "unwatching": "𐌿𐌽𐍅𐌹𐍄𐌰𐌽𐌳𐍃...",
        "created": "𐌲𐌰𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
index 195e633..83be9d1 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 δέλτος|$1 δέλτοι}} ἐφορωμέναι, ἄνευ τῶν δέλτων διαλέξεως περιλαμβανομένων.",
        "wlheader-enotif": "Σύστημα εἰδήσεως μέσῳ ἠλ-ἐπιστολῶν ἐνεργόν.",
        "wlnote": "Κατωτέρω {{PLURAL:$1|ἐστὶν ἡ ὑστάτη μεταβολὴ|εἰσὶν αἱ ὑστάται  '''$1'''  μεταβολαὶ}} ἐν {{PLURAL:$2|τῇ ὑστάτῃ μίᾳ ὥρᾳ|ταῖς ὑστάταις '''$2''' ὥραις}}.",
-       "wlshowlast": "Ἐμφάνισις τῶν τελευταίων $1 ὡρῶν $2 ἡμερῶν",
        "watchlist-options": "Ἐπιλογαὶ ἐφοροδιαλογῆς",
        "watching": "Ἐφορῶν...",
        "unwatching": "Ἀνεφορῶν...",
        "imgmultipagenext": "ἡ δέλτος ἡ ἑπομένη →",
        "imgmultigo": "Ἰέναι!",
        "imgmultigoto": "Μεταβαίνειν εἰς δέλτον $1",
-       "ascending_abbrev": "ἀναβ",
-       "descending_abbrev": "καταβ",
        "table_pager_next": "ἡ δέλτος ἡ ἑπομένη",
        "table_pager_prev": "Δέλτος προτέρα",
        "table_pager_first": "Ἡ δέλτος ἡ πρώτη",
index 4baf428..9352100 100644 (file)
        "wlheader-enotif": "E-Mail-Benachrichtigung isch aktiviert.",
        "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei gänderet, sy <strong>fett</strong> dargstellt.",
        "wlnote": "Unde {{PLURAL:$1|steit di letsti Änderig|stöh di letste <strong>$1</strong> Änderigen}} us {{PLURAL:$2|der letste Stund|de letste <strong>$2</strong> Stunde}}. Stand: $3, $4 Uhr.",
-       "wlshowlast": "Zeig di letste $1 Stunden und $2 Täg",
        "watchlist-options": "Aazeigoptione",
        "watching": "Am beobachte …",
        "unwatching": "Nümm am beobachten …",
        "img-lang-default": "(Standardsproch)",
        "img-lang-info": "Des Bild in $1 rendere. $2",
        "img-lang-go": "Gang",
-       "ascending_abbrev": "uf",
-       "descending_abbrev": "ab",
        "table_pager_next": "Näggschti Syte",
        "table_pager_prev": "Vorderi Syte",
        "table_pager_first": "Erschti Syte",
index 6aaa34f..a06f315 100644 (file)
        "wlheader-enotif": "ઈમેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.",
        "wlheader-showupdated": "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.",
        "wlnote": "નીચે $3, $4 વાગ્યા સુધીના છેલ્લા {{PLURAL:$2|એક કલાક|<strong>$2</strong> કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|<strong>$1</strong> ફેરફારો }} દર્શાવ્યા છે.",
-       "wlshowlast": "છેલ્લા $1 કલાકો $2 દિવસો બતાવો",
        "watchlist-hide": "છુપાવો",
        "watchlist-submit": "બતાવો",
        "wlshowhidecategorization": "પાનાનું વર્ગીકરણ",
        "imgmultigoto": "પાના  $1 પર જાવ",
        "img-lang-default": "(મૂળભુત ભાષા)",
        "img-lang-go": "જાઓ",
-       "ascending_abbrev": "ચડતો ક્ર્મ",
-       "descending_abbrev": "ઉતરતો ક્ર્મ",
        "table_pager_next": "આગળનું પાનું",
        "table_pager_prev": "પાછળનું પાનું",
        "table_pager_first": "પહેલું પાનું",
index 2ada85c..3cb79ca 100644 (file)
        "notanarticle": "Cha nel eh shoh ny ghuillag cummal",
        "notvisiblerev": "Va'n aavriwnys scryssit",
        "watchlist-details": "Ta {{PLURAL:$1|$1 duillag|$1 duillag|$1 ghuillag|$1 duillagyn}} er dty rolley arrey, faagail magh duillagyn resoonaght.",
-       "wlshowlast": "Taishbyn ny kied $1 ooryn $2 laaghyn  s'jerree",
        "watchlist-options": "Reihyn da'n rolley arrey",
        "watching": "Jannoo arrey...",
        "unwatching": "Stap y chur er arrey...",
index 175ace8..ab9c729 100644 (file)
        "watchthispage": "Bin sawun wannan shafi",
        "unwatch": "Daina bin sawu",
        "watchlist-details": "{{PLURAL:$1|$1 shafi|$1 shafuna}} kan jerinku na bin sawu, banda shafunan mahawara.",
-       "wlshowlast": "Nuna awowi $1 kwanaki $2 na ƙarshe",
        "watchlist-options": "Saituttukan jerin bin sawu",
        "watching": "Bin sawun...",
        "unwatching": "Daina bin sawu...",
index d4eb97f..86a19ed 100644 (file)
        "wlheader-enotif": "Yí-kîn khí-thung email thûng-tî kûng-nèn.",
        "wlheader-showupdated": "Chhai ngì song-chhṳ kiám-sṳ heu yû pûn chhùng-siû ko ke vùn-chông chiông-voi hién-sṳ vi '''chhû-thí'''.",
        "wlnote": "Yî-ha he chui-khiûn <b>$2</b> séu-sṳ̀ nui-ke chui-heu $1-chhṳ chin-siû.",
-       "wlshowlast": "展示最近$1隻鐘頭,$2日或嘅更改。",
        "watchlist-options": "監視列表選項",
        "watching": "監視中...",
        "unwatching": "停止監視中...",
        "imgmultipageprev": "← sông yit-chông",
        "imgmultipagenext": "hâ yit-chông →",
        "imgmultigo": "確定!",
-       "ascending_abbrev": "Suk-siá chen",
-       "descending_abbrev": "Suk-siá-kám",
        "table_pager_next": "Hâ yit-chông",
        "table_pager_prev": "Sông yit-chông",
        "table_pager_first": "Thi-yit-chông",
index 9d7bc51..2d6a821 100644 (file)
        "watchthispage": "E nānā pono i kēia mea",
        "unwatch": "Kiaʻi ʻole",
        "watchlist-details": "{{PLURAL:$1|$1 ʻaoʻao|$1 mau ʻaoʻao}} a kāu papakiaʻi, me ʻole ke koe ʻana o nā ʻaoʻao walaʻau.",
-       "wlshowlast": "Hōʻike $1 hola aku nei $2 lā aku nei",
        "watchlist-options": "Nā Koho papakiaʻi",
        "watching": "Kia‘i nei...",
        "unwatching": "Ke wehe nei i ke kiaʻi...",
        "img-lang-default": "(ʻōlelo paʻamau)",
        "img-lang-info": "Hana i kēia kiʻi ma ka $1. $2",
        "img-lang-go": "Kele",
-       "ascending_abbrev": "Pilu",
-       "descending_abbrev": "Pila",
        "table_pager_next": "ʻAoʻao hou aʻe",
        "table_pager_prev": "ʻAoʻao aku nei",
        "table_pager_first": "ʻAoʻao mua",
index 3805d4f..ed268de 100644 (file)
        "nocreate-loggedin": "אין לך הרשאה ליצור דפים חדשים.",
        "sectioneditnotsupported-title": "עריכת פסקאות אינה נתמכת",
        "sectioneditnotsupported-text": "עריכת פסקאות אינה נתמכת בדף זה.",
+       "modeleditnotsupported-title": "העריכה אינה נתמכת",
+       "modeleditnotsupported-text": "העריכה אינה נתמכת למודל התוכן $1.",
        "permissionserrors": "שגיאת הרשאה",
        "permissionserrorstext": "אין באפשרותך לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
        "permissionserrorstext-withaction": "אין באפשרותך $2, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "אובייקט ריק",
        "content-json-empty-array": "מערך ריק",
+       "unsupported-content-model": "<strong>אזהרה:</strong> מודל התוכן $1 אינו נתמך בוויקי הזה.",
+       "unsupported-content-diff": "השוואות אינן נתמכות במודל התוכן $1.",
+       "unsupported-content-diff2": "השוואות בין מודל התוכן $1 לבין מודל $2 אינן נתמכות בוויקי הזה.",
        "deprecated-self-close-category": "דפים שמשתמשים בתגיות HTML עם סגירה עצמית בלתי־תקינה",
        "deprecated-self-close-category-desc": "הדף מכיל תגיות HTML עם סגירה עצמית בלתי־תקינה, כגון <code dir=\"ltr\">&lt;b/></code> או <code dir=\"ltr\">&lt;span/></code>. ההתנהגות של תגיות אלה תשתנה בקרוב לצורך תאימות עם מפרט HTML5, ולכן יש להימנע משימוש בהן בקוד ויקי.",
        "duplicate-args-warning": "<strong>אזהרה:</strong> [[:$1]] קורא לדף [[:$2]] עם יותר מערך אחד עבור הפרמטר \"$3\". ייעשה שימוש רק בערך האחרון.",
        "wlheader-enotif": "התראות דוא\"ל מופעלות.",
        "wlheader-showupdated": "דפים שהשתנו מאז ביקורך האחרון בהם מוצגים ב<strong>הדגשה</strong>.",
        "wlnote": "להלן {{PLURAL:$1|השינוי האחרון|<strong>$1</strong> השינויים האחרונים}} {{PLURAL:$2|בשעה האחרונה|בשעתיים האחרונות|ב־<strong>$2</strong> השעות האחרונות}}, עד $4, $3.",
-       "wlshowlast": "הצגת $1 שעות אחרונות $2 ימים אחרונים",
        "watchlist-hide": "הסתרת",
        "watchlist-submit": "הצגה",
        "wlshowtime": "תקופת זמן לצפייה:",
        "sessionfailure": "נראה שיש בעיה בחיבור שלך לאתר;\nפעולה זו בוטלה כאמצעי זהירות נגד התחזות לתקשורת ממחשבך.\nנא לשלוח מחדש את הטופס.",
        "changecontentmodel": "שינוי מודל התוכן של דף",
        "changecontentmodel-legend": "שינוי מודל התוכן",
-       "changecontentmodel-title-label": "שם הדף",
+       "changecontentmodel-title-label": "שם הדף:",
        "changecontentmodel-current-label": "מודל התוכן הנוכחי:",
-       "changecontentmodel-model-label": "מודל התוכן החדש",
+       "changecontentmodel-model-label": "מודל התוכן החדש:",
        "changecontentmodel-reason-label": "סיבה:",
        "changecontentmodel-submit": "שינוי",
        "changecontentmodel-success-title": "מודל התוכן שוּנה",
        "img-lang-default": "(שפת ברירת המחדל)",
        "img-lang-info": "הצגת תמונה זו בשפה $1. $2",
        "img-lang-go": "הצגה",
-       "ascending_abbrev": "עולה",
-       "descending_abbrev": "יורד",
        "table_pager_next": "הדף הבא",
        "table_pager_prev": "הדף הקודם",
        "table_pager_first": "הדף הראשון",
index 856e414..daf9cf9 100644 (file)
        "wlheader-enotif": "ई-मेल नोटिफ़िकेशन सक्षम हैं।",
        "wlheader-showupdated": "आपके देखे जाने के बाद जिन पृष्ठों में बदलाव होगा, उनकी कड़ी <strong>गहरे</strong> रंग की दिखेगी।",
        "wlnote": "$3 को $4 बजे तक पिछले <strong>$2</strong> {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हुआ एक|हुए <strong>$1</strong>}} परिवर्तन निम्न {{PLURAL:$1|है|हैं}}।",
-       "wlshowlast": "पिछले $1 घंटे $2 दिन  देखें",
        "watchlist-hide": "छुपाएँ",
        "watchlist-submit": "दिखाएँ",
        "wlshowtime": "अंतिम दिखाएँ:",
        "img-lang-default": "(डिफ़ॉल्ट भाषा)",
        "img-lang-info": "इस चित्र को $1. $2 में ढालें",
        "img-lang-go": "जाएं",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "ज़ानकारी",
        "table_pager_next": "अगला पृष्ठ",
        "table_pager_prev": "पिछला पृष्ठ",
        "table_pager_first": "पहला पृष्ठ",
index f386e4d..9355e7c 100644 (file)
        "wlheader-enotif": "E-mail notification ke enable kar dewa gais hai.",
        "wlheader-showupdated": "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
        "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile <strong>$1</strong> badlao hai}} pichhle {{PLURAL:$2|ghanta|<strong>$2</strong> ghanta}} me as of $3, $4.",
-       "wlshowlast": "Pichhla $1 ghanta $2 din  ke dekhao",
        "watchlist-hide": "Lukao",
        "watchlist-submit": "Dekhao",
        "wlshowtime": "Kon samay ke display karaa jaae:",
        "img-lang-default": "(default bhasa)",
        "img-lang-info": "Ii chaapa ke $1. $2 me render karo",
        "img-lang-go": "Jaao",
-       "ascending_abbrev": "chhota se barraa",
-       "descending_abbrev": "barraa se chhota",
        "table_pager_next": "Aage waala panna",
        "table_pager_prev": "Pahile waala panna",
        "table_pager_first": "Pahila panna",
index 98ebaaf..30320ed 100644 (file)
        "watchthispage": "Bantayan ining panid",
        "unwatch": "Di maglantaw",
        "watchlist-details": "{{PLURAL:$1|$1 pahina|$1 mga pahina}} sa imo nga lista sang paglantaw, indi ang pag-isip sang imo ginahambal nga mga pahina.",
-       "wlshowlast": "Ipakita ang nagligad nga $1 oras $2 adlaw",
        "watchlist-options": "Pililian sa lista sang nagalantaw",
        "watching": "Nagalantaw...",
        "unwatching": "Di-paglantaw...",
index 08f2635..94945ff 100644 (file)
        "wlheader-enotif": "Uključeno je izvješćivanje e-poštom.",
        "wlheader-showupdated": "Stranice koje su promijenjene od Vašeg posljednjeg posjeta prikazane su '''podebljano'''.",
        "wlnote": "Niže {{PLURAL:$1|0=nema ijedna izmjena načinjena|je posljednja izmjena načinjena|su <strong>$1</strong> posljednje izmjene načinjene|su <strong>$1</strong> posljednjih izmjena načinjenih}} {{PLURAL:$2|0=u zadanom roku|posljednjega sata|u posljednja <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, zaključno do $3 u $4.",
-       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
        "wlshowtime": "Vremensko razdoblje za prikaz:",
        "imgmultigoto": "Idi na stranicu $1",
        "img-lang-default": "(zadani jezik)",
        "img-lang-go": "Idi",
-       "ascending_abbrev": "rast",
-       "descending_abbrev": "pad",
        "table_pager_next": "Sljedeća stranica",
        "table_pager_prev": "Prethodna stranica",
        "table_pager_first": "Prva stranica",
index b2033b7..6aebc20 100644 (file)
        "watchlist-details": "Du beobachtest {{PLURAL:$1|en Seit|$1 Seite}}, ohne dass Diskussionsseite getrennt gezählt werre.",
        "wlheader-enotif": "Der E-Mail-Benachrichtigungsdienst ist aktiviert.",
        "wlheader-showupdated": "Seite mit noch net gesiehne Ännrunge werre'''fett''' dorgestellt.",
-       "wlshowlast": "Zeich die Ännrunge von der letzte $1 Stunde, $2 Tooch.",
        "watchlist-options": "Oonzeichoptione",
        "watching": "Beobachte …",
        "unwatching": "Netmehr beobachte …",
        "img-lang-default": "(Standardsproch)",
        "img-lang-info": "Das Bild in $1 rendre. $2",
        "img-lang-go": "Los, geh",
-       "ascending_abbrev": "uff",
-       "descending_abbrev": "ab",
        "table_pager_next": "Nächste Seit",
        "table_pager_prev": "Vorrich Seit",
        "table_pager_first": "Earschte Seit",
index 2618ae0..60a4e6b 100644 (file)
        "wlheader-enotif": "E-mejlowa zdźělenska słužba je zmóžnjena.",
        "wlheader-showupdated": "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
        "wlnote": "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej <strong>$1</strong> změnje|su poslednje <strong>$1</strong> změny|je poslednich <strong>$1</strong> změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje <strong>$2</strong> hodźinje|poslednje <strong>$2</strong> hodźiny|poslednich <strong>$2</strong> hodźin}}, staw : $3, $4.",
-       "wlshowlast": "Změny zańdźenych $1 hodźin, $2 dnjow, pokazać",
        "wlshowtime": "Perioda, kotraž ma so pokazać:",
        "watchlist-options": "Opcije wobkedźbowankow",
        "watching": "Wobkedźbuju…",
        "img-lang-default": "(standardna rěč)",
        "img-lang-info": "Tutón wobraz w $1 rysować. $2",
        "img-lang-go": "Wotpósłać",
-       "ascending_abbrev": "postupowacy",
-       "descending_abbrev": "zestupowacy",
        "table_pager_next": "přichodna strona",
        "table_pager_prev": "předchadna strona",
        "table_pager_first": "prěnja strona",
index b6d0ae1..e4b7a1d 100644 (file)
        "watchthispage": "Swiv paj sa a",
        "unwatch": "Pa swiv ankò",
        "watchlist-details": "W ap swiv {{PLURAL:$1|paj|paj}}, san konte paj diskisyon yo.",
-       "wlshowlast": "Montre dènye $1 è yo, dènye $2 jou yo, oubyen .",
        "watchlist-options": "Opsyon pou lis swivi",
        "watching": "Swiv...",
        "unwatching": "Fini swiv paj sa a...",
index 3a5bf06..ba8806b 100644 (file)
        "wlheader-enotif": "Az e-mailen keresztül történő értesítés engedélyezve.",
        "wlheader-showupdated": "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagítva''' láthatók.",
        "wlnote": "Alább {{PLURAL:$1|az utolsó változás|az utolsó <strong>$1</strong> változás}} látható az elmúlt {{PLURAL:$2|órában|<strong>$2</strong> órában}}, $3 $4-kor.",
-       "wlshowlast": "Az elmúlt $1 órában | $2 napon történt változtatások legyenek láthatóak",
        "watchlist-hide": "Elrejtés",
        "watchlist-submit": "Megjelenítés",
        "wlshowtime": "Időszak:",
        "img-lang-default": "(alapértelmezett nyelv)",
        "img-lang-info": "Kép feldolgozása $1 nyelven. $2",
        "img-lang-go": "Mehet",
-       "ascending_abbrev": "növ",
-       "descending_abbrev": "csökk",
        "table_pager_next": "Következő oldal",
        "table_pager_prev": "Előző oldal",
        "table_pager_first": "Első oldal",
index 36add17..6ec9c9e 100644 (file)
        "wlheader-enotif": "Էլ-փոստով տեղեկացումը միացված է։",
        "wlheader-showupdated": "Էջերը, որոնք փոփոխվել են ձեր վերջին այցից հետո, բերված են '''թավատառ'''։",
        "wlnote": "Ստորև բերված {{PLURAL:$1|է վերջին փոփոխությունը|են վերջին '''$1''' փոփոխությունները}} վերջին <strong>$2</strong> ժամվա ընթացքում՝ $3, $4֊ի դրությամբ։",
-       "wlshowlast": "Ցուցադրել վերջին $1 ժամերը $2 օրերը",
        "watchlist-hide": "Թաքցնել",
        "watchlist-submit": "Ցույց տալ",
        "wlshowtime": "Ցուցադրելու ժամանակահատվածը.",
        "imgmultigo": "Անցնե՛լ",
        "imgmultigoto": "Անցնել $1 էջը",
        "img-lang-go": "Անցնել",
-       "ascending_abbrev": "աճմ. կարգ.",
-       "descending_abbrev": "նվազ",
        "table_pager_next": "Հաջորդ էջ",
        "table_pager_prev": "Նախորդ էջ",
        "table_pager_first": "Առաջին էջ",
index 9dabf11..dd2d007 100644 (file)
        "watchlist-details": "Ձեր հսկողութեան ցանկը ունի {{PLURAL:$1|$1 էջ}}` (առաւել քննարկման էջեր)։",
        "wlheader-showupdated": "Ձեր վերջին այցելութենէն ետք փոփոխուած Էջերը տրուած են <strong>շեշտուած տառերով<strong>։",
        "wlnote": "Ներքեւ տրուած {{PLURAL:$1|է վերջին փոփոխութիւնը|են վերջին '''$1''' փոփոխութիւնները}} վերջին <strong>$2</strong> ժամուան ընթացքին՝ $3, $4ի դրութեամբ։",
-       "wlshowlast": "Ցոյց տալ վերջին $1 ժամերը $2 օրերը",
        "watchlist-hide": "Թաքցնել",
        "watchlist-submit": "Ցուցնել",
        "watchlist-options": "Հսկողութեան ացանկի նախընտրութիւններ",
index 73f7b5d..42f3c58 100644 (file)
        "nocreate-loggedin": "Tu non ha le permission de crear nove paginas.",
        "sectioneditnotsupported-title": "Modification de sectiones non supportate",
        "sectioneditnotsupported-text": "Non es possibile modificar sectiones individual in iste pagina de modification.",
+       "modeleditnotsupported-title": "Modification non supportate",
+       "modeleditnotsupported-text": "Non es possibile modificar contento del modello $1.",
        "permissionserrors": "Error de permission",
        "permissionserrorstext": "Tu non ha le permission de facer isto, pro le sequente {{PLURAL:$1|motivo|motivos}}:",
        "permissionserrorstext-withaction": "Tu non ha le permission de $2, pro le sequente {{PLURAL:$1|motivo|motivos}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objecto vacue",
        "content-json-empty-array": "Array vacue",
+       "unsupported-content-model": "<strong>Attention:</strong> Le modello de contento $1 non es supportate sur iste wiki.",
+       "unsupported-content-diff": "Non es possibile monstrar differentias pro contento del modello $1.",
+       "unsupported-content-diff2": "Non es possibile monstrar differentias inter contento del modellos $1 e $2 sur iste wiki.",
        "deprecated-self-close-category": "Paginas que usa etiquettas HTML auto-claudite non valide",
        "deprecated-self-close-category-desc": "Le pagina contine etiquettas HTML auto-claudite non valide, como <code>&lt;b/></code> o <code>&lt;span/></code>. Le comportamento de istes cambiara proximemente pro esser in accordo con le specification HTML5, dunque lor uso in wikitexto es obsolete.",
        "duplicate-args-warning": "<strong>Attention:</strong> [[:$1]] appella [[:$2]] con plure valores pro le parametro \"$3\". Solmente le ultime valor fornite essera usate.",
        "right-editmyusercss": "Modificar le proprie files CSS de usator",
        "right-editmyuserjson": "Modificar le files JSON del proprie usator",
        "right-editmyuserjs": "Modificar le files JavaScript del proprie usator",
+       "right-editmyuserjsredirect": "Modificar le proprie paginas JavaScript de usator que es redirectiones",
        "right-viewmywatchlist": "Vider le proprie observatorio",
        "right-editmywatchlist": "Modificar le proprie observatorio. Remarca que alcun actiones totevia adde paginas mesmo sin iste derecto.",
        "right-viewmyprivateinfo": "Vider le proprie datos private (p.ex. adresse de e-mail, nomine real)",
        "action-editmyusercss": "modificar le files CSS del proprie usator",
        "action-editmyuserjson": "modificar le files JSON del proprie usator",
        "action-editmyuserjs": "modificar le files JavaScript del proprie usator",
+       "action-editmyuserjsredirect": "modificar le proprie paginas JavaScript de usator que es redirectiones",
        "action-viewsuppressed": "vider versiones celate pro tote le usatores",
        "action-hideuser": "blocar un nomine de usator, celante lo del publico",
        "action-ipblock-exempt": "contornar le blocadas de adresses IP, blocadas automatic e blocadas de intervallos IP",
        "rcfilters-clear-all-filters": "Rader tote le filtros",
        "rcfilters-show-new-changes": "Vider le modificationes apportate desde $1",
        "rcfilters-search-placeholder": "Filtrar le modificationes (usa le menu o cerca le nomine del filtro)",
+       "rcfilters-search-placeholder-mobile": "Filtros",
        "rcfilters-invalid-filter": "Filtro non valide",
        "rcfilters-empty-filter": "Nulle filtro active. Tote le contributiones es monstrate.",
        "rcfilters-filterlist-title": "Filtros",
        "rcfilters-filter-showlinkedto-label": "Monstrar modificationes sur paginas que liga a",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Paginas que liga verso</strong> le pagina seligite",
        "rcfilters-target-page-placeholder": "Entra le nomine de un pagina (o categoria)",
+       "rcfilters-allcontents-label": "Tote le contento",
+       "rcfilters-alldiscussions-label": "Tote le discussiones",
        "rcnotefrom": "Ecce le {{PLURAL:$5|modification|modificationes}} a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas monstrate).",
        "rclistfromreset": "Reinitialisar selection de data",
        "rclistfrom": "Monstrar nove modificationes a partir del $3 a $2",
        "wlheader-enotif": "Le notification via e-mail es active.",
        "wlheader-showupdated": "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
        "wlnote": "Ecce le ultime {{PLURAL:$1|modification|<strong>$1</strong> modificationes}} durante le ultime {{PLURAL:$2|hora|<strong>$2</strong> horas}}, a partir del $3 a $4.",
-       "wlshowlast": "Monstrar le ultime $1 horas $2 dies",
        "watchlist-hide": "Celar",
        "watchlist-submit": "Monstrar",
        "wlshowtime": "Periodo de tempore a monstrar:",
        "sessionfailure": "Il pare haber un problema con tu session;\niste action ha essite cancellate como precaution contra le robamento de sessiones.\nPer favor, resubmitte le formulario.",
        "changecontentmodel": "Cambiar le modello de contento de un pagina",
        "changecontentmodel-legend": "Cambiar modello de contento",
-       "changecontentmodel-title-label": "Titulo del pagina",
-       "changecontentmodel-model-label": "Nove modello de contento",
+       "changecontentmodel-title-label": "Titulo del pagina:",
+       "changecontentmodel-current-label": "Modello de contento actual:",
+       "changecontentmodel-model-label": "Nove modello de contento:",
        "changecontentmodel-reason-label": "Motivo:",
        "changecontentmodel-submit": "Cambiar",
        "changecontentmodel-success-title": "Le modello de contento ha essite cambiate",
        "img-lang-default": "(lingua predefinite)",
        "img-lang-info": "Presentar iste imagine in $1. $2",
        "img-lang-go": "Va",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Sequente pagina",
        "table_pager_prev": "Precedente pagina",
        "table_pager_first": "Prime pagina",
index 10046fa..d394695 100644 (file)
        "wlheader-enotif": "Notifikasi surel diaktifkan.",
        "wlheader-showupdated": "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
        "wlnote": "Di bawah ini adalah {{PLURAL:$1|perubahan|<strong>$1</strong> perubahan}} terakhir dalam {{PLURAL:$2|jam|<strong>$2</strong> jam}}, per $3, $4.",
-       "wlshowlast": "Tampilkan $1 jam $2 hari terakhir",
        "watchlist-hide": "Sembunyikan",
        "watchlist-submit": "Tampilkan",
        "wlshowtime": "Periode waktu untuk ditampilkan:",
        "move-page-legend": "Pindahkan halaman",
        "movepagetext": "Menggunakan formulir di bawah ini akan mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul lama akan menjadi halaman pengalihan ke judul baru.\nAnda dapat memperbarui pengalihan yang menuju ke judul asli secara otomatis.\nJika Anda memilih tidak, pastikan untuk memeriksa\n[[Special:DoubleRedirects|pengalihan ganda]] atau [[Special:BrokenRedirects|pengalihan rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terhubung ke tempat seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman pada judul yang baru, kecuali bila halaman peralihan dan tidak mempunyai sejarah penyuntingan. \nIni berarti Anda dapat mengubah kembali nama halaman seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Catatan:'''\nIni dapat mengakibatkan perubahan drastis dan tak terduga bagi halaman yang populer; pastikan Anda mengerti konsekuensinya sebelum melanjutkan.",
        "movepagetext-noredirectfixer": "Formulir di bawah ini digunakan untuk mengubah nama suatu halaman dan memindahkan semua data sejarah ke nama baru.\nJudul yang lama akan menjadi halaman peralihan menuju judul yang baru.\nPastikan untuk memeriksa pengalihan [[Special:DoubleRedirects|ganda]] atau [[Special:BrokenRedirects|rusak]].\nAnda bertanggung jawab untuk memastikan bahwa pranala terus menyambung ke halaman yang seharusnya.\n\nPerhatikan bahwa halaman '''tidak''' akan dipindah apabila telah ada halaman yang menggunakan judul yang baru, kecuali bila halaman tersebut kosong atau merupakan halaman peralihan dan tidak mempunyai sejarah penyuntingan.\nIni berarti Anda dapat mengubah nama halaman kembali seperti semula apabila Anda membuat kesalahan, dan Anda tidak dapat menimpa halaman yang telah ada.\n\n'''Catatan:'''\nHal ini dapat mengakibatkan perubahan yang tak terduga dan drastis bagi halaman yang populer;\nPastikan Anda mengerti konsekuensi dari perbuatan ini sebelum melanjutkan.",
-       "movepagetalktext": "Jika Anda memberikan ceklis pada kotak ini, halaman pembicaraan yang berkaitan juga akan dipindahkan secara otomatis kecuali sebuah halaman pembicaraan yang tidak kosong telah ada di bawah judul baru.\n\nDalam kasus tersebut, apabila diinginkan, Anda dapat memindahkan atau menggabungkan halaman secara manual.",
+       "movepagetalktext": "Jika Anda mencentang kotak ini, halaman pembicaraan berkaitan akan dipindahkan secara otomatis ke judul baru, kecuali halaman pembicaraan tersebut tidak kosong.\n\nDalam kasus tersebut, Anda harus memindahkan atau menggabungkan halaman secara manual.",
        "moveuserpage-warning": "'''Peringatan:''' Anda tengah memindahkan halaman pengguna. Perlu diketahui bahwa hanya halaman yang akan dipindahkan namun pengguna ''tidak akan'' berganti nama.",
        "movecategorypage-warning": "<strong>Peringatan:</strong> Anda akan memindahkan halaman kategori. Perlu diketahui bahwa hanya halaman yang akan dipindahkan dan setiap halaman dalam kategori lama <em>tidak</em> akan dikategorikan ulang ke yang baru.",
        "movenologintext": "Anda harus menjadi pengguna terdaftar dan telah [[Special:UserLogin|masuk log]] untuk dapat memindahkan suatu halaman.",
        "move-subpages": "Pindahkan subhalaman (sampai $1)",
        "move-talk-subpages": "Pindahkan semua subhalaman pembicaraan (sampai $1)",
        "movepage-page-exists": "Halaman $1 telah ada dan tidak dapat ditimpa secara otomatis.",
+       "movepage-source-doesnt-exist": "Halaman $1 tidak ada dan tidak dapat dipindahkan.",
        "movepage-page-moved": "Halaman $1 telah dipindahkan ke $2.",
        "movepage-page-unmoved": "Halaman $1 tidak dapat dipindahkan ke $2.",
        "movepage-max-pages": "Sejumlah maksimum $1 {{PLURAL:$1|halaman|halaman}} telah dipindahkan dan tidak ada lagi yang akan dipindahkan secara otomatis.",
        "img-lang-default": "(bahasa default)",
        "img-lang-info": "Jadikan gambar ini dalam $1. $2",
        "img-lang-go": "Tuju ke",
-       "ascending_abbrev": "naik",
-       "descending_abbrev": "turun",
        "table_pager_next": "Halaman selanjutnya",
        "table_pager_prev": "Halaman sebelumnya",
        "table_pager_first": "Halaman pertama",
index a949039..321548b 100644 (file)
        "wlheader-enotif": "Li notification de e-mail es permisset.",
        "wlheader-showupdated": "Págines quel hat esset mutat desde tui ultim visitation es monstrat in '''nigri'''",
        "wlnote": "Infra {{PLURAL:$1|es li ultim change|es li ultim '''$1''' changes}} in li ultim {{PLURAL:$2|hor|'''$2''' hores}}.",
-       "wlshowlast": "Monstra ultim $1 hores $2 dies",
        "wlshowhidecategorization": "categorisation de págines",
        "watchlist-options": "Optiones de liste de págines vigilat",
        "watching": "Vigilant...",
index 5daed6e..91311a9 100644 (file)
        "preview": "Lètú",
        "showpreview": "Zìwe nkirimaàtụ̀",
        "showdiff": "Zi mgbanwè",
-       "anoneditwarning": "'''ndụmodụ:''' Ịjighị aha gị banye. Onye ọbụla ga-ahụ akara IP gị ma ọbụrụ na-ime ndezi ebe a. Jiri aha gi banye ka ndezi niile i ga-eme gosi n'aha gi.",
+       "anoneditwarning": "<strong>ndụmodụ:</strong>Ịjighị aha gị banye. Onye ọbụla ga-ahụ akara IP gị ma ọbụrụ na-ime ndezi ebe a. Jiri <strong>[$1aha banye]</strong> m'ọbụ <strong>[$2 kepụta akanụtụ]</strong>,ndezi niile i ga-eme gosi n'aha gi.",
        "missingcommenttext": "Biko tinyé ótù okwu na àlà nga.",
        "summary-preview": "Hutukwá mmẹkotá:",
        "subject-preview": "Ihe gbasara/Ishi ahiri I hütü ntakịrị:",
        "unwatch": "A hükwàlà",
        "notanarticle": "Búghị ihü ihe nọr",
        "watchlist-details": "{{PLURAL:$1|ihü $1|ihü $1}} nọr na ndétu ihe Í ne lé, nke à gúgị ihü okwu.",
-       "wlshowlast": "Zi nke mbu àmànị $1 chi $2",
        "watchlist-options": "Nrọta ndetu nlènlé",
        "watching": "O na hü...",
        "unwatching": "O mele ka o na á hü kwagi...",
        "svg-long-desc": "usòrò SVG, nà áhà pixel $1 × $2, ívụ usòrò: $3",
        "show-big-image": "Failụ si na nke mbu",
        "show-big-image-preview": "Otu nyochaa a ha:$1",
-       "show-big-image-other": "Ndị ọzọ {{PLURAL:$2|mkpebi|mkpebi}}:$1.",
+       "show-big-image-other": "Ndị ọzọ {{PLURAL:$2|resolution|mkpebi}}:$1.",
        "show-big-image-size": "$1 × $2 piksels",
        "file-info-gif-looped": "etemte",
        "newimages-legend": "Nzàtà",
        "imgmultipagenext": "ihü nke di nso →",
        "imgmultigo": "Gàa!",
        "imgmultigoto": "Gá na ihü $1",
-       "ascending_abbrev": "heé élu",
-       "descending_abbrev": "ndạtạ",
        "table_pager_next": "Ihü sò",
        "table_pager_prev": "Ihü na àzú",
        "table_pager_first": "Ihü mbu",
index e4e30a8..d9df469 100644 (file)
        "wlheader-enotif": "Napakabaelan ti panangipakaammo ti esurat.",
        "wlheader-showupdated": "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti <strong>napuskol</strong>.",
        "wlnote": "Dita baba ket {{PLURAL:$1|naudi a sinukatan|dagiti naudi a <strong>$1</strong> a sinukatan}} iti napalabas {{PLURAL:$2|nga oras|a <strong>$2</strong> nga or-oras}}, manipud idi $3, $4.",
-       "wlshowlast": "Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw",
        "watchlist-hide": "Ilemmeng",
        "watchlist-submit": "Ipakita",
        "wlshowtime": "Ipakita a paset ti panawen:",
        "img-lang-default": "(kasisigud a pagsasao)",
        "img-lang-info": "Ipaay daytoy a ladawan iti $1. $2",
        "img-lang-go": "Inkan",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Sumaruno a panid",
        "table_pager_prev": "Napalabas a panid",
        "table_pager_first": "Umuna a panid",
index 91f420e..baee1f0 100644 (file)
        "watchlist-details": "Хьа зема хьаязъяьра чу $1 {{PLURAL:$1|оагIув}} я (иштта я дувцара оагIонаш а).",
        "wlheader-showupdated": "Хувцаенна оагIонаш '''сома''' шрифтаца белгалъяьй.",
        "wlnote": "ЛохегIа хьагойт {{PLURAL:$2|тIехьарча сахьата|тIехьарча <strong>$2</strong> сахьата}} даь хинна {{PLURAL:$1|тIехьара хувцам|тIехьара <strong>$1</strong> хувцам}} ($3 $4).",
-       "wlshowlast": "Хьахьокха тIехьарча $2 ден $1 сахьатá",
        "watchlist-hide": "Ма хьокха",
        "watchlist-submit": "Хьахьокха",
        "wlshowtime": "МалагIча ха юкъа хиннар гойта деза:",
index c9dc15a..4d8c538 100644 (file)
        "listredirects": "Listo di ridirektili",
        "listduplicatedfiles": "Listo pri arkivi kun duplikati",
        "unusedtemplates": "Neuzata shabloni",
+       "unusedtemplatestext": "Ca pagino montras omna pagini di {{ns:template}} qui ne uzesas en altra pagini.\nVoluntez serchar altra ligili a la shabloni montrata adinfre, ante efacar li.",
        "unusedtemplateswlh": "altra ligili",
        "randompage": "Hazarda pagino",
        "randomincategory-submit": "Irez",
        "wlheader-enotif": "L'informo per e-posto esas funcionanta.",
        "wlheader-showupdated": "Pagini qui modifikesis pos vua lasta vizito montresas en <strong>dika literi</strong>.",
        "wlnote": "Yen la maxim recenta {{PLURAL:$1|chanjo|<strong>$1</strong> chanji}} dum la lasta {{PLURAL:$2|horo|<strong>$2</strong> hori}}, de $3,$4.",
-       "wlshowlast": "Montrez la lasta $1 hori $2 dii",
        "watchlist-submit": "Montrez",
        "wlshowhideminor": "mikra redakturi",
        "wlshowhidebots": "Roboti (bots)",
        "imgmultipagenext": "sequanta pagino →",
        "imgmultigo": "Irez!",
        "imgmultigoto": "Irez a pagino $1",
-       "ascending_abbrev": "aces",
-       "descending_abbrev": "decen",
        "table_pager_next": "Sequanta pagino",
        "table_pager_prev": "Antea pagino",
        "table_pager_first": "Unesma pagino",
index a161262..029e173 100644 (file)
        "wlheader-enotif": "Tilkynning með tölvupósti er virk.",
        "wlheader-showupdated": "Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''.",
        "wlnote": "Hér fyrir neðan {{PLURAL:$1|er síðasta <strong>$1</strong> breyting|eru síðustu <strong>$1</strong> breytingar}} {{PLURAL:$2|síðasta <strong>$2</strong> klukkutímann|síðustu <strong>$2</strong> klukkutímana}}, frá $3, $4.",
-       "wlshowlast": "Sýna síðustu $1 klukkutíma, $2 daga",
        "watchlist-hide": "Fela",
        "watchlist-submit": "Birta",
        "wlshowtime": "Tímabil sem á að birta:",
        "img-lang-default": "(sjálfgefið tungumál)",
        "img-lang-info": "Myndgera þessa mynd í $1. $2",
        "img-lang-go": "Fara",
-       "ascending_abbrev": "hækkandi",
-       "descending_abbrev": "lækkandi",
        "table_pager_next": "Næsta síða",
        "table_pager_prev": "Fyrri síða",
        "table_pager_first": "Fyrsta síðan",
index a310d1a..7755186 100644 (file)
                        "Ignazio Cannata",
                        "Frubino",
                        "TheRukk",
-                       "Titore"
+                       "Titore",
+                       "GiorgioHerbie"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "edit-conflict": "Conflitto di edizione.",
        "edit-no-change": "La modifica è stata ignorata poiché non sono stati apportati cambiamenti al testo.",
        "edit-slots-cannot-add": "{{PLURAL:$1|Il seguente slot non è supportato|I seguenti slot non sono supportati}} qui: $2",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|Lo slot seguente è richiesto e non può essere rimosso|Gli slot seguenti sono richiesti e non possono essere rimossi}}: $2.",
+       "edit-slots-missing": "{{PLURAL:$1|Lo slot seguente è mancante|Gli slot seguenti sono mancanti}}: $2",
        "postedit-confirmation-created": "La pagina è stata creata.",
        "postedit-confirmation-restored": "La pagina è stata ripristinata.",
        "postedit-confirmation-saved": "La modifica è stata salvata.",
        "converter-manual-rule-error": "Rilevato errore nella regola manuale di conversione della lingua",
        "undo-success": "Questa modifica può essere annullata.\nControlla le differenze mostrate sotto fra le due versioni per essere certo che il contenuto corrisponda a quanto desiderato, e quindi salvare le modifiche per completare la procedura di annullamento.",
        "undo-failure": "Impossibile annullare la modifica a causa di un conflitto con modifiche intermedie.",
+       "undo-main-slot-only": "La modifica non può essere annullata perché comprende contenuto esterno allo slot principale.",
        "undo-norev": "La modifica non può essere annullata perché non esiste o è stata cancellata.",
        "undo-nochange": "Sembra che la modifica sia già stata annullata.",
        "undo-summary": "Annullata la modifica $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]])",
        "search-interwiki-more": "(altro)",
        "search-interwiki-more-results": "altri risultati",
        "search-relatedarticle": "Risultati correlati",
+       "search-invalid-sort-order": "L'ordine di visualizzazione di $1 non è riconosciuto, sarà applicato l'ordine predefinito.\nGli ordini di visualizzazione validi sono: $2",
        "searchrelated": "correlati",
        "searchall": "tutti",
        "showingresults": "Di seguito {{PLURAL:$1|viene presentato al massimo '''1''' risultato|vengono presentati al massimo '''$1''' risultati}} a partire dal numero '''$2'''.",
        "right-editmyusercss": "Modifica il file CSS del proprio utente",
        "right-editmyuserjson": "Modifica il file JSON del proprio utente",
        "right-editmyuserjs": "Modifica il file JavaScript del proprio utente",
+       "right-editmyuserjsredirect": "Modifica i propri file JavaScript che sono reindirizzamenti",
        "right-viewmywatchlist": "Visualizza i propri osservati speciali",
        "right-editmywatchlist": "Modifica i propri osservati speciali. Da notare che alcune azioni potranno ancora aggiungere pagine anche senza questo diritto.",
        "right-viewmyprivateinfo": "Visualizza i propri dati personali (ad esempio: indirizzo email, nome vero)",
        "action-changetags": "aggiungere o rimuovere specifiche etichette su singole versioni o voci di registro",
        "action-deletechangetags": "cancellare le etichette dal database",
        "action-purge": "aggiornare questa pagina",
+       "action-apihighlimits": "usare limiti più alti per le interrogazioni API",
+       "action-autoconfirmed": "non essere soggetto al limite di azioni per IP",
+       "action-bigdelete": "cancellare pagine con cronologie lunghe",
+       "action-blockemail": "impedire a un utente di inviare email",
+       "action-bot": "essere trattato come processo automatizzato",
+       "action-editprotected": "modificare pagine protette con \"{{int:protect-level-sysop}}\"",
        "action-editinterface": "modificare l'interfaccia utente",
        "action-editusercss": "modificare i file CSS di altri utenti",
        "action-edituserjson": "modificare i file JSON di altri utenti",
        "action-editmyusercss": "modificare i propri file CSS",
        "action-editmyuserjson": "modificare i propri file JSON",
        "action-editmyuserjs": "modificare i propri file JavaScript",
+       "action-viewsuppressed": "vedere versioni nascoste a qualsiasi utente",
+       "action-hideuser": "bloccare un nome utente, nascondendolo al pubblico",
+       "action-ipblock-exempt": "ignorare i blocchi IP, blocchi automatici e blocchi ad intervalli",
+       "action-noratelimit": "non essere soggetto a limiti di intervallo",
+       "action-reupload-own": "sovrascrivere file esistenti caricati da qualcuno",
+       "action-override-export-depth": "esportare pagine che includono pagine collegate fino ad una profondità di 5",
+       "action-suppressredirect": "non creare reindirizzamenti da pagine sorgente quando si spostano le pagine",
        "nchanges": "$1 {{PLURAL:$1|modifica|modifiche}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dall'ultima visita}}",
        "enhancedrc-history": "cronologia",
        "rcfilters-filter-showlinkedto-label": "Mostra le modifiche alle pagine che collegano a",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Pagine con collegamenti a</strong> la pagina selezionata",
        "rcfilters-target-page-placeholder": "Inserisci il nome di una pagina (o categoria)",
+       "rcfilters-allcontents-label": "Tutti i contenuti",
        "rcfilters-alldiscussions-label": "Tutte le discussioni",
        "rcnotefrom": "Di seguito {{PLURAL:$5|è elencata la modifica apportata|sono elencate le modifiche apportate}} a partire da <strong>$3, $4</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfromreset": "Reimposta la selezione della data",
        "uploadbtn": "Carica",
        "reuploaddesc": "Torna al modulo per il caricamento.",
        "upload-tryagain": "Invia la descrizione del file modificato",
+       "upload-tryagain-nostash": "Invia file ricaricato e descrizione modificata",
        "uploadnologin": "Accesso non effettuato",
        "uploadnologintext": "Per caricare file è necessario $1.",
        "upload_directory_missing": "La directory di upload ($1) non esiste e non può essere creata dal server web.",
        "uploadstash-bad-path": "Il percorso non esiste.",
        "uploadstash-bad-path-invalid": "Il percorso non è valido.",
        "uploadstash-bad-path-unknown-type": "Tipo sconosciuto \"$1\".",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Nome anteprima non riconosciuto.",
        "uploadstash-file-not-found-no-thumb": "Non è stato possibile ottenere la miniatura.",
+       "uploadstash-file-not-found-no-local-path": "Nessun percorso locale per l'elemento scalato.",
+       "uploadstash-file-not-found-no-object": "Impossibile creare un oggetto del file locale per l'anteprima.",
        "uploadstash-file-not-found-no-remote-thumb": "Recupero della miniatura fallito: $1\nURL = $2",
+       "uploadstash-not-logged-in": "Nessun utente connesso, i file devono appartenere agli utenti.",
+       "uploadstash-no-extension": "L'estensione è nulla.",
        "uploadstash-zero-length": "Il file ha lunghezza zero.",
        "invalid-chunk-offset": "Offset della parte non valido.",
        "img-auth-accessdenied": "Accesso negato",
        "move": "Sposta",
        "movethispage": "Sposta questa pagina",
        "unusedimagestext": "In questo elenco sono presenti i file caricati e non usati nel sito.\nPotrebbero essere presenti immagini che sono usate da altri siti con un collegamento diretto.",
+       "unusedimagestext-categorizedimgisused": "I file seguenti esistono ma non sono integrati in alcuna pagina. Le immagini categorizzate sono considerate come usate nonostante non siano integrate in alcuna pagina. Si prega di notare che altri siti web potrebbero collegarsi ad un file con un URL diretto, e potrebbero cioè essere ancora elencati qui nonostante siano in uso attivo.",
        "unusedcategoriestext": "Le seguenti pagine testuali esistono, sebbene le categorie corrispondenti siano vuote.",
        "notargettitle": "Dati mancanti",
        "notargettext": "Non è stata indicata una pagina o un utente in relazione al quale eseguire l'operazione richiesta.",
        "apisandbox-results-error": "Si è verificato un errore durante il caricamento della risposta all'interrogazione API: $1",
        "apisandbox-request-selectformat-label": "Mostra i dati richiesti come:",
        "apisandbox-request-url-label": "URL di richiesta:",
+       "apisandbox-request-json-label": "Richiesta JSON:",
        "apisandbox-request-time": "Tempo richiesto: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Correggi token e reinvia",
        "apisandbox-results-fixtoken-fail": "Impossibile recuperare il token \"$1\".",
        "wlheader-enotif": "La notifica via email è attiva.",
        "wlheader-showupdated": "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
        "wlnote": "Di seguito {{PLURAL:$1|è elencata la modifica più recente apportata|sono elencate le <strong>$1</strong> modifiche più recenti apportate}} {{PLURAL:$2|nella scorsa ora|nelle scorse <strong>$2</strong> ore}}; i dati sono aggiornati alle $4 del $3.",
-       "wlshowlast": "Mostra le ultime $1 ore $2 giorni",
        "watchlist-hide": "Nascondi",
        "watchlist-submit": "Mostra",
        "wlshowtime": "Periodo di tempo da visualizzare:",
        "changecontentmodel": "Modifica il modello di contenuto di una pagina",
        "changecontentmodel-legend": "Modifica il modello di contenuto",
        "changecontentmodel-title-label": "Titolo della pagina",
+       "changecontentmodel-current-label": "Modello contenuto attuale:",
        "changecontentmodel-model-label": "Nuovo modello di contenuto",
        "changecontentmodel-reason-label": "Motivo:",
        "changecontentmodel-submit": "Modifica",
        "img-lang-default": "(lingua predefinita)",
        "img-lang-info": "Converti questa immagine in $1. $2",
        "img-lang-go": "Vai",
-       "ascending_abbrev": "cresc",
-       "descending_abbrev": "decresc",
        "table_pager_next": "Pagina successiva",
        "table_pager_prev": "Pagina precedente",
        "table_pager_first": "Prima pagina",
index 51c51b7..8d7fdc1 100644 (file)
        "wlheader-enotif": "メール通知が有効になっています。",
        "wlheader-showupdated": "最終訪問以降に変更されたページは、<strong>太字</strong>で表示されます。",
        "wlnote": "$3 $4 までの{{PLURAL:$2|<strong>$2</strong>時間}}になされた{{PLURAL:$1|<strong>$1</strong>件の変更}}は以下の通りです。",
-       "wlshowlast": "表示する期間: $1時間、$2日間",
        "watchlist-hide": "非表示",
        "watchlist-submit": "表示",
        "wlshowtime": "表示範囲:",
        "img-lang-default": "(既定の言語)",
        "img-lang-info": "この画像を $1 で描画する。$2",
        "img-lang-go": "実行",
-       "ascending_abbrev": "昇順",
-       "descending_abbrev": "降順",
        "table_pager_next": "次のページ",
        "table_pager_prev": "前のページ",
        "table_pager_first": "最初のページ",
index 55a5ec0..0981682 100644 (file)
        "watchthispage": "Wach dis piej",
        "unwatch": "Anwach",
        "watchlist-details": "{{PLURAL:$1|$1 piej|$1 piej}} pahn yu wachlis, naa kount taak piej.",
-       "wlshowlast": "Shuo laas $1 howa $2 die",
        "watchlist-options": "Wachlis apshan",
        "watching": "De wach ...",
        "unwatching": "De anwach ...",
index 442a028..317b5a7 100644 (file)
        "watchthispage": "Öwewåg siden",
        "unwatch": "Fjän öwewågneng",
        "watchlist-details": "Du har $1 {{PLURAL:$1|side|sider}} på din åvervågnengsliste (øn diskusjesider).",
-       "wlshowlast": "Ves de seneste $1 têmer $2 dåg",
        "watching": "Tilfye öwewågneng...",
        "unwatching": "Fjäne öwewågneng...",
        "deletepage": "Slett siid",
index 0c640c6..243c68c 100644 (file)
        "wlheader-enotif": "Wara-wara layang-èl diurubaké.",
        "wlheader-showupdated": "Kaca kang wis owah kawit wektu pungkasan panjenengan priksa katuduhaké mawa <strong>hurup kandel</strong>.",
        "wlnote": "Ing ngisor iki {{PLURAL:$1|owahan pungkasan|<strong>$1</strong> owahan pungkasan}} ing dalem {{PLURAL:$2|jam|<strong>$2</strong> jam}} pungkasan, rikala $3, $4.",
-       "wlshowlast": "Tuduhaké $1 jam $2 dina pungkasan",
        "watchlist-hide": "Dhelikaké",
        "watchlist-submit": "Tuduhaké",
        "wlshowtime": "Kala mangsa kanggo dituduhaké:",
        "img-lang-default": "(basa gawan)",
        "img-lang-info": "Olah gambar iki ing $1. $2",
        "img-lang-go": "Mangkat",
-       "ascending_abbrev": "unggah",
-       "descending_abbrev": "mudhun",
        "table_pager_next": "Kaca sabanjuré",
        "table_pager_prev": "Kaca sadurungé",
        "table_pager_first": "Kaca kapisan",
index 1416f15..ffdeba8 100644 (file)
        "wlheader-enotif": "ელ.ფოსტით შეტყობინება ჩართულია.",
        "wlheader-showupdated": "თქვენი ბოლო ვიზიტის შემდეგ შეცვლილი გვერდები, აღნიშნულია '''მუქად'''.",
        "wlnote": "ქვემოთ {{PLURAL:$1|ნაჩვენებია ბოლო ცვლილება|ნაჩვენებია ბოლო '''$1''' ცვლილება}} უკანასკნელი {{PLURAL:$2|საათის|'''$2''' საათის}} მანძილზე, $3, $4 მდგომარეობით.",
-       "wlshowlast": "ბოლო $1 საათის $2 დღის ჩვენება",
        "watchlist-hide": "დამალვა",
        "watchlist-submit": "ჩვენება",
        "wlshowtime": "აჩვენე დროის პერიოდი:",
        "img-lang-default": "(საწყისი ენა)",
        "img-lang-info": "აჩვენე ეს გამოსახულება : $1, $2-ში",
        "img-lang-go": "წინ",
-       "ascending_abbrev": "დაბრ",
-       "descending_abbrev": "აღწერა",
        "table_pager_next": "შემდეგი გვერდი",
        "table_pager_prev": "წინა გვერდი",
        "table_pager_first": "პირველი გვერდი",
index f3bff49..306806b 100644 (file)
        "watchlist-details": "Baqlaw dizimin'izde (sa'wbet betlerin esapqa almag'anda) {{PLURAL:$1|1 bet|$1 bet}} bar.",
        "wlheader-enotif": "E-mail arqalı eskertiw qosılg'an.",
        "wlnote": "To'mende aqırg'ı {{PLURAL:$2|saattag'ı|'''$2''' saattag'ı}} {{PLURAL:$1|aqırg'ı o'zgeris bar|aqırg'ı '''$1''' o'zgeris bar}}.",
-       "wlshowlast": "Aqırg'ı $1 saat, $2 ku'n,  ko'rset",
        "watchlist-options": "Baqlaw diziminin' sazlawları",
        "watching": "Baqlaw...",
        "unwatching": "Baqlamaw...",
        "imgmultipageprev": "← aldıng'ı bet",
        "imgmultipagenext": "keyingi bet →",
        "imgmultigo": "O'tin'!",
-       "ascending_abbrev": "o's.",
-       "descending_abbrev": "kem.",
        "table_pager_next": "Keyingi bet",
        "table_pager_prev": "Aldıng'ı bet",
        "table_pager_first": "Birinshi bet",
index 3e36652..667f659 100644 (file)
        "wlheader-enotif": "Talɣut s email yessermed.",
        "wlheader-showupdated": "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s uḍris '''aberbuz'''.",
        "wlnote": "Ddaw-a{{PLURAL:$1|ad twaliḍ abeddel aneggaru yettwagen|ad twaliḍ <strong>$1</strong> n ibeddilen ineggura yettwagen}} deg {{PLURAL:$2| usrag aneggaru|di <strong>$2</strong> n yisragen ineggura}}, arama d $3, $4.",
-       "wlshowlast": "Sken wid n $1 n isragen ineggura, wid n $2 n wussan ineggura",
        "watchlist-hide": "Ffer",
        "watchlist-submit": "Sken",
        "wlshowhideliu": "Iseqdacen yettwajerden",
        "img-lang-default": "(tutlayt s lexṣas)",
        "img-lang-info": "Beqqeḍ tugna agi s $1 $2.",
        "img-lang-go": "Ruḥ",
-       "ascending_abbrev": "asawen",
-       "descending_abbrev": "akessar",
        "table_pager_next": "Asebtar ameḍfir",
        "table_pager_prev": "Asebtar ssabeq",
        "table_pager_first": "Asebtar amezwaru",
index 42529d4..a291572 100644 (file)
        "watchthispage": "НапэкӀуэцӀым кӀэлъыплъын",
        "unwatch": "КӀэлъымыплъын",
        "watchlist-details": "Уи щӀэлъыплъыгъуэ тхылъым $1 {{PLURAL:$1|напэкӀуэцӀ|напэкӀуэцӀу}}, напэкӀуэцӀ тепсэлъыхьыгъуэхэр хэмыту",
-       "wlshowlast": "Гъэлъэгъуэн кӀуа $1 сэхьэтым $2 махуэ",
        "watchlist-options": "ЩӀэлъыплъыгъуэхэм я тхылъ зэгъэзэхуэгъуэ",
        "watching": "СызыкӀэлъыплъ тхылъым хэлъхьэн...",
        "unwatching": "СызыкӀэлъыплъ тхылъым хэхын",
index 5517de8..736037e 100644 (file)
        "watchthispage": "ھیہ صفحو تان نظرا لاکھے",
        "unwatch": "زیرنظرمنسوخ",
        "watchlist-details": "تہ زیرِنظرفہرستا {{PLURAL:$1|$1 صفحہ شیر|$1 صفحات شینی}}، ھیارا تبادلۂ خیالو صفحاتن تعداد شامل نیکی.",
-       "wlshowlast": "پشاوے آخری $1 گھنٹو $2 آنوسو",
        "watchlist-options": "واچ لسٹ آپشن",
        "watching": "زیر نظر",
        "unwatching": "منسوخ",
index 6750cd3..32ed1c2 100644 (file)
        "watchthispage": "Na pele de şêr ke",
        "unwatch": "Şêr meke",
        "watchlist-details": "Pelunê hurênaişi ra qêri {{PLURAL:$1|$1 pele lista şêrkerdişi dera|$1 peli lista şêrkerdişi derê}}.",
-       "wlshowlast": "$1 saetunê $2 rozunê peyênu bıasne",
        "watchlist-options": "Alternatifê lista şêrkerdene",
        "watching": "Şêr ke…",
        "unwatching": "Şêr meke…",
index b442193..452d028 100644 (file)
        "watchlist-details": "ၮ်ုခိုဝ်ယောဝ်ႋစ်ုရင့်ဖိုင် (အင်းကုံဆ်ုခၠါင် လိက်မေံၜၠါ်သယ်လ်ုဖး){{PLURAL:$1|လိက်မေံၜၠါ် $1 ၮါင်း|လိက်မေံၜၠါ် $1 ၮါင်းသယ်လ်ုဖး}} အှ်ဆေဝ်ႋလှ်။",
        "wlheader-showupdated": "ၮ်ု အ်ုလါင်းခါင့်ထုက်ယောဝ်ႋဖှ်ေၯံင် အင်းလယ်သာလ်ုအ်ှ လိက်မေံသယ်လ်ုဖး <strong>လ်ုလိက်ဖၠုံးသုဲ့</strong> ၮ်ှ ၮဲဖှ်ေထဆေဝ်ႋလှ်",
        "wlnote": "အ်ုဖံင့်လာ့သယ်ယိုဝ် $3၊ $4 အ်ုထံင် လါင်းခါင့် {{PLURAL:$2|နာႋဍီ|<strong>$2</strong> နာႋဍီ}}အ်ုဝှါန် {{PLURAL:$1|လါင်းခါင့်ဆ်ုအင်းလယ် လ်ုၮါင်း|လါင်းခါင့်ဆ်ုအင်းလယ် လ်ုၮါင်းလ်ုဖး <strong>$1</strong> ခု}} မွာဲဆေဝ်ႋလှ်။",
-       "wlshowlast": "လါင်ခါင့်ထုက် $1 နာႋဍီ $2 သင့်  အိုဝ်မ်ုၮဲ",
        "watchlist-options": "ခီုဝ်ယောဝ်ႋစ်ုရင့်သယ်ၯင်း လုဲႋၮေဝ်ထလ်ုဖး",
        "enotif_reset": "လိက်မေံၜၠါ်လုက်ဆိင့် ယောဝ်ႋၯံင်ဆ်ုပ်ုယှောဝ်ႋ မ်ုမါၮါင်း",
        "deletepage": "မ်ုထုဂ်ဆိင့်လိက်‌မေံၜၠါ်",
index 8facdda..70219d9 100644 (file)
        "wlheader-enotif": "ەسكەرتۋ حات جىبەرۋى قوسىلعان.",
        "wlheader-showupdated": "سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى وزگەرتىلگەن بەتتەردى '''جۋان''' قارىپىمەن كورسەت",
        "wlnote": "تومەندە سوڭعى {{PLURAL:$2|ساعاتتا|'''$2''' ساعاتتا}} بولعان, {{PLURAL:$1|جۋىقتاعى وزگەرىس|جۋىقتاعى '''$1''' وزگەرىس}} كورسەتىلەدى.",
-       "wlshowlast": "سوڭعى $1 ساعاتتاعى, $2 كۇندەگى,  بولعان وزگەرىستى كورسەتۋ",
        "watching": "باقىلاۋدا…",
        "unwatching": "باقىلاماۋدا…",
        "enotif_reset": "بارلىق بەت كەلىپ-كەتىلدى دەپ بەلگىلە",
        "imgmultipagenext": "كەلەسى بەتكە →",
        "imgmultigo": "ٴوت!",
        "imgmultigoto": "$1 بەتىنە ٴوتۋ",
-       "ascending_abbrev": "ٴوسۋ",
-       "descending_abbrev": "كەمۋ",
        "table_pager_next": "كەلەسى بەتكە",
        "table_pager_prev": "الدىڭعى بەتكە",
        "table_pager_first": "العاشقى بەتكە",
index 3fca531..8c3da99 100644 (file)
        "wlheader-enotif": "Ескерту хат жіберуі қосылған.",
        "wlheader-showupdated": "Соңғы келіп-кетуіңізден бері өзгертілген беттер '''жуан''' қаріпімен көрсетіледі.",
        "wlnote": "Төменде $3, $4 кезіне дейінгі соңғы {{PLURAL:$2|сағатта|<strong>$2</strong>  сағатта}} болған, {{PLURAL:$1|жуықтағы өзгеріс|жуықтағы <strong>$1</strong>  өзгеріс}} көрсетіледі.",
-       "wlshowlast": "Соңғы $1 сағаттағы, $2 күндегіні көрсету",
        "watchlist-hide": "Жасыру",
        "watchlist-submit": "Көрсету",
        "wlshowtime": "Соңғысын көрсету:",
        "img-lang-default": "(әдепкі тіл)",
        "img-lang-info": "$1.$2 тілінде көрсету",
        "img-lang-go": "Өту",
-       "ascending_abbrev": "өсу",
-       "descending_abbrev": "кему",
        "table_pager_next": "Келесі бетке",
        "table_pager_prev": "Алдыңғы бетке",
        "table_pager_first": "Алғашқы бетке",
index 5247ab1..0eb2352 100644 (file)
        "wlheader-enotif": "Eskertw xat jiberwi qosılğan.",
        "wlheader-showupdated": "Soñğı kelip-ketwiñizden beri özgertilgen betterdi '''jwan''' qaripimen körset",
        "wlnote": "Tömende soñğı {{PLURAL:$2|sağatta|'''$2''' sağatta}} bolğan, {{PLURAL:$1|jwıqtağı özgeris|jwıqtağı '''$1''' özgeris}} körsetiledi.",
-       "wlshowlast": "Soñğı $1 sağattağı, $2 kündegi,  bolğan özgeristi körsetw",
        "watching": "Baqılawda…",
        "unwatching": "Baqılamawda…",
        "enotif_reset": "Barlıq bet kelip-ketildi dep belgile",
        "imgmultipagenext": "kelesi betke →",
        "imgmultigo": "Öt!",
        "imgmultigoto": "$1 betine ötw",
-       "ascending_abbrev": "ösw",
-       "descending_abbrev": "kemw",
        "table_pager_next": "Kelesi betke",
        "table_pager_prev": "Aldıñğı betke",
        "table_pager_first": "Alğaşqı betke",
index 603b2a8..eae59c7 100644 (file)
        "wlheader-enotif": "បើកប្រើការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល។",
        "wlheader-showupdated": "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''។",
        "wlnote": "ខាងក្រោមនេះ {{PLURAL:$1|ជាបន្លាស់ប្ដូរចុងក្រោយ|ជាបន្លាស់ប្ដូរចុងក្រោយចំនួន <strong>$1</strong>}} នៅក្នុងរយៈពេល{{PLURAL:$2|១ម៉ោង|<strong>$2</strong> ម៉ោង}} គិតចាប់ពីម៉ោង $4 ថ្ងៃ $3។",
-       "wlshowlast": "បង្ហាញ $1ម៉ោងចុងក្រោយ $2ថ្ងៃចុងក្រោយ",
        "watchlist-hide": "លាក់",
        "watchlist-submit": "បង្ហាញ",
        "watchlist-options": "ជម្រើសនានាក្នុងបញ្ជីតាមដាន",
        "img-lang-default": "(ភាសាតាមលំនាំដើម)",
        "img-lang-info": "បង្ហាញរូបភាពនេះជា$1។ $2",
        "img-lang-go": "ទៅ",
-       "ascending_abbrev": "លំដាប់ឡើង",
-       "descending_abbrev": "លំដាប់ចុះ",
        "table_pager_next": "ទំព័របន្ទាប់",
        "table_pager_prev": "ទំព័រមុន",
        "table_pager_first": "ទំព័រដំបូង",
index d0b0c11..fbdb05a 100644 (file)
        "watchlist-details": "ಚರ್ಚೆ ಪುಟಗಳನ್ನು ಹೊರತುಪಡಿಸಿ, ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ {{PLURAL:$1|$1 ಪುಟ ಇದೆ|$1 ಪುಟಗಳು ಇವೆ}}.",
        "wlheader-enotif": "ಮಿಂಚಂಚೆ ಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.",
        "wlheader-showupdated": "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
-       "wlshowlast": "ಕೊನೆಯ $1 ಗಂಟೆ $2 ದಿನಗಳು  ಅನ್ನು ತೋರಿಸು",
        "watchlist-options": "ವೀಕ್ಷಣಾಪಟ್ಟಿ ಆಯ್ಕೆಗಳು",
        "watching": "ವೀಕ್ಷಣೆಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...",
        "unwatching": "ವೀಕ್ಷಣೆಯಿಂದ ತೆಗೆಯಲಾಗುತ್ತಿದೆ...",
        "imgmultipageprev": "← ಹಿಂದಿನ ಪುಟ",
        "imgmultipagenext": "ಮುಂದಿನ ಪುಟ →",
        "imgmultigo": "ಹೋಗು!",
-       "ascending_abbrev": "ಏರು",
-       "descending_abbrev": "ಇಳಿ",
        "table_pager_next": "ಮುಂದಿನ ಪುಟ",
        "table_pager_prev": "ಹಿಂದಿನ ಪುಟ",
        "table_pager_first": "ಮೊದಲ ಪುಟ",
index 6350ef0..9b74f8e 100644 (file)
        "wlheader-enotif": "이메일 알림 기능이 활성화되었습니다.",
        "wlheader-showupdated": "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보입니다.",
        "wlnote": "$3 $4 기준으로, 아래에 최근 {{PLURAL:$2|한 시간|<strong>$2</strong>시간}} 동안 {{PLURAL:$1|마지막 바뀜이|마지막 바뀜 <strong>$1</strong>개가}} 있습니다.",
-       "wlshowlast": "최근 $1시간 $2일 동안의 바뀜 보기",
        "watchlist-hide": "숨기기",
        "watchlist-submit": "보기",
        "wlshowtime": "표시할 기간:",
        "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n양식을 다시 제출해 주십시오.",
        "changecontentmodel": "문서의 콘텐츠 모델을 변경",
        "changecontentmodel-legend": "콘텐츠 모델 변경",
-       "changecontentmodel-title-label": "문서 제목",
+       "changecontentmodel-title-label": "문서 제목:",
        "changecontentmodel-current-label": "현재의 콘텐츠 모델:",
-       "changecontentmodel-model-label": "새 콘텐츠 모델",
+       "changecontentmodel-model-label": "새 콘텐츠 모델:",
        "changecontentmodel-reason-label": "이유:",
        "changecontentmodel-submit": "바꾸기",
        "changecontentmodel-success-title": "콘텐츠 모델이 변경되었습니다",
        "img-lang-default": "(기본 언어)",
        "img-lang-info": "이 그림을 $1로 렌더합니다. $2",
        "img-lang-go": "보기",
-       "ascending_abbrev": "오름차순",
-       "descending_abbrev": "내림차순",
        "table_pager_next": "다음 문서",
        "table_pager_prev": "이전 문서",
        "table_pager_first": "처음 문서",
index 186b7da..8bcc1d0 100644 (file)
        "wlheader-enotif": "E-mail бла хапар бериу джандырылыбды.",
        "wlheader-showupdated": "Ахыр кириуюгюзден сора бетни тюрлениулери '''къалын''' джазыу бла кёргюзюлгенди.",
        "wlnote": "Тюбюндеди кёргюзюлгенди: ахыр '''$2''' сагъатха этилген ахыр '''$1''' тюрлениу, $3 $4 заманнга дери.",
-       "wlshowlast": "Арт $1 сагъат $2 кюннге  кёргюз",
        "watchlist-options": "Кёзде тургъан тизмени джарашдырыулары",
        "watching": "Кёзде тургъан тизмеге къошуу...",
        "unwatching": "Кёзде тургъан тизмеден кетериу...",
        "img-lang-default": "(тынгылау бла тил)",
        "img-lang-info": "Бу суратны $1 тилде кёргюз. $2",
        "img-lang-go": "Хайыр­ландыр",
-       "ascending_abbrev": "гитчеден уллугъа",
-       "descending_abbrev": "азалгъан",
        "table_pager_next": "Эндиги бет",
        "table_pager_prev": "Аллындагъы бет",
        "table_pager_first": "Биринчи бет",
index 6492caa..d44431b 100644 (file)
        "wlheader-enotif": "Et <i lang=\"en\">e-mail</i> Schecke es enjeschalt.",
        "wlheader-showupdated": "Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin di Sigge <strong>extra markeet</strong>.",
        "wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
-       "wlshowlast": "Zeisch de läzde $1 Schtunde, $2 Dähsch aan.",
        "watchlist-hide": "Verschtisch",
        "watchlist-submit": "Aanzeije!",
        "wlshowtime": "De Aandeijl vun e Zigg zom Aanzeije:",
        "img-lang-default": "(Schtandatt_Schprohch)",
        "img-lang-info": "Zeisch heh dat Beld aan en $1. $2",
        "img-lang-go": "Lohß Jonn!",
-       "ascending_abbrev": "opwääts zoteet",
-       "descending_abbrev": "raffkaz zoteet",
        "table_pager_next": "De nächste Sigg",
        "table_pager_prev": "De vörijje Sigg",
        "table_pager_first": "De eetste Sigg",
index 45e3c79..b6fcb4d 100644 (file)
        "wlheader-enotif": "Agahdariya e-nameyan hate çalakkirin",
        "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi <strong>nivîsa stûr</strong> tê xuyakirin.",
        "wlnote": "Ji $3, $4 heta niha {{PLURAL:$1|guherandinê|<strong>$1</strong> guherandinên}} dawî yê {{PLURAL:$2|saetê|<strong>$2</strong> saetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
-       "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan nîşan bide",
        "watchlist-hide": "Veşêre",
        "watchlist-submit": "Nîşan bide",
        "wlshowhideminor": "guherandinên biçûk",
index 129d193..8ab6117 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 сагьифа}} сени тергев тизменгде (пикирлешив сагьифаланы санап).",
        "wlheader-showupdated": "Сени ахырынчы геливюнгден сонг алышынгъан сагьифалар <strong>къалын</strong> шрифт булан гёрсетилген.",
        "wlnote": "Тюбюндеги — {{PLURAL:$1|ахырынчы тюзлевюдюр|<strong>$1</strong> ахырынчы тюзлевлеридир}} алдагъы {{PLURAL:$2|сагьат аралыкъда|<strong>$2</strong> сагьат аралыкъда}} этилген, $3, $4 тархындан.",
-       "wlshowlast": "Артдагъы $1 сагьат $2 гюннюкин гёрсетмек",
        "watchlist-options": "Тергев тизмени кюйлевлери",
        "enotif_reset": "Бары да сагьифаланы къаралгъандай белгилемек",
        "dellogpage": "Тайдырыв гюнделиги",
index 8887fa4..e18937f 100644 (file)
        "watchlist-details": "Yma {{PLURAL:$1|$1 folen}} war agas rol wolya, marnas folennow keskows.",
        "wlheader-showupdated": "Yn '''tew''' y tiskwedhir folennow re beu chanjyes a-dhia agas vysytyans diwettha.",
        "wlnote": "A-woles yma an {{PLURAL:$1|chanj diwettha|'''$1''' chanj diwettha}} y'n {{PLURAL:$2|our|'''$2''' our}} diwettha, a-dhia $3, $4.",
-       "wlshowlast": "Diskwedhes an $1 our $2 dydh diwettha",
        "watchlist-hide": "Kudha",
        "watchlist-options": "Etholyow an rol wolya",
        "watching": "Ow kolya...",
index 502706b..de4b5e7 100644 (file)
        "watch": "Көзөмөлдөө",
        "unwatch": "Көзөмөлдөбөө",
        "watchlist-details": "Талкуу барактарын эсепке албаганда көзөмөл тизмеңизде {{PLURAL:$1|$1 барак|$1 барак}} бар.",
-       "wlshowlast": "Соңку $1 саат $2 күн  көрсөтүү.",
        "watchlist-options": "Көзөмөл тизменин ырастоолору",
        "created": "түзүлдү",
        "changed": "өзгөртүлдү",
        "imgmultipagenext": "кийинки барак →",
        "imgmultigo": "Өтүү!",
        "imgmultigoto": "$1 барагына өтүү",
-       "ascending_abbrev": "өсүү",
-       "descending_abbrev": "кемүү",
        "table_pager_next": "Кийинки барак",
        "table_pager_prev": "Мурунку барак",
        "table_pager_first": "Биринчи барак",
index 794d299..9f7a062 100644 (file)
        "wlheader-enotif": "Mutationes si quae factae erunt, electronice tibi nuntiabuntur.",
        "wlheader-showupdated": "Paginae nondum a te inspectae <strong>typis crassioribus</strong> ostenduntur.",
        "wlnote": "{{PLURAL:$1|Indicatur mutatio novissima|Indicantur '''$1''' mutationes novissimae}} abhinc {{PLURAL:$2|superiorem horam|superiores '''$2''' horas}} (ab $3, $4) factae.",
-       "wlshowlast": "Monstrare proximas $1 horas $2 dies",
        "watchlist-hide": "Supprimere recensiones",
        "watchlist-submit": "Ostendere",
        "wlshowtime": "Index respiciat:",
        "imgmultipagenext": "pagina proxima →",
        "imgmultigo": "I!",
        "imgmultigoto": "Ire ad paginam $1",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Pagina proxima",
        "table_pager_prev": "Pagina superior",
        "table_pager_first": "Prima pagina",
index 191c75b..df56a40 100644 (file)
        "watchthispage": "Cudia esta hoja",
        "unwatch": "dexa de cudiar",
        "watchlist-details": "{{PLURAL:$1|$1 hoja|$1 hojas}} en tu lista de escogidas, sin contar las de la diskussión.",
-       "wlshowlast": "Ver los trocamientos de las últimas $1 oras, $2 días",
        "watchlist-options": "Opciones de la lista de escogidas",
        "watching": "Cudiando...",
        "unwatching": "Dexando de cudiar...",
index 30650bb..33ffaa8 100644 (file)
        "nocreate-loggedin": "Dir hutt keng Berechtigung fir nei Säiten unzeleeën.",
        "sectioneditnotsupported-title": "Ännere vum Abschnitt gëtt net ënnerstëtzt",
        "sectioneditnotsupported-text": "D'Ännere vun Abschnitte gëtt op dëser Ännerungssäit net ënnerstëtzt.",
+       "modeleditnotsupported-title": "Ännere gëtt net ënnerstëtzt",
        "permissionserrors": "Net genuch Rechter",
        "permissionserrorstext": "Dir hutt net genuch Rechter fir déi Aktioun auszeféieren. {{PLURAL:$1|Grond|Grënn}}:",
        "permissionserrorstext-withaction": "Dir sidd, aus {{PLURAL:$1|folgendem Grond|folgende Grënn}}, net berechtegt $2 :",
        "wlheader-enotif": "E-Mail-Notifikatioun ass ageschalt.",
        "wlheader-showupdated": "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
        "wlnote": "Hei {{PLURAL:$1|ass déi lescht Ännerung|sinn déi lescht <strong>$1</strong> Ännerunge}} vun {{PLURAL:$2|der leschter Stonn|de leschte(n) <strong>$2</strong> Stonnen}}, Stand: $3 ëm $4 Auer.",
-       "wlshowlast": "Déi lescht $1 Stonnen $2 Deeg weisen",
        "watchlist-hide": "Verstoppen",
        "watchlist-submit": "Weisen",
        "wlshowtime": "Zäitraum dee gewise gëtt:",
        "sessionfailure": "Et schéngt e Problem mat Ärer Sessioun ze ginn;\nDës Aktioun gouf aus Sécherheetsgrënn ofgebrach, fir ze verhënneren datt Är Sessioun piratéiert ka ginn.\nSchéckt de Formulaire w.e.g. nach eng Kéier.",
        "changecontentmodel": "De Modell vum Inhalt vun enger Säit änneren",
        "changecontentmodel-legend": "Modell vun enger Säit mat Inhalt änneren",
-       "changecontentmodel-title-label": "Titel vun der Säit",
-       "changecontentmodel-model-label": "Neie Modell vun enger Säit mat Inhalt",
+       "changecontentmodel-title-label": "Titel vun der Säit:",
+       "changecontentmodel-model-label": "Neie Modell vun enger Säit mat Inhalt:",
        "changecontentmodel-reason-label": "Grond:",
        "changecontentmodel-submit": "Änneren",
        "changecontentmodel-success-title": "De Modell vum Inhalt gouf geännert",
        "immobile-target-namespace-iw": "En Interwiki-Link ass kee gëltegt Zil beim Réckele vun enger Säit.",
        "immobile-source-page": "Dës Säit kann net geréckelt ginn.",
        "immobile-target-page": "Kann net op de Bestëmmungs-titel geréckelt ginn.",
+       "movepage-invalid-target-title": "De gefroten Numm ass net valabel.",
        "bad-target-model": "Déi gewënschten Zilsäit benotzt en anere Modell fir den Inhalt. Et kann net vun $1 op $2 ëmgewandelt ginn.",
        "imagenocrossnamespace": "Fichiere kënnen net an aner Nummraim geréckelt ginn",
        "nonfile-cannot-move-to-file": "\"Keng Fichiere\" kënnen net an den {{ns:file}}-Nummraum geréckelt ginn",
        "img-lang-default": "(Standard-Sprooch)",
        "img-lang-info": "Dëst Bild op $1 renderen. $2",
        "img-lang-go": "Lass",
-       "ascending_abbrev": "erop",
-       "descending_abbrev": "erof",
        "table_pager_next": "Nächst Säit",
        "table_pager_prev": "Vireg Säit",
        "table_pager_first": "Éischt Säit",
index 60b950d..1aa45fa 100644 (file)
        "watchthispage": "Гелкъуьн и хъувун",
        "unwatch": "Вилив хуьмир",
        "watchlist-details": "Куь вилив хуьнин сиягьда {{PLURAL:$1|1=$1 ччин|$1 ччин}} авайди я, веревирдрин ччинар квачиз.",
-       "wlshowlast": "Эхиримжи $1 сят $2 югъ  къалура",
        "watchlist-options": "Вилив хуьнин сиягьдин низамарунар",
        "watching": "Килигун...",
        "unwatching": "Амма клигнай",
index da695ba..65ade14 100644 (file)
        "wlheader-enotif": "Avisas par eposta es comutada.",
        "wlheader-showupdated": "Pajes cual on ia cambia pos tua visita la plu resente apare en leteras <strong>spesa</strong>.",
        "wlnote": "A su es la {{PLURAL:$1|cambia|<strong>$1</strong> cambias}} en la {{PLURAL:$2|ora|<strong>$2</strong> oras}} la plu resente, a $3, $4.",
-       "wlshowlast": "Mostra la $1 oras e $2 dias presedente",
        "watchlist-hide": "Asconde",
        "watchlist-submit": "Mostra",
        "wlshowtime": "Periodo de tempo mostrada:",
        "img-lang-default": "(lingua inisial)",
        "img-lang-info": "Render esta imaje en $1. $2",
        "img-lang-go": "Vade",
-       "ascending_abbrev": "asen",
-       "descending_abbrev": "desen",
        "table_pager_next": "Paje seguente",
        "table_pager_prev": "Paje presedente",
        "table_pager_first": "Paje prima",
index 92d89c0..8ac21e3 100644 (file)
        "watchthispage": "Goberera olupapula luno",
        "unwatch": "Lekerawo okugoberera olupapula luno",
        "watchlist-details": "Olina {{PLURAL:$1|olupapula $1|empapula $1}} z'ogoberera, nga tobalideko n'eza yogera-nange.",
-       "wlshowlast": "Ndaga ez'omu ssaawa $1 n'ennaku $2 eziyise oba",
        "watchlist-options": "Enteetakeeka y'endaga ya mpapula zengoberera",
        "watching": "Kikolebwako...",
        "unwatching": "Kikolebwako...",
index d87c358..70cd91e 100644 (file)
        "wlheader-enotif": "E-mailberichte zint aangezat.",
        "wlheader-showupdated": "Pazjena's die verangerd zeen saers doe ze veur 't lètste bekeeks sjtaon '''vet'''",
        "wlnote": "Hieónger {{PLURAL:$1|steit de lètste verangering|staon de lètste <strong>$1</strong> verangeringe}} van {{PLURAL:$2|'t lètste oer|de lètste <strong>$2</strong> oer}} óp $3 óm $4.",
-       "wlshowlast": "Tuin lètste $1 oere $2 daag",
        "watchlist-hide": "Versjtaek",
        "watchlist-submit": "Tuine",
        "wlshowtime": "Te tuinen tied:",
        "img-lang-default": "(standerdspraok)",
        "img-lang-info": "Gaef dit plaetje waor in de spraok $1. $2",
        "img-lang-go": "Gank",
-       "ascending_abbrev": "opl.",
-       "descending_abbrev": "aaf.",
        "table_pager_next": "Volgende pazjena",
        "table_pager_prev": "Veurige pazjena",
        "table_pager_first": "Ierste pazjena",
index 70a5bb6..6115d5a 100644 (file)
        "wlheader-enotif": "A notiffica via email a l'è attiva.",
        "wlheader-showupdated": "E paggine che son stæte modificæ doppo l'urtima vixita son evidençiæ in '''grascetto'''.",
        "wlnote": "De sotta {{PLURAL:$1|a l'è elencâ a modifica ciù reçente apportâ|son elencæ e <strong>$1</strong> modifiche ciù reçente apportæ}} {{PLURAL:$2|inte l'urtima oa|inti urtime <strong>$2</strong> oe}}; i dæti son aggiornæ a-e $4 do $3.",
-       "wlshowlast": "Mostra i urtime $1 oe $2 giorni",
        "watchlist-hide": "Ascondi",
        "watchlist-submit": "Mostra",
        "wlshowtime": "Periodo de tempo da vixualizzâ:",
        "img-lang-default": "(lengua predefinia)",
        "img-lang-info": "Converti questa immaggine in $1. $2",
        "img-lang-go": "Vanni",
-       "ascending_abbrev": "cresc",
-       "descending_abbrev": "decresc",
        "table_pager_next": "Pàgina sucesîva",
        "table_pager_prev": "Pagina de primma",
        "table_pager_first": "Primma pagina",
index d0aac4e..945626d 100644 (file)
        "watchthispage": "Vaņ iļ siedā līedpūoltõ",
        "unwatch": "Lopta iļ-vaņtlimi",
        "watchlist-details": " {{PLURAL:$1|$1 lēḑ|$1 līedtõ}} ātõ iļ-vaņtlimiz nimkēras,  bäz luggõmõt nõvpidāmiz-līedidi.",
-       "wlshowlast": "Nägţ perīzt $1 stuņdõ $2 päuvõ",
        "watchlist-hide": "↓Vaŗț",
        "watchlist-options": "Iļ-vaņtlimiz nimkēra pie-lēmizt",
        "watching": "Vaņtlimi iļ sīe...",
index 1f1c592..d0b7d94 100644 (file)
        "wlheader-enotif": "ایمیل‌های اعلان فعال است.",
        "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
        "wlnote": "در زیر {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که در {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
-       "wlshowlast": "نمایش آخرین $1 ساعت $2 روز",
        "watchlist-hide": "ئآشاردن-پنهان کردن",
        "watchlist-submit": "نیشان دائن",
        "wlshowtime": "دوره زمانی نمایش:",
        "img-lang-default": "(زوون پئش فرض)",
        "img-lang-info": "ارائه این تصویر در  $1 .  $2",
        "img-lang-go": "بِچۆ",
-       "ascending_abbrev": "ورِ بِڵِنگی/صعودی",
-       "descending_abbrev": "ورِ هووار/نزولی",
        "table_pager_next": "وەڵگە تِر(هەنی)",
        "table_pager_prev": "وەڵگە دؤماێن",
        "table_pager_first": "وةڵگة أؤةڵئن",
index 223494e..42e8957 100644 (file)
        "unwatch": "Tegn pü d'ögg",
        "unwatchthispage": "Desmèt de tègner d'öcc",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginn}} tegnüü sot ögg, fö che i paginn de discüssión.",
-       "wlshowlast": "Fa vidé i ültim $1 ur $2 dì",
        "watchlist-options": "Upzión lista d'ussevazión",
        "watching": "Giuntà ai pagin da ten d'ögg...",
        "unwatching": "Eliminà dai pagin da ten d'ögg...",
index 048e958..bb300a7 100644 (file)
        "watchthispage": "ຕິດຕາມໜ້ານີ້",
        "unwatch": "ເຊົາຕິດຕາມ",
        "wlheader-showupdated": "ບັນດາ ໜ້າ ທີ່ມີການປ່ຽນແປງ ຫຼັງຈາກທີ່ທ່ານ ເຂົ້າຊົມຫຼ້າສຸດ ຈະຖືກສະແດງເປັນ ໂຕໜັງສື  '''ເຂັ້ມ'''",
-       "wlshowlast": "ສະແດງ $1 ຊົ່ວໂມງຫຼ້າສຸດ $2 ມື້ຫຼ້າສຸດ",
        "watching": "ພວມຕິດຕາມ...",
        "unwatching": "ພວມເຊົາຕິດຕາມ...",
        "enotif_lastvisited": "ເບິ່ງ $1 ເພື່ອ ທຸກໆການປ່ຽນແປງ ຕັ້ງແຕ່ເທື່ອສຸດທ້າຍ ທີ່ ທ່ານເຂົ້າຫາ.",
index 5a0cd59..9bfc84d 100644 (file)
        "unwatchthispage": "Ngambu kentezi",
        "notanarticle": "Ni di petulo infomelo",
        "watchlist-details": "{{PLURAL:$1|$1 petulo|$1 petulo}} sa kentezi e no bulelezi.",
-       "wlshowlast": "Kamukile lapu-lila $1 holani $2 dia",
        "watching": "Kentezi...",
        "unwatching": "Dikentezi...",
        "enotif_impersonal_salutation": "{{SITENAME}} sebelu",
        "imgmultipageprev": "← kona petulo",
        "imgmultipagenext": "lila petulo →",
        "imgmultigo": "Afi!",
-       "ascending_abbrev": "asendin",
-       "descending_abbrev": "disendin",
        "table_pager_next": "Lila petulo",
        "table_pager_prev": "Kona petulo",
        "table_pager_limit": "Kamukile $1 hits di petulo",
index 516696e..3aa19f4 100644 (file)
        "wlheader-enotif": "ڤارئسیاری أنجومانامە کونئشتکار بییە.",
        "wlheader-showupdated": "بٱلگٱیایی کاٛ د آخری گلٛؽ کاْ شما ساٛیلٛشو کردؽتٱ د <strong>تۊپور</strong>نشوݩ داٛئٱ بۊئٱن",
        "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتؽ}} کاْ د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعٱت}} دماتر ٱنجوم بیٱ هؽسش، ڤیرگار آخری ڤاجۊری ٱنجوم بیٱ هؽسش، ڤیرگار آخری ڤاجۊری: $3، $4",
-       "wlshowlast": "آخری$1 ساعٱتؽا $2ۉ رۊزؽا نشوݩ باٛیٱ",
        "wlshowtime": "نئشوٙ دأئن د آخأر",
        "wlshowhideminor": "ڤیرایئشتیا فئرە کوچئک",
        "wlshowhidebots": "بوتیا",
        "img-lang-default": "(زون پیش زمینه)",
        "img-lang-info": "اوردن ای عسگ د $1 .  $2",
        "img-lang-go": "رو",
-       "ascending_abbrev": "ری وه وارو",
-       "descending_abbrev": "ری وه هاری",
        "table_pager_next": "بلگه نهایی",
        "table_pager_prev": "بلگه دمايی",
        "table_pager_first": "سرآسونه",
index e8aabae..d5dd594 100644 (file)
        "wlheader-enotif": "El. pašto pranešimai yra įjungti.",
        "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra <strong>paryškinti</strong>.",
        "wlnote": "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.",
-       "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų",
        "watchlist-hide": "Slėpti",
        "watchlist-submit": "Rodyti",
        "wlshowtime": "Laiko trukmė, kurią rodyti:",
        "img-lang-default": "(numatytoji kalba)",
        "img-lang-info": "Rodyti šį vaizdą $1 kalba. $2",
        "img-lang-go": "Eiti",
-       "ascending_abbrev": "didėjanti tvarka",
-       "descending_abbrev": "mažėjanti tvarka",
        "table_pager_next": "Kitas puslapis",
        "table_pager_prev": "Ankstesnis puslapis",
        "table_pager_first": "Pirmas puslapis",
index b0eb488..3d492d5 100644 (file)
        "watchthispage": "Puorraudzeit itū lopu",
        "unwatch": "Vairs napuorraudzeit",
        "watchlist-details": "(Tu puorraug $1 {{PLURAL:$1|lopu|lopys}}, naskaitūt sarunu lopys.)",
-       "wlshowlast": "Paruodeit izmainis pādejūs $1 stuņžu laikā voi $2 dīnu laikā, voi ari",
        "watchlist-options": "Puorraugamū rokstu saroksta īspiejis",
        "watching": "Davīnoj puorraudzeišonai...",
        "unwatching": "Atslādz puorraudzeišonu...",
index 80c3f96..ca6a195 100644 (file)
        "watchlist-details": "I ralvèn zing aţanga {{PLURAL:$1| phêk $1 |phêk $1}}, sawihona phêk chhiar lohvin.",
        "wlheader-enotif": "*E-lehkha inhriattirna tihnun a ni.",
        "wlheader-showupdated": "I tlawh hnuhnun ber hnua tihdanglam phêk te chu a '''thau'''va tihlan a ni.",
-       "wlshowlast": "Darkar $1 kalta-a tihdanglam tilang rawh , ni $2 kalta-a tihdanglam tilang rawh,  tilang rawh",
        "watchlist-options": "Ralvèn duhdàn",
        "enotif_reset": "Phêk zawng zawng tlawh tawh vek angin chhinchhiah rawh.",
        "enotif_impersonal_salutation": "{{SITENAME}} hmangtu",
        "confirm-unwatch-button": "Aw le",
        "imgmultigo": "Khai le!",
        "imgmultigoto": "Phêk $1-ah kal rawh",
-       "ascending_abbrev": "<<",
-       "descending_abbrev": ">>",
        "table_pager_next": "Phêk dawt",
        "table_pager_prev": "Phêk hmasa",
        "table_pager_first": "Phêk hmasa ber",
index 8a37844..373ba26 100644 (file)
@@ -6,7 +6,8 @@
                        "Mjbmr",
                        "Hosseinblue",
                        "MtDu",
-                       "Shahriar dehghani"
+                       "Shahriar dehghani",
+                       "Shahriar.dehghani24"
                ]
        },
        "tog-underline": "لینکیا خط وه دومن",
        "filehist-dimensions": "ابعاد",
        "filehist-comment": "توٙضیح",
        "imagelinks": "ئیستفادھ د فایل",
-       "linkstoimage": "دوٙمین الذکر {{PLURAL:$1|لینکل بألگە|$1 لینک بألگل}} بە ئی فایل:",
+       "linkstoimage": "{{PLURAL:$1|صفحهٔ|صفحَلِ}} زِر و ای عکس پیوند دارہ :",
        "nolinkstoimage": "بألگە یلی کە ڤە ئی فایل لینک دائنە نی.",
        "sharedupload-desc-here": "ئی فایل ز $1 ئوٙمائە ڤ شاید د پۉرۉجە یل دیە مورد ئیستفادھ ڤابین.\nتوٙضیحتل ری [$2 بألگە تۉضیح فایل] دوٙمین نیشۉ ڤابیە .",
        "upload-disallowed-here": "ئیشا نیتأریت ئی فایلنە بینڤیسیت",
index 8dab9c2..820de6c 100644 (file)
        "wlheader-enotif": "E-pasta paziņojumi ir ieslēgti.",
        "wlheader-showupdated": "Lapas, kas ir tikušas izmainītas, kopš pēdējoreiz skatījies tās, tiek rādītas <strong>trekninātā</strong> rakstā.",
        "wlnote": "Zemāk {{PLURAL:$1|redzamas <strong>$1</strong> izmaiņas|redzama <strong>$1</strong> izmaiņa|redzamas <strong>$1</strong> izmaiņas}} {{PLURAL:$2|pēdējās <strong>$2</strong> stundās|pēdējā <strong>$2</strong> stundā|pēdējās <strong>$2</strong> stundās}} uz $3 $4.",
-       "wlshowlast": "Rādīt pēdējās $1 stundas $2 dienas",
        "watchlist-hide": "Slēpt",
        "watchlist-submit": "Rādīt",
        "wlshowhideminor": "maznozīmīgos labojumus",
        "imgmultigoto": "Iet uz lapu $1",
        "img-lang-default": "(noklusējuma valoda)",
        "img-lang-go": "Aiziet",
-       "ascending_abbrev": "pieaug.",
-       "descending_abbrev": "dilst.",
        "table_pager_next": "Nākamā lapa",
        "table_pager_prev": "Iepriekšējā lapa",
        "table_pager_first": "Pirmā lapa",
index aba1c2e..5924ed2 100644 (file)
        "wlheader-enotif": "*准報信。",
        "wlheader-showupdated": "*易者'''粗體'''。",
        "wlnote": "近<b>$2</b>時有$1者易。",
-       "wlshowlast": "凡最近$1小時、$2日所更易皆示之",
        "watchlist-options": "哨項",
        "watching": "出陣…",
        "unwatching": "收兵…",
        "imgmultipagenext": "次頁→",
        "imgmultigo": "往",
        "imgmultigoto": "往頁$1",
-       "ascending_abbrev": "升冪",
-       "descending_abbrev": "降冪",
        "table_pager_next": "次頁",
        "table_pager_prev": "前頁",
        "table_pager_first": "首頁",
index ab528d1..5326de6 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 butʼkʼa|$1 butʼkʼa}}, skani gotxozu listʼes ren, ama oğarğaluşi butʼkʼapes va ren",
        "wlheader-showupdated": "Sayfaları son ziyaretinizden beri değişen sayfalar '''kalın''' gösterilmiştir.",
        "wlnote": "$3 saat $4 itibariyle son {{PLURAL:$2|bir saatte|'''$2''' saatte}} yapılan {{PLURAL:$1|son değişiklik|son '''$1''' değişiklik}} aşağıdadır.",
-       "wlshowlast": "Son $1 saati $2 ndğa göster",
        "watchlist-options": "Gotxozu listʼeşi tercihepe",
        "watching": "i3ʼkʼedinen...",
        "unwatching": "var i3ʼkʼedinen...",
index cb62773..6670969 100644 (file)
        "wlheader-enotif": "ई-पत्र सूचना लागू अछि।",
        "wlheader-showupdated": "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
        "wlnote": "नीचाँ {{PLURAL:$1|is the last change|are the last '''$1''' changes}} अन्तिम {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।",
-       "wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन",
        "watchlist-hide": "नुकाबी",
        "watchlist-submit": "देखाबी",
        "wlshowtime": "समय श्रेणी देखाबी:",
        "img-lang-default": "(डिफल्ट भाषा)",
        "img-lang-info": "ई चित्र को $1. $2 में ढालु",
        "img-lang-go": "जाए",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "जानकारी",
        "table_pager_next": "अगला पृष्ठ",
        "table_pager_prev": "पहिलुका पृष्ठ",
        "table_pager_first": "पहिल पृष्ठ",
index 0b74714..e91de7e 100644 (file)
        "watch": "Pantau",
        "unwatch": "Batalna pantauan",
        "watchlist-details": "Ana {{PLURAL:$1|$1 kaca|$1 kaca}} nang daftar pangawasané Rika, ora klebu kaca-kaca dhiskusiné.",
-       "wlshowlast": "Tidokna $1 jam $2 dina  pungkasan",
        "watchlist-options": "Opsi daftar pangawasan",
        "delete-confirm": "Busek \"$1\"",
        "delete-legend": "Busek",
index 15e03d0..bf50721 100644 (file)
        "wlheader-enotif": "Электрононь сёрма вельде пачфнема нолдаф тевс.",
        "wlheader-showupdated": "Лопат конань полафтозь тонь мекольце сувсемадот меле няфтевсть '''эчке тяшкса'''.",
        "wlnote": "Ала {{PLURAL:$1|мекольце полафнема|'''$1''' мекольце полафнемат}} ётай {{PLURAL:$2| ойста (часста)|'''$2''' ойста (часста)}}.",
-       "wlshowlast": "Няфтемс мекольце $1 ойхть (част) $2 шит",
        "watchlist-options": "Мельгеваномать латцемасна",
        "watching": "Ванома...",
        "unwatching": "Аф ванома...",
        "imgmultipagenext": "сай лопась →",
        "imgmultigo": "Аре!",
        "imgmultigoto": "Архт $1 лопас",
-       "ascending_abbrev": "касом.",
-       "descending_abbrev": "тум.",
        "table_pager_next": "Сай лопа",
        "table_pager_prev": "Сядынгольдень лопа",
        "table_pager_first": "Васенце лопа",
index 4a6e743..a29d435 100644 (file)
        "wlheader-enotif": "Alefa ny fampilazana amin'ny mailaka.",
        "wlheader-showupdated": "Aseho '''sorabaventy''' ny pejy niova taorian'ny famangianao azy farany.",
        "wlnote": "Eo ambany dia ahitana ny {{PLURAL:$1|fiovana farany indrindra|ny fiovana ''$1'' farany}} natao tanatin'ny adin'ny {{PLURAL:$2|iray|'''$2'''}}, nanomboka ny $3, $4.",
-       "wlshowlast": "Haneho ny $1 ora farany, ny $2 andro farany na",
        "watchlist-hide": "Afenina",
        "watchlist-submit": "Aseho",
        "wlshowtime": "Vanim-potoana aseho:",
        "img-lang-default": "(fiteny tsipalotra)",
        "img-lang-info": "Haneho ity sary ity ho $1. $2",
        "img-lang-go": "Alefa",
-       "ascending_abbrev": "mihak.",
-       "descending_abbrev": "mihid.",
        "table_pager_next": "Pejy manaraka",
        "table_pager_prev": "Pejy nialoha",
        "table_pager_first": "Pejy voalohany",
index 13fd547..24e70de 100644 (file)
        "unwatch": "Эскерыман огыл",
        "unwatchthispage": "Эскерымым чараш",
        "watchlist-details": "Эскерымаш лӱмерыштет $1 {{PLURAL:$1|лаштык}}, каҥашымаш лаштык-влакым шотлыде",
-       "wlshowlast": "Пытартыш $1 шагат $2 кечылан  ончыкташ",
        "wlshowhidecategorization": "лаштык категоризацийым",
        "watchlist-options": "Эскерыме лӱмерын келыштарымаш",
        "watching": "Эскерымаш лӱмерыш ешарымаш...",
index 8210436..12f69f0 100644 (file)
                        "NoiX180"
                ]
        },
-       "tog-underline": "Garisbawahi tautan:",
+       "tog-underline": "Garih bawah pautan:",
        "tog-hideminor": "Suruakkan suntiangan ketek di parubahan baru",
        "tog-hidepatrolled": "Suruakkan suntiangan nan lah dipatroli di parubahan tabaru",
        "tog-newpageshidepatrolled": "Suruakkan laman nan lah dipatroli dari daftar laman baru",
        "tog-hidecategorization": "Suruakkan pangkategorian laman",
        "tog-extendwatchlist": "Kambangan daftar pantau untuak mancaliak kasado parubahan, bukan nan baru se",
-       "tog-usenewrc": "Kalompokkan suntiangan di tampilan parubahan paliang baru jo daftar pantauan badasarkan halaman",
+       "tog-usenewrc": "Kalompokkan badasarkan laman pado parubahan paliang baru jo daftar pantauan",
        "tog-numberheadings": "Agiah nomor judul sacaro otomatih",
        "tog-editondblclick": "Suntiang laman jo klik duo kali (paralu JavaScript)",
-       "tog-editsectiononrightclick": "Aktifkan bagian panyuntiangan dengan caro mangklik kanan pado judul bagian",
-       "tog-watchcreations": "Tambahan laman nan den buek jo gambar nan den unggah ka daftar pantau",
-       "tog-watchdefault": "Tambahan laman jo gambar nan den suntiang ka daftar pantau",
-       "tog-watchmoves": "Tambahan laman jo gambar nan den pindah ka daftar pantau",
+       "tog-editsectiononrightclick": "Aktipan bagian panyuntiangan jo mangklik kanan pado judul bagian",
+       "tog-watchcreations": "Tambahan laman nan den buek jo berkas nan den unggah ka daftar pantau",
+       "tog-watchdefault": "Tambahan laman jo berkas nan den suntiang ka daftar pantau",
+       "tog-watchmoves": "Tambahan laman jo berkas nan den pindah ka daftar pantau",
        "tog-watchdeletion": "Tambahan laman jo gambar nan den hapuih ka daftar pantau",
        "tog-watchuploads": "Tambahan bakeh baru nan ambo unggah ka daftar pantauan",
-       "tog-watchrollback": "Tambahan halaman nan pernah ambo baliakan ke dalam daftar pantauan ambo",
+       "tog-watchrollback": "Tambahan laman nan pernah ambo baliakan ka dalam daftar pantauan ambo",
        "tog-minordefault": "Tandoi kasado suntiangan sabagai suntiangan ketek sacaro baku",
-       "tog-previewontop": "Tunjuakan pratonton sabalun kotak suntiang",
-       "tog-previewonfirst": "Tunjuakan pratonton pado suntiangan patamo",
-       "tog-enotifwatchlistpages": "Kiriman surel, kok laman atau gambar pado daftar pantau Ambo barubah",
+       "tog-previewontop": "Caliak pratinjau sabalun kotak suntiang",
+       "tog-previewonfirst": "Caliak pratinjau pado suntiangan patamo",
+       "tog-enotifwatchlistpages": "Kiriman surel bilo laman atau berkas pado daftar pantau Ambo barubah",
        "tog-enotifusertalkpages": "Kiriman surel, koq laman maota Ambo barubah",
-       "tog-enotifminoredits": "Kirimkan surel juo untuk saketek suntingan pado laman jo gambar",
+       "tog-enotifminoredits": "Kiriman surel untuak suntiangan ketek dari laman jo berkas",
        "tog-enotifrevealaddr": "Tunjuakan alamaik surel ambo pado pambaritauan surel",
        "tog-shownumberswatching": "Tunjuakan jumlah pamantau",
        "tog-oldsig": "Tando tangan kini:",
-       "tog-fancysig": "Jadikan tando tangan manjadi teks wiki (indak jo tautan otomatis)",
-       "tog-uselivepreview": "Gunoan pratonton langsuang",
+       "tog-fancysig": "Jadikan tando tangan manjadi teks wiki (indak jo pautan otomatih)",
+       "tog-uselivepreview": "Gunoan pratinjau langsuang",
        "tog-forceeditsummary": "Ingekan ambo bilo kotak ikhtisar suntiangan kosong",
        "tog-watchlisthideown": "Suruakan suntiangan surang pado daftar pantau",
        "tog-watchlisthidebots": "Suruakan suntiangan bot pado daftar pantau",
@@ -62,7 +62,7 @@
        "tog-diffonly": "Jan tampilan isi laman di bawah pabedoan suntiangan",
        "tog-showhiddencats": "Tunjuakan kategori tasuruak",
        "tog-norollbackdiff": "Jan tampilan pabedoan sasudah malakukan pangambalian",
-       "tog-useeditwarning": "Ingekan denai kok denai maninggakan laman suntiang sabalun manyimpan parubahan",
+       "tog-useeditwarning": "Ingekan denai jikok maninggakan laman suntiang sabalun manyimpan parubahan",
        "tog-prefershttps": "Selalu gunokan koneksi aman katiko masuak log",
        "underline-always": "Taruih",
        "underline-never": "Indak pernah",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Laman nan diindeks",
        "noindex-category": "Laman nan indak diindeks",
-       "broken-file-category": "Laman jo gamba rusak",
+       "broken-file-category": "Laman jo berkas rusak",
        "about": "Perihal",
        "article": "Artikel",
        "newwindow": "(bukak di jandela baru)",
-       "cancel": "Batalkan",
+       "cancel": "Batalan",
        "moredotdotdot": "Lainnyo...",
        "morenotlisted": "Daftar ko mungkin indak langkok.",
        "mypage": "Laman",
        "databaseerror": "Kasalahan basis data",
        "databaseerror-function": "Fungsi: $1",
        "databaseerror-error": "تېروتنه: $1",
-       "transaction-duration-limit-exceeded": "Untuak mancagah panundoan replikasi yang tinggi, pangiriman ko dibatalan karano lamo panulihan $1 malabiahi bateh $2.\nJiko sanak nio maubah banyak hal dalam sakali ubah, cubo lakuan dalam operasi yang labiah ketek.",
+       "transaction-duration-limit-exceeded": "Untuak mancagah panundoan replikasi nan tinggi, pangiriman ko dibatalan karano lamo panulihan $1 malabiahi bateh $2.\nJiko sanak nio maubah banyak hal dalam sakali ubah, cubo lakuan dalam operasi nan labiah ketek.",
        "laggedslavemode": "Paringatan: Laman mungkin indak barisi parubahan tabaru.",
        "readonly": "Basis data dikunci",
        "enterlockreason": "Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka",
        "missing-article": "Basisdata indak dapek manamukan teks dari laman nan saharuihnyo ado, yaitu \"$1\" $2.\n\nHal ko biasonyo disababkan dek pautan usang ka pabaikkan tadahulu laman nan alah dihapuih.\n\nJikok bukan ko panyababnyo, Sanak mungkin alah manamukan sabuah bug dalam pakakeh lunak.\nSilakan laporkan hal iko ka [[Special:ListUsers/sysop|pangurus]], sarato manyabuikkan alamaik URL nan dituju.",
        "missingarticle-rev": "(revisi#: $1)",
        "missingarticle-diff": "(Bedo: $1, $2)",
-       "readonly_lag": "Basis data alah dikunci otomatis salagi basis data sakunder malakukan sinkronisasi jo basis data utamo",
+       "readonly_lag": "Basis data alah dikunci otomatih sangkek basis data sakunder malakukan sinkronisasi jo basis data utamo",
        "nonwrite-api-promise-error": "Kapalo HTTP 'Promise-Non-Write-API-Action' alah dikirim tapi permintaan dibuek untuak model panulihan API.",
        "internalerror": "Kasalahan internal",
        "internalerror_info": "Kasalahan internal: $1",
        "internalerror-fatal-exception": "Pangacualian fatal dalam mangetik \"$1\"",
        "filecopyerror": "Indak dapek manyalin berkas \"$1\" ke \"$2\".",
        "filerenameerror": "Indak dapek maubah namo berkas \"$1\" manjadi \"$2\".",
-       "filedeleteerror": "Indak dapek mahapuih berkas \"$1\".",
+       "filedeleteerror": "Indak dapek mangapuih berkas \"$1\".",
        "directorycreateerror": "Indak dapek mambuek direktori \"$1\".",
        "directoryreadonlyerror": "Direktori \"$1\" hanyo-dibaco.",
        "directorynotreadableerror": "Direktori \"$1\" indak bisa dibaco.",
        "delete-hook-aborted": "Pengapusan batal jo hook.\nIndak ado keterangan.",
        "badtitle": "Judul indak sah",
        "badtitletext": "Pamintaan judul laman indak sah, kosong, atau antarbaso atau antarwiki nan salah sambuang. Mungkin juo ado kandungan karakter nan indak buliah digunoan untuak judul.",
-       "title-invalid-empty": "Judul halaman yang dimintak kosong atau hanyo barisi namo sabuah ruang namo.",
-       "title-invalid-utf8": "Judul halaman yang dimintak barisi rangkaian UTF-8 yang indak sah.",
-       "title-invalid-interwiki": "Judul laman yang dimintak barisi pranala diantaro wiki yang indak bisa digunoan dalam judul.",
-       "title-invalid-talk-namespace": "Judul laman yang dimintak marujuak ka halaman pambicaroan yang indak dapek tasadio.",
-       "title-invalid-characters": "Judul laman yang dimintak barisi karakter yang indak sah:\"$1\".",
-       "title-invalid-relative": "Judul manganduang alaman relatif. Halaman relatif (./, ../) indak sah, karano dapek mangalami kagagalan katiko ditangani dek paramban pangguno.",
-       "title-invalid-magic-tilde": "Judul halaman manganduang rangkaian tilda yang indak sah (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Judul halaman panjang bana. Harusnyo indak buliah labiah dari $1 {{PLURAL:$1|byte|bytes}} di pangodean UTF-8.",
-       "title-invalid-leading-colon": "Judul laman yang dimintak dimulai dek tando titiak duo tu indak sah.",
+       "title-invalid-empty": "Judul laman nan dimintak kosong atau hanyo barisi namo sabuah ruang namo.",
+       "title-invalid-utf8": "Judul laman nan dimintak barisi rangkaian UTF-8 nan indak sah.",
+       "title-invalid-interwiki": "Judul laman nan dimintak barisi pautan di antaro wiki nan indak bisa digunoan dalam judul.",
+       "title-invalid-talk-namespace": "Judul laman nan dimintak marujuak ka laman pambicaroan nan indak tasadio.",
+       "title-invalid-characters": "Judul laman nan dimintak barisi karakter nan indak sah:\"$1\".",
+       "title-invalid-relative": "Judul manganduang laman relatif. Laman relatif (./, ../) indak sah, karano dapek mangalami kagagalan samaso ditangani dek paramban pangguno.",
+       "title-invalid-magic-tilde": "Judul laman manganduang rangkaian tilda nan indak sah (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Judul laman panjang bana. Harusnyo indak buliah labiah dari $1 {{PLURAL:$1|bita}} di pangodean UTF-8.",
+       "title-invalid-leading-colon": "Judul laman nan dimintak dimulai dek tando titiak duo tu indak sah.",
        "perfcached": "Data barikuik ko diambiak dari singgahan dan mungkin indak data nan baru. Nan tabanyak dari {{PLURAL:$1|$1 hasilnyo}} ado di singgahan.",
        "perfcachedts": "Data barikuik ko singgahan, dan tarakhia dipabarui tanggal $1. Nan tabanyak dari tanggal {{PLURAL:$1|$1}}, hasilnyo ado di singgahan.",
        "querypage-no-updates": "Pamutakhiran dari laman ko sadang dimatian. Data nan ado di siko kini ko indak akan dimuaik ulang.",
        "viewyourtext": "Sanak dapek mancaliak jo manyalin sumber <strong>suntiangan sanak</strong> pado laman ko",
        "protectedinterface": "Laman ko baisi teks antarmuko untuak digunoan dek parangkaik lunak di wiki ko sajo, dan alah dikunci untuak maindaan kasalahan. \nUntuak manambah atau maubah tajamahan di kasado wiki, harap gunoan [https://translatewiki.net/ translatewiki.net], yaitu proyek palokalan MediaWiki.",
        "editinginterface": "'''Paringatan:''' Sanak manyuntiang laman nan digunoan untuak manyadiokan teks antarmuko untuak parangkaik lunak.\nParubahan teks ko akan mampangaruhi tampilan pado antarmuko pangguno untuak pangguno lain.\nUntuak tajamahan, harap gunoan [https://translatewiki.net/wiki/Main_Page?setlang=min translatewiki.net], proyek palokalan MediaWiki.",
-       "translateinterface": "Untuak manambah atau maubah sadolah wiki, mohon gunoan [https://translatewiki.net/ translatewiki.net], proyek palokalan MediaWiki.",
-       "cascadeprotected": "Laman ko dilinduangi dari panyuntiangan karano ditransklusi pado {{PLURAL:$1|halaman nan}} dilinduangi dan opsi \"runtun\"-nyo diiduikan:\n$2",
+       "translateinterface": "Untuak manambah atau maubah kasado wiki, mohon gunoan [https://translatewiki.net/ translatewiki.net], proyek palokalan MediaWiki.",
+       "cascadeprotected": "Laman ko dilinduangi dari panyuntiangan karano ditransklusi pado {{PLURAL:$1|laman nan}} dilinduangi dan opsi \"runtun\"-nyo diiduikan:\n$2",
        "namespaceprotected": "Sanak indak mampunyoi hak akses untuak manyuntiang laman di ruang namo '''$1'''.",
        "customcssprotected": "Sanak indak mampunyoi izin untuak maubah laman CSS iko, karano manganduang pangaturan pribadi pangguno lain.",
        "customjsonprotected": "Sanak indak mampunyoi izin untuak maubah laman JSON ko karano barisi pangaturan pribadi pangguno lain.",
        "customjsprotected": "Sanak ndak mampunyo izin untuak maubah laman JavaScript iko, karano manganduang pangaturan pribadi pangguno lain.",
-       "sitecssprotected": "Sanak indak mampunyoi izin untuak maubah halaman CSS ko karano bisa mampangaruhi sadolah pangunjuang.",
-       "sitejsonprotected": "Sanak indak mampunyoi izin untuak maubah halaman JSON ko karano mampangaruhi sadolah pangunjuang.",
-       "sitejsprotected": "Sanak indak mampunyoi izin untuak maubah halaman JavaScript karano mampangaruhi sadolah pangunjuang.",
-       "mycustomcssprotected": "Sanak indak mampunyoi izin untuak maubah halaman CSS ko.",
-       "mycustomjsonprotected": "Sanak indak mampunyoi izin untuak manyuntiang halaman JSON ko.",
-       "mycustomjsprotected": "Sanak indak mampunyoi izin untuak manyuntiang halaman JavaScript ko.",
+       "sitecssprotected": "Sanak indak mampunyoi izin untuak maubah laman CSS ko karano bisa mampangaruhi kasado pangunjuang.",
+       "sitejsonprotected": "Sanak indak mampunyoi izin untuak maubah laman JSON ko karano mampangaruhi kasado pangunjuang.",
+       "sitejsprotected": "Sanak indak mampunyoi izin untuak maubah laman JavaScript karano mampangaruhi kasado pangunjuang.",
+       "mycustomcssprotected": "Sanak indak mampunyoi izin untuak maubah laman CSS ko.",
+       "mycustomjsonprotected": "Sanak indak mampunyoi izin untuak manyuntiang laman JSON ko.",
+       "mycustomjsprotected": "Sanak indak mampunyoi izin untuak manyuntiang laman JavaScript ko.",
        "myprivateinfoprotected": "Sanak indak mampunyoi izin untuak manyuntiang informasi pribadi Sanak.",
        "mypreferencesprotected": "Sanak indak mampunyoi izin untuak manyuntiang preferensi Sanak.",
        "ns-specialprotected": "Laman istimewa indak dapek disuntiang.",
        "invalidtitle-unknownnamespace": "Judul nan tak sah jo nomor ruang namo indak diketahui $1 dan teks \"$2\"",
        "exception-nologin": "Indak masuak log",
        "exception-nologin-text": "Untuak masuak ka dalam laman atau maambiak tindakan ko, mohon masuak log.",
-       "exception-nologin-text-manual": "Silakan $1 untuak mangakses halaman atau tindakan ko.",
+       "exception-nologin-text-manual": "Silakan $1 untuak mangakses laman atau tindakan ko.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus indak dikenal: ''$1''",
        "virus-scanfailed": "Pamindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus indak dikenal:",
        "userlogin-helplink2": "Bantuan masuak log",
        "userlogin-loggedin": "Sanak alah masuak sabagai {{GENDER:$1|$1}}. Gunoan formulir di bawah untuak masuak sabagai pangguno lain.",
        "userlogin-reauth": "Sanak harus masuak baliak untuk mambuktian Sanak adolah {{GENDER:$1|$1}}.",
-       "userlogin-createanother": "Buek akun yang lain",
+       "userlogin-createanother": "Buek akun nan lain",
        "createacct-emailrequired": "Alamaik surel",
        "createacct-emailoptional": "Alamaik surel (opsional)",
        "createacct-email-ph": "Masuakan alamaik surel Sanak",
        "nocookiesnew": "Akun pangguno alah dibuek, tapi Sanak alun masuak log.\n{{SITENAME}} manggunokan cookies untuak log pangguno.\nPangaturan cookie Sanak nonaktif.\nAktifan dulu, sasudah tu baru masuak log jo namo pangguno dan kato sandi baru Sanak.",
        "nocookieslogin": "{{SITENAME}} manggunokan cookies untuak log pangguno.\nPangaturan cookie paramban Sanak nonaktif.\nAktifan dulu dan cubo baliak.",
        "nocookiesfornew": "Akun pangguno indak dibuek karano kami indak dapek mamastian sumbernyo.\nPastian Sanak alah mangaktifan cokies, lalu muek ulang laman ko dan cubo baliak.",
-       "createacct-loginerror": "Akun alah salasai dibuek tapi Sanak indak dapek langsuang masuak sacaro otomatis. Mohon taruihan ka [[Special:UserLogin|manual login]].",
+       "createacct-loginerror": "Akun alah salasai dibuek tapi Sanak alun dapek langsuang masuak sacaro otomatih. Mohon manuju ka [[Special:UserLogin|manual login]].",
        "noname": "Namo pangguno nan Sanak masuakan indak sah.",
        "loginsuccesstitle": "Alah masuak log",
        "loginsuccess": "'''Sanak kini lah masuak log di {{SITENAME}} sabagai \"$1\".'''",
        "wrongpasswordempty": "Sanak indak mamasuakan kato sandi. Cubolah baliak.",
        "passwordtooshort": "Kato sandi paliang indak harus tadiri dari {{PLURAL:$1|$1 karakter}}.",
        "passwordtoolong": "Kato sandi indak buliah labiah dari {{PLURAL:$1|1 character|$1 characters}}.",
-       "passwordtoopopular": "Kato sandi yang umum indak dapek digunoan. Mohon piliah kato sandi yang labiah sulik untuak ditakok.",
-       "passwordinlargeblacklist": "Kato sandi yang dimasuakan adolah kato sandi yang umum. Mohon gunoan kato sandi yang labiah unik.",
+       "passwordtoopopular": "Kato sandi nan umum indak dapek digunoan. Mohon piliah kato sandi nan labiah sulik untuak ditakok.",
+       "passwordinlargeblacklist": "Kato sandi nan dimasuakan adolah kato sandi nan umum. Mohon gunoan kato sandi nan labiah unik.",
        "password-name-match": "Kato sandi Sanak harus babedo dari namo pangguno Sanak.",
        "password-login-forbidden": "Panggunoan namo pangguno dan sandi ko alah dilarang.",
        "mailmypassword": "Atua kato sandi nan baru",
        "passwordremindertitle": "Kato sandi samantaro untuak {{SITENAME}}",
-       "passwordremindertext": "Urang lain (dari alamaik IP $1) mamintak kato sandi nan baru untuak {{SITENAME}} ($4). Kato sandi samantaro untuak pangguno \"$2\" alah dibuek dan diatua untuak \"$3\". Jikok iko kandak Sanak, mohon log masuak dan atua kato sandi nan baru kini. Kato sandi samantaro Sanak akan abih maso dalam wukatu {{PLURAL:$5|satu hari|$5 hari}}.\n\nKok urang lain nan mangajuan permintaan ko, atau kok Sanak taingek jo kato sandi nan lamo sainggo Sanak indak nio maubahnyo, padiakan sajo pasan ko dan taruihlah mamakai kato sandi nan lamo.",
+       "passwordremindertext": "Urang lain (dari alamaik IP $1) mamintak kato sandi nan baru untuak {{SITENAME}} ($4). Kato sandi samantaro untuak pangguno \"$2\" alah dibuek dan diatua untuak \"$3\". Jikok iko kandak Sanak, mohon log masuak dan atua kato sandi nan baru kini. Kato sandi samantaro Sanak akan abih maso dalam wukatu {{PLURAL:$5|$5 hari}}.\n\nKok urang lain nan mangajuan permintaan ko, atau kok Sanak taingek jo kato sandi nan lamo sainggo Sanak indak nio maubahnyo, padiakan sajo pasan ko dan taruihlah mamakai kato sandi nan lamo.",
        "noemail": "Indak ado alamaik surel nan tacatat untuak pangguno \"$1\".",
        "noemailcreate": "Sanak paralu manyadiokan alamaik surel nan sah",
        "passwordsent": "Kato sandi baru alah dikiriman ka alamaik surel nan didaftakan untuak \"$1\".\nSilakan masuak log baliak sasudah manarimo surel tasabuik.",
        "acct_creation_throttle_hit": "Ado pangunjuang wiki nan mamakai alamaik IP sanak ko nan alah mambuek {{PLURAL:$1|1 akun|banyak akun}} dalam $2 taakhia, bateh minimum untuak wakatu ko. Pangujuang nan mamakai alamaik IP ko indak dapek mambuek akun baru samantaro.",
        "emailauthenticated": "Alamaik surel Sanak alah dikonfirmasi pado $3, $2.",
        "emailnotauthenticated": "Alamaik surel Sanak alun dikonfirmasi. Indak ado surel nan bisa dikirim untuak pakakeh ko.",
-       "noemailprefs": "Sanak harus mamasuakan alamaik surel di pangaturan Sanak untuak dapek manggunoan fitur-fitur ko.",
+       "noemailprefs": "Sanak haruih mamasuakan alamaik surel di Pangaturan bia dapek manggunoan fitua-fitua ko.",
        "emailconfirmlink": "Konfirmasi alamaik surel Sanak",
        "invalidemailaddress": "Alamaik surel iko indak dapek ditarimo dek formatnyo indak sasuai.\nHarap masuakan alamaik surel dalam format nan bana atau kosoangan isian tasabuik.",
        "cannotchangeemail": "Alamaik surel Sanak indak bisa diubah di wiki ko.",
        "changepassword-throttled": "Sanak alah acok bana mancubo masuak log. Mohon tunggu $1 sabalun mancubo baliak.",
        "botpasswords": "Kato sandi bot",
        "botpasswords-disabled": "Kato sandi bot indak diaktifan.",
-       "botpasswords-no-central-id": "Untuak manggunoan kato sandi bot, Sanak harus masuak log ka akun yang alah disentralisasi.",
+       "botpasswords-no-central-id": "Untuak manggunoan kato sandi bot, Sanak harus masuak log ka akun nan alah disentralisasi.",
        "botpasswords-existing": "Kato sandi bot tasadio",
-       "botpasswords-createnew": "Buek kato sandi bot yang baru",
-       "botpasswords-editexisting": "Ubah kato sandi bot yang alah ado",
+       "botpasswords-createnew": "Buek kato sandi bot nan baru",
+       "botpasswords-editexisting": "Ubah kato sandi bot nan alah ado",
        "botpasswords-label-needsreset": "(kato sandi paralu di atua ulang)",
        "botpasswords-label-appid": "Namo bot:",
        "botpasswords-label-create": "Buek",
        "botpasswords-deleted-title": "Kato sandi bot dihapuih",
        "botpasswords-deleted-body": "Kato sandi untuak bot \"$1\" dari {{GENDER:$2|user}} \"$2\" berhasil dihapuih.",
        "botpasswords-restriction-failed": "Bateh dalam kato sandi mangahalangi masuak log ko.",
-       "botpasswords-invalid-name": "Namo pangguno yang diaagiah indak manganduang pamisah kato sandi bot (\"$1\").",
+       "botpasswords-invalid-name": "Namo pangguno nan diagiah indak manganduang pamisah kato sandi bot (\"$1\").",
        "botpasswords-not-exist": "Pangguno \"$1\" indak mampunyoi kato sandi bot banamo \"$2\".",
-       "botpasswords-needs-reset": "Kato sandi untuak bot \"$2\" dari {{GENDER:$1|user}} \"$1\" harus di atur ulang.",
+       "botpasswords-needs-reset": "Kato sandi untuak bot \"$2\" dari {{GENDER:$1|user}} \"$1\" harus di atua ulang.",
        "botpasswords-locked": "Sanak indak dapek masuak log jo kato sando bot karano akun Sanak dikunci.",
        "resetpass_forbidden": "Kato sandi indak dapek dituka",
        "resetpass_forbidden-reason": "Kato sandi indak dapek dituka:$1",
        "resetpass-no-info": "Sanak harus masuak log untuak mangakses laman iko sacara langsuang.",
        "resetpass-submit-loggedin": "Tuka kato sandi",
-       "resetpass-submit-cancel": "Batalkan",
+       "resetpass-submit-cancel": "Batalan",
        "resetpass-wrong-oldpass": "Kato sandi samantaro atau nan kini indak sah. Sanak mungkin alah mangganti kato sandi atau mamintak kato sandi samantaro.",
        "resetpass-recycled": "Mohon ubah kato sandi Sanak jo nan lain dari kato sandi kini ko.",
-       "resetpass-temp-emailed": "Sanak masuak log jo kode samantaro yang disurelan. Untuak manyalasaian masuak log, atur ulang kato sandi baru disiko:",
+       "resetpass-temp-emailed": "Sanak masuak log jo kode samantaro nan disurelkan. Untuak manyalasaian masuak log, atua ulang kato sandi baru di siko:",
        "resetpass-temp-password": "Kato sandi samantaro:",
        "resetpass-abort-generic": "Parubahan kato sandi alah dibatalan dek ekstensi.",
-       "resetpass-expired": "Kato sandi sanak alah kadaluarsa. Mohon atur ulang kato sandi baru untuak masuak log.",
+       "resetpass-expired": "Kato sandi sanak alah kadaluarsa. Mohon atua ulang kato sandi baru untuak masuak log.",
        "resetpass-expired-soft": "Kato sandi sanak alah kadaluarsa jo paralu diubah. Mohon piliah kato sandi baru, atau takan \"{{int:authprovider-resetpass-skip-label}}\" untuak maatur ulang di wakatu lain.",
        "resetpass-validity": "Kato sandi Sanak indak sah:$1",
        "resetpass-validity-soft": "Kato sandi sanak indak sah:$1\n\nMohon piliah kato sandi baru, atau takan \"{{int:authprovider-resetpass-skip-label}}\" untuak maubah di wakatu nan lain.",
        "passwordreset-text-one": "Lengkapkan formulir ko untuak manuka baliak kato sandi Sanak.",
        "passwordreset-text-many": "{{PLURAL:$1|Isi salah satu kotak di bawah ko untuak mandapekkan kato sandi samantaro malalui surel.}}",
        "passwordreset-disabled": "Pangubahan kato sandi alah dimatian di wiki iko.",
-       "passwordreset-emaildisabled": "Fitur surel alah dimatian pado wiki iko.",
+       "passwordreset-emaildisabled": "Fitua surel alah dimatian pado wiki ko.",
        "passwordreset-username": "Namo pangguno:",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Alamaik surel:",
        "passwordreset-emailtext-user": "Sasaurang (mungkin Sanak, dari alamaik IP $1) mamintak parubahan kato sandi untuak {{SITENAME}} ($4).\n{{PLURAL:$3|Akun}} barikuik takaik jo alamaik surel ko:\n\n$2\n\n{{PLURAL:$3|Sandi samantaro}} barikuik akan habih masonyo dalam {{PLURAL:$5|$5 ari}}.\nSanak harus masuak dan mamiliah sandi baru. Jikok urang lain mambuek pamintaan ko atau jikok Sanak ingek sandi awal dan indak nio maubahnyo, Sanak dapek mangacuahkan pasan ko dan taruih manggunoan kato sandi lamo.",
        "passwordreset-emailelement": "Namo pangguno: \n$1\n\nSandi samantaro: \n$2",
        "passwordreset-emailsentemail": "Jiko alamaik surel ko bahubuangan jo akun Sanak, surel parubahan kato sandi akan dikirim.",
-       "passwordreset-emailsentusername": "Jiko ado alamaik surel yang bahubuangan jo namo pangguno ko, surel untuak ma atur ulang kato sandi akan dikirim.",
+       "passwordreset-emailsentusername": "Jiko ado alamaik surel nan bahubuangan jo namo pangguno ko, surel untuak mangatua ulang kato sandi akan dikirim.",
        "passwordreset-invalidemail": "Alamaik surel indak sah",
        "passwordreset-nodata": "Namo pangguno ataupun alamai surel indak diaagiahan",
        "changeemail": "Tuka atau hapuih alamaik surel.",
-       "changeemail-header": "Langkoki formulir ko untuak maubah alamaik surel Sanak. Jiko nio mahapuih sadolah alamaik surel yang bahubuangan jo akun Sanak, kosongan alamaik surek katiko maisi formulir.",
+       "changeemail-header": "Langkoki formulir ko untuak maubah alamaik surel Sanak. Jiko nio mangapuih sado alah alamaik surel nan bahubuangan jo akun Sanak, kosongan alamaik surek samaso maisi formulir.",
        "changeemail-no-info": "Sanak harus masuak log untuak mangakses laman ko.",
        "changeemail-oldemail": "Alamat surel kini:",
        "changeemail-newemail": "Alamat surel baru:",
-       "changeemail-newemail-help": "Kolom ko harus dikosongan jiko Sanak nio mahapuih alamaik surel. Sanak indak dapek maatur ulang kato sandi yang talupo jo indak dapek manarimo surel dari wiki ko jiko alamaik surel dihapuih.",
+       "changeemail-newemail-help": "Kolom ko harus dikosongan jiko Sanak nio mangapuih alamaik surel. Sanak indak dapek maatua ulang kato sandi nan talupo jo indak dapek manarimo surel dari wiki ko jiko alamaik surel dihapuih.",
        "changeemail-none": "(indak ado)",
        "changeemail-password": "Sandi {{SITENAME}} Sanak:",
        "changeemail-submit": "Ganti surel.",
        "changeemail-throttled": "Sanak alah acok bana mancubo masuak log. Mohon tunggu $1 sabalun mancubo baliak.",
-       "changeemail-nochange": "Mohon masuakan alamaik surel yang lain.",
+       "changeemail-nochange": "Mohon masuakan alamaik surel nan lain.",
        "resettokens": "Ubah token",
        "resettokens-token-label": "$1 (nilai saat ini:$2)",
        "bold_sample": "Teks taba",
        "bold_tip": "Teks taba",
        "italic_sample": "Teks miriang",
        "italic_tip": "Teks miriang",
-       "link_sample": "Judua pautan",
+       "link_sample": "Judul pautan",
        "link_tip": "Pautan dalam",
-       "extlink_sample": "http://www.anyo-contoh.com judua pautan",
+       "extlink_sample": "http://www.hanyo-contoh.com judul pautan",
        "extlink_tip": "Pautan lua (ingek awalannyo http://)",
        "headline_sample": "Teks judul",
        "headline_tip": "Tingkek 2 judul",
        "watchthis": "Pantau laman ko",
        "savearticle": "Simpan",
        "savechanges": "Simpan parubahan",
-       "publishpage": "Tabikan laman",
-       "publishchanges": "Tabikan parubahan",
+       "publishpage": "Simpan laman",
+       "publishchanges": "Simpan parubahan",
        "savearticle-start": "Simpan laman...",
        "savechanges-start": "Simpan parubahan...",
-       "publishpage-start": "Tabikan laman...",
-       "publishchanges-start": "Tabikan parubahan...",
+       "publishpage-start": "Simpan laman...",
+       "publishchanges-start": "Simpan parubahan...",
        "preview": "Caliak",
-       "showpreview": "Pratonton",
+       "showpreview": "Caliak pratinjau",
        "showdiff": "Parubahan",
-       "blankarticle": "\"{{int:authprovider-resetpass-skip-label}}\"Paringatan:</strong> Laman yang Sanak buek kosong.\nJiko Sanak manakan \"$1\" baliak, laman tu akan dibuek tanpa ado isinyo.",
+       "blankarticle": "<strong>Paringatan:</strong> Laman nan Sanak buek kosong.\nJiko Sanak manakan \"$1\" baliak, laman tu akan dibuek tanpa ado isinyo.",
        "anoneditwarning": "'''Ingek:''' Sanak alun masuak log.\nAlamat IP sanak tacatat pado riwayaik suntiangan laman ko. Kok Sanak <strong>[$1 log in]</strong> atau <strong>[$2 mambuek akun]</strong>, suantiang Sanak ka didistribusian kapado namo pangguno Sanak, sarato baragam kauntuangan lainnyo.",
        "anonpreviewwarning": "''Sanak alun masuak log. Manyimpan laman akan manyababkan alamaik IP Sanak tacatat pado riwayat suntiangan laman iko.''",
-       "missingsummary": "'''Paringatan:''' Sanak indak mamasuakan ringkasan panyuntiangan. Jikok Sanak baliak manakan tombol Simpan, suntiangan Sanak akan disimpan tanpa ringkasan panyuntiangan.",
-       "selfredirect": "<strong>Paringatan:</strong> Sanak mangalihan halaman ko ka halaman samulo. Sanak bisa jadi maagiah tujuan pangalihan yang salah, atau manyuntiang halaman yang salah.\nJiko Sanak manakan \"$1\" baliak, halaman pangaliahan akan dibuek.",
+       "missingsummary": "<strong>Paringatan:</strong> Sanak indak mamasuakan ikhtisar panyuntiangan. Jikok Sanak baliak manakan $1, suntiangan Sanak akan disimpan tanpa ikhtisar.",
+       "selfredirect": "<strong>Paringatan:</strong> Sanak mangaliahan laman ko ka laman samulo. Sanak bisa jadi maagiah tujuan pangaliahan nan salah, atau manyuntiang laman nan salah.\nJiko Sanak manakan \"$1\" baliak, laman pangaliahan akan dibuek.",
        "missingcommenttext": "Masuakan komentar Sanak.",
        "missingcommentheader": "'''Paringatan:''' Sanak alun maagihan subjek atau judul untuak komenta Sanak. Jikok Sanak baliak manakan \"$1\", suntiangan Sanak akan disimpan tanpa komenta tasabuik.",
-       "summary-preview": "Pratonton ringkasan suntiangan:",
-       "subject-preview": "Pratonton subyek:",
-       "previewerrortext": "Ado yang salah wakatu manunjuakan pratayang parubahan Sanak.",
+       "summary-preview": "Pratinjau ikhtisar suntiangan:",
+       "subject-preview": "Pratinjau subyek:",
+       "previewerrortext": "Ado nan salah wakatu manunjuakan pratinjau parubahan Sanak.",
        "blockedtitle": "Pangguno diblokir",
-       "blocked-email-user": "<strong>Namo pangguno Sanak diblokir untuak mangirim surel. Sanak masih bisa manyuntiang halaman lain di wiki ko. </strong> Sanak bisa mancaliak parincian pamblokiran  pado [[Special:MyContributions|account contributions]].\n\nPamblokiran dilakuan dek $1.\n\nAlasannyo adolah <em>$2</em>.\n\n* Diblokir sajak: $8\n* Blokir kadaluarsa pado: $6\n* Sasaran pamblokiran: $7\n* ID pamblokiran #$5",
-       "blockedtext": "'''Namo pangguno atau alamaik IP Sanak alah kanai sakek.'''\n\nSakek dibuek dek $1.\nAlasan nan diagiahan adolah ''$2''.\n\n* Kanai sakek sajak: $8\n* Maso sakek habih pado: $6\n* Sasaran nan disakek: $7\n\nSanak dapek maubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|panguruih lainnyo]] untuak marundiangan hal ko.\n\nSanak indak dapek manggunoan fitur 'Kirim surel ka pangguno ko' kacuali Sanak alah mamasuakan alamaik surel nan sah di [[Special:Preferences|pangaturan akun]] dan Sanak indak sadang disakek untuak manggunoannyo.\n\nAlamaik IP Sanak adolah $3, dan ID panyakek adolah $5.\nTolong saratoan informasi di ateh pado satiok patanyoan nan Sanak buek.",
+       "blocked-email-user": "<strong>Namo pangguno Sanak diblokir untuak mangirim surel. Sanak masih bisa manyuntiang laman lain di wiki ko. </strong> Sanak bisa mancaliak parincian sakek pado [[Special:MyContributions|jariah pangguno]].\n\nSakek dilakuan dek $1.\n\nAlasannyo adolah <em>$2</em>.\n\n* Disakek sajak: $8\n* Sakek kadaluarsa pado: $6\n* Sasaran panyakek: $7\n* ID sakek #$5",
+       "blockedtext": "'''Namo pangguno atau alamaik IP Sanak alah kanai sakek.'''\n\nSakek dibuek dek $1.\nAlasan nan diagiahan adolah ''$2''.\n\n* Kanai sakek sajak: $8\n* Maso sakek habih pado: $6\n* Sasaran nan disakek: $7\n\nSanak dapek maubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|panguruih lainnyo]] untuak marundiangan hal ko.\n\nSanak indak dapek manggunoan fitua 'Kirim surel ka pangguno ko' kacuali Sanak alah mamasuakan alamaik surel nan sah di [[Special:Preferences|pangaturan akun]] dan Sanak indak sadang disakek untuak manggunoannyo.\n\nAlamaik IP Sanak adolah $3, dan ID panyakek adolah $5.\nTolong saratoan informasi di ateh pado satiok patanyoan nan Sanak buek.",
        "autoblockedtext": "Alamaik IP Sanak alah kanai sakek sacaro otomatih dek dipakai jo pangguno lain, nan alah disakek dek $1. Alasannyo dek:\n\n:<em>$2</em>\n\n* Kanai sakek sajak: $8\n* Maso sakek habih pado: $6\n* Sasaran nan disakek: $7\n\nSanak dapek maubuangi $1 atau [[{{MediaWiki:Grouppage-sysop}}|panguruih lainnya]] untuak marundiangan pakaro ko.\n\nSanak indak dapek manggunoan pakakeh \"{{int:emailuser}}\" kacuali Sanak alah mamasuakan alamaik surel nan sah pado [[Special:Preferences|pangaturan akun]] dan Sanak indak sadang disakek untuak manggunoannyo.\n\nAlamaik IP Sanak adolah $3, dan ID panyakekan adolah $5.\nTolong saratoan informasi di ateh pado satiok patanyaan nan Sanak buek.",
        "blockednoreason": "indak ado alasan nan diagiah.",
        "whitelistedittext": "Sanak musti $1 untuak manyuntiang laman.",
        "missing-revision": "Revisi $1 di laman nan banamo \"{{FULLPAGENAME}}\" ko indak ado.\n\nHal iko biasonyo disababkan dek pautan sijarah nan alah kadaluarsa ka laman nan alah diapuih.\nRinciannyo dapek dicaliak di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
        "userpage-userdoesnotexist": "Akun pangguno \"$1\" indak tadaftar.\nCubo pareso jikok nio mambuek/suntiang laman ko.",
        "userpage-userdoesnotexist-view": "Pangguno \"$1\" indak tadaftar.",
-       "blocked-notice-logextract": "Pangguno ko tangah diblokir.\nEntri log pamblokiran tabaru disadioan di bawah ko untuak referensi:",
+       "blocked-notice-logextract": "Pangguno ko tangah disakek.\nEntri log panyakekan tabaru disadioan di bawah ko untuak referensi:",
        "clearyourcache": "<strong>Catatan:</strong> Sasudah manyimpan, Sanak mungkin harus meminteh singgahan paramban Sanak untuak maliek parubahan.\n* <strong>Firefox / Safari:</strong> Tahan <em>Shift</em> sambia mangklik <em>Reload</em>, atau takan <em>Ctrl-F5</em> atau <em>Ctrl-R</em> (<em>⌘-R</em> di Mac)\n* <strong>Google Chrome:</strong> Takan <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> di Mac)\n* <strong>Internet Explorer:</strong> Tahan <em>Ctrl</em> sambia mangklik <em>Refresh</em>, atau takan <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Pai ka <em>Menu → Settings </em> (<em>Opera → Preferences</em> di Mac) lalu ka <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Tips:''' Gunoan tombol \"{{int:showpreview}}\" untuak mauji CSS baharu Sanak sabalun manyimpannyo.",
        "userjsonyoucanpreview": "<strong>Tip:</strong> Gunoan tombol \"{{int:showpreview}}\" untuak mauji JSON baharu Sanak sabalun manyimpannyo.",
        "userjsyoucanpreview": "'''Tips:''' Gunoan tombol \"{{int:showpreview}}\" untuak mauji JS baharu Sanak sabalun manyimpannyo.",
-       "usercsspreview": "'''Ingeklah bahawa Sanak sadang manampilan pratayang dari CSS Sanak.\nPratayang iko alun disimpan!'''",
-       "userjspreview": "'''Ingeklah bahawa nan Sanak liek hanyolah pratayang JavaScript Sanak, dan bahawa pratayang tasabuik alun disimpan!'''",
-       "sitecsspreview": "'''Ingeklah bahawa Sanak hanyo manampilan pratayang dari CSS iko.'''\n'''Parubahan alun disimpan!'''",
-       "sitejsonpreview": "<strong>Ingeklah bahwa Sanak hanyo manampilan pratonton konfigurasi JSON ko. Parubahan alun basimpan!</strong>",
-       "sitejspreview": "<strong>Ingek! Sanak hanyo manampilan pratonton kode JavaScript ko. Parubahan alun basimpan!</strong>",
+       "usercsspreview": "<strong>Ingeklah bahawa Sanak sadang manampilan pratinjau dari CSS Sanak.\nPratinjau ko alun disimpan!</strong>",
+       "userjspreview": "<strong>Ingeklah bahawa nan Sanak liek hanyolah pratinjau JavaScript Sanak, dan pratinjau tasabuik alun disimpan!</strong>",
+       "sitecsspreview": "<strong>Ingeklah Sanak hanyo manampilan pratinjau dari CSS ko. Parubahan alun disimpan!</strong>",
+       "sitejsonpreview": "<strong>Ingeklah bahwa Sanak hanyo manampilan pratinjau konfigurasi JSON ko. Parubahan alun basimpan!</strong>",
+       "sitejspreview": "<strong>Ingek! Sanak hanyo manampilan pratinjau kode JavaScript ko. Parubahan alun basimpan!</strong>",
        "userinvalidconfigtitle": "<strong>Paringatan:</strong> Kulik \"$1\" indak ado. \n\nMohon diingek baso laman .css, .json, jo .js manggunoan huruf ketek; cando {{ns:user}}:Foo/vector.css bukannyo {{ns:user}}:Foo/Vector.css.",
        "updated": "(Dipabaharui)",
        "note": "'''Catatan:'''",
-       "previewnote": "'''Ingek iko hanyo pratonton'''\nParubahan Sanak alun disimpan!",
+       "previewnote": "<strong>Ingek iko hanyo pratinjau.</strong>\nParubahan Sanak alun disimpan!",
        "continue-editing": "Pai ka kotak panyuntiangan",
-       "previewconflict": "Pratayang iko mancaminan teks pado bagian ateh kotak suntiangan teks sabagaimano akan taliek bilo Sanak manyimpannyo.",
+       "previewconflict": "Pratinjau ko mancaminan teks pado bagian ateh kotak suntiangan sabagaimano akan taliek bilo Sanak manyimpannyo.",
        "session_fail_preview": "Maaf, kami indak bisa mamproses suntiangan Sanak dek ilangnyo data sesi. \n\nSanak mungkin lah takalua dari log. <strong>Mohon pastikan baso Sanak masih masuak log. Cubo sajo sakali lai.</strong>.\nKok masih indak bisa, cubo [[Special:UserLogout|kalua]] dan masuak log sakali lai, dan pareso kok panjalajah web sanak mambuliahan panyimpanan ''cookies'' dari laman web ko.",
        "session_fail_preview_html": "Maaf, kami indak bisa mamproses suntiangan sanak dek ilangnyo data sesi. \n\n<em> Dek sebab teks HTML mantah pado {{SITENAME}} alah diaktifkan, pratinjau ko disuruakkan untuak mancagah sarangan JavaScript.</em>\n\n<strong>Kok iko satu pacuboan suntiangan nan sah, mohon cubo liak.</strong>\nKok indak juo bisa, cubo [[Special:UserLogout|kalua log]] dan masuak lai. Pareso kalau panjalajah web Sanak mampabuliahan cookie dari laman ko.",
        "token_suffix_mismatch": "'''Suntiangan Sanak ditolak karano aplikasi klien Sanak maubah karakter tando baco pado suntiangan.'''\nSuntiangan tasabuik ditolak untuak mancegah kasalahan pado teks laman.\nHal iko kadang tajadi jikok Sanak manggunokan layanan proxy anonim babasis web nan bamasalah.",
        "editingold": "'''Paringatan:\nSanak manyuntiang revisi lamo suatu laman.\nJikok Sanak manyimpannyo, parubahan-parubahan nan dibuek sajak revisi ko akan hilang.'''",
        "yourdiff": "Pambedoan",
        "copyrightwarning": "Untuak diingek bahaso apo nan disumbang kapado {{SITENAME}} dianggap lah dilapeh di bawah $2 (caliak $1 untuak langkoknyo).\nJikok awak indak ingin apo nan ditulih tu disuntiang dan disebaran, jan dikirim tulisan tu ka siko.<br />\nAwak musti bajanji juo bahaso iko adolah asia karya awak surang, atau disalin dari sumber miliak basamo atau sumber bebas lainnyo.\n'''Jan dikirim karya bahak cipta nan indak baizin!'''",
-       "copyrightwarning2": "Parhatikan bahawa sadoalah kontribusi terhadap {{SITENAME}} dapek disuntiang, diubah, atau dihapuih oleh panyumbang lainnyo. Jikok Sanak indak ingin tulisan Sanak disuntiang urang lain, jan kiriman ka siko.<br />Sanak jua bajanji bahawa iko adolah hasil karyo Sanak surang, atau disalin dari sumber miliak umum atau sumber bebas nan lain (liek $1 untuak informasi labiah lanjuik). '''JAN KIRIMAN KARYO NAN DILINDUNGI HAK CIPTA TANPA IJIN!'''",
+       "copyrightwarning2": "Parhatikan sadoalah jariah tahadok {{SITENAME}} dapek disuntiang, diubah, atau dihapuih dek panyumbang lainnyo. Jikok Sanak indak ingin tulisan Sanak disuntiang urang lain, jan kiriman ka siko.<br />Sanak juo bajanji iko adolah hasil karya Sanak surang, atau disalin dari sumber miliak umum atau sumber bebas nan lain (liek $1 untuak informasi labiah lanjuik). '''JAN KIRIMAN KARYA NAN DILINDUNGI HAK CIPTA TANPA IJIN!'''",
        "editpage-cannot-use-custom-model": "Model konten ko indak dapek diubah.",
        "longpageerror": "'''Kasalahan: Teks nan Sanak kiriman sagadang {{PLURAL:$1|$1 kilobita}}, barati labiah gadang dari jumlah maksimum {{PLURAL:$2|$2 kilobita}}. Teks indak dapek disimpan.'''",
        "readonlywarning": "<strong>Paringatan: Basis data ko dikunci untuak karajo pambarasiahan. Sanak indak dapek manyimpan suntiangan kini ko.</strong>\nSanak disarankan untuak manyalin jo manyimpan suntiangan sanak ka file teks untuak diunggah kudian.\n\nManuruik panguruih sistem nan mangunci: $1",
        "protectedpagewarning": "'''Paringatan: Laman iko sadang dilinduangi sahinggo hanyo pangguno jo hak akses pangurus nan dapek manyuntiangnyo.'''\nEntri catatan tarakhir disadioan di bawah untuak referensi:",
-       "semiprotectedpagewarning": "<strong>Catatan:</strong> Laman ko alah dilinduangi, hanyo pangguno nan alah takonfirmasi sacaro otomatis nan dapek manyuntiang.\nLog nan paliang akhia:",
+       "semiprotectedpagewarning": "<strong>Catatan:</strong> Laman ko alah dilinduangi, hanyo pangguno nan alah takonfirmasi sacaro otomatih nan dapek manyuntiang.\nLog nan paliang akhia:",
        "cascadeprotectedwarning": "<strong>Paringatan:</strong> Laman ko alah dilinduangi. Hanyo pangguno nan [[Special:ListGroupRights|punyo hak nan tatantu]] buliah untuak manyuntiang, dek karano laman ko ditransklusi pado {{PLURAL:$1|laman nan dilinduangi ko}}:",
        "titleprotectedwarning": "'''Paringatan: Laman iko alah dilinduangi sahinggo diparaluan [[Special:ListGroupRights|hak khusus]] untuak mambueknyo.'''\nEntri catatan tarakhir disadioan di bawah untuak referensi:",
        "templatesused": "{{PLURAL:$1|Templat}} nan digunoan di laman ko:",
-       "templatesusedpreview": "{{PLURAL:$1|Templat}} nan digunoan dalam pratonton ko:",
+       "templatesusedpreview": "{{PLURAL:$1|Templat}} nan digunoan dalam pratinjau ko:",
        "templatesusedsection": "{{PLURAL:$1|Templat}} nan digunoan di bagian ko:",
        "template-protected": "(dilinduangi)",
        "template-semiprotected": "(palinduangan semi)",
        "contentmodelediterror": "Sanak indak dapek manyuntiang revisi ko karano isi model <code>$1</code>, beda dari isi model laman kini <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Ingek: Sanak mambuek ulang suatu laman nan alah dihapuih.'''\n\nArok dipatimbangkan lai rancak malanjuikan suntiangan Sanak.\nBarikuik ko log pangapuihan jo pamindahan dari laman ko:",
        "moveddeleted-notice": "Laman ko alah dihapuih.\nSabagai referensi, barikuik adolah log pangapuihan jo pamindahannyo.",
-       "moveddeleted-notice-recent": "Maaf, halaman ko baru sajo dihapuih (dalam rantang wakatu 24 jam). Log panghapuiah, palinduangan, jo pamindahan halaman tu tasadio di bawah sabagai referensi.",
+       "moveddeleted-notice-recent": "Maaf, laman ko baru sajo dihapuih (dalam rantang wakatu 24 jam). Log panghapuiah, palinduangan, jo pamindahan laman tu tasadio di bawah sabagai referensi.",
        "log-fulllog": "Liek saluruah log",
        "edit-hook-aborted": "Suntiangan dibatalan samo kait parser\ntanpa ado katarangan.",
        "edit-gone-missing": "Indak dapek mampabarui laman.\nMungkin alah dihapuih.",
-       "edit-conflict": "Konflik suntingan.",
+       "edit-conflict": "Konflik panyuntiangan.",
        "edit-no-change": "Suntiangan sanak ditulak, karano indak ado parubahan nan tajadi ka teks.",
        "edit-slots-cannot-add": "{{PLURAL:$1|slot is|slots are}} barikuik indak didukuang disiko: $2.",
        "edit-slots-cannot-remove": "{{PLURAL:$1|slot is|slots are}} wajib dan indak  buliah dihapuih: $2.",
-       "postedit-confirmation-created": "Halaman alah dibuek.",
-       "postedit-confirmation-restored": "Halaman alah dipulihan.",
+       "postedit-confirmation-created": "Laman alah dibuek.",
+       "postedit-confirmation-restored": "Laman alah dipuliahan.",
        "postedit-confirmation-saved": "Suntiangan Sanak alah tasimpan.",
        "postedit-confirmation-published": "Suntiangan Sanak alah ditabikan.",
-       "edit-already-exists": "Indak dapek mambuek aman baru.\nNyo alah ado.",
+       "edit-already-exists": "Indak dapek mambuek laman baru.\nNyo alah ado.",
        "defaultmessagetext": "Teks baku.",
        "content-failed-to-parse": "Gagal manjabarkan konten $2 untuak model $1: $3",
        "invalid-content-data": "Data kanduangan indak valid.",
-       "content-not-allowed-here": "Isi \"$1\" indak diizinkan pado laman [[:$2]] pado slot \"$3\"",
-       "editwarning-warning": "Maninggakan laman ko dapek maakibaikan parubahan nan dibuek hilang. Jikok Sanak lah masuak log, dapek mamatian pasan ko malalui bagian \"Panyuntiangan\" pado laman pangaturan.",
+       "content-not-allowed-here": "Isi \"$1\" indak diizinkan di laman [[:$2]] pado slot \"$3\"",
+       "editwarning-warning": "Maninggakan laman ko dapek maakibaikan parubahan nan dibuek hilang. Jikok Sanak lah masuak log, dapek mamatian pasan ko malalui bagian \"{{int:prefs-editing}}\" pado laman Pangaturan.",
        "slot-name-main": "Utamo",
        "content-model-wikitext": "Teks wiki",
        "content-model-text": "Teks kosong",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objek kosong",
        "content-json-empty-array": "Lariak kosong",
-       "deprecated-self-close-category": "Halaman yang menggunoan tag HTML tatutuik-surang indak sah",
+       "deprecated-self-close-category": "Laman nan menggunoan tag HTML tatutuik-surang indak sah",
        "expensive-parserfunction-warning": "'''Paringatan:''' Laman ko manganduang talalu banyak panggilan fungsi parser.\n\nSeharusnyo kurang dari $2 {{PLURAL:$2|panggilan}}, tapi {{PLURAL:$1|kini ado $1 panggilan}}.",
        "expensive-parserfunction-category": "Laman nan talalu banyak panggilan fungsi parser",
        "post-expand-template-inclusion-warning": "'''Peringatan:''' Ukuran templat talalu gadang.\nBabarapo templat akan diabaikan.",
        "post-expand-template-argument-warning": "Paringatan: Laman ko barisi satidaknyo ciek uraian templat na ukuran ekspansinyo talalu gadang. \nUraian-uraian tu alah diabaikan.",
        "post-expand-template-argument-category": "Laman nan barisi uraian templat nan diabaikan",
        "parser-template-loop-warning": "Hubungan barulang templat tadeteksi: [[$1]]",
-       "template-loop-category": "Halaman dengan templat barulang",
+       "template-loop-category": "Laman jo templat barulang",
        "parser-template-recursion-depth-warning": "Limit kadalaman hubungan barulang templat lah talampau ($1)",
        "language-converter-depth-warning": "Bateh kadalaman pangonversi bahaso lah talampau ($1)",
        "node-count-exceeded-category": "Laman dimano hitungan-node talampaui",
-       "node-count-exceeded-warning": "Laman hitungan-node lah talampau",
+       "node-count-exceeded-warning": "Laman nan labiah jumlah node",
        "expansion-depth-exceeded-category": "Laman dima kadalaman ekspansi lah talampau",
        "expansion-depth-exceeded-warning": "Laman kadalaman ekspansi lah talampau",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "history-feed-description": "Riwayaik revisi laman ko di wiki",
        "history-feed-item-nocomment": "$1 pado $2",
        "history-feed-empty": "Laman nan dicari indak ado.\nMungkin alah dihapuih dari wiki, atau diagiah namo baru.\nCuba [[Special:Search|cari dulu]] untuak laman lain nan relevan.",
-       "rev-deleted-comment": "(ringkasan suntiangan dihapuih)",
+       "rev-deleted-comment": "(ikhtisar suntiangan dihapuih)",
        "rev-deleted-user": "(namo pangguno dihapuih)",
        "rev-deleted-event": "(rincian log dihapuih)",
        "rev-deleted-user-contribs": "[namo pangguno atau alamaik IP dihapuih - suntiangan disuruakan dari daftar jariah]",
        "revdelete-show-file-submit": "Yo",
        "logdelete-selected": "{{PLURAL:$1|Log piliahan}}:",
        "revdelete-confirm": "Tolong konfirmasi baso Sanak samemang bamakasuik malakuan iko, mamahami konsekuensinyo, dan baso Sanak malakuannyo sasuai jo [[{{MediaWiki:Policy-url}}|kabijakan]].",
-       "revdelete-suppress-text": "Panyambunyian revisi '''hanyo''' buliah digunoan untuak kasus-kasus barikuik:\n* Informasi paribadi nan indak patuik\n*: ''alamaik rumah jo nomor telepon, nomor kartu identitas, dll.''",
+       "revdelete-suppress-text": "Panyambunyian revisi <strong>hanyo</strong> buliah digunoan untuak kasus-kasus barikuik:\n* Informasi bapotensi pancemaran namo baiak\n* Informasi paribadi nan indak patuik\n*: <em>alamaik rumah jo nomor telepon, nomor kartu identitas, dll.</em>",
        "revdelete-legend": "Pangaturan bateh",
        "revdelete-hide-text": "Teks revisi",
        "revdelete-hide-image": "Suruakan isi berkas",
        "revdelete-modify-missing": "Gagal maubah parubahan ID $1: parubahan ko indak ado di basis data!",
        "revdelete-no-change": "<strong>Paringatan:</strong>Parubahan tanggal $2, $1 alah punyo aturan panyambunyian.",
        "revdelete-concurrent-change": "Gagal maubah parubahan tanggal $2, $1: statusnyo mungkin alah diubah pangguno lain basamoan jo Sanak.\nCubo pareso catatan log.",
-       "revdelete-only-restricted": "Ado yang salah wakatu manyambunyian item tanggal $2, $1: Sanak indak dapek manyambunyiannyo dari panguruih tanpa mamiliah salah satu opsi panyambunyian lainnyo.",
+       "revdelete-only-restricted": "Ado nan salah wakatu manyambunyian item tanggal $2, $1: Sanak indak dapek manyambunyiannyo dari panguruih tanpa mamiliah salah satu opsi panyambunyian lainnyo.",
        "revdelete-reason-dropdown": "*Alasan pangapuihan umum\n** Palanggaran hak cipta\n** Komentar atau informasi paribadi nan indak patuik\n** Namo pangguno nan indak patuik\n** Bapotensi mancemarkan namo baiak",
        "revdelete-otherreason": "Alasan lain/tambahan:",
        "revdelete-reasonotherlist": "Alasan lain",
        "revdelete-edit-reasonlist": "Alasan mangapuih laman",
        "revdelete-offender": "Pambuek reviri:",
        "suppressionlog": "Log pambanaman",
-       "suppressionlogtext": "Dibawah ko adolah daftar panghapuihan jo pamblokiran, tamasuak isi yang disambunyian dari panguruih.\nCaliak [[Special:BlockList|block list]] untuak daftar yang paliang baru.",
-       "mergehistory": "Riwayaik panggabuangan sajarah halaman",
-       "mergehistory-box": "Gabuang parubahan-parubahan dari duo halaman:",
-       "mergehistory-from": "Halaman sumber:",
-       "mergehistory-into": "Halaman tujuan:",
-       "mergehistory-go": "Tampilan suntiangan yang dapek digabuang",
+       "suppressionlogtext": "Di bawah ko adolah daftar panghapuihan jo panyakekan, tamasuak isi nan disambunyian dari panguruih.\nCaliak [[Special:BlockList|daftar sakek]] untuak daftar nan paliang baru.",
+       "mergehistory": "Gabuangan sijarah laman",
+       "mergehistory-box": "Gabuang parubahan-parubahan dari duo laman:",
+       "mergehistory-from": "Laman sumber:",
+       "mergehistory-into": "Laman tujuan:",
+       "mergehistory-go": "Tampilan suntiangan nan dapek digabuang",
        "mergehistory-submit": "Gabuang revisi",
-       "mergehistory-empty": "Indak ado parubahan yang dapek digabuang.",
+       "mergehistory-empty": "Indak ado parubahan nan dapek digabuang.",
        "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} dari $1 {{PLURAL:$3|was|were}} berhasil digabuangan ka [[:$2]].",
-       "mergehistory-fail": "Indak dapek digabuang, mohon pareso baliak halaman jo parameter waktu.",
-       "mergehistory-fail-invalid-source": "Halaman asal indak sah.",
-       "mergehistory-fail-invalid-dest": "Halaman tujuan indak sah.",
-       "mergehistory-fail-self-merge": "Halaman sumber jo tujuannyo samo.",
+       "mergehistory-fail": "Indak dapek digabuang, mohon pareso baliak laman jo parameter wakatu.",
+       "mergehistory-fail-invalid-source": "Laman asal indak sah.",
+       "mergehistory-fail-invalid-dest": "Laman tujuan indak sah.",
+       "mergehistory-fail-self-merge": "Laman sumber jo tujuannyo samo.",
        "mergehistory-reason": "Alasan:",
        "mergelog": "Log panggabuangan",
        "revertmerge": "Batal gabuang",
        "search-interwiki-more-results": "hasil lainnyo",
        "search-relatedarticle": "Bakaitan",
        "searchrelated": "bakaitan",
-       "searchall": "sado",
+       "searchall": "sadonyo",
        "showingresults": "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
+       "showingresultsinrange": "Manampilkan {{PLURAL:$1|<strong>$1</strong> hasil}} dalam rantang #<strong>$2</strong> sampai #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Hasia <strong>$1</strong> dari <strong>$3</strong>|Hasia <strong>$1 - $2</strong> dari <strong>$3</strong>}}",
        "search-nonefound": "Indak ado hasil nan sasuai jo pamintaan",
        "powersearch-legend": "Pencarian lanjut",
        "prefs-editwatchlist-label": "Suntiang entri daftar pantauan Sanak:",
        "prefs-watchlist-days": "Jumlah hari dalam daftar pantau:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari}}",
-       "prefs-watchlist-edits": "Jumlah suntiangan nan ditunjuakan pado daftar pantau:",
+       "prefs-watchlist-edits": "Jumlah parubahan tabanyak nan ditunjuakan pado daftar pantau:",
        "prefs-watchlist-edits-max": "Nilai maksimum: 1000",
        "prefs-watchlist-token": "Token pantauan:",
        "prefs-misc": "Lain-lain",
        "prefs-resetpass": "Tuka kato sandi",
-       "prefs-changeemail": "Tuka alamaik surel",
+       "prefs-changeemail": "Tuka atau hapuih alamaik surel",
        "prefs-setemail": "Atua alamaik surel",
        "prefs-email": "Piliahan surel",
        "prefs-rendering": "Tampilan",
        "saveprefs": "Simpan",
-       "restoreprefs": "Baliakan ka setelan awal",
+       "restoreprefs": "Baliakan ka setelan awal (kasado bagian)",
        "prefs-editing": "Panyuntiangan",
        "searchresultshead": "Cari",
-       "stub-threshold": "Ambang bateh untuak format <a href=\"#\" class=\"stub\">pautan rancangan</a>:",
+       "stub-threshold": "Ambang bateh untuak format pautan rancangan $1:",
        "stub-threshold-sample-link": "contoh",
        "stub-threshold-disabled": "Nonaktifkan",
        "recentchangesdays": "Jumlah hari nan ditunjuakan di parubahan baru:",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|hari}}",
-       "recentchangescount": "Jumlah suntiangan nan ditunjuakan:",
-       "prefs-help-recentchangescount": "Iko untuak parubahan tabaru, riwayaik laman nan lalu, sarato log.",
+       "recentchangescount": "Jumlah suntiangan nan ditunjuakan dalam parubahan baru, riwayaik laman, dan dalam log, sacaro baku:",
+       "prefs-help-recentchangescount": "Nilai maksimum: 1000",
        "savedprefs": "Pangaturan lah tasimpan",
        "timezonelegend": "Zona wakatu:",
        "localtime": "Wakatu satampaik:",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS surang",
        "prefs-custom-js": "JS surang",
-       "prefs-common-config": "CSS/JS untuak kasado kulik:",
+       "prefs-common-config": "CSS/JS babagi untuak kasado kulik:",
        "prefs-reset-intro": "Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.\nPangambalian pangaturan indak dapek dibatalan.",
        "prefs-emailconfirm-label": "Surel konfirmasi:",
        "youremail": "Surel:",
        "prefs-advancedediting": "Piliahan umum",
        "prefs-developertools": "Alaik Pangambang",
        "prefs-editor": "Editor",
-       "prefs-preview": "Pratonton",
+       "prefs-preview": "Pratinjau",
        "prefs-advancedrc": "Piliahan lanjuik",
        "prefs-advancedrendering": "Piliahan lanjuik",
        "prefs-advancedsearchoptions": "Piliahan lanjuik",
        "userrights-expiry-in-past": "Wakatu usang untuak kalompok \"$1\" alah balalu.",
        "group": "Kalompok:",
        "group-user": "Pangguno",
-       "group-autoconfirmed": "Pangguno takonfirmasi otomatis",
+       "group-autoconfirmed": "Pangguno takonfirmasi otomatih",
        "group-bot": "Bot",
        "group-sysop": "Panguruih",
        "group-interface-admin": "Panguruih antarmuko",
        "group-suppress": "Pamberedel",
        "group-all": "(sadonyo)",
        "group-user-member": "{{GENDER:$1|pangguno}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|pangguno takonfirmasi otomatis}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|pangguno takonfirmasi otomatih}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|panguruih}}",
        "group-interface-admin-member": "{{GENDER:$1|panguruih antarmuko}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat}}",
        "group-suppress-member": "{{GENDER:$1|pamberedel}}",
        "grouppage-user": "{{ns:project}}:Pangguno",
-       "grouppage-autoconfirmed": "{{ns:project}}:Pangguno takonfirmasi otomatis",
+       "grouppage-autoconfirmed": "{{ns:project}}:Pangguno takonfirmasi otomatih",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Panguruih",
        "grouppage-interface-admin": "{{ns:project}}:Panguruih antarmuko",
        "right-upload": "Mamuek berkas",
        "right-reupload": "Manimpo berkas lamo",
        "right-reupload-own": "Manimpo berkas nan dimuek surang",
-       "right-purge": "Mangapuih singgahan laman tanpa laman konfirmasi",
-       "right-autoconfirmed": "Manyuntiang laman palinduangan semi",
-       "right-bot": "Dipalakuan sabagai proses otomatis",
+       "right-purge": "Mangapuih singgahan laman untuak laman",
+       "right-autoconfirmed": "Indak dipangaruahi bateh limik babasis IP",
+       "right-bot": "Dipalakuan sabagai proses otomatih",
        "right-nominornewtalk": "Indak ado tando suntiangan ketek di laman rundiang mamicu pasan baru",
        "right-apihighlimits": "Manggunoan bateh labiah tinggi dalam kueri API",
        "right-writeapi": "Manggunoan panulisan API",
        "right-delete": "Mangapuih laman",
        "right-suppressionlog": "Mancaliak log privat",
-       "right-unblockself": "Malapehan sakek diri surang",
+       "right-unblockself": "Malapehan sakek surang",
        "right-editinterface": "Manyuntiang antarmuko pangguno",
        "right-editusercss": "Manyuntiang berkas CSS pangguno lain",
        "right-edituserjson": "Manyuntiang berkas JSON pangguno lain",
        "right-noratelimit": "Indak dipangaruahi jo pambatehan jumlah suntiangan",
        "right-import": "Mangimpor laman dari wiki lain",
        "right-importupload": "Mangimpor laman dari berkas nan dimuek",
-       "right-autopatrol": "Suntiangan surang sacaro otomatis ditandoi tapantau",
+       "right-autopatrol": "Suntiangan surang sacaro otomatih ditandoi tapantau",
        "grant-group-email": "Kirim surel",
        "grant-createaccount": "Buek akun",
        "grant-createeditmovepage": "Buek, suntiang, dan pindahkan laman",
        "rightslogtext": "Di bawah ko daftar log parubahan pado hak-hak pangguno.",
        "action-read": "baco laman ko",
        "action-edit": "suntiang laman ko",
-       "action-createpage": "buek laman",
-       "action-createtalk": "buek laman diskusi",
+       "action-createpage": "buek laman ko",
+       "action-createtalk": "buek laman rundiang ko",
        "action-createaccount": "buek akun pangguno ko",
        "action-minoredit": "tandoi sabagai suntiangan ketek",
        "action-move": "pindahan laman ko",
        "action-upload": "muek berkas ko",
        "action-reupload": "timpo berkas lamo",
        "action-writeapi": "manggunoan panulisan API",
-       "action-import": "impor laman ko dari wiki lain",
+       "action-import": "impor laman dari wiki lain",
        "nchanges": "$1 {{PLURAL:$1|parubahan}}",
        "enhancedrc-history": "riwayaik",
        "recentchanges": "Parubahan baru",
        "recentchanges-legend": "Piliahan parubahan baru",
-       "recentchanges-summary": "Caliak parubahan tabaru pado wiki di laman ko.<br />\n;Patunjuak:(<span style=\"color:blue;\">bedo</span>) parubahan, (<span style=\"color:blue;\">sijarah</span>) riwayaik parubahan, '''B''' laman baru, '''b''' suntiangan bot, '''k''' suntiangan ketek, <span class=\"unpatrolled\">!</span> parubahan alun dipatroli,<br /><span style=\"color:green;\">'''(+ ''bita'')'''</span> isi laman batambah, <span style=\"color:red;\">(- ''bita'')</span> isi laman bakurang, (← Ikhtisar otomatih), (→ <span style=\"color:grey;\">Suntiangan bagian</span>)",
+       "recentchanges-summary": "Caliak parubahan baru di wiki pado laman ko.<br />\n;Patunjuak:(<span style=\"color:blue;\">bedo</span>) parubahan, (<span style=\"color:blue;\">sijarah</span>) riwayaik parubahan, '''B''' laman baru, '''b''' suntiangan bot, '''k''' suntiangan ketek, <span class=\"unpatrolled\">!</span> parubahan alun dipatroli,<br /><span style=\"color:green;\">'''(+ ''bita'')'''</span> isi laman batambah, <span style=\"color:red;\">(- ''bita'')</span> isi laman bakurang, (← Ikhtisar otomatih), (→ <span style=\"color:grey;\">Suntiangan bagian</span>)",
        "recentchanges-noresult": "Indak ado parubahan dalam rantang wakatu ko nan sasuai jo kriteria.",
        "recentchanges-feed-description": "Tamuan parubahan baru dalam umpan wiki ko",
        "recentchanges-label-newpage": "Suntiangan ko mambuek laman baru",
        "rcfilters-savedqueries-cancel-label": "Batalan",
        "rcfilters-savedqueries-add-new-title": "Simpan pangaturan panyariang ko",
        "rcfilters-savedqueries-already-saved": "Panyariang ko alah tasimpan. Ubah pangaturan Sanak untuak manyimpan panyariang baru.",
+       "rcfilters-show-new-changes": "Tunjuakan parubahan baru dari $1",
        "rcfilters-search-placeholder": "Panyariang parubahan (gunokan menu atau cari namo panyariang)",
        "rcfilters-search-placeholder-mobile": "Panyariang",
        "rcfilters-filterlist-title": "Panyariang",
        "minoreditletter": "k",
        "newpageletter": "B",
        "boteditletter": "b",
-       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bita}} salapeh parubahan",
-       "rc-enhanced-expand": "Tampilkan rincian (paralu JavaScript)",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bita}} salapeh parubahan",
+       "rc-enhanced-expand": "Caliak rincian",
        "rc-enhanced-hide": "Suruakkan rincian",
-       "rc-old-title": "awanyo dibuek jo judua \"$1\"",
+       "rc-old-title": "awalnyo dibuek jo judul \"$1\"",
        "recentchangeslinked": "Parubahan takaik",
        "recentchangeslinked-feed": "Parubahan takaik",
        "recentchangeslinked-toolbox": "Parubahan takaik",
        "upload_directory_read_only": "Direktori pamuatan ($1) indak dapek ditulih jo server web.",
        "uploaderror": "Kasalahan pamuatan",
        "upload-recreate-warning": "'''Paringatan: Berkas jo namo tu alah dihapuih atau dipindahan.'''\n\nLog pangapuihan dan pamindahan laman ko adolah sabagai barikuik:",
-       "uploadtext": "Gunoan formulir di bawah ko untuak mangunggah berkas.\nUntuak manampilan atau mancari berkas nan sabalumnyo dimuek, gunoan [[Special:FileList|daftar berkas]]. Pangunggahan (ulang) tacatat dalam [[Special:Log/upload|log pangunggahan]], samantaro pangapuihan tacatat dalam [[Special:Log/delete|log pangapuihan]].\n\nUntuak manampilkan berkas pado suatu laman, gunoan salah satu format di bawah ko:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code>''' untuak manampilan berkas dalam ukuran aslinyo\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|teks alternatif]]</nowiki></code>''' untuak manampilan berkas jo leba 200px dalam sabuah kotak di kiri laman jo 'teks alternatif' sabagai katarangan gambar\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code>''' sabagai pautan langsuang ka berkas media nan dimakasuik tanpa manampilan berkas tarsabuik di laman wiki",
-       "upload-permitted": "Jenis berkas nan dipabuliahan: $1.",
-       "upload-preferred": "Jenis berkas nan disaranan: $1.",
-       "upload-prohibited": "Jenis berkas nan dilarang: $1.",
+       "uploadtext": "Gunoan formulir di bawah ko untuak mangunggah berkas.\nUntuak manampilan atau mancari berkas nan sabalumnyo dimuek, gunoan [[Special:FileList|daftar berkas]]. Pangunggahan (ulang) tacatat dalam [[Special:Log/upload|log pangunggahan]], samantaro pangapuihan tacatat dalam [[Special:Log/delete|log pangapuihan]].\n\nUntuak manampilkan berkas pado suatu laman, gunoan salah satu format di bawah ko:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.jpg]]</nowiki></code></strong> untuak manampilan berkas dalam ukuran aslinyo\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Berkas.png|200px|thumb|left|teks alternatif]]</nowiki></code></strong> untuak manampilan berkas jo leba 200px dalam sabuah kotak di kiri laman jo 'teks alternatif' sabagai katarangan gambar\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Berkas.ogg]]</nowiki></code></strong> sabagai pautan langsuang ka berkas media nan dimakasuik tanpa manampilan berkas tasabuik di laman wiki",
+       "upload-permitted": "{{PLURAL:$2|Tipe}} berkas nan dipabuliahan: $1.",
+       "upload-preferred": "{{PLURAL:$2|Tipe}} berkas nan disaranan: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Tipe}} berkas nan dilarang: $1.",
        "uploadlogpage": "Log muek",
        "uploadlogpagetext": "Barikuik ko adolah daftar pangunggahan berkas tabaru. \nCaliak [[Special:NewFiles|galeri berkas baru]] untuak tampilan visual.",
        "filename": "Namo berkas",
        "license": "Lisensi:",
        "license-header": "Lisensi",
        "nolicense": "Indak ado nan dipiliah",
-       "license-nopreview": "(Pratonton indak tasadio)",
-       "upload_source_url": " (suatu URL sah nan dapek diakses publik)",
-       "upload_source_file": " (berkas nan di komputer Sanak)",
-       "listfiles-summary": "Laman istimewa ko manampilan kasado berkas nan alah diunggah.\nKatiko disariang dek pangguno, hanyo versi berkas tabaru dari berkas nan diunggah nan tampil.",
+       "license-nopreview": "(Pratinjau indak tasadio)",
+       "upload_source_url": "(Sanak piliah berkas dari URL valid nan dapek diakses publik)",
+       "upload_source_file": "(Sanak piliah berkas dari komputer Sanak)",
+       "listfiles-summary": "Laman istimewa barikuik manunjuakan sado berkas nan dimuek.",
        "listfiles_search_for": "Cari namo berkas:",
        "imgfile": "berkas",
        "listfiles": "Daftar berkas",
        "filehist-filesize": "Ukuaran berkas",
        "filehist-comment": "Komen",
        "imagelinks": "Panggunoan berkas",
-       "linkstoimage": "{{PLURAL:$1|Halaman|$1 halaman}} nan iko manggunoan berkas nan iko:",
+       "linkstoimage": "{{PLURAL:$1|Laman|$1 laman}} barikuik manggunoan berkas ko:",
        "linkstoimage-more": "Labiah dari $1 {{PLURAL:$1|laman}} ado pautan ka berkas ko.\nDaftar barikuik manunjuakan {{PLURAL:$1|$1 laman jo pautan langsuang}} ka berkas ko.\nAdo juo tasadio [[Special:WhatLinksHere/$2|daftar langkoknyo]].",
        "nolinkstoimage": "Indak ado laman nan manggunokan berkas ko.",
        "morelinkstoimage": "Caliak [[Special:WhatLinksHere/$1|pautan baliak]] ka berkas ko.",
        "filerevert-badversion": "Indak ado versi lokal tadahulu dari berkas ko pado wakatu nan dituju.",
        "filedelete": "Hapuih $1",
        "filedelete-legend": "Hapuih berkas",
+       "filedelete-success": "'''$1''' alah dihapuih.",
        "mimesearch": "Pancarian MIME",
        "unwatchedpages": "Laman nan indak tapantau",
        "listredirects": "Daftar pangaliahan",
        "pageswithprop-text": "Laman ko barisi daftar laman nan manggunoan properti laman tatantu.",
        "pageswithprop-prop": "Namo properti:",
        "pageswithprop-submit": "Lanjuik",
-       "doubleredirects": "Pangaliahan gando",
+       "doubleredirects": "Pangaliahan ganda",
        "doubleredirectstext": "Laman ko mamuek daftar laman nan dialiahkan ka laman pangaliahan nan lain.\nSatiok barih mamuek pautan ka pangaliahan partamo dan pangaliahan kadua sarato target dari pangaliahan kadua nan umumnyo adolah laman nan \"sabananyo\". Laman pangaliahan partamo saharuihnyo dialiahkan ka laman nan bukan marupoan laman pangaliahan.\nJudul laman nan <del>dicoret</del> bararti alah dipelokan.",
        "double-redirect-fixer": "Revisi pangaliahan",
        "brokenredirects": "Pangaliahan rusak",
        "wantedtemplates": "Templat nan diinginan",
        "mostlinked": "Laman nan acok dituju",
        "mostlinkedcategories": "Kategori nan acok digunoan",
-       "mostlinkedtemplates": "Templat nan acok dituju",
+       "mostlinkedtemplates": "Templat nan acok ditransklusi",
        "mostcategories": "Laman jo kategori tabanyak",
        "mostimages": "Berkas nan paliang acok digunoan",
        "mostinterwikis": "Laman jo interwiki paliang banyak",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-search": "Cari",
        "specialloguserlabel": "Pangguno:",
-       "speciallogtitlelabel": "Target (judua atau {{ns:pangguno}}:namo pangguno untuak pangguno):",
+       "speciallogtitlelabel": "Target (judul atau {{ns:user}}:namo pangguno untuak pangguno):",
        "log": "Log",
        "all-logs-page": "Sado log publik",
        "alllogstext": "Gabuangan kasado log nan ado di {{SITENAME}}.\nSanak dapek mamiliah jinih log nan ado, namo pangguno (bedoan hurup ketek/gadang), atau judul laman (bedaan hurup ketek/gadang).",
        "allpages-hide-redirects": "Suruakan pangaliahan",
        "cachedspecial-refresh-now": "Caliak versi baru.",
        "categories": "Kategori",
-       "categoriespagetext": "{{PLURAL:$1|Isi kategori}} ko ado laman atau media.\n[[Special:UnusedCategories|Kategori nan indak tapakai]] indak nampak di siko.\nLihek pulo [[Special:WantedCategories|kategori nan diinginan]].",
+       "categoriespagetext": "{{PLURAL:$1|Kategori barikuik}} ado di Wiki, dan mungkin digunoan atau indak.\nCaliak pulo [[Special:WantedCategories|kategori nan diinginkan]].",
        "categoriesfrom": "Tunjuakan kategori mulai jo:",
        "deletedcontributions": "Jariah nan dihapuih",
        "deletedcontributions-title": "Jariah nan dihapuih",
        "activeusers-noresult": "Pangguno indak basobok",
        "listgrouprights": "Daftar kalompok pangguno",
        "listgrouprights-summary": "Barikuik ko adolah daftar kalompok pangguno nan ado di wiki ko, jo daftar hak aksesnyo masiang-masiang. Informasi labih lanjuik masalah hak masiang-masiang dapek dijumpoi di [[{{MediaWiki:Listgrouprights-helppage}}|laman bantuan hak pangguno]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak nan balaku</span>\n* <span class=\"listgrouprights-revoked\">Hak nan dicabuik</span>",
+       "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Hak nan balaku</span>\n* <span class=\"listgrouprights-revoked\">Hak nan dicabuik</span>",
        "listgrouprights-group": "Kalompok",
        "listgrouprights-rights": "Hak",
        "listgrouprights-helppage": "Help:Hak akses",
        "watchlist": "Pantauan",
        "mywatchlist": "Pantauan",
        "watchlistfor2": "Untuak $1 $2",
-       "addedwatchtext": "Laman \"[[:$1]]\" lah ditambahan ka [[Special:Watchlist|Pantauan]] Sanak.\nParubahan laman ko tamasuak laman rundiangnyo akan ditampilan disinan.",
+       "addedwatchtext": "\"[[:$1]]\" jo laman rundiangnyo lah ditambahan ka [[Special:Watchlist|Pantauan]] Sanak.",
        "removewatch": "Hapuih dari daftar pantau",
-       "removedwatchtext": "Laman \"[[:$1]]\" lah dihapuih dari [[Special:Watchlist|daftar pantau Sanak]].",
+       "removedwatchtext": "\"[[:$1]]\" jo laman rundiangnyo lah dihapuih dari [[Special:Watchlist|daftar pantau Sanak]].",
        "watch": "Pantau",
        "watchthispage": "Pantau laman ko",
        "unwatch": "Batal pantau",
        "watchlist-details": "Ado {{PLURAL:$1|$1 laman}} dalam daftar pantau Sanak (tamasuak laman rundiangnyo).",
        "wlheader-showupdated": "Laman nan alah barubah sajak kunjuangan tarakhia Sanak ditunjuakan jo <strong>hurup taba</strong>",
        "wlnote": "Di bawah ko ado $1 {{PLURAL:$1|parubahan}} dalam {{PLURAL:$2|'''$2''' jam}} iko, sampai tanggal $3, pukua $4.",
-       "wlshowlast": "Tunjuakan $1 jam parubahan dalam $2 hari tarakhia",
        "watchlist-options": "Piliahan daftar pantau",
        "watching": "Mamantau...",
        "unwatching": "indak dipantau le...",
        "deletepage": "Hapuih laman",
        "confirm": "Konfirmasi",
        "excontent": "isi sabalunnyo: \"$1\"",
-       "excontentauthor": "isinyo: \"$1\" (dan dibuek dek \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "isinyo: \"$1\", dan dibuek dek \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|maota]])",
        "exbeforeblank": "isi sabalun dikosongan: \"$1\"",
        "delete-confirm": "Hapuih \"$1\"",
        "delete-legend": "Hapuih",
-       "historywarning": "'''Paringatan:''' Laman nan ka dihapuih ado riwayaik jo $1 {{PLURAL:$1|revisi}}:",
-       "confirmdeletetext": "Awak akan mahapuih laman atau berkas basamo riwayatnyo.\nPastikan awak mainginkannyo, dan awak lah tahu sagalo akibatnyo dan sasuai jo [[{{MediaWiki:Policy-url}}|kebijakan]] yang balaku.",
+       "historywarning": "<strong>Paringatan:</strong> Laman nan ka dihapuih ado riwayaik jo $1 {{PLURAL:$1|revisi}}:",
+       "confirmdeletetext": "Sanak akan mangapuih laman atau berkas jo riwayaiknyo.\nPastikan Sanak mainginkannyo, dan lah tahu sagalo akibatnyo dan sasuai jo [[{{MediaWiki:Policy-url}}|kabijakan]] nan balaku.",
        "actioncomplete": "Proses salasai",
        "actionfailed": "Proses gagal",
        "deletedtext": "\"$1\" lah dihapuih.\nCaliak $2 untuak rakam jajak laman nan lah dihapuih.",
        "protect_expiry_old": "Maso kadaluwarsa adolah pado maso lampau",
        "protect-text": "Sanak buliah malihek jo mangganti tingkek palinduangan untuak laman '''$1'''.",
        "protect-locked-access": "Akun Sanak indak bahak untuak maubah tingkek palinduangan laman ko.\nBarikuik ko pangaturan nan balaku untuak laman '''$1''':",
-       "protect-cascadeon": "Laman ko sedang dilindungi karano tamasuak dalam {{PLURAL:$1|laman|laman}} aktif perlindungan batingkek.\nAwak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlindungan batingkeknyo.",
+       "protect-cascadeon": "Laman ko sedang dilindungi karano tamasuak dalam {{PLURAL:$1|laman}} aktif palinduangan batingkek.\nParubahan tingkek palinduangannyo indak mampangaruahi palinduangan batingkeknyo.",
        "protect-default": "Kasado pangguno diizinan",
        "protect-fallback": "Untuak pangguno jo izin  \"$1\" sajo",
-       "protect-level-autoconfirmed": "Untuak pangguno takonfirmasi otomatis sajo",
+       "protect-level-autoconfirmed": "Untuak pangguno takonfirmasi otomatih sajo",
        "protect-level-sysop": "Untuak panguruih sajo",
        "protect-summary-cascade": "batingkek",
        "protect-expiring": "sampai $1 (UTC)",
        "restriction-move": "Pindah",
        "restriction-create": "Buek",
        "restriction-upload": "Muek",
-       "restriction-level-sysop": "palinduangan panuah",
-       "restriction-level-autoconfirmed": "palinduangan semi",
-       "restriction-level-all": "sado tingkek",
+       "restriction-level-sysop": "Palinduangan panuah",
+       "restriction-level-autoconfirmed": "Palinduangan semi",
+       "restriction-level-all": "Sado tingkek",
        "undelete": "Caliak laman nan dihapuih",
        "undeletepage": "Caliak dan baliakan laman tahapuih",
        "undeletepagetitle": "'''Iko daftar revisi nan dihapuih dari [[:$1|$1]]'''.",
        "undelete-cleanup-error": "Kasalahan sawaktu mangapuih arsip berkas \"$1\" nan indak digunoan.",
        "namespace": "Ruangnamo:",
        "invert": "Baliakkan piliahan",
-       "tooltip-invert": "Buek centang pado kotak ko untuak manyuruakkan parubahan pado halaman nan tagolong pado ruang namo nan dipiliah (dan ruang namo nan takaik jikok tacentang)",
+       "tooltip-invert": "Buek centang pado kotak ko untuak manyuruakkan parubahan pado laman nan tagolong pado ruang namo nan dipiliah (dan ruang namo nan takaik jikok tacentang)",
        "namespace_association": "Ruangnamo takaik",
-       "tooltip-namespace_association": "Centang halaman ko untuak mamasuakkan ruang namo rundiang atau topik nan takaik jo ruang namo nan dipiliah",
+       "tooltip-namespace_association": "Centang laman ko untuak mamasuakkan ruang namo rundiang atau topik nan takaik jo ruang namo nan dipiliah",
        "blanknamespace": "(Utamo)",
        "contributions": "Jariah {{GENDER:$1|pangguno}}",
        "contributions-title": "Jariah pangguno untuak $1",
        "month": "Dari bulan (dan sabalunnyo):",
        "year": "Dari taun (dan sabalunnyo):",
        "sp-contributions-blocklog": "log sakek",
-       "sp-contributions-deleted": "jariah pangguno nan lah dihapuih",
+       "sp-contributions-deleted": "jariah {{GENDER:$1|pangguno}} nan lah dihapuih",
        "sp-contributions-uploads": "muek",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "maota",
-       "sp-contributions-userrights": "pangalolaan hak pangguno",
-       "sp-contributions-blocked-notice": "Pangguno ko sadang kanai sakek. log pamblokiran tarakhia ditunjuakan disiko untuak referensi:",
+       "sp-contributions-userrights": "pangalolaan hak {{GENDER:$1|pangguno}}",
+       "sp-contributions-blocked-notice": "Pangguno ko sadang kanai sakek. log panyakekan tarakhia ditunjuakan disiko untuak referensi:",
        "sp-contributions-blocked-notice-anon": "Alamaik IP ko tangah kanai sakek.\nEntri log sakek tabaru ado di bawah ko untuak referensi:",
        "sp-contributions-search": "Cari jariah",
        "sp-contributions-username": "Alamaik IP atau namo pangguno:",
        "whatlinkshere-title": "Laman nan takaik ka \"$1\"",
        "whatlinkshere-page": "Laman:",
        "linkshere": "Laman-laman ko bakaik ka '''$2''':",
-       "nolinkshere": "Indak ado laman nan punyo tautan ka '''$2'''.",
+       "nolinkshere": "Indak ado laman nan ado pautan ka <strong>$2</strong>.",
        "nolinkshere-ns": "Indak ado pautan laman ka '''$2''' pado ruang namo nan dipiliah.",
        "isredirect": "laman pangaliahan",
        "istemplate": "transklusi",
        "autoblockid": "Sakek otomatih #$1",
        "block": "Sakek pangguno",
        "unblock": "Lapeh sakek",
-       "blockip": "Sakek pangguno",
-       "blockiptext": "Gunoan formulir di bawah ko untuak manyakek akses dari sabuah alamaik IP atau pangguno.\nIko hanyo buliah dilakuan untuak mancagah vandal, dan sajalan jo [[{{MediaWiki:Policy-url}}|kabijakan]].\nMasuakan alasan sakek di bawah (contoh, mambuek karusakan atau vandal).",
+       "blockip": "Sakek {{GENDER:$1|pangguno}}",
+       "blockiptext": "Gunoan formulir di bawah ko untuak manyakek akses dari sabuah alamaik IP atau pangguno.\nIko hanyo buliah dilakuan untuak mancagah vandal, dan sajalan jo [[{{MediaWiki:Policy-url}}|kabijakan]].\nMasuakan alasan sakek di bawah (contoh, mambuek karusakan atau vandal). Sanak dapek manyakek rantang IP manggunoan [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; rantang tagadang nan dibuliahkan adolah /$1 untuak IPv4 dan /$2 untuak IPv6.",
        "ipaddressorusername": "Alamaik IP atau namo pangguno:",
        "ipbreason": "Alasan:",
        "ipbreason-dropdown": "*Alasan umum sakek\n** Marusak (vandal)\n** Mangagiah informasi palsu\n** Mangilangkan isi laman\n** Spam pautan ka situs lua\n** Mambuek ota gadang di laman\n** Babuek intimidasi/palecehan\n** Manyalahgunoan babarapo akun\n** Namo pangguno talarang\n** Bot alun ado bot flag",
        "ipb-hardblock": "Halang pangguno tadaftar untuak manyuntiang dari alamaik IP ko",
-       "ipbcreateaccount": "Halang mambuek akun",
-       "ipbemailban": "Halang pangguno mangirim surel",
+       "ipbcreateaccount": "Pambuek akun",
+       "ipbemailban": "Kirim surel",
        "ipbenableautoblock": "Otomatih sakek alamaik IP tarakhia nan digunoan pangguno ko, jo sado alamaik IP takaik nan mancubo manyuntiang.",
        "ipbsubmit": "Sakek pangguno ko",
        "ipbother": "Salamo:",
        "ipboptions": "2 jam:2 hours,1 ari:1 day,3 ari:3 days,1 pakan:1 week,2 pakan:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 taun:1 year,salamonyo:infinite",
        "ipbhidename": "Suruakan namo pangguno dari daftar jo suntiangan",
        "ipbwatchuser": "Pantau laman pangguno ko jo laman rundiangnyo",
-       "ipb-disableusertalk": "Halang pangguno ko manyuntiang laman diskusinyo wakatu disakek",
+       "ipb-disableusertalk": "Manyuntiang laman rundiangnyo surang",
        "ipb-change-block": "Sakek baliak pangguno jo setelan ko",
        "ipb-confirm": "Konfirmasi sakek",
        "badipaddress": "Alamaik IP salah",
        "ipb-unblock-addr": "Lapeh sakek $1",
        "ipb-unblock": "Lapeh sakek pangguno atau alamaik IP",
        "ipb-blocklist": "Caliak nan disakek",
-       "ipb-blocklist-contribs": "Jariah untuak $1",
+       "ipb-blocklist-contribs": "Jariah untuak {{GENDER:$1|$1}}",
        "block-expiry": "Sampai:",
        "unblockip": "Lapeh sakek",
        "unblockiptext": "Gunoan formulir ko untuak mangambalian hak akses alamaik IP atau pangguno nan kanai sakek",
        "emailblock": "surel disakek",
        "blocklist-nousertalk": "indak dapek manyuntiang laman maota surang",
        "ipblocklist-empty": "Daftar sakek ko kosong.",
-       "ipblocklist-no-results": "Alamaik IP atau pangguno nan dimintak indak disakek.",
+       "ipblocklist-no-results": "Indak ado sakek untuak alamat IP atau nama pangguno nan dituju.",
        "blocklink": "sakek",
        "unblocklink": "lapeh sakek",
        "change-blocklink": "ubah sakek",
        "contribslink": "jariah",
        "emaillink": "kirim surel",
-       "autoblocker": "Sakek otomatih dek alamaik IP lah digunoan jo \"[[User:$1|$1]]\".\nAlasan disakek untuak $1 adolah \"''$2''\"",
+       "autoblocker": "Sakek otomatih dek alamaik IP lah digunoan jo \"[[User:$1|$1]]\".\nAlasan disakek untuak $1 adolah \"$2\"",
        "blocklogpage": "Log sakek",
        "blocklogentry": "manyakek [[$1]] dalam maso $2 $3",
        "reblock-logentry": "maubah panyakekan [[$1]] jo maso abih $2 $3",
        "lockedbyandtime": "(dek {{GENDER:$1|$1}} pado $2 pukua $3)",
        "move-page": "Pindahan $1",
        "move-page-legend": "Pindahkan laman",
-       "movepagetext": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan kasado data riwayaiknyo ka namo baru. \nJudua lamo tu ka manjadi laman pangaliahan manuju judua nan baru. \nSanak dapek mampabarui pangaliahan-pangaliahan nan manuju ka judua lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|pangaliahan ganda]] atau [[Special:BrokenRedirects|pangaliahan rusak]]. Sanak batangguang jawek untuak mamastian baso pautan tu taruih manyambuang ka laman nan saharuihnyo.\n\nIngek baso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judua nan baru, kacuali bilo laman tu kosong atau marupoan laman pangaliahan dan indak adoi riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman tu ka namo lamo apobilo ado kasalahan, dan baso awak indak dapek maimpok laman nan alah ado.\n\n'''Paringatan!''' \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastian Sanak paham bana akibaik dari tindakan ko sabalun malanjuikannyo.",
-       "movepagetext-noredirectfixer": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sado data riwayaiknyo ka namo baru. \nJudul lamo tu ka manjadi laman paraliahan manuju judul nan baru. \nSanak dapek mampabarui paraliahan-paraliahan nan manuju ka judul lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|paraliahan ganda]] atau [[Special:BrokenRedirects|paralihan rusak]]. Sanak batangguang-jawek untuak mamastian pautan tu taruih manyambuang ka laman nan saaruihnyo.\n\nIngeklah bahaso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judul nan baru tu, kacuali bilo laman tu kosong atau marupoan laman paraliahan dan indak punyo riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman ka namo samulo apobilo ado kasalahan, dan Sanak indak dapek manimpo laman nan lah ado.\n\n'''Paringatan!''' \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastikan Sanak paham akibaik tindakan ko sabalun malanjuikannyo.",
-       "movepagetalktext": "Laman rundiang nan takaik akan dipindahan sacaro otomatih '''kacuali bilo:'''\n\n*Laman rundiang nan indak kosong lah ado pado judul baru, atau\n*Sanak indak mangagiah tando pado kotak di bawah.\n\nDalam kasus tu, kok amuah Sanak dapek mamindahan ataupun manggabuangan laman sacaro manual.",
+       "movepagetext": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan kasado data riwayaiknyo ka namo baru. \nJudua lamo tu ka manjadi laman pangaliahan manuju judua nan baru. \nSanak dapek mampabarui pangaliahan-pangaliahan nan manuju ka judua lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|pangaliahan ganda]] atau [[Special:BrokenRedirects|pangaliahan rusak]]. Sanak batangguang jawek untuak mamastian baso pautan tu taruih manyambuang ka laman nan saharuihnyo.\n\nIngek baso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judua nan baru, kacuali bilo laman tu kosong atau marupoan laman pangaliahan dan indak adoi riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman tu ka namo lamo apobilo ado kasalahan, dan baso awak indak dapek maimpok laman nan alah ado.\n\n<strong>Paringatan!</strong> \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastian Sanak paham bana akibaik dari tindakan ko sabalun malanjuikannyo.",
+       "movepagetext-noredirectfixer": "Formulir di bawah ko digunoan untuak maubah namo suatu laman dan mamindahan sado data riwayaiknyo ka namo baru. \nJudul lamo tu ka manjadi laman paraliahan manuju judul nan baru. \nSanak dapek mampabarui paraliahan-paraliahan nan manuju ka judul lamo sacaro otomatih.\nKok indak dipabarui sacaro otomatih, pastikan lah dipareso laman ko dari [[Special:DoubleRedirects|paraliahan ganda]] atau [[Special:BrokenRedirects|paralihan rusak]]. Sanak batangguang-jawek untuak mamastian pautan tu taruih manyambuang ka laman nan saaruihnyo.\n\nIngeklah bahaso laman ko '''indak''' ka bapindah apobilo lah ado laman nan manggunoan judul nan baru tu, kacuali bilo laman tu kosong atau marupoan laman paraliahan dan indak punyo riwayaik suntiangan. Aratinyo Sanak dapek maubah baliak namo laman ka namo samulo apobilo ado kasalahan, dan Sanak indak dapek manimpo laman nan lah ado.\n\n<strong>Paringatan!</strong> \nIko dapek maakibaikan parubahan nan indak dipakiroan pado laman nan populer; jadi pastikan Sanak paham akibaik tindakan ko sabalun malanjuikannyo.",
+       "movepagetalktext": "Jikok Sanak mancentang kotak ko, laman rundiang nan takaik  akan dipindahkan sacaro otomatih ka judul baru, kacuali laman rundiangnyo indak kosong.\n\nJikok saroman tu, Sanak tapaso mamindahkan atau manggabuangkan laman sacaro manual.",
        "moveuserpage-warning": "'''Paringatan:''' Sanak tangah mamindahan laman pangguno. Paralu dikatahui bahwa hanyo laman nan ka bapindah namun pangguno ''indak akan'' baganti namo.",
        "movenologintext": "Sanak musti pangguno tadaftar dan [[Special:UserLogin|masuak log]] untuak mamindahan laman.",
        "movenotallowed": "Sanak indak ado izin untuak mamindahan laman.",
        "movenotallowedfile": "Sanak indak ado izin untuak mamindahan berkas.",
        "cant-move-user-page": "Sanak indak ado izin untuak mamindahan laman pangguno (bagian dari sublaman).",
        "cant-move-to-user-page": "Sanak indak ado izin untuak mamindahan laman ka laman pangguno (salain ka sublaman pangguno).",
-       "newtitle": "Ka judul baru:",
+       "newtitle": "Judul baru:",
        "move-watch": "Pantau laman ko",
        "movepagebtn": "Pindahkan laman",
        "pagemovedsub": "Pamindahan barasil",
        "thumbnail_error": "Gagal mambuek miniatua: $1",
        "import": "Impor laman",
        "importstart": "Mangimpor laman...",
-       "importnosources": "Indak ado sumber impor transwiki nan lah dibuek dan pamuatan riwayaik sacaro langsuang alah dinon-aktipan.",
+       "importnosources": "Indak ado sumber impor transwiki nan lah dibuek dan pamuatan riwayaik sacaro langsuang indak aktip.",
        "importlogpage": "Log impor",
        "importlogpagetext": "Administrasi laman impor jo riwayaik panyuntiangannyo dari wiki lain.",
        "tooltip-pt-userpage": "Laman {{GENDER:|pangguno Sanak}}",
        "tooltip-pt-anonuserpage": "Laman pangguno IP Sanak",
        "tooltip-pt-mytalk": "Laman rundiang {{GENDER:|Sanak}}",
        "tooltip-pt-anontalk": "Parundiangan tantang suntiangan dari IP ko",
-       "tooltip-pt-preferences": "Piliahan {{GENDER:|Sanak}}",
+       "tooltip-pt-preferences": "Pangaturan {{GENDER:|Sanak}}",
        "tooltip-pt-watchlist": "Daftar laman nan dipantau.",
        "tooltip-pt-mycontris": "Daftar jariah {{GENDER:|Sanak}}",
        "tooltip-pt-login": "Sanak disaranan untuak masuak log; walaupun indak wajib",
        "tooltip-t-recentchangeslinked": "Parubahan baru laman nan bakaik jo laman ko",
        "tooltip-feed-rss": "Umpan RSS untuak laman ko",
        "tooltip-feed-atom": "Umpan Atom untuak laman ko",
-       "tooltip-t-contributions": "Daftar kontribusi {{GENDER:$1|pangguno iko}}",
+       "tooltip-t-contributions": "Daftar jariah {{GENDER:$1|pangguno ko}}",
        "tooltip-t-emailuser": "Kirimkan surel pado {{GENDER:$1|pangguno ko}}",
        "tooltip-t-upload": "Muek berkas",
        "tooltip-t-specialpages": "Daftar kasado laman istimewa",
        "tooltip-ca-nstab-category": "Caliak laman kategori",
        "tooltip-minoredit": "Tandoi iko sabagai suntiangan ketek",
        "tooltip-save": "Simpan nan diubah",
+       "tooltip-publish": "Simpan parubahan Sanak",
        "tooltip-preview": "Caliak lu nan diubah, gunoan ko sabalun manyimpan",
        "tooltip-diff": "Caliak parubahan nan lah dibuek",
        "tooltip-compareselectedversions": "Caliak pabedaan antaro duo revisi piliahan laman ko",
        "tooltip-recreate": "Buek baliak laman walaupun sabananyo pernah dihapuih",
        "tooltip-upload": "Mulai mamuek",
        "tooltip-rollback": "\"Baliakkan\" uruangan suntiang laman ko pado jariah tarakhir dalam sakali klik",
-       "tooltip-undo": "\"Batalan\" uruangkan panyuntiangan iko jo mambukak bantuak suntiang dalam bantuak pratonton. Hal ko mamungkinkan manambahkan alasan pado kotak ringkasan.",
+       "tooltip-undo": "\"Batalan\" uruangkan panyuntiangan ko jo mambukak bantuak suntiang dalam bantuak pratinjau. Hal iko mamungkinkan manambah alasan pado kotak ikhtisar .",
        "tooltip-preferences-save": "Simpan preferensi",
-       "tooltip-summary": "Buek ringkasan pendek",
+       "tooltip-summary": "Buek ikhtisar pendek",
        "print.css": "/* CSS placed here will affect the print output */",
        "anonymous": "{{PLURAL:$1|Pangguno}} anonim {{SITENAME}}",
        "siteuser": "pangguno {{SITENAME}} $1",
        "anonuser": "pangguno anonim {{SITENAME}} $1",
        "others": "lainnyo",
-       "siteusers": "{{PLURAL:$2|pangguno}} {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|Pangguno}} {{SITENAME}} $1",
        "anonusers": "{{PLURAL:$2|pangguno}} anonim {{SITENAME}} $1",
        "creditspage": "Panghargaan laman",
        "spam_blanking": "Sado revisi nan ado pautan ka $1, kosong",
        "patrol-log-header": "Iko daftar log revisi nan alah dipatroli.",
        "previousdiff": "← Revisi sabalunnyo",
        "nextdiff": "Revisi salanjuiknyo →",
-       "imagemaxsize": "Bateh ukuran gambar:<br />''(untuak laman katarangan berkas)''",
+       "imagemaxsize": "Bateh ukuran gambar pado laman katarangan berkas:",
        "thumbsize": "Ukuran miniatua:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|laman}}",
        "svg-long-desc-animated": "Berkas animasi SVG, $1 × $2 piksel, ukuran berkas: $3",
        "svg-long-error": "Berkas SVG indak sah: $1",
        "show-big-image": "Ukuran nan asali",
-       "show-big-image-preview": "Ukuran pratonton ko: $1",
+       "show-big-image-preview": "Ukuran pratinjau ko: $1",
        "show-big-image-other": "{{PLURAL:$2|Resolusi}} lainnyo: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "file-info-gif-looped": "ulang",
        "metadata-help": "Berkas ko ado informasi tambahan nan mungkin ditambahan dek kamera digital atau pamindai nan digunoan untuak mambuek atau mandigitalisasi berkas ko. Jikok berkas ko lah mangalami parubahan, rincian nan ado mungkin indak sacaro jaleh mancaminan parubahan dari berkas tu.",
        "metadata-expand": "Tunjuakan rincian tambahan",
        "metadata-collapse": "Suruakan rincian tambahan",
-       "metadata-fields": "Tapak metadata gambar nan didata dalam pasan ko ka dimasuakan pado tampilan laman gambar katiko tabel metadata disuruakan. \nNan lainnyo ka tasuruak sacaro baku.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "namespacesall": "sadonyo",
+       "metadata-fields": "Tapak metadata gambar nan didata dalam pasan ko ka dimasuakan pado tampilan laman gambar sangkek tabel metadata disuruakan. \nNan lainnyo ka tasuruak sacaro baku.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "namespacesall": "Sadonyo",
        "monthsall": "sadonyo",
        "imgmultipagenext": "Laman salanjuiknyo →",
        "imgmultigo": "Cari!",
        "duplicate-defaultsort": "'''Peringatan:''' Kunci panguruitan default \"$2\" sabalunnyo mangabaikan kunci panguruitan default \"$1\".",
        "version": "Versi",
        "version-extensions": "Ekstensi tarinstal",
-       "version-skins": "Kulik",
+       "version-skins": "Kulik tarinstal",
        "version-specialpages": "Laman istimewa",
        "version-parserhooks": "Kaik parser",
        "version-variables": "Variabel",
        "version-antispam": "Pancagahan spam",
        "version-other": "Lain-lain",
        "version-version": "($1)",
-       "version-license": "Lisensi",
+       "version-license": "Lisensi MediaWiki",
        "version-poweredby-credits": "Wiki ko didukuang jo '''[https://www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
        "version-poweredby-others": "lainnyo",
        "version-credits-summary": "Kami nio mangakui urang-urang ko ateh kontribusinyo pado [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki adolah parangkaik lunak bebas; Sanak dapek mandistribusian dan/atau mamodfikasinyo jo syaraik Lisensi Publik Umum GNU nan dikaluaan dek Free Software Foundation; versi 2 atau nan tabaru.\n\nMediaWiki didistribusian jo harapan dapek digunoan, tapi INDAK JO JAMINAN APO PUN; indak ado jaminan PADAGANGAN atau KACOCOKAN UNTUAK TUJUAN TATANTU. Caliak Lisensi Publik Umum GNU untuak informasi lebiah lanjuik.\n\nSanak mustilah alah manarimo [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi Publik Umum GNU] basamo jo program iko; jikok indak, kiriman suraik ka Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atau [//www.gnu.org/licenses/old-licenses/gpl-2.0.html baco sacaro online].",
+       "version-license-info": "MediaWiki adolah parangkaik lunak bebas; Sanak dapek mandistribusian dan/atau mamodfikasinyo jo syaraik Lisensi Publik Umum GNU nan dikaluaan dek Free Software Foundation; versi 2 atau nan tabaru.\n\nMediaWiki didistribusian jo harapan dapek digunoan, tapi <em>INDAK ADO JAMINAN APOPUN</em>; indak ado jaminan <strong>PADAGANGAN</strong> atau <strong>KACOCOKAN UNTUAK TUJUAN TATANTU</strong>. Caliak Lisensi Publik Umum GNU untuak informasi lebiah lanjuik.\n\nSanak mustilah alah manarimo [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi Publik Umum GNU] basamo jo program iko; jikok indak, kiriman suraik ka Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA atau [//www.gnu.org/licenses/old-licenses/gpl-2.0.html baco sacaro online].",
        "version-software": "Parangkaik lunak tapasang",
        "version-software-product": "Produk",
        "version-software-version": "Versi",
        "fileduplicatesearch-result-n": "Berkas \"$1\" ado {{PLURAL:$2|$2 duplikat nan samo}}.",
        "fileduplicatesearch-noresults": "Indak basobok berkas banamo \"$1\".",
        "specialpages": "Laman istimewa",
-       "specialpages-note-restricted": "* Laman istimewa normal.\n* <span class=\"mw-specialpagerestricted\">Laman istimewa talarang.</span>\n* <span class=\"mw-specialpagecached\">Laman istimewa tasinggah (mungkin usang).</span>",
+       "specialpages-note-restricted": "* Laman istimewa biaso.\n* <span class=\"mw-specialpagerestricted\">Laman istimewa talarang.</span>",
        "specialpages-group-maintenance": "Laporan pamaliharoan",
        "specialpages-group-other": "Lain-lain",
        "specialpages-group-login": "Masuak log / mandaftar",
        "specialpages-group-spam": "Pakakeh panangka spam",
        "blankpage": "Laman kosong",
        "intentionallyblankpage": "Laman ko sangajo dikosoangkan.",
-       "external_image_whitelist": "#Bia se barih ko apo adonyo<pre>\n#Latakan fragmen tando regular (hanyo bagian antaro //) di bawah ko\n#Iko akan dicocokan jo URL gambar dari lua (tahubuang langsuang)\n#Nan mano nan cocok ditampilkan sabagai gambar, sisonyo hanyo sabagai tautan sajo\n#Barih nan dimulai jo # dianggap sabagai komentar\n#Iko indak mambedoan huruf gadang jo ketek\n\n#Latakan sado fragmen regex di bawah barih ko. Bia se barih ko apo adonyo</pre>",
+       "external_image_whitelist": "#Bia barih ko apo adonyo<pre>\n#Latakan fragmen tando regular (hanyo bagian antaro //) di bawah ko\n#Iko akan dicocokan jo URL gambar dari lua (tahubuang langsuang)\n#Nan mano nan cocok ditampilkan sabagai gambar, sisonyo hanyo sabagai pautan sajo\n#Barih nan dimulai jo # dianggap sabagai komentar\n#Iko indak mambedoan huruf gadang jo ketek\n\n#Latakan sado fragmen regex di bawah barih ko. Bia barih ko apo adonyo</pre>",
        "tags": "Tag parubahan nan sah",
        "tag-filter": "[[Special:Tags|Tag]] sariang:",
        "tag-filter-submit": "Sariang",
        "logentry-move-move_redir": "$1 {{GENDER:$2|mamindahan}} laman $3 ka $4 maimpok pangaliahan lamo",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|mamindahan}} laman $3 ka $4 maimpok pangaliahan lamo tanpa mambuek pangaliahan",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|manandoi}} revisi $4 dari laman $3 tapatroli",
-       "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|manandoi}} revisi $4 dari laman $3 tapatroli",
+       "logentry-patrol-patrol-auto": "$1 otomatih {{GENDER:$2|manandoi}} revisi $4 dari laman $3 tapatroli",
        "logentry-newusers-newusers": "Akun pangguno $1 alah {{GENDER:$2|dibuek}}",
        "logentry-newusers-create": "Akun pangguno $1 alah {{GENDER:$2|dibuek}}",
        "logentry-newusers-create2": "Akun pangguno $3 alah {{GENDER:$2|dibuek}} dek $1",
        "logentry-newusers-byemail": "Akun pangguno $3 alah {{GENDER:$2|dibuek}} dek $1 dan kato sandi alah dikirim jo surel",
-       "logentry-newusers-autocreate": "Akun pangguno $1 alah {{GENDER:$2|dibuek}} sacaro otomatis",
-       "logentry-rights-rights": "$1 {{GENDER:$2|maubah}} kaanggotaan kalompok $3 dari $4 manjadi $5",
+       "logentry-newusers-autocreate": "Akun pangguno $1 alah {{GENDER:$2|dibuek}} sacaro otomatih",
+       "logentry-rights-rights": "$1 {{GENDER:$2|maubah}} kaanggotaan kalompok {{GENDER:$6|$3}} dari $4 manjadi $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|maubah}} kaanggotaan kalompok $3",
        "logentry-upload-upload": "$1 {{GENDER:$2|mangunggah}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|maunggah}} versi baru dari $3",
        "expand_templates_xml_output": "Hasil XML",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Hapuih komentar",
-       "expand_templates_preview": "Pratonton",
+       "expand_templates_preview": "Pratinjau",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin tambahan",
        "special-characters-group-ipa": "IPA",
index 50843a2..be18d2e 100644 (file)
        "nocreate-loggedin": "Немате дозвола да создавате нови страници.",
        "sectioneditnotsupported-title": "Уредувањето на заглавија не е поддржано",
        "sectioneditnotsupported-text": "Уредувањето на заглавија не е поддржано на оваа страница.",
+       "modeleditnotsupported-title": "Уредувањето не е поддржано",
+       "modeleditnotsupported-text": "Уредувањето не е поддржано за содржинскиот модел $1.",
        "permissionserrors": "Грешка со дозволата",
        "permissionserrorstext": "Немате дозвола да го направите тоа, од {{PLURAL:$1|следнава причина|следниве причини}}:",
        "permissionserrorstext-withaction": "Немате дозвола за $2, од {{PLURAL:$1|следнава причина|следниве причини}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Празен објект",
        "content-json-empty-array": "Празна низа",
+       "unsupported-content-model": "<strong>Предупредување:</strong> Содржинскиот модел $1 не е поддржан на ова вики.",
+       "unsupported-content-diff": "Разликите не се поддржани за содржинскиот модел $1.",
+       "unsupported-content-diff2": "Разликите помеѓу содржинските модели $1 и $2 не се поддржани на ова вики.",
        "deprecated-self-close-category": "Страници со неважечки самозатворени HTML-ознаки",
        "deprecated-self-close-category-desc": "Страницата содржи неважечки самозатворени HTML-ознаки, како што се <code>&lt;b/></code> или <code>&lt;span/></code>. Нивното поведение наскоро ќе биде сменето, за да бидат во склад со определбите на HTML5. Ова значи дека се застарени и не треба да се употребуваат во викитекст.",
        "duplicate-args-warning": "<strong>Предупредување:</strong> [[:$1]] го повикува [[:$2]] со повеќе од една вредност за параметарот „$3“. Ќе се употреби само последната вредност.",
        "wlheader-enotif": "Известувањето по е-пошта е овозможено.",
        "wlheader-showupdated": "Страниците кои се променети од вашата последна посета се прикажани со <strong>задебелени</strong> букви.",
        "wlnote": "Подолу {{PLURAL:$1|е прикажана последната промена|се прикажани последните <strong>$1</strong> промени}} во {{PLURAL:$2|последниов час|последниве <strong>$2</strong> часа}}, заклучно со $3, $4 ч.",
-       "wlshowlast": "Прикажи ги последните $1 часа, $2 дена",
        "watchlist-hide": "Скриј",
        "watchlist-submit": "Прикажи",
        "wlshowtime": "Период за приказ:",
        "img-lang-default": "(стандарден јазик)",
        "img-lang-info": "Испиши ја сликата на $1. $2",
        "img-lang-go": "Прикажи",
-       "ascending_abbrev": "раст",
-       "descending_abbrev": "опаѓ",
        "table_pager_next": "Следна страница",
        "table_pager_prev": "Претходна страница",
        "table_pager_first": "Прва страница",
index da332ab..30edb01 100644 (file)
        "autoblockedtext": "താങ്കളുടെ ഐ.പി. വിലാസം സ്വയം തടയപ്പെട്ടിരിക്കുന്നു, മറ്റൊരു ഉപയോക്താവ് ഉപയോഗിച്ച കാരണത്താൽ $1 എന്ന കാര്യനിർവാഹകനാണ് തടഞ്ഞുവെച്ചത്.\nഇതിനു കാരണമായി നൽകിയിട്ടുള്ളത്:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n\nഈ തടയലിനെ കുറിച്ച് ചർച്ച ചെയ്യാൻ താങ്കൾക്കു $1 എന്ന കാര്യനിവാഹകനേയോ മറ്റു [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] ബന്ധപ്പെടാവുന്നതാണ്.\n\nശ്രദ്ധിക്കുക [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] സാധുവായ ഇമെയിൽ വിലാസം രേഖപ്പെടുത്താതിരിക്കുകയോ, അത് ഉപയോഗിക്കുന്നതിൽ നിന്ന് താങ്കളെ തടയുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ \"{{int:emailuser}}\" എന്ന സം‌വിധാനം പ്രവർത്തന രഹിതമായിരിക്കും.\n\nതാങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ആണ്, താങ്കളുടെ തടയലിന്റെ ഐ.ഡി. #$5 ആകുന്നു.\nദയവായി മുകളിൽ കൊടുത്തിരിക്കുന്ന വിവരങ്ങളെല്ലാം താങ്കൾ നടത്തുന്ന അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്തുവാൻ ശ്രദ്ധിക്കുക.",
        "systemblockedtext": "താങ്കളുടെ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ ഐ.പി. വിലാസം മീഡിയവിക്കി സ്വയം തടഞ്ഞിരിക്കുന്നു.\nതടയാനുള്ള കാരണം:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ കാലഹരണപ്പെടുന്നത്: $6\n* തടയാനുദ്ദേശിച്ചയാൾ: $7\n\nതാങ്കളുടെ നിലവിലെ ഐ.പി. വിലാസം $3 ആണ്.\nതാങ്കൾക്കെന്തെങ്കിലും ചോദ്യങ്ങളുണ്ടെങ്കിൽ മുകളിലെ എല്ലാ വിവരങ്ങളും ഉൾപ്പെടുത്തുക.",
        "blockednoreason": "കാരണമൊന്നും സൂചിപ്പിച്ചിട്ടില്ല",
+       "blockedtext-composite": "<strong>താങ്കളുടെ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ ഐ.പി. വിലാസം തടയപ്പെട്ടിരിക്കുന്നു.</strong>\n\nനൽകിയിരിക്കുന്ന കാരനം:\n\n:<em>$2</em>.\n\n* തടയൽ തുടങ്ങിയത്: $8\n* ഏറ്റവും ദൈർഘ്യമുള്ള തടയൽ കാലഹരണപ്പെടുന്നത്: $6\n\n* $5\n\nതാങ്കളുടെ നിലവിലെ ഐ.പി. വിലാസം $3 ആണ്.\nതാങ്കൾക്കെന്തെങ്കിലും ചോദ്യങ്ങളുണ്ടെങ്കിൽ മുകളിലെ എല്ലാ വിവരങ്ങളും ഉൾപ്പെടുത്തുക.",
+       "blockedtext-composite-ids": "ബന്ധപ്പെട്ട തടയൽ ഐ.ഡി.കൾ: $1 (താങ്കളുടെ ഐ.പി. വിലാസം കരിമ്പട്ടികയിൽ പെടുത്തിയിട്ടുമുണ്ടാകാം)",
        "blockedtext-composite-no-ids": "താങ്കളുടെ ഐ.പി. വിലാസം വിവിധ കരിമ്പട്ടികകളിൽ ഉൾപ്പെട്ടിരിക്കുന്നു",
        "blockedtext-composite-reason": "താങ്കളുടെ അംഗത്വത്തിന് അല്ലെങ്കിൽ ഐ.പി. വിലാസത്തിന് വിവിധ തടയലുകൾ നിലവിലുണ്ട്.",
        "whitelistedittext": "താളുകൾ തിരുത്താൻ താങ്കൾ $1 ചെയ്യേണ്ടതാണ്",
        "wlheader-enotif": "ഇമെയിൽ അറിയിപ്പുകൾ സജ്ജമാക്കിയിരിക്കുന്നു.",
        "wlheader-showupdated": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
        "wlnote": "$3, $4-നു കഴിഞ്ഞ {{PLURAL:$2|മണിക്കൂറിൽ|<strong>$2</strong> മണിക്കൂറിൽ}} നടന്ന {{PLURAL:$1|ഒരു പുതിയ മാറ്റം|<strong>$1</strong> പുതിയ മാറ്റങ്ങൾ}} താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു.",
-       "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "watchlist-hide": "മറയ്ക്കുക",
        "watchlist-submit": "പ്രദർശിപ്പിക്കുക",
        "wlshowtime": "പ്രദർശിപ്പിക്കേണ്ട കാലാവധി:",
        "img-lang-default": "(സ്വതേയുള്ള ഭാഷ)",
        "img-lang-info": "ഈ ചിത്രം ഈ ഭാഷയിൽ കാണിക്കുക: $1. $2",
        "img-lang-go": "പോകൂ",
-       "ascending_abbrev": "ആരോഹണം",
-       "descending_abbrev": "അവരോഹണം",
        "table_pager_next": "അടുത്ത താൾ",
        "table_pager_prev": "മുൻപത്തെ താൾ",
        "table_pager_first": "ആദ്യതാൾ",
        "permanentlink": "സ്ഥിരംകണ്ണി",
        "permanentlink-revid": "നാൾപ്പതിപ്പ് ഐ.ഡി.",
        "permanentlink-submit": "നാൾപ്പതിപ്പിലേക്ക് പോവുക",
+       "newsection": "പുതിയ വിഭാഗം",
+       "newsection-page": "ലക്ഷ്യ താൾ",
+       "newsection-submit": "താളിലേക്ക് പോകുക",
        "dberr-problems": "ക്ഷമിക്കണം! ഈ സൈറ്റിൽ സാങ്കേതിക തകരാറുകൾ അനുഭവപ്പെടുന്നുണ്ട്.",
        "dberr-again": "കുറച്ച് മിനിട്ടുകൾ കാത്തിരുന്ന് വീണ്ടും തുറക്കുവാൻ ശ്രമിക്കുക.",
        "dberr-info": "(വിവരശേഖരം എടുക്കാൻ പറ്റിയില്ല: $1)",
        "log-action-filter-upload-upload": "പുതിയ അപ്‌ലോഡ്",
        "log-action-filter-upload-overwrite": "പുനർ അപ്‌ലോഡ്",
        "log-action-filter-upload-revert": "തിരിച്ചാക്കൽ",
+       "authmanager-authn-autocreate-failed": "പ്രാദേശിക അംഗത്വം യാന്ത്രികമായി സൃഷ്ടിക്കൽ പരാജയപ്പെട്ടു: $1",
        "authmanager-create-disabled": "അംഗത്വസൃഷ്ടി പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.",
        "authmanager-create-from-login": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കാൻ, ദയവായി കളങ്ങൾ പൂരിപ്പിക്കുക.",
        "authmanager-create-not-in-progress": "സെഷൻ ഡേറ്റ നഷ്ടപ്പെട്ടതിനാൽ അംഗത്വസൃഷ്ടിയുടെ പുരോഗതി നഷ്ടമായിരിക്കുന്നു. ദയവായി  ആദ്യം മുതൽ വീണ്ടും തുടങ്ങുക.",
        "authmanager-create-no-primary": "അംഗത്വസൃഷ്ടിക്ക് നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ഉപയോഗിക്കാനാവില്ല.",
        "authmanager-link-no-primary": "അംഗത്വം ബന്ധിപ്പിക്കാൻ നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ഉപയോഗിക്കാനാവില്ല.",
        "authmanager-link-not-in-progress": "സെഷൻ ഡേറ്റ നഷ്ടപ്പെട്ടതിനാൽ അംഗത്വം ബന്ധിപ്പിക്കലിന്റെ പുരോഗതി നഷ്ടമായിരിക്കുന്നു. ദയവായി  ആദ്യം മുതൽ വീണ്ടും തുടങ്ങുക.",
+       "authmanager-autocreate-noperm": "യാന്ത്രികമായ അംഗത്വസൃഷ്ടി അനുവദിച്ചിട്ടില്ല.",
+       "authmanager-autocreate-exception": "മുമ്പുണ്ടായ പിഴവുകളെത്തുടർന്ന് യാന്ത്രികമായ അംഗത്വസൃഷ്ടി താത്കാലികമായി പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.",
        "authmanager-userdoesnotexist": "\"$1\" എന്ന ഉപയോക്തൃ അം‌ഗത്വം നിലവിലില്ല.",
        "authmanager-userlogin-remembermypassword-help": "രഹസ്യവാക്ക് സെഷൻ കാലയളവിലധികം ഓർത്തുവെക്കണോ.",
        "authmanager-username-help": "രഹസ്യവാക്ക് ഉപയോഗിച്ചുള്ള സാധൂകരണം.",
        "specialmute": "നിശബ്ദമാക്കുക",
        "specialmute-submit": "സ്ഥിരീകരിക്കുക",
        "specialmute-label-mute-email": "ഈ ഉപയോക്താവിൽ നിന്നുമുള്ള ഇമെയിലുകൾ നിശബ്ദമാക്കുക",
+       "specialmute-error-invalid-user": "ആവശ്യപ്പെട്ട ഉപയോക്തൃനാമം കണ്ടെത്താനായില്ല.",
        "specialmute-login-required": "താങ്കളുടെ നിശബ്ദമാക്കൽ ഐച്ഛികങ്ങൾ മാറ്റുന്നതിനായി ദയവായി പ്രവേശിക്കുക.",
        "mute-preferences": "നിശബ്ദമാക്കൽ ഐച്ഛികങ്ങൾ",
        "revid": "നാൾപ്പതിപ്പ് $1",
index 5160c51..e9b8a08 100644 (file)
        "wlheader-enotif": "И-мэйл мэдэгдэл хүчинтэй боллоо.",
        "wlheader-showupdated": "Таны хамгийн сүүлд айлчилснаас хойш өөрчлөгдсөн хуудсууд '''тодоор''' бичигдсэн байгаа",
        "wlnote": "Энд нь {{PLURAL:$2|цагийн|'''$2''' цагийн}} өмнө хамгийн сүүлд хийсэн {{PLURAL:$1|өөрчлөлт| '''$1''' өөрчлөлтүүд}} байна.",
-       "wlshowlast": "Сүүлийн $1 цагийн $2 өдрийн -г харуул",
        "watchlist-options": "Хянаж буй хуудсуудын жагсаалтны сонголтууд",
        "watching": "Хянаж байна...",
        "unwatching": "Хянахаа больж байна...",
        "imgmultipagenext": "дараагийн хуудас →",
        "imgmultigo": "Явах",
        "imgmultigoto": "$1 хуудас руу явах",
-       "ascending_abbrev": "өгсөх",
-       "descending_abbrev": "буурах",
        "table_pager_next": "Дараагийн хуудас",
        "table_pager_prev": "Өмнөх хуудас",
        "table_pager_first": "Эхний хуудас",
index f8504a2..2797654 100644 (file)
        "watch": "ꯌꯦꯡꯕꯥ",
        "unwatch": "ꯌꯦꯡꯗꯕ",
        "watchlist-details": "{{PLURAL:$1|$1 page is|$1 pages are}} ꯗ ꯅꯪꯅ ꯌꯦꯡꯂꯤꯕ ꯄꯥꯔꯦꯡꯁꯤꯡ(plus talk pages).",
-       "wlshowlast": "$1 ꯄꯨꯪ ꯱ $2 ꯅꯨꯃꯤꯠꯁꯤꯡ ꯑꯔꯣꯏꯕꯗꯨ ꯎꯨꯠꯂꯨ",
        "watchlist-options": "ꯌꯦꯡꯂꯤꯕ ꯄꯔꯦꯡ ꯑꯄꯥꯝꯕ ꯈꯟꯅꯕ",
        "enotif_reset": "ꯂꯥꯃꯥꯏꯁꯤꯡ ꯁꯤ ꯂꯣꯏꯅ ꯊꯨꯪꯈꯔꯦ ꯍꯥꯏꯅ ꯍꯧ ꯎ",
        "dellogpage": "ꯀꯛꯊꯠꯄꯥꯒꯤ ꯂꯣꯒ",
index abf3e4e..35b1be2 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 မုက်လိက်ဂှ် နွံ|$1 မုက်လိက်တအ်ဂှ် နွံ}} ပ္ဍဲ စရင်မမင်မဲ မၞး (သီုကဵု မုက်လိက် ဓရီုကျာဂမၠိုင်).",
        "wlheader-showupdated": "မုက်လိက် မပြံင်လှာဲလဝ် ကြဴနူ မၞးမလုပ်ဝေင်လဝ်တုဲတအ်ဂှ် ထ္ၜးလဝ် နကဵု <strong>အက္ခရ်တီုတီု</strong>.",
        "wlnote": "ဗွဲသၟဝ်ဝွံ {{PLURAL:$1|ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ရ၊၊| ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ဂမၠိုင်ရ၊၊ <strong>$1</strong> အပြံင်အလှာဲ}} ပ္ဍဲအခိင် မအောန် နူ {{PLURAL:$2|နာဍဳ|<strong>$2</strong> နာဍဳ}}, ကု $3, $4.",
-       "wlshowlast": "လက္ကရဴအိုတ် $1 နာဍဳ $2 တ္ၚဲ ဂှ် ထ္ၜးညိ",
        "watchlist-hide": "ဗဒန်",
        "watchlist-submit": "ထ္ၜး",
        "wlshowhideminor": "မပလေဝ်ဒါန်လဝ် ညိည",
index 16a2116..8c20f92 100644 (file)
        "wlheader-enotif": "विपत्र अधिसूचना सुविधा शक्य केली.",
        "wlheader-showupdated": "ती पाने, जी आपण दिलेल्या शेवटच्या भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
        "wlnote": "खाली $3, $4 चे गेल्या {{PLURAL:$2|तासातील|<strong>$2</strong> तासांतील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे<strong>$1</strong>बदल दिले आहेत}}.",
-       "wlshowlast": "मागील $1 तास $2 दिवस दाखवा",
        "watchlist-hide": "लपवा",
        "watchlist-submit": "दर्शवा",
        "wlshowtime": "दर्शविण्याचा कालावधी:",
        "imgmultigoto": "$1 पानावर जा",
        "img-lang-default": "(अविचल भाषा)",
        "img-lang-go": "जा",
-       "ascending_abbrev": "चढ",
-       "descending_abbrev": "उतर",
        "table_pager_next": "पुढील पान",
        "table_pager_prev": "मागील पान",
        "table_pager_first": "पहिले पान",
index b9ac31a..6874d1c 100644 (file)
        "wlheader-enotif": "Pemberitahuan melalui e-mel dibolehkan.",
        "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
        "wlnote": "Yang berikut ialah <strong>$1</strong> perubahan terakhir sejak $2 jam yang lalu, sehingga $3, $4.",
-       "wlshowlast": "Tunjukkan $2 hari $1 jam yang lalu",
        "watchlist-hide": "Sorok",
        "wlshowtime": "Tempoh masa untuk dipaparkan:",
        "wlshowhideminor": "suntingan kecil",
        "img-lang-default": "(bahasa azali)",
        "img-lang-info": "Paparkan gambar ini dalam $1. $2",
        "img-lang-go": "Jalan",
-       "ascending_abbrev": "menaik",
-       "descending_abbrev": "menurun",
        "table_pager_next": "Muka berikutnya",
        "table_pager_prev": "Muka sebelumnya",
        "table_pager_first": "Muka pertama",
index 89fc367..c8ec925 100644 (file)
        "wlheader-enotif": "In-notifikazzjoni bl-użu tal-posta elettronika hija attivata.",
        "wlheader-showupdated": "Il-paġni li ġew editjati wara l-aħħar żjara tiegħek qed jiġu murija b'tipa '''ħoxna'''",
        "wlnote": "Hawn taħt hawn {{PLURAL:$1|l-aħħar modifika|l-aħħar '''$1''' modifiki}} fl-aħħar {{PLURAL:$2|siegħa|'''$2''' siegħat}}, sal-$3, fil-$4.",
-       "wlshowlast": "Uri l-aħħar $1 siegħat $2 ġranet",
        "watchlist-options": "Opzjonijiet tal-lista ta' osservazzjoni",
        "watching": "Imsegwi...",
        "unwatching": "Mhux osservat aktar...",
        "img-lang-default": "(lingwa awtomatika)",
        "img-lang-info": "Aqleb din l-istampa f'$1. $2",
        "img-lang-go": "Mur",
-       "ascending_abbrev": "axx",
-       "descending_abbrev": "dixx",
        "table_pager_next": "Il-paġna li jmiss",
        "table_pager_prev": "Il-paġna ta' qabel",
        "table_pager_first": "L-ewwel paġna",
index ccf3895..861e85b 100644 (file)
        "wlheader-enotif": "La notificaçon por correio eiletrónico stá atiba.",
        "wlheader-showupdated": "Las páiginas altaradas zde la redadeira beç que las besitou aparecen çtacadas an <strong>negrito</strong>.",
        "wlnote": "A seguir {{PLURAL:$1|stá la redadeira altaraçon ocorrida|stan las redadeiras <strong>$1</strong> altaraçones ocorridas}} {{PLURAL:$2|na redadeira hora|nas redadeiras<strong>$2</strong> horas}}, anté $3, $4.",
-       "wlshowlast": "Ber redadeiras $1 horas $2 dies",
        "watchlist-submit": "Amostrar",
        "watchlist-options": "Oupçones de la lhista de páiginas begiadas",
        "watching": "A begiar...",
        "imgmultipagenext": "páigina seguinte →",
        "imgmultigo": "Bota!",
        "imgmultigoto": "Ir pa páigina $1",
-       "ascending_abbrev": "chubir",
-       "descending_abbrev": "decer",
        "table_pager_next": "Páigina seguinte",
        "table_pager_prev": "Páigina atrasada",
        "table_pager_first": "Purmeira páigina",
index 101ac77..b6fa2af 100644 (file)
        "wlheader-enotif": "အီးမေးလ် အသိပေးချက်ကို ဖွင့်ထားသည်။",
        "wlheader-showupdated": "သင် နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို <strong>စာလုံးမဲ</strong> ဖြင့် ပြသထားသည်",
        "wlnote": "အောက်ပါတို့သည် $3၊ $4 အထိ နောက်ဆုံး {{PLURAL:$2|နာရီ|<strong>$2</strong> နာရီ}}အတွင်း {{PLURAL:$1|နောက်ဆုံးပြောင်းလဲချက် တစ်ခု|နောက်ဆုံးပြောင်းလဲချက်များ <strong>$1</strong> ခု}} ဖြစ်သည်။",
-       "wlshowlast": "နောက်ဆုံး $1 နာရီ $2 ရက်  ကိုပြရန်",
        "watchlist-hide": "ဝှက်",
        "watchlist-submit": "ပြသရန်",
        "wlshowtime": "ပြသပေးရမည့် အချိန်ကာလ:",
        "imgmultigoto": "စာမျက်နှာ $1 ကို သွားရန်",
        "img-lang-default": "(ပင်မ ဘာသာစကား)",
        "img-lang-go": "သွားပါ",
-       "ascending_abbrev": "ငယ်စဉ်ကြီးလိုက်",
-       "descending_abbrev": "ကြီးစဉ်ငယ်လိုက်",
        "table_pager_next": "နောက်စာမျက်နှာ",
        "table_pager_prev": "ပြီးခဲ့သော စာမျက်နှာ",
        "table_pager_first": "ပထမဆုံး စာမျက်နှာ",
index 940a806..03397b1 100644 (file)
        "unwatchthispage": "Лоткамс ванстомадонзо",
        "notvisiblerev": "Лиякстомтомась нардазь",
        "watchlist-details": "Ванома лемрисьмесэть (кортнема лопатнесэяк) {{PLURAL:$1|$1 лопа|$1 лопат}}.",
-       "wlshowlast": "Невтемс меельце $1 цяст $2 чить",
        "wlshowhideanons": "лемтеме теицят",
        "watchlist-options": "Ванома потмонь аравтнемат",
        "watching": "Ванома...",
index 85566cd..64627e7 100644 (file)
        "watchthispage": "Tictlachiyāz inīn zāzanilli",
        "unwatch": "Ahmo titlachiyaz",
        "watchlist-details": "Oncah {{PLURAL:$1|$1 tlahcuilolamatl|$1 tlahcuilolamameh}} ipan motlachiyaliz (oc tlahcuilolamatl iteixnamiquiliz).",
-       "wlshowlast": "Tiquittaz itlapatlaliz itech $1 horas, $2 tonaltin",
        "watchlist-submit": "Monextiz",
        "watching": "Tlachiyacah...",
        "unwatching": "Ahtlachiyacah...",
        "imgmultipagenext": "niman tlahcuilolamatl →",
        "imgmultigo": "¡Ma xiyauh!",
        "imgmultigoto": "Yaliztica ihuicpa tlahtolamatl $1",
-       "ascending_abbrev": "quetza",
-       "descending_abbrev": "temoa",
        "table_pager_next": "Niman tlahcuilolamatl",
        "table_pager_prev": "Achto tlahcuilolamatl",
        "table_pager_first": "Achtopa tlahcuilolamatl",
index d488881..05bc973 100644 (file)
        "unwatchthispage": "Mài koh kàm-sī",
        "watchlist-details": "Kàm-sī-toaⁿ ū {{PLURAL:$1|$1 ia̍h|$1 ia̍h}}, thó-lūn-ia̍h bô sǹg chāi-lāi.",
        "wlnote": "$3 $4: Ē-kha sī <strong>$2</strong> tiám-cheng í-lāi siōng sin ê <strong>$1</strong> ê kái-piàn.",
-       "wlshowlast": "Hián-sī chêng $1 tiám-cheng $2 ji̍t",
        "deletepage": "Thâi ia̍h",
        "confirm": "Khak-tēng",
        "excontent": "lōe-iông sī: '$1'",
index 11f5409..dd6aa2e 100644 (file)
        "viewsource-title": "Vere surgente 'e $1",
        "actionthrottled": "Azione ritardata",
        "actionthrottledtext": "Comme mesùra anti-abuse, site lemmetato 'a ffà st'azione troppe vote dint'a nu curto spazio 'e tiempo, e mo stu lèmmeto l'avite superato.\nPe piacere pruvate n'ata vota dint'a quacche minuto.",
-       "protectedpagetext": "Sta paggena s'è prutetta pe' ne bloccà 'a mudifeca o n'ata azione.",
+       "protectedpagetext": "Sta paggena s'è prutetta pe ne ntuppà 'o càgno o quacche ata azione.",
        "viewsourcetext": "Putite vedé e copià 'o codece surgiva 'e sta paggena.",
        "viewyourtext": "Putite vedé e copià 'o codice surgiva d' 'e <strong>cagnamiénte vuoste</strong> a sta paggena.",
        "protectedinterface": "Sta paggena nce appruviggióna 'e n'interfaccia testo p' 'o software dint'a sta wiki, e s'è prutetta pe' nce scanzà 'e cocch'abbuso.\nSi se buò azzeccà o cagnà traduzzione ncopp'a tutte 'e wiki, pe piacere ausate [https://translatewiki.net/ translatewiki.net], 'o pruggetto Mediawiki p'a localizzaziona dint'a l'ate llengue",
        "logout": "Jèsce",
        "userlogout": "Jèsce",
        "notloggedin": "Acciesso nun affettuato",
-       "userlogin-noaccount": "Nun tenite ancora n'acciesso?",
+       "userlogin-noaccount": "Nun tenite perzine n'acciesso?",
        "userlogin-joinproject": "Facite 'o riggistro ncopp'a {{SITENAME}}",
        "createaccount": "Crèa nu cunto nuovo",
        "userlogin-resetpassword-link": "Te sì scurdat' 'a password?",
        "usercssyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o CSS nuovo apprimma d' 'o sarvà.",
        "userjsonyoucanpreview": "<strong>Cunziglio:</strong> premme 'o buttone \"{{int:showpreview}}\" pe' pruvà 'o JSON nuovo apprimma d' 'o sarvà.",
        "userjsyoucanpreview": "'''Cunziglio:''' spremme 'o buttone 'Vide anteprimma' pe' pruvà 'o JavaScript nuovo apprimma d' 'o sarvà.",
-       "usercsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS perzunale. 'E cagnamiente nun so' state ancora sarvate!'''",
+       "usercsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS perzunale. 'E cagnamiente nun so' state sarvate perzì!'''",
        "userjsonpreview": "<strong>Arricuordate ca chest'è sulamente n'anteprimma p' 'o JSON perzunale. 'E cagnamiente nun so' state ancora sarvate!</strong>",
-       "userjspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o JavaScript perzunale. 'E cagnamiente nun so' state ancora sarvate!'''",
-       "sitecsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS. 'E cagnamiente nun so' state ancora sarvate!'''",
+       "userjspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o JavaScript perzunale. 'E cagnamiente nun so' state sarvate perzì!'''",
+       "sitecsspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o CSS. 'E cagnamiente nun so' state sarvate perzì!'''",
        "sitejsonpreview": "<strong>Arricuordate ca chest'è sulamente n'anteprimma d' 'a configurazzione d' 'o JSON. 'E cagnamiente nun so' state ancora sarvate!</strong>",
-       "sitejspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o codece JavaScript. 'E cagnamiente nun so' state ancora sarvate!'''",
+       "sitejspreview": "'''Arricuordate ca chest'è sulamente n'anteprimma p' 'o codece JavaScript. 'E cagnamiente nun so' state sarvate perzì!'''",
        "userinvalidconfigtitle": "<strong>Attenziò:</strong> Nun esiste nisciuna skin c' 'o nomme \"$1\". Vide ch' 'e paggene .css e .js personalezzate teneno nu titolo ca minuscola, p'esempio {{ns:user}}:Esempio/vector.css (e no {{ns:user}}:Esempio/Vector.css).",
        "updated": "(Agghiurnato)",
        "note": "'''Nota:'''",
-       "previewnote": "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena nun songo ancora sarvate!'''",
+       "previewnote": "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena nun so' state sarvate perzì!'''",
        "continue-editing": "Trasite int'a l'area 'e modifica",
        "previewconflict": "L'anteprimma currisponne a 'o testo presente dint'a cascia 'e modifica ccà ncoppa e rappresentasse 'a paggena comme cumpare si sciglite 'e Sarvà ind'a stu mumento.",
-       "session_fail_preview": "Scusate! nun è possibbile prucessà 'o cagnamiento pecché se so' sperdut' 'e date d' 'a sessione.\n\nPuò darse ca d' 'a parta vosta nun eravate trasute.<strong>Pe' piacere cuntrullate ca site ancora dinto e tentate n'ata vota</strong>.\nSi chesto nun funziunasse ancora, tentate a ve [[Special:UserLogout|n'ascì]] e a trasì n'ata vota, e cuntrullate si 'o navigatóre vuosto tenisse 'e cookies appicciàte.",
+       "session_fail_preview": "Scusate! nun è possibbile prucessà 'o cagnamiento pecché se so' sperdut' 'e date d' 'a sessione.\n\nPuò essere ca d' 'a parta vosta nun stavate trasute.<strong>Pe piacere cuntrullate ca state ancora dinto e pruate n'ata vota</strong>.\nSi cchesto nun funziunasse porzì, pruate a ve [[Special:UserLogout|n'ascì]] e a trasì n'ata vota, e cuntrullate si 'o navigatóre vuosto tenisse 'e cookies appicciàte.",
        "session_fail_preview_html": "Scusate! Nun è possibbile prucessà 'o cagnamiento pecché se so' sperdut' 'e date d' 'a sessione.\nProva n'ata vota.\n\n<em>Siccome dint' 'o {{SITENAME}} è abilitato l'uso 'e l'HTML cruro, 'o buttone d'anteprimma nun è abbiàto comme misura 'e sicurezza annanza cocch'attacco JavaScript</em>\n\n<strong>Si chest'era nu tentativo legittimo 'e cagnamiento, tentate n'ata vota.</strong>\nSi nun funziunass'ancora, putite pruvà a ve [[Special:UserLogout|n'ascì]] e a trasì n'ata vota, e cuntrullate si 'o navigatóre vuosto premmettesse 'e cookies ca veneno 'a stu sito.",
        "token_suffix_mismatch": "'''Stu cagnamiento nun è stato sarvato pecché 'o client ave mmustato nu sbaglio dint'o scrivere d' 'e carattere d' 'a punteggiatura token. Pe luvà na possibbile corruzione d' 'o testo dint'a paggena, s'è rifiutat' 'a modifeca.\n\nSta situazione se può truvà, quanno staje ausanno nu servizio 'e proxy anonime via web cu d' 'e bug.'''",
        "edit_form_incomplete": "'''Cocche parte d' 'o modulo 'e cagnamiento nun ha arrivato a 'o server; cuntrolla ch' 'e cagnamiente songo intatte e prova n'ata vota.'''",
        "last": "prec",
        "page_first": "primma",
        "page_last": "úrdema",
-       "histlegend": "Confronto nfra verziune: sciglite 'e casciulelle c'attoccassero a 'e verziune che vulite cunfruntà e spremmite Invio o pure 'o buttóne ccà abbascio.\n\nLiggenda: '''({{int:cur}})''' = differenze c' 'a verzione 'e mmò, '''({{int:last}})''' = differenze c' 'a verzione 'e primma, '''{{int:minoreditletter}}''' = cagnamiento minore",
-       "history-fieldset-title": "Circa pe' verziune",
+       "histlegend": "Confronto nfra verziune: sciglite 'e casciulelle c'attoccassero a 'e verziune che vulite cunfruntà e spremmite Invio o pure 'o buttóne ccà abbascio.\n\nLiggenda: '''({{int:cur}})''' = differenze c’'a verzione 'e mmò, '''({{int:last}})''' = differenze c’'a verzione 'e primma, '''{{int:minoreditletter}}''' = cagnamiénto piccerillo",
+       "history-fieldset-title": "Truova pe verzione",
        "history-show-deleted": "Sulo 'e verziune scancellate",
        "histfirst": "primma",
        "histlast": "urdema",
        "revdelete-text-text": "'E verziune scancellate cumpareno ancora dint' 'a cronologgia d' 'a paggena, ma na parte d' 'o cuntenuto lloro nun sarrà a disposizione a 'o pubbreco.",
        "revdelete-text-file": "'E verziune 'e file scancellate cumpareno ancora dint' 'a cronologgia d' 'o file, ma parte d' 'o cuntenuto lloro nun sarrà a disposizione a 'o pubbreco.",
        "logdelete-text": "'E fatte 'e riggistro scancellate cumpareno ancora dint' 'a cronologgia 'e riggistro, ma na parte d' 'o cuntenuto lloro nun sarrà a disposizione a 'o pubbreco.",
-       "revdelete-text-others": "Ll'at'ammenistrature puterranno ancora trasì e arrepiglià 'e cuntenute annascunnute, si nun so' state mpustate cchiù restrizziune.",
+       "revdelete-text-others": "Ll'at'ammenistrature putarranno trasì perzì e arrepiglià 'e cuntenute annascunnute, si nun so' state mpustate ate restrizziune.",
        "revdelete-confirm": "Pe ppiacere cunfermate ca overo vulite ffà chisto, ca cunuscite 'e cunseguenze, e ca state facenno chisto rispettanno 'e [[{{MediaWiki:Policy-url}}|linee guida]].",
        "revdelete-suppress-text": "Sti luvamiente hana essere fatte '''unicamente''' dint' 'e situaziune ccà abbascio:\n* nfurmaziune potenzialmente diffamatorie\n* date perzunale inopportune\n*: ''indirizze, nummeri 'e telefono, codece fiscale, ecc.''",
        "revdelete-legend": "Miette 'e limmete 'e visibilità",
        "filerevert-identical": "'A verziona 'e mo d' 'o file è già eguale eguale a chella scigliuta.",
        "filedelete": "Scancella $1",
        "filedelete-legend": "Scancella 'o file",
-       "filedelete-intro": "State pe' scancellà 'o file '''[[Media:$1|$1]]''' cu tutta 'a cronologgia 'e chisto.",
+       "filedelete-intro": "State pe scancellà 'o file '''[[Media:$1|$1]]''' cu tutta 'a cronologgia soia.",
        "filedelete-intro-old": "State a scancellà 'a verziona 'e '''[[Media:$1|$1]]''' d' 'o [$4 $3, $2].",
        "filedelete-comment": "Mutivo:",
        "filedelete-submit": "Scancèlla",
        "unusedtemplates": "Template ca nun se song'ausate",
        "unusedtemplatestext": "Sta paggena alenca tutt' 'e paggene int'a 'o namespace {{ns:template}} ca nun se songo nzertàte dint'a n'ata paggena.\nArricuòrdete 'e cuntrullà l'ati cullegamiente a 'e template apprimm' 'e scancellà.",
        "unusedtemplateswlh": "ati cullegamiente",
-       "randompage": "Na paggena qualsiase",
+       "randompage": "Na paggena qualonca",
        "randompage-nopages": "Nun gè song paggene {{PLURAL:$2|dint'ô seguente namespace|dint'ê seguenti namespace}}: $1.",
        "randomincategory": "Paggena a uocchio dint' 'a categurìa",
        "randomincategory-invalidcategory": "\"$1\" nun è nu nomme 'e categurìa bbuono.",
        "statistics-pages-desc": "Tutt' 'e paggene dint'a wiki, mettenno 'e chiacchieriate, redirezionamiente, ecc.",
        "statistics-files": "File carrecate",
        "statistics-edits": "Cagnamiente d' 'e paggene 'a che {{SITENAME}} s'è accumminciata",
-       "statistics-edits-average": "Cagnamiente medie pe' paggena",
+       "statistics-edits-average": "Cagni medie pe paggena",
        "statistics-users": "Utente riggistrate",
        "statistics-users-active": "Utente attive",
        "statistics-users-active-desc": "Utente c'hanno fatto coccosa dint' 'a {{PLURAL:$1|l'urdemo juorno|l'urdeme $1 juorne}}",
        "move": "Mòve",
        "movethispage": "Mòve sta paggena",
        "unusedimagestext": "'E file ccà abbascio esisteno, ma nun songo appennute dint' 'a nisciuna paggena.\nPe' piacere vedite ca n'ati site ncopp' 'a ll'Internet putessero cullegà cu nu file direttamente cu l'URL, picciò vedite ca putessero stà dint'a sta lista ancora tenenno nu cullegamiento diretto.",
-       "unusedcategoriestext": "'E categurìe ccà abbascio esisteno, ancora ch' 'e categurìe o l'ati paggene nun l'aùsano.",
+       "unusedcategoriestext": "'E categurìe ccà abbascio esisteno, simbè ca nun nce stanne categurìe o ati paggene ca l'aùsano.",
        "notargettitle": "Nisciuna destinazione",
        "notargettext": "Nun avete specificato na paggena o n'utente 'e destinazione pe' putè fa sta operazione.",
        "nopagetitle": "Nisciuna paggena 'e destinazione",
        "wlheader-enotif": "'A funzione 'e notifiche e-mail è appicciata.",
        "wlheader-showupdated": "* 'E paggene cca so' state cagnate a l'urdema visita avevano so' nzignate ccà 'n '''grassetto'''.",
        "wlnote": "Ccà abbascio {{PLURAL:$1|è elencato 'o cagnamiento cchiù ricente|songo elencate 'e <strong>$1</strong> cagnamiente cchiù recente}} {{PLURAL:$2|int'a ll'urdema ora|int' 'e ll'urdeme <strong>$2</strong> ore}}; 'e date songo agghiurnate 'o $3, $4.",
-       "wlshowlast": "Mmusta ll'urdeme $1 ore $2 ghiuorne",
        "watchlist-hide": "Annascunne",
        "watchlist-submit": "Faje vedé",
        "wlshowtime": "Periodo 'e tiempo a mmustà:",
        "exbeforeblank": "'O cuntenuto apprimm' 'a ll'arrevacamento era: '$1'",
        "delete-confirm": "Scancella \"$1\"",
        "delete-legend": "Scancella",
-       "historywarning": "'''Attenzione:''' 'A paggena ca state pe' scancellà tene na cronologgia cu $1 {{PLURAL:$1|verzione|verziune}}:",
+       "historywarning": "'''Attenzione:''' 'A paggena ca state pe scancellà tene na cronologgia cu $1 {{PLURAL:$1|verzione|verziune}}:",
        "historyaction-submit": "Faje vedé",
-       "confirmdeletetext": "Vedite bbuono, vedite ca state a scancellà na paggena nziem' 'a tutt' 'a cronologgia.\nPe' piacere cunfermate si overo vulite fà cchesto, ca ve site fatto/a capace 'e l'effette 'e st'azione e ca chest'azione rispetta 'e [[{{MediaWiki:Policy-url}}|reole 'e scancellamiento]].",
+       "confirmdeletetext": "Vedite bbuono, vedite ca state a scancellà na paggena nziem' 'a tutt' 'a cronologgia soia.\nPe piacere cunfermate si overo vulite fà cchesto, ca ve site fatto/a capace 'e l'effette 'e st'azione e ca chest'azione rispetta 'e [[{{MediaWiki:Policy-url}}|reole 'e scancellamiento]].",
        "actioncomplete": "Azzione fernuta",
        "actionfailed": "Aziona sfalluta",
        "deletedtext": "Qauccheruno ha scancellata 'a paggena \"$1\".  Addumannà 'o $2 pe na lista d\"e ppaggene scancellate urdemamente.",
        "delete-toobig": "Sta paggena tene na storia 'e cagnamiente troppo longa, ncopp'a $1 {{PLURAL:$1|verzione|verziune}}.\n'O scancellamiento 'e chiste paggene è stato ristretto pe nce 'e putè astipà si ce sta cocche probblema dint' 'o database 'e {{SITENAME}}.",
        "delete-warning-toobig": "Sta paggena tene na cronologgia troppo longa, ncopp'a $1 {{PLURAL:$1|verzione|verziune}}.\nScancellannole se putesse crià troppo burdello ncopp' 'e operaziune 'e database dint'a {{SITENAME}};\niate cuoncio cuoncio.",
        "deleteprotected": "Nun putite scancellà sta paggena pecché è stata prutetta.",
-       "deleting-backlinks-warning": "<strong>Attenzione:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|ati paggene]] cunteneno cullegamiente o paggene appennute â n'ata paggena ca state pe' scancellà.",
+       "deleting-backlinks-warning": "<strong>Attenzione:</strong>\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|ati paggene]] cunteneno cullegamiente o paggene appennute â n'ata paggena ca state pe scancellà.",
        "deleting-subpages-warning": "<strong>Accuorto:</strong> 'A paggena ca staie pe scancellà tene  [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|na sottopaggena|$1 sottopaggene|51=cchiù 'e 50 sottopaggene}}]].",
        "rollback": "Ausa na revizione 'e primma",
        "rollback-confirmation-yes": "Sfàjere",
        "revertpage-nouser": "Annullate 'e cagnamiente 'e n'utente annascunnuto, è stata ripigliata ll'urdema verzione 'e {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Cagnamiente annullate 'a {{GENDER:$3|$1}};\ns'è turnato arreto a l'urdema verzione 'e {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Sessione fallita",
-       "sessionfailure": "Pare ca stanno probbleme cu 'a sessiona toja;\nst'azione è stata fermata pe' precauzione annanz' 'e cavall' 'e troia;\nPe' piacere turnate arreto, carrecate n'ata vota 'a paggena pe pruvate n'ata vota.",
+       "sessionfailure": "Pare ca stanno probbleme cu 'a sessiona toja;\nst'azione è stata fremmata pe precauzione annanz' 'e cavall' 'e troia;\nPe piacere mannate n'ata vota 'o modulo.",
        "changecontentmodel": "Cagna 'o mudello 'e cuntenute 'e na paggena",
        "changecontentmodel-legend": "Cagna 'o mudello 'e cuntenute",
        "changecontentmodel-title-label": "Titulo d\"a paggena",
        "img-lang-default": "(lengua predefinita)",
        "img-lang-info": "Fà addeventà sta paggena comm'a $1. $2",
        "img-lang-go": "Vaje",
-       "ascending_abbrev": "crisc",
-       "descending_abbrev": "dicrisc",
        "table_pager_next": "Paggena successiva",
        "table_pager_prev": "Paggena 'e primma",
        "table_pager_first": "Primma paggena",
        "tags-create-warnings-above": "{{PLURAL:$2|Chist'avviso s'è truvato|Chist'avvise se so' truvate}} pe' tramente ca se steva a crià 'o tag \"$1\":",
        "tags-create-warnings-below": "Vulite cuntinuà a crià 'o tag?",
        "tags-delete-title": "Scancella tag",
-       "tags-delete-explanation-initial": "State pe' scancellà 'o tag \"$1\" d' 'o database.",
+       "tags-delete-explanation-initial": "State pe scancellà 'o tag \"$1\" d' 'o database.",
        "tags-delete-explanation-in-use": "Sarrà luvato d' 'o {{PLURAL:$2|$2 verziona o d' 'o riggistro|tutt' 'e verziune $2 e/o 'e nutarelle int' 'o riggistro}} addò stesse azzeccato.",
        "tags-delete-explanation-warning": "St'aziona è <strong>irreversibbele</strong> e <strong>nun se pò turnà arreto</strong>, pure 'a ll'ammenistrature d' 'o database. Faciteve capace ca stu tag è chillu ca vulite scancellà.",
        "tags-delete-explanation-active": "<strong>'O tag \"$1\" è ancora attivo, e sarrà apprecato int' 'o futuro.</strong> Pe' fernì cu st'attività, jate, a lloco addò 'o tag s'è apprecato, e stutate llànno.",
        "tags-delete-not-found": "'O tag $1 nun esiste.",
        "tags-delete-too-many-uses": "'O tag \"$1\" è apprecato a cchiù 'e $2 {{PLURAL:$2|verziona|verziune}}, cosa ca vulesse dicere ca nun se ò scancellà.",
        "tags-delete-warnings-after-delete": "'O tag \"$1\" s'è scancellato, ma {{PLURAL:$2|s'è ncuntrato ll'avviso|se songhe ncuntrate ll'avise}} ccà:",
-       "tags-delete-no-permission": "Nun tenite 'o permesso pe' scancellà 'e tag 'e cagnamiente.",
+       "tags-delete-no-permission": "Nun tenite 'o permesso 'e scancellà 'e ttag 'e cagnamiento.",
        "tags-activate-title": "Appiccia 'o tag",
        "tags-activate-question": "Vuje state p'appiccià 'o tag \"$1\".",
        "tags-activate-reason": "Mutivo:",
index b87aa0b..355f391 100644 (file)
        "wlheader-enotif": "E-postvarsling er slått på.",
        "wlheader-showupdated": "Sider som har blitt endret siden du besøkte dem sist vises med '''fet skrift'''.",
        "wlnote": "Nedenfor er {{PLURAL:$1|den siste endringen|de siste <strong>$1</strong> endringene}} {{PLURAL:$2|den siste timen|de siste <strong>$2</strong> timene}}, per $3 kl. $4",
-       "wlshowlast": "Vis siste $1 timer $2 dager",
        "watchlist-hide": "Skjul",
        "watchlist-submit": "Vis",
        "wlshowtime": "Tidsperiode som skal vises:",
        "img-lang-default": "(standardspråk)",
        "img-lang-info": "Vis dette bildet i $1.$2",
        "img-lang-go": "Start",
-       "ascending_abbrev": "stig.",
-       "descending_abbrev": "synk.",
        "table_pager_next": "Neste side",
        "table_pager_prev": "Forrige side",
        "table_pager_first": "Første side",
index d186078..1019520 100644 (file)
        "monday": "måndag",
        "tuesday": "dinsdag",
        "wednesday": "woonsdag",
-       "thursday": "donderdag",
+       "thursday": "dunnerdag",
        "friday": "vrydag",
        "saturday": "såterdag",
-       "sun": "zun",
-       "mon": "mao",
-       "tue": "die",
+       "sun": "n",
+       "mon": "mån",
+       "tue": "din",
        "wed": "woo",
-       "thu": "don",
-       "fri": "vrie",
-       "sat": "zao",
+       "thu": "dun",
+       "fri": "vry",
+       "sat": "såt",
        "january": "januåri",
        "february": "februåri",
        "march": "määrt",
@@ -95,7 +95,7 @@
        "november": "november",
        "december": "december",
        "january-gen": "jannewaori",
-       "february-gen": "febrewaori",
+       "february-gen": "febrri",
        "march-gen": "meert",
        "april-gen": "april",
        "may-gen": "mei",
        "october-date": "$1 oktober",
        "november-date": "$1 november",
        "december-date": "$1 desember",
-       "pagecategories": "{{PLURAL:$1|Kategorie|Kategorieën}}",
+       "pagecategories": "{{PLURAL:$1|Kategory|Kategoryen}}",
        "category_header": "Artikels in kategorie $1",
        "subcategories": "Subkategorieën",
        "category-media-header": "Media in kategorie \"$1\"",
        "category-empty": "''In disse kategoria staon op t moment nog gien artikels of media.''",
-       "hidden-categories": "Verbörgen {{PLURAL:$1|kategorie|kategorieën}}",
+       "hidden-categories": "Verbörgen {{PLURAL:$1|kategory|kategoryen}}",
        "hidden-category-category": "Verbörgen kategorieën",
        "category-subcat-count": "{{PLURAL:$2|Disse kategorie hef de volgende subkategorie.|Disse kategorie hef de volgende {{PLURAL:$1|subkategorie|$1 subkategorieën}}, van in totaal $2.}}",
        "category-subcat-count-limited": "Disse kategorie hef de volgende {{PLURAL:$1|subkategorie|$1 subkategorieën}}.",
        "mypage": "Gebrukerszied",
        "mytalk": "Myn oaverleg",
        "anontalk": "Oaverleg",
-       "navigation": "Navigasie",
+       "navigation": "Navigaty",
        "and": "&#32;en",
        "faq": "Vragen die vake esteld wörden",
        "actions": "Haandeling",
-       "namespaces": "Naamrüümdes",
-       "variants": "Variaanten",
-       "navigation-heading": "Navigasiemenu",
+       "namespaces": "Naamruumdes",
+       "variants": "Varianten",
+       "navigation-heading": "Navigatymenu",
        "errorpagetitle": "Foutmelding",
        "returnto": "Weerumme naor $1.",
        "tagline": "Van {{SITENAME}}",
-       "help": "Hulpe",
-       "search": "Zeuken",
-       "searchbutton": "Zeuken",
+       "help": "Hülpe",
+       "search": "ken",
+       "searchbutton": "ken",
        "go": "Artikel",
        "searcharticle": "Artikel",
        "history": "Geschiedenisse",
-       "history_short": "Geschiedenisse",
+       "history_short": "Geskydenisse",
        "updatedmarker": "bie-ewörken sinds mien leste bezeuk",
-       "printableversion": "Afdrukbåre versy",
+       "printableversion": "Afdrükbåre versy",
        "permalink": "Vaste verwysing",
        "print": "Aofdrokken",
        "view": "Leasen",
        "specialpage": "Speciale syde",
        "personaltools": "Persoonlike instellingen",
        "talk": "Oaverleg",
-       "views": "Weergaven",
+       "views": "Weadergåven",
        "toolbox": "Hülpmiddels",
        "tool-link-userrights": "{{GENDER:$1|Gebrukersgruppen}} wysigen",
        "tool-link-emailuser": "Disse {{GENDER:$1|gebruker}} een bericht stüren",
        "viewhelppage": "Hulpzied bekieken",
        "categorypage": "Kategoriezied bekieken",
        "viewtalkpage": "Bekiek overlegzied",
-       "otherlanguages": "Andere talen",
-       "redirectedfrom": "(deurestuurd vanaof \"$1\")",
+       "otherlanguages": "Andere språken",
+       "redirectedfrom": "(döärstüürd vanaf \"$1\")",
        "redirectpagesub": "Deurverwieszied",
        "redirectto": "Deurverwiezen naor:",
-       "lastmodifiedat": "Disse zied is t lest ewiezigd op $1 um $2.",
+       "lastmodifiedat": "Disse syde is et lätst wysigd up $1 üm $2.",
        "viewcount": "Disse zied is $1 {{PLURAL:$1|keer|keer}} bekeken.",
        "protectedpage": "Beveiligden zied",
-       "jumpto": "Gao naor:",
-       "jumptonavigation": "navigasie",
-       "jumptosearch": "zeuk",
+       "jumpto": "Gå nå:",
+       "jumptonavigation": "navigaty",
+       "jumptosearch": "söök",
        "view-pool-error": "De servers bin op heden overbelast.\nTe veule gebrukers proberen disse zied te bekieken.\nWacht effen veurda'j opniej toegang proberen te kriegen tot disse zied.\n\n$1",
        "generic-pool-error": "De servers bin op heden overbelast.\nTe veule gebrukers proberen disse zied te bekieken.\nWacht effen veurda'j opniej toegang proberen te kriegen tot disse zied.",
        "pool-timeout": "De maximumwachttied veur databankvergrendeling is verleupen.",
        "pool-queuefull": "De wachtrie van de poel is vol",
        "pool-errorunknown": "Onbekende fout",
        "pool-servererror": "De dienst \"pool counter\" is niet beschikbaor ($1).",
-       "aboutsite": "Over {{SITENAME}}",
+       "aboutsite": "Oaver {{SITENAME}}",
        "aboutpage": "Project:Info",
        "copyright": "De inhoud is beschikbaor onder de $1 as der niks aanders an-egeven is.",
        "copyrightpage": "{{ns:project}}:Auteursrechten",
-       "currentevents": "In t niejs",
-       "currentevents-url": "Project:In t niejs",
-       "disclaimers": "Veurbehold",
-       "disclaimerpage": "Project:Veurbehoud",
+       "currentevents": "In et nys",
+       "currentevents-url": "Project:In et nys",
+       "disclaimers": "Vöärbehold",
+       "disclaimerpage": "Project:Vöärbehold",
        "edithelp": "Hulpe mit bewarken",
        "helppage-top-gethelp": "Hulpe",
        "mainpage": "Vöärblad",
        "mainpage-description": "Vöärblad",
        "policy-url": "Project:Beleid",
-       "portal": "Gebrukersportål",
-       "portal-url": "Project:Gebrukersportaol",
-       "privacy": "Gegevensbeleid",
-       "privacypage": "Project:Gegevensbeleid",
+       "portal": "Gemeynskapsportaal",
+       "portal-url": "Project:Gemeynskapsportaal",
+       "privacy": "Gegeavensbeleid",
+       "privacypage": "Project:Gegeavensbeleid",
        "badaccess": "Gien toestemming",
        "badaccess-group0": "Je hebben gien toestemming um disse aksie uut te voeren.",
        "badaccess-groups": "Disse aksie kan allinnig uutevoerd wörden deur gebrukers uut {{PLURAL:$2|de groep|één van de groepen}}: $1.",
        "editold": "bewark",
        "viewsourceold": "brontekste bekyken",
        "editlink": "bewark",
-       "viewsourcelink": "brontekste bekyken",
+       "viewsourcelink": "brontekst bekyken",
        "editsectionhint": "Bewarkingsveld: $1",
        "toc": "Inhold",
        "showtoc": "Bekieken",
        "site-atom-feed": "$1 Atom-voer",
        "page-rss-feed": "\"$1\" RSS-voer",
        "page-atom-feed": "\"$1\" Atom-voer",
-       "red-link-title": "$1 (zied besteet nog niet)",
+       "red-link-title": "$1 (syde besteyt noch neet)",
        "sort-descending": "Aoflopend sorteren",
        "sort-ascending": "Oplopend sorteren",
        "nstab-main": "Artikel",
        "nohistory": "Der bin gien eerdere versies van disse zied.",
        "currentrev": "Leste versie",
        "currentrev-asof": "Leste versie van $1",
-       "revisionasof": "Versie op $1",
+       "revisionasof": "Versy up $1",
        "revision-info": "Versie op $1 van {{GENDER:$6|$2}}$7",
-       "previousrevision": "&larr; eerdere versie",
+       "previousrevision": "&larr; eyrere versy",
        "nextrevision": "niejere versie &rarr;",
        "currentrevisionlink": "versie zo as t noen is",
        "cur": "noen",
        "lineno": "Regel $1:",
        "compareselectedversions": "Vergeliek de ekeuzen versies",
        "showhideselectedversions": "Ekeuzen versies bekieken/verbargen",
-       "editundo": "weerummedreien",
+       "editundo": "weaderümmedraien",
        "diff-empty": "(Gien verschil)",
        "diff-multi-sameuser": "({{PLURAL:$1|n Tussenliggende versie|$1 tussenliggende versies}} deur de zelfde gebruker is verbörgen)",
        "diff-multi-manyusers": "($1 tussenliggende {{PLURAL:$1|versie|versies}} deur meer as $2 {{PLURAL:$2|gebruker|gebrukers}} niet weeregeven)",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.\n\nDit kömp meestentieds deur t volgen van n verouwerde verwiezing naor n zied die vortedaon is.\nWaorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].",
-       "searchresults": "Zeukresultaoten",
-       "searchresults-title": "Zeukresultaoten veur \"$1\"",
+       "searchresults": "Söökresultaten",
+       "searchresults-title": "Söökresultaten vöär \"$1\"",
        "titlematches": "Overeenkomst mit t onderwarp",
        "textmatches": "Overeenkomst mit teksten",
        "notextmatches": "Gien overeenstemming",
        "nextn": "volgende {{PLURAL:$1|$1}}",
        "prevn-title": "{{PLURAL:$1|Veurig resultaot|Veurige $1 resultaoten}}",
        "nextn-title": "{{PLURAL:$1|Volgend resultaot|Volgende $1 resultaoten}}",
-       "shown-title": "Laot $1 {{PLURAL:$1|resultaot|resultaoten}} per zied zien",
+       "shown-title": "Låt $1 {{PLURAL:$1|resultaat|resultaten}} per syde seen",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Der is n zied mit de naam \"[[:$1]]\" op disse wiki.'''",
        "searchmenu-new": "<strong>De zied \"[[:$1]]\" op disse wiki anmaken!</strong> \n{{PLURAL:$2|0=|Zie oek de zied mit joew zeukresultaoten.|Zie oek de lieste mit evunnen zeukresultaoten.}}",
        "searchprofile-articles": "Artikels",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
-       "searchprofile-advanced": "Uutgebreid",
-       "searchprofile-articles-tooltip": "Zeuken in $1",
-       "searchprofile-images-tooltip": "Zeuken naor bestaanden",
-       "searchprofile-everything-tooltip": "Alle inhoud deurzeuken (oek overlegziejen)",
-       "searchprofile-advanced-tooltip": "Zeuken in de an-egeven naamruumtes",
+       "searchprofile-advanced": "Uutwyded",
+       "searchprofile-articles-tooltip": "ken in $1",
+       "searchprofile-images-tooltip": "Söken nå bestanden",
+       "searchprofile-everything-tooltip": "Alle inhold döärsöken (ouk oaverlegsyden)",
+       "searchprofile-advanced-tooltip": "Söken in de angeaven naamruumden",
        "search-result-size": "$1 ({{PLURAL:$2|1 woord|$2 woorden}})",
        "search-result-category-size": "{{PLURAL:$1|1 kategorielid|$1 kategorielejen}} ({{PLURAL:$2|1 onderkategorie|$2 onderkategorieën}}, {{PLURAL:$3|1 bestaand|$3 bestaanden}})",
        "search-redirect": "(deurverwiezing vanaof $1)",
        "right-siteadmin": "De databanke blokkeren en weer vriegeven",
        "right-override-export-depth": "Ziejen exporteren, oek de ziejen waor naor verwezen wördt, tot n diepte van 5",
        "right-sendemail": "Bericht versturen naor aandere gebrukers",
-       "newuserlogpage": "Logboek mit anwas",
+       "newuserlogpage": "Logbook van nye brukers",
        "newuserlogpagetext": "Hieronder staon de niej in-eschreven gebrukers",
        "rightslog": "Gebrukersrechtenlogboek",
        "rightslogtext": "Dit is n logboek mit veraanderingen van gebrukersrechten",
        "recentchanges-summary": "Up disse syde kün jy de lätste wysigingen van disse wiki bekyken.",
        "recentchanges-noresult": "Der waren in disse periode gien wiezigingen die an de kriteria voldoon.",
        "recentchanges-feed-description": "Zeuk naor de alderleste wiezingen op disse wiki in disse voer.",
-       "recentchanges-label-newpage": "Mid disse bewarking is een nye syde emaked",
+       "recentchanges-label-newpage": "Mid disse bewarking is een nye syde maked",
        "recentchanges-label-minor": "Dit is een kleine wysiging",
-       "recentchanges-label-bot": "Disse bewarking is üütevoord döär een bot",
-       "recentchanges-label-unpatrolled": "Disse bewarking is noch neet nå-ekeaken",
-       "recentchanges-label-plusminus": "Disse sydgroutte is mid dit antal bytes ewysigd",
+       "recentchanges-label-bot": "Disse bewarking is uutvoord döär een bot",
+       "recentchanges-label-unpatrolled": "Disse bewarking is noch neet nåkeaken",
+       "recentchanges-label-plusminus": "Disse sydgroutte is mid dit antal bytes wysigd",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}<br />(see ouk de [[Special:NewPages|lyste mid nye syden]])",
        "recentchanges-submit": "Bekiek",
        "rcfilters-filter-user-experience-level-experienced-label": "Ervåren gebrukers",
        "rcfilters-filter-user-experience-level-experienced-description": "An-emelde bewarkers mid meyr as 500 bewarkingen en 30 dagen van aktiviteit.",
        "rcfilters-filter-bots-label": "Bot",
-       "rcfilters-filter-humans-label": "Meanskelik (geen bot)",
+       "rcfilters-filter-humans-label": "Menskelik (geen bot)",
        "rcfilters-filter-humans-description": "Bewarkingen döär meanskelike bewarkers.",
        "rcfilters-filtergroup-reviewstatus": "Beoordelingsstaotus",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Niet nao-ekeken",
        "newpageletter": "N",
        "boteditletter": "B",
        "unpatrolledletter": "!",
-       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nao de wieziging",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} nå de wysiging",
        "newsectionsummary": "Ny underwarp: /* $1 */",
        "rc-enhanced-expand": "Details bekieken",
        "rc-enhanced-hide": "Details verbargen",
        "recentchanges-page-removed-from-category": "[[:$1]] is vortedaon uut kategorie",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] vortedaon uut kategorie, [[Special:WhatLinksHere/$1|disse zied zit in aandere ziejen in-esleuten]]",
        "autochange-username": "Automatiese wieziging van MediaWiki",
-       "upload": "Holder upladen",
+       "upload": "Bestand upladen",
        "uploadbtn": "Holder upladen",
        "reuploaddesc": "Weerumme naor de opstuurzied",
        "upload-tryagain": "Bestaandsbeschrieving biewarken",
        "listfiles-latestversion": "Aktuele versie",
        "listfiles-latestversion-yes": "Ja",
        "listfiles-latestversion-no": "Nee",
-       "file-anchor-link": "Bestaand",
-       "filehist": "Bestaandsgeschiedenisse",
-       "filehist-help": "Klik op n daotum/tied um t bestaand te zien zo as t to was.",
+       "file-anchor-link": "Bestand",
+       "filehist": "Bestandsgeskydenisse",
+       "filehist-help": "Klik up een dåtum/tyd üm et bestand te seen so as et destyds was.",
        "filehist-deleteall": "alles vortdoon",
        "filehist-deleteone": "disse vortdoon",
        "filehist-revert": "weerummedreien",
-       "filehist-current": "zo as t noen is",
-       "filehist-datetime": "Daotum/tied",
-       "filehist-thumb": "Miniatuuraofbeelding",
-       "filehist-thumbtext": "Miniatuuraofbeelding veur versie van $1",
+       "filehist-current": "aktueel",
+       "filehist-datetime": "Dåtum/tyd",
+       "filehist-thumb": "Miniatuurafbealding",
+       "filehist-thumbtext": "Miniatuurafbealding vöär versy van $1",
        "filehist-nothumb": "Gien miniatuuraofbeelding",
-       "filehist-user": "Gebruker",
-       "filehist-dimensions": "Grootte",
+       "filehist-user": "Bruker",
+       "filehist-dimensions": "Groutde",
        "filehist-filesize": "Bestaandsgrootte",
-       "filehist-comment": "Opmarkingen",
-       "imagelinks": "Bestaandsgebruuk",
+       "filehist-comment": "Kommentaar",
+       "imagelinks": "Bestandsbruuk",
        "linkstoimage": "Disse holder wördt up de volgende {{PLURAL:$1|syde|$1 syden}} gebrüked:",
        "linkstoimage-more": "Der {{PLURAL:$2|is|bin}} meer as $1 {{PLURAL:$1|verwiezing|verwiezingen}} naor dit bestaand.\nDe volgende lieste gif allinnig de eerste {{PLURAL:$1|verwiezing|$1 verwiezingen}} naor dit bestaand weer.\nDe [[Special:WhatLinksHere/$2|hele lieste]] is oek beschikbaor.",
        "nolinkstoimage": "Geen enkelde syde gebrüükt disse holder.",
        "duplicatesoffile": "{{PLURAL:$1|t Volgende bestaand is|De volgende $1 bestaanden bin}} gelieke an dit bestaand ([[Special:FileDuplicateSearch/$2|meer informasie]]):",
        "sharedupload": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten.",
        "sharedupload-desc-there": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. Bekiek de [$2 beschrieving van t bestaand] veur meer informasie.",
-       "sharedupload-desc-here": "Dit is n edeeld bestaand op $1 en ku'j oek gebruken veur aandere projekten. De [$2 beschrieving van t bestaand] dergindse, steet hieronder.",
+       "sharedupload-desc-here": "Dit bestand kümt van $1 en kan ouk in andere projekten bruked weasen. De [$2 syde mid de beskryving van et bestand] steyt hyrunder.",
        "sharedupload-desc-edit": "Dit besatand kömp van $1 en kan oek in aandere projekten gebruukt wörden.\nJe kunnen de [$2 zied mit de bestaandsbeschrieving] daor bewarken.",
        "sharedupload-desc-create": "Dit besatand kömp van $1 en kan oek in aandere projekten gebruukt wörden.\nJe kunnen de [$2 zied mit de bestaandsbeschrieving] daor bewarken.",
        "filepage-nofile": "Der besteet gien bestaand mit disse naam.",
        "allpagesto": "Laot ziejen zien tot:",
        "allarticles": "Alle artikels",
        "allinnamespace": "Alle ziejen (naamruumte $1)",
-       "allpagessubmit": "Zeuk",
+       "allpagessubmit": "Söken",
        "allpagesprefix": "Ziejen bekieken die beginnen mit:",
        "allpagesbadtitle": "De op-egeven ziednaam is ongeldig of der steet n interwikiveurvoegsel in. Meugelikerwieze staon der karakters in de naam die niet gebruukt maggen wörden in ziednamen.",
        "allpages-bad-ns": "{{SITENAME}} hef gien \"$1\"-naamruumte.",
        "wlheader-enotif": "Je kriegen bericht per netpost",
        "wlheader-showupdated": "Ziejen die sinds joew leste bezeuk bie-ewörken bin staon '''vet'''.",
        "wlnote": "Hieronder {{PLURAL:$1|steet de leste wieziging|staon de leste $1 wiezigingen}} in {{PLURAL:$2|t aofgeleupen ure|de leste $2 uren}} vanaof $3 um $4.",
-       "wlshowlast": "Laot de veurbieje $1 uur $2 dagen zien",
        "watchlist-submit": "Bekiek",
        "wlshowhideminor": "kleine bewarkingen",
        "watchlist-options": "Opsies veur de volglieste",
        "confirm": "Bevestigen",
        "excontent": "De tekste was: '$1'",
        "excontentauthor": "De tekste was: '$1' (zied an-emaakt deur: [[Special:Contributions/$2|$2]])",
-       "exbeforeblank": "veurdat disse zied leegemaakt wörden stung hier: '$1'",
+       "exbeforeblank": "vöärdat disse syde leadigmaked wördde stünd hyr: '$1'",
        "delete-confirm": "\"$1\" vortdoon",
        "delete-legend": "Vortdoon",
        "historywarning": "'''Waorschuwing''': de zied die'j vortdoon willen, hef $1 {{PLURAL:$1|versie|versies}}:",
        "delete-warning-toobig": "Disse zied hef n lange bewarkingsgeschiedenisse, meer as $1 {{PLURAL:$1|versie|versies}}.\nWoart je: t vortdoon van disse zied kan de warking van de databanke van {{SITENAME}} versteuren.\nWees veurzichtig",
        "deleting-backlinks-warning": "<strong>Waorschuwing:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|aandere ziejen]] gebruken of verwiezen naor de zied die'j vortdoon willen.",
        "rollback": "Wiezigingen herstellen",
-       "rollbacklink": "weerummedreien",
+       "rollbacklink": "weaderümmedraien",
        "rollbacklinkcount": "{{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "rollbacklinkcount-morethan": "Meer as {{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "rollbackfailed": "Wieziging herstellen is mislokt",
        "undelete-error-long": "Fouten bie t herstellen van t bestaand:\n\n$1",
        "undelete-show-file-confirm": "Bi'j der wisse van da'j n vortedaone versie van t bestaand \"<nowiki>$1</nowiki>\" van $2 um $3 bekieken willen?",
        "undelete-show-file-submit": "Ja",
-       "namespace": "Naamrüümde:",
-       "invert": "Seleksie ummekeren",
+       "namespace": "Naamruumde:",
+       "invert": "Selekty ümmekeyren",
        "tooltip-invert": "Vink dit vakjen an um wiezigingen an ziejen binnen de ekeuzen naamruumte te verbargen (en de biebeheurende naamruumte as dat an-evinkt is)",
        "namespace_association": "Naamruumte die hieran ekoppeld is",
        "tooltip-namespace_association": "Vink dit vakjen an um oek de overlegnaamruumte, of in t ummekeren geval de naamruumte zelf, derbie te doon die bie disse naamruumte heurt.",
-       "blanknamespace": "(Heufdnaamruumte)",
+       "blanknamespace": "(Höyvdnaamruumde)",
        "contributions": "{{GENDER:$1|Gebrukersbydragen}}",
        "contributions-title": "Biedragen van $1",
        "mycontris": "Myn bydragen",
        "allmessages-prefix": "Filtreer op veurvoegsel:",
        "allmessages-language": "Taal:",
        "allmessages-filter-submit": "zeuk",
-       "thumbnail-more": "vergroten",
+       "thumbnail-more": "vergrouten",
        "filemissing": "Bestaand ontbrik",
        "thumbnail_error": "Fout bie t laojen van de miniatuuraofbeelding: $1",
        "thumbnail_error_remote": "Foutmelding van $1:\n$2",
        "tooltip-pt-preferences": "{{GENDER:|Miene}} vuurkeuren",
        "tooltip-pt-watchlist": "Lieste van zieden die op miene volglieste stoan",
        "tooltip-pt-mycontris": "Oaverzicht van {{GENDER:|oew}} biejdreagen",
-       "tooltip-pt-login": "Iej wördt van harte oetneugd um oe an te melden as gebroeker, mer t is nich verplicht",
+       "tooltip-pt-login": "Jy wördt van harte uutnöygd üm ju an te melden as bruker, mar et is neet verplicht",
        "tooltip-pt-logout": "Ofmaelden",
-       "tooltip-pt-createaccount": "Schrief je eigen veural in en meld je an, mer t is niet verplicht.",
-       "tooltip-ca-talk": "Loat n oaverlegtekst oaver disse ziede zeen",
-       "tooltip-ca-edit": "Beweark disse ziede",
+       "tooltip-pt-createaccount": "Skryv juw eigen vöäral in en meld juw eigen an. Dit is lykewels neet verplicht.",
+       "tooltip-ca-talk": "Låt een oaverlegtekst oaver disse syde seen",
+       "tooltip-ca-edit": "Bewark disse syde",
        "tooltip-ca-addsection": "Niej oonderwaerp tovogen",
        "tooltip-ca-viewsource": "Disse ziede is beveiligd taegen veraanderen. Iej könt wal kieken noar de ziede",
-       "tooltip-ca-history": "Oaldere versies van disse ziede",
+       "tooltip-ca-history": "Oldere versys van disse syde",
        "tooltip-ca-protect": "Beveilig disse ziede taegen veraanderen",
        "tooltip-ca-unprotect": "De beveiliging vuur disse ziede wiezigen",
        "tooltip-ca-delete": "Smiet disse ziede vort",
        "tooltip-ca-undelete": "Haal n inhoald van disse ziede oet n emmer",
        "tooltip-ca-move": "Gef disse ziede nen aanderen titel",
-       "tooltip-ca-watch": "Voog disse ziede to an oewe volglieste",
+       "tooltip-ca-watch": "Voog disse syde to an juw volglyste",
        "tooltip-ca-unwatch": "Smiet disse ziede van oewe voalglieste",
-       "tooltip-search": "{{SITENAME}} duurzeuken",
-       "tooltip-search-go": "Noar n ziede mit disse naam goan as t besteet",
-       "tooltip-search-fulltext": "Zeuk noar zieden woar disse tekst in steet",
-       "tooltip-p-logo": "Goa noar t vuurblad",
-       "tooltip-n-mainpage": "Goa noar t vuurblad",
-       "tooltip-n-mainpage-description": "Goa noar t vuurblad",
-       "tooltip-n-portal": "Informoasie oaver t projekt: wel, wat, ho en woarum",
-       "tooltip-n-currentevents": "Achtergroondinformoasie oaver dinge in t niejs",
-       "tooltip-n-recentchanges": "Lieste van pas verrichte veraanderingen",
-       "tooltip-n-randompage": "Loat ne willekeurige ziede zeen",
-       "tooltip-n-help": "Hölpinformoasie oaver {{SITENAME}}",
-       "tooltip-t-whatlinkshere": "Lieste van alle zieden die hiernoar verwiezen",
-       "tooltip-t-recentchangeslinked": "Pas verrichte veraanderingen die noar disse ziede verwiezen",
+       "tooltip-search": "{{SITENAME}} döärsöken",
+       "tooltip-search-go": "Gå nå een syde mid eksakt disse name as et besteyt",
+       "tooltip-search-fulltext": "Söök nå syden wår disse tekst in steyt",
+       "tooltip-p-logo": "Gå nå et vöärblad",
+       "tooltip-n-mainpage": "Gå nå et vöärblad",
+       "tooltip-n-mainpage-description": "Gå nå et vöärblad",
+       "tooltip-n-portal": "Informaty oaver et projekt: wee, wat, ho en wårümme",
+       "tooltip-n-currentevents": "Achtergrundinformaty oaver dingen in et nys",
+       "tooltip-n-recentchanges": "Lyste van pas verrichte veranderingen",
+       "tooltip-n-randompage": "Låt ne willeköärige syde seen",
+       "tooltip-n-help": "Hülpinformaty oaver {{SITENAME}}",
+       "tooltip-t-whatlinkshere": "Lyste van alle syden dee når disse syde verwysen",
+       "tooltip-t-recentchangeslinked": "Pas verrichte veranderingen dee nå disse syde verwyset",
        "tooltip-feed-rss": "RSS-voer vuur disse ziede",
        "tooltip-feed-atom": "Atom-voer vuur disse ziede",
        "tooltip-t-contributions": "Lieste met biejdreagen van {{GENDER:$1|disse gebroeker}}",
        "tooltip-t-emailuser": "Stüür disse {{GENDER:$1|gebruker}} een netpostbericht",
        "tooltip-t-info": "Meer informasie over disse zied",
-       "tooltip-t-upload": "Laad ofbeeldingen en/of geluudsmateriaal",
-       "tooltip-t-specialpages": "Lieste van alle biejzeundere zieden",
-       "tooltip-t-print": "De ofdrukboare versie van disse ziede",
-       "tooltip-t-permalink": "Verbeending vuur altied noar de versie van disse ziede van vandaag-an-n-dag",
-       "tooltip-ca-nstab-main": "Loat n tekst van t artikel zeen",
+       "tooltip-t-upload": "Laad afbealdingen en/of gelüüdsmateriaal",
+       "tooltip-t-specialpages": "Lyste van alle bysündere syden",
+       "tooltip-t-print": "De afdrükbåre versy van disse syde",
+       "tooltip-t-permalink": "Permanente verwysing nå disse versy van de syde",
+       "tooltip-ca-nstab-main": "Låt een tekst van et artikel seen",
        "tooltip-ca-nstab-user": "Loat de gebroekersbladziede zeen",
        "tooltip-ca-nstab-media": "Loat n mediatekst zeen",
-       "tooltip-ca-nstab-special": "Dit is ne biejzeundere ziede die'j nich könt veraanderen",
+       "tooltip-ca-nstab-special": "Dit is een bysündere syde dee jy neet veranderen künt",
        "tooltip-ca-nstab-project": "Loat de projektbladziede zeen",
-       "tooltip-ca-nstab-image": "Loat de bestaandsbladziede zeen",
+       "tooltip-ca-nstab-image": "Låt de bestandssyde seen",
        "tooltip-ca-nstab-mediawiki": "Loat de systeemtekstbladziede zeen",
        "tooltip-ca-nstab-template": "Loat de malbladziede zeen",
        "tooltip-ca-nstab-help": "Loat de hölpbladziede zeen",
        "tooltip-watchlistedit-raw-submit": "Volglieste biewarken",
        "tooltip-recreate": "Disse ziede opniej anmaken, ondanks t feit dat t vortdoan is.",
        "tooltip-upload": "Bestaanden opsturen",
-       "tooltip-rollback": "Mit \"weerummedreien\" kö'j mit één klik de bewaerking(en) van n leste gebroeker dee disse ziede bewaerkt hef terugdraeien.",
+       "tooltip-rollback": "\"Weaderümmedraien\" drait mid eyn klik de bewarking(en) van de lätste bruker up disse syde terügge.",
        "tooltip-undo": "A'j op \"weerummedreien\" klikken geet t bewaerkingsvaenster lös en kö'j ne vurige versie terugzetten.\nIej könt in de bewaerkingssamenvatting n reden opgeven.",
        "tooltip-preferences-save": "Vuurkeuren opsloan",
        "tooltip-summary": "Voer ne korte samenvatting in",
        "anonymous": "Anonieme {{PLURAL:$1|gebruker|gebrukers}} van {{SITENAME}}",
        "siteuser": "{{SITENAME}}-gebruker $1",
        "anonuser": "Anonieme {{SITENAME}}-gebruker $1",
-       "lastmodifiedatby": "Disse zied is t lest ewiezigd op $2, $1 deur $3.",
+       "lastmodifiedatby": "Disse syde is et lätst ewysigd up $1 üm $2 döär $3.",
        "othercontribs": "Ebaseerd op wark van $1.",
        "others": "aandere",
        "siteusers": "{{SITENAME}}-{{PLURAL:$2|gebruker|gebrukers}}  $1",
        "show-big-image": "Oorspronkelik bestaand",
        "show-big-image-preview": "Grootte van disse weergave: $1.",
        "show-big-image-other": "Aandere {{PLURAL:$2|resolusie|resolusies}}: $1.",
-       "show-big-image-size": "$1 × $2 beeldpunten",
+       "show-big-image-size": "$1 × $2 bealdpunten",
        "file-info-gif-looped": "herhaolend",
        "file-info-gif-frames": "$1 {{PLURAL:$1|beeld|beelden}}",
        "file-info-png-looped": "herhaolend",
        "metadata-help": "In dit bestaand zit metadata mit EXIF-informasie, die deur n fotokamera, inleesapparaot of fotobewarkingsprogramma op-estuurd kan ween.",
        "metadata-expand": "Bekiek uutebreiden gegevens",
        "metadata-collapse": "Verbarg uutebreiden gegevens",
-       "metadata-fields": "De aofbeeldingsmetadatavelden in dit bericht staon oek op n aofbeeldingszied as de metadatatabel in-eklapt is.\nAandere velden wörden verbörgen.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "De afbealdingsmetadatavelden in dit bericht ståt ouk up een afbealdingssyde as de metadatatabel inklapped is.\nAndere velden wördet verbörgen.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "namespacesall": "alles",
        "monthsall": "alles",
        "confirmemail": "Bevestig netpostadres",
        "imgmultipagenext": "volgende →",
        "imgmultigo": "Oké",
        "imgmultigoto": "Gao naor de zied $1",
-       "ascending_abbrev": "opl.",
-       "descending_abbrev": "aofl.",
        "table_pager_next": "Volgende",
        "table_pager_prev": "Veurige",
        "table_pager_first": "Eerste zied",
        "table_pager_limit_label": "Zaken per zied:",
        "table_pager_limit_submit": "Zeuk",
        "table_pager_empty": "Gien resultaoten",
-       "autosumm-blank": "Zied leegemaakt",
+       "autosumm-blank": "Syde leadigmaked",
        "autosumm-replace": "Tekste vervöngen deur '$1'",
        "autoredircomment": "döärverwysing når [[$1]]",
        "autosumm-changed-redirect-target": "Döärverwysingsdool ewysigd van [[$1]] når [[$2]]",
        "tag-mw-new-redirect": "Nye döärverwysing",
        "tag-mw-removed-redirect": "Döärverwysing vordedån",
        "tag-mw-changed-redirect-target": "Döärverwysingsdool ewysigd",
+       "tag-mw-blank": "Leadigmaked",
        "tags-title": "Etiket",
        "tags-intro": "Op disse zied staon de etiketten waormee de programmatuur elke bewarking kan markeren, en de betekenisse dervan.",
        "tags-tag": "Etiketnaam",
        "logentry-patrol-patrol": "$1 hef versie $4 van de zied $3 op {{GENDER:$2|nao-ekeken}} ezet",
        "logentry-patrol-patrol-auto": "$1 hef versie $4 van de zied $3 automaties op {{GENDER:$2|nao-ekeken}} ezet",
        "logentry-newusers-newusers": "Gebruker $1 is {{GENDER:$2|an-emaakt}}",
-       "logentry-newusers-create": "Gebruker $1 is {{GENDER:$2|an-emaakt}}",
+       "logentry-newusers-create": "Brukerskonto $1 is {{GENDER:$2|anmaked}}",
        "logentry-newusers-create2": "Gebruker $3 is {{GENDER:$2|an-emaakt}} an-emaakt deur $1",
        "logentry-newusers-byemail": "Gebruker $3 {{GENDER:$2|is}} an-emaakt deur $1 en t wachtwoord is per netpost verstuurd",
        "logentry-newusers-autocreate": "De gebruker $1 is automaties {{GENDER:$2|an-emaakt}}",
index a78fb3c..19a7c48 100644 (file)
        "wlheader-enotif": "Benarichtigen per E-Mail is anstellt.",
        "wlheader-showupdated": "Sieden, de siet dien letzten Besöök ännert worrn sünd, warrt '''fett''' wiest.",
        "wlnote": "Ünnen {{PLURAL:$1|steiht de letzte Ännern|staht de letzten $1 Ännern}} vun de {{PLURAL:$2|letzte Stünn|letzten '''$2''' Stünnen}}.",
-       "wlshowlast": "Wies de letzten $1 Stünnen $2 Daag",
        "watchlist-hide": "Versteken",
        "watchlist-options": "Optionen för de Oppasslist",
        "watching": "warrt op de Oppasslist ropsett...",
        "imgmultipagenext": "nächste Siet →",
        "imgmultigo": "Los!",
        "imgmultigoto": "Gah na de Siet $1",
-       "ascending_abbrev": "op",
-       "descending_abbrev": "dal",
        "table_pager_next": "Nächste Siet",
        "table_pager_prev": "Vörige Siet",
        "table_pager_first": "Eerste Siet",
index adb1417..a2e6203 100644 (file)
        "invalidtitle": "अमान्य शीर्षक",
        "invalidtitle-knownnamespace": "नेमस्पेस \"$2\" तथा अक्षर \"$3\" सहितको अवैश शिर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नेमस्पेस अंक $1 तथा अक्षर \"$2\" भएको अवैध शिर्षक",
-       "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
+       "exception-nologin": "प्रवेश नगरिएको",
        "exception-nologin-text": "यस पृष्ठमा जान वा कुनै कार्य गर्नको लागि कृपया प्रवेश (लग इन) गर्नुहोस् ।",
        "exception-nologin-text-manual": "यस पृष्ठमा प्रवेश गर्न वा कुनै कार्य गर्नको लागि कृपया $1 गर्नु होस् ।",
        "virus-badscanner": "खराव मिलान: अज्ञात भाइरस स्क्यानर :''$1''",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउने",
        "logout": "निर्गमन",
        "userlogout": "निर्गमन (लग आउट)",
-       "notloggedin": "प्रवेश (लग ईन) नगरिएको",
+       "notloggedin": "प्रवेश नगरिएको",
        "userlogin-noaccount": "के खाता छैन ?",
        "userlogin-joinproject": "{{SITENAME}} मा खाता खोल्नुहोस् ।",
        "createaccount": "खाता खोल्नुहोस्",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "तपाईंको निर्गमन अनुरोध अस्विकार गरिन्छ किन कि यो खराब ब्राउजर वा क्यासिङ प्रोक्सिले पठाएको जस्तो देखिन्छ।",
        "createacct-another-realname-tip": "वास्तविक नाम ऐच्छिक हो ।\nतपाईंले यो खुलाउनु भएको खण्डमा तपाईंको काममा प्रयोगकर्ता श्रेय दिनको लागि यसको प्रयोग गरिने छ ।",
-       "pt-login": "प्रवेश (लग ईन)",
+       "pt-login": "प्रवेश",
        "pt-login-button": "प्रवेश",
        "pt-login-continue-button": "प्रवेस जारी राख्नुहोस् ।",
        "pt-createaccount": "खाता खोल्नुहोस्",
        "nosuchsectiontitle": "सेक्सन फेला परेन",
        "nosuchsectiontext": "तपाईँले त्यस्तो खण्डको सम्पादन गर्ने प्रयास गर्नुभयो जुन छैन।\nजब तपाईं यस पृष्ठलाई हेर्नुहुँदैथियो, यो सारिएको अथवा मेटाइएको हुनुपर्छ।",
        "loginreqtitle": "प्रवेशगर्नु जरुरी छ।",
-       "loginreqlink": "प्रवेश (लग ईन)",
+       "loginreqlink": "प्रवेश",
        "loginreqpagetext": "अरु पृष्ठ हेर्न तपाईंले $1 गर्नुपर्छ ।",
        "accmailtitle": "पासवर्ड पठाइयो",
        "accmailtext": "जथाभावीरूपमा सृजना गरिएको प्रवेशशब्द प्रयोगकर्ता [[User talk:$1|$1]] को  $2 मा पठाइएको छ।\n\nयो नयाँ खाताको प्रवेशशब्द  ''[[Special:ChangePassword|change password]]'' मा प्रवेश गरेर परिवर्तन गर्न सकिन्छ ।",
        "prefs-pageswatchlist": "हेरिएका पृष्ठहरू",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "diffs(भिन्नता)",
-       "prefs-help-prefershttps": "यà¥\8b à¤\85भिरà¥\82à¤\9aà¥\80 à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरवà¥\87श (लà¤\97 à¤\87न) à¤¬à¤¾à¤\9f à¤²à¤¾à¤\97à¥\81 à¤¹à¥\81नà¥\87à¤\9b ।",
+       "prefs-help-prefershttps": "यà¥\8b à¤\85भिरà¥\82à¤\9aà¥\80 à¤¤à¤ªà¤¾à¤\88à¤\95à¥\8b à¤\85रà¥\8dà¤\95à¥\8b à¤ªà¥\8dरवà¥\87शबाà¤\9f à¤²à¤¾à¤\97à¥\82 à¤¹à¥\81नà¥\87à¤\9b।",
        "prefswarning-warning": "तपाईंले आफ्नो अभिरूचीमा गर्नुभएको परिवर्तन अहिले सम्म सङ्ग्रह गरिएको छैन। यदि तपाईं \"$1\" मा क्लिक नगरी यस पृष्ठबाट बाहिर जानुभयो भने तपाईंको अभिरूची अपडेट गर्न सकिदैन।",
        "prefs-tabs-navigation-hint": "सुझाव: तपाईं ट्याबसहरूमा ट्याबसको बीच आवागमन गर्नका लागि देब्रे वा दाहिने तीर साँचोको प्रयोग गर्न सक्नुहुन्छ।",
        "userrights": "प्रयोगकर्ता अधिकारहरू",
        "uploadbtn": "फाइलहरू उर्ध्वभरण गर्ने",
        "reuploaddesc": "उर्ध्वभरण रद्द गर्ने र उर्ध्वभरण फारमतिर जाने",
        "upload-tryagain": "संशोधित फाइल विवरण बुझाउने",
-       "uploadnologin": "प्रवेश (लग ईन) नगरिएको",
+       "uploadnologin": "प्रवेश नगरिएको",
        "uploadnologintext": "फाइल उर्ध्वभरण गर्न तपाईंले $1 गर्नुपर्छ।",
        "upload_directory_missing": "उर्ध्वभरण डाइरेक्टरी ($1) हराइरहेको छ र वेवसर्भरले नयाँ डाइरेक्टरी निर्माणगर्न असमर्थ भयो ।",
        "upload_directory_read_only": "उर्ध्व भरण डाइरेक्टरी ($1) वेवसर्भर द्वारा लेख्य छैन ।",
        "watchlistfor2": "$1को $2",
        "nowatchlist": "तपाईंको अवलोकन सूचीमा कुनै पनि सामाग्री छैन।",
        "watchlistanontext": "कृपया तपाईंको निगरानी सूची हेर्न या सम्पादन गर्न लगइन गर्नुहोस्।",
-       "watchnologin": "प्रवेश (लग ईन) नगरिएको",
+       "watchnologin": "प्रवेश नगरिएको",
        "addwatch": "निगरानी सुचीमा थप्ने",
        "addedwatchtext": "\"[[:$1]]\" पृष्ठ [[Special:Watchlist|अवलोकनसूची]]मा थपियो\nयो पृष्ठ र यससित सम्बद्ध वार्तालाप पृष्ठमा भविष्यमा हुने परिवर्तन सूचिबद्ध गरिनेछ।",
        "addedwatchtext-short": "\"$1\" पृष्ठ तपाईंको अवलोकन सूचीमा थप भएको छ ।",
        "wlheader-enotif": "इमेल जानकारी सक्रिय गरियो ।",
        "wlheader-showupdated": "तपाईंले पछिल्लो पल्ट भ्रमण गरेपछि परिवर्तन भएका पृष्ठहरूलाई <strong>गाढा<strong> गरेर देखाइएको छ ।",
        "wlnote": "$3 र $4 अनुसार विगत {{PLURAL:$2|घण्टामा|'''$2''' घण्टाहरूमा}} {{PLURAL:$1|गरिएको अन्तिम परिवर्तन तल दिइएकोछ|गरिएका अन्तिम  '''$1''' परिवर्तनहरू तल दिइएका छन्}}।",
-       "wlshowlast": "पछिल्ला $2 दिनहरू $1 घण्टाहरू देखाउनुहोस्",
        "watchlist-hide": "लुकाउनुहोस्",
        "watchlist-submit": "देखाउनुहोस्",
        "wlshowhideminor": "सामान्य सम्पादनहरू",
        "img-lang-default": "(पूर्वनिर्धारित भाषा)",
        "img-lang-info": "यस चित्रलाई $1 मा प्रस्तुत गर्ने । $2",
        "img-lang-go": "जाउ",
-       "ascending_abbrev": "वर्णानुक्रम",
-       "descending_abbrev": "धट्दोक्रम",
        "table_pager_next": "पछिको पृष्ठ",
        "table_pager_prev": "अगाडिको पृष्ठ",
        "table_pager_first": "प्रथम पृष्ठ",
index 2372a64..be73968 100644 (file)
        "wlheader-enotif": "U wordt per e-mail gewaarschuwd.",
        "wlheader-showupdated": "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
        "wlnote": "Hieronder {{PLURAL:$1|staat de laaste wijziging|staan de laatste $1 wijzigingen}} in {{PLURAL:$2|het laatste uur|de laatste $2 uur}} per $3 om $4.",
-       "wlshowlast": "Laatste $1 uur, $2 dagen bekijken",
        "watchlist-hide": "Verbergen",
        "watchlist-submit": "Weergeven",
        "wlshowtime": "Weer te geven periode:",
        "img-lang-default": "(standaard taal)",
        "img-lang-info": "Deze afbeeldingen renderen in de taal $1. $2",
        "img-lang-go": "OK",
-       "ascending_abbrev": "opl.",
-       "descending_abbrev": "afl.",
        "table_pager_next": "Volgende pagina",
        "table_pager_prev": "Vorige pagina",
        "table_pager_first": "Eerste pagina",
index b930d83..0e33ed5 100644 (file)
        "wlheader-enotif": "Funksjonen for endringsmeldingar per e-post er på.",
        "wlheader-showupdated": "Sider som har vorte endra sidan du sist såg på dei er <strong>utheva</strong>",
        "wlnote": "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste <strong>$1</strong> endringane}} {{PLURAL:$2|den siste timen|dei siste <strong>$2</strong> timane}}, for $3, kl. $4.",
-       "wlshowlast": "Vis siste $1 timane $2 dagane",
        "watchlist-hide": "Gøym",
        "wlshowtime": "Vis siste:",
        "wlshowhideminor": "småplukk",
        "img-lang-default": "(standardspråk)",
        "img-lang-info": "Teikn biletet på $1. $2",
        "img-lang-go": "Gjer det",
-       "ascending_abbrev": "stigande",
-       "descending_abbrev": "synkande",
        "table_pager_next": "Neste side",
        "table_pager_prev": "Førre sida",
        "table_pager_first": "Fyrste sida",
index ec5717f..bc13353 100644 (file)
        "rev-showdeleted": "ߦߌ߬ߘߊ߬ߟߌ",
        "revisiondelete": "ߛߌ߰ߘߊ ߖߏ߬ߛߌ߬/ߖߏ߬ߛߌ߬ߣߍ߲ ߓߐ߫",
        "revdelete-nooldid-title": "ߞߏ߲߭ ߟߢߊ߬ߟߌ ߓߍ߲߬ߓߊߟߌ",
+       "revdelete-no-file": "ߞߐߕߐ߮ ߝߊߛߌߣߌ߲ ߕߴߦߋ߲߬.",
+       "revdelete-show-file-confirm": "ߌ ߟߊ߫ ߣߴߊ߬ ߟߊ߫ ߝߋߎ߫ ߞߴߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߟߢߊ߬ߟߌ ߖߏ߬ߛߌ߬ߣߍ߲ ߠߎ߬ ߦߋ߫ ߞߐߕߐ߮ ߟߎ߬ ߘߐ߫ <nowiki>$1</nowiki> ߞߵߊ߬ ߕߊ߬ $3 ߡߊ߬ $2 ߟߊ߫؟",
        "revdelete-show-file-submit": "ߐ߲߬ߐ߲߬ߐ߲߫",
+       "revdelete-selected-text": "{{PLURAL:$1|ߟߢߊ߬ߟߌ߬ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲|ߟߢߊ߬ߟߌ߬ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߠߎ߬}} ߞߊ߬ ߝߘߊ߫ [[:$2]]",
+       "revdelete-selected-file": "{{PLURAL:$1|ߞߐߕߐ߯ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߦߌߟߡߊ|ߞߐߕߐ߯ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߠߎ߬ ߦߌߟߡߊ}} ߞߊ߬ ߝߘߊ߫ [[:$2]]",
        "revdelete-legend": "ߦߋߟߌ ߟߊ߬ߘߐ߰ߦߊ߬ߟߌ ߟߊߘߏ߲߬",
        "revdelete-hide-text": "ߛߓߍߟߌ ߟߊߢߊ߬",
        "revdelete-hide-image": "ߞߐߕߐ߮ ߞߣߐߘߐ ߢߡߊߘߏ߲߰",
        "powersearch-togglelabel": "ߝߛߍ߬ߝߛߍ߬ߟߌ",
        "powersearch-toggleall": "ߊ߬ ߓߍ߯",
        "powersearch-togglenone": "ߝߏߦߌ߬",
+       "powersearch-remember": "ߢߌߣߌ߲ߠߌ߲ ߣߊ߬ߕߐ ߓߊߕߐߡߐ߲ߠߌ߲ ߠߎ߬ ߟߊߓߊ߬ߕߏ߬.",
        "search-external": "ߞߐߞߊ߲߫ ߢߌߣߌ߲ߠߌ߲",
+       "searchdisabled": "{{SITENAME}} ߢߌߣߌ߲ߠߌ߲ ߓߘߊ߫ ߓߴߊ߬ ߟߊ߫. \nߌ ߘߌ߫ ߛߋ߫ ߢߌߣߌ߲ߠߌ߲ ߞߍ߫ ߟߊ߫ ߜ߭ߎߜ߭ߑߟߎ ߞߊ߲߬ ߥߛߎ߬ߣߍ߲߬ ߞߘߐ߫.\nߕߎ߬ߡߊ߬ߘߐ߫ ߊ߬ߟߎ߬ ߟߊ߫ ߛߌߝߊߟߌ ߞߊ߬ ߟߐ߬ {{SITENAME}} ߡߊ߬߸ ߏ߬ ߞߣߐߘߐ ߟߋ߬ ߕߍ߫ ߕߎ߬ߡߊ߬ߘߊ ߟߊ߫.",
        "search-error": "ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߴߊ߬ ߞߎ߲߬ߓߐ߫ ߞߵߌ ߕߏ߫ $1 ߢߌߣߌ߲ ߠߊ߫",
        "search-warning": "ߖߊ߬ߛߙߋ߬ߡߊ߬ߟߊ ߘߏ߫ ߓߘߴߊ߬ ߞߎ߲߬ߓߐ߫ ߞߵߌ ߕߏ߫ $1 ߢߌߣߌ߲ ߠߊ߫",
        "preferences": "ߟߊ߬ߝߌ߬ߛߦߊ߬ߟߌ",
        "prefs-email": "ߢߎߡߍߙߋ߲ ߞߏ߲ߘߏ ߛߎߥߊ߲ߘߟߌ",
        "prefs-rendering": "ߟߊ߲ߞߣߍߡߊ",
        "saveprefs": "ߊ߬ ߟߊߞߎ߲߬ߘߎ߬",
+       "restoreprefs": "ߘߊ߲ߛߎ߲ ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߓߍ߯ ߟߊߞߎߣߎ߲߫ (ߕߍߕߎ߲߮ ߓߍ߯ ߘߐ߫)",
        "prefs-editing": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߴߌ ߘߐ߫",
        "searchresultshead": "ߢߌߣߌ߲ߠߌ߲",
        "stub-threshold-sample-link": "ߣߐ߰ߡߊ߲",
        "lockmanager-notlocked": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ \"$1\" ߟߊߞߊ߬ ߟߊ߫߸ ߊ߬ ߛߐ߰ߣߍ߲߬ ߕߍ߫.",
        "lockmanager-fail-closelock": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ \"$1\" ߞߐߕߐ߮ ߛߐ߰ߣߍ߲ ߘߊߕߎ߲߯ ߠߊ߫.",
        "lockmanager-fail-deletelock": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ \"$1\" ߞߐߕߐ߯ ߛߐ߰ߣߍ߲ ߖߏ߰ߛߌ߬ ߟߊ߫.",
+       "lockmanager-fail-releaselock": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫  \"$1\" ߞߊ߲߬.",
+       "lockmanager-fail-db-release": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫ ߓߟߏߡߟߊߝߊ߲ $1 ߞߊ߲߬.",
+       "lockmanager-fail-svr-release": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫ ߡߊ߬ߛߐ߬ߟߊ $1 ߞߊ߲߬.",
+       "zip-file-open-error": "ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߕߎ߲߬ ߓߘߴߊ߬ ߞߎ߲߬ߓߐ߫ ߞߵߌ ߕߏ߫ ߞߐߕߐ߮ ߘߟߊߞߊ߭ ߟߊ߫ ZIP ߝߛߍ߬ߝߛߍ߬ߟߌ߬ ߞߊ߲ߡߊ߬.",
+       "zip-wrong-format": "ߞߐߕߐ߯ ߡߊߕߍ߰ߣߍ߲ ߕߎ߲߬ ߕߍ߫ ZIP ߞߐߕߐ߯ ߘߌ߫.",
        "uploadstash": "ߥߊ߬ߣߊߙߌ ߟߊߦߟߍ߬",
        "uploadstash-clear": "ߞߐߕߐ߮ ߥߣߊ߬ߙߌ߬ߣߍ߲ ߠߎ߬ ߖߏ߬ߛߌ߬",
        "uploadstash-nofiles": "ߞߐߕߐ߮ ߥߣߊ߬߬ߙߌ߬ߣߍ߲߬ ߕߴߌ ߓߟߏ߫.",
        "uploadstash-file-not-found": "ߟߊߘߏ߲߬ߣߍ߲  \"$1\" ߕߍ߫ ߥߊ߬ߣߊߙߌ ߟߎ߬ ߘߐ߫.",
        "uploadstash-file-not-found-no-thumb": "ߞߝߊ߬ߟߋ߲ߛߋ߲ ߕߍ߫ ߣߊ߬ ߟߊߛߐ߬ߘߐ߲߬ ߠߊ߫.",
        "uploadstash-file-not-found-missing-content-type": "ߞߣߐߘߐ ߛߎ߯ߦߊ ߞߎ߲߬ߕߐ߮ ߞߐߢߌ߬ߣߊ߬ߣߍ߲߫.",
+       "uploadstash-file-not-found-not-exists": "ߌ ߕߴߛߋ߫ ߞߐߕߐ߮ ߝߊ߲߭ ߘߏ߫ ߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߥߟߴߊ߬ ߘߝߊߣߍ߲.",
+       "uploadstash-file-too-large": "ߊ߬ ߕߴߛߋ߫ ߞߐߕߐ߯ ߡߊߛߐ߫ ߟߊ߫ ߡߍ߲ ߢߊ߲ߞߊ߲ ߓߏ߲߬ߓߊ߫ ߖߌ߬ߦߊ߬ߘߊ߲ߕߊ $1 ߘߌ߫.",
+       "uploadstash-not-logged-in": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫߸ ߡߍ߲ ߕߊ߫ ߦߋ߫ ߞߐߕߐ߮ ߘߌ߫.",
+       "uploadstash-wrong-owner": "ߕߋ߲߭ߕߋ߲߭ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߊ߫ ߕߍ߫ ߞߐߕߐ߮ ($1) ߘߌ߫.",
+       "uploadstash-no-such-key": "ߒ߬ߒ߫ ߞߣߐߘߐ߫ ߛߎ߮ ߣߌ߲߬ ($1) ߕߴߛߋ߫ ߛߋ߲߬ߓߐ߫ ߟߊ߫.",
        "uploadstash-no-extension": "ߘߐ߬ߥߙߊ߬ߟߌ ߦߋ߫ ߝߏߦߊ߲ ߠߋ߬ ߘߌ߫.",
        "uploadstash-zero-length": "ߞߐߕߐ߮ ߦߋ߫ ߥߊ߲߬ߥߊ߲߬ ߘߐߞߏߟߏ߲ ߠߋ߬ ߘߌ߫.",
+       "img-auth-accessdenied": "ߓߊ߲߬ ߞߍߣߍ߲ ߠߋ߬ ߦߴߊ߬ ߟߊߛߐ߬ߘߐ߲߬ ߞߏ ߡߊ߬.",
+       "img-auth-badtitle": "ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߣߍ߲ ߕߴߛߋ߫ ߘߐߓߍ߲߬ ߠߊ߫ ߞߊ߬ ߝߘߊ߫ \"$1\".",
        "img-auth-nofile": "ߞߐߕߐ߮  \"$1\" ߕߍ߫ ߦߋ߲߬.",
+       "img-auth-isdir": "ߌ ߦߴߌ ߞߊߘߊ߲ ߞߊ߲߬ ߞߊ߬ ߦߌ߬ߘߊ߬ߥߟߊ ߟߊߛߐ߬ߘߐ߲߬ \"$1\" ߞߐߕߐ߮ ߟߎ߬ ߟߊߛߐ߬ߘߐ߲ ߘߐߙߐ߲߫ ߠߋ߬ ߟߊߘߌ߬ߢߍ߬ ߣߍ߲߬.",
+       "img-auth-streaming": "ߞߟߋߞߟߋ  \"$1\".",
        "img-auth-noread": "ߟߊ߬ߛߐ߬ߘߐ߲߬ߠߌ߲ ߝߙߍ߫ ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߦߋ߫ ߞߊ߬ \"$1\" ߘߐߞߊ߬ߙߊ߲߬.",
        "http-invalid-url": "URL: $1 ߓߍ߲߬ߓߊߟߌ",
        "http-request-error": "HTTP ߡߊ߬ߢߌ߬ߣߌ߲߬ߠߌ߲ ߓߘߊ߫ ߗߌߙߏ߲߫ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߡߊߟߐ߲ߓߊߟߌ ߘߏ߫ ߞߏߛߐ߲߬.",
        "mostinterwikis": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߥߞߌ ߣߌ߫ ߢߐ߲ߕߍ ߝߊ߲߬ߓߊ ߘߐ߫",
        "mostrevisions": "ߟߢߊ߬ߟߌ߬ ߦߙߌߞߊ߫ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߘߐ߫",
        "prefixindex": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߓߍ߯ ߟߊߝߟߐߣߍ߲߫",
+       "prefixindex-namespace": "ߢߍߣߙߊ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߓߍ߯ ߟߊ߫ ($1 ߕߐ߯ߛߓߍ ߞߣߍ)",
        "prefixindex-submit": "ߊ߬ ߦߌ߬ߘߊ߬",
+       "prefixindex-strip": "ߢߍߣߙߊ ߟߎ߬ ߢߡߊߘߏ߲߰ ߞߐߝߟߌ ߟߎ߬ ߘߐ߫.",
        "shortpages": "ߞߐߜߍ߫ ߛߎߘߎ߲ ߠߎ߬",
        "longpages": "ߞߐߜߍ߫ ߖߊ߲ ߠߎ߬",
+       "deadendpages": "ߞߐߜߍ߫ ߘߏ߲߬ߘߊ߬ߒߕߊ߲ ߠߎ߬",
        "deadendpagestext": "ߓߌ߬ߟߊ߬ߢߐ߲߰ߡߊ߬ ߕߍ߫ ߞߐߜߍ ߢߌ߲߬ ߠߎ߬ ߣߌ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߕߍ߫ {{SITENAME}} ߘߐ߫.",
        "protectedpages": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߎ߬",
        "protectedpages-filters": "ߛߍ߲ߛߍ߲ߟߊ߲ ߠߎ߬:",
+       "protectedpages-indef": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߘߊ߲߬ߠߊߕߍ߰ߓߊߟߌ ߘߐߙߐ߲߫",
+       "protectedpages-noredirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߢߡߊߘߏ߲߰",
        "protectedpages-timestamp": "ߕߎ߬ߡߊ ߓߊ߬ߘߌ߬ߟߊ߲",
        "protectedpages-page": "ߞߐߜߍ",
        "protectedpages-expiry": "ߊ߬ ߛߕߊ ߓߘߊ߫ ߝߊ߫",
        "wlheader-enotif": "ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫ ߡߙߌߣߊ߲߫ ߦߌߘߊ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߟߊ߫.",
        "wlheader-showupdated": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲߬ ߌ ߟߊ߫ ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲ ߞߐ߫߸ ߏ߬ ߟߎ߫ ߟߋ߬ ߦߌ߬ߘߊ߬ߣߍ߲߫ <strong>ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ</strong> ߘߐ߫.",
        "wlnote": "ߘߎ߰ߟߊ ߘߐ߫ {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} ߞߐ߯ߟߕߊ ߘߐ߫ {{PLURAL:$2|hour|<strong>$2</strong> hours}}, as of $3, $4.",
-       "wlshowlast": "ߕߎ߬ߡߊ߬ߙߋ߲ $1 ߞߐߟߕߊ $2 ߕߋ߬ߟߋ ߟߎ߬ ߦߌ߬ߘߊ߬",
        "watchlist-hide": "ߊ߬ ߢߡߊߘߏ߲߰",
        "watchlist-submit": "ߊ߬ ߦߌ߬ߘߊ߬",
        "wlshowtime": "ߊ߬ ߞߊߞߊ߲߫ ߞߊ߬ ߟߊߓߊ߯ߙߊ߫ ߥߎ߬ߛߎ ߡߍ߲ ߞߘߐ߫",
        "databasenotlocked": "ߓߟߏߡߟߊ ߝߊ߲ ߛߐ߰ߣߍ߲߬ ߕߍ߫.",
        "move-page": "$1 ߛߋ߲߬ߓߐ߫",
        "move-page-legend": "ߞߐߜߍ ߛߋ߲߬ߓߐ߫",
+       "namespace-nosubpages": "ߕߐ߯ߛߓߍ ߞߣߍ  \"$1\" ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫ ߞߐߜߍߙߋ߲ ߠߎ߬ ߦߋ߫.",
        "newtitle": "ߞߎ߲߬ߕߐ߰ ߞߎߘߊ:",
+       "move-watch": "ߓߊߖߎ߫ ߞߐߜߍ ߣߌ߫ ߞߏ߲߰ ߞߐߜߍ ߟߎ߬ ߡߊߝߟߍ߫.",
        "movepagebtn": "ߞߐߜߍ ߛߋ߲߬ߓߐ߬ߟߌ",
        "pagemovedsub": "ߛߋ߲߬ߓߐ߬ߟߌ ߓߘߊ߫ ߛߎߘߊ߲߫",
+       "cannotmove": "ߞߐߜߍ ߕߍ߫ ߛߐ߲߬ ߛߋ߲߬ߓߐ߬ ߟߊ߫߸ ߞߊ߬ ߓߍ߲߬ {{PLURAL:$1|ߞߎ߲߭|ߞߎ߲߭ ߠߎ߬}} ߡߊ߬.",
+       "movepage-moved": "<strong>\"$1\" ߓߘߊ߫ ߛߋ߲߬ߓߐ߫ ߞߵߊ߬ ߟߊߕߊ߯  \"$2\"</strong>",
+       "movepage-moved-redirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߓߘߊ߫ ߓߊ߲߫ ߛߌ߲ߘߌ߫ ߟߊ߫.",
+       "movepage-moved-noredirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߛߌ߲ߘߟߌ ߓߘߊ߫ ߓߊ߲߫ ߖߏ߬ߛߌ߬ ߟߊ߫.",
+       "movepage-delete-first": "ߞߏ߲߰ ߞߐߜߍ ߓߘߊ߫ ߟߊߢߊ߬ ߛߋ߲߬ߧߊ߬ ߦߙߌߞߊ߫ ߞߵߊ߬ ߝߐ߫ ߞߏ߫ ߊ߬ ߘߌ߫ ߖߏ߬ߛߌ߬ ߞߐߜߍ߫ ߛߋ߲߬ߓߐ߬ߣߍ߲ ߘߏ߫ ߘߌ߫. ߖߊ߰ߣߌ߲߫ ߞߐߜߍ ߖߏ߰ߛߌ߬ ߌ ߓߟߏ߫ ߟߊ߫߸ ߞߣߊ߬ ߕߏ߫ ߊ߬ ߡߊߝߍߣߍ߲߫ ߠߊ߫ ߕߎ߲߯.",
+       "articleexists": "ߞߐߜߍ ߕߐ߮ ߣߌ߲߬ ߦߋ߫ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߬߸ ߥߟߊ߫ ߌ ߟߊ߫ ߕߐ߯ ߛߎߥߊ߲ߘߌߣߍ߲ ߓߍ߲߬ ߣߍ߲߬ ߕߍ߫.\nߕߐ߯ ߜߘߍ߫ ߛߎߥߊ߲ߘߌ߫ ߖߊ߰ߣߌ߲߬.",
+       "cantmove-titleprotected": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߞߐߜߍ ߛߋ߲߬ߓߐ߫ ߟߊ߫ ߘߊߞߎ߲ ߣߌ߲߬ ߘߐ߫߸ ߓߊߏ߬ ߞߎ߲߬ߕߐ߰ ߞߎߘߊ ߓߘߊ߫ ߓߊ߲߫ ߟߊߞߊ߲ߘߊ߫ ߟߊ߫ ߛߌ߲ߘߟߌ ߡߊ߬.",
        "movetalk": "ߞߎߡߊߢߐ߲߯ߦߊ߫ ߞߐߜߍ߫ ߓߟߏߘߏ߲߬ߣߍ߲ ߠߎ߬ ߛߋ߲߬ߓߐ߫",
        "move-subpages": "ߞߐߜߍߙߋ߲ ߠߎ߬ ߛߋ߲߬ߓߐ߫ (ߦߊ߲߬ $1)",
        "move-talk-subpages": "ߞߐߜߍߙߋ߲ ߠߎ߬ ߛߋ߲߬ߓߐ߫ ߞߎߡߊߢߐ߲߯ߦߊ߫ ߞߐߜߍ (ߘߐ߫ ߦߊ߲߬ $1)",
+       "movepage-page-exists": "ߞߐߜߍ $1 ߦߋ߫ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߫߸ ߊ߬ ߘߏ߲߬ ߕߍ߫ ߛߐ߲߬ ߖߏ߰ߛߌ߬ ߞߏ ߡߊ߬ ߞߍߒߖߘߍߦߋߓߟߏߡߊ߬.",
+       "movepage-source-doesnt-exist": "ߞߐߜߍ $1 ߕߍ߫ ߦߋ߲߬߸ ߊ߬ ߘߏ߲߬ ߕߍ߫ ߛߐ߲߬ ߛߋ߲߬ߓߐ߬ ߟߊ߫.",
        "movepage-page-moved": "ߞߐߜߍ $1 ߓߘߊ߫ ߓߊ߲߫ ߓߐ߫ ߟߴߊ߬ ߣߐ߭ ߘߐ߫ ߞߊ߬ ߥߊ߫ ߦߊ߲߬ $2",
+       "movepage-page-unmoved": "ߞߐߜߍ $1 ߕߴߛߋ߫ ߓߐ߫ ߟߊ߫ ߦߊ߲߬ ߞߵߊ߬ ߟߊߕߊ߯ $2.",
        "movelogpage": "ߜߊ߲߬ߞߎ߲ ߓߐ߫ ߊ߬ ߡߊ߬",
        "movelogpagetext": "ߞߐߜߍ߫ ߛߋ߲߬ߓߐ߬ߣߍ߲ ߠߎ߬ ߓߍ߯ ߛߙߍߘߍ ߟߋ߬ ߦߋ߫ ߘߎ߰ߟߊߘߐ.",
        "movesubpage": "{{PLURAL:$1|ߞߐߜߍߙߋ߲|ߞߐߜߍߙߋ߲ ߠߎ߬}}",
        "redirect-revision": "ߞߐߜߍ ߣߐ߬ߡߊ߬ߛߊ߬ߦߌ߬ ߝߙߍߕߍ",
        "redirect-file": "ߞߐߕߐ߯ ߕߐ߮",
        "redirect-logid": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ID",
+       "redirect-not-exists": "ߡߐ߬ߟߐ߲ ߡߊ߬ ߛߐ߬ߘߐ߲߬",
+       "redirect-not-numeric": "ߡߐ߬ߟߐ߲ ߕߍ߫ ߢߎߡߍߙߋ߲ߡߊ߫ ߘߌ߫",
+       "fileduplicatesearch": "ߞߐߕߐ߯ ߓߊߟߌߣߍ߲ ߠߎ߬ ߢߌߣߌ߲߫",
+       "fileduplicatesearch-summary": "ߞߐߕߐ߯ ߓߊߟߌߣߍ߲ ߠߎ߬ ߢߌߣߌ߲߫ ߡߍ߲ ߠߎ߬ ߓߌ߲ߓߌ߲ߣߍ߲߫ ߦߋ߫ ߢߋߙߋ߲ߞߎߟߌ ߡߐ߬ߟߐ߲ ߡߊ߬.",
+       "fileduplicatesearch-filename": "ߞߐߕߐ߮ ߕߐ߮:",
+       "fileduplicatesearch-submit": "ߢߌߣߌ߲ߠߌ߲",
        "specialpages": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߐߜߍ ߟߎ߬",
        "tag-filter": "[[Special:Tags|ߞߊ߲ߠߊߛߓߍ]] ߢߡߊߘߏ߲߰ߣߍ߲",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|ߡߊ߬ߛߙߋ |ߡߊ߬ߛߙߋ ߟߎ߬ }}]]: $2",
index b96839b..b218a40 100644 (file)
        "watchthispage": "Tlhapetša letlakala le",
        "unwatch": "Tloša tlhapešo",
        "watchlist-details": "{{PLURAL:$1|$1 ya letlakala|$1 ya matlakala}} a lenano la ditlhapetšo tša gago, re sa bale matlakala a dipoledišano (dipolelo).",
-       "wlshowlast": "Laetša  $1 diiri $2 matšatši  tša gofeta",
        "watchlist-options": "Dikgatlego tša lenano la ditlhapetšo",
        "watching": "Tlhapeditše...",
        "unwatching": "Tlhapetšo eya tlošwa ...",
index be49d12..9475ca4 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 bibol}} noonook Djinanglist (wer waangkin bibol).",
        "wlheader-showupdated": "Bibol yallabel wallak kura noonook djinang balgup be yong-a bura <strong>moorn</strong>",
        "wlnote": "Ngardal  {{PLURAL:$1|yuttock wallak|nidja yuttock <strong>$1</strong> wallak}} il yuttock {{PLURAL:$2|hour|<strong>$2</strong> hours}}, nun o-luk $3, $4.",
-       "wlshowlast": "Yong-a yeye $1 hours $2 biryt",
        "watchlist-options": "djinanglist nidj-ka-nidja",
        "enotif_reset": "djiler yennar bibol nyiny",
        "dellogpage": "Barranginy boonadairn",
index 2c6fbba..e7ad902 100644 (file)
        "wlheader-enotif": "La notificacion per corrièr electronic es activada.",
        "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
        "wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
-       "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns",
        "watchlist-hide": "Amagar",
        "watchlist-submit": "Afichar",
        "wlshowtime": "Periòde afichat :",
        "img-lang-default": "(lenga per defaut)",
        "img-lang-info": "Afichar aqueste imatge en $1 $2.",
        "img-lang-go": "Amodar",
-       "ascending_abbrev": "creissent",
-       "descending_abbrev": "descreissent",
        "table_pager_next": "Pagina seguenta",
        "table_pager_prev": "Pagina precedenta",
        "table_pager_first": "Primièra pagina",
index b3c5c55..2e58b33 100644 (file)
        "wlheader-enotif": "ଇମେଲ ସୂଚନା ସଚଳ କରାଗଲା ।",
        "wlheader-showupdated": "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଉଅଛି ।",
        "wlnote": "$3, $4 ଅନୁସାରେ ବିଗତ {{PLURAL:$2|ଘଣ୍ଟାକରେ|<strong>$2</strong> ଘଣ୍ଟାରେ}}{{PLURAL:$1|ଶେଷ ବଦଳ|ଶେଷ <strong>$1</strong> ବଦଳ ତଳେ ଦିଆଗଲା}} ।",
-       "wlshowlast": "ଗତ $1 ଘଣ୍ଟା $2 ଦିନ ଦେଖାନ୍ତୁ",
        "wlshowhidecategorization": "ପୃଷ୍ଠା ଶ୍ରେଣୀବିଭାଗ",
        "watchlist-options": "ଦେଖଣା ବିକଳ୍ପସବୁ",
        "watching": "ଦେଖୁଛି...",
        "img-lang-default": "(ଡିଫଲ୍ଟ ଭାଷା)",
        "img-lang-info": "$1ରେ ଏହି ଛବିଟି ରେଣ୍ଡର କରନ୍ତୁ । $2",
        "img-lang-go": "ଯାଆନ୍ତୁ",
-       "ascending_abbrev": "ସାନରୁ ବଡ କ୍ରମରେ",
-       "descending_abbrev": "ବଖାଣ",
        "table_pager_next": "ପର ପୃଷ୍ଠା",
        "table_pager_prev": "ଆଗ ପୃଷ୍ଠା",
        "table_pager_first": "ପ୍ରଥମ ପୃଷ୍ଠା",
index a640b8e..5a89dc7 100644 (file)
        "unwatchthispage": "Мауал дар дæ цæст",
        "watchlist-details": "{{PLURAL:$1|$1 фарсмæ|$1 фарсмæ}} дæ цæст дарыс, тæрхоны фæрстæ нæ нымайгæйæ.",
        "wlnote": "Дæлæ афæстаг '''$2 сахаты дæргъы''' цы $1 {{PLURAL:$1|ивддзинад|ивддзинады}} æрцыди.",
-       "wlshowlast": "Фæстæг $1 сахаты, $2 боны дæргъы; .",
        "watchlist-options": "Цæстдард рæгъы фадæттæ",
        "watching": "Цæстдард фæрсты номхыгъдмæ афтауын...",
        "unwatching": "Цæстдард фæрсты номхыгъдæй аиуварс кæнын...",
index ad4fc4b..3a4961b 100644 (file)
        "watchlist-details": "ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।",
        "wlheader-enotif": "ਈਮੇਲ ਸੂਚਨਾ ਚਾਲੂ ਹੈ।",
        "wlnote": "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|<strong>$2</strong> ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:\n$1|ਤਬਦੀਲੀ ਹੋਈ|<strong>$1</strong> ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
-       "wlshowlast": "ਪਿਛਲੇ $1 ਘੰਟੇ $2 ਦਿਨ ਵਖਾਓ",
        "watchlist-hide": "ਲੁਕਾਓ",
        "watchlist-submit": "ਦਿਖਾਓ",
        "wlshowhideminor": "ਨਿੱਕੀਆਂ ਸੋਧਾਂ",
        "imgmultigoto": "$1 ਸਫ਼ੇ ਉੱਤੇ ਜਾਓ",
        "img-lang-default": "(ਮੂਲ ਭਾਸ਼ਾ)",
        "img-lang-go": "ਜਾਓ",
-       "ascending_abbrev": "ਵਧਦਾ",
-       "descending_abbrev": "ਘਟਦਾ",
        "table_pager_next": "ਅਗਲਾ ਸਫ਼ਾ",
        "table_pager_prev": "ਪਿਛਲਾ ਸਫ਼ਾ",
        "table_pager_first": "ਪਹਿਲਾ ਸਫ਼ਾ",
index 22e3439..9e1da98 100644 (file)
        "wlheader-enotif": "Makasalangi (enabled) ing pamipabalu kapamilatan ning e-mail.",
        "wlheader-showupdated": "'''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
        "wlnote": "{{PLURAL:$1|Ing makatuki ing tauling|Ding makatuki ring tauling '''$1''' miyalilan}} kilub {{PLURAL:$2|ning tauling metung a oras|ding tauling '''$2''' oras}}.",
-       "wlshowlast": "Pakit la reng tauling $1 oras $2 aldo",
        "watchlist-hide": "Isalikut",
        "wlshowtime": "Ipakit ya ing tauli:",
        "wlshowhideminor": "deng malating edit",
index 0e0a4a6..a17c7d3 100644 (file)
        "watchthispage": "Suire l'pache-lo",
        "unwatch": "N'poin suire",
        "watchlist-details": "{{PLURAL:$1|$1 pache|$1 paches}} din vote lisse à suire, chés paches éd disqhuchon n'sont poin conptées.",
-       "wlshowlast": "Montrer darin $1 eûres $2 jours",
        "watchlist-options": "Opchons del lisse à suire",
        "watching": "Suire…",
        "unwatching": "n'poin suire…",
index 35d1ae4..0221ab8 100644 (file)
        "unwatchthispage": "Nimmi watsche",
        "notanarticle": "Ken Blatt",
        "watchlist-details": "{{PLURAL:$1|$1 Blatt|$1 Bledder}} uff dei Watch-Lischt, ohne Gschwetz-Bledder",
-       "wlshowlast": "Zeig die Enneringe vun de letscht $1 Schtund, $2 Daag odder .",
        "watching": "Watsche…",
        "unwatching": "Nimmi watsche...",
        "enotif_impersonal_salutation": "{{SITENAME}}-Yuuser",
        "imgmultipagenext": "neegschtes Blatt →",
        "imgmultigo": "OK",
        "imgmultigoto": "Geh zu Blatt $1",
-       "ascending_abbrev": "uff",
-       "descending_abbrev": "ab",
        "table_pager_next": "Neegschtes Blatt",
        "table_pager_prev": "Letscht Blatt",
        "table_pager_first": "Erschtes Blatt",
index c696ffd..921cf9d 100644 (file)
        "watchthispage": "Die Said beowachde",
        "unwatch": "Nemme beowachde",
        "watchlist-details": "S hodd {{PLURAL:$1|$1 Said|$1 Saide}} uff doina Beowachdungslischd, Dischbediersaide zeeln nedd gdrennd.",
-       "wlshowlast": "Die ledschde $1 Schdunnd $2 Daach  zaische",
        "watchlist-options": "Meschlischkaide vunde Beowachdungslischd",
        "watching": "Beowachde ...",
        "unwatching": "Nimmi beowachde ...",
index d9c4d01..c257885 100644 (file)
        "go": "Przejdź",
        "searcharticle": "Przejdź",
        "history": "Historia strony",
-       "history_short": "historia",
+       "history_short": "Historia",
        "history_small": "historia",
        "updatedmarker": "zmienione od twojej ostatniej wizyty",
        "printableversion": "Wersja do druku",
        "nocreate-loggedin": "Nie masz uprawnień do tworzenia nowych stron.",
        "sectioneditnotsupported-title": "Edycja sekcji nie jest obsługiwana",
        "sectioneditnotsupported-text": "Edycja sekcji na tej stronie nie jest obsługiwana.",
+       "modeleditnotsupported-title": "Edytowanie nie jest wspierane",
+       "modeleditnotsupported-text": "Edytowanie dla modulu zawartości $1 nie jest wspierane.",
        "permissionserrors": "Błąd uprawnień",
        "permissionserrorstext": "Nie masz uprawnień do tego działania z {{PLURAL:$1|następującej przyczyny|następujących przyczyn}}:",
        "permissionserrorstext-withaction": "Nie masz uprawnień do $2 z {{PLURAL:$1|następującego powodu|następujących powodów}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Pusty obiekt",
        "content-json-empty-array": "Pusta tablica",
+       "unsupported-content-model": "<strong>Uwaga:</strong> Model zawartości $1 nie jest wspierany na tej wiki.",
+       "unsupported-content-diff": "Różnice dla modelu zawartości $1 nie są wspierane.",
+       "unsupported-content-diff2": "Różnice pomiędzy modelem zawartości $1 a $2 nie są wspierane na tej wiki.",
        "deprecated-self-close-category": "Strony zawierające nieprawidłowe samozamykające się znaczniki HTML",
        "deprecated-self-close-category-desc": "Strona zawiera samozamykające się znaczniki HTML, takie jak <code>&lt;b/></code> lub <code>&lt;span/></code>. Ich zachowanie zmieni się na dostosowane do specyfikacji HTML5, więc ich użycie w wikikodzie jest zdeprecjonowane.",
        "duplicate-args-warning": "<strong>Ostrzeżenie:</strong> [[:$1]] wywołuje [[:$2]] z więcej niż jedną wartością dla parametru \"$3\". Tylko ostatnia podana wartość zostanie użyta.",
        "wlheader-enotif": "Wysyłanie powiadomień na adres e‐mail jest włączone.",
        "wlheader-showupdated": "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej wizyty na nich.",
        "wlnote": "Poniżej pokazano {{PLURAL:$1|zmianę wykonaną|<strong>$1</strong> zmiany wykonane|<strong>$1</strong> zmian wykonanych}} w ciągu {{PLURAL:$2|ostatniej godziny|ostatnich <strong>$2</strong> godzin}}, licząc od $4 dnia $3.",
-       "wlshowlast": "Pokaż ostatnie $1 godzin, $2 dni",
        "watchlist-hide": "Ukryj",
        "watchlist-submit": "Pokaż",
        "wlshowtime": "Okres do wyświetlenia:",
        "sessionfailure": "Wydaje się, że wystąpił błąd z Twoją sesją zalogowania;\nto działanie zostało anulowane, aby uniknąć przechwycenia sesji.\nPrześlij formularz jeszcze raz.",
        "changecontentmodel": "Edycja modelu zawartości strony",
        "changecontentmodel-legend": "Zmienić model zawartości",
-       "changecontentmodel-title-label": "Tytuł strony",
+       "changecontentmodel-title-label": "Tytuł strony:",
        "changecontentmodel-current-label": "Obecny model zawartości:",
-       "changecontentmodel-model-label": "Nowy model zawartości",
+       "changecontentmodel-model-label": "Nowy model zawartości:",
        "changecontentmodel-reason-label": "Powód:",
        "changecontentmodel-submit": "Zmień",
        "changecontentmodel-success-title": "Model zawartości został zmieniony",
        "img-lang-default": "(język domyślny)",
        "img-lang-info": "Wyświetl tę ilustrację w $1. $2",
        "img-lang-go": "Dalej",
-       "ascending_abbrev": "rosn.",
-       "descending_abbrev": "mal.",
        "table_pager_next": "Następna strona",
        "table_pager_prev": "Poprzednia strona",
        "table_pager_first": "Pierwsza strona",
index 16da669..f1622c5 100644 (file)
        "wlheader-enotif": "La notìfica për pòsta eletrònica a l'é abilità.",
        "wlheader-showupdated": "Le pàgine che a son ëstàite modificà da quand che a l'é passaje ansima l'ùltima vira a resto marcà an '''grassèt'''",
        "wlnote": "Ambelessì sota a-i {{PLURAL:$1|é l'ùltima modìfica|son j'ùltime <strong>$1</strong> modìfiche}} ant {{PLURAL:$2|l'ùltima ora|j'ùltime <strong>$2</strong> ore}}, a parte da $3, $4.",
-       "wlshowlast": "Smon-e j'ùltime $1 ore $2 di",
        "watchlist-options": "Opsion ëd la lista dla ròba ch'as ten sot-euj",
        "watching": "Sot-euj...",
        "unwatching": "Ën gavand da lòn ch'as ten sot-euj...",
        "img-lang-default": "(lenga predefinìa)",
        "img-lang-info": "Rende costa plancia an $1. $2",
        "img-lang-go": "Andé",
-       "ascending_abbrev": "a chërse",
-       "descending_abbrev": "a calé",
        "table_pager_next": "Pàgina anans",
        "table_pager_prev": "Pàgina andré",
        "table_pager_first": "Prima pàgina",
index 7d2d07f..d4aaf9e 100644 (file)
        "wlheader-enotif": "ای-میل نوٹیفیکیشن قابل",
        "wlheader-showupdated": " صفے جیہڑے بدلے کۓ تھواڈے آخری وار آن مکرون  اونان نوں موٹا کرکے دسیا گیا اے۔",
        "wlnote": "تھلے {{PLURAL:$1|آخری تبدیلی|آخری تبدیلیاں '''1$''' }} آخر تے {{PLURAL:$2|کینٹہ|'''2$''' کینٹے}} 3$، 4$.",
-       "wlshowlast": "آخری $1 گھنٹے $2 دن  وکھاؤ",
        "watchlist-options": "نظر تھلے رکھن دیاں راہواں",
        "watching": "اکھ تھلے۔۔۔۔",
        "unwatching": "اولے",
        "imgmultipagenext": "اگلا صفحہ →",
        "imgmultigo": "جاؤ!",
        "imgmultigoto": "$1 تے جاؤ",
-       "ascending_abbrev": "اے ایس سی",
-       "descending_abbrev": "ڈی ایایس سی",
        "table_pager_next": "اگلا صفہ",
        "table_pager_prev": "پچھلا صفہ",
        "table_pager_first": "پہلا صفہ",
index 072aa10..85652ec 100644 (file)
        "unwatch": "Τέλεμαν τ' ωριαγματί",
        "unwatchthispage": "Τέλεμαν ωριαγματί",
        "watchlist-details": "{{PLURAL:$1|$1 σελίδα|$1 σελίδας}} ωριάσκουνταν, θέγα τα σελίδας καλατσεματί.",
-       "wlshowlast": "Φανέρωμαν τ' υστερναίων $1 ωρίων $2 ημερίων",
        "watchlist-options": "Επιλογάς ωριαγματί",
        "watching": "Ωριάζω...",
        "unwatching": "'κ ωριάζω...",
        "imgmultipagenext": "επόμενον σελίδα →",
        "imgmultigo": "Δέβα!",
        "imgmultigoto": "Δέβα σην σελίδαν $1",
-       "ascending_abbrev": "ανεβ",
-       "descending_abbrev": "κατεβ",
        "table_pager_next": "Επόμενον σελίδα",
        "table_pager_prev": "Πρωτεζνόν σελίδα",
        "table_pager_first": "Πρώτον σελίδα",
index 6d05f62..7f74154 100644 (file)
        "wlheader-enotif": "E-mail pawakīsenei ast enklaūtan.",
        "wlheader-showupdated": "Pastāi '''pastarīntan''' pāusai,  kawīdai bēi kitawīdintan ezze Twajjai panzdauman tenēisan kāimalukisnan..",
        "wlnote": "Zemmais pawaidinnā di {{PLURAL:$1|panzdauman kitawīdinsnan|panzdaumans '''$1''' kitawīdinsnans}} en {{PLURAL:$2|panzdauman stundin|'''$2''' panzdaumans stundins}}.",
-       "wlshowlast": "Waidinnais panzdaumans $1 stūndins, $2 dēinans ()",
        "watchlist-options": "Nadirītan listis mazīngiskwas",
        "watching": "As nadirēi...",
        "unwatching": "As wanginna nadirītwei...",
        "imgmultipagenext": "ripīntin pāusan →",
        "imgmultigo": "Ēis!",
        "imgmultigoto": "Ēis en pāusan $1",
-       "ascending_abbrev": "ūnzai ēntei",
-       "descending_abbrev": "zemmai ēntei",
        "table_pager_next": "Ripīntin pāusan",
        "table_pager_prev": "Ānkstaisin pāusan",
        "table_pager_first": "Pirman pāusan",
index 0aa842a..d0f097c 100644 (file)
        "wlheader-enotif": "برېښليک خبرونه چارنه شوې.",
        "wlheader-showupdated": "هغه مخونه چې ستاسې د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک په نښه شوي.",
        "wlnote": "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
-       "wlshowlast": "وروستي $1 ساعتونه $2 ورځې ښکاره کول",
        "watchlist-hide": "پټول",
        "watchlist-submit": "ښکاره کول",
        "wlshowtime": "وروستی ښکاره کول:",
        "imgmultigoto": "د $1 مخ ته ورځه",
        "img-lang-default": "(تلواليزه ژبه)",
        "img-lang-go": "ورځه",
-       "ascending_abbrev": "ختند",
-       "descending_abbrev": "مخښکته",
        "table_pager_next": "بل مخ",
        "table_pager_prev": "تېر مخ",
        "table_pager_first": "لومړی مخ",
index c55702b..bf58c17 100644 (file)
        "nocreate-loggedin": "Você não possui permissão para criar novas páginas.",
        "sectioneditnotsupported-title": "Edição por seções não suportada",
        "sectioneditnotsupported-text": "Edição por seções não suportada nesta página.",
+       "modeleditnotsupported-title": "Edição não suportada",
+       "modeleditnotsupported-text": "A edição não é suportada para o modelo de conteúdo $1.",
        "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Você não possui permissão de fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "permissionserrorstext-withaction": "Você não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos motivos a seguir}}:",
        "content-model-json": "JSON",
        "content-json-empty-object": "Objeto vazio",
        "content-json-empty-array": "Array vazia",
+       "unsupported-content-model": "<strong>Aviso:</strong> O modelo de conteúdo $1 não é suportado nessa wiki.",
+       "unsupported-content-diff": "Diffs não são suportados para o modelo de conteúdo $1.",
+       "unsupported-content-diff2": "Diferenças entre os modelos de conteúdo $1 e $2 não são suportadas nessa wiki.",
        "deprecated-self-close-category": "Páginas com etiquetas HTML de autofechamento não válidas",
        "deprecated-self-close-category-desc": "A página contém tags HTML auto-fechadas inválidas, como <code>&lt;b/></code> ou <code>&lt;span/></code>. O comportamento destas mudará em breve para coincidam com as especificações do HTML5, pelo que seu uso no wikitext está obsoleto.",
        "duplicate-args-warning": "<strong> Aviso: </strong> [[:$1]] está chamando [[:$2]] com mais de um valor para o parâmetro \"$3\". Será utilizado apenas o último valor fornecido.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
        "wlheader-showupdated": "As páginas modificadas desde a sua última visita são mostradas em <strong>negrito</strong>.",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
-       "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-hide": "Ocultar",
        "watchlist-submit": "Exibir",
        "wlshowtime": "Período de tempo a mostrar:",
        "sessionfailure": "Parece haver um problema com sua sessão de login;\nEsta ação foi cancelada como uma precaução contra o seqüestro de sessão.\nPor favor, reenvie o formulário.",
        "changecontentmodel": "Alterar o modelo de conteúdo de uma página",
        "changecontentmodel-legend": "Alterar o modelo de conteúdo",
-       "changecontentmodel-title-label": "Título da página",
+       "changecontentmodel-title-label": "Título da página:",
        "changecontentmodel-current-label": "Modelo de conteúdo atual:",
-       "changecontentmodel-model-label": "Modelo de conteúdo novo",
+       "changecontentmodel-model-label": "Modelo de conteúdo novo:",
        "changecontentmodel-reason-label": "Motivo:",
        "changecontentmodel-submit": "Mudar",
        "changecontentmodel-success-title": "O modelo de conteúdo foi alterado",
        "img-lang-default": "(Idioma padrão)",
        "img-lang-info": "Renderizar essa imagem em $1. $2",
        "img-lang-go": "Ir",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Próxima página",
        "table_pager_prev": "Página anterior",
        "table_pager_first": "Primeira página",
index 1de58ca..e550e4a 100644 (file)
        "wlheader-enotif": "A notificação por correio eletrónico está ativa.",
        "wlheader-showupdated": "As páginas modificadas desde a última vez que as visitou aparecem destacadas a <strong>negrito</strong>.",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
-       "wlshowlast": "Ver últimas $1 horas $2 dias",
        "watchlist-hide": "Ocultar",
        "watchlist-submit": "Mostrar",
        "wlshowtime": "Período de tempo a mostrar:",
        "img-lang-default": "(língua padrão)",
        "img-lang-info": "Compor esta imagem em $1. $2",
        "img-lang-go": "Compor",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Página seguinte",
        "table_pager_prev": "Página anterior",
        "table_pager_first": "Primeira página",
index 03c1da4..50b0658 100644 (file)
        "backend-fail-contenttype": "Used as fatal error message. Parameters:\n* $1 - a storage (file) path\n{{Related|Backend-fail}}",
        "backend-fail-batchsize": "Error message when the limit of operations to be done at once in the file backend was reached.\nParameters:\n* $1 - the number of operations attempted at once in this case\n* $2 - the maximum number of operations that can be attempted at once\nBoth parameters are PLURAL supported\n\nA \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.\n{{Related|Backend-fail}}",
        "backend-fail-usable": "Parameters:\n* $1 - the file name, including the path, formatted for the storage backend used\n{{Related|Backend-fail}}",
+       "backend-fail-stat": "Parameters:\n* $1 - the file name, including the path, formatted for the storage backend used\n{{Related|Backend-fail}}",
+       "backend-fail-hash": "Parameters:\n* $1 - the file name, including the path, formatted for the storage backend used\n{{Related|Backend-fail}}",
        "filejournal-fail-dbconnect": "Parameters:\n* $1 is the name of the \"[[:wikipedia:Front and back ends|backend]]\" that the file journal logs changes for.",
        "filejournal-fail-dbquery": "Parameters:\n* $1 is the name of the \"[[:wikipedia:Front and back ends|backend]]\" that the file journal logs changes for.",
        "lockmanager-notlocked": "Parameters:\n* $1 is a resource path (e.g. \"mwstore://media-public/a/ab/file.jpg\").",
index d02a286..fd9c55b 100644 (file)
        "wlheader-enotif": "E-chaskimanta musyachinaman arí nisqañam.",
        "wlheader-showupdated": "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
        "wlnote": "Kay qatiqpiqa {{PLURAL:$1|qhipaq hukchasqam|'''$1''' qhipaq hukchasqakunam}} qhipaq {{PLURAL:$2|urapim|'''$2''' urakunapim}}, musuqchasqa $3, $4.",
-       "wlshowlast": "$1 ura, $2 p'unchaw -mantapacha hukchasqakunata rikuchiy",
        "watchlist-hide": "Pakay",
        "watchlist-options": "Watiqana sutisuyupaq allinkachinakuna",
        "watching": "Watiqasqakunaman yapaspa...",
        "img-lang-default": "(kikinmanta rimay)",
        "img-lang-info": "Rikchata kaypi rindirisay: $1. $2",
        "img-lang-go": "Riy",
-       "ascending_abbrev": "wich",
-       "descending_abbrev": "uray",
        "table_pager_next": "Qatiq p'anqa",
        "table_pager_prev": "Ñawpaq p'anqa",
        "table_pager_first": "Ñawpaq ñiqin p'anqa",
index cc6a96d..c66fb49 100644 (file)
        "watchthispage": "Kay pankata rikukuna",
        "unwatch": "Ñamana rikuna",
        "watchlist-details": "{{PLURAL:$1|$1 pankata|$1 pankakunata}} rikukunki (rimanakuy pankakunata mana yupakpika).",
-       "wlshowlast": "$1 pachapi, $2 punchapi rurashka  mushuk killkaykunata rikuna",
        "watchlist-options": "rikukushka pankakuna pankapa akllaykuna",
        "watching": "Ñami chay pankata rikukukripanki...",
        "unwatching": "Ñamana rikukuchishpa...",
index cc8548a..5d8a729 100644 (file)
        "watchthispage": "Ḥḍa tasna ya",
        "unwatch": "Ur ḥṭṭa",
        "watchlist-details": "{{PLURAL:$1|$1 n Tasniwin|$1 n Tasniwin}} Twaẓrent bla Tasniwin n usiwl.",
-       "wlshowlast": "Sseml-ad $1 tisεεatin $2 ussan  inggura",
        "watching": "Ḥṭṭigh...",
        "unwatching": "Ur ḥṭṭigh...",
        "deletepage": "ⴽⴽⵙ ⵜⴰⵙⵏⴰ",
index 1a5b559..3f846d0 100644 (file)
        "wlheader-enotif": "Il servetsch d'infurmaziun per e-mail è activà.",
        "wlheader-showupdated": "Paginas ch'èn vegnidas modifitgadas suenter che ti has vis els la davosa giada èn mussads '''grass'''",
        "wlnote": "Sutvart {{PLURAL:$1|è l'ultima midada|èn las ultimas <strong>$1</strong> midadas}} entaifer {{PLURAL:$2|l'ultima ura|las ultimas <strong>$2</strong> uras}}. Actualisà ils $3 las $4.",
-       "wlshowlast": "Mussar: las ultimas $1 uras, ils ultims $2 dis.",
        "watchlist-options": "Opziuns per la glista d'observaziun",
        "watching": "observ...",
        "unwatching": "observ betg pli...",
        "imgmultipagenext": "proxima pagina →",
        "imgmultigo": "Dai!",
        "imgmultigoto": "Ir a la pagina $1",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Proxima pagina",
        "table_pager_prev": "Ultima pagina",
        "table_pager_first": "Emprima pagina",
index f716dc8..d08a6bc 100644 (file)
        "wlheader-enotif": "Notificarea prin e-mail este activată.",
        "wlheader-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
        "wlnote": "Mai jos se află {{PLURAL:$1|ultima schimbare|ultimele <strong>$1</strong> schimbări|ultimele <strong>$1</strong> de schimbări}} din {{PLURAL:$2|ultima oră|ultimele <strong>$2</strong> ore|ultimele <strong>$2</strong> de ore}}, așa cum era situația la $3, $4.",
-       "wlshowlast": "Arată ultimele $1 ore $2 zile",
        "watchlist-hide": "Ascunde",
        "watchlist-submit": "Afișează",
        "wlshowtime": "Perioada de timp de afișat:",
        "img-lang-default": "(limba implicită)",
        "img-lang-info": "Randează această imagine în $1. $2",
        "img-lang-go": "Du-te",
-       "ascending_abbrev": "cresc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Pagina următoare",
        "table_pager_prev": "Pagina anterioară",
        "table_pager_first": "Prima pagină",
index fb2c988..a55c17d 100644 (file)
        "recentchangeslinked-page": "Nome d'a vôsce:",
        "recentchangeslinked-to": "Fa vedè le cangiaminde de le pàggene colleghete a 'na certa pàgene",
        "recentchanges-page-added-to-category": "[[:$1]] aggiunde a categorije",
+       "recentchanges-page-removed-from-category": "[[:$1]] luate da 'a categorije",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] luate da 'a categorije, [[Special:WhatLinksHere/$1|sta vôsce ste sckaffate jndr'à otre pàggene]]",
        "autochange-username": "Cangiamende automateche de MediaUicchi",
        "upload": "Careche 'u file",
        "wlheader-enotif": "* Notifiche pe email abbilitate.",
        "wlheader-showupdated": "* Le pàggene ca onne state cangiate da l'urtema visite avènene fatte vedè in '''grascette'''",
        "wlnote": "Aqquà sotte {{PLURAL:$1|ste l'urteme cangiamende|stonne l'urteme <strong>$1</strong> cangiaminde}} jndr'à {{PLURAL:$2|l'urtema ore|l'urteme <strong>$2</strong> ore}}, jndr'à $3, $4.",
-       "wlshowlast": "Vide l'urteme $1 ore $2 sciurne",
        "watchlist-hide": "Scunne",
        "watchlist-submit": "Fà 'ndrucà",
        "wlshowhideminor": "cangiaminde stuèdeche",
        "img-lang-default": "(lènghe de base)",
        "img-lang-info": "Renderizze st'immaggine jndr'à $1. $2",
        "img-lang-go": "Véje",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Pàgena successive",
        "table_pager_prev": "Pàgena precedende",
        "table_pager_first": "Prima pàgene",
index bac1564..9b297b8 100644 (file)
                        "Serhio Magpie",
                        "ЛингвоЧел",
                        "OlegVeliky",
-                       "Saimongoltinio"
+                       "Saimongoltinio",
+                       "Wikisaurus"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "tog-hideminor": "Скрывать малые изменения из списка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
-       "tog-hidecategorization": "СкÑ\80Ñ\8bваÑ\82Ñ\8c ÐºÐ°Ñ\82егоÑ\80изаÑ\86иÑ\8e Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "tog-hidecategorization": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ñ\81оÑ\81Ñ\82ава Ð¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 ÐºÐ°Ñ\82егоÑ\80ий",
        "tog-extendwatchlist": "Расширить список наблюдения, включая все изменения, а не только последние",
        "tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
        "tog-numberheadings": "Автоматически нумеровать заголовки",
        "tog-watchlistunwatchlinks": "Добавить прямые маркеры для включения/исключения из списка наблюдения ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) для наблюдаемых страниц с изменениями (для переключения функций требуется JavaScript)",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
-       "tog-watchlisthidecategorization": "СкÑ\80Ñ\8bваÑ\82Ñ\8c ÐºÐ°Ñ\82егоÑ\80изаÑ\86иÑ\8e Ñ\81Ñ\82Ñ\80аниÑ\86",
+       "tog-watchlisthidecategorization": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ñ\81оÑ\81Ñ\82ава Ð¾Ñ\82Ñ\81леживаемÑ\8bÑ\85 ÐºÐ°Ñ\82егоÑ\80ий",
        "tog-ccmeonemails": "Отправлять мне копии писем, которые я посылаю другим участникам",
        "tog-diffonly": "Не показывать содержание страницы под сравнением двух версий",
        "tog-showhiddencats": "Показывать скрытые категории",
        "nocreate-loggedin": "У вас нет разрешения создавать новые страницы.",
        "sectioneditnotsupported-title": "Редактирование разделов не поддерживается",
        "sectioneditnotsupported-text": "На этой странице не поддерживается редактирование разделов",
+       "modeleditnotsupported-title": "Редактирование не поддерживается",
+       "modeleditnotsupported-text": "Редактирование не поддерживается моделью содержимого $1.",
        "permissionserrors": "Ошибка прав доступа",
        "permissionserrorstext": "У вас нет прав на выполнение этой операции по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "permissionserrorstext-withaction": "У вас нет прав на выполнение действия «$2» по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "content-model-json": "JSON",
        "content-json-empty-object": "Пустой объект",
        "content-json-empty-array": "Пустой массив",
+       "unsupported-content-model": "<strong>Внимание:</strong> Модель содержимого $1 не поддерживается на этой вики.",
+       "unsupported-content-diff": "Изменения (различия) не поддерживаются моделью содержимого $1.",
+       "unsupported-content-diff2": "Изменения (различия) между моделями содержимого $1 и $2 не поддерживаются на этой вики.",
        "deprecated-self-close-category": "Страницы, использующие недопустимые самозакрывающиеся HTML-теги",
        "deprecated-self-close-category-desc": "Страница содержит недопустимые самозакрывающиеся HTML-теги, такие как <code>&lt;b/></code> или <code>&lt;span/></code>. В скором времени их действие изменится, чтобы соответствовать спецификации HTML5, так что использование этих устаревших тегов в вики-тексте нежелательно.",
        "duplicate-args-warning": "<strong>Внимание:</strong> [[:$1]] вызывает [[:$2]] с более чем одним значением параметра «$3». Будет использовано только последнее указанное значение.",
        "wlheader-enotif": "Уведомления по эл. почте включены.",
        "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены <strong>полужирным</strong> шрифтом.",
        "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последние изменения|показаны <strong>$1</strong> последних изменений}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часа|последние <strong>$2</strong> часов}}, по состоянию на $3 $4.",
-       "wlshowlast": "Показать за последние $1 часов $2 дней",
        "watchlist-hide": "Скрыть",
        "watchlist-submit": "Показать",
        "wlshowtime": "Период времени для отображения:",
        "ipb-confirm": "Подтвердить блокировку",
        "ipb-sitewide": "Во всём проекте",
        "ipb-partial": "Частичная",
-       "ipb-sitewide-help": "Каждая страница вики и все другие действия вклада.",
+       "ipb-sitewide-help": "Каждая страница вики и все другие действия.",
        "ipb-partial-help": "Конкретные страницы или пространства имён.",
        "ipb-pages-label": "Страницы",
        "ipb-namespaces-label": "Пространства имён",
        "movereason": "Причина:",
        "revertmove": "возврат",
        "delete_and_move_text": "Страница с именем «[[:$1]]» уже существует. \nХотите удалить её, чтобы сделать возможным переименование?",
-       "delete_and_move_confirm": "Ð\94а, Ñ\83далиÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83",
+       "delete_and_move_confirm": "Ð\94а, Ñ\83далиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, Ð½Ð° ÐºÐ¾Ñ\82оÑ\80Ñ\83Ñ\8e Ð¿Ñ\80оизводиÑ\82Ñ\81Ñ\8f Ð¿ÐµÑ\80еименование",
        "delete_and_move_reason": "Удалено для возможности переименования «[[$1]]»",
        "selfmove": "Невозможно переименовать страницу: исходное и новое имя страницы совпадают.",
        "immobile-source-namespace": "Невозможно переименовывать страницы в пространстве имён «$1»",
        "img-lang-default": "(язык по умолчанию)",
        "img-lang-info": "Показать это изображение на языке $1 $2",
        "img-lang-go": "Применить",
-       "ascending_abbrev": "возр",
-       "descending_abbrev": "убыв",
        "table_pager_next": "Следующая страница",
        "table_pager_prev": "Предыдущая страница",
        "table_pager_first": "Первая страница",
        "logentry-block-block": "$1 заблокировал{{GENDER:$2||а}} {{GENDER:$4|$3}} на период $5 $6",
        "logentry-block-unblock": "$1 разблокировал{{GENDER:$2||а}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|изменил|изменила}} срок блокировки {{GENDER:$4|$3}} на период $5 $6",
-       "logentry-partialblock-block-page": "{{PLURAL:$1|страница|страницы}} $2",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|страницы|страниц}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|пространство имён|пространства имён}} $2",
        "logentry-partialblock-block": "$1 {{GENDER:$2|заблокировал|заблокировала}} {{GENDER:$4|$3}} на редактирование $7 на период $5 $6",
        "logentry-partialblock-reblock": "$1 {{GENDER:$2|изменил|изменила}} настройки блокировки {{GENDER:$4|$3}}, предотвращающий правки $7 на период $5 $6",
index a520fd1..443cbff 100644 (file)
        "wlheader-enotif": "Упозорнїня  ел. поштов є запнуте.",
        "wlheader-showupdated": "Сторінкы, котры ся змінили од вашой послїднёй навщівы суть вказаны '''грубо'''",
        "wlnote": "Ниже є {{PLURAL:$1|остатня зміна|остатнї $1 зміны|остатнїх $1 змін}} за {{PLURAL:$2|остатнїй|остатнї|остатнїх}} <b>$2</b> {{PLURAL:$2|годину|годины|годин}} до do $4, $3.",
-       "wlshowlast": "Вказати послїднїх $1 годин $2 днїв",
        "watchlist-hide": "Сховати",
        "watchlist-submit": "Вказати",
        "wlshowhideminor": "малы едітації",
        "imgmultipagenext": "далша сторінка →",
        "imgmultigo": "Перейти!",
        "imgmultigoto": "Перейти на сторінку $1",
-       "ascending_abbrev": "зрост",
-       "descending_abbrev": "спад",
        "table_pager_next": "Далша сторінка",
        "table_pager_prev": "Попередня сторінка",
        "table_pager_first": "Перша сторінка",
index 48515b0..893d23d 100644 (file)
        "wlheader-enotif": "वि-पत्रस्य सूचनाः सक्रियाः ।",
        "wlheader-showupdated": " येषु पृष्ठेषु भवता/भवत्या परिवर्तनं कृतम् आसीत्, तानि पृष्ठानि अत्र <strong>bold</strong> प्राप्यन्ते ।",
        "wlnote": "$3 : $4 वादनं यावत् <strong>$2</strong> होरां यवात् {{PLURAL:$2|होरायां|होरासु}} {{PLURAL:$1|एकं परिवर्तनं|परिवर्तनानि <strong>$1</strong>}} अधः {{PLURAL:$1|अस्ति|सन्ति}}।",
-       "wlshowlast": "अन्तिमाः $1 होराः, अन्तिमानि $2 दिनानि  दृश्यन्ताम्",
        "watchlist-options": "निरीक्षासूचेः विकल्पाः",
        "watching": "निरीक्षते...",
        "unwatching": "निरीक्षाम् अपाकरोति...",
        "img-lang-default": "(यदभावे भाषा)",
        "img-lang-info": "$1 इत्मात् एतत् चित्रं स्थापितम् । $2",
        "img-lang-go": "गम्यताम्",
-       "ascending_abbrev": "आरुह्",
-       "descending_abbrev": "अवरुह्",
        "table_pager_next": "अग्रिमं पृष्ठम्",
        "table_pager_prev": "पूर्वतनं पृष्ठम्",
        "table_pager_first": "प्रथमं पृष्ठम्",
index e2bb3e4..011a9e3 100644 (file)
        "wlheader-enotif": "Эл. почтанан биллэрии холбоммут.",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
        "wlnote": "Манна кэлиҥҥи {{PLURAL:$2|чаас|<strong>$2</strong> чаас}} иһигэр оҥоһуллубут бүтэһик <strong>$1</strong> уларытыы көрдөрүлүннэ, бу кэминээҕи туругунан $3, $4.",
-       "wlshowlast": "Бүтэһик $2 күҥҥэ $1 чааска көрдөр",
        "watchlist-hide": "Кистээ",
        "watchlist-submit": "Көрдөр",
        "wlshowtime": "Бу ыккардыгар буолбуту көрдөр:",
        "img-lang-default": "(эппэтэххэ талыллар тыла)",
        "img-lang-info": "Бу ойууну $1 тылынан көрдөр. $2",
        "img-lang-go": "Толор",
-       "ascending_abbrev": "улаатыннар",
-       "descending_abbrev": "кыччат",
        "table_pager_next": "Аныгыскы сирэй",
        "table_pager_prev": "Иннинээҕи сирэй",
        "table_pager_first": "Бастакы сирэй",
index f6847d1..d48829e 100644 (file)
        "watchlist-details": "{{PLURAL:$1 ᱥᱟᱦᱴᱟ|$1 ᱥᱟᱦᱴᱟᱠᱚ}} ᱟᱢᱟᱜ ᱧᱮ ᱞᱤᱥᱴᱤ ᱨᱮ ᱢᱮᱱᱟᱜ-ᱟ (ᱨᱚᱲ ᱥᱟᱦᱴᱟ ᱠᱚᱦᱚᱸ)",
        "wlheader-showupdated": "ᱟᱢᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱞᱚᱝᱨᱮ ᱡᱟᱸᱦᱟᱸ ᱥᱟᱦᱴᱟ ᱠᱚᱢ ᱵᱚᱫᱚᱞ ᱞᱮᱫᱟ ᱚᱱᱟᱠᱩ ᱧᱮᱞᱚᱜ-ᱟ <strong>bold</strong>.",
        "wlnote": "ᱞᱟᱛᱟᱨ ᱨᱮᱱᱟᱜ {{PLURAL:$1|ᱫᱚ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞ ᱠᱟᱱᱟ|ᱠᱚ ᱫᱚ ᱢᱩᱪᱟᱹᱫ <strong>$1</strong> ᱵᱚᱫᱚᱞᱠᱟᱱᱟ}} ᱢᱩᱪᱟᱹᱫ ᱨᱮ {{PLURAL:$2|ᱴᱟᱲᱟᱝ|<strong>$2</strong> ᱴᱟᱲᱟᱝ}},  $3, $4 ᱞᱮᱠᱟᱛᱮ ᱾",
-       "wlshowlast": "ᱢᱩᱪᱟᱹᱛ ᱩᱫᱩᱜᱢᱮ $1 ᱴᱟᱲᱟᱝ $2 ᱢᱟᱦᱟᱸ",
        "watchlist-options": "ᱧᱮᱞᱚᱜ ᱛᱟᱹᱞᱠᱟᱹ ᱨᱮᱭᱟᱜ ᱥᱚᱝᱠᱮᱛᱠᱩ",
        "watching": "ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ...",
        "enotif_reset": "ᱱᱤᱱᱦᱟᱹᱭᱢᱮ ᱡᱚᱛᱚ ᱥᱟᱦᱴᱟ ᱦᱤᱨᱤᱭᱟᱠᱟᱱᱟ",
index 2577fcc..94acced 100644 (file)
        "unwatchthispage": "Boga custa pàgina dae sa watchlist tua",
        "notanarticle": "Custa pàgina no est unu artìculu",
        "watchlist-details": "Tenes {{PLURAL:$1|$1 pàgina annotada paris a sa pagina de cuntierra sua|$1 pàginas annotadas paris a is pàginas de cuntierra issoro}}.",
-       "wlshowlast": "Ammustra is ùrtimas $1 oras, $2 dies",
        "watchlist-options": "Optziones subra sa lista de pàginas annotadas",
        "watching": "Giunghende a sa watchlist...",
        "unwatching": "Boghende dae sa watchlist...",
index 3ad5d06..2f9216e 100644 (file)
        "wlheader-enotif": "La nutìfica via posta elittrònica è attivata.",
        "wlheader-showupdated": "Li pàggini ca foru canciati dâ tò ùrtima vìsita sunnu evidinziati n <strong>grassettu</strong>.",
        "wlnote": "Sutta attrovi l'ùrtim{{PLURAL:$1|u canciamentu|i <strong>$1</strong> canciamenti}} fatti nta l'ùrtim{{PLURAL:$1|a ura|i <strong>$2</strong> uri}}, aggiurnati ê $4 dû $3.",
-       "wlshowlast": "Ammustra l'ùrtimi $1 uri $2 jorna",
        "watchlist-options": "Opzioni dâ lista taliata",
        "watching": "Agghiunciuta â lista taliata...",
        "unwatching": "Cancillata dâ lista taliata...",
        "img-lang-default": "(lingua pridifinuta)",
        "img-lang-info": "Gènira sta mmàggini n $1. $2",
        "img-lang-go": "Vai",
-       "ascending_abbrev": "crisc",
-       "descending_abbrev": "dicrisc",
        "table_pager_next": "Pàggina succissiva",
        "table_pager_prev": "Pàggina pricidenti",
        "table_pager_first": "Prima pàggina",
index 6cd4068..ea5a078 100644 (file)
        "wlheader-enotif": "Wab-mail annooncemant is enabled.",
        "wlheader-showupdated": "Pages that hae been chynged sin ye last veesitit thaim ar shawn in '''baud'''.",
        "wlnote": "Ablo {{PLURAL:$1|is the laist chynge|ae the laist <strong>$1</strong> chynges}} in the laist {{PLURAL:$2|hoor|<strong>$2</strong> hoors}}, aes o $3, $4.",
-       "wlshowlast": "Shaw the hainmaist $1 hoors $2 days",
        "watchlist-options": "Watchleet opties",
        "watching": "Watchin...",
        "unwatching": "Onwatchin...",
        "img-lang-default": "(defaut leid)",
        "img-lang-info": "Render this eemage in $1. $2",
        "img-lang-go": "Gang",
-       "ascending_abbrev": "asc",
-       "descending_abbrev": "desc",
        "table_pager_next": "Page aifter",
        "table_pager_prev": "Page afore",
        "table_pager_first": "First page",
index cc8c8ff..894b29e 100644 (file)
        "unwatchthispage": "نظر ۾ رکڻ ڇڏيو",
        "notanarticle": "غير موادي صفحو",
        "watchlist-details": "توھان جي نظر ۾ فھرست (گڏوگڏ بحث صفحن تي) {{PLURAL:$1|$1 صفحو آھي|$1 صفحا آھن}}.",
-       "wlshowlast": "گذريل $1 ڪلاڪ $2 ڏينهن ڏيکاريو",
        "watchlist-hide": "لڪايو",
        "watchlist-submit": "ڏيکاريو",
        "wlshowtime": "ڪيترو عرصو ڏيکارجي:",
index e4c4353..515274a 100644 (file)
        "wlheader-enotif": "La nutìfica via postha erettrònica è attiba.",
        "wlheader-showupdated": "Li pàgini chi so isthaddi mudìfiggaddi daboi l'ulthima vìsita so evidenziaddi in '''grasseddu'''",
        "wlnote": "Inogghi {{PLURAL:$1|è erencadda la mudìfigga più rizzenti arriggadda|so erencaddi li '''$1''' mudìfigghi più rizzenti arriggaddi}} {{PLURAL:$2|i' la ulthima ora|i' li ulthimi '''$2''' ori}}.",
-       "wlshowlast": "Musthra li ùlthimi $1 ori $2 dì",
        "watchlist-options": "Opzioni abbaidaddi ippiziari",
        "watching": "Aggiunta a l'abbaidaddi ippiziari...",
        "unwatching": "Eliminazioni da l'abbaidaddi ippiziari...",
        "imgmultipagenext": "pàgina sighenti →",
        "imgmultigo": "Vai",
        "imgmultigoto": "Vai a la pàgina $1",
-       "ascending_abbrev": "crisc",
-       "descending_abbrev": "miminan",
        "table_pager_next": "Pàgina sighenti",
        "table_pager_prev": "Pàgina prizzidenti",
        "table_pager_first": "Primma pàgina",
index 6685ac4..8aa237b 100644 (file)
        "watch": "چاودێری بکە",
        "unwatch": "لاوردن چاودێری",
        "watchlist-details": "بێجگە پەڕەگان وەتوویش، {{PLURAL:$1|$1 پەڕە}} لە پێرست چاودێریەگەتە.",
-       "wlshowlast": "دۊایین $1 دەمژمار $2 ڕووژ  نیشان بدە",
        "watchlist-options": "ھەڵوژیاێەگان پێرست چاودێری",
        "actioncomplete": "کردارەگە وە ئەنجام رەسی",
        "actionfailed": "کردارەگە سەرنەکەفت",
index 4c96fa6..4cb1966 100644 (file)
        "wlheader-enotif": "E-poastaalmmuhusat leat anus.",
        "wlheader-showupdated": "Siiddut, mat leat rievdaduvvon du maŋimus geavahangearddi maŋŋá leat merkojuvvon '''buoiddes teavsttain'''",
        "wlnote": "Vuolábealde lea '''$1''' {{PLURAL:$1|rievdadus|rievdadusa}} maŋimus {{PLURAL:$2||'''$2'''}} diimma siste.",
-       "wlshowlast": "Čájet maŋimus $1 diimmu dahje $2 beaivvi",
        "watching": "Lasihuvvo čuovvunlistui...",
        "unwatching": "Sihkojuvvo čuovvunlisttus...",
        "enotif_reset": "Merke buot siidduid gehččojuvvon",
        "imgmultipageprev": "← ovddit siidu",
        "imgmultipagenext": "čuovvovaš siidu →",
        "imgmultigo": "Mana!",
-       "ascending_abbrev": "loktaneaddji",
-       "descending_abbrev": "vuolláneaddji",
        "table_pager_next": "Čuovvovaš siidu",
        "table_pager_prev": "Ovddit siidu",
        "table_pager_first": "Vuosttas siidu",
index 3f3e7b3..562ce6d 100644 (file)
        "watchthispage": "Cáminot jan páhina",
        "unwatch": "Diicáminot",
        "unwatchthispage": "Diicáminot jan páhina",
-       "wlshowlast": "Cohuatlöx hun $1 ixáap quij iitax $2 ixáap",
        "watching": "Cáminot...",
        "unwatching": "Necáminot...",
        "enotif_impersonal_salutation": "{{SITENAME}} caitom",
index e45a0d5..72d6e66 100644 (file)
        "wlheader-enotif": "Bataga bayrandiyan n' ka tunandi.",
        "wlheader-showupdated": "Moɲey kaŋ barmay za cee koraa kaŋ war n'i guna ga cebandi harfu <strong>warga</strong> ra.",
        "wlnote": "Ne ganda {{PLURAL:$1|ti barmay kokorante <strong>$1</strong>}} za {{PLURAL:$2|guuru kokorante <strong>$2</strong> ra}}, $3 hane, $4 waate.",
-       "wlshowlast": "Guuru $1 zaari $2 kokorante cebe",
        "watchlist-options": "Hawgayhaya suubarey",
        "watching": "Goo ma hawgay…",
        "unwatching": "Ši ma guna…",
        "img-lang-default": "(tilasu šenni)",
        "img-lang-info": "Biyoo woo kaataray $1 ra. $2",
        "img-lang-go": "Koy",
-       "ascending_abbrev": "ziji",
-       "descending_abbrev": "zunbu",
        "table_pager_next": "Jinehere moɲoo",
        "table_pager_prev": "Moo bisantaa",
        "table_pager_first": "Moo jinaa",
index 3e43228..0edb66d 100644 (file)
        "wlheader-enotif": "El. pašta primėnėmā ijongtė īr.",
        "wlheader-showupdated": "Poslapē, katros kažėkas pakeitė nug Tamstas paskotėnė apsilonkīma, īr pažīmietė <strong>stuorā</strong>.",
        "wlnote": "Apatiuo ī {{PLURAL:$1|vielībāsis pakeitėms|vielībė̄jė <strong>$1</strong> pakeitėmā}} par {{PLURAL:$2|paskotėnė adīna|paskotėnės <strong>$2</strong> adīnas|paskotėniu <strong>$2</strong> adīnu}} tap, kap daba ī $3, $4.",
-       "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū pakeitėmus",
        "watchlist-hide": "Kavuotė",
        "watchlist-submit": "Ruodītė",
        "wlshowhideminor": "maži pakeitėmā",
        "imgmultigo": "Ētė!",
        "imgmultigoto": "Ētė i poslapi $1",
        "img-lang-default": "(kalba kāp nustatīta)",
-       "ascending_abbrev": "dėdiejėma tvarka",
-       "descending_abbrev": "mažiejontė tvarka",
        "table_pager_next": "Kėts poslapis",
        "table_pager_prev": "Onkstesnis poslapis",
        "table_pager_first": "Pėrms poslapis",
index ad61050..a66ead3 100644 (file)
        "nocreate-loggedin": "Nemate dopuštenje da kreirate nove stranice.",
        "sectioneditnotsupported-title": "Uređivanje sekcije nije podržano",
        "sectioneditnotsupported-text": "Uređivanje sekcije nije podržano na ovoj stranici.",
+       "modeleditnotsupported-title": "Uređivanje nije podržano",
+       "modeleditnotsupported-text": "Uređivanje nije podržano za sadržajni model $1.",
        "permissionserrors": "Greška pri odobrenju",
        "permissionserrorstext": "Nemate dopuštenje da to uradite, iz {{PLURAL:$1|slijedećeg razloga|slijedećih razloga}}:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2, zbog {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Prazan objekat",
        "content-json-empty-array": "Prazan niz",
+       "unsupported-content-model": "<strong>Upozorenje:</strong> Sadržajni model $1 nije podržan na ovom wikiju.",
+       "unsupported-content-diff": "Razlike nisu podržane za sadržajni model $1.",
+       "unsupported-content-diff2": "Razlike između sadržajnih modela $1 i $2 nisu podržane na ovom wikiju.",
        "deprecated-self-close-category": "Stranice s neispravnim samozatvorenim HTML oznakama",
        "deprecated-self-close-category-desc": "Stranica sadrži neispravne samozatvorene HTML oznake, kao što su <code>&lt;b/></code> ili <code>&lt;span/></code>. Njihovo funkcioniranje uskoro će se promijeniti da bude u skladu sa specifikacijama za HTML5. Ovo znači da su zastarjeli i ne bi se trebali upotrebljavati u wikitekstu.",
        "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] sa više od jedne vrijednosti za parametar \"$3\". Koristit će se samo posljednja navedena vrijednost.",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
        "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
-       "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
        "wlshowtime": "Period za prikaz:",
        "img-lang-default": "(podrazumijevani jezik)",
        "img-lang-info": "Ispiši sliku na $1. $2",
        "img-lang-go": "Prikaži",
-       "ascending_abbrev": "rast",
-       "descending_abbrev": "opad",
        "table_pager_next": "Sljedeća stranica",
        "table_pager_prev": "Prethodna stranica",
        "table_pager_first": "Prva stranica",
index f8ba31f..35d47fd 100644 (file)
        "watchthispage": "ⴹⴼⵓⵔ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "unwatch": "ⵙⴱⴷⴷ ⴰⴹⴼⴼⵓⵔ",
        "watchlist-details": "{{PLURAL:$1|$1 ⵜⴰⵙⵏⴰ|$1 ⵜⴰⵙⵏⵉⵡⵉⵏ}} ⴳ ⵜⵍⴳⴰⵎⵜ {{GENDER:|ⵏⵏⴽ|ⵏⵏⵎ}} ⵏ ⵓⴹⴼⴼⵓⵔ, not separately counting talk pages.",
-       "wlshowlast": "ⵎⵍ $1 ⵜⵙⵔⴰⴳⵉⵏ ⴳⴳⵯⵔⴰⵏⵉⵏ, $2 ⵡⵓⵙⵙⴰⵏ ⴳⴳⵯⵔⴰⵏⵉⵏ",
        "watchlist-hide": "ⵙⵙⵏⵜⵍ",
        "wlshowhidebots": "ⵉⵔⵓⴱⵓⵜⵏ",
        "watchlist-options": "ⵜⵉⵙⵖⴰⵍ ⵏ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "imgmultigo": "ⵍⴽⵎ ⵏⵏ !",
        "imgmultigoto": "ⴼⵜⵓ ⵙ ⵜⴰⵙⵏⴰ $1",
        "img-lang-default": "(ⵜⵓⵜⵍⴰⵢⵜ ⵙ ⵓⵡⵏⵓⵍ)",
-       "ascending_abbrev": "aryaqliw",
-       "descending_abbrev": "aritgiiz",
        "table_pager_next": "ⵜⴰⵙⵏⴰ ⵜⵓⴹⴼⵉⵔⵜ",
        "table_pager_prev": "tawriqt izrin",
        "table_pager_first": "tawriqt tamzwarut",
index 0facd5d..01c892b 100644 (file)
        "watchlist-details": "{{PLURAL:$1|ၼႃႈလိၵ်ႈ $1 ၼႃႈ|ၸိူဝ်းၼႃႈလိၵ်ႈ $1 ၼႃႈ}} ၼႆႉမီးဝႆႉ တီႈၼႂ်းသဵၼ်ႈမၢႆတူၺ်းၸဝ်ႈၵဝ်ႇသေ ၸိူဝ်းပၼ်ၼႃႈလိၵ်ႈ ဢုပ်ႇဢူဝ်းၼၼ်ႉတႄႉ ဢမ်ႇဢၢၼ်ႇၶဝ်ႈပႃး။",
        "wlheader-showupdated": "ဝၢႆးသေၸဝ်ႈၵဝ်ႇ တူၺ်းမႃးသေ ဢၼ်ပဵၼ်ၼႃႈလိၵ်ႈ ၸိူဝ်းမီးလွင်ႈလႅၵ်ႈလၢႆႈၼၼ်ႉ ဢဝ်\nသင် နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို <strong>တူဝ်လိၵ်ႈလမ်</strong>သေ ၼႄဝႆႉပၼ်ယူႇ။",
        "wlnote": "ၼႂ်းၵႃႈ တေႃႇထိုင် $3၊ $4 ၼၼ်ႉ ၵမ်းလိုၼ်းသုတ်း {{PLURAL:$2|မူင်း|<strong>$2</strong> မူင်း}}ၼၼ်ႉမီႈ{{PLURAL:$1|လွင်ႈလႅၵ်ႈလၢႆႈ ဝႆႉဢၼ်ၼိုင်ႈ|လွင်ႈၸိူဝ်းလႅၵ်ႈလၢႆႈဝႆႉ <strong>$1</strong> ဢၼ်}}",
-       "wlshowlast": "ၼႄ ၶၢဝ်းယၢမ်းလိုၼ်းသုတ်း $1 မူင်း $2 ဝၼ်း",
        "watchlist-hide": "သိူင်ႇ",
        "watchlist-submit": "ၼႄ",
        "wlshowtime": "ပွင်ႈၶၢဝ်းယၢမ်း တွၼ်ႈတႃႇ ဢွၵ်ႇၼႄ:",
index 51db8ad..daa8c99 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 n usebter|$1 n isebtar}} di tebdart-ik n uḍfaṛ (akked isebtar n usqerdec).",
        "wlheader-showupdated": "Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s uḍris <strong>aberbuz</strong>.",
        "wlnote": "Ddaw-a {{PLURAL:$1|ad twaliḍ abeddel aneggaru yettwagen|ad twaliḍ <strong>$1</strong> n ibeddilen ineggura yettwagen}} deg {{PLURAL:$2| usrag aneggaru|di <strong>$2</strong> n yisragen ineggura}}, arama d $3, $4.",
-       "wlshowlast": "Sken wid n $1 n isragen ineggura, wid n $2 n wussan ineggura",
        "watchlist-submit": "Ssken",
        "watchlist-options": "Iɣewwaṛen n tebdart n uḍfaṛ",
        "enotif_reset": "Rcem akk isebtar mmeẓren",
index 4ae3671..05d6352 100644 (file)
        "wlheader-enotif": "විද්‍යුත් තැපැල් දැනුම්දීම සක්‍රීයයි.",
        "wlheader-showupdated": "ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්ව තිබෙන පිටු <strong>තදකුරු</strong> වලින් පෙන්වා ඇත.",
        "wlnote": "පහත දැක්වෙන්නේ $3, $4 මෙන්, අවසන් {{PLURAL:$2|පැය|පැය '''$2''' }} තුලදී සිදු කෙරී ඇති {{PLURAL:$1|අවසන් වෙනස්වීම්යි |අවසන් වෙනස්වීම්  '''$1''' යි}}.",
-       "wlshowlast": "පසුගිය පැය $1 දින $2 පෙන්වන්න",
        "watchlist-hide": "සඟවන්න",
        "watchlist-submit": "පෙන්වන්න",
        "wlshowhideminor": "සුළු සංස්කරණ",
        "imgmultigoto": " $1 පිටුවට යන්න",
        "img-lang-default": "(පෙරනිමි භාෂාව)",
        "img-lang-go": "යන්න",
-       "ascending_abbrev": "ආරෝහණ",
-       "descending_abbrev": "අවරෝහණ",
        "table_pager_next": "ඊළඟ පිටුව",
        "table_pager_prev": "පෙර පිටුව",
        "table_pager_first": "පළමු පිටුව",
index 7f7f646..cd4e8dd 100644 (file)
@@ -41,7 +41,8 @@
                        "Matěj Suchánek",
                        "Vlad5250",
                        "Robert Važan",
-                       "Vegetator"
+                       "Vegetator",
+                       "Luky001"
                ]
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "virus-scanfailed": "kontrola zlyhala (kód $1)",
        "virus-unknownscanner": "neznámy antivírus:",
        "logouttext": "<strong>Práve ste sa odhlásili.</strong>\n\nUvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste boli prihlásený, až kým nevymažete vyrovnávaciu pamäť vášho prehliadača.",
-       "logging-out-notify": "Prebieha vaše odhlásenie, prosím čekejte.",
+       "logging-out-notify": "Prebieha vaše odhlásenie, prosím, čakajte.",
        "logout-failed": "Teraz nie je možné odhlásiť sa:$1",
        "cannotlogoutnow-title": "Teraz nie je možné odhlásiť sa",
        "cannotlogoutnow-text": "Nie je možné odhlásiť sa, keď používate $1",
        "rcfilters-preference-help": "Zruší novú podobu rozhrania z roku 2017 a všetky nástroje odvtedy pridané.",
        "rcfilters-watchlist-preference-label": "Skryť vylepšenú verziu sledovaných stránok",
        "rcfilters-watchlist-preference-help": "Zruší novú podobu rozhrania z roku 2017 a všetky nástroje odvtedy pridané.",
+       "rcfilters-filter-showlinkedfrom-label": "Zobraziť zmeny stránok, na ktoré sa odkazuje",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Stránky odkazované z</strong> vybranej stránky",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Stránky odkazujúce na</strong> vybranú stránku",
        "rcnotefrom": "Nižšie {{PLURAL:$5|je zobrazená úprava|sú zobrazené úpravy}} od <strong>$2</strong> (do <strong>$1</strong>).",
        "rclistfromreset": "Obnoviť výber údajov",
        "rclistfrom": "Zobraziť nové úpravy počnúc od $3 $2",
        "activeusers-intro": "Toto je zoznam používateľov, ktorí $1 {{PLURAL:$1|za posledný 1 deň|za posledné $1 dni|za posledných $1 dní}} vykonali nejakú aktivitu.",
        "activeusers-count": "$1 {{PLURAL:$1|operácia|operácie|operácií}} za {{PLURAL:$3|posledný deň|posledné $3 dni|posledných $3 dní}}",
        "activeusers-from": "Zobraziť používateľov počínajúc:",
+       "activeusers-groups": "Zobraziť používateľov patriacich do skupín:",
+       "activeusers-excludegroups": "Nezobrazovať používateľov patriacich do skupín:",
        "activeusers-noresult": "Neboli nájdení žiadni používatelia.",
        "activeusers-submit": "Zobraziť aktívnych používateľov",
        "listgrouprights": "Práva skupín používateľov",
        "wlheader-enotif": "Upozorňovanie e-mailom je zapnuté.",
        "wlheader-showupdated": "Stránky, ktoré boli zmenené od vašej poslednej návštevy sú zobrazené '''tučne'''.",
        "wlnote": "Nižšie {{PLURAL:$1|je posledná úprava|sú posledné <strong>$1</strong> úpravy|je posledných <strong>$1</strong> úprav}} za {{PLURAL:$2|poslednú hodinu|posledné <strong>$2</strong> hodiny|posledných <strong>$2</strong> hodín}} do $4, $3.",
-       "wlshowlast": "Zobraziť posledných $1 hodín $2 dní",
        "watchlist-hide": "Skryť",
        "watchlist-submit": "Zobraziť",
        "wlshowtime": "Obdobie:",
        "img-lang-default": "(predvolený jazyk)",
        "img-lang-info": "Vykresliť tento obrázok v jazyku $1 $2",
        "img-lang-go": "Vykonať",
-       "ascending_abbrev": "vzostupne",
-       "descending_abbrev": "zostupne",
        "table_pager_next": "Ďalšia stránka",
        "table_pager_prev": "Predošlá stránka",
        "table_pager_first": "Prvá stránka",
index 182587a..ac72c32 100644 (file)
        "watch": "اکھ تلے رکھو",
        "unwatch": "اکھ ہیٹھوں ہٹاؤ",
        "watchlist-details": "{{PLURAL:$1|$1 ورقہ ہے|$1 ورقے ہن}} تہاݙیاں نظراں ہیٹھ (تے ڳالھ مہاڑ آلے ورقے).",
-       "wlshowlast": "ݙیکھاؤ چھیکڑی $1 گھنٹے $2 ݙینہ",
        "watchlist-hide": "لُکاؤ",
        "watchlist-submit": "ݙِکھاؤ",
        "wlshowtime": "ظاہر تھیوݨ دی مدت:",
index 6e677b5..be0253c 100644 (file)
        "wlheader-enotif": "Obveščanje po elektronski pošti je omogočeno.",
        "wlheader-showupdated": "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
        "wlnote": "{{PLURAL:$1|Navedena je zadnja|Navedeni sta zadnji|Navedene so zadnje|Navedenih je zadnjih}} <strong>$1</strong> {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}} v {{PLURAL:$2|zadnji <strong>$2</strong> uri|zadnjih <strong>$2</strong> urah}}, od $3, $4.",
-       "wlshowlast": "Prikaži zadnjih $1 ur; $2 dni",
        "watchlist-hide": "Skrij",
        "watchlist-submit": "Prikaži",
        "wlshowtime": "Časovno obdobje za prikaz:",
        "img-lang-default": "(privzeti jezik)",
        "img-lang-info": "Upodobi sliko v $1. $2",
        "img-lang-go": "Pojdi",
-       "ascending_abbrev": "nar",
-       "descending_abbrev": "pad",
        "table_pager_next": "Naslednja stran",
        "table_pager_prev": "Prejšnja stran",
        "table_pager_first": "Prva stran",
index 5f71973..673be97 100644 (file)
        "wlheader-enotif": "Dar E-Mail-Benoachrichtigungsdienst ies aktiviert.",
        "wlheader-showupdated": "Seyta miet noo ne gesehenen Änderunga waan '''fett''' dargestellt.",
        "wlnote": "Is {{PLURAL:$1|folgt de letzte Änderung|folga de letzta '''$1''' Änderunga}} dar letzta {{PLURAL:$2|Stunde|'''$2''' Stunda}}.",
-       "wlshowlast": "Zeige de Änneronga dar letzta $1 Stonda, $2 Taage oder .",
        "watchlist-options": "Oazeegeoptiona",
        "watching": "Beobachta …",
        "unwatching": "Nee beobachta …",
        "imgmultipageprev": "← vurherige Seite",
        "imgmultipagenext": "nächste Seite →",
        "imgmultigoto": "Gieh zo Seite $1",
-       "ascending_abbrev": "uff",
-       "descending_abbrev": "oab",
        "table_pager_next": "Nächste Seite",
        "table_pager_prev": "Vurherige Seite",
        "table_pager_first": "Erschte Seite",
index f8bbb03..d46a9d2 100644 (file)
        "unwatch": "Ha waardiyeynin",
        "unwatchthispage": "Jooji waardiyeyntiisa",
        "watchlist-details": "{{PLURAL:$1|$1 bog|$1 boggag ah}}  aa ku jirto liiskaaga waardiyaha, ma lagu darin boggaga wadahadalka.",
-       "wlshowlast": "Itus wixii ka danbeeyay $1 saacadood $2 maalmood",
        "watchlist-options": "Dooqyada liiska waardiyaha",
        "watching": "Daawasho...",
        "enotif_subject_created": "{{SITENAME}} Bogga $1 Qof ayaa sameeyey {{gender:$2|$2}}",
index 5a293bf..bf58278 100644 (file)
        "wlheader-enotif": "Është aktivizuar njoftimi me email.",
        "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të <strong>trasha</strong>.",
        "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë <strong>$1</strong>''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|<strong>$2</strong>''' orët e fundit}}, që nga $3, $4.",
-       "wlshowlast": "Trego $1 orët $2 ditët e fundit",
        "watchlist-hide": "Fshih",
        "watchlist-submit": "Shfaq",
        "wlshowtime": "Periudha e kohës për ta treguar:",
        "img-lang-default": "(gjuha e parazgjedhur)",
        "img-lang-info": "Shfaqe këtë imazh në $1. $2",
        "img-lang-go": "Shko",
-       "ascending_abbrev": "ngritje",
-       "descending_abbrev": "zbritje",
        "table_pager_next": "Faqja tjetër",
        "table_pager_prev": "Faqja e mëparshme",
        "table_pager_first": "Faqja e parë",
index 00d9913..4c95a58 100644 (file)
        "nocreate-loggedin": "Немате дозволу да правите нове странице.",
        "sectioneditnotsupported-title": "Уређивање одељка није подржано",
        "sectioneditnotsupported-text": "Уређивање одељка није подржано на овој страници.",
+       "modeleditnotsupported-title": "Уређивање није подржано",
+       "modeleditnotsupported-text": "Уређивање није подржано за модел садржаја $1.",
        "permissionserrors": "Грешка у дозволи",
        "permissionserrorstext": "Немате дозволу за ову радњу из {{PLURAL:$1|следећег|следећих}} разлога:",
        "permissionserrorstext-withaction": "Немате дозволу да $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
        "content-model-json": "ЈСОН-а",
        "content-json-empty-object": "Празан објекат",
        "content-json-empty-array": "Празан низ",
+       "unsupported-content-model": "<strong>Упозорење:</strong> Модел садржаја $1 није подржан на овом викију.",
        "deprecated-self-close-category": "Странице које користе невалидне самозатварајуће HTML тагове",
        "duplicate-args-warning": "<strong>Упозорење:</strong> [[:$1]] позива [[:$2]] са више од једне вредности за параметар „$3“. Само последња наведена вредност ће бити коришћена.",
        "duplicate-args-category": "Странице с дуплираним аргументима код позива шаблона",
        "rcfilters-clear-all-filters": "Обришите све филтере",
        "rcfilters-show-new-changes": "Нове промене од $1",
        "rcfilters-search-placeholder": "Филтрирајте промене (користите мени или претражите име филтера)",
+       "rcfilters-search-placeholder-mobile": "Филтери",
        "rcfilters-invalid-filter": "Неважећи филтер",
        "rcfilters-empty-filter": "Нема активних филтера. Сви доприноси су приказани.",
        "rcfilters-filterlist-title": "Филтери",
        "rcfilters-filter-showlinkedto-label": "Прикажи промене на страницама ка којима воде везе",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Странице ка којима воде везе са</strong> изабране странице",
        "rcfilters-target-page-placeholder": "Унесите име странице (или категорије)",
+       "rcfilters-allcontents-label": "Сви садржаји",
+       "rcfilters-alldiscussions-label": "Све дискусије",
        "rcnotefrom": "Испод {{PLURAL:$5|је промена|су промене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "rclistfromreset": "Ресетуј избор датума",
        "rclistfrom": "Прикажи нове промене почев од $2, $3",
        "wlheader-enotif": "Обавештавање е-поруком је омогућено.",
        "wlheader-showupdated": "Странице које су промењене откад сте их последњи пут посетили су <strong>подебљане</strong>.",
        "wlnote": "Испод {{PLURAL:$1|је последња промена|су последње <strong>$1</strong> промене|је последњих <strong>$1</strong> промена}} у {{PLURAL:$2|претходном сату|претходна <strong>$2</strong> сата|претходних <strong>$2</strong> сати}}, закључно са $3, $4.",
-       "wlshowlast": "Прикажи последњих $1 сати, $2 дана",
        "watchlist-hide": "Сакриј",
        "watchlist-submit": "Прикажи",
        "wlshowtime": "Период за приказ:",
        "sessionfailure": "Изгледа да постоји проблем с вашом сесијом;\nова радња је отказана да би се избегла злоупотреба.\nМолимо, поново пошаљите образац.",
        "changecontentmodel": "Промена модела садржаја странице",
        "changecontentmodel-legend": "Промени модел садржаја",
-       "changecontentmodel-title-label": "Наслов странице",
-       "changecontentmodel-model-label": "Нови модел садржаја",
+       "changecontentmodel-title-label": "Наслов странице:",
+       "changecontentmodel-current-label": "Тренутни модел садржаја:",
+       "changecontentmodel-model-label": "Нови модел садржаја:",
        "changecontentmodel-reason-label": "Разлог:",
        "changecontentmodel-submit": "Промени",
        "changecontentmodel-success-title": "Модел садржаја је промењен",
        "move-subpages": "Премести и подстранице (до $1)",
        "move-talk-subpages": "Премести подстранице странице за разговор (до $1)",
        "movepage-page-exists": "Страница $1 већ постоји и не може се заменити.",
+       "movepage-source-doesnt-exist": "Страница $1 не постоји и не може бити премештена.",
        "movepage-page-moved": "Страница $1 је премештена на $2.",
        "movepage-page-unmoved": "Страница $1 не може да се премести на $2.",
        "movepage-max-pages": "Највише $1 {{PLURAL:$1|страница је премештена|странице су премештене|страница је премештено}} и више не може да буде аутоматски премештено.",
        "delete_and_move_reason": "Избрисано да се ослободи место за премештање из „[[$1]]“",
        "selfmove": "Наслов је истоветан;\nне можете преместити страницу преко саме себе.",
        "immobile-source-namespace": "Не могу преместити странице у именски простор „$1“.",
+       "immobile-source-namespace-iw": "Странице на осталим викијима не могу бити премештене са овог викија.",
        "immobile-target-namespace": "Не могу преместити странице у именски простор „$1“.",
        "immobile-target-namespace-iw": "Међувики веза није важеће одредиште за премештање странице.",
        "immobile-source-page": "Ова страница се не може преместити.",
        "immobile-target-page": "Премештање није могуће на одредишни наслов.",
+       "movepage-invalid-target-title": "Тражено име није ваљано.",
        "bad-target-model": "Жељено одредиште користи други модел садржаја. Није могуће конвертовати из $1 у садржај $2.",
        "imagenocrossnamespace": "Датотека се не може преместити у именски простор који не припада датотекама.",
        "nonfile-cannot-move-to-file": "Не-датотеке не можете преместити у именски простор за датотеке",
        "img-lang-default": "(подразумевани језик)",
        "img-lang-info": "Рендеруј ову слику у $1. $2",
        "img-lang-go": "Иди",
-       "ascending_abbrev": "раст.",
-       "descending_abbrev": "опад.",
        "table_pager_next": "Следећа страница",
        "table_pager_prev": "Претходна страница",
        "table_pager_first": "Прва страница",
        "permanentlink": "Трајна веза",
        "permanentlink-revid": "ID измене",
        "permanentlink-submit": "Пређи на измену",
+       "newsection": "Нови одељак",
+       "newsection-page": "Одредишна страница",
+       "newsection-submit": "Иди на страницу",
        "dberr-problems": "Дошло је до техничких проблема.",
        "dberr-again": "Сачекајте неколико минута и поново учитајте страницу.",
        "dberr-info": "(Не могу приступити бази података: $1)",
index ac0bce3..9f4edad 100644 (file)
        "wlheader-enotif": "Obaveštavanje e-porukom je omogućeno.",
        "wlheader-showupdated": "Stranice koje su promenjene otkad ste ih poslednji put posetili su <strong>podebljane</strong>.",
        "wlnote": "Ispod {{PLURAL:$1|je poslednja promena|su poslednje <strong>$1</strong> promene|je poslednjih <strong>$1</strong> promena}} u {{PLURAL:$2|prethodnom satu|prethodna <strong>$2</strong> sata|prethodnih <strong>$2</strong> sati}}, zaključno sa $3, $4.",
-       "wlshowlast": "Prikaži poslednjih $1 sati, $2 dana",
        "watchlist-hide": "Sakrij",
        "watchlist-submit": "Prikaži",
        "wlshowtime": "Period za prikaz:",
        "img-lang-default": "(podrazumevani jezik)",
        "img-lang-info": "Renderuj ovu sliku u $1. $2",
        "img-lang-go": "Idi",
-       "ascending_abbrev": "rast.",
-       "descending_abbrev": "opad.",
        "table_pager_next": "Sledeća stranica",
        "table_pager_prev": "Prethodna stranica",
        "table_pager_first": "Prva stranica",
index 8820dd5..9de7eaf 100644 (file)
        "watchthispage": "Tan luku a papira disi",
        "unwatch": "No tan luku",
        "watchlist-details": "{{PLURAL:$1|Wan papira|$1 papira}} de ini yu Tan Luku réy, sondro fu teri den kruderi papira.",
-       "wlshowlast": "Sori laste $1 yuru, $2 dey ()",
        "watching": "A wiki e poti a papira disi ini yu Tan Luku...",
        "unwatching": "A wiki e puru a papira disi fu yu Tan Luku...",
        "deletepage": "Disi papira trowe",
        "monthsall": "ala",
        "confirm_purge_button": "oki",
        "imgmultigo": "Go!",
-       "ascending_abbrev": "opo.",
-       "descending_abbrev": "afo.",
        "table_pager_limit_submit": "Go",
        "autosumm-new": "Nyon papira: $1",
        "watchlisttools-view": "Sori Tan Luku réy",
index 36759f4..330dcb8 100644 (file)
        "wlheader-enotif": "E-Mail-Beskeed is aktivierd.",
        "wlheader-showupdated": "Sieden, do ätter dien lääste Besäik annerd wuuden sunt, wäide '''fat''' deerstoald.",
        "wlnote": "Hier {{PLURAL:$1|foulget do lääste Annerenge|foulgje do lääste '''$1''' Annerengen}} fon do lääste {{PLURAL:$2|Uur|'''$2''' Uuren}}.",
-       "wlshowlast": "Wies do lääste $1 Uuren, $2 Deege, of  (in do lääste 30 Deege).",
        "watchlist-options": "Anwiesoptione",
        "watching": "Beooboachtje …",
        "unwatching": "Nit beooboachtje …",
        "imgmultipagenext": "naiste Siede →",
        "imgmultigo": "OK",
        "imgmultigoto": "Gung tou Siede $1",
-       "ascending_abbrev": "ap",
-       "descending_abbrev": "fon",
        "table_pager_next": "Naiste Siede",
        "table_pager_prev": "Foarige Siede",
        "table_pager_first": "Eerste Siede",
index ed0408d..456d31c 100644 (file)
        "watchlist-details": "Көсәтеү күцермәлегегестә, уйлап ҡарау питләрне исәпләмәйен, {{PLURAL:$1|$1 пит}} пар.",
        "wlheader-showupdated": "Сеснең суңҡы пашҡартыулартан суң пашҡарған питләр <strong>ҡалын</strong> шрифт пелән күргәселгән.",
        "wlnote": "Түмәнтә $3 $4 уаҡытта суңҡы {{PLURAL:$2|1=сәғәт|$2 сәғәт}} эцтә эшләнкән {{PLURAL:$1|1=пашҡартыу|$1пашҡартыулар}} күргәселгән.",
-       "wlshowlast": "Суңҡы $1 сәғәт $2 көн эцентәгесен күргәскәле",
        "watchlist-options": "Көсәтеү күцермәлекнең ҡоролошлары",
        "enotif_reset": "Пөтөн питләрне ҡаралған тип пилгеләгәле",
        "dellogpage": "Уйыуларның журналы",
index 85095f2..ce0d068 100644 (file)
        "wlheader-enotif": "Iber surélék diaktifkeun.",
        "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun <strong>kandel</strong>.",
        "wlnote": "Di handap ieu mangrupa {{PLURAL:$1|robahan|robahan}} <strong>$1</strong> panungtung salila {{PLURAL:$2|jam|<strong>$2</strong> jam}}, ti $3, $4.",
-       "wlshowlast": "Témbongkeun $1 jam $2 poé panungtung",
        "watchlist-hide": "Sumputkeun",
        "watchlist-submit": "Témbongkeun",
        "wlshowtime": "Periodeu waktu ajang dipidangkeun:",
        "img-lang-default": "(basa default)",
        "img-lang-info": "Jadikeun ieu gambar dina $1. $2",
        "img-lang-go": "Jung",
-       "ascending_abbrev": "naék",
-       "descending_abbrev": "turun",
        "table_pager_next": "Kaca salajengna",
        "table_pager_prev": "Kaca saacana",
        "table_pager_first": "Kaca mimiti",
index ae85450..f33f48b 100644 (file)
        "wlheader-enotif": "E-postmeddelanden är aktiverade.",
        "wlheader-showupdated": "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
        "wlnote": "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste <strong>$1</strong> ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste <strong>$2</strong> timmarna}} från den $3 kl. $4.",
-       "wlshowlast": "Visa senaste $1 timmarna $2 dygnen",
        "watchlist-hide": "Dölj",
        "watchlist-submit": "Visa",
        "wlshowtime": "Tidsperiod att visa:",
        "img-lang-default": "(standardspråk)",
        "img-lang-info": "Rendera denna bild i $1. $2",
        "img-lang-go": "Gå",
-       "ascending_abbrev": "stigande",
-       "descending_abbrev": "fallande",
        "table_pager_next": "Nästa sida",
        "table_pager_prev": "Föregående sida",
        "table_pager_first": "Första sidan",
index 6d413ac..6004a1a 100644 (file)
        "wlheader-enotif": "Huduma ya kuarifu kwa barua-pepe imewezeshwa.",
        "wlheader-showupdated": "Kurasa zilizobadilika tangu ulivyotembelea mara ya mwisho zinaonyeshwa <strong>bold</strong>.",
        "wlnote": "{{PLURAL:$1|is the last change|Mabadiliko '''$1''' ya}} mwisho katika {{PLURAL:$2|hour|masaa '''$2''' yaliyopita yanaonyeshwa}} chini, ilivyokuwa saa $4, tarehe $3.",
-       "wlshowlast": "Onyesha kutoka masaa $1 siku $2",
        "watchlist-hide": "Ficha",
        "watchlist-submit": "Onyesha",
        "wlshowhideminor": "mabadiliko madogo",
        "imgmultigo": "Nenda!",
        "imgmultigoto": "Uende kwenye ukurasa wa $1",
        "img-lang-go": "Enda",
-       "ascending_abbrev": "pand",
-       "descending_abbrev": "shuk",
        "table_pager_next": "Ukurasa ujao",
        "table_pager_prev": "Ukurasa uliotangulia",
        "table_pager_first": "Ukurasa wa kwanza",
index 324fac3..19dea12 100644 (file)
@@ -53,7 +53,7 @@
        "tog-watchlisthideown": "Schow moje pomjyńańa we artiklach, na kere dowom pozůr",
        "tog-watchlisthidebots": "Schow pomjyńańa sprowjone bez boty we artiklach, na kere dowom pozůr",
        "tog-watchlisthideminor": "Schow ńywjelge pomjyńańa w artiklach, na kere dowom pozůr",
-       "tog-watchlisthideliu": "Schow sprowjyńo zalůgowanych sprowjaczy na pozorliśće",
+       "tog-watchlisthideliu": "Skryj edycyje ôd zalogowanych używŏczōw we ôbserwowanych",
        "tog-watchlisthideanons": "Schow sprowjyńa anůńimowych sprowjoczy na liśće artikli, na kere dowom pozůr",
        "tog-watchlisthidepatrolled": "Schowej sprowdzůne sprowjyńa na pozorliśće",
        "tog-ccmeonemails": "Przesyłej mi kopje e-brifůw co żech je posłoł inkszym sprowjaczom",
        "portal-url": "Project:Portal społeczności",
        "privacy": "Prawidła chrōniyniŏ prywatności",
        "privacypage": "Project:Prawidła chrōniyniŏ prywatności",
-       "badaccess": "Felerne uprawńyńo",
+       "badaccess": "Felerne uprawniynia",
        "badaccess-group0": "Ńy mosz uprawńyń coby wykůnać ta uoperacyjo.",
        "badaccess-groups": "Ta uoperacyjo mogům wykůnać ino użytkownicy ze keryjś z {{PLURAL:$2|grupy|grup}}: $1.",
        "versionrequired": "Wymagano MediaWiki we wersyji $1",
        "toc": "Wykŏz treści",
        "showtoc": "uobejrzij",
        "hidetoc": "schrůń",
-       "collapsible-collapse": "Zwjyń",
-       "collapsible-expand": "Rozwjyń",
+       "collapsible-collapse": "Skryj",
+       "collapsible-expand": "Pokŏż",
        "thisisdeleted": "Pokoż/wćepej nazod $1",
        "viewdeleted": "Uobejrzij $1",
        "restorelink": "{{PLURAL:$1|jedna wyćepano wersyjo|$1 wyćepane wersyje|$1 wyćepanych wersyjůw}}",
        "parser-template-recursion-depth-warning": "Przekroczůno limit głymbokośći rekurencyji mustru ($1)",
        "undo-success": "Sprowjyńy zostoło wycofane. Prosza pomjarkować ukozane půniżyj dyferencyje mjyndzy wersyjůma, coby zweryfikować jejich poprawność, potym zaś naszkryflać pomjyńańo coby zakończyć uoperacyjo.",
        "undo-failure": "Ta edycyjŏ niy może być cŏfniyntŏ skuli kōnfliktu ze wersyjami postrzednimi.",
-       "undo-norev": "Sprowjyńo ńy idźe cofnůńć skuli tego, co ńy istńije abo uostoło wyćepane.",
+       "undo-norev": "Edycyje niy idzie cŏfnōńć, bo ôna niy istniyje abo była wyciepniyntŏ.",
        "undo-summary": "Wycůfańy wersyji $1 naszkryflanej bez [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]])",
        "cantcreateaccount-text": "Tworzyńy kůnta s tygo adresu IP ('''$1''') uostoło zawarte bez użytkowńika [[User:$3|$3]].\n\nSkuli: ''$2''",
        "viewpagelogs": "Ôbejzdrz regesty dlŏ tyj strōny",
        "mergehistory-box": "Skupluj gyszichta sprowjyń dwůch zajtůw:",
        "mergehistory-from": "Zdrzůdłowo zajta:",
        "mergehistory-into": "Zajta docelowo:",
-       "mergehistory-list": "Gyszichta půmjyńań do śe skuplować",
+       "mergehistory-list": "Historyjõ edycyji idzie scalić",
        "mergehistory-merge": "Nastympujůnce půmjyńyńo zajty [[:$1]] idźe scalić s [[:$2]]. Uoznocz we kolůmńy kropkům kero zmjana, wroz ze wcześńijszymi, mo być scalůno. Użyće linkůw uod nawigacyji kasuje wybůr we kolůmńy.",
        "mergehistory-go": "Pokoż půmjyńańo kere idźe scalić",
        "mergehistory-submit": "Scal historyjo půmjyńań",
        "mergehistory-empty": "Ńy mo historyje zmjan do scalyńo.",
        "mergehistory-done": "$3 {{PLURAL:$3|pomjyńańe|pomjyńańa|pomjyńań}} we $1 ze sukcesym uostało scalonych ze [[:$2]].",
-       "mergehistory-fail": "Ńy idźe scalić historyje půmjyńań. Zmjyń sztalowańo parametrůw tyj uoperacyji.",
+       "mergehistory-fail": "Niy idzie scalić historyji. Wejzdrzij na parametry strōny i czasu.",
        "mergehistory-no-source": "Ńy ma sam zajty zdrzůdłowyj $1.",
        "mergehistory-no-destination": "Ńy ma sam zajty docelowyj $1.",
        "mergehistory-invalid-source": "Zajta zdrzůdłowo muśi mjeć poprawne mjano.",
        "mergehistory-reason": "Kůmyntorz:",
        "mergelog": "Regest scalyń",
        "revertmerge": "Uodkupluj",
-       "mergelogpagetext": "Půńiżyj je lista uostatńich kuplowań historyji půmjyńań zajtůw.",
+       "mergelogpagetext": "Niżyj je wykŏz ôstatnich scalyń jednyj historyje strōny ze inkszōm.",
        "history-title": "Historyjŏ wersyji strōny „$1”",
        "difference-title": "$1: Porōwnanie wersyji",
        "difference-multipage": "(Porůwnańy zajt)",
        "right-noratelimit": "Ńy mo uograńičyń přepustowośći",
        "right-import": "Import zajtůw s inkšych Wiki",
        "right-importupload": "Import zajtůw ze wćepanygo plika",
-       "right-patrol": "Uoznocz sprowjyńo kej przezdrzane",
+       "right-patrol": "Ôznŏcz edycyje za przejzdrzane",
        "right-autopatrol": "Naštaluj na autůmatyčne uoznačańy sprowjyń kej přezdřane",
        "right-patrolmarks": "Podglůnd značnikůw patrolowańo pomjeńanych na uostatku – uoznačańo kej „sprawdzůne”",
        "right-unwatchedpages": "Pokož lista zajtůw na kere žodyn ńy dowo pozoru",
        "right-mergehistory": "Pouůnč historyjo sprowjyń do zajtůw",
-       "right-userrights": "Sprowjej wšyjske uprawńyńo užytkowńikůw",
-       "right-userrights-interwiki": "Sprowjej uprawńyńo užytkowńikůw na zajtach inkšych Wiki",
+       "right-userrights": "Edytuj uprawniynia wszyjskich używŏczōw",
+       "right-userrights-interwiki": "Edytuj uprawniynia używŏczōw na inkszych wiki",
        "right-siteadmin": "Zawjerańy i uodmykańy bazy danych",
        "newuserlogpage": "Ksiōnżka nowych używŏczōw",
        "newuserlogpagetext": "To je rejer uostatńo utworzůnych kůnt użytkowńikůw",
        "action-createpage": "tworzyńo zajtůw",
        "action-createtalk": "tworzyńo zajtůw godki",
        "action-createaccount": "stworzynie tego kōnta używŏcza",
-       "action-minoredit": "do uoznačyńo tygo sprowjyńo kej drobne půmjyńańe",
+       "action-minoredit": "ôznaczynie tyj edycyje za małõ",
        "action-move": "přećepańe tyj zajty",
        "action-move-subpages": "přećepańo tyj zajty uoroz s jeij podzajtůma",
        "action-move-rootuserpages": "Překludzańy zajtůw uod užytkowńikůw (nale bes jeich podzajtůw)",
        "action-suppressrevision": "podglůndu a wćepańo nazod tyj wersyje schrůńůnyj",
        "action-suppressionlog": "podglůndu rejera schrůńańo",
        "action-block": "zawarća uod sprowjyń tygo spowjořa",
-       "action-protect": "půmjyńań poźůmu zawarćo tyj zajty",
+       "action-protect": "zmiany poziōmōw zabezpieczyń na tyj strōnie",
        "action-import": "importu tyj zajty s inkšyj wiki",
        "action-importupload": "importu tyj zajty bez wćepańe plika",
-       "action-patrol": "označyńo sprowjyńo kej „sprowdzůne”",
-       "action-autopatrol": "uoznačyńo wuasnygo sprowjyńo kej „sprawdzonygo”",
+       "action-patrol": "ôznaczynie edycyje za sprawdzōnõ",
+       "action-autopatrol": "ôznaczynie włŏsnyj edycyje za przejzdrzanõ",
        "action-unwatchedpages": "podglůndu listy zajtůw na kere ńikt ńy dowo pozoru",
        "action-mergehistory": "skuplowańo historyje sprowjyń tyj zajty",
        "action-userrights": "sprowjańo uprowńyń wszyjstkich sprowjorzy",
        "recentchanges-legend": "Ôpcyje ôstatnich zmian",
        "recentchanges-summary": "Na tyj strōnie idzie śledzić ôstatnie zmiany na wiki.",
        "recentchanges-noresult": "Żŏdne zmiany we podanym ôkresie niy pasujōm tym kryteriōm.",
-       "recentchanges-feed-description": "Dowej pozůr na půmjyÅ\84ane na uostatku na tyj wiki.",
+       "recentchanges-feed-description": "Dowej pozÅ\8dr na Ã´statnie zmiany na tyj wiki.",
        "recentchanges-label-newpage": "Ta edycyjŏ stworziła nowõ strōnã",
        "recentchanges-label-minor": "To je małŏ zmiana",
        "recentchanges-label-bot": "To je zmiana zrobiōnŏ ôd bota",
        "recentchanges-label-plusminus": "Strōna zmiyniyła srogość ô tela bajtōw",
        "recentchanges-legend-heading": "<strong>Legynda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ôbejzdrzij tyż [[Special:NewPages|listã nowych strōn]])",
+       "rcfilters-other-review-tools": "Inksze nŏrzyńdzia kōntrole",
+       "rcfilters-filter-humans-label": "Czowiek (niy bot)",
+       "rcfilters-liveupdates-button": "Aktualizacyje na żywo",
+       "rcfilters-liveupdates-button-title-on": "Zastŏw aktualizacyje na żywo",
        "rcnotefrom": "Niżyj {{PLURAL:$5|je zmiana|sōm zmiany}} ôd <strong>$3, $4</strong> ({{PLURAL:$5|je pokŏzanŏ|sōm pokŏzane}} nojwyżyj <strong>$1</strong>).",
        "rclistfrom": "Pokŏż zmiany ôd $3 $2",
        "rcshowhideminor": "$1 małe zmiany",
        "listusers-submit": "Uobejrzij",
        "listusers-noresult": "Ńy znejdźůno žodnygo užytkowńika.",
        "activeusers-noresult": "Niy szło znŏjść żŏdnych używŏczōw",
-       "listgrouprights": "Uprawńyńo grup użytkowńikůw",
-       "listgrouprights-summary": "Půńiży znojdowo śe spis grup użytkowńikůw zdefińjowanych na tyj wiki, s wyszczygůlńyńym przidźelůnych im prow dostympu.\nSprowdź zajta [[{{MediaWiki:Listgrouprights-helppage}}|s dodatkowymi informacjami]] uo uprowńyńach użytkowńikůw.",
+       "listgrouprights": "Uprawniynia grup używŏczōw",
+       "listgrouprights-summary": "Niżyj widać wykŏz grup używŏczōw zdefiniowanych na tyj wiki, społym ze jejich prawami dostympu.\n[[{{MediaWiki:Listgrouprights-helppage}}|Ekstra informacyje]] ô uprawniyniach.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dane uprawńyńy</span>\n* <span class=\"listgrouprights-revoked\">Uodebrane uprawńyńy</span>",
        "listgrouprights-group": "Grupa",
-       "listgrouprights-rights": "Uprawńyńo",
+       "listgrouprights-rights": "Uprawniynia",
        "listgrouprights-helppage": "Help:Uprawńyńo grup użytkowńikůw",
        "listgrouprights-members": "(lista czōnkōw grupy)",
        "listgrouprights-addgroup": "Idźe dodać do {{PLURAL:$2|grupy|grup}}: $1",
        "wlheader-enotif": "Wysůuańy powjadůmjyń na adres e-brif je zouůnčůne",
        "wlheader-showupdated": "Zajty, co były zmiyniane ôd twojij ôstatnij nŏwiydzki na nich ôstały ukŏzane <strong>na rubo</strong>.",
        "wlnote": "Niżyj {{PLURAL:$1|je ôstaniŏ zmiana|sōm ôstatnie <strong>$1</strong> zmiany|je ôstatnie <strong>$1</strong> zmian}} ze {{PLURAL:$2|ôstatnij godziny|ôstatnich <strong>$2</strong> godzin}}, na $3, $4.",
-       "wlshowlast": "Pokŏż ôstatnie $1 godzin $2 dni",
        "watchlist-options": "Ôpcyje ôbserwowanych",
        "watching": "Dowom pozor...",
        "unwatching": "Ńy dowům pozůr.",
        "rollback": "Wycofej sprowjyńe",
        "rollbacklink": "cŏfej",
        "rollbacklinkcount": "cŏfnij $1 {{PLURAL:$1|edycyjõ|edycyje|edycyji}}",
-       "rollbackfailed": "Ńy idźe wycofać sprowjyńo",
+       "rollbackfailed": "Niy szło wycŏfać zmiany",
        "cantrollback": "Ńy idże cofnůńć pomjyńyńo, sam je ino jedna wersyja tyi zajty.",
        "alreadyrolled": "Ńy idźe lů zajty [[:$1|$1]] cofnůńć uostatńygo pomjyńeńa, kere wykonoł [[User:$2|$2]] ([[User talk:$2|godka]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).\nKto inkszy zdůnżůł już to zrobić abo wprowadźił własne poprowki do treśći zajty.\n\nAutorym ostatńygo pomjyńyńo je terozki [[User:$3|$3]] ([[User talk:$3|godka]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sprowjyńe uopisano: <em>$1</em>.",
        "ipb-blocklist": "Zoboč istńijůnce zawarća",
        "ipb-blocklist-contribs": "Wkłod $1",
        "block-expiry": "Wygaso:",
-       "unblockip": "Uodymkńij sprowjyńo užytkowńikowi",
+       "unblockip": "Ôdblokuj używŏcza",
        "unblockiptext": "Ůžyj formulořa půńižej coby přiwrůćić možliwość sprowjańo s wčeśńij zawartygo adresu IP abo užytkowńikowi.",
        "ipusubmit": "Uodymkńij sprowjyńo užytkowńikowi",
        "unblocked": "[[User:$1|$1]] zostou uodymkńynty.",
        "creditspage": "Autořy",
        "nocredits": "Brak informacyji uo autorach tyi zajty.",
        "spamprotectiontitle": "Filter antyspamowy",
-       "spamprotectiontext": "Zajta, kero żeś průbowou naszkryflać, uostoła zawarta bez filter antyspamowy.\nNojprawdopodobńij zostoło to spowodowane bez link do zewnyntrznyj zajty internecowyj kero je na czornyj liśće.",
+       "spamprotectiontext": "Strōna, co jōm {{GENDER:prōbowołś|prōbowałaś|prōbujesz}} spamiyntać, ôstała zawartŏ ôd filtra antyspamowego.\nNojpewnij stało sie to skuli linka do zewnyntrznyj strōny, co je na czŏrnyj liście.",
        "spamprotectionmatch": "Filtr antyspamowy śe zouůnčůu s kuli tygo co znod tekst: $1",
        "spambot_username": "MediaWiki – wyćepywańe spamu",
        "spam_reverting": "Přiwracańy uostatńij wersyji we kerej ńy bůuo linkůw do $1",
        "imgmultipagenext": "nastympnŏ strōna →",
        "imgmultigo": "Idź!",
        "imgmultigoto": "Idź do strōny $1",
-       "ascending_abbrev": "rosn.",
-       "descending_abbrev": "mal.",
        "table_pager_next": "Nostympno zajta",
        "table_pager_prev": "Popředńo zajta",
        "table_pager_first": "Pjyrwšo zajta",
index be37aa3..337b503 100644 (file)
        "wlheader-enotif": "மின்னஞ்சல் அறிவிப்புகள் செயல்படுத்தப்பட்டுள்ளன.",
        "wlheader-showupdated": "உங்கள் கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களில்''' காட்டப்பட்டுள்ளன",
        "wlnote": "பின்வருவன கடைசி {{PLURAL:$2|மணித்தியாலத்தில்|'''$2''' மணித்தியாலங்களில்}} செய்யப்பட்ட {{PLURAL:$1|கடைசி ஒரு மாற்றமாகும்|கடைசி $1 மாற்றங்களாகும்}}.",
-       "wlshowlast": "கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு",
        "watchlist-hide": "மறை",
        "watchlist-submit": "காட்டு",
        "wlshowtime": "காட்டவேண்டிய நேர அளவு:",
        "img-lang-default": "(இயல்பு நிலை மொழி)",
        "img-lang-info": "$1. $2 இல் இப்படத்தை தோன்றச் செய்",
        "img-lang-go": "செல்",
-       "ascending_abbrev": "ஏறு",
-       "descending_abbrev": "இறங்கு",
        "table_pager_next": "அடுத்த பக்கம்",
        "table_pager_prev": "முந்திய பக்கம்",
        "table_pager_first": "முதலாவது பக்கம்",
index 3273808..2f50898 100644 (file)
        "watchlist-details": "cyux maki’ sa binkgan kktan sa kinlhangan su’ mita’ ga {{PLURAL:$1|$1 kwara’ zngazyan}} (kwara’ kina zngazyan na mpkayal).",
        "wlheader-showupdated": "Suqun su’ minblaq mita’ squw pucingbalay lga, sinbah su’ zngazyan qasa ga musa’ yan nqaniy <strong>qthuy na biru’<strong> pkaykita’.",
        "wlnote": "Kwara’ nyux kyahu’ ka aring sa glaing na $3 $4 ga, kinbalay niya’ sa {{PLURAL:$2|<strong>$2</strong> tmucing lga}}, {{PLURAL:$1|min<strong>$1</strong> niya’ smbah}}.",
-       "wlshowlast": "Pkt’aniy misuw balay $1 spung $2 ryax",
        "watchlist-hide": "Lqing",
        "watchlist-submit": "Pkaykita’",
        "wlshowhideminor": "msnzik sa spzyang balay sinr’zyut miru’",
        "imgmultigoto": "Usa’ sa gnyahan lpgan tay $1",
        "img-lang-default": "(pinnama’ smi’ na kay’)",
        "img-lang-go": "Musa’",
-       "ascending_abbrev": "pskkrawn paybkuw",
-       "descending_abbrev": "pshhyu’un paybkuw",
        "table_pager_next": "Llpgan tay suruw",
        "table_pager_prev": "Llpgan tay glaing",
        "table_pager_first": "T’ringan balay na llpgan",
index 2d6746e..63a7abf 100644 (file)
        "wlheader-enotif": "ಈ-ಮೈಲ್ ಸೂಚನೆ ಸಕ್ರಿಯ ಆತ್ಂಡ್.",
        "wlheader-showupdated": "ಈರ್ ಅಕೇರಿಗ್ ಭೇಟಿ ಕೊರಿ ಬೊಕ್ಕ ಬದಲಾವಣೆ ಆಯಿನ ಪುಟೊಕುಲೆನ್ '''ದಪ್ಪ ಅಕ್ಷರೊಲೆಡ್''' ತೋಜಾದ್ಂಡ್.",
        "wlnote": "$3, $4 ದ ಪ್ರಕಾರ ಕರಿನ {{PLURAL:$2|ಗಂಟೆಡ್|<strong>$2</strong> ಗಂಟೆಲೆಡ್}} ಆಯಿನ ಅಕೇರಿದ {{PLURAL:$1|ಬದಲಾವಣೆನ್|<strong>$1</strong> ಬದಲಾವಣೆಲೆನ್}} ತಿರ್ತ್ ತೋಜಾದ್ಂಡ್.",
-       "wlshowlast": "ಕರಿನ $1 ಗಂಟೆಲು $2 ದಿನೊಕುಲು ತೋಜಾಲೆ",
        "watchlist-hide": "ದೆಂಗಾವು",
        "watchlist-submit": "ತೋಜಾವು",
        "wlshowtime": "ತೋಜಾವೊಡಾಯಿನ ಪೊರ್ತುದ ಅವಧಿ:",
index 06b53dd..e64f8fa 100644 (file)
        "wlheader-enotif": "ఈ-మెయిలు గమనికలు పంపబడతాయి.",
        "wlheader-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.",
        "wlnote": "$3, $4 ల సమయానికి, అంతకు ముందరి {{PLURAL:$2|గంటలో|<strong>$2</strong> గంటల్లో}} జరిగిన {{PLURAL:$1|మార్పును|<strong>$1</strong> మార్పులను}} కింద ఇచ్చాం.",
-       "wlshowlast": "గత $1 గంటల $2 రోజులకు చూపించు",
        "watchlist-hide": "దాచు",
        "watchlist-submit": "చూపించు",
        "wlshowtime": "చూపించాల్సిన కాలం:",
        "img-lang-default": "(అప్రమేయ భాష)",
        "img-lang-info": "ఈ బొమ్మను $1 లో చూపెట్టు. $2",
        "img-lang-go": "వెళ్ళు",
-       "ascending_abbrev": "ఆరోహణ",
-       "descending_abbrev": "అవరోహణ",
        "table_pager_next": "తరువాతి పేజీ",
        "table_pager_prev": "ముందరి పేజీ",
        "table_pager_first": "మొదటి పేజీ",
index 58b3467..d6e0181 100644 (file)
        "watchthispage": "Hateke pájina ne'e",
        "unwatch": "La hateke ona",
        "watchlist-details": "{{PLURAL:$1|Pájina ida (1)|Pájina $1}} iha Ita-nia \"lista hateke\" (la ho pájina diskusaun).",
-       "wlshowlast": "Hatudu $1 hora $2 loron ikus",
        "watching": "Hateke...",
        "unwatching": "La hateke...",
        "enotif_impersonal_salutation": "Uza-na'in {{SITENAME}} nian",
index 0ca7d69..5989777 100644 (file)
        "wlheader-enotif": "Иттилоорасонии тариқи почтаи электронӣ (E-mail) фаъол шудааст.",
        "wlheader-showupdated": "Саҳифаҳое, ки пас аз охирин сар заданатон ба онҳо тағйир кардаанд '''пурранг''' нишон дода шудаанд",
        "wlnote": "Дар зер {{PLURAL:$1|охирин тағйир|'''$1''' охирин тағйирот}} дар $2 соати охир {{PLURAL:омадааст|омадаанд}}.",
-       "wlshowlast": "Намоиши охирин $1 соат $2 рӯзҳо",
        "watchlist-hide": "Пинҳон",
        "watchlist-submit": "Намоиш",
        "wlshowhidebots": "ботҳо",
        "imgmultipagenext": "саҳифаи баъдӣ →",
        "imgmultigo": "Бирав!",
        "imgmultigoto": "Ба саҳифаи $1 равед",
-       "ascending_abbrev": "афзуншаванда",
-       "descending_abbrev": "поёнӣ",
        "table_pager_next": "Саҳифаи навбатӣ",
        "table_pager_prev": "Саҳифаи гузашта",
        "table_pager_first": "Саҳифаи аввал",
index faac1c2..8ad66c4 100644 (file)
        "wlheader-enotif": "Ittiloorasoniji tariqi poctai elektronī (E-mail) imkonpazir ast.",
        "wlheader-showupdated": "Sahifahoe, ki pas az oxirin sar zadanaton ba onho taƣjir kardaand '''purrang''' nişon doda şudaand",
        "wlnote": "Dar zer {{PLURAL:$1|oxirin taƣjir|'''$1''' oxirin taƣjirot}} dar $2 soati oxir {{PLURAL:omadaast|omadaand}}.",
-       "wlshowlast": "Namoişi oxirin $1 soat $2 rūzho",
        "watchlist-options": "Ixtijoroti fehristi pajgiriho",
        "watching": "Pajgiri...",
        "unwatching": "Tavqifi pajgiri...",
        "imgmultipagenext": "sahifai ba'd →",
        "imgmultigo": "Birav!",
        "imgmultigoto": "Ba sahifai $1 raved",
-       "ascending_abbrev": "afzunşavanda",
-       "descending_abbrev": "pojonī",
        "table_pager_next": "Sahifai navbatī",
        "table_pager_prev": "Sahifai guzaşta",
        "table_pager_first": "Sahifai avval",
index ac8075c..8f363c8 100644 (file)
        "wlheader-enotif": "เปิดใช้งานการแจ้งเตือนผ่านอีเมล",
        "wlheader-showupdated": "หน้าที่มีการเปลี่ยนแปลงตั้งแต่คุณเยี่ยมครั้งสุดท้ายแสดงด้วย<strong>ตัวหนา</strong>",
        "wlnote": "ด้านล่างเป็น{{PLURAL:$1|การเปลี่ยนแปลงหลังสุด| <strong>$1</strong> การเปลี่ยนแปลงหลังสุด}} ใน{{PLURAL:$2|ชั่วโมง| <strong>$2</strong> ชั่วโมง}}ที่หลังสุด จนถึง $3, $4",
-       "wlshowlast": "แสดง $1 ชั่วโมง $2 วันล่าสุด",
        "watchlist-hide": "ซ่อน",
        "watchlist-submit": "แสดง",
        "wlshowtime": "ระยะเวลาที่แสดง:",
        "img-lang-default": "(ภาษาโดยปริยาย)",
        "img-lang-info": "เรนเดอร์ภาพนี้ใน $1 $2",
        "img-lang-go": "ไป",
-       "ascending_abbrev": "ลำดับขึ้น",
-       "descending_abbrev": "ลำดับลง",
        "table_pager_next": "หน้าถัดไป",
        "table_pager_prev": "หน้าก่อนหน้า",
        "table_pager_first": "หน้าแรก",
index 035ad27..b247d3d 100644 (file)
        "wlheader-enotif": "E-poçta bilen habar beriş açyk.",
        "wlheader-showupdated": "Soňky gezek baryp görenizden soňra üýtgedilen sahypalar '''goýy şrift''' bilen görkezilýär.",
        "wlnote": "Aşakda soňky {{PLURAL:$2|bir sagatda|'''$2''' sagatda}} edilen {{PLURAL:$1|soňky üýtgeşme|soňky '''$1''' üýtgeşme}} görkezilýär.",
-       "wlshowlast": "Soňky $1 sagady $2 güni görkez",
        "watchlist-options": "Gözegçilik sanawynyň opsiýalary",
        "watching": "Gözegçilige alynýar...",
        "unwatching": "Gözegçilikden aýyrylýar...",
        "imgmultipagenext": "indiki sahypa →",
        "imgmultigo": "Git!",
        "imgmultigoto": "$1 sahypasyna git",
-       "ascending_abbrev": "kiçiden ula",
-       "descending_abbrev": "uludan kiçä",
        "table_pager_next": "Indiki sahypa",
        "table_pager_prev": "Öňki sahypa",
        "table_pager_first": "Birinji sahypa",
index d3bb9db..0f5287c 100644 (file)
        "wlheader-enotif": "Umiiral ang pagpapahayag sa pamamagitan ng e-liham.",
        "wlheader-showupdated": "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
        "wlnote": "Nasa ibaba ang {{PLURAL:$1|pinakahuling pagbabago|pinakahuling <strong>$1</strong> pagbabago}} sa loob ng huling {{PLURAL:$2|oras|<strong>$2</strong> oras}}, magmula noong $3 sa ganap na $4.",
-       "wlshowlast": "Ipakita ang huling $1 oras, $2 araw",
        "watchlist-hide": "Itago",
        "wlshowhideminor": "mga maliliit na edit",
        "wlshowhidebots": "mga bot",
        "imgmultipagenext": "susunod na pahina →",
        "imgmultigo": "Punta!",
        "imgmultigoto": "Pumunta sa pahinang $1",
-       "ascending_abbrev": "taas",
-       "descending_abbrev": "baba",
        "table_pager_next": "Susunod na pahina",
        "table_pager_prev": "Nakaraang pahina",
        "table_pager_first": "Unang pahina",
index 6c735ed..7c78121 100644 (file)
        "watch": "Думотоно егыниеј",
        "unwatch": "Думотоно ныегыниеј",
        "watchlist-details": "Мызокирә сәһифон ныашмардеј, шымә ноғо доә сијоһиәдә {{PLURAL:$1|$1 сәһифәје|$1 сәһифәје}}.",
-       "wlshowlast": "Нишо дој бә охонә $1 саат $2 руж",
        "watchlist-options": "Ноғо доә сијоһи пеғандон",
        "actioncomplete": "Һәрәкәт иҹро кардә быә",
        "actionfailed": "Һәрәкәт иҹро кардә бәни",
index 069bdb9..8bf2af4 100644 (file)
        "wlheader-enotif": "Kuo fakamafeiaʻi tala mei he tohila",
        "wlheader-showupdated": "*Ko e ngaahi peesi kuo liliu talu he taimi hoʻo ʻaʻahi ki ai, ʻoku ʻasi mai fakasinolahi",
        "wlnote": "ʻOku ʻasi ʻi lalo ʻa e liliu fakamuimui ʻe $1 ʻi he houa fakamuimui ʻe <b>$2</b>.",
-       "wlshowlast": "ʻAsi mai houa fakamuimui ʻe $1, ʻaho ʻe $2,",
        "watching": "ʻOku leʻo...",
        "unwatching": "ʻOku taʻeleʻo...",
        "created": "kuo fakatupu",
        "imgmultipageprev": "← Peesi ki muʻa",
        "imgmultipagenext": "Peesi hoko →",
        "imgmultigo": "Fai ā!",
-       "ascending_abbrev": "hake",
-       "descending_abbrev": "hifo",
        "table_pager_next": "Peesi hoko",
        "table_pager_prev": "Peesi ki muʻa",
        "table_pager_first": "Peesi ʻuluaki",
index fa5ad24..8ed6373 100644 (file)
        "unwatchthispage": "Pinis long lukautim",
        "watchlist-details": "$1 pes istap long lukautbuk (dispela namba i no kaunim ol pes bilong toktok).",
        "wlheader-showupdated": "Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
-       "wlshowlast": "Lukim dispela $1 aua $2 de",
        "watchlist-options": "Ol laik bilong Lukautbuk",
        "watching": "Wet liklik, i go insait long lukautbuk nau...",
        "unwatching": "Wet liklik, i raus nau long lukautbuk...",
index cfcbaa6..4735c4c 100644 (file)
        "mainpage": "Anasayfa",
        "mainpage-description": "Anasayfa",
        "policy-url": "Project:Politika",
-       "portal": "Topluluk portali",
+       "portal": "Topluluk portalı",
        "portal-url": "Project:Topluluk portali",
        "privacy": "Gizlilik politikası",
        "privacypage": "Project:Gizlilik Politikası",
        "wlheader-enotif": "E-posta bildirimi etkin.",
        "wlheader-showupdated": "Sayfaları son ziyaretinizden beri değişen sayfalar '''kalın''' gösterilmiştir.",
        "wlnote": "$3 saat $4 itibariyle son {{PLURAL:$2|bir saatte|'''$2''' saatte}} yapılan {{PLURAL:$1|son değişiklik|son '''$1''' değişiklik}} aşağıdadır.",
-       "wlshowlast": "Son $1 saati $2 günü göster",
        "watchlist-hide": "Gizle",
        "watchlist-submit": "Göster",
        "wlshowtime": "Gösterilecek zaman aralığı:",
        "img-lang-default": "(varsayılan dil)",
        "img-lang-info": "Bu resmi $1 ile işle. $2",
        "img-lang-go": "Gönder",
-       "ascending_abbrev": "küçükten büyüğe",
-       "descending_abbrev": "azalan",
        "table_pager_next": "Sonraki sayfa",
        "table_pager_prev": "Önceki sayfa",
        "table_pager_first": "İlk",
index 9a43618..04c7c52 100644 (file)
        "watch": "Watch",
        "unwatch": "Unwatch",
        "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} on your watchlist, not counting talk pages.",
-       "wlshowlast": "Maḥway li aŞuḥlofe dıtsimi meqım $1 Sa³ayat $2 Yawme",
        "watchlist-options": "Watchlist options",
        "actioncomplete": "uDuboro kamıl",
        "actionfailed": "Action failed",
index 0ea0a58..eeffb2d 100644 (file)
        "watchlist-details": "Leexan patas gmraka su mseupu kana o niqan {{PLURAL:$1|$1 kngkingal ruwahan patas}} (supu kana pprngaw ruwahan patas).",
        "wlheader-showupdated": "Ga su mniq tnhici bi kingal babaw qmita wada kmpriyux smalu ruwahan patas mha saw muda <strong>patas qthur</strong> pqita.",
        "wlnote": "Truma nii asaw paah $3 $4 brah na {{PLURAL:$2|<strong>$2</strong> kska iyax}} tuki snluuan {{PLURAL:$1|<strong>$1</strong> snsul kmpriyux}}.",
-       "wlshowlast": "Pqita snii $1 {{PLURAL:$1|iyax}} tuki $2 {{PLURAL:$2|jiyax}}",
        "watchlist-hide": "lmiying",
        "watchlist-submit": "pqita",
        "enotif_reset": "Pnskraya kana ruwahan patas asaw wada pqita",
index a86a43e..99d8e5c 100644 (file)
        "watchthispage": "Languta tluka leri",
        "unwatch": "Ungalanguti",
        "watchlist-details": "{{PLURAL:$1|$1 tluka|$1 wa matluka}} eka nxaxamelo wa leswi uswilanguteke, kungasi hlayiwa matluka yu mbulavulo.",
-       "wlshowlast": "Komba $1 wati awara  $2 wa masiku kumbe",
        "watchlist-options": "Minhlawulo ya nxaxamelo wa leswilangutiweke",
        "watching": "Ulangutile...",
        "unwatching": "Utshika ku languta...",
index 0993ac2..16310eb 100644 (file)
        "wlheader-enotif": "Электрон почта аша белдерүләр ачык.",
        "wlheader-showupdated": "Сез соңгы карап чыгудан соң үзгәртелгән битләр <strong>калын</strong> хәрефләр белән күрсәтелгән.",
        "wlnote": "Түбәндә $3 көнгә $4 вакытка соңгы {{PLURAL:$2|бер сәгать|<strong>$2</strong> сәгать}} эчендә ясалган соңгы {{PLURAL:$1|үзгәреш|<strong>$1</strong> үзгәреш}} күрсәтелгән.",
-       "wlshowlast": "Соңгы $1 сәгать $2 көн эчендә күрсәтү",
        "watchlist-hide": "Яшерү",
        "watchlist-submit": "Күрсәтү",
        "wlshowtime": "Вакыт эчендә күрсәтергә:",
        "imgmultigoto": "$1 битенә күчү",
        "img-lang-default": "(гадәттәге тел)",
        "img-lang-go": "Башкару",
-       "ascending_abbrev": "үсү",
-       "descending_abbrev": "кимү",
        "table_pager_next": "Киләсе бит",
        "table_pager_prev": "Алдагы бит",
        "table_pager_first": "Беренче бит",
index 56f1a81..2e842e0 100644 (file)
        "unwatch": "Küzätmäw",
        "notanarticle": "Mäqälä tügel",
        "watchlist-details": "Küzätü isemlegegezdä, bäxäs bitlären sanamıyça, {{PLURAL:$1|$1 bit|$1 bit}} bar.",
-       "wlshowlast": "Bayağı $1 säğät $2 kön eçendä yäki nı kürsät",
        "watchlist-hide": "Yäşerü",
        "watchlist-options": "Küzätü isemlege köyläwläre",
        "watching": "Küzätü isemlegemä östäwe…",
        "imgmultipagenext": "aldağı bit →",
        "imgmultigo": "Küçü!",
        "imgmultigoto": "$1 bitenä küçü",
-       "ascending_abbrev": "üsü",
-       "descending_abbrev": "kimü",
        "table_pager_next": "Kiläse bit",
        "table_pager_prev": "Aldağı bit",
        "table_pager_first": "Berençe bit",
index 0e67024..bffe592 100644 (file)
        "unwatch": "Хайгааравас",
        "unwatchthispage": "Бо арынны хайгаарабас",
        "watchlist-details": "Чугаалажылга арыннарын санаваска, хайгаарал даңзыңарда {{PLURAL:$1|$1 арын}} бар.",
-       "wlshowlast": "Сөөлү $1 шак болгаш $2 хүн иштинде  көргүзери",
        "watchlist-options": "Хайгаарал даңзының эдиглери",
        "watching": "Хайгаарап турар...",
        "unwatching": "Хайгааравайн турар...",
index 2cb3924..c3b206e 100644 (file)
        "watchlistfor2": "ⵉ $1 $2",
        "watch": "ⵥⵕ",
        "unwatch": "ⵙⴱⴻⴷⴷ ⵍⵄⵙⵙⴰ",
-       "wlshowlast": "ⵉⵥⵕⵉ ⵏⵉⴹⵏ $1 ⵜⴰⵔⴰⴳⵉⵏ $2 ⵓⵙⵙⴰⵏ",
        "changed": "ⵜⴱⴷⴷⴻⵍⴷ",
        "delete-legend": "ⵓⴽⵓⵙ",
        "protectcomment": "ⴰⵙⵔⴰⴳ:",
index e304e2c..0c47afc 100644 (file)
        "wlheader-enotif": "ئېلخەتتە ئەسكەرتىش ئىقتىدارى قوزغىتىلدى.",
        "wlheader-showupdated": "سىز ئالدىنقى قېتىم كۆرگەندىن كېيىن ئۆزگەرتىلگەن بەتلەر '''توم''' كۆرۈنىدۇ",
        "wlnote": "تۆۋەندىكىسى يېقىنقى {{PLURAL:$2|سائەت}} ئىچىدىكى ئاخىرقى '{{PLURAL:$1| قېتىملىق}}  ئۆزگەرتىش، $3 $4 گىچە.",
-       "wlshowlast": "يېقىنقى $1 سائەت $2 كۈنلۈك ئۆزگەرتىشىنى كۆرسەت",
        "watchlist-options": "كۆزەت تىزىملىك تاللانما",
        "watching": "كۆزەت قىلىۋاتىدۇ…",
        "unwatching": "كۆزەت قىلمايۋاتىدۇ…",
        "imgmultipagenext": "كېيىنكى بەت →",
        "imgmultigo": "يوللاش!",
        "imgmultigoto": "$1 .بەتكە يۆتكىلىش",
-       "ascending_abbrev": "ئۆسكۈچى",
-       "descending_abbrev": "كېمەيگۈچى",
        "table_pager_next": "كېيىنكى بەت",
        "table_pager_prev": "ئالدىنقى بەت",
        "table_pager_first": "بىرىنچى بەت",
index 3fc3866..e07ec43 100644 (file)
        "wlheader-enotif": "Сповіщення електронною поштою ввімкнено.",
        "wlheader-showupdated": "Сторінки, що змінилися після Вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
        "wlnote": "Нижче наведено {{PLURAL:$1|останнє $1 редагування|останні $1 редагування|останні $1 редагувань}} за {{PLURAL:$2|останню|останні|останні}} <strong>$2</strong> {{PLURAL:$2|годину|години|годин}}, на час $3 $4.",
-       "wlshowlast": "Показати зміни за останні $1 годин $2 днів",
        "watchlist-hide": "Приховати",
        "watchlist-submit": "Показати",
        "wlshowtime": "Період часу для відображення:",
        "img-lang-default": "(типова мова)",
        "img-lang-info": "Візуалізувати це зображення у $1. $2",
        "img-lang-go": "Перейти",
-       "ascending_abbrev": "зрост",
-       "descending_abbrev": "спад",
        "table_pager_next": "Наступна сторінка",
        "table_pager_prev": "Попередня сторінка",
        "table_pager_first": "Перша сторінка",
index eaccee8..fa0c309 100644 (file)
        "wlheader-enotif": "ای میل کی اطلاع فعال ہے ۔",
        "wlheader-showupdated": "آپ کی آخری آمد کے بعد جن صفحات میں تبدیلی ہوئی ہے وہ <strong>جلی حروف</strong> میں نظر آئیں گے۔",
        "wlnote": "ذیل میں گزشتہ {{PLURAL:$2|گھنٹے|<strong>$2</strong> گھنٹوں}} میں ہونے والی {{PLURAL:$1|تبدیلی|<strong>$1</strong> تبدیلیوں}} کی فہرست درج ہے، تاریخ تجدید $3، $4",
-       "wlshowlast": "آخری $1 گھنٹے $2 دن دکھائیں",
        "watchlist-hide": "چھپائیں",
        "watchlist-submit": "دکھائیں",
        "wlshowtime": "ظاہر ہونے کی مدت:",
        "img-lang-default": "(طے شدہ زبان)",
        "img-lang-info": "تصویر کا اس زبان میں ترجمہ کریں $1۔ $2",
        "img-lang-go": "چلیں",
-       "ascending_abbrev": "صعودی",
-       "descending_abbrev": "نزولی",
        "table_pager_next": "اگلا صفحہ",
        "table_pager_prev": "پچھلا صفحہ",
        "table_pager_first": "پہلا صفحہ",
index 4781208..b54cc10 100644 (file)
        "watchlist-details": "Sizning kuzatuv roʻyxatingizda hozirda {{PLURAL:$1|bitta sahifa|$1ta sahifa}} mavjud (munozara sahifalarini hisobga olmaganda).",
        "wlheader-showupdated": "Siz oxirgi marta kirganingizdan keyin oʻzgartirilgan sahifalar '''qalin''' yozuv bilan ajratib koʻrsatilgan.",
        "wlnote": "Quyida oxirgi $2 soat ichida sodir boʻlgan {{PLURAL:$1|oxirgi oʻzgarish|<strong>$1</strong> ta oʻzgarishlar}} koʻrsatilgan. $3, $4.",
-       "wlshowlast": "Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsatish",
        "watchlist-submit": "Koʻrsat",
        "watchlist-options": "Kuzatuv roʻyxati moslamalari",
        "watching": "Kuzatish...",
index 2b7d3ce..37649c8 100644 (file)
        "wlheader-enotif": "Xe ativà la notifica via e-mail.",
        "wlheader-showupdated": "Le pagine che xe stà canbià da l'ultima olta che te le ghè viste, a le xe segnà in <strong>groso</strong>.",
        "wlnote": "Cuà soto te cati {{PLURAL:$1|'l ultimo canbiamento|i ultimi <strong>$1</strong> canbiamenti}} inte {{PLURAL:$2|l'ultema ora|łe ultime <strong>$2</strong> ore}}; i dati i xe axornai a łe $4 del $3.",
-       "wlshowlast": "Mostra le ultime $1 ore $2 zorni",
        "watchlist-options": "Inpostassion de le pagine tegnùe d'ocio",
        "watching": "Taco a tegner d'ocio...",
        "unwatching": "Desmeto de tegner d'ocio...",
        "imgmultigoto": "Và a la pagina $1",
        "img-lang-default": "(lengua predefinìa)",
        "img-lang-go": "Và",
-       "ascending_abbrev": "cresc",
-       "descending_abbrev": "decresc",
        "table_pager_next": "Pagina sucessiva",
        "table_pager_prev": "Pagina precedente",
        "table_pager_first": "Prima pagina",
index 1521c1d..d07840c 100644 (file)
        "notvisiblerev": "Versijad oma čutud",
        "watchlist-details": "Teiden kaclendnimikirjuteses om {{PLURAL:$1|$1 lehtpol'|$1 lehtpol't}}. Lodulehtpoled ei olgoi neciš lugus.",
        "wlheader-enotif": "Tedotand e-počtadme om kävutamas.",
-       "wlshowlast": "Ozutada jäl'gmäižiš $1 časuiš da $2 päiviš",
        "watchlist-options": "Kaclendnimikirjutesen järgendused",
        "watching": "Ližaduz kaclendnimikirjuteshe...",
        "unwatching": "Heitmine kaclendnimikirjutesespäi...",
        "imgmultipagenext": "jäl'ghine lehtpol' →",
        "imgmultigo": "Mända!",
        "imgmultigoto": "Mända lehtpolele $1",
-       "ascending_abbrev": "lib.",
-       "descending_abbrev": "lask.",
        "table_pager_next": "Jäl'ghine lehtpol'",
        "table_pager_prev": "Edeline lehtpol'",
        "table_pager_first": "Ezmäine lehtpol’",
index 0688798..360f2ce 100644 (file)
        "wlheader-enotif": "Đã bật thông báo qua thư điện tử.",
        "wlheader-showupdated": "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in <strong>đậm</strong>.",
        "wlnote": "Dưới đây là {{PLURAL:$1|thay đổi duy nhất|<strong>$1</strong> thay đổi gần nhất}} trong {{PLURAL:$2|giờ|<strong>$2</strong> giờ}} qua, tính tới $3 lúc $4.",
-       "wlshowlast": "Hiển thị $1 giờ $2 ngày gần đây",
        "watchlist-hide": "Ẩn",
        "watchlist-submit": "Xem",
        "wlshowtime": "Thời gian để hiển thị:",
        "img-lang-default": "(ngôn ngữ mặc định)",
        "img-lang-info": "Kết xuất hình này trong $1. $2",
        "img-lang-go": "Xem",
-       "ascending_abbrev": "tăng",
-       "descending_abbrev": "giảm",
        "table_pager_next": "Trang sau",
        "table_pager_prev": "Trang trước",
        "table_pager_first": "Trang đầu",
index ec060f2..34169e1 100644 (file)
        "watchthispage": "Dii sajdn undâr beoobachdung nämâ",
        "unwatch": "Nimmä beoobachdn",
        "watchlist-details": "Duu häldsch {{PLURAL:$1|1 sajdn|$1 sajdn}} undâr beoobachdung.",
-       "wlshowlast": "Dsajch dii ändrunga fo di ledsdn $1 schdundn, $2 dooch odär",
        "watchlist-options": "Was un wii alles af Dajnâr beobachdungslisdn dsajchd wärn sol",
        "watching": "Ghumd undâr beoobachdung ...",
        "unwatching": "Beobachdn ajschränggn",
index b694a42..8a356ce 100644 (file)
        "wlheader-enotif": "Nunam medü pot leäktronik pemögükon.",
        "wlheader-showupdated": "Pads pos visit lätik ola pevotüköls papenons '''me tonats bigik'''",
        "wlnote": "Is palisedons votükam{{PLURAL:$1| lätik|s lätik '''$1'''}} dü düp{{PLURAL:$2| lätik|s lätik '''$2'''}}.",
-       "wlshowlast": "Jonolöd: düpis lätik $1, delis lätik $2,",
        "watchlist-options": "Paramets galädaliseda",
        "watching": "Papladon ini galädalised...",
        "unwatching": "Pamoükon se galädalised...",
        "imgmultipagenext": "pad sököl →",
        "imgmultigo": "Gololöd!",
        "imgmultigoto": "Lü pad: $1",
-       "ascending_abbrev": "löpio",
-       "descending_abbrev": "donio",
        "table_pager_next": "Pad sököl",
        "table_pager_prev": "Pad büik",
        "table_pager_first": "Pad balid",
index 789d23c..ac77d85 100644 (file)
        "watchthispage": "Katso sitä cülciä",
        "unwatch": "Lõpõt kattsõõmin",
        "watchlist-details": "Kattsõspiizgall on {{PLURAL:$1|$1 cülci|$1 cülciä}} (ilma juttucülciit).",
-       "wlshowlast": "Näüt viimeized $1 tunnia vai $2 päivää",
        "watchlist-options": "Kattsõspiizgaa valimizõd",
        "watching": "Kattsõõn…",
        "unwatching": "Kattsõõmizõõ lõpõttõmin…",
index f39430a..7bf5967 100644 (file)
        "wlheader-enotif": "E-postiga teedäqandmisõq ommaq käügin.",
        "wlheader-showupdated": "Leheq, midä om muudõt päält su viimäst käümist, ommaq '''paksun kirän'''.",
        "wlnote": "Tan om {{PLURAL:$1|viimäne muutminõ|viimädseq <strong>$1</strong> muutmist}} viimädse {{PLURAL:$2|tunni|<strong>$2</strong> tunni}} joosul saisuga $3, kell $4.",
-       "wlshowlast": "Näütäq viimädseq $1 tunni $2 päivä",
        "watchlist-options": "Perräkaemisnimekirä säädmine",
        "watching": "Pandas perräkaemisnimekirjä...",
        "unwatching": "Võetas perräkaemisõ alt maaha...",
        "imgmultipagenext": "järgmäne leht →",
        "imgmultigo": "Mineq!",
        "imgmultigoto": "Mineq lehekülele $1",
-       "ascending_abbrev": "ülespoolõ",
-       "descending_abbrev": "allapoolõ",
        "table_pager_next": "Järgmäne leht",
        "table_pager_prev": "Mineväne leht",
        "table_pager_first": "Edimäne leht",
index 7279ebc..efebbb0 100644 (file)
        "wlheader-enotif": "Li notifiaedje pa emile est en alaedje.",
        "wlheader-showupdated": "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e <strong>cråssès letes</strong>.",
        "wlnote": "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les <strong>$1</strong> dierins candjmints}} {{PLURAL:$2|del dierinne eure|des <strong>$2</strong> dierinnès eures}}, disk' å $3 a $4.",
-       "wlshowlast": "Mostrer les dierin(nè)s $1 eures, $2 djoûs",
        "watchlist-hide": "Catchî",
        "watchlist-submit": "Mostrer",
        "watchlist-options": "Tchuzes del djivêye des shuvous",
        "imgmultipageprev": "← pådje di dvant",
        "imgmultipagenext": "pådje shuvante →",
        "imgmultigo": "Potchî !",
-       "ascending_abbrev": "crexh.",
-       "descending_abbrev": "discr.",
        "table_pager_next": "Pådje shuvante",
        "table_pager_prev": "Pådje di dvant",
        "table_pager_first": "Prumire pådje",
index 730c43b..d54ed05 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} aada ha imo talaan nga binabantayan (upod an mga hiruhimangraw-nga-pakli).",
        "wlheader-showupdated": "An mga pakli nga nagbag-o tikang ha imo urhi nga pagbisita in ginpapakita hin <strong>madakmol nga kasurat</strong>.",
        "wlnote": "Ha ilarom {{PLURAL:$1|amo an urhi nga pagbag-o|amo an mga urhi nga <strong>$1</strong> nga pagbag-o}} ha urhi nga {{PLURAL:$2|oras|<strong>$2</strong> mga oras}}, han $3, $4.",
-       "wlshowlast": "Igpakita an katapusan nga $1 ka mga oras $2 ka mga adlaw",
        "watchlist-hide": "Tago-a",
        "watchlist-submit": "Pakit-a",
        "wlshowtime": "Kaiha han oras ha pagdisplay:",
        "imgmultigo": "Pakadto!",
        "imgmultigoto": "Pakadto ha pakli $1",
        "img-lang-go": "Kadto",
-       "ascending_abbrev": "pasaka",
-       "descending_abbrev": "paubos",
        "table_pager_next": "Sunod nga pakli",
        "table_pager_prev": "Naha-una nga pakli",
        "table_pager_first": "Una nga pakli",
index eeb8344..703314d 100644 (file)
        "watchlist-details": "Topp nga $1 {{PLURAL:$1|xët|ciy xët}}, soo waññiwaalewul xëti waxtaanuwaay yi.",
        "wlheader-showupdated": "Xët yi ñu soppiwoon ca sa duggu bu mujj ñoom la ñu fesal ñu <b>xëm</b>",
        "wlnote": "Fii ci suuf {{PLURAL:$1| ngay gis coppite yu mujj yi|ngay gis $1 coppite yu mujj}} ci {{PLURAL:$2|waxtu gu mujj gi|<b>$2</b> waxtu yu mujj}}.",
-       "wlshowlast": "wone $1 waxtu yu mujj, $2 bess yu mujj, walla .",
        "watchlist-options": "Tànneefi limu toppte bi",
        "watching": "Topp...",
        "unwatching": "Farug toppte gi ...",
index e0d9e90..38131aa 100644 (file)
        "watchlist-details": "有$1页垃拉侬关注表高头(包括讨论页)。",
        "wlheader-showupdated": "勒侬上趟查看之后修改过个页面<strong>加粗</strong>显示。",
        "wlnote": "下底是{{PLURAL:$2|过去<strong>$2</strong>个钟头}}个{{PLURAL:$1|阿末<strong>$1</strong>趟更改}},截至$3 $4。",
-       "wlshowlast": "显示上$1个钟头$2日天",
        "watchlist-hide": "囥脱",
        "wlshowhidemine": "我个编辑",
        "watchlist-options": "关注表选项",
        "imgmultipagenext": "下一页 →",
        "imgmultigo": "去!",
        "imgmultigoto": "去到第$1页",
-       "ascending_abbrev": "升序",
-       "descending_abbrev": "降序",
        "table_pager_next": "下页",
        "table_pager_prev": "上页",
        "table_pager_first": "头一页",
index add335f..2abbe5e 100644 (file)
        "watchthispage": "Эн халхиг шинҗлх",
        "unwatch": "Шинҗлх биш",
        "watchlist-details": "Тана оврлңд меткәнә халхас бус $1 халх.",
-       "wlshowlast": "Сүл $1 цагин $2 өдрин туршк үзүлх",
        "watchlist-options": "Шинҗллһнә сеткүлин көгүд",
        "watching": "Шинҗллһнә бүтлклд немлһн...",
        "unwatching": "Шинҗлһнә бүрткләс һарһлһн...",
index 4712fb8..cc010c2 100644 (file)
        "watchthispage": "თე ხასილაშ კონტროლ",
        "unwatch": "კონტროლიშ გოუქვაფა",
        "watchlist-details": "{{PLURAL:$1|$1 ხასჷლა|$1 ხასჷლა}} რე თქვან კონტროლიშ ერკებულს, სხუნუაშ ხასჷლეფიშ უმეუკოროცხუო.",
-       "wlshowlast": "ეკონია $1 საათიშ $2 დღაშ  ძირაფა",
        "watchlist-options": "კონტროლიშ ერკებულიშ ოფციეფ",
        "watching": "კონტროლირებად...",
        "unwatching": "კონტროლ მონწყუმილ რე ...-შა",
        "img-lang-default": "(საწყისი ენა)",
        "img-lang-info": "აჩვენე ეს გამოსახულება $1, $2-ში",
        "img-lang-go": "მიდი",
-       "ascending_abbrev": "დაბრ",
-       "descending_abbrev": "აღწერა",
        "table_pager_next": "შემდეგი გვერდი",
        "table_pager_prev": "წინა გვერდი",
        "table_pager_first": "პირველი გვერდი",
index 3716edb..33ff1ad 100644 (file)
        "watchlist-details": "niSo’ kakita’an ray qintan babaw saeboeh hayza’ $1 yemien ( nom maehraehrang yemien saeboeh).",
        "wlheader-showupdated": "niSo’ ray ’ima maybi:il monhael komita sizaeh ka pinonrowa’ yemian ’am ’anoka <strong>\npinakrarahoe’ kina:at </strong> Sipinakita’.",
        "wlnote": "hani wahoer ’ima ’aring $3 $4 kaysa’an <strong>$2</strong> kakita’an hahila: pinaskayzayzaeh <strong>$1</strong> pinapaybi:il ka pyenti:",
-       "wlshowlast": "pinakita’  haysani’  $1 kakita’an ka hahila: $2 hahila:",
        "watchlist-hide": " Sa:il",
        "watchlist-submit": "pinakita’",
        "enotif_reset": "pinSakira:a’ ray yemien kinita’ ila saeboeh",
index 42bf6d9..46c9688 100644 (file)
        "wlheader-enotif": "ע-פאסט מעלדונג ערמעגליכט.",
        "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
        "wlnote": "אונטן {{PLURAL:$1|איז די לעצטע ענדערונג|זענען די לעצטע <strong>$1</strong> ענדערונגען}} אין {{PLURAL:$2|דער לעצטער שעה|די לעצטע <strong>$2</strong> שעה'ן}} ביז $3, $4.",
-       "wlshowlast": "ווײַזן די לעצטע $1 שעה'ן  $2 טעג",
        "watchlist-hide": "באַהאַלטן",
        "watchlist-submit": "ווײַזן",
        "wlshowtime": "צייט־פעריאד צו ווייזן:",
        "imgmultigoto": "אריבער צו בלאט $1",
        "img-lang-default": "(גרונטשפראך)",
        "img-lang-go": "גיין",
-       "ascending_abbrev": "ארויף",
-       "descending_abbrev": "נידערן",
        "table_pager_next": "נעקסטער בלאט",
        "table_pager_prev": "פריערדיקער בלאט",
        "table_pager_first": "ערשטער בלאט",
index 81cb6ec..03552cf 100644 (file)
        "wlheader-enotif": "Ìfitónilétí e-mail wà ní gbígbàláyè.",
        "wlheader-showupdated": "Àwọn ojúewé tí wọn ti ní àtúnṣe láti ẹ̀yìn ìgbà tí ẹ ṣàbẹ̀wò si wọn gbẹ̀yìn jẹ́ fífihàn ní lẹ́tà <strong>kedere</strong>.",
        "wlnote": "Lábẹ́ {{PLURAL:$1|ni àtúnṣe tó gbẹ̀yìn|ni àwọn àtúnṣe <strong>$1</strong> tí wọn gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí <strong>$2</strong>}} sẹ́yìn, títí dí ọjọ́ $3, $4.",
-       "wlshowlast": "Ìfihàn wákàtí $1 ọjọ́ $2 gbẹ̀yìn",
        "watchlist-hide": "Ìbòmọ́lẹ̀",
        "watchlist-submit": "Ìfihàn",
        "wlshowhideminor": "àwọn àtúnṣe kékéèké",
        "imgmultigo": "Lọ!",
        "imgmultigoto": "Lọ sí ojúewé $1",
        "img-lang-default": "(èdè látìbẹ̀rẹ̀)",
-       "ascending_abbrev": "ròkè",
-       "descending_abbrev": "relẹ̀",
        "table_pager_next": "Ojúewé tóúnbọ̀",
        "table_pager_prev": "Ojúewé tókọjá",
        "table_pager_first": "Ojúewé ìkíní",
index f033bc2..143b9a7 100644 (file)
        "wlheader-enotif": "電郵通知已經啟用咗。",
        "wlheader-showupdated": "標'''粗體字'''嘅頁響你上次嚟之後畀人改過。",
        "wlnote": "下面係直到$3 $4為止,最近'''$2'''個鐘之內嘅最新$1次修改。",
-       "wlshowlast": "顯示最近 $1 個鐘 $2 日",
        "watchlist-hide": "收埋",
        "watchlist-submit": "顯示",
        "wlshowtime": "顯示最後:",
        "img-lang-default": "(預設語言)",
        "img-lang-info": "整幅$1版嘅圖。 $2",
        "img-lang-go": "去",
-       "ascending_abbrev": "增",
-       "descending_abbrev": "減",
        "table_pager_next": "下一版",
        "table_pager_prev": "上一版",
        "table_pager_first": "第一版",
index bea6d4b..64c64ed 100644 (file)
        "watchthispage": "Bekiek deêze bladzie",
        "unwatch": "Nie meêr volge",
        "watchlist-details": "Er {{PLURAL:$1|sti eên pagina|staen $1 pagina's}} op je volglieste, exclusief overlegpagina's.",
-       "wlshowlast": "Laetste $1 uur, $2 daegen bekieken ()",
        "watchlist-options": "Opties vò volglieste",
        "actioncomplete": "Actie uutgevoerd",
        "actionfailed": "De handelienge is mislukt.",
        "monthsall": "aolle",
        "imgmultipageprev": "← vorrege bladzie",
        "imgmultipagenext": "volgende bladzie →",
-       "ascending_abbrev": "opl",
        "table_pager_next": "Volgende bladzie",
        "table_pager_prev": "Vorrege bladzie",
        "autosumm-blank": "Bladzie leeggemaekt",
index 8247e57..d0d4c8a 100644 (file)
        "watchlist-details": "{{PLURAL:$1|$1 ⵜⴰⵙⵏⴰ|$1 ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ}} ⴳ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ ⵏⵏⴽ (ⴰⴽⴷ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ).",
        "wlheader-showupdated": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏⵏⴰ ⵉⵜⵜⵓⵙⵏⴼⵍⵏ ⵙⴳ ⵜⵔⵣⴼⵜ ⵏⵏⴳ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ ⵜⵜⵓⵙⴽⴰⵏⴻⵏⵜ ⵙ  <strong>ⴰⵣⵓⵔⴰⵔ</strong>.",
        "wlnote": "ⴳ ⵓⴼⵍⵍⴰ, {{PLURAL:$1|ⵢⵓⵎⴰⵏ ⵓⵙⵏⴼⵍ ⴰⵎⴳⴳⴰⵔⵓ ⵉⵜⵜⵡⴰⵙⴽⴰⵔⵏ|ⵓⵎⴰⵏⴻⵏ <strong>$1</strong> ⵏ ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⴳⴳⵓⵔⴰ ⵉⵜⵜⵢⴰⵙⴽⴰⵔⵏ}} {{PLURAL:$2|ⵢⴰⵜ ⵜⵙⵔⴰⴳⵜ ⴰⵢⴰ|ⵢⴰⵏ <strong>$2</strong> ⵏ ⵜⵙⵔⴰⴳⵉⵏ ⴰⵢⴰ}}, ⴰⵔ $3, $4.",
-       "wlshowlast": "ⵙⴽⵏ $1 ⵜⴰⵙⵔⴰⴳⵉⵏ $2 ⵓⵙⵙⴰⵏ ⵉⵎⴳⴳⵓⵔⴰ",
        "watchlist-options": "ⵜⵉⴷⵖⵔⵉⵏ ⵏ ⵜⵍⴳⴰⵎⵜ ⵏ ⵓⴹⴼⴼⵓⵔ",
        "enotif_reset": "ⴷⵔⵣ ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴽⴽ ⵏⵏⴰ ⵜⵔⵣⴼⴷ",
        "deletepage": "ⴽⴽⵙ ⵜⴰⵙⵏⴰ",
index ed7addb..d167277 100644 (file)
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面<strong>加粗</strong>显示。",
        "wlnote": "下面是{{PLURAL:$2|过去<strong>$2</strong>小时}}的{{PLURAL:$1|最后<strong>$1</strong>个更改}},截至$3 $4。",
-       "wlshowlast": "显示过去$1小时$2天",
        "watchlist-hide": "隐藏",
        "watchlist-submit": "显示",
        "wlshowtime": "显示时段:",
        "movepage-moved-redirect": "重定向已创建。",
        "movepage-moved-noredirect": "重定向的创建已被禁用。",
        "movepage-delete-first": "作为页面移动的一部分,目标页面有太多的修改要删除。请先手动删除网页,然后再试一次。",
-       "articleexists": "该名称的页面已存在,或者您使用的名称无效。请另选一名。",
+       "articleexists": "该名称的页面已存在,或者您使用的名称无效。请另外选一个名称。",
        "cantmove-titleprotected": "您无法将页面移动到该位置,因为新标题已被保护以防止创建。",
        "movetalk": "移动关联的讨论页",
        "move-subpages": "移动子页面(最多$1页)",
        "img-lang-default": "(默认语言)",
        "img-lang-info": "以$1生成本图像。$2",
        "img-lang-go": "提交",
-       "ascending_abbrev": "升",
-       "descending_abbrev": "降",
        "table_pager_next": "下一页",
        "table_pager_prev": "上一页",
        "table_pager_first": "首页",
index 2eb8000..bf524b6 100644 (file)
        "createacct-loginerror": "已成功建立帳號,但無法自動登入。\n請繼續 [[Special:UserLogin|手動登入]]。",
        "noname": "您輸入的使用者名稱無效。",
        "loginsuccesstitle": "已登入",
-       "loginsuccess": "<strong>{{GENDER:|您|妳|你}}現在已經以 \"$1\" 的身分登入了 {{SITENAME}}。</strong>",
+       "loginsuccess": "<strong>您現在已經以「$1」的身分登入了{{SITENAME}}。</strong>",
        "nosuchuser": "查無名稱為 \"$1\" 的使用者。\n使用者名稱有大小寫區分,\n請檢查您拼寫是否正確,或者 [[Special:CreateAccount|建立新帳號]]。",
        "nosuchusershort": "查無使用者「$1」,請檢查您拼寫是否正確。",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "trackingcategories-nodesc": "沒有可用的描述。",
        "trackingcategories-disabled": "已停用分類",
        "mailnologin": "沒有傳送位址",
-       "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件地址才可以傳送郵件給其他使用者。",
+       "mailnologintext": "您必須先[[Special:UserLogin|登入]]並在[[Special:Preferences|偏好設定]]中設定一個有效的電子郵件地址才可以傳送郵件給其他使用者。",
        "emailuser": "Email 聯絡此使用者",
        "emailuser-title-target": "Email 聯絡此{{GENDER:$1|使用者}}",
        "emailuser-title-notarget": "Email 聯絡使用者",
        "wlheader-enotif": "已開啟電子郵件通知功能。",
        "wlheader-showupdated": "在您最後一次檢視過後修改的頁面會以 <strong>粗體</strong> 顯示。",
        "wlnote": "以下為自 $3 $4 之前的 <strong>$2</strong> 小時內所做的 <strong>$1</strong> 次變更。",
-       "wlshowlast": "顯示最近 $1 小時 $2 天",
        "watchlist-hide": "隱藏",
        "watchlist-submit": "顯示",
        "wlshowtime": "要顯示的時間長度:",
        "logentry-contentmodel-change-revert": "還原",
        "protectlogpage": "保護日誌",
        "protectlogtext": "以下為變更頁面保護的清單。\n請參考 [[Special:ProtectedPages|受保護頁面清單]] 檢視目前受保護頁面。",
-       "protectedarticle": "已保護 \"[[$1]]\"",
+       "protectedarticle": "已保護「[[$1]]」",
        "modifiedarticleprotection": "已變更 \"[[$1]]\" 的保護層級",
        "unprotectedarticle": "已解除「[[$1]]」的保護",
        "movedarticleprotection": "已移動 \"[[$2]]\" 的保護設定至 \"[[$1]]\"",
        "movepage-moved-redirect": "已建立重新導向頁面。",
        "movepage-moved-noredirect": "已取消建立重新導向頁面。",
        "movepage-delete-first": "目標頁面有太多修訂,而無法刪除作為頁面移動的部份。請先手動刪除頁面後再重試。",
-       "articleexists": "該頁面名稱已存在,或您選擇的名稱無效。\n請改選擇其他名稱。",
+       "articleexists": "該頁面名稱已存在,或您選擇的名稱無效。請改選擇其他名稱。",
        "cantmove-titleprotected": "您選擇的新標題已被禁止使用,您不可移動頁面到該位置。",
        "movetalk": "移動相關的討論頁面",
        "move-subpages": "移動子頁面(至多 $1 頁)",
        "import-interwiki-submit": "匯入",
        "import-mapping-default": "匯入至預設位置",
        "import-mapping-namespace": "匯入至命名空間:",
-       "import-mapping-subpage": "匯入做為以下頁面的子頁面:",
+       "import-mapping-subpage": "匯入作爲以下頁面的子頁面:",
        "import-upload-filename": "檔案名稱:",
        "import-upload-username-prefix": "跨 wiki 字首:",
        "import-assign-known-users": "分配編輯至所命名使用者已存在本地的本地使用者",
        "img-lang-default": "(預設語言)",
        "img-lang-info": "顯示此圖片於 $1。$2",
        "img-lang-go": "前往",
-       "ascending_abbrev": "升冪",
-       "descending_abbrev": "降冪",
        "table_pager_next": "下一頁",
        "table_pager_prev": "上一頁",
        "table_pager_first": "第一頁",
index c4f175f..f794abb 100644 (file)
@@ -595,6 +595,8 @@ SPARQL;
                         * TODO: For now, we do full update even though some data hasn't changed,
                         * e.g. parents for parent cat and counts for child cat.
                         */
+                       $childPages = [];
+                       $parentCats = [];
                        foreach ( $batch as $row ) {
                                $childPages[$row->rc_cur_id] = true;
                                $parentCats[$row->rc_title] = true;
@@ -614,7 +616,7 @@ SPARQL;
                        $pages = [];
                        $deleteUrls = [];
 
-                       if ( !empty( $childPages ) ) {
+                       if ( $childPages ) {
                                // Load child rows by ID
                                $childRows = $dbr->select(
                                        [ 'page', 'page_props', 'category' ],
@@ -642,7 +644,7 @@ SPARQL;
                                }
                        }
 
-                       if ( !empty( $parentCats ) ) {
+                       if ( $parentCats ) {
                                // Load parent rows by title
                                $joinConditions = [
                                        'page' => [
index a09ca5c..737e65f 100644 (file)
@@ -168,9 +168,8 @@ class ConvertExtensionToRegistration extends Maintenance {
                                $this->fatalError( "Error: Closures cannot be converted to JSON. " .
                                        "Please move your extension function somewhere else."
                                );
-                       }
-                       // check if $func exists in the global scope
-                       if ( function_exists( $func ) ) {
+                       } elseif ( function_exists( $func ) ) {
+                               // check if $func exists in the global scope
                                $this->fatalError( "Error: Global functions cannot be converted to JSON. " .
                                        "Please move your extension function ($func) into a class."
                                );
@@ -263,9 +262,8 @@ class ConvertExtensionToRegistration extends Maintenance {
                                        $this->fatalError( "Error: Closures cannot be converted to JSON. " .
                                                "Please move the handler for $hookName somewhere else."
                                        );
-                               }
-                               // Check if $func exists in the global scope
-                               if ( function_exists( $func ) ) {
+                               } elseif ( function_exists( $func ) ) {
+                                       // Check if $func exists in the global scope
                                        $this->fatalError( "Error: Global functions cannot be converted to JSON. " .
                                                "Please move the handler for $hookName inside a class."
                                        );
@@ -278,6 +276,11 @@ class ConvertExtensionToRegistration extends Maintenance {
                $this->json[$realName] = $value;
        }
 
+       /**
+        * @param string $realName
+        * @param array[] $value
+        * @suppress PhanTypeInvalidDimOffset
+        */
        protected function handleResourceModules( $realName, $value ) {
                $defaults = [];
                $remote = $this->hasOption( 'skin' ) ? 'remoteSkinPath' : 'remoteExtPath';
index 1142325..ce40638 100644 (file)
@@ -358,6 +358,7 @@ class CopyFileBackend extends Maintenance {
                        // backends in FileBackendMultiWrite (since they get writes second, they have
                        // higher timestamps). However, when copying the other way, this hits loads of
                        // false positives (possibly 100%) and wastes a bunch of time on GETs/PUTs.
+                       // @phan-suppress-next-line PhanTypeArraySuspiciousNullable
                        $same = ( $srcStat['mtime'] <= $dstStat['mtime'] );
                } else {
                        // This is the slowest method which does many per-file HEADs (unless an object
index aef45bf..4c3fe7b 100644 (file)
@@ -132,7 +132,7 @@ class GenerateSitemap extends Maintenance {
        /**
         * A resource pointing to a sitemap file
         *
-        * @var resource
+        * @var resource|false
         */
        public $file;
 
index c2c5ccf..0ff3622 100644 (file)
@@ -41,6 +41,7 @@ class BackupReader extends Maintenance {
        public $uploads = false;
        protected $uploadCount = 0;
        public $imageBasePath = false;
+       /** @var array|false */
        public $nsFilter = false;
 
        function __construct() {
index 21b92c5..00d7c90 100644 (file)
@@ -64,7 +64,8 @@ class TextPassDumper extends BackupDumper {
 
        protected $bufferSize = 524288; // In bytes. Maximum size to read from the stub in on go.
 
-       protected $php = "php";
+       /** @var array */
+       protected $php = [];
        protected $spawn = false;
 
        /**
@@ -73,14 +74,14 @@ class TextPassDumper extends BackupDumper {
        protected $spawnProc = false;
 
        /**
-        * @var bool|resource
+        * @var resource
         */
-       protected $spawnWrite = false;
+       protected $spawnWrite;
 
        /**
-        * @var bool|resource
+        * @var resource
         */
-       protected $spawnRead = false;
+       protected $spawnRead;
 
        /**
         * @var bool|resource
@@ -96,6 +97,7 @@ class TextPassDumper extends BackupDumper {
        protected $firstPageWritten = false;
        protected $lastPageWritten = false;
        protected $checkpointJustWritten = false;
+       /** @var string[] */
        protected $checkpointFiles = [];
 
        /**
@@ -207,6 +209,7 @@ TEXT
         * This function resets $this->lb and closes all connections on it.
         *
         * @throws MWException
+        * @suppress PhanTypeObjectUnsetDeclaredProperty
         */
        function rotateDb() {
                // Cleaning up old connections
@@ -301,6 +304,7 @@ TEXT
                        $param = $split[1];
                }
                $fileURIs = explode( ';', $param );
+               $newFileURIs = [];
                foreach ( $fileURIs as $URI ) {
                        switch ( $val ) {
                                case "file":
@@ -430,7 +434,7 @@ TEXT
 
        /**
         * @throws MWException Failure to parse XML input
-        * @param string $input
+        * @param resource $input
         * @return bool
         */
        function readDump( $input ) {
@@ -807,11 +811,11 @@ TEXT
                if ( $this->spawnRead ) {
                        fclose( $this->spawnRead );
                }
-               $this->spawnRead = false;
+               $this->spawnRead = null;
                if ( $this->spawnWrite ) {
                        fclose( $this->spawnWrite );
                }
-               $this->spawnWrite = false;
+               $this->spawnWrite = null;
                if ( $this->spawnErr ) {
                        fclose( $this->spawnErr );
                }
index 80e72fb..48a6666 100644 (file)
@@ -157,6 +157,7 @@ class MergeMessageFileList extends Maintenance {
 require_once RUN_MAINTENANCE_IF_MAIN;
 
 $queue = [];
+'@phan-var string[][] $mmfl';
 foreach ( $mmfl['setupFiles'] as $fileName ) {
        if ( strval( $fileName ) === '' ) {
                continue;
index c85e194..84b962a 100644 (file)
@@ -122,7 +122,7 @@ class PopulateArchiveRevId extends LoggedUpdateMaintenance {
                                $dbw->doAtomicSection( __METHOD__, function ( IDatabase $dbw, $fname ) {
                                        $dbw->insert( 'revision', self::$dummyRev, $fname );
                                        $id = $dbw->insertId();
-                                       $toDelete[] = $id;
+                                       $toDelete = [ $id ];
 
                                        $maxId = max(
                                                (int)$dbw->selectField( 'archive', 'MAX(ar_rev_id)', [], $fname ),
index f91a5b6..d1c71de 100644 (file)
@@ -125,7 +125,6 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
 
        /**
         * @param MediaWiki\Revision\RevisionStore $revStore
-        * @param string $emptySha1
         * @return int
         */
        protected function doSha1LegacyUpdates( $revStore ) {
index 88eaf67..2f8dcc4 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Purge all languages from the message cache.
- *
  * 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
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script that purges all languages from the message cache.
+ * Maintenance script that purges cache used by MessageCache.
  *
  * @ingroup Maintenance
  */
 class RebuildMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
-               $this->addDescription( 'Purge all language messages from the cache' );
+               $this->addDescription( 'Purge the MessageCache for all interface languages.' );
        }
 
        public function execute() {
-               global $wgLocalDatabases, $wgDBname, $wgEnableSidebarCache, $messageMemc;
-               if ( $wgLocalDatabases ) {
-                       $databases = $wgLocalDatabases;
-               } else {
-                       $databases = [ $wgDBname ];
-               }
-
-               foreach ( $databases as $db ) {
-                       $this->output( "Deleting message cache for {$db}... " );
-                       $messageMemc->delete( "{$db}:messages" );
-                       if ( $wgEnableSidebarCache ) {
-                               $messageMemc->delete( "{$db}:sidebar" );
-                       }
-                       $this->output( "Deleted\n" );
-               }
+               $this->output( "Purging message cache for all languages on this wiki... " );
+               $messageCache = MediaWikiServices::getInstance()->getMessageCache();
+               $messageCache->clear();
+               $this->output( "Done\n" );
        }
 }
 
index 612c092..e7988fe 100644 (file)
@@ -175,9 +175,9 @@ class MwSql extends Maintenance {
                        return $this->sqlPrintResult( $res, $db );
                } catch ( DBQueryError $e ) {
                        if ( $dieOnError ) {
-                               $this->fatalError( $e );
+                               $this->fatalError( (string)$e );
                        } else {
-                               $this->error( $e );
+                               $this->error( (string)$e );
                        }
                }
                return null;
index beb1975..b6aa626 100644 (file)
@@ -223,6 +223,7 @@ class CompressOld extends Maintenance {
         * @param string $extdb
         * @param bool|int $maxPageId
         * @return bool
+        * @suppress PhanTypeInvalidDimOffset
         */
        private function compressWithConcat( $startId, $maxChunkSize, $beginDate,
                $endDate, $extdb = "", $maxPageId = false
index 92b6679..316d2d2 100644 (file)
@@ -710,7 +710,7 @@ class CgzCopyTransaction {
        /** @var RecompressTracked */
        public $parent;
        public $blobClass;
-       /** @var ConcatenatedGzipHistoryBlob */
+       /** @var ConcatenatedGzipHistoryBlob|false */
        public $cgz;
        public $referrers;
 
index ebace75..19fc54a 100644 (file)
@@ -104,9 +104,8 @@ TEXT
                        'STRAIGHT_JOIN' // per T58041
                ];
 
-               if ( $force ) {
-                       $collationConds = [];
-               } else {
+               $collationConds = [];
+               if ( !$force ) {
                        if ( $this->hasOption( 'previous-collation' ) ) {
                                $collationConds['cl_collation'] = $this->getOption( 'previous-collation' );
                        } else {
index a27c8a5..c9fb780 100644 (file)
@@ -18,7 +18,7 @@ class UpdateExtensionJsonSchema extends Maintenance {
                }
 
                $json = FormatJson::decode( file_get_contents( $filename ), true );
-               if ( $json === null ) {
+               if ( !is_array( $json ) ) {
                        $this->fatalError( "Error: Invalid JSON" );
                }
 
index 6cd7811..00ff2c9 100644 (file)
@@ -87,7 +87,6 @@ $wgAutoloadClasses += [
        'ApiQueryTestBase' => "$testDir/phpunit/includes/api/query/ApiQueryTestBase.php",
        'ApiQueryContinueTestBase' => "$testDir/phpunit/includes/api/query/ApiQueryContinueTestBase.php",
        'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
-       'ApiTestCaseUpload' => "$testDir/phpunit/includes/api/ApiTestCaseUpload.php",
        'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestContext.php",
        'ApiUploadTestCase' => "$testDir/phpunit/includes/api/ApiUploadTestCase.php",
        'MockApi' => "$testDir/phpunit/includes/api/MockApi.php",
index 83f27e8..82d359f 100644 (file)
@@ -182,8 +182,10 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                global $IP;
                parent::setUpBeforeClass();
                if ( !file_exists( "$IP/LocalSettings.php" ) ) {
-                       echo 'A working MediaWiki installation with a configured LocalSettings.php file is'
-                       . ' required for tests that extend ' . self::class;
+                               echo "File \"$IP/LocalSettings.php\" could not be found. "
+                               . "Test case " . static::class . " extends " . self::class . " "
+                               . "which requires a working MediaWiki installation.\n"
+                               . ( new RuntimeException() )->getTraceAsString();
                        die();
                }
                self::initializeForStandardPhpunitEntrypointIfNeeded();
@@ -584,6 +586,17 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                $this->tmpFiles = array_merge( $this->tmpFiles, (array)$files );
        }
 
+       private static function formatErrorLevel( $errorLevel ) {
+               switch ( gettype( $errorLevel ) ) {
+               case 'integer':
+                       return '0x' . strtoupper( dechex( $errorLevel ) );
+               case 'NULL':
+                       return 'null';
+               default:
+                       throw new MWException( 'Unexpected error level type ' . gettype( $errorLevel ) );
+               }
+       }
+
        protected function tearDown() {
                global $wgRequest, $wgSQLMode;
 
@@ -649,10 +662,10 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                if ( $phpErrorLevel !== $this->phpErrorLevel ) {
                        ini_set( 'error_reporting', $this->phpErrorLevel );
 
-                       $oldHex = strtoupper( dechex( $this->phpErrorLevel ) );
-                       $newHex = strtoupper( dechex( $phpErrorLevel ) );
+                       $oldVal = self::formatErrorLevel( $this->phpErrorLevel );
+                       $newVal = self::formatErrorLevel( $phpErrorLevel );
                        $message = "PHP error_reporting setting was left dirty: "
-                               . "was 0x$oldHex before test, 0x$newHex after test!";
+                               . "was $oldVal before test, $newVal after test!";
 
                        $this->fail( $message );
                }
@@ -1122,7 +1135,10 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $this->setService( 'ContentLanguage', $lang );
                        $this->setMwGlobals( 'wgLanguageCode', $lang->getCode() );
                } else {
-                       $this->setMwGlobals( 'wgLanguageCode', $lang );
+                       $this->setMwGlobals( [
+                               'wgLanguageCode' => $lang,
+                               'wgContLang' => Language::factory( $lang ),
+                       ] );
                }
        }
 
index f047d82..4ccfe39 100644 (file)
@@ -26,7 +26,7 @@ trait MediaWikiTestCaseTrait {
         */
        protected function createNoOpMock( $type ) {
                $mock = $this->createMock( $type );
-               $mock->expects( $this->never() )->method( $this->anything() );
+               $mock->expects( $this->never() )->method( $this->anythingBut( '__destruct' ) );
                return $mock;
        }
 }
index f227ae1..9e79496 100644 (file)
@@ -74,16 +74,19 @@ wfRequireOnceInGlobalScope( "$IP/includes/Defines.php" );
 wfRequireOnceInGlobalScope( "$IP/includes/DefaultSettings.php" );
 wfRequireOnceInGlobalScope( "$IP/includes/GlobalFunctions.php" );
 
-// Load extensions/skins present in filesystem so that classes can be discovered.
+// Populate classes and namespaces from extensions and skins present in filesystem.
 $directoryToJsonMap = [
-       'extensions' => [ 'extension.json', 'extension-wip.json' ],
-       'skins' => [ 'skin.json', 'skin-wip.json' ]
+       $GLOBALS['wgExtensionDirectory'] => [ 'extension.json', 'extension-wip.json' ],
+       $GLOBALS['wgStyleDirectory'] => [ 'skin.json', 'skin-wip.json' ]
 ];
 foreach ( $directoryToJsonMap as $directory => $jsonFile ) {
-       foreach ( new DirectoryIterator( __DIR__ . '/../../' . $directory ) as $iterator ) {
+       foreach ( new DirectoryIterator( $directory ) as $iterator ) {
                foreach ( $jsonFile as $file ) {
+
                        $jsonPath = $iterator->getPathname() . '/' . $file;
                        if ( file_exists( $jsonPath ) ) {
+                               // ExtensionRegistry->readFromQueue is not used as it checks extension/skin
+                               // dependencies, which we don't need or want for unit tests.
                                $json = file_get_contents( $jsonPath );
                                $info = json_decode( $json, true );
                                $dir = dirname( $jsonPath );
diff --git a/tests/phpunit/includes/Message/TextFormatterTest.php b/tests/phpunit/includes/Message/TextFormatterTest.php
new file mode 100644 (file)
index 0000000..233810f
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+namespace MediaWiki\Tests\Message;
+
+use MediaWiki\Message\TextFormatter;
+use MediaWikiTestCase;
+use Message;
+use Wikimedia\Message\MessageValue;
+use Wikimedia\Message\ParamType;
+use Wikimedia\Message\TextParam;
+
+/**
+ * @covers \MediaWiki\Message\TextFormatter
+ * @covers \Wikimedia\Message\MessageValue
+ * @covers \Wikimedia\Message\ListParam
+ * @covers \Wikimedia\Message\TextParam
+ * @covers \Wikimedia\Message\MessageParam
+ */
+class TextFormatterTest extends MediaWikiTestCase {
+       private function createTextFormatter( $langCode ) {
+               return new class( $langCode ) extends TextFormatter {
+                       public function __construct( $langCode ) {
+                               parent::__construct( $langCode );
+                       }
+
+                       protected function createMessage( $key ) {
+                               return new FakeMessage( $key );
+                       }
+               };
+       }
+
+       public function testGetLangCode() {
+               $formatter = $this->createTextFormatter( 'fr' );
+               $this->assertSame( 'fr', $formatter->getLangCode() );
+       }
+
+       public function testFormatBitrate() {
+               $formatter = $this->createTextFormatter( 'en' );
+               $mv = ( new MessageValue( 'test' ) )->bitrateParams( 100, 200 );
+               $result = $formatter->format( $mv );
+               $this->assertSame( 'test 100 bps 200 bps', $result );
+       }
+
+       public function testFormatList() {
+               $formatter = $this->createTextFormatter( 'en' );
+               $mv = ( new MessageValue( 'test' ) )->commaListParams( [
+                       'a',
+                       new TextParam( ParamType::BITRATE, 100 ),
+               ] );
+               $result = $formatter->format( $mv );
+               $this->assertSame( 'test a, 100 bps $2', $result );
+       }
+}
+
+class FakeMessage extends Message {
+       public function fetchMessage() {
+               return "{$this->getKey()} $1 $2";
+       }
+}
index ac39b48..1d88122 100644 (file)
@@ -5,6 +5,7 @@ namespace MediaWiki\Tests\Storage;
 use InvalidArgumentException;
 use Language;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\BlobAccessException;
 use MediaWiki\Storage\SqlBlobStore;
 use MediaWikiTestCase;
 use stdClass;
@@ -218,6 +219,7 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
        }
 
        /**
+        * @param string $blob
         * @dataProvider provideBlobs
         * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
         * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
@@ -228,6 +230,109 @@ class SqlBlobStoreTest extends MediaWikiTestCase {
                $this->assertSame( $blob, $store->getBlob( $address ) );
        }
 
+       /**
+        * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
+        * @covers \MediaWiki\Storage\SqlBlobStore::getBlobBatch
+        */
+       public function testSimpleStorageGetBlobBatchSimpleEmpty() {
+               $store = $this->getBlobStore();
+               $this->assertArrayEquals(
+                       [],
+                       $store->getBlobBatch( [] )->getValue()
+               );
+       }
+
+       /**
+        * @param string $blob
+        * @dataProvider provideBlobs
+        * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
+        * @covers \MediaWiki\Storage\SqlBlobStore::getBlobBatch
+        */
+       public function testSimpleStorageGetBlobBatchSimpleRoundtrip( $blob ) {
+               $store = $this->getBlobStore();
+               $addresses = [
+                       $store->storeBlob( $blob ),
+                       $store->storeBlob( $blob . '1' )
+               ];
+               $this->assertArrayEquals(
+                       array_combine( $addresses, [ $blob, $blob . '1' ] ),
+                       $store->getBlobBatch( $addresses )->getValue()
+               );
+       }
+
+       /**
+        * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
+        */
+       public function testSimpleStorageNonExistentBlob() {
+               $this->setExpectedException( BlobAccessException::class );
+               $store = $this->getBlobStore();
+               $store->getBlob( 'tt:this_will_not_exist' );
+       }
+
+       /**
+        * @covers \MediaWiki\Storage\SqlBlobStore::getBlobBatch
+        */
+       public function testSimpleStorageNonExistentBlobBatch() {
+               $store = $this->getBlobStore();
+               $result = $store->getBlobBatch( [ 'tt:this_will_not_exist', 'tt:1000', 'bla:1001' ] );
+               $this->assertSame(
+                       [
+                               'tt:this_will_not_exist' => null,
+                               'tt:1000' => null,
+                               'bla:1001' => null
+                       ],
+                       $result->getValue()
+               );
+               $this->assertSame( [
+                       [
+                               'type' => 'warning',
+                               'message' => 'internalerror',
+                               'params' => [
+                                       'Bad blob address: tt:this_will_not_exist'
+                               ]
+                       ],
+                       [
+                               'type' => 'warning',
+                               'message' => 'internalerror',
+                               'params' => [
+                                       'Unknown blob address schema: bla'
+                               ]
+                       ],
+                       [
+                               'type' => 'warning',
+                               'message' => 'internalerror',
+                               'params' => [
+                                       'Unable to fetch blob at tt:1000'
+                               ]
+                       ]
+               ], $result->getErrors() );
+       }
+
+       /**
+        * @covers \MediaWiki\Storage\SqlBlobStore::getBlobBatch
+        */
+       public function testSimpleStoragePartialNonExistentBlobBatch() {
+               $store = $this->getBlobStore();
+               $address = $store->storeBlob( 'test_data' );
+               $result = $store->getBlobBatch( [ $address, 'tt:this_will_not_exist_too' ] );
+               $this->assertSame(
+                       [
+                               $address => 'test_data',
+                               'tt:this_will_not_exist_too' => null
+                       ],
+                       $result->getValue()
+               );
+               $this->assertSame( [
+                       [
+                               'type' => 'warning',
+                               'message' => 'internalerror',
+                               'params' => [
+                                       'Bad blob address: tt:this_will_not_exist_too'
+                               ]
+                       ],
+               ], $result->getErrors() );
+       }
+
        /**
         * @dataProvider provideBlobs
         * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
index 6a44ff3..3adf1b6 100644 (file)
@@ -1443,7 +1443,7 @@ class ApiBaseTest extends ApiTestCase {
                }
 
                $status = StatusValue::newGood();
-               $status->setOk( false );
+               $status->setOK( false );
                try {
                        $mock->dieStatus( $status );
                        $this->fail( 'Expected exception not thrown' );
diff --git a/tests/phpunit/includes/api/ApiTestCaseUpload.php b/tests/phpunit/includes/api/ApiTestCaseUpload.php
deleted file mode 100644 (file)
index a4ff1f0..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-/**
- * For backward compatibility since 1.31
- */
-abstract class ApiTestCaseUpload extends ApiUploadTestCase {
-}
index 41c9aed..3860b76 100644 (file)
 <?php
+
 /**
- * n.b. Ensure that you can write to the images/ directory as the
- * user that will run tests.
- *
- * Note for reviewers: this intentionally duplicates functionality already in
- * "ApiSetup" and so on. This framework works better IMO and has less
- * strangeness (such as test cases inheriting from "ApiSetup"...) (and in the
- * case of the other Upload tests, this flat out just actually works... )
- *
- * @todo Port the other Upload tests, and other API tests to this framework
- *
- * @todo Broken test, reports false errors from time to time.
- * See https://phabricator.wikimedia.org/T28169
- *
- * @todo This is pretty sucky... needs to be prettified.
- *
  * @group API
  * @group Database
  * @group medium
- * @group Broken
  *
  * @covers ApiUpload
  */
 class ApiUploadTest extends ApiUploadTestCase {
-       /**
-        * Testing login
-        * XXX this is a funny way of getting session context
-        */
-       public function testLogin() {
-               $user = self::$users['uploader'];
-               $userName = $user->getUser()->getName();
-               $password = $user->getPassword();
-
-               $params = [
-                       'action' => 'login',
-                       'lgname' => $userName,
-                       'lgpassword' => $password
-               ];
-               list( $result, , $session ) = $this->doApiRequest( $params );
-               $this->assertArrayHasKey( "login", $result );
-               $this->assertArrayHasKey( "result", $result['login'] );
-               $this->assertEquals( "NeedToken", $result['login']['result'] );
-               $token = $result['login']['token'];
-
-               $params = [
-                       'action' => 'login',
-                       'lgtoken' => $token,
-                       'lgname' => $userName,
-                       'lgpassword' => $password
-               ];
-               list( $result, , $session ) = $this->doApiRequest( $params, $session );
-               $this->assertArrayHasKey( "login", $result );
-               $this->assertArrayHasKey( "result", $result['login'] );
-               $this->assertEquals( "Success", $result['login']['result'] );
-
-               $this->assertNotEmpty( $session, 'API Login must return a session' );
-
-               return $session;
+       private function filePath( $fileName ) {
+               return __DIR__ . '/../../data/media/' . $fileName;
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUploadRequiresToken( $session ) {
-               $exception = false;
-               try {
-                       $this->doApiRequest( [
-                               'action' => 'upload'
-                       ] );
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-                       $this->assertContains( 'The "token" parameter must be set', $e->getMessage() );
-               }
-               $this->assertTrue( $exception, "Got exception" );
+       public function setUp() {
+               parent::setUp();
+               $this->tablesUsed[] = 'watchlist'; // This test might interfere with watchlists test.
+               $this->tablesUsed = array_merge( $this->tablesUsed, LocalFile::getQueryInfo()['tables'] );
+               $this->setService( 'RepoGroup', new RepoGroup(
+                       [
+                               'class' => LocalRepo::class,
+                               'name' => 'temp',
+                               'backend' => new FSFileBackend( [
+                                       'name' => 'temp-backend',
+                                       'wikiId' => wfWikiID(),
+                                       'basePath' => $this->getNewTempDirectory()
+                               ] )
+                       ],
+                       [],
+                       null
+               ) );
+               $this->resetServices();
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUploadMissingParams( $session ) {
-               $exception = false;
-               try {
-                       $this->doApiRequestWithToken( [
-                               'action' => 'upload',
-                       ], $session, self::$users['uploader']->getUser() );
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-                       $this->assertEquals(
-                               'One of the parameters "filekey", "file" and "url" is required.',
-                               $e->getMessage()
-                       );
-               }
-               $this->assertTrue( $exception, "Got exception" );
+       public function testUploadRequiresToken() {
+               $this->setExpectedException(
+                       ApiUsageException::class,
+                       'The "token" parameter must be set'
+               );
+               $this->doApiRequest( [
+                       'action' => 'upload'
+               ] );
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUpload( $session ) {
-               $extension = 'png';
-               $mimeType = 'image/png';
-
-               try {
-                       $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, $this->getNewTempDirectory() );
-               } catch ( Exception $e ) {
-                       $this->markTestIncomplete( $e->getMessage() );
-               }
-
-               /** @var array $filePaths */
-               $filePath = $filePaths[0];
-               $fileSize = filesize( $filePath );
-               $fileName = basename( $filePath );
-
-               $this->deleteFileByFileName( $fileName );
-               $this->deleteFileByContent( $filePath );
+       public function testUploadMissingParams() {
+               $this->setExpectedException(
+                       ApiUsageException::class,
+                       'One of the parameters "filekey", "file" and "url" is required'
+               );
+               $this->doApiRequestWithToken( [
+                       'action' => 'upload',
+               ], null, self::$users['uploader']->getUser() );
+       }
 
-               if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
-                       $this->markTestIncomplete( "Couldn't upload file!\n" );
-               }
+       public function testUpload() {
+               $fileName = 'TestUpload.jpg';
+               $mimeType = 'image/jpeg';
+               $filePath = $this->filePath( 'yuv420.jpg' );
 
-               $params = [
+               $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath );
+               list( $result ) = $this->doApiRequestWithToken( [
                        'action' => 'upload',
                        'filename' => $fileName,
                        'file' => 'dummy content',
                        'comment' => 'dummy comment',
                        'text' => "This is the page text for $fileName",
-               ];
+               ], null, self::$users['uploader']->getUser() );
 
-               $exception = false;
-               try {
-                       list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() );
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertTrue( isset( $result['upload'] ) );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertEquals( $fileSize, (int)$result['upload']['imageinfo']['size'] );
+               $this->assertSame( filesize( $filePath ), (int)$result['upload']['imageinfo']['size'] );
                $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
-               $this->assertFalse( $exception );
-
-               // clean up
-               $this->deleteFileByFileName( $fileName );
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUploadZeroLength( $session ) {
-               $mimeType = 'image/png';
-
+       public function testUploadZeroLength() {
                $filePath = $this->getNewTempFile();
-               $fileName = "apiTestUploadZeroLength.png";
-
-               $this->deleteFileByFileName( $fileName );
+               $mimeType = 'image/jpeg';
+               $fileName = "ApiTestUploadZeroLength.jpg";
 
-               if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
-                       $this->markTestIncomplete( "Couldn't upload file!\n" );
-               }
+               $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath );
 
-               $params = [
+               $this->setExpectedException(
+                       ApiUsageException::class,
+                       'The file you submitted was empty'
+               );
+               $this->doApiRequestWithToken( [
                        'action' => 'upload',
                        'filename' => $fileName,
                        'file' => 'dummy content',
                        'comment' => 'dummy comment',
                        'text' => "This is the page text for $fileName",
-               ];
-
-               $exception = false;
-               try {
-                       $this->doApiRequestWithToken( $params, $session, self::$users['uploader']->getUser() );
-               } catch ( ApiUsageException $e ) {
-                       $this->assertContains( 'The file you submitted was empty', $e->getMessage() );
-                       $exception = true;
-               }
-               $this->assertTrue( $exception );
-
-               // clean up
-               $this->deleteFileByFileName( $fileName );
+               ], null, self::$users['uploader']->getUser() );
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUploadSameFileName( $session ) {
-               $extension = 'png';
-               $mimeType = 'image/png';
-
-               try {
-                       $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 2, $extension, $this->getNewTempDirectory() );
-               } catch ( Exception $e ) {
-                       $this->markTestIncomplete( $e->getMessage() );
-               }
-
-               // we'll reuse this filename
-               /** @var array $filePaths */
-               $fileName = basename( $filePaths[0] );
-
-               // clear any other files with the same name
-               $this->deleteFileByFileName( $fileName );
+       public function testUploadSameFileName() {
+               $fileName = 'TestUploadSameFileName.jpg';
+               $mimeType = 'image/jpeg';
+               $filePaths = [
+                       $this->filePath( 'yuv420.jpg' ),
+                       $this->filePath( 'yuv444.jpg' )
+               ];
 
                // we reuse these params
                $params = [
@@ -213,176 +111,78 @@ class ApiUploadTest extends ApiUploadTestCase {
 
                // first upload .... should succeed
 
-               if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[0] ) ) {
-                       $this->markTestIncomplete( "Couldn't upload file!\n" );
-               }
-
-               $exception = false;
-               try {
-                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() );
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertTrue( isset( $result['upload'] ) );
+               $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[0] );
+               list( $result ) = $this->doApiRequestWithToken( $params, null,
+                       self::$users['uploader']->getUser() );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertFalse( $exception );
 
                // second upload with the same name (but different content)
 
-               if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[1] ) ) {
-                       $this->markTestIncomplete( "Couldn't upload file!\n" );
-               }
-
-               $exception = false;
-               try {
-                       list( $result, , ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertTrue( isset( $result['upload'] ) );
+               $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePaths[1] );
+               list( $result ) = $this->doApiRequestWithToken( $params, null,
+                       self::$users['uploader']->getUser() );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Warning', $result['upload']['result'] );
-               $this->assertTrue( isset( $result['upload']['warnings'] ) );
-               $this->assertTrue( isset( $result['upload']['warnings']['exists'] ) );
-               $this->assertFalse( $exception );
-
-               // clean up
-               $this->deleteFileByFileName( $fileName );
+               $this->assertArrayHasKey( 'warnings', $result['upload'] );
+               $this->assertArrayHasKey( 'exists', $result['upload']['warnings'] );
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUploadSameContent( $session ) {
-               $extension = 'png';
-               $mimeType = 'image/png';
-
-               try {
-                       $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, $this->getNewTempDirectory() );
-               } catch ( Exception $e ) {
-                       $this->markTestIncomplete( $e->getMessage() );
-               }
-
-               /** @var array $filePaths */
-               $fileNames[0] = basename( $filePaths[0] );
-               $fileNames[1] = "SameContentAs" . $fileNames[0];
-
-               // clear any other files with the same name or content
-               $this->deleteFileByContent( $filePaths[0] );
-               $this->deleteFileByFileName( $fileNames[0] );
-               $this->deleteFileByFileName( $fileNames[1] );
+       public function testUploadSameContent() {
+               $fileNames = [ 'TestUploadSameContent_1.jpg', 'TestUploadSameContent_2.jpg' ];
+               $mimeType = 'image/jpeg';
+               $filePath = $this->filePath( 'yuv420.jpg' );
 
                // first upload .... should succeed
-
-               $params = [
+               $this->fakeUploadFile( 'file', $fileNames[0], $mimeType, $filePath );
+               list( $result ) = $this->doApiRequestWithToken( [
                        'action' => 'upload',
                        'filename' => $fileNames[0],
                        'file' => 'dummy content',
                        'comment' => 'dummy comment',
-                       'text' => "This is the page text for " . $fileNames[0],
-               ];
-
-               if ( !$this->fakeUploadFile( 'file', $fileNames[0], $mimeType, $filePaths[0] ) ) {
-                       $this->markTestIncomplete( "Couldn't upload file!\n" );
-               }
-
-               $exception = false;
-               try {
-                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() );
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertTrue( isset( $result['upload'] ) );
+                       'text' => "This is the page text for {$fileNames[0]}",
+               ], null, self::$users['uploader']->getUser() );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertFalse( $exception );
 
                // second upload with the same content (but different name)
+               $this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePath );
+               list( $result ) = $this->doApiRequestWithToken( [
+                               'action' => 'upload',
+                               'filename' => $fileNames[1],
+                               'file' => 'dummy content',
+                               'comment' => 'dummy comment',
+                               'text' => "This is the page text for {$fileNames[1]}",
+                       ], null, self::$users['uploader']->getUser() );
 
-               if ( !$this->fakeUploadFile( 'file', $fileNames[1], $mimeType, $filePaths[0] ) ) {
-                       $this->markTestIncomplete( "Couldn't upload file!\n" );
-               }
-
-               $params = [
-                       'action' => 'upload',
-                       'filename' => $fileNames[1],
-                       'file' => 'dummy content',
-                       'comment' => 'dummy comment',
-                       'text' => "This is the page text for " . $fileNames[1],
-               ];
-
-               $exception = false;
-               try {
-                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertTrue( isset( $result['upload'] ) );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Warning', $result['upload']['result'] );
-               $this->assertTrue( isset( $result['upload']['warnings'] ) );
-               $this->assertTrue( isset( $result['upload']['warnings']['duplicate'] ) );
-               $this->assertFalse( $exception );
-
-               // clean up
-               $this->deleteFileByFileName( $fileNames[0] );
-               $this->deleteFileByFileName( $fileNames[1] );
+               $this->assertArrayHasKey( 'warnings', $result['upload'] );
+               $this->assertArrayHasKey( 'duplicate', $result['upload']['warnings'] );
+               $this->assertArrayEquals( [ $fileNames[0] ], $result['upload']['warnings']['duplicate'] );
+               $this->assertArrayNotHasKey( 'exists', $result['upload']['warnings'] );
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUploadStash( $session ) {
-               $this->setMwGlobals( [
-                       'wgUser' => self::$users['uploader']->getUser(), // @todo FIXME: still used somewhere
-               ] );
-
-               $extension = 'png';
-               $mimeType = 'image/png';
-
-               try {
-                       $randomImageGenerator = new RandomImageGenerator();
-                       $filePaths = $randomImageGenerator->writeImages( 1, $extension, $this->getNewTempDirectory() );
-               } catch ( Exception $e ) {
-                       $this->markTestIncomplete( $e->getMessage() );
-               }
-
-               /** @var array $filePaths */
-               $filePath = $filePaths[0];
-               $fileSize = filesize( $filePath );
-               $fileName = basename( $filePath );
-
-               $this->deleteFileByFileName( $fileName );
-               $this->deleteFileByContent( $filePath );
-
-               if ( !$this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath ) ) {
-                       $this->markTestIncomplete( "Couldn't upload file!\n" );
-               }
+       public function testUploadStash() {
+               $fileName = 'TestUploadStash.jpg';
+               $mimeType = 'image/jpeg';
+               $filePath = $this->filePath( 'yuv420.jpg' );
 
-               $params = [
+               $this->fakeUploadFile( 'file', $fileName, $mimeType, $filePath );
+               list( $result ) = $this->doApiRequestWithToken( [
                        'action' => 'upload',
                        'stash' => 1,
                        'filename' => $fileName,
                        'file' => 'dummy content',
                        'comment' => 'dummy comment',
                        'text' => "This is the page text for $fileName",
-               ];
+               ], null, self::$users['uploader']->getUser() );
 
-               $exception = false;
-               try {
-                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() ); // FIXME: leaks a temporary file
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertFalse( $exception );
-               $this->assertTrue( isset( $result['upload'] ) );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertEquals( $fileSize, (int)$result['upload']['imageinfo']['size'] );
+               $this->assertSame( filesize( $filePath ), (int)$result['upload']['imageinfo']['size'] );
                $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
-               $this->assertTrue( isset( $result['upload']['filekey'] ) );
+               $this->assertArrayHasKey( 'filekey', $result['upload'] );
                $this->assertEquals( $result['upload']['sessionkey'], $result['upload']['filekey'] );
                $filekey = $result['upload']['filekey'];
 
@@ -390,58 +190,28 @@ class ApiUploadTest extends ApiUploadTestCase {
                // XXX ...but how to test this, with a fake WebRequest with the session?
 
                // now we should try to release the file from stash
-               $params = [
+               $this->clearFakeUploads();
+               list( $result ) = $this->doApiRequestWithToken( [
                        'action' => 'upload',
                        'filekey' => $filekey,
                        'filename' => $fileName,
                        'comment' => 'dummy comment',
                        'text' => "This is the page text for $fileName, altered",
-               ];
-
-               $this->clearFakeUploads();
-               $exception = false;
-               try {
-                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() );
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertTrue( isset( $result['upload'] ) );
+               ], null, self::$users['uploader']->getUser() );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertFalse( $exception, "No ApiUsageException exception." );
-
-               // clean up
-               $this->deleteFileByFileName( $fileName );
        }
 
-       /**
-        * @depends testLogin
-        */
-       public function testUploadChunks( $session ) {
-               $this->setMwGlobals( [
-                       // @todo FIXME: still used somewhere
-                       'wgUser' => self::$users['uploader']->getUser(),
-               ] );
-
-               $chunkSize = 1048576;
-               // Download a large image file
-               // (using RandomImageGenerator for large files is not stable)
-               // @todo Don't download files from wikimedia.org
+       public function testUploadChunks() {
+               $fileName = 'TestUploadChunks.jpg';
                $mimeType = 'image/jpeg';
-               $url = 'http://upload.wikimedia.org/wikipedia/commons/'
-                       . 'e/ed/Oberaargletscher_from_Oberaar%2C_2010_07.JPG';
-               $filePath = $this->getNewTempDirectory() . '/Oberaargletscher_from_Oberaar.jpg';
-               try {
-                       copy( $url, $filePath );
-               } catch ( Exception $e ) {
-                       $this->markTestIncomplete( $e->getMessage() );
-               }
-
+               $filePath = $this->filePath( 'yuv420.jpg' );
                $fileSize = filesize( $filePath );
-               $fileName = basename( $filePath );
+               $chunkSize = 20 * 1024; // The file is ~60kB, use 20kB chunks
 
-               $this->deleteFileByFileName( $fileName );
-               $this->deleteFileByContent( $filePath );
+               $this->setMwGlobals( [
+                       'wgMinUploadChunkSize' => $chunkSize
+               ] );
 
                // Base upload params:
                $params = [
@@ -453,108 +223,68 @@ class ApiUploadTest extends ApiUploadTestCase {
                ];
 
                // Upload chunks
-               $chunkSessionKey = false;
-               $resultOffset = 0;
-               // Open the file:
-               Wikimedia\suppressWarnings();
                $handle = fopen( $filePath, "r" );
-               Wikimedia\restoreWarnings();
-
-               if ( $handle === false ) {
-                       $this->markTestIncomplete( "could not open file: $filePath" );
-               }
-
+               $resultOffset = 0;
+               $filekey = false;
                while ( !feof( $handle ) ) {
-                       // Get the current chunk
-                       Wikimedia\suppressWarnings();
                        $chunkData = fread( $handle, $chunkSize );
-                       Wikimedia\restoreWarnings();
 
                        // Upload the current chunk into the $_FILE object:
                        $this->fakeUploadChunk( 'chunk', 'blob', $mimeType, $chunkData );
-
-                       // Check for chunkSessionKey
-                       if ( !$chunkSessionKey ) {
-                               // Upload fist chunk ( and get the session key )
-                               try {
-                                       list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
-                                               self::$users['uploader']->getUser() );
-                               } catch ( ApiUsageException $e ) {
-                                       $this->markTestIncomplete( $e->getMessage() );
-                               }
+                       if ( !$filekey ) {
+                               list( $result ) = $this->doApiRequestWithToken( $params, null,
+                                       self::$users['uploader']->getUser() );
                                // Make sure we got a valid chunk continue:
-                               $this->assertTrue( isset( $result['upload'] ) );
-                               $this->assertTrue( isset( $result['upload']['filekey'] ) );
-                               // If we don't get a session key mark test incomplete.
-                               if ( !isset( $result['upload']['filekey'] ) ) {
-                                       $this->markTestIncomplete( "no filekey provided" );
-                               }
-                               $chunkSessionKey = $result['upload']['filekey'];
+                               $this->assertArrayHasKey( 'upload', $result );
+                               $this->assertArrayHasKey( 'filekey', $result['upload'] );
                                $this->assertEquals( 'Continue', $result['upload']['result'] );
-                               // First chunk should have chunkSize == offset
                                $this->assertEquals( $chunkSize, $result['upload']['offset'] );
+
+                               $filekey = $result['upload']['filekey'];
                                $resultOffset = $result['upload']['offset'];
-                               continue;
-                       }
-                       // Filekey set to chunk session
-                       $params['filekey'] = $chunkSessionKey;
-                       // Update the offset ( always add chunkSize for subquent chunks
-                       // should be in-sync with $result['upload']['offset'] )
-                       $params['offset'] += $chunkSize;
-                       // Make sure param offset is insync with resultOffset:
-                       $this->assertEquals( $resultOffset, $params['offset'] );
-                       // Upload current chunk
-                       try {
-                               list( $result, , $session ) = $this->doApiRequestWithToken( $params, $session,
-                                       self::$users['uploader']->getUser() );
-                       } catch ( ApiUsageException $e ) {
-                               $this->markTestIncomplete( $e->getMessage() );
-                       }
-                       // Make sure we got a valid chunk continue:
-                       $this->assertTrue( isset( $result['upload'] ) );
-                       $this->assertTrue( isset( $result['upload']['filekey'] ) );
-
-                       // Check if we were on the last chunk:
-                       if ( $params['offset'] + $chunkSize >= $fileSize ) {
-                               $this->assertEquals( 'Success', $result['upload']['result'] );
-                               break;
                        } else {
-                               $this->assertEquals( 'Continue', $result['upload']['result'] );
-                               // update $resultOffset
-                               $resultOffset = $result['upload']['offset'];
+                               // Filekey set to chunk session
+                               $params['filekey'] = $filekey;
+                               // Update the offset ( always add chunkSize for subquent chunks
+                               // should be in-sync with $result['upload']['offset'] )
+                               $params['offset'] += $chunkSize;
+                               // Make sure param offset is insync with resultOffset:
+                               $this->assertEquals( $resultOffset, $params['offset'] );
+                               // Upload current chunk
+                               list( $result ) = $this->doApiRequestWithToken( $params, null,
+                                       self::$users['uploader']->getUser() );
+                               // Make sure we got a valid chunk continue:
+                               $this->assertArrayHasKey( 'upload', $result );
+                               $this->assertArrayHasKey( 'filekey', $result['upload'] );
+
+                               // Check if we were on the last chunk:
+                               if ( $params['offset'] + $chunkSize >= $fileSize ) {
+                                       $this->assertEquals( 'Success', $result['upload']['result'] );
+                                       break;
+                               } else {
+                                       $this->assertEquals( 'Continue', $result['upload']['result'] );
+                                       $resultOffset = $result['upload']['offset'];
+                               }
                        }
                }
                fclose( $handle );
 
                // Check that we got a valid file result:
-               wfDebug( __METHOD__
-                       . " hohoh filesize {$fileSize} info {$result['upload']['imageinfo']['size']}\n\n" );
                $this->assertEquals( $fileSize, $result['upload']['imageinfo']['size'] );
                $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
-               $this->assertTrue( isset( $result['upload']['filekey'] ) );
+               $this->assertArrayHasKey( 'filekey', $result['upload'] );
                $filekey = $result['upload']['filekey'];
 
                // Now we should try to release the file from stash
-               $params = [
+               $this->clearFakeUploads();
+               list( $result ) = $this->doApiRequestWithToken( [
                        'action' => 'upload',
                        'filekey' => $filekey,
                        'filename' => $fileName,
                        'comment' => 'dummy comment',
                        'text' => "This is the page text for $fileName, altered",
-               ];
-               $this->clearFakeUploads();
-               $exception = false;
-               try {
-                       list( $result ) = $this->doApiRequestWithToken( $params, $session,
-                               self::$users['uploader']->getUser() );
-               } catch ( ApiUsageException $e ) {
-                       $exception = true;
-               }
-               $this->assertTrue( isset( $result['upload'] ) );
+               ], null, self::$users['uploader']->getUser() );
+               $this->assertArrayHasKey( 'upload', $result );
                $this->assertEquals( 'Success', $result['upload']['result'] );
-               $this->assertFalse( $exception );
-
-               // clean up
-               $this->deleteFileByFileName( $fileName );
        }
 }
index fc1930a..8c9a88f 100644 (file)
@@ -32,7 +32,7 @@ class UserDataAuthenticationRequestTest extends AuthenticationRequestTestCase {
                $req->email = $email;
                $req->realname = $realname;
                $this->assertEquals( $expect, $req->populateUser( $user ) );
-               if ( $expect->isOk() ) {
+               if ( $expect->isOK() ) {
                        $this->assertSame( $email ?: 'default@example.com', $user->getEmail() );
                        $this->assertSame( $realname ?: 'Fake Name', $user->getRealName() );
                }
index fe8cee7..428440f 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Block\BlockRestrictionStore;
 use MediaWiki\Block\CompositeBlock;
+use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\Block\Restriction\PageRestriction;
 use MediaWiki\Block\Restriction\NamespaceRestriction;
 use MediaWiki\Block\SystemBlock;
@@ -16,12 +17,12 @@ class CompositeBlockTest extends MediaWikiLangTestCase {
        private function getPartialBlocks() {
                $sysopId = $this->getTestSysop()->getUser()->getId();
 
-               $userBlock = new Block( [
+               $userBlock = new DatabaseBlock( [
                        'address' => $this->getTestUser()->getUser(),
                        'by' => $sysopId,
                        'sitewide' => false,
                ] );
-               $ipBlock = new Block( [
+               $ipBlock = new DatabaseBlock( [
                        'address' => '127.0.0.1',
                        'by' => $sysopId,
                        'sitewide' => false,
@@ -66,12 +67,12 @@ class CompositeBlockTest extends MediaWikiLangTestCase {
                return [
                        'Sitewide block and partial block' => [
                                [
-                                       new Block( [
+                                       new DatabaseBlock( [
                                                'sitewide' => false,
                                                'blockEmail' => true,
                                                'allowUsertalk' => true,
                                        ] ),
-                                       new Block( [
+                                       new DatabaseBlock( [
                                                'sitewide' => true,
                                                'blockEmail' => false,
                                                'allowUsertalk' => false,
@@ -86,7 +87,7 @@ class CompositeBlockTest extends MediaWikiLangTestCase {
                        ],
                        'Partial block and system block' => [
                                [
-                                       new Block( [
+                                       new DatabaseBlock( [
                                                'sitewide' => false,
                                                'blockEmail' => true,
                                                'allowUsertalk' => false,
@@ -104,7 +105,7 @@ class CompositeBlockTest extends MediaWikiLangTestCase {
                        ],
                        'System block and user name hiding block' => [
                                [
-                                       new Block( [
+                                       new DatabaseBlock( [
                                                'hideName' => true,
                                                'sitewide' => true,
                                                'blockEmail' => true,
@@ -123,12 +124,12 @@ class CompositeBlockTest extends MediaWikiLangTestCase {
                        ],
                        'Two lenient partial blocks' => [
                                [
-                                       new Block( [
+                                       new DatabaseBlock( [
                                                'sitewide' => false,
                                                'blockEmail' => false,
                                                'allowUsertalk' => true,
                                        ] ),
-                                       new Block( [
+                                       new DatabaseBlock( [
                                                'sitewide' => false,
                                                'blockEmail' => false,
                                                'allowUsertalk' => true,
@@ -206,40 +207,52 @@ class CompositeBlockTest extends MediaWikiLangTestCase {
         * @covers ::appliesToRight
         * @dataProvider provideTestBlockAppliesToRight
         */
-       public function testBlockAppliesToRight( $blocks, $right, $expected ) {
+       public function testBlockAppliesToRight( $applies, $expected ) {
                $this->setMwGlobals( [
                        'wgBlockDisablesLogin' => false,
                ] );
 
                $block = new CompositeBlock( [
-                       'originalBlocks' => $blocks,
+                       'originalBlocks' => [
+                               $this->getMockBlockForTestAppliesToRight( $applies[ 0 ] ),
+                               $this->getMockBlockForTestAppliesToRight( $applies[ 1 ] ),
+                       ],
                ] );
 
-               $this->assertSame( $block->appliesToRight( $right ), $expected );
+               $this->assertSame( $block->appliesToRight( 'right' ), $expected );
+       }
+
+       private function getMockBlockForTestAppliesToRight( $applies ) {
+               $mockBlock = $this->getMockBuilder( DatabaseBlock::class )
+                       ->setMethods( [ 'appliesToRight' ] )
+                       ->getMock();
+               $mockBlock->method( 'appliesToRight' )
+                       ->willReturn( $applies );
+               return $mockBlock;
        }
 
-       public static function provideTestBlockAppliesToRight() {
+       public function provideTestBlockAppliesToRight() {
                return [
-                       'Read is not blocked' => [
-                               [
-                                       new Block(),
-                                       new Block(),
-                               ],
-                               'read',
+                       'Block does not apply if no original blocks apply' => [
+                               [ false, false ],
                                false,
                        ],
-                       'Email is blocked if blocked by any blocks' => [
-                               [
-                                       new Block( [
-                                               'blockEmail' => true,
-                                       ] ),
-                                       new Block( [
-                                               'blockEmail' => false,
-                                       ] ),
-                               ],
-                               'sendemail',
+                       'Block applies if any original block applies (second block doesn\'t apply)' => [
+                               [ true, false ],
+                               true,
+                       ],
+                       'Block applies if any original block applies (second block unsure)' => [
+                               [ true, null ],
                                true,
                        ],
+                       'Block is unsure if all original blocks are unsure' => [
+                               [ null, null ],
+                               null,
+                       ],
+                       'Block is unsure if any original block is unsure, and no others apply' => [
+                               [ null, false ],
+                               null,
+                       ],
                ];
        }
 
diff --git a/tests/phpunit/includes/filerepo/LocalRepoTest.php b/tests/phpunit/includes/filerepo/LocalRepoTest.php
new file mode 100644 (file)
index 0000000..bed739b
--- /dev/null
@@ -0,0 +1,384 @@
+<?php
+
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @coversDefaultClass LocalRepo
+ * @group Database
+ */
+class LocalRepoTest extends MediaWikiIntegrationTestCase {
+       /**
+        * @param array $extraInfo To pass to LocalRepo constructor
+        */
+       private function newRepo( array $extraInfo = [] ) {
+               return new LocalRepo( $extraInfo + [
+                       'name' => 'local',
+                       'backend' => 'local-backend',
+               ] );
+       }
+
+       /**
+        * @param array $extraInfo To pass to constructor
+        * @param bool $expected
+        * @dataProvider provideHasSha1Storage
+        * @covers ::__construct
+        */
+       public function testHasSha1Storage( array $extraInfo, $expected ) {
+               $this->assertSame( $expected, $this->newRepo( $extraInfo )->hasSha1Storage() );
+       }
+
+       public static function provideHasSha1Storage() {
+               return [
+                       [ [], false ],
+                       [ [ 'storageLayout' => 'sha256' ], false ],
+                       [ [ 'storageLayout' => 'sha1' ], true ],
+               ];
+       }
+
+       /**
+        * @param string $prefix 'img' or 'oi'
+        * @param string $expectedClass 'LocalFile' or 'OldLocalFile'
+        * @dataProvider provideNewFileFromRow
+        * @covers ::newFileFromRow
+        */
+       public function testNewFileFromRow( $prefix, $expectedClass ) {
+               $this->editPage( 'File:Test_file', 'Some description' );
+
+               $row = (object)[
+                       "{$prefix}_name" => 'Test_file',
+                       // We cheat and include this for img_ too, it will be ignored
+                       "{$prefix}_archive_name" => 'Archive_name',
+                       "{$prefix}_user" => '1',
+                       "{$prefix}_timestamp" => '12345678910111',
+                       "{$prefix}_metadata" => '',
+                       "{$prefix}_sha1" => sha1( '' ),
+                       "{$prefix}_size" => '0',
+                       "{$prefix}_height" => '0',
+                       "{$prefix}_width" => '0',
+                       "{$prefix}_bits" => '0',
+                       "{$prefix}_description_text" => '',
+                       "{$prefix}_description_data" => null,
+               ];
+               $file = $this->newRepo()->newFileFromRow( $row );
+               $this->assertInstanceOf( $expectedClass, $file );
+               $this->assertSame( 'Test_file', $file->getName() );
+               $this->assertSame( 1, $file->getUser( 'id' ) );
+       }
+
+       public static function provideNewFileFromRow() {
+               return [
+                       'img' => [ 'img', LocalFile::class ],
+                       'oi' => [ 'oi', OldLocalFile::class ],
+               ];
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::newFileFromRow
+        */
+       public function testNewFileFromRow_invalid() {
+               $this->setExpectedException( 'MWException', 'LocalRepo::newFileFromRow: invalid row' );
+
+               $row = (object)[
+                       "img_user" => '1',
+                       "img_timestamp" => '12345678910111',
+                       "img_metadata" => '',
+                       "img_sha1" => sha1( '' ),
+                       "img_size" => '0',
+                       "img_height" => '0',
+                       "img_width" => '0',
+                       "img_bits" => '0',
+               ];
+               $file = $this->newRepo()->newFileFromRow( $row );
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::newFromArchiveName
+        */
+       public function testNewFromArchiveName() {
+               $this->editPage( 'File:Test_file', 'Some description' );
+
+               $file = $this->newRepo()->newFromArchiveName( 'Test_file', 'b' );
+               $this->assertInstanceOf( OldLocalFile::class, $file );
+               $this->assertSame( 'Test_file', $file->getName() );
+       }
+
+       // TODO cleanupDeletedBatch, deletedFileHasKey, hiddenFileHasKey
+
+       /**
+        * @covers ::__construct
+        * @covers ::cleanupDeletedBatch
+        */
+       public function testCleanupDeletedBatch_sha1Storage() {
+               $this->assertEquals( Status::newGood(),
+                       $this->newRepo( [ 'storageLayout' => 'sha1' ] )->cleanupDeletedBatch( [] ) );
+       }
+
+       /**
+        * @param string $input
+        * @param string $expected
+        * @dataProvider provideGetHashFromKey
+        * @covers ::getHashFromKey
+        */
+       public function testGetHashFromKey( $input, $expected ) {
+               $this->assertSame( $expected, LocalRepo::getHashFromKey( $input ) );
+       }
+
+       public static function provideGetHashFromKey() {
+               return [
+                       [ '', false ],
+                       [ '.', false ],
+                       [ 'a.', 'a' ],
+                       [ '.b', 'b' ],
+                       [ '..c', 'c' ],
+                       [ 'd.x', 'd' ],
+                       [ '.e.x', 'e' ],
+                       [ '..f.x', 'f' ],
+                       [ 'g..x', 'g' ],
+               ];
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::checkRedirect
+        */
+       public function testCheckRedirect_nonRedirect() {
+               $this->editPage( 'File:Not a redirect', 'Not a redirect' );
+               $this->assertFalse(
+                       $this->newRepo()->checkRedirect( Title::makeTitle( NS_FILE, 'Not a redirect' ) ) );
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::checkRedirect
+        * @covers ::getSharedCacheKey
+        */
+       public function testCheckRedirect_redirect() {
+               $this->editPage( 'File:Redirect', '#REDIRECT [[File:Target]]' );
+               $this->assertEquals( 'File:Target',
+                       $this->newRepo()->checkRedirect( Title::makeTitle( NS_FILE, 'Redirect' ) )
+                               ->getPrefixedText() );
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::checkRedirect
+        * @covers ::getSharedCacheKey
+        * @covers ::getLocalCacheKey
+        */
+       public function testCheckRedirect_redirect_noWANCache() {
+               $this->markTestIncomplete( 'WANObjectCache::makeKey is final' );
+
+               $mockWan = $this->getMockBuilder( WANObjectCache::class )
+                       ->setConstructorArgs( [ [ 'cache' => new EmptyBagOStuff ] ] )
+                       ->setMethods( [ 'makeKey' ] )
+                       ->getMock();
+               $mockWan->expects( $this->exactly( 2 ) )->method( 'makeKey' )->withConsecutive(
+                       [ 'image_redirect', md5( 'Redirect' ) ],
+                       [ 'filerepo', 'local', 'image_redirect', md5( 'Redirect' ) ]
+               )->will( $this->onConsecutiveCalls( false, 'somekey' ) );
+
+               $repo = $this->newRepo( [ 'wanCache' => $mockWan ] );
+
+               $this->editPage( 'File:Redirect', '#REDIRECT [[File:Target]]' );
+               $this->assertEquals( 'File:Target',
+                       $repo->checkRedirect( Title::makeTitle( NS_FILE, 'Redirect' ) )->getPrefixedText() );
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::checkRedirect
+        */
+       public function testCheckRedirect_invalidFile() {
+               $this->setExpectedException( MWException::class, '`Notafile` is not a valid file title.' );
+               $this->newRepo()->checkRedirect( Title::makeTitle( NS_MAIN, 'Notafile' ) );
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::findBySha1
+        */
+       public function testFindBySha1() {
+               $this->markTestIncomplete( "Haven't figured out how to upload files yet" );
+
+               $repo = $this->newRepo();
+
+               $tmpFileFactory = MediaWikiServices::getInstance()->getTempFSFileFactory();
+               foreach ( [ 'File1', 'File2', 'File3' ] as $name ) {
+                       $fsFile = $tmpFileFactory->newTempFSFile( '' );
+                       file_put_contents( $fsFile->getPath(), "$name contents" );
+                       $localFile = $repo->newFile( $name );
+                       $localFile->upload( $fsFile, 'Uploaded', "$name desc" );
+               }
+       }
+
+       /**
+        * @covers ::__construct
+        * @covers ::getSharedCacheKey
+        * @covers ::checkRedirect
+        * @covers ::invalidateImageRedirect
+        */
+       public function testInvalidateImageRedirect() {
+               global $wgTestMe;
+               $wgTestMe = true;
+               $repo = $this->newRepo(
+                       [ 'wanCache' => new WANObjectCache( [ 'cache' => new HashBagOStuff ] ) ] );
+
+               $title = Title::makeTitle( NS_FILE, 'Redirect' );
+
+               $this->editPage( 'File:Redirect', '#REDIRECT [[File:Target]]' );
+
+               $this->assertSame( 'File:Target',
+                       $repo->checkRedirect( $title )->getPrefixedText() );
+
+               $this->editPage( 'File:Redirect', 'No longer a redirect' );
+
+               $this->assertSame( 'File:Target',
+                       $repo->checkRedirect( $title )->getPrefixedText() );
+
+               $repo->invalidateImageRedirect( $title );
+               $repo->getMasterDB()->commit();
+
+               $this->markTestIncomplete(
+                       "Can't figure out how to get image redirect validation to take effect" );
+
+               $this->assertSame( false, $repo->checkRedirect( $title ) );
+       }
+
+       /**
+        * @covers ::getInfo
+        */
+       public function testGetInfo() {
+               $this->setMwGlobals( [
+                       'wgFavicon' => '//example.com/favicon.ico',
+                       'wgSitename' => 'Test my site',
+               ] );
+
+               $repo = $this->newRepo( [ 'favicon' => 'Hey, this option is ignored in LocalRepo!' ] );
+
+               $this->assertSame( [
+                       'name' => 'local',
+                       'displayname' => 'Test my site',
+                       'rootUrl' => false,
+                       'local' => true,
+                       'url' => false,
+                       'thumbUrl' => false,
+                       'initialCapital' => true,
+                       // XXX This assumes protocol-relative will get expanded to http instead of https
+                       'favicon' => 'http://example.com/favicon.ico',
+               ], $repo->getInfo() );
+       }
+
+       // XXX The following getInfo tests are really testing FileRepo, not LocalRepo, but we want to
+       // make sure they're true for LocalRepo too. How should we do this? A trait?
+
+       /**
+        * @covers ::getInfo
+        */
+       public function testGetInfo_name() {
+               $this->assertSame( 'some-name',
+                       $this->newRepo( [ 'name' => 'some-name' ] )->getInfo()['name'] );
+       }
+
+       /**
+        * @covers ::getInfo
+        */
+       public function testGetInfo_displayName() {
+               $this->assertSame( wfMessage( 'shared-repo' )->text(),
+                       $this->newRepo( [ 'name' => 'not-local' ] )->getInfo()['displayname'] );
+       }
+
+       /**
+        * @covers ::getInfo
+        */
+       public function testGetInfo_displayNameCustomMsg() {
+               $this->editPage( 'MediaWiki:Shared-repo-name-not-local', 'Name to display please' );
+               // Allow the message to take effect
+               MediaWikiServices::getInstance()->getMessageCache()->enable();
+
+               $this->assertSame( 'Name to display please',
+                       $this->newRepo( [ 'name' => 'not-local' ] )->getInfo()['displayname'] );
+       }
+
+       /**
+        * @covers ::getInfo
+        */
+       public function testGetInfo_rootUrl() {
+               $this->assertSame( 'https://my.url',
+                       $this->newRepo( [ 'url' => 'https://my.url' ] )->getInfo()['rootUrl'] );
+       }
+
+       /**
+        * @covers ::getInfo
+        */
+       public function testGetInfo_rootUrlCustomized() {
+               $this->assertSame(
+                       'https://my.url/some/sub/dir',
+                       $this->newRepo( [
+                               'url' => 'https://my.url',
+                               'zones' => [ 'public' => [ 'url' => 'https://my.url/some/sub/dir' ] ],
+                       ] )->getInfo()['rootUrl']
+               );
+       }
+
+       /**
+        * @covers ::getInfo
+        */
+       public function testGetInfo_local() {
+               $this->assertFalse( $this->newRepo( [ 'name' => 'not-local' ] )->getInfo()['local'] );
+       }
+
+       /**
+        * @param string $setting
+        * @dataProvider provideGetInfo_optionalSettings
+        * @covers ::getInfo
+        */
+       public function testGetInfo_optionalSettings( $setting ) {
+               $this->assertSame( 'dummy test value',
+                       $this->newRepo( [ $setting => 'dummy test value' ] )->getInfo()[$setting] );
+       }
+
+       public static function provideGetInfo_optionalSettings() {
+               return [
+                       [ 'url' ],
+                       [ 'thumbUrl' ],
+                       [ 'initialCapital' ],
+                       [ 'descBaseUrl' ],
+                       [ 'scriptDirUrl' ],
+                       [ 'articleUrl' ],
+                       [ 'fetchDescription' ],
+                       [ 'descriptionCacheExpiry' ],
+               ];
+       }
+
+       /**
+        * @param string $method
+        * @param mixed ...$args
+        * @dataProvider provideSkipWriteOperationIfSha1
+        * @covers ::store
+        * @covers ::storeBatch
+        * @covers ::cleanupBatch
+        * @covers ::publish
+        * @covers ::publishBatch
+        * @covers ::delete
+        * @covers ::deleteBatch
+        * @covers ::skipWriteOperationIfSha1
+        */
+       public function testSkipWriteOperationIfSha1( $method, ...$args ) {
+               $repo = $this->newRepo( [ 'storageLayout' => 'sha1' ] );
+               $this->assertEquals( Status::newGood(), $repo->$method( ...$args ) );
+       }
+
+       public static function provideSkipWriteOperationIfSha1() {
+               return [
+                       [ 'store', '', '', '' ],
+                       [ 'storeBatch', [ '' ] ],
+                       [ 'cleanupBatch', [ '' ] ],
+                       [ 'publish', '', '', '' ],
+                       [ 'publishBatch', [ '' ] ],
+                       [ 'delete', '', '' ],
+                       [ 'deleteBatch', [ '' ] ],
+               ];
+       }
+}
index 4afe3b5..8ddb7c9 100644 (file)
@@ -24,6 +24,32 @@ class HashRingTest extends PHPUnit\Framework\TestCase {
                }
        }
 
+       public function testHashRingSingleLocation() {
+               // SHA-1 based and weighted
+               $ring = new HashRing( [ 's1' => 1 ], 'sha1' );
+
+               $this->assertEquals(
+                       [ 's1' => 1 ],
+                       $ring->getLocationWeights(),
+                       'Normalized location weights'
+               );
+
+               for ( $i = 0; $i < 5; $i++ ) {
+                       $this->assertEquals(
+                               's1',
+                               $ring->getLocation( "hello$i" ),
+                               'Items placed at proper locations'
+                       );
+                       $this->assertEquals(
+                               [ 's1' ],
+                               $ring->getLocations( "hello$i", 2 ),
+                               'Items placed at proper locations'
+                       );
+               }
+
+               $this->assertEquals( [], $ring->getLocations( "helloX", 0 ), "Limit of 0" );
+       }
+
        public function testHashRingMapping() {
                // SHA-1 based and weighted
                $ring = new HashRing(
diff --git a/tests/phpunit/includes/libs/Message/MessageValueTest.php b/tests/phpunit/includes/libs/Message/MessageValueTest.php
new file mode 100644 (file)
index 0000000..04dfa4e
--- /dev/null
@@ -0,0 +1,219 @@
+<?php
+
+namespace Wikimedia\Tests\Message;
+
+use Wikimedia\Message\ListType;
+use Wikimedia\Message\MessageValue;
+use Wikimedia\Message\ParamType;
+use Wikimedia\Message\TextParam;
+use MediaWikiTestCase;
+
+/**
+ * @covers \Wikimedia\Message\MessageValue
+ * @covers \Wikimedia\Message\ListParam
+ * @covers \Wikimedia\Message\TextParam
+ * @covers \Wikimedia\Message\MessageParam
+ */
+class MessageValueTest extends MediaWikiTestCase {
+       public static function provideConstruct() {
+               return [
+                       [
+                               [],
+                               '<message key="key"></message>',
+                       ],
+                       [
+                               [ 'a' ],
+                               '<message key="key"><text>a</text></message>'
+                       ],
+                       [
+                               [ new TextParam( ParamType::BITRATE, 100 ) ],
+                               '<message key="key"><bitrate>100</bitrate></message>'
+                       ],
+               ];
+       }
+
+       /** @dataProvider provideConstruct */
+       public function testConstruct( $input, $expected ) {
+               $mv = new MessageValue( 'key', $input );
+               $this->assertSame( $expected, $mv->dump() );
+       }
+
+       public function testGetKey() {
+               $mv = new MessageValue( 'key' );
+               $this->assertSame( 'key', $mv->getKey() );
+       }
+
+       public function testParams() {
+               $mv = new MessageValue( 'key' );
+               $mv->params( 1, 'x' );
+               $mv2 = $mv->params( new TextParam( ParamType::BITRATE, 100 ) );
+               $this->assertSame(
+                       '<message key="key"><text>1</text><text>x</text><bitrate>100</bitrate></message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testTextParamsOfType() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->textParamsOfType( ParamType::BITRATE, 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<bitrate>1</bitrate><bitrate>2</bitrate>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testListParamsOfType() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->listParamsOfType( ListType::COMMA, [ 'a' ], [ 'b', 'c' ] );
+               $this->assertSame( '<message key="key">' .
+                       '<list listType="comma"><text>a</text></list>' .
+                       '<list listType="comma"><text>b</text><text>c</text></list>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testTextParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->textParams( 'a', 'b' );
+               $this->assertSame( '<message key="key">' .
+                       '<text>a</text>' .
+                       '<text>b</text>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testNumParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->numParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<num>1</num>' .
+                       '<num>2</num>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testLongDurationParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->longDurationParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<duration>1</duration>' .
+                       '<duration>2</duration>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testShortDurationParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->shortDurationParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<timeperiod>1</timeperiod>' .
+                       '<timeperiod>2</timeperiod>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testExpiryParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->expiryParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<expiry>1</expiry>' .
+                       '<expiry>2</expiry>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testSizeParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->sizeParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<size>1</size>' .
+                       '<size>2</size>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testBitrateParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->bitrateParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<bitrate>1</bitrate>' .
+                       '<bitrate>2</bitrate>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testRawParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->rawParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<raw>1</raw>' .
+                       '<raw>2</raw>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testPlaintextParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->plaintextParams( 1, 2 );
+               $this->assertSame( '<message key="key">' .
+                       '<plaintext>1</plaintext>' .
+                       '<plaintext>2</plaintext>' .
+                       '</message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testCommaListParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->commaListParams( [ 'a', 'b' ] );
+               $this->assertSame( '<message key="key">' .
+                       '<list listType="comma">' .
+                       '<text>a</text><text>b</text>' .
+                       '</list></message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function tesSemicolonListParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->semicolonListParams( [ 'a', 'b' ] );
+               $this->assertSame( '<message key="key">' .
+                       '<list listType="semicolon">' .
+                       '<text>a</text><text>b</text>' .
+                       '</list></message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testPipeListParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->pipeListParams( [ 'a', 'b' ] );
+               $this->assertSame( '<message key="key">' .
+                       '<list listType="pipe">' .
+                       '<text>a</text><text>b</text>' .
+                       '</list></message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+
+       public function testTextListParams() {
+               $mv = new MessageValue( 'key' );
+               $mv2 = $mv->textListParams( [ 'a', 'b' ] );
+               $this->assertSame( '<message key="key">' .
+                       '<list listType="text">' .
+                       '<text>a</text><text>b</text>' .
+                       '</list></message>',
+                       $mv->dump() );
+               $this->assertSame( $mv, $mv2 );
+       }
+}
index e881611..338a86e 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -9,12 +10,16 @@ class ContribsPagerTest extends MediaWikiTestCase {
        /** @var ContribsPager */
        private $pager;
 
+       /** @var LinkRenderer */
+       private $linkRenderer;
+
        function setUp() {
+               $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
                $context = new RequestContext();
                $this->pager = new ContribsPager( $context, [
                        'start' => '2017-01-01',
                        'end' => '2017-02-02',
-               ] );
+               ], $this->linkRenderer );
 
                parent::setUp();
        }
@@ -127,7 +132,7 @@ class ContribsPagerTest extends MediaWikiTestCase {
                $pager = new ContribsPager( new RequestContext(), [
                        'start' => '',
                        'end' => '',
-               ] );
+               ], $this->linkRenderer );
 
                /** @var ContribsPager $pager */
                $pager = TestingAccessWrapper::newFromObject( $pager );
@@ -150,7 +155,7 @@ class ContribsPagerTest extends MediaWikiTestCase {
                        'target' => '116.17.184.5/32',
                        'start' => '',
                        'end' => '',
-               ] );
+               ], $this->linkRenderer );
 
                /** @var ContribsPager $pager */
                $pager = TestingAccessWrapper::newFromObject( $pager );
index 10c6d04..2f7b40d 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use MediaWiki\MediaWikiServices;
+
 /**
  * Test class for ImageListPagerTest class.
  *
@@ -15,7 +18,8 @@ class ImageListPagerTest extends MediaWikiTestCase {
         * @covers ImageListPager::formatValue
         */
        public function testFormatValuesThrowException() {
-               $page = new ImageListPager( RequestContext::getMain() );
+               $page = new ImageListPager( RequestContext::getMain(), null, '', false, false,
+                       MediaWikiServices::getInstance()->getLinkRenderer() );
                $page->formatValue( 'invalid_field', 'invalid_value' );
        }
 }
index 642ae3e..28e7699 100644 (file)
@@ -12,7 +12,7 @@ use Wikimedia\TestingAccessWrapper;
 class SpecialWatchlistTest extends SpecialPageTestBase {
        public function setUp() {
                parent::setUp();
-
+               $this->tablesUsed = [ 'watchlist' ];
                $this->setTemporaryHook(
                        'ChangesListSpecialPageQuery',
                        null
index c0eadac..a029150 100644 (file)
@@ -12,6 +12,17 @@ use Wikimedia\TestingAccessWrapper;
  */
 class BlockListPagerTest extends MediaWikiTestCase {
 
+       /**
+        * @var LinkRenderer
+        */
+       private $linkRenderer;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
+       }
+
        /**
         * @covers ::formatValue
         * @dataProvider formatValueEmptyProvider
@@ -30,7 +41,7 @@ class BlockListPagerTest extends MediaWikiTestCase {
                $expected = $expected ?? MWTimestamp::getInstance()->format( 'H:i, j F Y' );
 
                $row = $row ?: new stdClass;
-               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager = new BlockListPager( new SpecialPage(),  [], $this->linkRenderer );
                $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
                $wrappedPager->mCurrentRow = $row;
 
@@ -118,7 +129,7 @@ class BlockListPagerTest extends MediaWikiTestCase {
                        'wgScript' => '/w/index.php',
                ] );
 
-               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager = new BlockListPager( new SpecialPage(),  [], $this->linkRenderer );
 
                $row = (object)[
                        'ipb_id' => 0,
@@ -198,7 +209,7 @@ class BlockListPagerTest extends MediaWikiTestCase {
                        'ipb_sitewide' => 1,
                        'ipb_timestamp' => $this->db->timestamp( wfTimestamp( TS_MW ) ),
                ];
-               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager = new BlockListPager( new SpecialPage(),  [], $this->linkRenderer );
                $pager->preprocessResults( [ $row ] );
 
                foreach ( $links as $link ) {
@@ -211,7 +222,7 @@ class BlockListPagerTest extends MediaWikiTestCase {
                        'by_user_name' => 'Admin',
                        'ipb_sitewide' => 1,
                ];
-               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager = new BlockListPager( new SpecialPage(),  [], $this->linkRenderer );
                $pager->preprocessResults( [ $row ] );
 
                $this->assertObjectNotHasAttribute( 'ipb_restrictions', $row );
@@ -237,7 +248,7 @@ class BlockListPagerTest extends MediaWikiTestCase {
 
                $result = $this->db->select( 'ipblocks', [ '*' ], [ 'ipb_id' => $block->getId() ] );
 
-               $pager = new BlockListPager( new SpecialPage(),  [] );
+               $pager = new BlockListPager( new SpecialPage(),  [], $this->linkRenderer );
                $pager->preprocessResults( $result );
 
                $wrappedPager = TestingAccessWrapper::newFromObject( $pager );
@@ -248,7 +259,7 @@ class BlockListPagerTest extends MediaWikiTestCase {
                $restriction = $restrictions[0];
                $this->assertEquals( $page->getId(), $restriction->getValue() );
                $this->assertEquals( $page->getId(), $restriction->getTitle()->getArticleID() );
-               $this->assertEquals( $title->getDBKey(), $restriction->getTitle()->getDBKey() );
+               $this->assertEquals( $title->getDBkey(), $restriction->getTitle()->getDBkey() );
                $this->assertEquals( $title->getNamespace(), $restriction->getTitle()->getNamespace() );
 
                // Delete the block and the restrictions.
index d340221..2784abd 100644 (file)
@@ -18,7 +18,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
        }
 
        protected function setUp() {
-               global $IP, $messageMemc, $wgMemc, $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
+               global $IP, $wgMemc, $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
                        $wgParserCacheType, $wgNamespaceAliases, $wgNamespaceProtection;
 
                $tmpDir = $this->getNewTempDirectory();
@@ -60,7 +60,6 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                $wgParserCacheType = CACHE_NONE;
                DeferredUpdates::clearPendingUpdates();
                $wgMemc = ObjectCache::getLocalClusterInstance();
-               $messageMemc = wfGetMessageCacheStorage();
 
                RequestContext::resetMain();
                $context = RequestContext::getMain();