Merge "resourceloader: Add $context to static functions in ResourceLoader"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 27 Sep 2019 20:48:15 +0000 (20:48 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 27 Sep 2019 20:48:15 +0000 (20:48 +0000)
944 files changed:
.phan/config.php
.pipeline/blubber.yaml [new file with mode: 0644]
.pipeline/config.yaml [new file with mode: 0644]
.pipeline/dev_prereq.sh [new file with mode: 0755]
.travis.yml
CODE_OF_CONDUCT.md
INSTALL
RELEASE-NOTES-1.34
autoload.php
composer.json
docs/hooks.txt
includes/AjaxResponse.php
includes/Autopromote.php
includes/CommentStore.php
includes/DefaultSettings.php
includes/DevelopmentSettings.php
includes/EditPage.php
includes/FauxRequest.php
includes/FeedUtils.php
includes/GlobalFunctions.php
includes/Html.php
includes/Linker.php
includes/MediaWiki.php
includes/MergeHistory.php
includes/MovePage.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Permissions/PermissionManager.php
includes/ProtectionForm.php
includes/Rest/BasicAccess/MWBasicAuthorizer.php
includes/Rest/BasicAccess/MWBasicRequestAuthorizer.php
includes/Rest/EntryPoint.php
includes/Rest/LocalizedHttpException.php
includes/Rest/ResponseFactory.php
includes/Rest/Router.php
includes/Rest/Validator/ParamValidatorCallbacks.php
includes/Rest/Validator/Validator.php
includes/Revision/RevisionRecord.php
includes/Revision/RevisionStore.php
includes/Revision/RevisionStoreFactory.php
includes/Revision/RevisionStoreRecord.php
includes/Revision/SlotRoleHandler.php
includes/ServiceWiring.php
includes/Setup.php
includes/Status.php
includes/Storage/DerivedPageDataUpdater.php
includes/Storage/PageEditStash.php
includes/Storage/SqlBlobStore.php
includes/StreamFile.php
includes/Title.php
includes/WebRequest.php
includes/Xml.php
includes/actions/Action.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/McrUndoAction.php
includes/actions/RawAction.php
includes/actions/RollbackAction.php
includes/actions/SpecialPageAction.php
includes/api/ApiBase.php
includes/api/ApiComparePages.php
includes/api/ApiEditPage.php
includes/api/ApiErrorFormatter.php
includes/api/ApiFormatXmlRsd.php
includes/api/ApiHelpParamValueMessage.php
includes/api/ApiImageRotate.php
includes/api/ApiMain.php
includes/api/ApiParse.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlockInfoTrait.php [new file with mode: 0644]
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiResetPassword.php
includes/api/ApiRevisionDelete.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiTag.php
includes/api/ApiUpload.php
includes/api/i18n/ar.json
includes/api/i18n/en.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/lt.json
includes/api/i18n/mk.json
includes/api/i18n/pl.json
includes/api/i18n/pt-br.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/zh-hant.json
includes/block/BlockManager.php
includes/cache/localisation/LocalisationCache.php
includes/changes/CategoryMembershipChange.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changetags/ChangeTags.php
includes/changetags/ChangeTagsLogItem.php
includes/clientpool/SquidPurgeClient.php
includes/collation/CustomUppercaseCollation.php
includes/content/ContentHandler.php
includes/db/MWLBFactory.php
includes/debug/logger/ConsoleLogger.php
includes/deferred/CdnCacheUpdate.php
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/SearchUpdate.php
includes/diff/DifferenceEngine.php
includes/exception/BadRequestError.php
includes/exception/ErrorPageError.php
includes/exception/MWExceptionHandler.php
includes/exception/PermissionsError.php
includes/exception/ThrottledError.php
includes/exception/UserNotLoggedIn.php
includes/export/Dump7ZipOutput.php
includes/export/DumpFileOutput.php
includes/export/DumpFilter.php
includes/export/DumpMultiWriter.php
includes/export/DumpOutput.php
includes/export/DumpPipeOutput.php
includes/export/WikiExporter.php
includes/externalstore/ExternalStoreDB.php
includes/filebackend/FileBackendGroup.php
includes/filerepo/FileRepo.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/LocalFileDeleteBatch.php
includes/filerepo/file/LocalFileLockError.php
includes/filerepo/file/LocalFileMoveBatch.php
includes/gallery/ImageGalleryBase.php
includes/historyblob/ConcatenatedGzipHistoryBlob.php
includes/historyblob/HistoryBlobCurStub.php
includes/historyblob/HistoryBlobStub.php
includes/htmlform/CollapsibleFieldsetLayout.php [new file with mode: 0644]
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/OOUIHTMLForm.php
includes/htmlform/fields/HTMLSelectAndOtherField.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/htmlform/fields/HTMLUserTextField.php
includes/http/HttpRequestFactory.php
includes/http/MWCallbackStream.php
includes/http/MWHttpRequest.php
includes/import/ImportStreamSource.php
includes/import/ImportStringSource.php
includes/import/WikiImporter.php
includes/import/WikiRevision.php
includes/installer/DatabaseInstaller.php
includes/installer/InstallDocFormatter.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerOptions.php
includes/installer/WebInstallerRestart.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/de.json
includes/installer/i18n/diq.json
includes/installer/i18n/ia.json
includes/installer/i18n/io.json
includes/installer/i18n/ja.json
includes/installer/i18n/nap.json
includes/installer/i18n/nb.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/ru.json
includes/installer/i18n/uk.json
includes/libs/MemoizedCallable.php
includes/libs/StringUtils.php
includes/libs/composer/ComposerInstalled.php
includes/libs/composer/ComposerJson.php
includes/libs/composer/ComposerLock.php
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/fileophandle/FileBackendStoreOpHandle.php
includes/libs/filebackend/fileophandle/SwiftFileOpHandle.php
includes/libs/lockmanager/QuorumLockManager.php
includes/libs/mime/MimeAnalyzer.php
includes/libs/mime/XmlTypeCheck.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/libs/objectcache/wancache/WANObjectCache.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/position/MySQLMasterPos.php
includes/libs/rdbms/lbfactory/LBFactoryMulti.php
includes/libs/rdbms/loadbalancer/LoadBalancerSingle.php
includes/libs/redis/RedisConnectionPool.php
includes/logging/BlockLogFormatter.php
includes/logging/ContentModelLogFormatter.php
includes/logging/DeleteLogFormatter.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/logging/LogPager.php
includes/logging/MergeLogFormatter.php
includes/logging/MoveLogFormatter.php
includes/logging/ProtectLogFormatter.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/DjVuHandler.php
includes/media/DjVuImage.php
includes/media/JpegMetadataExtractor.php
includes/objectcache/ObjectCache.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImageHistoryList.php
includes/page/ImagePage.php
includes/page/MovePageFactory.php
includes/page/PageArchive.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/PPDPart_Hash.php
includes/parser/Parser.php
includes/password/PasswordPolicyChecks.php
includes/preferences/DefaultPreferencesFactory.php
includes/profiler/SectionProfiler.php
includes/resourceloader/DerivativeResourceLoaderContext.php
includes/resourceloader/MessageBlobStore.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderCircularDependencyError.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderFilePath.php
includes/resourceloader/ResourceLoaderForeignApiModule.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLessVarFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderOOUIFileModule.php
includes/resourceloader/ResourceLoaderOOUIIconPackModule.php
includes/resourceloader/ResourceLoaderOOUIModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderSiteStylesModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserStylesModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchivedFileItem.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevDelLogList.php
includes/revisiondelete/RevDelRevisionItem.php
includes/revisiondelete/RevDelRevisionList.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/revisionlist/RevisionItem.php
includes/session/SessionManager.php
includes/session/SessionOverflowException.php [new file with mode: 0644]
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteImporter.php
includes/skins/BaseTemplate.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/QueryPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialApiSandbox.php
includes/specials/SpecialAutoblockList.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialConfirmEmail.php
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialEmailUser.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListFiles.php
includes/specials/SpecialLog.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialMyLanguage.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialRecentChanges.php
includes/specials/SpecialRecentChangesLinked.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialRevisionDelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatLinksHere.php
includes/specials/forms/PreferencesFormOOUI.php
includes/specials/forms/UploadForm.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/AllMessagesTablePager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/specials/pagers/MergeHistoryPager.php
includes/specials/pagers/NewFilesPager.php
includes/specials/pagers/ProtectedPagesPager.php
includes/specials/pagers/ProtectedTitlesPager.php
includes/specials/pagers/UsersPager.php
includes/title/MediaWikiTitleCodec.php
includes/upload/UploadBase.php
includes/upload/UploadFromUrl.php
includes/user/LocalIdLookup.php
includes/user/PasswordReset.php
includes/user/User.php
includes/user/UserNamePrefixSearch.php
includes/utils/AvroValidator.php
includes/watcheditem/WatchedItemQueryService.php
includes/widget/CheckMatrixWidget.php
includes/widget/ComplexTitleInputWidget.php
includes/widget/NamespaceInputWidget.php
includes/widget/SelectWithInputWidget.php
includes/widget/SizeFilterWidget.php
includes/widget/TagMultiselectWidget.php
jsduck.json
languages/LanguageConverter.php
languages/data/Names.php
languages/data/ZhConversion.php
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/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/ase.json
languages/i18n/ast.json
languages/i18n/atj.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/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/cu.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de-formal.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/dty.json
languages/i18n/ee.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en-gb.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/exif/af.json
languages/i18n/exif/cs.json
languages/i18n/exif/nap.json
languages/i18n/exif/nb.json
languages/i18n/exif/nds-nl.json
languages/i18n/exif/pl.json
languages/i18n/exif/sr-ec.json
languages/i18n/exif/tt-cyrl.json
languages/i18n/exif/zh-hans.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fit.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gag.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gcr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/glk.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/got.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/ha.json
languages/i18n/hak.json
languages/i18n/haw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/ht.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/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/krl.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kum.json
languages/i18n/kw.json
languages/i18n/ky.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lki.json
languages/i18n/lmo.json
languages/i18n/lo.json
languages/i18n/loz.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/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/mzn.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl-informal.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/olo.json
languages/i18n/or.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pag.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/udm.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
languages/i18n/zh-hk.json
maintenance/Doxyfile
maintenance/Maintenance.php
maintenance/addChangeTag.php
maintenance/archives/patch-archive-ar_comment_id.sql [new file with mode: 0644]
maintenance/archives/patch-comment-table.sql
maintenance/archives/patch-drop-archive-ar_usertext_timestamp.sql [new file with mode: 0644]
maintenance/archives/patch-drop-archive-usertext_timestamp.sql [new file with mode: 0644]
maintenance/archives/patch-drop-user-fields.sql
maintenance/archives/patch-filearchive-fa_description_id.sql [new file with mode: 0644]
maintenance/archives/patch-image-img_description-default.sql [new file with mode: 0644]
maintenance/archives/patch-image_comment_temp-table.sql [new file with mode: 0644]
maintenance/archives/patch-ipblocks-ipb_reason_id.sql [new file with mode: 0644]
maintenance/archives/patch-logging-log_comment_id.sql [new file with mode: 0644]
maintenance/archives/patch-oldimage-oi_description_id.sql [new file with mode: 0644]
maintenance/archives/patch-protected_titles-pt_reason_id.sql [new file with mode: 0644]
maintenance/archives/patch-recentchanges-rc_comment_id.sql [new file with mode: 0644]
maintenance/archives/patch-rename-mysql-user_newtalk-indexes.sql [new file with mode: 0644]
maintenance/archives/patch-revision-rev_comment-default.sql [new file with mode: 0644]
maintenance/archives/patch-revision_comment_temp-table.sql [new file with mode: 0644]
maintenance/archives/upgradeLogging.php
maintenance/changePassword.php
maintenance/cleanupCaps.php
maintenance/cleanupRevActorPage.php [new file with mode: 0644]
maintenance/cleanupSpam.php
maintenance/cleanupTable.inc
maintenance/copyFileBackend.php
maintenance/createAndPromote.php
maintenance/edit.php
maintenance/findDeprecated.php
maintenance/getText.php
maintenance/importDump.php
maintenance/importImages.php
maintenance/install.php
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simp2trad_noconvert.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/mediawiki.Title/generatePhpCharToUpperMappings.php
maintenance/migrateArchiveText.php
maintenance/moveBatch.php
maintenance/mwdocgen.php
maintenance/populateRevisionLength.php
maintenance/postgres/archives/patch-comment-table.sql
maintenance/postgres/archives/patch-image_comment_temp-table.sql [new file with mode: 0644]
maintenance/postgres/archives/patch-revision_comment_temp-table.sql [new file with mode: 0644]
maintenance/preprocessDump.php
maintenance/purgeList.php
maintenance/refreshFileHeaders.php
maintenance/refreshLinks.php
maintenance/sqlite/archives/patch-archive-ar_comment_id.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-comment-table.sql [deleted file]
maintenance/sqlite/archives/patch-image-img_description-default.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-ipblocks-ipb_reason_id.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-logging-log_comment_id.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-oldimage-oi_description_id.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-protected_titles-pt_reason_id.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-recentchanges-rc_comment_id.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-revision-rev_comment-default.sql [new file with mode: 0644]
maintenance/storage/blobs.sql
maintenance/storage/checkStorage.php
maintenance/storage/compressOld.php
maintenance/storage/fixT22757.php [deleted file]
maintenance/storage/recompressTracked.php
maintenance/updateSpecialPages.php
maintenance/userDupes.inc
maintenance/userOptions.php
mw-config/config.css
resources/Resources.php
resources/lib/foreign-resources.yaml
resources/lib/ooui/History.md
resources/lib/ooui/i18n/fr.json
resources/lib/ooui/i18n/pl.json
resources/lib/ooui/oojs-ui-apex.js
resources/lib/ooui/oojs-ui-core-apex.css
resources/lib/ooui/oojs-ui-core-wikimediaui.css
resources/lib/ooui/oojs-ui-core.js
resources/lib/ooui/oojs-ui-toolbars-apex.css
resources/lib/ooui/oojs-ui-toolbars-wikimediaui.css
resources/lib/ooui/oojs-ui-toolbars.js
resources/lib/ooui/oojs-ui-widgets-apex.css
resources/lib/ooui/oojs-ui-widgets-wikimediaui.css
resources/lib/ooui/oojs-ui-widgets.js
resources/lib/ooui/oojs-ui-wikimediaui.js
resources/lib/ooui/oojs-ui-windows-apex.css
resources/lib/ooui/oojs-ui-windows-wikimediaui.css
resources/lib/ooui/oojs-ui-windows.js
resources/lib/ooui/themes/apex/icons-editing-advanced.json
resources/lib/ooui/themes/apex/icons-user.json
resources/lib/ooui/themes/wikimediaui/icons-editing-advanced.json
resources/lib/ooui/themes/wikimediaui/icons-user.json
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/beaker.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-invert.svg
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline-progressive.svg
resources/lib/ooui/themes/wikimediaui/images/icons/userAvatarOutline.svg
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.svg [new file with mode: 0644]
resources/src/jquery.color/jquery.color.js [new file with mode: 0644]
resources/src/jquery.color/jquery.colorUtil.js [new file with mode: 0644]
resources/src/jquery/jquery.checkboxShiftClick.js [deleted file]
resources/src/jquery/jquery.color.js [deleted file]
resources/src/jquery/jquery.colorUtil.js [deleted file]
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.makeCollapsible.styles.less
resources/src/mediawiki.ForeignApi.core.js
resources/src/mediawiki.Title/Title.js
resources/src/mediawiki.Title/phpCharToUpper.json
resources/src/mediawiki.base/mediawiki.errorLogger.js
resources/src/mediawiki.htmlform.checker.js
resources/src/mediawiki.htmlform.ooui.styles.less
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.page.gallery.slideshow.js
resources/src/mediawiki.page.image.pagination.js
resources/src/mediawiki.page.ready.js [deleted file]
resources/src/mediawiki.page.ready/.eslintrc.json [new file with mode: 0644]
resources/src/mediawiki.page.ready/checkboxShift.js [new file with mode: 0644]
resources/src/mediawiki.page.ready/ready.js [new file with mode: 0644]
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.WatchlistTopSectionWidget.less
resources/src/mediawiki.special.recentchanges.js
resources/src/mediawiki.special/contributions.less [new file with mode: 0644]
resources/src/mediawiki.special/listFiles.less [new file with mode: 0644]
resources/src/mediawiki.special/special.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.util/util.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/startup/mediawiki.js
resources/src/startup/mediawiki.requestIdleCallback.js
tests/common/TestsAutoLoader.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiCoversValidator.php
tests/phpunit/MediaWikiIntegrationTestCase.php
tests/phpunit/MediaWikiTestCaseTrait.php
tests/phpunit/data/media/jpeg-xmp-nullchar.jpg [new file with mode: 0644]
tests/phpunit/includes/CommentStoreTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Rest/BasicAccess/MWBasicRequestAuthorizerTest.php
tests/phpunit/includes/Rest/EntryPointTest.php
tests/phpunit/includes/Revision/McrRevisionStoreDbTest.php
tests/phpunit/includes/Revision/NoContentModelRevisionStoreDbTest.php [deleted file]
tests/phpunit/includes/Revision/PreMcrRevisionStoreDbTest.php [deleted file]
tests/phpunit/includes/Revision/PreMcrSchemaOverride.php [deleted file]
tests/phpunit/includes/Revision/RenderedRevisionTest.php
tests/phpunit/includes/Revision/RevisionQueryInfoTest.php
tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php
tests/phpunit/includes/Revision/RevisionStoreFactoryTest.php
tests/phpunit/includes/Revision/RevisionStoreTest.php
tests/phpunit/includes/RevisionNoContentModelDbTest.php [deleted file]
tests/phpunit/includes/RevisionPreMcrDbTest.php [deleted file]
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SiteStatsTest.php
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiPageSetTest.php
tests/phpunit/includes/api/ApiQueryBlockInfoTraitTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiQuerySiteinfoTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php
tests/phpunit/includes/api/ApiRevisionDeleteTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/block/BlockManagerTest.php
tests/phpunit/includes/block/BlockRestrictionStoreTest.php
tests/phpunit/includes/block/DatabaseBlockTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
tests/phpunit/includes/changes/EnhancedChangesListTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/UnknownContentHandlerTest.php
tests/phpunit/includes/content/UnknownContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/context/RequestContextTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/deferred/SiteStatsUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/includes/filerepo/file/LocalFileTest.php
tests/phpunit/includes/http/GuzzleHttpRequestTest.php
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/jobqueue/jobs/ClearUserWatchlistJobTest.php
tests/phpunit/includes/libs/ProcessCacheLRUTest.php
tests/phpunit/includes/libs/StringUtilsTest.php
tests/phpunit/includes/libs/TimingTest.php
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseMysqlBaseTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/logging/ProtectLogFormatterTest.php
tests/phpunit/includes/media/JpegMetadataExtractorTest.php
tests/phpunit/includes/media/JpegPixelFormatTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/page/PageArchivePreMcrTest.php [deleted file]
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/page/WikiPageNoContentModelDbTest.php [deleted file]
tests/phpunit/includes/page/WikiPagePreMcrDbTest.php [deleted file]
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php [deleted file]
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchNearMatchResultSetTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/shell/ShellTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/site/DBSiteStoreTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/specials/SpecialBlankPageTest.php
tests/phpunit/includes/specials/SpecialPageDataTest.php
tests/phpunit/includes/user/LocalIdLookupTest.php
tests/phpunit/includes/user/PasswordResetTest.php
tests/phpunit/includes/user/UserGroupMembershipTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/watcheditem/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/integration/includes/db/DatabaseSqliteTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MWDoxygenFilterTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/unit/includes/Rest/Handler/HelloHandlerTest.php
tests/phpunit/unit/includes/Rest/ResponseFactoryTest.php
tests/phpunit/unit/includes/Rest/RouterTest.php
tests/phpunit/unit/includes/diff/DiffOpTest.php
tests/phpunit/unit/includes/password/PasswordFactoryTest.php
tests/phpunit/unit/includes/resourceloader/ResourceLoaderImageTest.php [new file with mode: 0644]
tests/phpunit/unit/includes/search/SearchSuggestionSetTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/selenium/wdio-mediawiki/Api.js
tests/selenium/wdio-mediawiki/CHANGELOG.md
tests/selenium/wdio-mediawiki/README.md
tests/selenium/wdio-mediawiki/package.json
tests/selenium/wdio.conf.js
thumb.php

index fc775fe..0fdefe0 100644 (file)
@@ -101,11 +101,6 @@ $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
        //after dropping HHVM
        // approximate error count: 110
        "PhanParamTooMany", // False positives with variargs. Unsuppress after dropping HHVM
-
-       // approximate error count: 45
-       "PhanTypeMismatchArgument",
-       // approximate error count: 693
-       "PhanUndeclaredProperty",
 ] );
 
 // This helps a lot in discovering bad code, but unfortunately it will always fail for
@@ -113,6 +108,10 @@ $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
 // @todo Enable when the issue above is resolved and we update our config!
 $cfg['redundant_condition_detection'] = false;
 
+// Do not use aliases in core.
+// Use the correct name, because we don't need backward compatibility
+$cfg['enable_class_alias_support'] = false;
+
 $cfg['ignore_undeclared_variables_in_global_scope'] = true;
 // @todo It'd be great if we could just make phan read these from DefaultSettings, to avoid
 // duplicating the types.
diff --git a/.pipeline/blubber.yaml b/.pipeline/blubber.yaml
new file mode 100644 (file)
index 0000000..13ad966
--- /dev/null
@@ -0,0 +1,14 @@
+version: v4
+base: docker-registry.wikimedia.org/dev/stretch-php72-fpm-apache2
+
+lives:
+  in: /var/www/html
+
+variants:
+  dev:
+    runs:
+      insecurely: true
+    builder:
+      command: [.pipeline/dev_prereq.sh]
+      requirements: [.pipeline, .pipeline/dev_prereq.sh, composer.json]
+    copies: [local]
diff --git a/.pipeline/config.yaml b/.pipeline/config.yaml
new file mode 100644 (file)
index 0000000..08f1db8
--- /dev/null
@@ -0,0 +1,9 @@
+pipelines:
+  publish:
+    blubberfile: blubber.yaml
+    stages:
+      - name: dev
+        build: dev
+        publish:
+          image: true
+          tags: [dev]
diff --git a/.pipeline/dev_prereq.sh b/.pipeline/dev_prereq.sh
new file mode 100755 (executable)
index 0000000..a1f4bd0
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+mkdir /tmp/php
+mkdir -p extensions
+
+git clone --depth 1 https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor.git /var/www/html/extensions/VisualEditor
+git clone --depth 1 https://gerrit.wikimedia.org/r/mediawiki/skins/Vector /var/www/html/skins/Vector
+cd /var/www/html/extensions/VisualEditor
+git submodule update --depth 1 --init
+
+cd /var/www/html
+composer install
+cat <<PHP > LocalSettings.php
+<?php
+require_once '/var/config/LocalSettings.php';
+PHP
index d5607f1..8dbc5f2 100644 (file)
@@ -26,8 +26,6 @@ matrix:
   include:
     - php: 7.3
     - php: 7.2
-    - php: 7.1
-    - php: 7
 
 services:
   - mysql
index 498acf7..3d9f26a 100644 (file)
@@ -1 +1,4 @@
+Code of Conduct
+===============
+
 The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct).
diff --git a/INSTALL b/INSTALL
index 07dd9c3..0359166 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -7,7 +7,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 
 Required software as of MediaWiki 1.34.0:
 
-* Web server with PHP 7.0.13 or higher, plus the following extesnsions:
+* Web server with PHP 7.2.0 or higher, plus the following extesnsions:
 ** ctype
 ** dom
 ** fileinfo
index 2cebf99..0d6f1e1 100644 (file)
@@ -126,6 +126,9 @@ $wgPasswordPolicy['policies']['default']['PasswordNotInLargeBlacklist'] = false;
 * (T222388) API modules can now be specified as an ObjectFactory spec,
   allowing the construction of modules that require services to be injected
   in their constructor.
+* (T117736) The function signature of SpecialContributions::getForm::filters
+  has changed. It now expects definitions of additional filter fields as array
+  rather than string.
 
 === External library changes in 1.34 ===
 
@@ -141,12 +144,13 @@ $wgPasswordPolicy['policies']['default']['PasswordNotInLargeBlacklist'] = false;
 * Updated mediawiki/codesniffer from 25.0.0 to 26.0.0 (dev-only).
 * Updated cssjanus/cssjanus from 1.2.1 to 1.3.0.
 * Updated wikimedia/at-ease from 1.2.0 to 2.0.0.
-* Updated wikimedia/remex-html from 2.0.1 to 2.0.3.
+* Updated wikimedia/remex-html from 2.0.1 to 2.1.0.
 * Updated monolog/monolog from 1.22.1 to 1.24.0 (dev-only).
 * Updated wikimedia/object-factory from 1.0.0 to 2.1.0.
 * Updated wikimedia/timestamp from 2.2.0 to 3.0.0.
 * Updated wikimedia/xmp-reader from 0.6.2 to 0.6.3.
 * Updated mediawiki/mediawiki-phan-config from 0.6.0 to 0.6.1 (dev-only).
+* Updated wikimedia/avro from 1.8.0 to 1.9.0 (dev-only).
 * …
 
 ==== Removed external libraries ====
@@ -162,8 +166,23 @@ $wgPasswordPolicy['policies']['default']['PasswordNotInLargeBlacklist'] = false;
 === Action API changes in 1.34 ===
 * The 'recenteditcount' response property from action=query list=allusers,
   deprecated in 1.25, has been removed.
-* (T60993) action=query list=filearchive no longer requires the 'deletedhistory'
-  user right.
+* (T60993) action=query list=filearchive, list=alldeletedrevisions and
+  prop=deletedrevisions no longer require the 'deletedhistory' user right.
+* In the response to queries that use 'prop=imageinfo', entries for
+  non-existing files (indicated by the 'filemissing' field) now omit the
+  following fields, since they are meaningless in this context:
+  'timestamp', 'userhidden', 'user', 'userid', 'anon', 'size', 'width',
+  'height', 'pagecount', 'duration', 'commenthidden', 'parsedcomment',
+  'comment', 'thumburl', 'thumbwidth', 'thumbheight', 'thumbmime',
+  'thumberror', 'url', 'sha1', 'metadata', 'extmetadata', 'commonmetadata',
+  'mime', 'mediadtype', 'bitdepth'.
+  Clients that process these fields should first check if 'filemissing' is
+  set. Fields that are supported even if the file is missing include:
+  'canonicaltitle', ''archivename' (deleted files only), 'descriptionurl',
+  'descriptionshorturl'.
+* The 'blockexpiry' result property in list=users and list=allusers will now be
+  returned in the same format used by the rest of the API: ISO 8601 for
+  expiring blocks, and "infinite" for non-expiring blocks.
 
 === Action API internal changes in 1.34 ===
 * The exception thrown in ApiModuleManager::getModule has been changed
@@ -171,7 +190,7 @@ $wgPasswordPolicy['policies']['default']['PasswordNotInLargeBlacklist'] = false;
   ApiModuleManager::getModule now also throws InvalidArgumentExceptions when
   ObjectFactory is presented with an invalid spec or incorrectly constructed
   objects.
-* 
+* Added ApiQueryBlockInfoTrait.
 
 === Languages updated in 1.34 ===
 MediaWiki supports over 350 languages. Many localisations are updated regularly.
@@ -302,6 +321,11 @@ because of Phabricator reports.
   Use the mediawiki.String module instead.
 * mw.language.specialCharacters, deprecated in 1.33, has been removed.
   Use require( 'mediawiki.language.specialCharacters' ) instead.
+* The jquery.colorUtil module was removed. Use jquery.color instead.
+* The jquery.checkboxShiftClick module was removed. The functionality
+  is provided by mediawiki.page.ready instead (T232688).
+* The 'jquery.accessKeyLabel' module has been removed. This jQuery
+  plugin now ships as part of the 'mediawiki.util' module bundle.
 * EditPage::submit(), deprecated in 1.29, has been removed. Use $this->edit()
   directly.
 * HTMLForm::getErrors(), deprecated in 1.28, has been removed. Use
@@ -428,6 +452,9 @@ because of Phabricator reports.
   * Revision::selectTextFields()
   * Revision::selectPageFields()
   * Revision::selectUserFields()
+* User::setNewpassword(), deprecated in 1.27 has been removed.
+* The ObjectCache::getMainWANInstance and ObjectCache::getMainStashInstance
+  functions, deprecated since 1.28, have been removed.
 
 === Deprecations in 1.34 ===
 * The MWNamespace class is deprecated. Use NamespaceInfo.
@@ -483,8 +510,6 @@ because of Phabricator reports.
 * ResourceLoaderContext::getConfig and ResourceLoaderContext::getLogger have
   been deprecated. Inside ResourceLoaderModule subclasses, use the local methods
   instead. Elsewhere, use the methods from the ResourceLoader class.
-* The 'jquery.accessKeyLabel' module has been deprecated. This jQuery
-  plugin is now ships as part of the 'mediawiki.util' module bundle.
 * The Profiler::setTemplated and Profiler::getTemplated methods have been
   deprecated. Use Profiler::setAllowOutput and Profiler::getAllowOutput
   instead.
@@ -551,6 +576,8 @@ because of Phabricator reports.
 * Specifying a SpecialPage object for the list of special pages (either through
   the SpecialPage_initList hook or by adding to $wgSpecialPages) is now
   deprecated.
+* WebInstaller::getInfoBox(), getWarningBox() and getErrorBox() are deprecated.
+  Use Html::errorBox() or Html::warningBox() instead.
 * Use of ActorMigration with 'ar_user', 'img_user', 'oi_user', 'fa_user',
   'rc_user', 'log_user', and 'ipb_by' is deprecated. Queries should be adjusted
   to use the corresponding actor fields directly. Note that use with
@@ -560,13 +587,24 @@ because of Phabricator reports.
   be used instead.
 * The UserIsHidden hook is deprecated. Use GetUserBlock instead, and add a
   system block that hides the user.
+* The GetBlockedStatus hook is deprecated. Use GetUserBlock instead, to add or
+  remove a block.
+* $wgContentHandlerUseDB is deprecated and should always be true.
+* StreamFile::send404Message() and StreamFile::parseRange() are now deprecated.
+  Use HTTPFileStreamer::send404Message() and HTTPFileStreamer::parseRange()
+  respectively instead.
+* Global variable $wgSysopEmailBans is deprecated; to allow sysops to ban
+  users from sending emails, use
+  $wgGroupPermissions['sysop']['blockemail'] = true;
+* ApiQueryBase::showHiddenUsersAddBlockInfo() is deprecated. Use
+  ApiQueryBlockInfoTrait instead.
 
 === Other changes in 1.34 ===
 * …
 
 == 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
+MediaWiki 1.34 requires PHP 7.2.0 or later. Although HHVM 3.18.5 or later is
+supported, it is generally advised to use PHP 7.2.0 or later for long term
 support. It also requires the following PHP extensions:
 
 * ctype
index f95e001..dc57ff6 100644 (file)
@@ -89,6 +89,7 @@ $wgAutoloadLocalClasses = [
        'ApiQueryBacklinks' => __DIR__ . '/includes/api/ApiQueryBacklinks.php',
        'ApiQueryBacklinksprop' => __DIR__ . '/includes/api/ApiQueryBacklinksprop.php',
        'ApiQueryBase' => __DIR__ . '/includes/api/ApiQueryBase.php',
+       'ApiQueryBlockInfoTrait' => __DIR__ . '/includes/api/ApiQueryBlockInfoTrait.php',
        'ApiQueryBlocks' => __DIR__ . '/includes/api/ApiQueryBlocks.php',
        'ApiQueryCategories' => __DIR__ . '/includes/api/ApiQueryCategories.php',
        'ApiQueryCategoryInfo' => __DIR__ . '/includes/api/ApiQueryCategoryInfo.php',
@@ -272,6 +273,7 @@ $wgAutoloadLocalClasses = [
        'CleanupInvalidDbKeys' => __DIR__ . '/maintenance/cleanupInvalidDbKeys.php',
        'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php',
        'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php',
+       'CleanupRevActorPage' => __DIR__ . '/maintenance/cleanupRevActorPage.php',
        'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php',
        'CleanupUploadStash' => __DIR__ . '/maintenance/cleanupUploadStash.php',
        'CleanupUsersWithNoId' => __DIR__ . '/maintenance/cleanupUsersWithNoId.php',
@@ -283,6 +285,7 @@ $wgAutoloadLocalClasses = [
        'CloneDatabase' => __DIR__ . '/includes/db/CloneDatabase.php',
        'CodeCleanerGlobalsPass' => __DIR__ . '/maintenance/CodeCleanerGlobalsPass.inc',
        'CodeContentHandler' => __DIR__ . '/includes/content/CodeContentHandler.php',
+       'CollapsibleFieldsetLayout' => __DIR__ . '/includes/htmlform/CollapsibleFieldsetLayout.php',
        'Collation' => __DIR__ . '/includes/collation/Collation.php',
        'CollationCkb' => __DIR__ . '/includes/collation/CollationCkb.php',
        'CommandLineInc' => __DIR__ . '/maintenance/commandLine.inc',
@@ -529,7 +532,6 @@ $wgAutoloadLocalClasses = [
        'FixDefaultJsonContentPages' => __DIR__ . '/maintenance/fixDefaultJsonContentPages.php',
        'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
        'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
-       'FixT22757' => __DIR__ . '/maintenance/storage/fixT22757.php',
        'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
        'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
        'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
index c1f9037..bd34b92 100644 (file)
@@ -28,7 +28,7 @@
                "ext-xml": "*",
                "guzzlehttp/guzzle": "6.3.3",
                "liuggio/statsd-php-client": "1.0.18",
-               "oojs/oojs-ui": "0.34.0",
+               "oojs/oojs-ui": "0.34.1",
                "pear/mail": "1.4.1",
                "pear/mail_mime": "1.10.2",
                "pear/net_smtp": "1.8.1",
@@ -49,7 +49,7 @@
                "wikimedia/php-session-serializer": "1.0.7",
                "wikimedia/purtle": "1.0.7",
                "wikimedia/relpath": "2.1.1",
-               "wikimedia/remex-html": "2.0.3",
+               "wikimedia/remex-html": "2.1.0",
                "wikimedia/running-stat": "1.2.1",
                "wikimedia/scoped-callback": "3.0.0",
                "wikimedia/utfnormal": "2.0.0",
@@ -74,7 +74,7 @@
                "nmred/kafka-php": "0.1.5",
                "phpunit/phpunit": "4.8.36 || ^6.5",
                "psy/psysh": "0.9.9",
-               "wikimedia/avro": "1.8.0",
+               "wikimedia/avro": "1.9.0",
                "wikimedia/testing-access-wrapper": "~1.0",
                "wmde/hamcrest-html-matchers": "^0.1.0",
                "mediawiki/mediawiki-phan-config": "0.7.1",
index 43234c6..4261b0b 100644 (file)
@@ -1585,7 +1585,8 @@ entitled to be in.
 $user: user to promote.
 &$promote: groups that will be added.
 
-'GetBlockedStatus': after loading blocking status of an user from the database
+'GetBlockedStatus': DEPRECATED since 1.34 - use GetUserBlock instead. After
+loading blocking status of a user from the database
 &$user: user (object) being checked
 
 'GetCacheVaryCookies': Get cookies that should vary cache options.
@@ -2920,7 +2921,7 @@ result augmentors.
 Note that lists should be in the format name => object and the names in both
   lists should be distinct.
 
-'SecondaryDataUpdates': DEPRECATED! Use RevisionDataUpdates or override
+'SecondaryDataUpdates': DEPRECATED since 1.32! Use RevisionDataUpdates or override
 ContentHandler::getSecondaryDataUpdates instead.
 Allows modification of the list of DataUpdates to perform when page content is modified.
 $title: Title of the page that is being edited.
@@ -3176,7 +3177,7 @@ $row: Revision information from the database
 'SpecialContributions::getForm::filters': Called with a list of filters to render
 on Special:Contributions.
 $sp: SpecialContributions object, for context
-&$filters: List of filters rendered as HTML
+&$filters: List of filter object definitions (compatible with OOUI form)
 
 'SpecialListusersDefaultQuery': Called right before the end of
 UsersPager::getDefaultQuery().
@@ -3968,7 +3969,7 @@ dumps. One, and only one hook should set this, and return false.
 &$opts: Options to use for the query
 &$join: Join conditions
 
-'WikiPageDeletionUpdates': DEPRECATED! Use PageDeletionDataUpdates or
+'WikiPageDeletionUpdates': DEPRECATED since 1.32! Use PageDeletionDataUpdates or
 override ContentHandler::getDeletionDataUpdates instead.
 Manipulates the list of DeferrableUpdates to be applied when a page is deleted.
 $page: the WikiPage
index 0664652..faff021 100644 (file)
@@ -55,7 +55,7 @@ class AjaxResponse {
 
        /**
         * HTTP response code
-        * @var string $mResponseCode
+        * @var int|string $mResponseCode
         */
        private $mResponseCode;
 
@@ -114,7 +114,7 @@ class AjaxResponse {
 
        /**
         * Set the HTTP response code
-        * @param string $code
+        * @param int|string $code
         */
        function setResponseCode( $code ) {
                $this->mResponseCode = $code;
index 2156787..f8f3c24 100644 (file)
@@ -187,10 +187,10 @@ class Autopromote {
                                }
                                return $user->getEditCount() >= $reqEditCount;
                        case APCOND_AGE:
-                               $age = time() - wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
+                               $age = time() - (int)wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
                                return $age >= $cond[1];
                        case APCOND_AGE_FROM_EDIT:
-                               $age = time() - wfTimestampOrNull( TS_UNIX, $user->getFirstEditTimestamp() );
+                               $age = time() - (int)wfTimestampOrNull( TS_UNIX, $user->getFirstEditTimestamp() );
                                return $age >= $cond[1];
                        case APCOND_INGROUPS:
                                $groups = array_slice( $cond, 1 );
index 994a064..9054e7a 100644 (file)
@@ -83,7 +83,8 @@ class CommentStore {
        protected $key = null;
 
        /**
-        * @var int One of the MIGRATION_* constants
+        * @var int One of the MIGRATION_* constants, or an appropriate combination
+        *  of SCHEMA_COMPAT_* constants.
         * @todo Deprecate and remove once extensions seem unlikely to need to use
         *  it for migration anymore.
         */
@@ -98,11 +99,19 @@ class CommentStore {
        /**
         * @param Language $lang Language to use for comment truncation. Defaults
         *  to content language.
-        * @param int $migrationStage One of the MIGRATION_* constants. Always
-        *  MIGRATION_NEW for MediaWiki core since 1.33.
+        * @param int $stage One of the MIGRATION_* constants, or an appropriate
+        *  combination of SCHEMA_COMPAT_* constants. Always MIGRATION_NEW for
+        *  MediaWiki core since 1.33.
         */
-       public function __construct( Language $lang, $migrationStage ) {
-               $this->stage = $migrationStage;
+       public function __construct( Language $lang, $stage ) {
+               if ( ( $stage & SCHEMA_COMPAT_WRITE_BOTH ) === 0 ) {
+                       throw new InvalidArgumentException( '$stage must include a write mode' );
+               }
+               if ( ( $stage & SCHEMA_COMPAT_READ_BOTH ) === 0 ) {
+                       throw new InvalidArgumentException( '$stage must include a read mode' );
+               }
+
+               $this->stage = $stage;
                $this->lang = $lang;
        }
 
@@ -166,21 +175,21 @@ class CommentStore {
        public function getFields( $key = null ) {
                $key = $this->getKey( $key );
                $fields = [];
-               if ( $this->stage === MIGRATION_OLD ) {
+               if ( ( $this->stage & SCHEMA_COMPAT_READ_BOTH ) === SCHEMA_COMPAT_READ_OLD ) {
                        $fields["{$key}_text"] = $key;
                        $fields["{$key}_data"] = 'NULL';
                        $fields["{$key}_cid"] = 'NULL';
-               } else {
-                       if ( $this->stage < MIGRATION_NEW ) {
+               } else { // READ_BOTH or READ_NEW
+                       if ( $this->stage & SCHEMA_COMPAT_READ_OLD ) {
                                $fields["{$key}_old"] = $key;
                        }
 
                        $tempTableStage = isset( $this->tempTables[$key] )
                                ? $this->tempTables[$key]['stage'] : MIGRATION_NEW;
-                       if ( $tempTableStage < MIGRATION_NEW ) {
+                       if ( $tempTableStage & SCHEMA_COMPAT_READ_OLD ) {
                                $fields["{$key}_pk"] = $this->tempTables[$key]['joinPK'];
                        }
-                       if ( $tempTableStage > MIGRATION_OLD ) {
+                       if ( $tempTableStage & SCHEMA_COMPAT_READ_NEW ) {
                                $fields["{$key}_id"] = "{$key}_id";
                        }
                }
@@ -211,21 +220,21 @@ class CommentStore {
                        $fields = [];
                        $joins = [];
 
-                       if ( $this->stage === MIGRATION_OLD ) {
+                       if ( ( $this->stage & SCHEMA_COMPAT_READ_BOTH ) === SCHEMA_COMPAT_READ_OLD ) {
                                $fields["{$key}_text"] = $key;
                                $fields["{$key}_data"] = 'NULL';
                                $fields["{$key}_cid"] = 'NULL';
-                       } else {
-                               $join = $this->stage === MIGRATION_NEW ? 'JOIN' : 'LEFT JOIN';
+                       } else { // READ_BOTH or READ_NEW
+                               $join = ( $this->stage & SCHEMA_COMPAT_READ_OLD ) ? 'LEFT JOIN' : 'JOIN';
 
                                $tempTableStage = isset( $this->tempTables[$key] )
                                        ? $this->tempTables[$key]['stage'] : MIGRATION_NEW;
-                               if ( $tempTableStage < MIGRATION_NEW ) {
+                               if ( $tempTableStage & SCHEMA_COMPAT_READ_OLD ) {
                                        $t = $this->tempTables[$key];
                                        $alias = "temp_$key";
                                        $tables[$alias] = $t['table'];
                                        $joins[$alias] = [ $join, "{$alias}.{$t['pk']} = {$t['joinPK']}" ];
-                                       if ( $tempTableStage === MIGRATION_OLD ) {
+                                       if ( ( $tempTableStage & SCHEMA_COMPAT_READ_BOTH ) === SCHEMA_COMPAT_READ_OLD ) {
                                                $joinField = "{$alias}.{$t['field']}";
                                        } else {
                                                // Nothing hits this code path for now, but will in the future when we set
@@ -245,7 +254,7 @@ class CommentStore {
                                $tables[$alias] = 'comment';
                                $joins[$alias] = [ $join, "{$alias}.comment_id = {$joinField}" ];
 
-                               if ( $this->stage === MIGRATION_NEW ) {
+                               if ( ( $this->stage & SCHEMA_COMPAT_READ_BOTH ) === SCHEMA_COMPAT_READ_NEW ) {
                                        $fields["{$key}_text"] = "{$alias}.comment_text";
                                } else {
                                        $fields["{$key}_text"] = "COALESCE( {$alias}.comment_text, $key )";
@@ -282,13 +291,15 @@ class CommentStore {
                        $cid = $row["{$key}_cid"] ?? null;
                        $text = $row["{$key}_text"];
                        $data = $row["{$key}_data"];
-               } elseif ( $this->stage === MIGRATION_OLD ) {
+               } elseif ( ( $this->stage & SCHEMA_COMPAT_READ_BOTH ) === SCHEMA_COMPAT_READ_OLD ) {
                        $cid = null;
                        if ( $fallback && isset( $row[$key] ) ) {
                                wfLogWarning( "Using deprecated fallback handling for comment $key" );
                                $text = $row[$key];
                        } else {
-                               wfLogWarning( "Missing {$key}_text and {$key}_data fields in row with MIGRATION_OLD" );
+                               wfLogWarning(
+                                       "Missing {$key}_text and {$key}_data fields in row with MIGRATION_OLD / READ_OLD"
+                               );
                                $text = '';
                        }
                        $data = null;
@@ -296,7 +307,7 @@ class CommentStore {
                        $tempTableStage = isset( $this->tempTables[$key] )
                                ? $this->tempTables[$key]['stage'] : MIGRATION_NEW;
                        $row2 = null;
-                       if ( $tempTableStage > MIGRATION_OLD && array_key_exists( "{$key}_id", $row ) ) {
+                       if ( ( $tempTableStage & SCHEMA_COMPAT_READ_NEW ) && array_key_exists( "{$key}_id", $row ) ) {
                                if ( !$db ) {
                                        throw new InvalidArgumentException(
                                                "\$row does not contain fields needed for comment $key and getComment(), but "
@@ -311,7 +322,9 @@ class CommentStore {
                                        __METHOD__
                                );
                        }
-                       if ( !$row2 && $tempTableStage < MIGRATION_NEW && array_key_exists( "{$key}_pk", $row ) ) {
+                       if ( !$row2 && ( $tempTableStage & SCHEMA_COMPAT_READ_OLD ) &&
+                               array_key_exists( "{$key}_pk", $row )
+                       ) {
                                if ( !$db ) {
                                        throw new InvalidArgumentException(
                                                "\$row does not contain fields needed for comment $key and getComment(), but "
@@ -341,7 +354,9 @@ class CommentStore {
                                $cid = $row2->comment_id;
                                $text = $row2->comment_text;
                                $data = $row2->comment_data;
-                       } elseif ( $this->stage < MIGRATION_NEW && array_key_exists( "{$key}_old", $row ) ) {
+                       } elseif ( ( $this->stage & SCHEMA_COMPAT_READ_OLD ) &&
+                               array_key_exists( "{$key}_old", $row )
+                       ) {
                                $cid = null;
                                $text = $row["{$key}_old"];
                                $data = null;
@@ -474,7 +489,7 @@ class CommentStore {
                # Truncate comment in a Unicode-sensitive manner
                $comment->text = $this->lang->truncateForVisual( $comment->text, self::COMMENT_CHARACTER_LIMIT );
 
-               if ( $this->stage > MIGRATION_OLD && !$comment->id ) {
+               if ( ( $this->stage & SCHEMA_COMPAT_WRITE_NEW ) && !$comment->id ) {
                        $dbData = $comment->data;
                        if ( !$comment->message instanceof RawMessage ) {
                                if ( $dbData === null ) {
@@ -534,14 +549,14 @@ class CommentStore {
 
                $comment = $this->createComment( $dbw, $comment, $data );
 
-               if ( $this->stage <= MIGRATION_WRITE_BOTH ) {
+               if ( $this->stage & SCHEMA_COMPAT_WRITE_OLD ) {
                        $fields[$key] = $this->lang->truncateForDatabase( $comment->text, 255 );
                }
 
-               if ( $this->stage >= MIGRATION_WRITE_BOTH ) {
+               if ( $this->stage & SCHEMA_COMPAT_WRITE_NEW ) {
                        $tempTableStage = isset( $this->tempTables[$key] )
                                ? $this->tempTables[$key]['stage'] : MIGRATION_NEW;
-                       if ( $tempTableStage <= MIGRATION_WRITE_BOTH ) {
+                       if ( $tempTableStage & SCHEMA_COMPAT_WRITE_OLD ) {
                                $t = $this->tempTables[$key];
                                $func = __METHOD__;
                                $commentId = $comment->id;
@@ -556,7 +571,7 @@ class CommentStore {
                                        );
                                };
                        }
-                       if ( $tempTableStage >= MIGRATION_WRITE_BOTH ) {
+                       if ( $tempTableStage & SCHEMA_COMPAT_WRITE_NEW ) {
                                $fields["{$key}_id"] = $comment->id;
                        }
                }
@@ -594,7 +609,7 @@ class CommentStore {
 
                $tempTableStage = isset( $this->tempTables[$key] )
                        ? $this->tempTables[$key]['stage'] : MIGRATION_NEW;
-               if ( $tempTableStage < MIGRATION_WRITE_NEW ) {
+               if ( $tempTableStage & SCHEMA_COMPAT_WRITE_OLD ) {
                        throw new InvalidArgumentException( "Must use insertWithTempTable() for $key" );
                }
 
index f6ac342..31cb7ae 100644 (file)
@@ -2733,16 +2733,17 @@ $wgExtensionInfoMTime = false;
  * although they are sometimes still referred to as Squid settings for
  * historical reasons.
  *
- * Achieving a high hit ratio with an HTTP proxy requires special
- * configuration. See https://www.mediawiki.org/wiki/Manual:Squid_caching for
- * more details.
+ * Achieving a high hit ratio with an HTTP proxy requires special configuration.
+ * See https://www.mediawiki.org/wiki/Manual:Performance_tuning#Page_view_caching
+ * for more details.
  *
  * @{
  */
 
 /**
  * Enable/disable CDN.
- * See https://www.mediawiki.org/wiki/Manual:Squid_caching
+ *
+ * See https://www.mediawiki.org/wiki/Manual:Performance_tuning#Page_view_caching
  *
  * @since 1.34 Renamed from $wgUseSquid.
  */
@@ -4444,7 +4445,8 @@ $wgCentralIdLookupProvider = 'local';
  * The checks supported by core are:
  *     - MinimalPasswordLength - Minimum length a user can set.
  *     - MinimumPasswordLengthToLogin - Passwords shorter than this will
- *             not be allowed to login, regardless if it is correct.
+ *             not be allowed to login, or offered a chance to reset their password
+ *             as part of the login workflow, regardless if it is correct.
  *     - MaximalPasswordLength - maximum length password a user is allowed
  *             to attempt. Prevents DoS attacks with pbkdf2.
  *     - PasswordCannotMatchUsername - Password cannot match the username.
@@ -4888,6 +4890,7 @@ $wgDefaultUserOptions = [
        'wllimit' => 250,
        'useeditwarning' => 1,
        'prefershttps' => 1,
+       'requireemail' => 0,
 ];
 
 /**
@@ -4957,6 +4960,15 @@ $wgSessionProviders = [
        ],
 ];
 
+/**
+ * Temporary feature flag that controls whether users will see a checkbox allowing them to
+ * require providing email during password resets.
+ *
+ * @deprecated This feature is under development, don't assume this flag's existence or function
+ *     outside of MediaWiki.
+ */
+$wgAllowRequiringEmailForResets = false;
+
 /** @} */ # end user accounts }
 
 /************************************************************************//**
@@ -4980,6 +4992,8 @@ $wgBlockAllowsUTEdit = true;
 
 /**
  * Allow sysops to ban users from accessing Emailuser
+ * @deprecated since 1.34; `$wgGroupPermissions['sysop']['blockemail'] = true;`
+ * should be used instead
  */
 $wgSysopEmailBans = true;
 
@@ -7923,6 +7937,7 @@ $wgAllowSpecialInclusion = true;
 /**
  * Set this to an array of special page names to prevent
  * maintenance/updateSpecialPages.php from updating those pages.
+ * Mapping each special page name to an run mode like 'periodical' if a cronjob is set up.
  */
 $wgDisableQueryPageUpdate = false;
 
@@ -8609,6 +8624,7 @@ $wgContentHandlerTextFallback = 'ignore';
  * handling is less robust and less flexible.
  *
  * @since 1.21
+ * @deprecated since 1.34, and should always be set true.
  */
 $wgContentHandlerUseDB = true;
 
@@ -9079,6 +9095,16 @@ $wgSpecialSearchFormOptions = [];
  */
 $wgNativeImageLazyLoading = false;
 
+/**
+ * Option to whether serve the main page as the domain root
+ *
+ * @warning EXPERIMENTAL!
+ *
+ * @since 1.34
+ * @var bool
+ */
+$wgMainPageIsDomainRoot = false;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index d93caa7..668de39 100644 (file)
@@ -27,7 +27,7 @@ ini_set( 'display_errors', 1 );
 
 global $wgDevelopmentWarnings, $wgShowExceptionDetails, $wgShowHostnames,
        $wgDebugRawPage, $wgCommandLineMode, $wgDebugLogFile,
-       $wgDBerrorLog, $wgDebugLogGroups;
+       $wgDBerrorLog, $wgDebugLogGroups, $wgLocalisationCacheConf;
 
 // Use of wfWarn() should cause tests to fail
 $wgDevelopmentWarnings = true;
@@ -74,3 +74,6 @@ $wgSQLMode = 'TRADITIONAL';
 
 // Disable legacy javascript globals in CI and for devs (T72470)
 $wgLegacyJavaScriptGlobals = false;
+
+// Localisation Cache to StaticArray (T218207)
+$wgLocalisationCacheConf['store'] = 'array';
index c346b75..fe00149 100644 (file)
@@ -25,7 +25,7 @@ use MediaWiki\EditPage\TextboxBuilder;
 use MediaWiki\EditPage\TextConflictHelper;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -1156,7 +1156,7 @@ class EditPage {
                        $out->showErrorPage(
                                'modeleditnotsupported-title',
                                'modeleditnotsupported-text',
-                               $modelName
+                               [ $modelName ]
                        );
                        return false;
                }
@@ -1188,7 +1188,7 @@ class EditPage {
        /**
         * @param Content|null $def_content The default value to return
         *
-        * @return Content|null Content on success, $def_content for invalid sections
+        * @return Content|false|null Content on success, $def_content for invalid sections
         *
         * @since 1.21
         */
@@ -1683,7 +1683,9 @@ class EditPage {
                        case self::AS_CANNOT_USE_CUSTOM_MODEL:
                        case self::AS_PARSE_ERROR:
                        case self::AS_UNICODE_NOT_SUPPORTED:
-                               $out->wrapWikiTextAsInterface( 'error', $status->getWikiText() );
+                               $out->wrapWikiTextAsInterface( 'error',
+                                       $status->getWikiText( false, false, $this->context->getLanguage() )
+                               );
                                return true;
 
                        case self::AS_SUCCESS_NEW_ARTICLE:
@@ -1757,7 +1759,8 @@ class EditPage {
                                // is if an extension hook aborted from inside ArticleSave.
                                // Render the status object into $this->hookError
                                // FIXME this sucks, we should just use the Status object throughout
-                               $this->hookError = '<div class="error">' . "\n" . $status->getWikiText() .
+                               $this->hookError = '<div class="error">' . "\n" .
+                                       $status->getWikiText( false, false, $this->context->getLanguage() ) .
                                        '</div>';
                                return true;
                }
@@ -2742,7 +2745,7 @@ ERROR;
         * content.
         *
         * @param Content|null|bool|string $content
-        * @return string The editable text form of the content.
+        * @return string|false|null The editable text form of the content.
         *
         * @throws MWException If $content is not an instance of TextContent and
         *   $this->allowNonTextContent is not true.
@@ -4045,11 +4048,11 @@ ERROR;
 
                if ( $this->isConflict ) {
                        $conflict = Html::rawElement(
-                               'h2', [ 'id' => 'mw-previewconflict' ],
+                               'div', [ 'id' => 'mw-previewconflict', 'class' => 'warningbox' ],
                                $this->context->msg( 'previewconflict' )->escaped()
                        );
                } else {
-                       $conflict = '<hr />';
+                       $conflict = '';
                }
 
                $previewhead = Html::rawElement(
@@ -4058,7 +4061,9 @@ ERROR;
                                'h2', [ 'id' => 'mw-previewheader' ],
                                $this->context->msg( 'preview' )->escaped()
                        ) .
-                       $out->parseAsInterface( $note ) . $conflict
+                       Html::rawElement( 'div', [ 'class' => 'warningbox' ],
+                               $out->parseAsInterface( $note )
+                       ) . $conflict
                );
 
                $pageViewLang = $this->mTitle->getPageViewLanguage();
index 78f6ca9..9337270 100644 (file)
@@ -86,14 +86,6 @@ class FauxRequest extends WebRequest {
                return (string)$this->getVal( $name, $default );
        }
 
-       /**
-        * @return array
-        * @suppress PhanParamSignatureMismatch
-        */
-       public function getValues() {
-               return $this->data;
-       }
-
        /**
         * @return array
         */
index 8efae4f..bfd1e2a 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Feed
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper functions for feeds
index 38daab5..125b917 100644 (file)
@@ -518,7 +518,7 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
                }
        }
 
-       $defaultProtoWithoutSlashes = substr( $defaultProto, 0, -2 );
+       $defaultProtoWithoutSlashes = $defaultProto !== null ? substr( $defaultProto, 0, -2 ) : '';
 
        if ( substr( $url, 0, 2 ) == '//' ) {
                $url = $defaultProtoWithoutSlashes . $url;
@@ -1816,10 +1816,11 @@ function mimeTypeMatch( $type, $avail ) {
  *
  * @param array $cprefs Client's acceptable type list
  * @param array $sprefs Server's offered types
- * @return string
+ * @return string|null
  *
  * @todo FIXME: Doesn't handle params like 'text/plain; charset=UTF-8'
  * XXX: generalize to negotiate other stuff
+ * @todo The function appears unused. Is it worth to keep?
  */
 function wfNegotiateType( $cprefs, $sprefs ) {
        $combine = [];
@@ -2030,7 +2031,7 @@ function wfRecursiveRemoveDir( $dir ) {
  */
 function wfPercent( $nr, $acc = 2, $round = true ) {
        $ret = sprintf( "%.${acc}f", $nr );
-       return $round ? round( $ret, $acc ) . '%' : "$ret%";
+       return $round ? round( (float)$ret, $acc ) . '%' : "$ret%";
 }
 
 /**
@@ -2793,7 +2794,7 @@ function wfMemoryLimit( $newLimit ) {
 function wfTransactionalTimeLimit() {
        global $wgTransactionalTimeLimit;
 
-       $timeLimit = ini_get( 'max_execution_time' );
+       $timeLimit = (int)ini_get( 'max_execution_time' );
        // Note that CLI scripts use 0
        if ( $timeLimit > 0 && $wgTransactionalTimeLimit > $timeLimit ) {
                set_time_limit( $wgTransactionalTimeLimit );
index c4b57af..ea2ce07 100644 (file)
@@ -704,7 +704,7 @@ class Html {
         * Return the HTML for a message box.
         * @since 1.31
         * @param string $html of contents of box
-        * @param string $className corresponding to box
+        * @param string|array $className corresponding to box
         * @param string $heading (optional)
         * @return string of HTML representing a box.
         */
@@ -718,32 +718,38 @@ class Html {
        /**
         * Return a warning box.
         * @since 1.31
+        * @since 1.34 $className optional parameter added
         * @param string $html of contents of box
+        * @param string $className (optional) corresponding to box
         * @return string of HTML representing a warning box.
         */
-       public static function warningBox( $html ) {
-               return self::messageBox( $html, 'warningbox' );
+       public static function warningBox( $html, $className = '' ) {
+               return self::messageBox( $html, [ 'warningbox', $className ] );
        }
 
        /**
         * Return an error box.
         * @since 1.31
+        * @since 1.34 $className optional parameter added
         * @param string $html of contents of error box
         * @param string $heading (optional)
+        * @param string $className (optional) corresponding to box
         * @return string of HTML representing an error box.
         */
-       public static function errorBox( $html, $heading = '' ) {
-               return self::messageBox( $html, 'errorbox', $heading );
+       public static function errorBox( $html, $heading = '', $className = '' ) {
+               return self::messageBox( $html, [ 'errorbox', $className ], $heading );
        }
 
        /**
         * Return a success box.
         * @since 1.31
+        * @since 1.34 $className optional parameter added
         * @param string $html of contents of box
+        * @param string $className (optional) corresponding to box
         * @return string of HTML representing a success box.
         */
-       public static function successBox( $html ) {
-               return self::messageBox( $html, 'successbox' );
+       public static function successBox( $html, $className = '' ) {
+               return self::messageBox( $html, [ 'successbox', $className ] );
        }
 
        /**
@@ -1005,7 +1011,7 @@ class Html {
        /**
         * Get HTML for an information message box with an icon.
         *
-        * @internal For use by the WebInstaller class.
+        * @internal For use by the WebInstaller class only.
         * @param string $rawHtml HTML
         * @param string $icon Path to icon file (used as 'src' attribute)
         * @param string $alt Alternate text for the icon
index 1a5058d..864019d 100644 (file)
@@ -21,7 +21,7 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Some internal bits split of from Skin.php. These functions are used
@@ -891,7 +891,7 @@ class Linker {
         * Make user link (or user contributions for unregistered users)
         * @param int $userId User id in database.
         * @param string $userName User name in database.
-        * @param string $altUserName Text to display instead of the user name (optional)
+        * @param string|false $altUserName Text to display instead of the user name (optional)
         * @return string HTML fragment
         * @since 1.16.3. $altUserName was added in 1.19.
         */
@@ -1912,7 +1912,7 @@ class Linker {
         * @since 1.16.3. $context added in 1.20. $editCount added in 1.21
         * @param Revision $rev
         * @param IContextSource|null $context Context to use or null for the main context.
-        * @param int $editCount Number of edits that would be reverted
+        * @param int|false $editCount Number of edits that would be reverted
         * @return string HTML fragment
         */
        public static function buildRollbackLink( $rev, IContextSource $context = null,
index f91477a..1a75714 100644 (file)
@@ -346,6 +346,10 @@ class MediaWiki {
                        return false;
                }
 
+               if ( $this->config->get( 'MainPageIsDomainRoot' ) && $request->getRequestURL() === '/' ) {
+                       return false;
+               }
+
                if ( $title->isSpecialPage() ) {
                        list( $name, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
                                resolveAlias( $title->getDBkey() );
@@ -522,11 +526,15 @@ class MediaWiki {
                        try {
                                $this->main();
                        } catch ( ErrorPageError $e ) {
+                               $out = $this->context->getOutput();
+                               // TODO: Should ErrorPageError::report accept a OutputPage parameter?
+                               $e->report( ErrorPageError::STAGE_OUTPUT );
+
                                // T64091: while exceptions are convenient to bubble up GUI errors,
                                // they are not internal application faults. As with normal requests, this
                                // should commit, print the output, do deferred updates, jobs, and profiling.
                                $this->doPreOutputCommit();
-                               $e->report(); // display the GUI error
+                               $out->output(); // display the GUI error
                        }
                } catch ( Exception $e ) {
                        $context = $this->context;
index 4045a54..1a950c5 100644 (file)
@@ -273,6 +273,18 @@ class MergeHistory {
                        return $status;
                }
 
+               // Update denormalized revactor_page too
+               $this->dbw->update(
+                       'revision_actor_temp',
+                       [ 'revactor_page' => $this->dest->getArticleID() ],
+                       [
+                               'revactor_page' => $this->source->getArticleID(),
+                               // Slightly hacky, but should work given the values assigned in this class
+                               str_replace( 'rev_timestamp', 'revactor_timestamp', $this->timeWhere )
+                       ],
+                       __METHOD__
+               );
+
                // Make the source page a redirect if no revisions are left
                $haveRevisions = $this->dbw->lockForUpdate(
                        'revision',
index 634e7af..59baae7 100644 (file)
@@ -83,7 +83,7 @@ class MovePage {
         * @param ServiceOptions|null $options
         * @param ILoadBalancer|null $loadBalancer
         * @param NamespaceInfo|null $nsInfo
-        * @param WatchedItemStore|null $watchedItems
+        * @param WatchedItemStoreInterface|null $watchedItems
         * @param PermissionManager|null $permMgr
         */
        public function __construct(
index 7f005fb..acf2d25 100644 (file)
@@ -50,7 +50,7 @@ class OutputPage extends ContextSource {
        /** @var array */
        protected $mLinktags = [];
 
-       /** @var bool */
+       /** @var string|bool */
        protected $mCanonicalUrl = false;
 
        /**
@@ -332,7 +332,7 @@ class OutputPage extends ContextSource {
         * a OutputPage tied to that context.
         * @param IContextSource $context
         */
-       function __construct( IContextSource $context ) {
+       public function __construct( IContextSource $context ) {
                $this->setContext( $context );
        }
 
@@ -385,8 +385,8 @@ class OutputPage extends ContextSource {
         * @param string $name Name of the meta tag
         * @param string $val Value of the meta tag
         */
-       function addMeta( $name, $val ) {
-               array_push( $this->mMetatags, [ $name, $val ] );
+       public function addMeta( $name, $val ) {
+               $this->mMetatags[] = [ $name, $val ];
        }
 
        /**
@@ -406,8 +406,8 @@ class OutputPage extends ContextSource {
         *
         * @param array $linkarr Associative array of attributes.
         */
-       function addLink( array $linkarr ) {
-               array_push( $this->mLinktags, $linkarr );
+       public function addLink( array $linkarr ) {
+               $this->mLinktags[] = $linkarr;
        }
 
        /**
@@ -425,7 +425,7 @@ class OutputPage extends ContextSource {
         * in preference to addLink(), to avoid duplicate link tags.
         * @param string $url
         */
-       function setCanonicalUrl( $url ) {
+       public function setCanonicalUrl( $url ) {
                $this->mCanonicalUrl = $url;
        }
 
@@ -447,7 +447,7 @@ class OutputPage extends ContextSource {
         *
         * @param string $script Raw HTML
         */
-       function addScript( $script ) {
+       public function addScript( $script ) {
                $this->mScripts .= $script;
        }
 
@@ -621,7 +621,7 @@ class OutputPage extends ContextSource {
         *
         * @return array
         */
-       function getHeadItemsArray() {
+       public function getHeadItemsArray() {
                return $this->mHeadItems;
        }
 
@@ -1598,6 +1598,7 @@ class OutputPage extends ContextSource {
         * @param ParserOptions|null $options Either the ParserOption to use or null to only get the
         *   current ParserOption object. This parameter is deprecated since 1.31.
         * @return ParserOptions
+        * @suppress PhanUndeclaredProperty For isBogus
         */
        public function parserOptions( $options = null ) {
                if ( $options !== null ) {
@@ -1954,7 +1955,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         * @param array $poOptions Options to ParserOutput::getText()
         */
-       function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
+       public function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
                $this->addParserOutputMetadata( $parserOutput );
                $this->addParserOutputText( $parserOutput, $poOptions );
        }
@@ -2146,7 +2147,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get TTL in [$minTTL,$maxTTL] in pass it to lowerCdnMaxage()
+        * Get TTL in [$minTTL,$maxTTL] and pass it to lowerCdnMaxage()
         *
         * This sets and returns $minTTL if $mtime is false or null. Otherwise,
         * the TTL is higher the older the $mtime timestamp is. Essentially, the
@@ -2162,10 +2163,10 @@ class OutputPage extends ContextSource {
                $maxTTL = $maxTTL ?: $this->getConfig()->get( 'CdnMaxAge' );
 
                if ( $mtime === null || $mtime === false ) {
-                       return $minTTL; // entity does not exist
+                       return; // entity does not exist
                }
 
-               $age = MWTimestamp::time() - wfTimestamp( TS_UNIX, $mtime );
+               $age = MWTimestamp::time() - (int)wfTimestamp( TS_UNIX, $mtime );
                $adaptiveTTL = max( 0.9 * $age, $minTTL );
                $adaptiveTTL = min( $adaptiveTTL, $maxTTL );
 
@@ -2188,7 +2189,7 @@ class OutputPage extends ContextSource {
         *
         * @return array
         */
-       function getCacheVaryCookies() {
+       public function getCacheVaryCookies() {
                if ( self::$cacheVaryCookies === null ) {
                        $config = $this->getConfig();
                        self::$cacheVaryCookies = array_values( array_unique( array_merge(
@@ -2209,7 +2210,7 @@ class OutputPage extends ContextSource {
         *
         * @return bool
         */
-       function haveCacheVaryCookies() {
+       public function haveCacheVaryCookies() {
                $request = $this->getRequest();
                foreach ( $this->getCacheVaryCookies() as $cookieName ) {
                        if ( $request->getCookie( $cookieName, '', '' ) !== '' ) {
@@ -2269,7 +2270,7 @@ class OutputPage extends ContextSource {
        /**
         * Return a Link: header. Based on the values of $mLinkHeader.
         *
-        * @return string
+        * @return string|false
         */
        public function getLinkHeader() {
                if ( !$this->mLinkHeader ) {
@@ -2601,7 +2602,7 @@ class OutputPage extends ContextSource {
         * and optionally an custom HTML title (content of the "<title>" tag).
         *
         * @param string|Message $pageTitle Will be passed directly to setPageTitle()
-        * @param string|Message $htmlTitle Will be passed directly to setHTMLTitle();
+        * @param string|Message|false $htmlTitle Will be passed directly to setHTMLTitle();
         *                   optional, if not passed the "<title>" attribute will be
         *                   based on $pageTitle
         */
@@ -2822,7 +2823,7 @@ class OutputPage extends ContextSource {
        /**
         * Add a "return to" link pointing to a specified title
         *
-        * @param Title $title Title to link
+        * @param LinkTarget $title Title to link
         * @param array $query Query string parameters
         * @param string|null $text Text of the link (input is not escaped)
         * @param array $options Options array to pass to Linker
@@ -3282,7 +3283,7 @@ class OutputPage extends ContextSource {
                        $vars['wgUserId'] = $user->getId();
                        $vars['wgUserEditCount'] = $user->getEditCount();
                        $userReg = $user->getRegistration();
-                       $vars['wgUserRegistration'] = $userReg ? wfTimestamp( TS_UNIX, $userReg ) * 1000 : null;
+                       $vars['wgUserRegistration'] = $userReg ? (int)wfTimestamp( TS_UNIX, $userReg ) * 1000 : null;
                        // Get the revision ID of the oldest new message on the user's talk
                        // page. This can be used for constructing new message alerts on
                        // the client side.
index bf138c4..8d642e1 100644 (file)
@@ -77,8 +77,8 @@ class PHPVersionCheck {
        /**
         * Return the version of the installed PHP implementation.
         *
-        * @param string $impl By default, the function returns the info of the currently installed PHP
-        *  implementation. Using this parameter the caller can decide, what version info will be
+        * @param string|false $impl By default, the function returns the info of the currently installed
+        *  PHP implementation. Using this parameter the caller can decide, what version info will be
         *  returned. Valid values: HHVM, PHP
         * @return array An array of information about the PHP implementation, containing:
         *  - 'version': The version of the PHP implementation (specific to the implementation, not
@@ -108,8 +108,8 @@ class PHPVersionCheck {
                        'implementation' => 'PHP',
                        'version' => PHP_VERSION,
                        'vendor' => 'the PHP Group',
-                       'upstreamSupported' => '5.6.0',
-                       'minSupported' => '7.0.13',
+                       'upstreamSupported' => '7.1.0',
+                       'minSupported' => '7.2.0',
                        'upgradeURL' => 'https://www.php.net/downloads.php',
                );
        }
@@ -258,7 +258,7 @@ HTML;
        <head>
                <meta charset="UTF-8" />
                <title>MediaWiki {$this->mwVersion}</title>
-               <style media='screen'>
+               <style media="screen">
                        body {
                                color: #000;
                                background-color: #fff;
@@ -266,7 +266,7 @@ HTML;
                                padding: 2em;
                                text-align: center;
                        }
-                       p, img, h1, h2, ul  {
+                       p, img, h1, h2, ul {
                                text-align: left;
                                margin: 0.5em 0 1em;
                        }
@@ -279,9 +279,9 @@ HTML;
                </style>
        </head>
        <body>
-               <img src="{$encLogo}" alt='The MediaWiki logo' />
+               <img src="{$encLogo}" alt="The MediaWiki logo" />
                <h1>MediaWiki {$this->mwVersion} internal error</h1>
-               <div class='error'>
+               <div class="error">
                <p>
                        {$shortHtml}
                </p>
index 0a8e515..ef6b8ac 100644 (file)
@@ -97,7 +97,7 @@ class PermissionManager {
         */
        private $temporaryUserRights = [];
 
-       /** @var string[] Cached rights for isEveryoneAllowed */
+       /** @var bool[] Cached rights for isEveryoneAllowed, [ right => allowed ] */
        private $cachedRights = [];
 
        /**
index 8b5d995..3e639b9 100644 (file)
@@ -58,6 +58,18 @@ class ProtectionForm {
        /** @var array Map of action to the expiry time of the existing protection */
        protected $mExistingExpiry = [];
 
+       /** @var Article */
+       protected $mArticle;
+
+       /** @var Title */
+       protected $mTitle;
+
+       /** @var bool */
+       protected $disabled;
+
+       /** @var array */
+       protected $disabledAttrib;
+
        /** @var IContextSource */
        private $mContext;
 
@@ -78,7 +90,7 @@ class ProtectionForm {
                if ( wfReadOnly() ) {
                        $this->mPermErrors[] = [ 'readonlytext', wfReadOnlyReason() ];
                }
-               $this->disabled = $this->mPermErrors != [];
+               $this->disabled = $this->mPermErrors !== [];
                $this->disabledAttrib = $this->disabled
                        ? [ 'disabled' => 'disabled' ]
                        : [];
@@ -321,7 +333,9 @@ class ProtectionForm {
                );
 
                if ( !$status->isOK() ) {
-                       $this->show( $out->parseInlineAsInterface( $status->getWikiText() ) );
+                       $this->show( $out->parseInlineAsInterface(
+                               $status->getWikiText( false, false, $this->mContext->getLanguage() )
+                       ) );
                        return false;
                }
 
index 43014f1..92529b3 100644 (file)
@@ -2,24 +2,24 @@
 
 namespace MediaWiki\Rest\BasicAccess;
 
-use User;
 use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\Handler;
 use MediaWiki\Rest\RequestInterface;
+use MediaWiki\User\UserIdentity;
 
 /**
- * A factory for MWBasicRequestAuthorizer which passes through a User object
+ * A factory for MWBasicRequestAuthorizer which passes through a UserIdentity.
  *
  * @internal
  */
 class MWBasicAuthorizer extends BasicAuthorizerBase {
-       /** @var User */
+       /** @var UserIdentity */
        private $user;
 
        /** @var PermissionManager */
        private $permissionManager;
 
-       public function __construct( User $user, PermissionManager $permissionManager ) {
+       public function __construct( UserIdentity $user, PermissionManager $permissionManager ) {
                $this->user = $user;
                $this->permissionManager = $permissionManager;
        }
index 8c459c6..671488a 100644 (file)
@@ -2,7 +2,7 @@
 
 namespace MediaWiki\Rest\BasicAccess;
 
-use User;
+use MediaWiki\User\UserIdentity;
 use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\Handler;
 use MediaWiki\Rest\RequestInterface;
@@ -13,14 +13,14 @@ use MediaWiki\Rest\RequestInterface;
  * @internal
  */
 class MWBasicRequestAuthorizer extends BasicRequestAuthorizer {
-       /** @var User */
+       /** @var UserIdentity */
        private $user;
 
        /** @var PermissionManager */
        private $permissionManager;
 
        public function __construct( RequestInterface $request, Handler $handler,
-               User $user, PermissionManager $permissionManager
+               UserIdentity $user, PermissionManager $permissionManager
        ) {
                parent::__construct( $request, $handler );
                $this->user = $user;
index ee3441e..070451d 100644 (file)
@@ -10,6 +10,7 @@ use MediaWiki\Rest\Validator\Validator;
 use RequestContext;
 use Title;
 use WebResponse;
+use Wikimedia\Message\ITextFormatter;
 
 class EntryPoint {
        /** @var RequestInterface */
@@ -49,12 +50,18 @@ class EntryPoint {
                        'cookiePrefix' => $conf->get( 'CookiePrefix' )
                ] );
 
+               $responseFactory = new ResponseFactory( self::getTextFormatters( $services ) );
+
                // @phan-suppress-next-line PhanAccessMethodInternal
                $authorizer = new MWBasicAuthorizer( $context->getUser(),
                        $services->getPermissionManager() );
 
                // @phan-suppress-next-line PhanAccessMethodInternal
-               $restValidator = new Validator( $objectFactory, $request, RequestContext::getMain()->getUser() );
+               $restValidator = new Validator( $objectFactory,
+                       $services->getPermissionManager(),
+                       $request,
+                       RequestContext::getMain()->getUser()
+               );
 
                global $IP;
                $router = new Router(
@@ -62,7 +69,7 @@ class EntryPoint {
                        ExtensionRegistry::getInstance()->getAttribute( 'RestRoutes' ),
                        $conf->get( 'RestPath' ),
                        $services->getLocalServerObjectCache(),
-                       new ResponseFactory,
+                       $responseFactory,
                        $authorizer,
                        $objectFactory,
                        $restValidator
@@ -76,6 +83,25 @@ class EntryPoint {
                $entryPoint->execute();
        }
 
+       /**
+        * Get a TextFormatter array from MediaWikiServices
+        *
+        * @param MediaWikiServices $services
+        * @return ITextFormatter[]
+        */
+       public static function getTextFormatters( MediaWikiServices $services ) {
+               $langs = array_unique( [
+                       $services->getMainConfig()->get( 'ContLang' )->getCode(),
+                       'en'
+               ] );
+               $textFormatters = [];
+               $factory = $services->getMessageFormatterFactory();
+               foreach ( $langs as $lang ) {
+                       $textFormatters[] = $factory->getTextFormatter( $lang );
+               }
+               return $textFormatters;
+       }
+
        public function __construct( RequestContext $context, RequestInterface $request,
                WebResponse $webResponse, Router $router
        ) {
index 10d3a40..184fe16 100644 (file)
@@ -5,7 +5,14 @@ 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 );
+       private $messageValue;
+
+       public function __construct( MessageValue $messageValue, $code = 500 ) {
+               parent::__construct( 'Localized exception with key ' . $messageValue->getKey(), $code );
+               $this->messageValue = $messageValue;
+       }
+
+       public function getMessageValue() {
+               return $this->messageValue;
        }
 }
index 5e5a198..fd0f3c7 100644 (file)
@@ -5,19 +5,31 @@ namespace MediaWiki\Rest;
 use Exception;
 use HttpStatus;
 use InvalidArgumentException;
+use LanguageCode;
 use MWExceptionHandler;
 use stdClass;
 use Throwable;
+use Wikimedia\Message\ITextFormatter;
+use Wikimedia\Message\MessageValue;
 
 /**
  * Generates standardized response objects.
  */
 class ResponseFactory {
-
        const CT_PLAIN = 'text/plain; charset=utf-8';
        const CT_HTML = 'text/html; charset=utf-8';
        const CT_JSON = 'application/json';
 
+       /** @var ITextFormatter[] */
+       private $textFormatters;
+
+       /**
+        * @param ITextFormatter[] $textFormatters
+        */
+       public function __construct( $textFormatters ) {
+               $this->textFormatters = $textFormatters;
+       }
+
        /**
         * Encode a stdClass object or array to a JSON string
         *
@@ -167,13 +179,23 @@ class ResponseFactory {
                return $response;
        }
 
+       /**
+        * Create an HTTP 4xx or 5xx response with error message localisation
+        */
+       public function createLocalizedHttpError( $errorCode, MessageValue $messageValue ) {
+               return $this->createHttpError( $errorCode, $this->formatMessage( $messageValue ) );
+       }
+
        /**
         * Turn an exception into a JSON error response.
         * @param Exception|Throwable $exception
         * @return Response
         */
        public function createFromException( $exception ) {
-               if ( $exception instanceof HttpException ) {
+               if ( $exception instanceof LocalizedHttpException ) {
+                       $response = $this->createLocalizedHttpError( $exception->getCode(),
+                               $exception->getMessageValue() );
+               } elseif ( $exception instanceof HttpException ) {
                        // FIXME can HttpException represent 2xx or 3xx responses?
                        $response = $this->createHttpError(
                                $exception->getCode(),
@@ -240,4 +262,18 @@ class ResponseFactory {
                return "<!doctype html><title>Redirect</title><a href=\"$url\">$url</a>";
        }
 
+       public function formatMessage( MessageValue $messageValue ) {
+               if ( !$this->textFormatters ) {
+                       // For unit tests
+                       return [];
+               }
+               $translations = [];
+               foreach ( $this->textFormatters as $formatter ) {
+                       $lang = LanguageCode::bcp47( $formatter->getLangCode() );
+                       $messageText = $formatter->format( $messageValue );
+                       $translations[$lang] = $messageText;
+               }
+               return [ 'messageTranslations' => $translations ];
+       }
+
 }
index a520130..6dfcf3c 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Rest;
 
 use AppendIterator;
 use BagOStuff;
+use Wikimedia\Message\MessageValue;
 use MediaWiki\Rest\BasicAccess\BasicAuthorizerInterface;
 use MediaWiki\Rest\PathTemplateMatcher\PathMatcher;
 use MediaWiki\Rest\Validator\Validator;
@@ -226,18 +227,28 @@ class Router {
                $path = $request->getUri()->getPath();
                $relPath = $this->getRelativePath( $path );
                if ( $relPath === false ) {
-                       return $this->responseFactory->createHttpError( 404 );
+                       return $this->responseFactory->createLocalizedHttpError( 404,
+                               ( new MessageValue( 'rest-prefix-mismatch' ) )
+                                       ->plaintextParams( $path, $this->rootPath )
+                       );
                }
 
+               $requestMethod = $request->getMethod();
                $matchers = $this->getMatchers();
-               $matcher = $matchers[$request->getMethod()] ?? null;
+               $matcher = $matchers[$requestMethod] ?? null;
                $match = $matcher ? $matcher->match( $relPath ) : null;
 
+               // For a HEAD request, execute the GET handler instead if one exists.
+               // The webserver will discard the body.
+               if ( !$match && $requestMethod === 'HEAD' && isset( $matchers['GET'] ) ) {
+                       $match = $matchers['GET']->match( $relPath );
+               }
+
                if ( !$match ) {
                        // Check for 405 wrong method
                        $allowed = [];
                        foreach ( $matchers as $allowedMethod => $allowedMatcher ) {
-                               if ( $allowedMethod === $request->getMethod() ) {
+                               if ( $allowedMethod === $requestMethod ) {
                                        continue;
                                }
                                if ( $allowedMatcher->match( $relPath ) ) {
@@ -245,20 +256,27 @@ class Router {
                                }
                        }
                        if ( $allowed ) {
-                               $response = $this->responseFactory->createHttpError( 405 );
+                               $response = $this->responseFactory->createLocalizedHttpError( 405,
+                                       ( new MessageValue( 'rest-wrong-method' ) )
+                                               ->textParams( $requestMethod )
+                                               ->commaListParams( $allowed )
+                                               ->numParams( count( $allowed ) )
+                               );
                                $response->setHeader( 'Allow', $allowed );
                                return $response;
                        } else {
                                // Did not match with any other method, must be 404
-                               return $this->responseFactory->createHttpError( 404 );
+                               return $this->responseFactory->createLocalizedHttpError( 404,
+                                       ( new MessageValue( 'rest-no-match' ) )
+                                               ->plaintextParams( $relPath )
+                               );
                        }
                }
 
                $request->setPathParams( array_map( 'rawurldecode', $match['params'] ) );
                $spec = $match['userData'];
                $objectFactorySpec = array_intersect_key( $spec,
-                       // @todo ObjectFactory supports more keys than this.
-                       [ 'factory' => true, 'class' => true, 'args' => true ] );
+                       [ 'factory' => true, 'class' => true, 'args' => true, 'services' => true ] );
                /** @var $handler Handler (annotation for PHPStorm) */
                $handler = $this->objectFactory->createObject( $objectFactorySpec );
                $handler->init( $this, $request, $spec, $this->responseFactory );
@@ -272,6 +290,7 @@ class Router {
 
        /**
         * Execute a fully-constructed handler
+        *
         * @param Handler $handler
         * @return ResponseInterface
         */
index 6c54a50..93de911 100644 (file)
@@ -3,21 +3,30 @@
 namespace MediaWiki\Rest\Validator;
 
 use InvalidArgumentException;
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\RequestInterface;
+use MediaWiki\User\UserIdentity;
 use Psr\Http\Message\UploadedFileInterface;
-use User;
 use Wikimedia\ParamValidator\Callbacks;
 use Wikimedia\ParamValidator\ValidationException;
 
 class ParamValidatorCallbacks implements Callbacks {
 
+       /** @var PermissionManager */
+       private $permissionManager;
+
        /** @var RequestInterface */
        private $request;
 
-       /** @var User */
+       /** @var UserIdentity */
        private $user;
 
-       public function __construct( RequestInterface $request, User $user ) {
+       public function __construct(
+               PermissionManager $permissionManager,
+               RequestInterface $request,
+               UserIdentity $user
+       ) {
+               $this->permissionManager = $permissionManager;
                $this->request = $request;
                $this->user = $user;
        }
@@ -76,7 +85,7 @@ class ParamValidatorCallbacks implements Callbacks {
        }
 
        public function useHighLimits( array $options ) {
-               return $this->user->isAllowed( 'apihighlimits' );
+               return $this->permissionManager->userHasRight( $this->user, 'apihighlimits' );
        }
 
 }
index cee1cdb..be8d7a4 100644 (file)
@@ -2,10 +2,11 @@
 
 namespace MediaWiki\Rest\Validator;
 
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\Handler;
 use MediaWiki\Rest\HttpException;
 use MediaWiki\Rest\RequestInterface;
-use User;
+use MediaWiki\User\UserIdentity;
 use Wikimedia\ObjectFactory;
 use Wikimedia\ParamValidator\ParamValidator;
 use Wikimedia\ParamValidator\TypeDef\BooleanDef;
@@ -62,16 +63,20 @@ class Validator {
        private $paramValidator;
 
        /**
-        * @internal
         * @param ObjectFactory $objectFactory
+        * @param PermissionManager $permissionManager
         * @param RequestInterface $request
-        * @param User $user
+        * @param UserIdentity $user
+        * @internal
         */
        public function __construct(
-               ObjectFactory $objectFactory, RequestInterface $request, User $user
+               ObjectFactory $objectFactory,
+               PermissionManager $permissionManager,
+               RequestInterface $request,
+               UserIdentity $user
        ) {
                $this->paramValidator = new ParamValidator(
-                       new ParamValidatorCallbacks( $request, $user ),
+                       new ParamValidatorCallbacks( $permissionManager, $request, $user ),
                        $objectFactory,
                        [
                                'typeDefs' => self::$typeDefs,
index ff9ac57..cf35371 100644 (file)
@@ -59,7 +59,7 @@ abstract class RevisionRecord {
        const FOR_THIS_USER = 2;
        const RAW = 3;
 
-       /** @var string Wiki ID; false means the current wiki */
+       /** @var string|false Wiki ID; false means the current wiki */
        protected $mWiki = false;
        /** @var int|null */
        protected $mId;
@@ -531,8 +531,6 @@ abstract class RevisionRecord {
                                $text = $title->getPrefixedText();
                                wfDebug( "Checking for $permissionlist on $text due to $field match on $bitfield\n" );
 
-                               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
-
                                foreach ( $permissions as $perm ) {
                                        if ( $permissionManager->userCan( $perm, $user, $title ) ) {
                                                return true;
index 735a212..c444cc4 100644 (file)
@@ -182,9 +182,9 @@ class RevisionStore
                        'Reading needs to be enabled for the old or the new schema.'
                );
                Assert::parameter(
-                       ( $mcrMigrationStage & SCHEMA_COMPAT_WRITE_BOTH ) !== 0,
+                       ( $mcrMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) !== 0,
                        '$mcrMigrationStage',
-                       'Writing needs to be enabled for the old or the new schema.'
+                       'Writing needs to be enabled for the new schema.'
                );
                Assert::parameter(
                        ( $mcrMigrationStage & SCHEMA_COMPAT_READ_OLD ) === 0
@@ -192,12 +192,6 @@ class RevisionStore
                        '$mcrMigrationStage',
                        'Cannot read the old schema when not also writing it.'
                );
-               Assert::parameter(
-                       ( $mcrMigrationStage & SCHEMA_COMPAT_READ_NEW ) === 0
-                       || ( $mcrMigrationStage & SCHEMA_COMPAT_WRITE_NEW ) !== 0,
-                       '$mcrMigrationStage',
-                       'Cannot read the new schema when not also writing it.'
-               );
 
                $this->loadBalancer = $loadBalancer;
                $this->blobStore = $blobStore;
@@ -1623,10 +1617,18 @@ class RevisionStore
         * @param object[]|IResultWrapper $slotRows
         * @param int $queryFlags
         * @param Title $title
+        * @param array|null $slotContents a map from blobAddress to slot
+        *      content blob or Content object.
         *
         * @return SlotRecord[]
         */
-       private function constructSlotRecords( $revId, $slotRows, $queryFlags, Title $title ) {
+       private function constructSlotRecords(
+               $revId,
+               $slotRows,
+               $queryFlags,
+               Title $title,
+               $slotContents = null
+       ) {
                $slots = [];
 
                foreach ( $slotRows as $row ) {
@@ -1651,8 +1653,15 @@ class RevisionStore
                                        = $this->emulateContentId( intval( $row->rev_text_id ) );
                        }
 
-                       $contentCallback = function ( SlotRecord $slot ) use ( $queryFlags ) {
-                               return $this->loadSlotContent( $slot, null, null, null, $queryFlags );
+                       $contentCallback = function ( SlotRecord $slot ) use ( $slotContents, $queryFlags ) {
+                               $blob = null;
+                               if ( isset( $slotContents[$slot->getAddress()] ) ) {
+                                       $blob = $slotContents[$slot->getAddress()];
+                                       if ( $blob instanceof Content ) {
+                                               return $blob;
+                                       }
+                               }
+                               return $this->loadSlotContent( $slot, $blob, null, null, $queryFlags );
                        };
 
                        $slots[$row->role_name] = new SlotRecord( $row, $contentCallback );
@@ -1804,8 +1813,10 @@ class RevisionStore
 
        /**
         * @param object $row A database row generated from a query based on getQueryInfo()
-        * @param null|object[] $slotRows Database rows generated from a query based on
-        *        getSlotsQueryInfo with the 'content' flag set.
+        * @param null|object[]|RevisionSlots $slots
+        *      - Database rows generated from a query based on getSlotsQueryInfo
+        *        with the 'content' flag set. Or
+        *  - RevisionSlots instance
         * @param int $queryFlags
         * @param Title|null $title
         * @param bool $fromCache if true, the returned RevisionRecord will ensure that no stale
@@ -1816,11 +1827,10 @@ class RevisionStore
         * @see RevisionFactory::newRevisionFromRow
         *
         * MCR migration note: this replaces Revision::newFromRow
-        *
         */
        public function newRevisionFromRowAndSlots(
                $row,
-               $slotRows,
+               $slots,
                $queryFlags = 0,
                Title $title = null,
                $fromCache = false
@@ -1857,7 +1867,9 @@ class RevisionStore
                // Legacy because $row may have come from self::selectFields()
                $comment = $this->commentStore->getCommentLegacy( $db, 'rev_comment', $row, true );
 
-               $slots = $this->newRevisionSlots( $row->rev_id, $row, $slotRows, $queryFlags, $title );
+               if ( !( $slots instanceof RevisionSlots ) ) {
+                       $slots = $this->newRevisionSlots( $row->rev_id, $row, $slots, $queryFlags, $title );
+               }
 
                // If this is a cached row, instantiate a cache-aware revision class to avoid stale data.
                if ( $fromCache ) {
@@ -1887,9 +1899,13 @@ class RevisionStore
         *               loaded immediately. Supports falsy or truthy value as well
         *               as an explicit list of slot role names.
         *               'content'- whether the actual content of the slots should be
-        *               preloaded. TODO: no supported yet.
+        *               preloaded.
         * @param int $queryFlags
-        * @param Title|null $title
+        * @param Title|null $title The title to which all the revision rows belong, if there
+        *        is such a title and the caller has it handy, so we don't have to look it up again.
+        *        If this parameter is given and any of the rows has a rev_page_id that is different
+        *        from $title->getArticleID(), an InvalidArgumentException is thrown.
+        *
         * @return StatusValue a status with a RevisionRecord[] of successfully fetched revisions
         *                                         and an array of errors for the revisions failed to fetch.
         */
@@ -1906,7 +1922,10 @@ class RevisionStore
                $titlesByPageId = [];
                foreach ( $rows as $row ) {
                        if ( isset( $rowsByRevId[$row->rev_id] ) ) {
-                               throw new InvalidArgumentException( "Duplicate rows in newRevisionsFromBatch {$row->rev_id}" );
+                               $result->warning(
+                                       'internalerror',
+                                       "Duplicate rows in newRevisionsFromBatch, rev_id {$row->rev_id}"
+                               );
                        }
                        if ( $title && $row->rev_page != $title->getArticleID() ) {
                                throw new InvalidArgumentException(
@@ -1957,24 +1976,40 @@ class RevisionStore
                        }, $options['slots'] );
                }
 
-               // TODO: Support optional fetching of the content
-               $queryInfo = self::getSlotsQueryInfo( [ 'content' ] );
+               // We need to set the `content` flag because newRevisionFromRowAndSlots requires content
+               // metadata to be loaded.
+               $slotQueryInfo = self::getSlotsQueryInfo( [ 'content' ] );
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
                $slotRows = $db->select(
-                       $queryInfo['tables'],
-                       $queryInfo['fields'],
+                       $slotQueryInfo['tables'],
+                       $slotQueryInfo['fields'],
                        $slotQueryConds,
                        __METHOD__,
                        [],
-                       $queryInfo['joins']
+                       $slotQueryInfo['joins']
                );
 
                $slotRowsByRevId = [];
                foreach ( $slotRows as $slotRow ) {
                        $slotRowsByRevId[$slotRow->slot_revision_id][] = $slotRow;
                }
+
+               $slotContents = null;
+               if ( $options['content'] ?? false ) {
+                       $blobAddresses = [];
+                       foreach ( $slotRows as $slotRow ) {
+                               $blobAddresses[] = $slotRow->content_address;
+                       }
+                       $slotContentFetchStatus = $this->blobStore
+                               ->getBlobBatch( $blobAddresses, $queryFlags );
+                       foreach ( $slotContentFetchStatus->getErrors() as $error ) {
+                               $result->warning( $error['message'], ...$error['params'] );
+                       }
+                       $slotContents = $slotContentFetchStatus->getValue();
+               }
+
                $result->setResult( true, array_map( function ( $row ) use
-                       ( $slotRowsByRevId, $queryFlags, $titlesByPageId, $result ) {
+                       ( $slotRowsByRevId, $queryFlags, $titlesByPageId, $slotContents, $result ) {
                                if ( !isset( $slotRowsByRevId[$row->rev_id] ) ) {
                                        $result->warning(
                                                'internalerror',
@@ -1985,7 +2020,15 @@ class RevisionStore
                                try {
                                        return $this->newRevisionFromRowAndSlots(
                                                $row,
-                                               $slotRowsByRevId[$row->rev_id],
+                                               new RevisionSlots(
+                                                       $this->constructSlotRecords(
+                                                               $row->rev_id,
+                                                               $slotRowsByRevId[$row->rev_id],
+                                                               $queryFlags,
+                                                               $titlesByPageId[$row->rev_page],
+                                                               $slotContents
+                                                       )
+                                               ),
                                                $queryFlags,
                                                $titlesByPageId[$row->rev_page]
                                        );
index acecee1..1de4d7f 100644 (file)
@@ -27,7 +27,7 @@ namespace MediaWiki\Revision;
 
 use ActorMigration;
 use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
+use Psr\Log\LoggerInterface;
 use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\NameTableStoreFactory;
 use WANObjectCache;
@@ -54,8 +54,8 @@ class RevisionStoreFactory {
        private $dbLoadBalancerFactory;
        /** @var WANObjectCache */
        private $cache;
-       /** @var LoggerSpi */
-       private $loggerProvider;
+       /** @var LoggerInterface */
+       private $logger;
 
        /** @var CommentStore */
        private $commentStore;
@@ -84,7 +84,7 @@ class RevisionStoreFactory {
         * @param CommentStore $commentStore
         * @param ActorMigration $actorMigration
         * @param int $migrationStage
-        * @param LoggerSpi $loggerProvider
+        * @param LoggerInterface $logger
         * @param bool $contentHandlerUseDB see {@link $wgContentHandlerUseDB}. Must be the same
         *        for all wikis in the cluster. Will go away after MCR migration.
         */
@@ -97,7 +97,7 @@ class RevisionStoreFactory {
                CommentStore $commentStore,
                ActorMigration $actorMigration,
                $migrationStage,
-               LoggerSpi $loggerProvider,
+               LoggerInterface $logger,
                $contentHandlerUseDB
        ) {
                Assert::parameterType( 'integer', $migrationStage, '$migrationStage' );
@@ -109,7 +109,7 @@ class RevisionStoreFactory {
                $this->commentStore = $commentStore;
                $this->actorMigration = $actorMigration;
                $this->mcrMigrationStage = $migrationStage;
-               $this->loggerProvider = $loggerProvider;
+               $this->logger = $logger;
                $this->contentHandlerUseDB = $contentHandlerUseDB;
        }
 
@@ -118,7 +118,7 @@ class RevisionStoreFactory {
         *
         * @param bool|string $dbDomain DB domain of the relevant wiki or false for the current one
         *
-        * @return RevisionStore for the given wikiId with all necessary services and a logger
+        * @return RevisionStore for the given wikiId with all necessary services
         */
        public function getRevisionStore( $dbDomain = false ) {
                Assert::parameterType( 'string|boolean', $dbDomain, '$dbDomain' );
@@ -137,7 +137,7 @@ class RevisionStoreFactory {
                        $dbDomain
                );
 
-               $store->setLogger( $this->loggerProvider->getLogger( 'RevisionStore' ) );
+               $store->setLogger( $this->logger );
                $store->setContentHandlerUseDB( $this->contentHandlerUseDB );
 
                return $store;
index 469e494..dabf62b 100644 (file)
@@ -151,7 +151,7 @@ class RevisionStoreRecord extends RevisionRecord {
 
        /**
         * @throws RevisionAccessException if the size was unknown and could not be calculated.
-        * @return string The nominal revision size, never null. May be computed on the fly.
+        * @return int The nominal revision size, never null. May be computed on the fly.
         */
        public function getSize() {
                // If length is null, calculate and remember it (potentially SLOW!).
index 85b4c5a..7c2623b 100644 (file)
@@ -150,7 +150,7 @@ class SlotRoleHandler {
         *
         * The default implementation always returns false.
         *
-        * @return string
+        * @return bool
         */
        public function supportsArticleCount() {
                return false;
index 0b0aaf5..83847d8 100644 (file)
  * For every service that MediaWiki core requires, an instantiator must be defined in
  * this file.
  *
+ * Note that, ideally, all information used to instantiate service objects should come
+ * from configuration. Information derived from the current request is acceptable, but
+ * only where there is no feasible alternative. It is preferred that such information
+ * (like the client IP, the acting user's identity, requested title, etc) be passed to
+ * the service object's methods as parameters. This makes the flow of information more
+ * obvious, and makes it easier to understand the behavior of services.
+ *
  * @note As of version 1.27, MediaWiki is only beginning to use dependency injection.
  * The services defined here do not yet fully represent all services used by core,
  * much of the code still relies on global state for this accessing services.
@@ -107,14 +114,12 @@ return [
        },
 
        'BlockManager' => function ( MediaWikiServices $services ) : BlockManager {
-               $context = RequestContext::getMain();
                return new BlockManager(
                        new ServiceOptions(
                                BlockManager::$constructorOptions, $services->getMainConfig()
                        ),
-                       $context->getUser(),
-                       $context->getRequest(),
-                       $services->getPermissionManager()
+                       $services->getPermissionManager(),
+                       LoggerFactory::getInstance( 'BlockManager' )
                );
        },
 
@@ -202,10 +207,7 @@ return [
                );
                $class = MWLBFactory::getLBFactoryClass( $lbConf );
 
-               $instance = new $class( $lbConf );
-               MWLBFactory::setSchemaAliases( $instance, $mainConfig->get( 'DBtype' ) );
-
-               return $instance;
+               return new $class( $lbConf );
        },
 
        'EventRelayerGroup' => function ( MediaWikiServices $services ) : EventRelayerGroup {
@@ -269,6 +271,8 @@ return [
                if ( defined( 'MW_NO_SESSION' ) ) {
                        return $services->getLinkRendererFactory()->create();
                } else {
+                       // Normally information from the current request would not be passed in here;
+                       // this is an exception. (See also the class documentation.)
                        return $services->getLinkRendererFactory()->createForUser(
                                RequestContext::getMain()->getUser()
                        );
@@ -545,7 +549,8 @@ return [
                        $services->getContentLanguage(),
                        AuthManager::singleton(),
                        $services->getLinkRendererFactory()->create(),
-                       $services->getNamespaceInfo()
+                       $services->getNamespaceInfo(),
+                       $services->getPermissionManager()
                );
                $factory->setLogger( LoggerFactory::getInstance( 'preferences' ) );
 
@@ -634,7 +639,7 @@ return [
                        $services->getCommentStore(),
                        $services->getActorMigration(),
                        $config->get( 'MultiContentRevisionSchemaMigrationStage' ),
-                       LoggerFactory::getProvider(),
+                       LoggerFactory::getInstance( 'RevisionStore' ),
                        $config->get( 'ContentHandlerUseDB' )
                );
 
@@ -785,7 +790,8 @@ return [
                        $services->getDBLoadBalancer(),
                        $services->getCommentStore(),
                        $services->getActorMigration(),
-                       $services->getWatchedItemStore()
+                       $services->getWatchedItemStore(),
+                       $services->getPermissionManager()
                );
        },
 
index 39f0c81..d450bdd 100644 (file)
@@ -440,6 +440,13 @@ if ( $wgEnableEmail ) {
        $wgUsersNotifiedOnAllChanges = [];
 }
 
+// $wgSysopEmailBans deprecated in 1.34
+if ( isset( $wgSysopEmailBans ) && $wgSysopEmailBans === false ) {
+       foreach ( $wgGroupPermissions as $group => $_ ) {
+               unset( $wgGroupPermissions[$group]['blockemail'] );
+       }
+}
+
 if ( $wgMetaNamespace === false ) {
        $wgMetaNamespace = str_replace( ' ', '_', $wgSitename );
 }
@@ -721,7 +728,7 @@ if ( is_null( $wgLocaltimezone ) ) {
 
 date_default_timezone_set( $wgLocaltimezone );
 if ( is_null( $wgLocalTZoffset ) ) {
-       $wgLocalTZoffset = date( 'Z' ) / 60;
+       $wgLocalTZoffset = (int)date( 'Z' ) / 60;
 }
 // The part after the System| is ignored, but rest of MW fills it
 // out as the local offset.
@@ -808,22 +815,17 @@ if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
        // Initialize the session
        try {
                $session = MediaWiki\Session\SessionManager::getGlobalSession();
-       } catch ( OverflowException $ex ) {
-               if ( isset( $ex->sessionInfos ) && count( $ex->sessionInfos ) >= 2 ) {
-                       // The exception is because the request had multiple possible
-                       // sessions tied for top priority. Report this to the user.
-                       $list = [];
-                       foreach ( $ex->sessionInfos as $info ) {
-                               $list[] = $info->getProvider()->describe( $wgContLang );
-                       }
-                       $list = $wgContLang->listToText( $list );
-                       throw new HttpError( 400,
-                               Message::newFromKey( 'sessionmanager-tie', $list )->inLanguage( $wgContLang )->plain()
-                       );
+       } catch ( MediaWiki\Session\SessionOverflowException $ex ) {
+               // The exception is because the request had multiple possible
+               // sessions tied for top priority. Report this to the user.
+               $list = [];
+               foreach ( $ex->getSessionInfos() as $info ) {
+                       $list[] = $info->getProvider()->describe( $wgContLang );
                }
-
-               // Not the one we want, rethrow
-               throw $ex;
+               $list = $wgContLang->listToText( $list );
+               throw new HttpError( 400,
+                       Message::newFromKey( 'sessionmanager-tie', $list )->inLanguage( $wgContLang )->plain()
+               );
        }
 
        if ( $session->isPersistent() ) {
index 76b905e..932fd2a 100644 (file)
@@ -115,6 +115,7 @@ class Status extends StatusValue {
         * ]
         *
         * @return Status[]
+        * @suppress PhanUndeclaredProperty Status vs StatusValue
         */
        public function splitByErrorType() {
                list( $errorsOnlyStatus, $warningsOnlyStatus ) = parent::splitByErrorType();
index 4903cf0..b2c003a 100644 (file)
@@ -1531,7 +1531,9 @@ class DerivedPageDataUpdater implements IDBAccessObject, LoggerAwareInterface {
                if ( $this->options['changed']
                        && $title->getNamespace() == NS_USER_TALK
                        && $shortTitle != $legacyUser->getTitleKey()
-                       && !( $this->revision->isMinor() && $legacyUser->isAllowed( 'nominornewtalk' ) )
+                       && !( $this->revision->isMinor() && MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $legacyUser, 'nominornewtalk' ) )
                ) {
                        $recipient = User::newFromName( $shortTitle, false );
                        if ( !$recipient ) {
index a0ef07d..826d526 100644 (file)
@@ -231,7 +231,7 @@ class PageEditStash {
                        return false;
                }
 
-               $age = time() - wfTimestamp( TS_UNIX, $editInfo->output->getCacheTime() );
+               $age = time() - (int)wfTimestamp( TS_UNIX, $editInfo->output->getCacheTime() );
                $context['age'] = $age;
 
                $isCacheUsable = true;
@@ -450,7 +450,7 @@ class PageEditStash {
        ) {
                // If an item is renewed, mind the cache TTL determined by config and parser functions.
                // Put an upper limit on the TTL for sanity to avoid extreme template/file staleness.
-               $age = time() - wfTimestamp( TS_UNIX, $parserOutput->getCacheTime() );
+               $age = time() - (int)wfTimestamp( TS_UNIX, $parserOutput->getCacheTime() );
                $ttl = min( $parserOutput->getCacheExpiry() - $age, self::MAX_CACHE_TTL );
                // Avoid extremely stale user signature timestamps (T84843)
                if ( $parserOutput->getFlag( 'user-signature' ) ) {
index 8c011df..bcbc9e8 100644 (file)
@@ -103,10 +103,10 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * @param ExternalStoreAccess $extStoreAccess Access layer for external storage
         * @param WANObjectCache $cache A cache manager for caching blobs. This can be the local
         *        wiki's default instance even if $dbDomain refers to a different wiki, since
-        *        makeGlobalKey() is used to constructed a key that allows cached blobs from the
-        *        same database to be re-used between wikis. For example, enwiki and frwiki will
-        *        use the same cache keys for blobs from the wikidatawiki database, regardless of
-        *        the cache's default key space.
+        *        makeGlobalKey() is used to construct a key that allows cached blobs from the
+        *        same database to be re-used between wikis. For example, wiki A and wiki B will
+        *        use the same cache keys for blobs fetched from wiki C, regardless of the
+        *        wiki-specific default key space.
         * @param bool|string $dbDomain The ID of the target wiki database. Use false for the local wiki.
         */
        public function __construct(
@@ -449,16 +449,15 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * Get a cache key for a given Blob address.
         *
         * The cache key is constructed in a way that allows cached blobs from the same database
-        * to be re-used between wikis. For example, enwiki and frwiki will use the same cache keys
-        * for blobs from the wikidatawiki database.
+        * to be re-used between wikis. For example, wiki A and wiki B will use the same cache keys
+        * for blobs fetched from wiki C.
         *
         * @param string $blobAddress
         * @return string
         */
        private function getCacheKey( $blobAddress ) {
                return $this->cache->makeGlobalKey(
-                       'BlobStore',
-                       'address',
+                       'SqlBlobStore-blob',
                        $this->dbLoadBalancer->resolveDomainID( $this->dbDomain ),
                        $blobAddress
                );
index 2ad42e5..c9b2c33 100644 (file)
  */
 class StreamFile {
        // Do not send any HTTP headers unless requested by caller (e.g. body only)
+       /** @deprecated since 1.34 */
        const STREAM_HEADLESS = HTTPFileStreamer::STREAM_HEADLESS;
        // Do not try to tear down any PHP output buffers
+       /** @deprecated since 1.34 */
        const STREAM_ALLOW_OB = HTTPFileStreamer::STREAM_ALLOW_OB;
 
        /**
@@ -66,8 +68,10 @@ class StreamFile {
         * @param string $fname Full name and path of the file to stream
         * @param int $flags Bitfield of STREAM_* constants
         * @since 1.24
+        * @deprecated since 1.34, use HTTPFileStreamer::send404Message() instead
         */
        public static function send404Message( $fname, $flags = 0 ) {
+               wfDeprecated( __METHOD__, '1.34' );
                HTTPFileStreamer::send404Message( $fname, $flags );
        }
 
@@ -78,8 +82,10 @@ class StreamFile {
         * @param int $size File size
         * @return array|string Returns error string on failure (start, end, length)
         * @since 1.24
+        * @deprecated since 1.34, use HTTPFileStreamer::parseRange() instead
         */
        public static function parseRange( $range, $size ) {
+               wfDeprecated( __METHOD__, '1.34' );
                return HTTPFileStreamer::parseRange( $range, $size );
        }
 
@@ -105,7 +111,6 @@ class StreamFile {
                                case 'png':
                                        return 'image/png';
                                case 'jpg':
-                                       return 'image/jpeg';
                                case 'jpeg':
                                        return 'image/jpeg';
                        }
index 1e93c44..6c15a06 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 use MediaWiki\Permissions\PermissionManager;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -1059,7 +1059,7 @@ class Title implements LinkTarget, IDBAccessObject {
                        $this->lazyFillContentModel( $this->loadFieldFromDB( 'page_content_model', $flags ) );
                } elseif (
                        ( !$this->mContentModel || $flags & self::GAID_FOR_UPDATE ) &&
-                       $this->getArticleId( $flags )
+                       $this->getArticleID( $flags )
                ) {
                        $linkCache = MediaWikiServices::getInstance()->getLinkCache();
                        $linkCache->addLinkObj( $this ); # in case we already had an article ID
@@ -1561,14 +1561,32 @@ class Title implements LinkTarget, IDBAccessObject {
         * Get a Title object associated with the talk page of this article
         *
         * @deprecated since 1.34, use getTalkPageIfDefined() or NamespaceInfo::getTalkPage()
-        *             with NamespaceInfo::canHaveTalkPage().
+        *             with NamespaceInfo::canHaveTalkPage(). Note that the new method will
+        *             throw if asked for the talk page of a section-only link, or of an interwiki
+        *             link.
         * @return Title The object for the talk page
         * @throws MWException if $target doesn't have talk pages, e.g. because it's in NS_SPECIAL
         *         or because it's a relative link, or an interwiki link.
         */
        public function getTalkPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getTalkPage( $this ) );
+               // NOTE: The equivalent code in NamespaceInfo is less lenient about producing invalid titles.
+               //       Instead of failing on invalid titles, let's just log the issue for now.
+               //       See the discussion on T227817.
+
+               // Is this the same title?
+               $talkNS = MediaWikiServices::getInstance()->getNamespaceInfo()->getTalk( $this->mNamespace );
+               if ( $this->mNamespace == $talkNS ) {
+                       return $this;
+               }
+
+               $title = self::makeTitle( $talkNS, $this->mDbkeyform );
+
+               $this->warnIfPageCannotExist( $title, __METHOD__ );
+
+               return $title;
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getTalkPage( $this ) );
        }
 
        /**
@@ -1596,8 +1614,51 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return Title The object for the subject page
         */
        public function getSubjectPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getSubjectPage( $this ) );
+               // Is this the same title?
+               $subjectNS = MediaWikiServices::getInstance()->getNamespaceInfo()
+                       ->getSubject( $this->mNamespace );
+               if ( $this->mNamespace == $subjectNS ) {
+                       return $this;
+               }
+               // NOTE: The equivalent code in NamespaceInfo is less lenient about producing invalid titles.
+               //       Instead of failing on invalid titles, let's just log the issue for now.
+               //       See the discussion on T227817.
+               $title = self::makeTitle( $subjectNS, $this->mDbkeyform );
+
+               $this->warnIfPageCannotExist( $title, __METHOD__ );
+
+               return $title;
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getSubjectPage( $this ) );
+       }
+
+       /**
+        * @param Title $title
+        * @param string $method
+        *
+        * @return bool whether a warning was issued
+        */
+       private function warnIfPageCannotExist( Title $title, $method ) {
+               if ( $this->getText() == '' ) {
+                       wfLogWarning(
+                               $method . ': called on empty title ' . $this->getFullText() . ', returning '
+                               . $title->getFullText()
+                       );
+
+                       return true;
+               }
+
+               if ( $this->getInterwiki() !== '' ) {
+                       wfLogWarning(
+                               $method . ': called on interwiki title ' . $this->getFullText() . ', returning '
+                               . $title->getFullText()
+                       );
+
+                       return true;
+               }
+
+               return false;
        }
 
        /**
@@ -1610,8 +1671,23 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return Title
         */
        public function getOtherPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociatedPage( $this ) );
+               // NOTE: Depend on the methods in this class instead of their equivalent in NamespaceInfo,
+               //       until their semantics has become exactly the same.
+               //       See the discussion on T227817.
+               if ( $this->isSpecialPage() ) {
+                       throw new MWException( 'Special pages cannot have other pages' );
+               }
+               if ( $this->isTalkPage() ) {
+                       return $this->getSubjectPage();
+               } else {
+                       if ( !$this->canHaveTalkPage() ) {
+                               throw new MWException( "{$this->getPrefixedText()} does not have an other page" );
+                       }
+                       return $this->getTalkPage();
+               }
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociatedPage( $this ) );
        }
 
        /**
@@ -1986,7 +2062,7 @@ class Title implements LinkTarget, IDBAccessObject {
         *
         * @see self::getLocalURL for the arguments.
         * @see wfExpandUrl
-        * @param string|string[] $query
+        * @param string|array $query
         * @param string|string[]|bool $query2
         * @param string|int|null $proto Protocol type to use in URL
         * @return string The URL
@@ -2047,7 +2123,7 @@ class Title implements LinkTarget, IDBAccessObject {
         *  valid to link, locally, to the current Title.
         * @see self::newFromText to produce a Title object.
         *
-        * @param string|string[] $query An optional query string,
+        * @param string|array $query An optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., [ 'action' => 'edit' ] (keys and values will be URL-escaped).
         *   Some query patterns will trigger various shorturl path replacements.
@@ -2061,7 +2137,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return string String of the URL.
         */
        public function getLocalURL( $query = '', $query2 = false ) {
-               global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
+               global $wgArticlePath, $wgScript, $wgServer, $wgRequest, $wgMainPageIsDomainRoot;
 
                $query = self::fixUrlQueryArgs( $query, $query2 );
 
@@ -2138,6 +2214,11 @@ class Title implements LinkTarget, IDBAccessObject {
                                $url = $wgServer . $url;
                        }
                }
+
+               if ( $wgMainPageIsDomainRoot && $this->isMainPage() && $query === '' ) {
+                       return '/';
+               }
+
                // Avoid PHP 7.1 warning from passing $this by reference
                $titleRef = $this;
                Hooks::run( 'GetLocalURL', [ &$titleRef, &$url, $query ] );
@@ -2182,7 +2263,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * protocol-relative, the URL will be expanded to http://
         *
         * @see self::getLocalURL for the arguments.
-        * @param string|string[] $query
+        * @param string|array $query
         * @param string|bool $query2 Deprecated
         * @return string The URL
         */
@@ -2205,7 +2286,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * NOTE: Unlike getInternalURL(), the canonical URL includes the fragment
         *
         * @see self::getLocalURL for the arguments.
-        * @param string|string[] $query
+        * @param string|array $query
         * @param string|bool $query2 Deprecated
         * @return string The URL
         * @since 1.18
@@ -4270,12 +4351,21 @@ class Title implements LinkTarget, IDBAccessObject {
         * on the number of links. Typically called on create and delete.
         */
        public function touchLinks() {
-               DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'pagelinks', 'page-touch' ) );
+               $jobs = [];
+               $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                       $this,
+                       'pagelinks',
+                       [ 'causeAction' => 'page-touch' ]
+               );
                if ( $this->mNamespace == NS_CATEGORY ) {
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $this, 'categorylinks', 'category-touch' )
+                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                               $this,
+                               'categorylinks',
+                               [ 'causeAction' => 'category-touch' ]
                        );
                }
+
+               JobQueueGroup::singleton()->lazyPush( $jobs );
        }
 
        /**
index a48d032..c94e8d4 100644 (file)
@@ -547,7 +547,7 @@ class WebRequest {
         *
         * @param string $name
         * @param array|null $default Option default (or null)
-        * @return array Array of ints
+        * @return int[]|null
         */
        public function getIntArray( $name, $default = null ) {
                $val = $this->getArray( $name, $default );
index febf03e..b368a13 100644 (file)
@@ -266,7 +266,7 @@ class Xml {
        /**
         * Convenience function to build an HTML text input field
         * @param string $name Value of the name attribute
-        * @param int $size Value of the size attribute
+        * @param int|false $size Value of the size attribute
         * @param mixed $value Value of the value attribute
         * @param array $attribs Other attributes
         * @return string HTML
@@ -289,7 +289,7 @@ class Xml {
        /**
         * Convenience function to build an HTML password input field
         * @param string $name Value of the name attribute
-        * @param int $size Value of the size attribute
+        * @param int|false $size Value of the size attribute
         * @param mixed $value Value of the value attribute
         * @param array $attribs Other attributes
         * @return string HTML
@@ -600,7 +600,7 @@ class Xml {
         *
         * @param string|bool $legend Legend of the fieldset. If evaluates to false,
         *   legend is not added.
-        * @param string $content Pre-escaped content for the fieldset. If false,
+        * @param string|false $content Pre-escaped content for the fieldset. If false,
         *   only open fieldset is returned.
         * @param array $attribs Any attributes to fieldset-element.
         *
index f892c5e..4be2f7d 100644 (file)
@@ -22,7 +22,7 @@
 use MediaWiki\MediaWikiServices;
 
 /**
- * @defgroup Actions Action done on pages
+ * @defgroup Actions Actions
  */
 
 /**
index db874f2..6a61045 100644 (file)
@@ -433,27 +433,30 @@ class HistoryAction extends FormlessAction {
         * @return FeedItem
         */
        function feedItem( $row ) {
-               $rev = new Revision( $row, 0, $this->getTitle() );
-
+               $revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
+               $rev = $revisionStore->newRevisionFromRow( $row, 0, $this->getTitle() );
+               $prevRev = $revisionStore->getPreviousRevision( $rev );
+               $revComment = $rev->getComment() === null ? null : $rev->getComment()->text;
                $text = FeedUtils::formatDiffRow(
                        $this->getTitle(),
-                       $this->getTitle()->getPreviousRevisionID( $rev->getId() ),
+                       $prevRev ? $prevRev->getId() : false,
                        $rev->getId(),
                        $rev->getTimestamp(),
-                       $rev->getComment()
+                       $revComment
                );
-               if ( $rev->getComment() == '' ) {
+               $revUserText = $rev->getUser() ? $rev->getUser()->getName() : '';
+               if ( $revComment == '' ) {
                        $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        $title = $this->msg( 'history-feed-item-nocomment',
-                               $rev->getUserText(),
+                               $revUserText,
                                $contLang->timeanddate( $rev->getTimestamp() ),
                                $contLang->date( $rev->getTimestamp() ),
                                $contLang->time( $rev->getTimestamp() )
                        )->inContentLanguage()->text();
                } else {
-                       $title = $rev->getUserText() .
+                       $title = $revUserText .
                                $this->msg( 'colon-separator' )->inContentLanguage()->text() .
-                               FeedItem::stripComment( $rev->getComment() );
+                               FeedItem::stripComment( $revComment );
                }
 
                return new FeedItem(
@@ -461,7 +464,7 @@ class HistoryAction extends FormlessAction {
                        $text,
                        $this->getTitle()->getFullURL( 'diff=' . $rev->getId() . '&oldid=prev' ),
                        $rev->getTimestamp(),
-                       $rev->getUserText(),
+                       $revUserText,
                        $this->getTitle()->getTalkPage()->getFullURL()
                );
        }
index 207721e..0360fe4 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\Database;
 
 /**
@@ -280,11 +280,10 @@ class InfoAction extends FormlessAction {
                // Language in which the page content is (supposed to be) written
                $pageLang = $title->getPageLanguage()->getCode();
 
-               $permissionManager = $services->getPermissionManager();
-
                $pageLangHtml = $pageLang . ' - ' .
                        Language::fetchLanguageName( $pageLang, $lang->getCode() );
                // Link to Special:PageLanguage with pre-filled page title if user has permissions
+               $permissionManager = $services->getPermissionManager();
                if ( $config->get( 'PageLanguageUseDB' )
                        && $permissionManager->userCan( 'pagelang', $user, $title )
                ) {
@@ -344,8 +343,7 @@ class InfoAction extends FormlessAction {
                ];
 
                $unwatchedPageThreshold = $config->get( 'UnwatchedPageThreshold' );
-               if (
-                       $services->getPermissionManager()->userHasRight( $user, 'unwatchedpages' ) ||
+               if ( $permissionManager->userHasRight( $user, 'unwatchedpages' ) ||
                        ( $unwatchedPageThreshold !== false &&
                                $pageCounts['watchers'] >= $unwatchedPageThreshold )
                ) {
@@ -360,7 +358,7 @@ class InfoAction extends FormlessAction {
                        ) {
                                $minToDisclose = $config->get( 'UnwatchedPageSecret' );
                                if ( $pageCounts['visitingWatchers'] > $minToDisclose ||
-                                       $services->getPermissionManager()->userHasRight( $user, 'unwatchedpages' ) ) {
+                                       $permissionManager->userHasRight( $user, 'unwatchedpages' ) ) {
                                        $pageInfo['header-basic'][] = [
                                                $this->msg( 'pageinfo-visiting-watchers' ),
                                                $lang->formatNum( $pageCounts['visitingWatchers'] )
index 41cd24e..68c0ea1 100644 (file)
@@ -289,8 +289,9 @@ class McrUndoAction extends FormAction {
                                'h2', [ 'id' => 'mw-previewheader' ],
                                $this->context->msg( 'preview' )->text()
                        ) .
-                       $out->parseAsInterface( $note ) .
-                       "<hr />"
+                       Html::rawElement( 'div', [ 'class' => 'warningbox' ],
+                               $out->parseAsInterface( $note )
+                       )
                );
 
                $pageViewLang = $this->getTitle()->getPageViewLanguage();
index 8fd4e0a..0586e09 100644 (file)
@@ -238,23 +238,31 @@ class RawAction extends FormlessAction {
         */
        public function getOldId() {
                $oldid = $this->getRequest()->getInt( 'oldid' );
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
                switch ( $this->getRequest()->getText( 'direction' ) ) {
                        case 'next':
                                # output next revision, or nothing if there isn't one
-                               $nextid = 0;
+                               $nextRev = null;
                                if ( $oldid ) {
-                                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                                       $oldRev = $rl->getRevisionById( $oldid );
+                                       if ( $oldRev ) {
+                                               $nextRev = $rl->getNextRevision( $oldRev );
+                                       }
                                }
-                               $oldid = $nextid ?: -1;
+                               $oldid = $nextRev ? $nextRev->getId() : -1;
                                break;
                        case 'prev':
                                # output previous revision, or nothing if there isn't one
+                               $prevRev = null;
                                if ( !$oldid ) {
                                        # get the current revision so we can get the penultimate one
                                        $oldid = $this->page->getLatest();
                                }
-                               $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
-                               $oldid = $previd ?: -1;
+                               $oldRev = $rl->getRevisionById( $oldid );
+                               if ( $oldRev ) {
+                                       $prevRev = $rl->getPreviousRevision( $oldRev );
+                               }
+                               $oldid = $prevRev ? $prevRev->getId() : -1;
                                break;
                        case 'cur':
                                $oldid = 0;
index 519da61..1c9e63b 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup Actions
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * User interface for the rollback action
index 8a231cb..56be456 100644 (file)
@@ -35,6 +35,9 @@ class SpecialPageAction extends FormlessAction {
                'editchangetags' => 'EditTags',
        ];
 
+       /**
+        * @inheritDoc
+        */
        public function getName() {
                $request = $this->getRequest();
                $actionName = $request->getVal( 'action', 'view' );
index 056d10c..7518008 100644 (file)
@@ -1585,6 +1585,7 @@ abstract class ApiBase extends ContextSource {
                                'integeroutofrange',
                                [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
                        );
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->warnOrDie( $msg, $enforceLimits );
                        $value = $min;
                }
@@ -1606,6 +1607,7 @@ abstract class ApiBase extends ContextSource {
                                                'integeroutofrange',
                                                [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
                                        );
+                                       // @phan-suppress-next-line PhanTypeMismatchArgument
                                        $this->warnOrDie( $msg, $enforceLimits );
                                        $value = $botMax;
                                }
@@ -1616,6 +1618,7 @@ abstract class ApiBase extends ContextSource {
                                        'integeroutofrange',
                                        [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
                                );
+                               // @phan-suppress-next-line PhanTypeMismatchArgument
                                $this->warnOrDie( $msg, $enforceLimits );
                                $value = $max;
                        }
@@ -2022,6 +2025,7 @@ abstract class ApiBase extends ContextSource {
         */
        public function dieWithException( $exception, array $options = [] ) {
                $this->dieWithError(
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->getErrorFormatter()->getMessageFromException( $exception, $options )
                );
        }
@@ -2464,6 +2468,7 @@ abstract class ApiBase extends ContextSource {
                                        if ( $m ) {
                                                $m = new ApiHelpParamValueMessage(
                                                        $value,
+                                                       // @phan-suppress-next-line PhanTypeMismatchArgument
                                                        [ $m->getKey(), 'api-help-param-no-description' ],
                                                        $m->getParams(),
                                                        isset( $deprecatedValues[$value] )
index 05eb438..6e788d5 100644 (file)
@@ -26,6 +26,9 @@ use MediaWiki\Revision\RevisionArchiveRecord;
 use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\SlotRecord;
 
+/**
+ * @ingroup API
+ */
 class ApiComparePages extends ApiBase {
 
        /** @var RevisionStore */
@@ -249,6 +252,7 @@ class ApiComparePages extends ApiBase {
                        );
                        if ( $row ) {
                                $rev = $this->revisionStore->newRevisionFromArchiveRow( $row );
+                               // @phan-suppress-next-line PhanUndeclaredProperty
                                $rev->isArchive = true;
                        }
                }
@@ -617,6 +621,7 @@ class ApiComparePages extends ApiBase {
                                }
                        }
 
+                       // @phan-suppress-next-line PhanUndeclaredProperty
                        if ( !empty( $rev->isArchive ) ) {
                                $this->getMain()->setCacheMode( 'private' );
                                $vals["{$prefix}archive"] = true;
index fdf9cf1..1936407 100644 (file)
@@ -20,7 +20,8 @@
  * @file
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * A module that allows for editing and creating pages.
@@ -239,11 +240,15 @@ class ApiEditPage extends ApiBase {
                        $params['text'] = $newContent->serialize( $contentFormat );
                        // If no summary was given and we only undid one rev,
                        // use an autosummary
-                       if ( is_null( $params['summary'] ) &&
-                               $titleObj->getNextRevisionID( $undoafterRev->getId() ) == $params['undo']
-                       ) {
-                               $params['summary'] = wfMessage( 'undo-summary' )
-                                       ->params( $params['undo'], $undoRev->getUserText() )->inContentLanguage()->text();
+
+                       if ( is_null( $params['summary'] ) ) {
+                               $nextRev = MediaWikiServices::getInstance()->getRevisionLookup()
+                                       ->getNextRevision( $undoafterRev->getRevisionRecord() );
+                               if ( $nextRev && $nextRev->getId() == $params['undo'] ) {
+                                       $params['summary'] = wfMessage( 'undo-summary' )
+                                               ->params( $params['undo'], $undoRev->getUserText() )
+                                               ->inContentLanguage()->text();
+                               }
                        }
                }
 
index 81ee9b9..9dfd370 100644 (file)
@@ -237,6 +237,7 @@ class ApiErrorFormatter {
         */
        public function formatException( $exception, array $options = [] ) {
                return $this->formatMessage(
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->getMessageFromException( $exception, $options ),
                        $options['format'] ?? null
                );
index 6b892fa..3052b89 100644 (file)
@@ -21,6 +21,9 @@
  * @file
  */
 
+/**
+ * @ingroup API
+ */
 class ApiFormatXmlRsd extends ApiFormatXml {
        public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
index 7aebf90..0272dcd 100644 (file)
@@ -28,6 +28,7 @@
  * 'APIGetParamDescriptionMessages' hook simple.
  *
  * @since 1.25
+ * @ingroup API
  */
 class ApiHelpParamValueMessage extends Message {
 
index 1f8b012..8a0e8c9 100644 (file)
@@ -1,7 +1,4 @@
 <?php
-
-use MediaWiki\MediaWikiServices;
-
 /**
  * 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
@@ -21,6 +18,11 @@ use MediaWiki\MediaWikiServices;
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @ingroup API
+ */
 class ApiImageRotate extends ApiBase {
        private $mPageSet = null;
 
index 7bbce97..d2c957d 100644 (file)
@@ -1154,8 +1154,7 @@ class ApiMain extends ApiBase {
                }
 
                if ( $this->getParameter( 'curtimestamp' ) ) {
-                       $result->addValue( null, 'curtimestamp', wfTimestamp( TS_ISO_8601, time() ),
-                               ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( null, 'curtimestamp', wfTimestamp( TS_ISO_8601 ), ApiResult::NO_SIZE_CHECK );
                }
 
                if ( $this->getParameter( 'responselanginfo' ) ) {
index 40edafa..2e7db78 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * @ingroup API
index 7d6d342..2a49984 100644 (file)
@@ -43,9 +43,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
         * @return void
         */
        protected function run( ApiPageSet $resultPageSet = null ) {
-               // Before doing anything at all, let's check permissions
-               $this->checkUserRightsAny( 'deletedhistory' );
-
                $user = $this->getUser();
                $db = $this->getDB();
                $params = $this->extractRequestParams( false );
@@ -144,8 +141,15 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                // This means stricter restrictions
-               if ( $this->fetchContent ) {
-                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
+               if ( ( $this->fld_comment || $this->fld_parsedcomment ) &&
+                       !$this->getPermissionManager()->userHasRight( $user, 'deletedhistory' )
+               ) {
+                       $this->dieWithError( 'apierror-cantview-deleted-comment', 'permissiondenied' );
+               }
+               if ( $this->fetchContent &&
+                       !$this->getPermissionManager()->userHasAnyRight( $user, 'deletedtext', 'undelete' )
+               ) {
+                       $this->dieWithError( 'apierror-cantview-deleted-revision-content', 'permissiondenied' );
                }
 
                $miser_ns = null;
@@ -235,8 +239,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                        // Paranoia: avoid brute force searches (T19342)
-                       // (shouldn't be able to get here without 'deletedhistory', but
-                       // check it again just in case)
                        if ( !$this->getPermissionManager()->userHasRight( $user, 'deletedhistory' ) ) {
                                $bitmask = RevisionRecord::DELETED_USER;
                        } elseif ( !$this->getPermissionManager()
index a7d4fb9..0ea6af3 100644 (file)
  * @file
  */
 
+use MediaWiki\Block\DatabaseBlock;
+
 /**
  * Query module to enumerate all registered users.
  *
  * @ingroup API
  */
 class ApiQueryAllUsers extends ApiQueryBase {
+       use ApiQueryBlockInfoTrait;
+
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'au' );
        }
@@ -153,7 +157,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addWhere( 'user_editcount > 0' );
                }
 
-               $this->showHiddenUsersAddBlockInfo( $fld_blockinfo );
+               $this->addBlockInfoToQuery( $fld_blockinfo );
 
                if ( $fld_groups || $fld_rights ) {
                        $this->addFields( [ 'groups' =>
@@ -263,13 +267,8 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                );
                        }
 
-                       if ( $fld_blockinfo && !is_null( $row->ipb_by_text ) ) {
-                               $data['blockid'] = (int)$row->ipb_id;
-                               $data['blockedby'] = $row->ipb_by_text;
-                               $data['blockedbyid'] = (int)$row->ipb_by;
-                               $data['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
-                               $data['blockreason'] = $commentStore->getComment( 'ipb_reason', $row )->text;
-                               $data['blockexpiry'] = $row->ipb_expiry;
+                       if ( $fld_blockinfo && !is_null( $row->ipb_id ) ) {
+                               $data += $this->getBlockDetails( DatabaseBlock::newFromRow( $row ) );
                        }
                        if ( $row->ipb_deleted ) {
                                $data['hidden'] = true;
index d21f111..a6b15e9 100644 (file)
@@ -41,6 +41,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        private $redirect;
        private $bl_ns, $bl_from, $bl_from_ns, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
 
+       /** @var string */
+       private $helpUrl;
+
        /**
         * Maps ns and title to pageid
         *
index b8672ee..022fd9b 100644 (file)
@@ -286,6 +286,8 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                $res = $this->select( __METHOD__ );
 
                if ( is_null( $resultPageSet ) ) {
+                       $this->executeGenderCacheFromResultWrapper( $res, __METHOD__ );
+
                        $count = 0;
                        foreach ( $res as $row ) {
                                if ( ++$count > $params['limit'] ) {
index 10db848..059c438 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\IResultWrapper;
 
@@ -31,6 +32,7 @@ use Wikimedia\Rdbms\IResultWrapper;
  * @ingroup API
  */
 abstract class ApiQueryBase extends ApiBase {
+       use ApiQueryBlockInfoTrait;
 
        private $mQueryModule, $mDb, $tables, $where, $fields, $options, $join_conds;
 
@@ -424,47 +426,6 @@ abstract class ApiQueryBase extends ApiBase {
                return Hooks::run( 'ApiQueryBaseProcessRow', [ $this, $row, &$data, &$hookData ] );
        }
 
-       /**
-        * Filters hidden users (where the user doesn't have the right to view them)
-        * Also adds relevant block information
-        *
-        * @param bool $showBlockInfo
-        * @return void
-        */
-       public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
-               $db = $this->getDB();
-
-               $tables = [ 'ipblocks' ];
-               $fields = [ 'ipb_deleted' ];
-               $joinConds = [
-                       'blk' => [ 'LEFT JOIN', [
-                               'ipb_user=user_id',
-                               'ipb_expiry > ' . $db->addQuotes( $db->timestamp() ),
-                       ] ],
-               ];
-
-               if ( $showBlockInfo ) {
-                       $actorQuery = ActorMigration::newMigration()->getJoin( 'ipb_by' );
-                       $commentQuery = CommentStore::getStore()->getJoin( 'ipb_reason' );
-                       $tables += $actorQuery['tables'] + $commentQuery['tables'];
-                       $joinConds += $actorQuery['joins'] + $commentQuery['joins'];
-                       $fields = array_merge( $fields, [
-                               'ipb_id',
-                               'ipb_expiry',
-                               'ipb_timestamp'
-                       ], $actorQuery['fields'], $commentQuery['fields'] );
-               }
-
-               $this->addTables( [ 'blk' => $tables ] );
-               $this->addFields( $fields );
-               $this->addJoinConds( $joinConds );
-
-               // Don't show hidden names
-               if ( !$this->getPermissionManager()->userHasRight( $this->getUser(), 'hideuser' ) ) {
-                       $this->addWhere( 'ipb_deleted = 0 OR ipb_deleted IS NULL' );
-               }
-       }
-
        /** @} */
 
        /************************************************************************//**
@@ -609,5 +570,61 @@ abstract class ApiQueryBase extends ApiBase {
                );
        }
 
+       /**
+        * Preprocess the result set to fill the GenderCache with the necessary information
+        * before using self::addTitleInfo
+        *
+        * @param IResultWrapper $res Result set to work on.
+        *  The result set must have _namespace and _title fields with the provided field prefix
+        * @param string $fname The caller function name, always use __METHOD__
+        * @param string $fieldPrefix Prefix for fields to check gender for
+        */
+       protected function executeGenderCacheFromResultWrapper(
+               IResultWrapper $res, $fname = __METHOD__, $fieldPrefix = 'page'
+       ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $services = MediaWikiServices::getInstance();
+               $nsInfo = $services->getNamespaceInfo();
+               $namespaceField = $fieldPrefix . '_namespace';
+               $titleField = $fieldPrefix . '_title';
+
+               $usernames = [];
+               foreach ( $res as $row ) {
+                       if ( $nsInfo->hasGenderDistinction( $row->$namespaceField ) ) {
+                               $usernames[] = $row->$titleField;
+                       }
+               }
+
+               if ( $usernames === [] ) {
+                       return;
+               }
+
+               $genderCache = $services->getGenderCache();
+               $genderCache->doQuery( $usernames, $fname );
+       }
+
+       /** @} */
+
+       /************************************************************************//**
+        * @name   Deprecated methods
+        * @{
+        */
+
+       /**
+        * Filters hidden users (where the user doesn't have the right to view them)
+        * Also adds relevant block information
+        *
+        * @deprecated since 1.34, use ApiQueryBlockInfoTrait instead
+        * @param bool $showBlockInfo
+        * @return void
+        */
+       public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
+               wfDeprecated( __METHOD__, '1.34' );
+               return $this->addBlockInfoToQuery( $showBlockInfo );
+       }
+
        /** @} */
 }
diff --git a/includes/api/ApiQueryBlockInfoTrait.php b/includes/api/ApiQueryBlockInfoTrait.php
new file mode 100644 (file)
index 0000000..a3be356
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\Permissions\PermissionManager;
+
+/**
+ * @ingroup API
+ */
+trait ApiQueryBlockInfoTrait {
+       use ApiBlockInfoTrait;
+
+       /**
+        * Filters hidden users (where the user doesn't have the right to view them)
+        * Also adds relevant block information
+        *
+        * @param bool $showBlockInfo
+        * @return void
+        */
+       private function addBlockInfoToQuery( $showBlockInfo ) {
+               $db = $this->getDB();
+
+               if ( $showBlockInfo ) {
+                       $queryInfo = DatabaseBlock::getQueryInfo();
+               } else {
+                       $queryInfo = [
+                               'tables' => [ 'ipblocks' ],
+                               'fields' => [ 'ipb_deleted' ],
+                               'joins' => [],
+                       ];
+               }
+
+               $this->addTables( [ 'blk' => $queryInfo['tables'] ] );
+               $this->addFields( $queryInfo['fields'] );
+               $this->addJoinConds( $queryInfo['joins'] );
+               $this->addJoinConds( [
+                       'blk' => [ 'LEFT JOIN', [
+                               'ipb_user=user_id',
+                               'ipb_expiry > ' . $db->addQuotes( $db->timestamp() ),
+                       ] ],
+               ] );
+
+               // Don't show hidden names
+               if ( !$this->getPermissionManager()->userHasRight( $this->getUser(), 'hideuser' ) ) {
+                       $this->addWhere( 'ipb_deleted = 0 OR ipb_deleted IS NULL' );
+               }
+       }
+
+       /**
+        * @name Methods required from ApiQueryBase
+        * @{
+        */
+
+       /** @see ApiBase::getDB */
+       abstract protected function getDB();
+
+       /** @see ApiBase::getPermissionManager */
+       abstract protected function getPermissionManager(): PermissionManager;
+
+       /** @see IContextSource::getUser */
+       abstract public function getUser();
+
+       /** @see ApiQueryBase::addTables */
+       abstract protected function addTables( $tables, $alias = null );
+
+       /** @see ApiQueryBase::addFields */
+       abstract protected function addFields( $fields );
+
+       /** @see ApiQueryBase::addWhere */
+       abstract protected function addWhere( $conds );
+
+       /** @see ApiQueryBase::addJoinConds */
+       abstract protected function addJoinConds( $conds );
+
+       /**@}*/
+
+}
index fc88499..12fd20a 100644 (file)
@@ -40,8 +40,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
 
        protected function run( ApiPageSet $resultPageSet = null ) {
                $user = $this->getUser();
-               // Before doing anything at all, let's check permissions
-               $this->checkUserRightsAny( 'deletedhistory' );
 
                $pageSet = $this->getPageSet();
                $pageMap = $pageSet->getGoodAndMissingTitlesByNamespace();
@@ -95,8 +93,15 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                // This means stricter restrictions
-               if ( $this->fetchContent ) {
-                       $this->checkUserRightsAny( [ 'deletedtext', 'undelete' ] );
+               if ( ( $this->fld_comment || $this->fld_parsedcomment ) &&
+                       !$this->getPermissionManager()->userHasRight( $user, 'deletedhistory' )
+               ) {
+                       $this->dieWithError( 'apierror-cantview-deleted-comment', 'permissiondenied' );
+               }
+               if ( $this->fetchContent &&
+                       !$this->getPermissionManager()->userHasAnyRight( $user, 'deletedtext', 'undelete' )
+               ) {
+                       $this->dieWithError( 'apierror-cantview-deleted-revision-content', 'permissiondenied' );
                }
 
                $dir = $params['dir'];
@@ -130,8 +135,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
 
                if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
                        // Paranoia: avoid brute force searches (T19342)
-                       // (shouldn't be able to get here without 'deletedhistory', but
-                       // check it again just in case)
                        if ( !$this->getPermissionManager()->userHasRight( $user, 'deletedhistory' ) ) {
                                $bitmask = RevisionRecord::DELETED_USER;
                        } elseif ( !$this->getPermissionManager()
index eb787d1..a47ca09 100644 (file)
@@ -22,7 +22,8 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\NameTableAccessException;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Revision\SlotRecord;
 
 /**
  * Query module to enumerate all deleted revisions.
@@ -347,7 +348,9 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                        $anyHidden = true;
                                }
                                if ( Revision::userCanBitfield( $row->ar_deleted, RevisionRecord::DELETED_TEXT, $user ) ) {
-                                       ApiResult::setContentValue( $rev, 'text', Revision::getRevisionText( $row, 'ar_' ) );
+                                       ApiResult::setContentValue( $rev, 'text',
+                                               $revisionStore->newRevisionFromArchiveRow( $row )
+                                                       ->getContent( SlotRecord::MAIN )->serialize() );
                                }
                        }
 
index 97a9b0a..285c0bf 100644 (file)
@@ -387,9 +387,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
                $vals = [
                        ApiResult::META_TYPE => 'assoc',
                ];
+
+               // Some information will be unavailable if the file does not exist. T221812
+               $exists = $file->exists();
+
                // Timestamp is shown even if the file is revdelete'd in interface
                // so do same here.
-               if ( isset( $prop['timestamp'] ) ) {
+               if ( isset( $prop['timestamp'] ) && $exists ) {
                        $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $file->getTimestamp() );
                }
 
@@ -408,7 +412,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                $user = isset( $prop['user'] );
                $userid = isset( $prop['userid'] );
 
-               if ( $user || $userid ) {
+               if ( ( $user || $userid ) && $exists ) {
                        if ( $file->isDeleted( File::DELETED_USER ) ) {
                                $vals['userhidden'] = true;
                                $anyHidden = true;
@@ -428,7 +432,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                // This is shown even if the file is revdelete'd in interface
                // so do same here.
-               if ( isset( $prop['size'] ) || isset( $prop['dimensions'] ) ) {
+               if ( ( isset( $prop['size'] ) || isset( $prop['dimensions'] ) ) && $exists ) {
                        $vals['size'] = (int)$file->getSize();
                        $vals['width'] = (int)$file->getWidth();
                        $vals['height'] = (int)$file->getHeight();
@@ -449,7 +453,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                $pcomment = isset( $prop['parsedcomment'] );
                $comment = isset( $prop['comment'] );
 
-               if ( $pcomment || $comment ) {
+               if ( ( $pcomment || $comment ) && $exists ) {
                        if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
                                $vals['commenthidden'] = true;
                                $anyHidden = true;
@@ -500,7 +504,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                }
 
                if ( $url ) {
-                       if ( $file->exists() ) {
+                       if ( $exists ) {
                                if ( !is_null( $thumbParams ) ) {
                                        $mto = $file->transform( $thumbParams );
                                        self::$transformCount++;
@@ -529,8 +533,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        }
                                }
                                $vals['url'] = wfExpandUrl( $file->getFullUrl(), PROTO_CURRENT );
-                       } else {
-                               $vals['filemissing'] = true;
                        }
                        $vals['descriptionurl'] = wfExpandUrl( $file->getDescriptionUrl(), PROTO_CURRENT );
 
@@ -540,11 +542,15 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        }
                }
 
-               if ( $sha1 ) {
+               if ( !$exists ) {
+                       $vals['filemissing'] = true;
+               }
+
+               if ( $sha1 && $exists ) {
                        $vals['sha1'] = Wikimedia\base_convert( $file->getSha1(), 36, 16, 40 );
                }
 
-               if ( $meta ) {
+               if ( $meta && $exists ) {
                        Wikimedia\suppressWarnings();
                        $metadata = unserialize( $file->getMetadata() );
                        Wikimedia\restoreWarnings();
@@ -553,12 +559,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        }
                        $vals['metadata'] = $metadata ? static::processMetaData( $metadata, $result ) : null;
                }
-               if ( $commonmeta ) {
+               if ( $commonmeta && $exists ) {
                        $metaArray = $file->getCommonMetaArray();
                        $vals['commonmetadata'] = $metaArray ? static::processMetaData( $metaArray, $result ) : [];
                }
 
-               if ( $extmetadata ) {
+               if ( $extmetadata && $exists ) {
                        // Note, this should return an array where all the keys
                        // start with a letter, and all the values are strings.
                        // Thus there should be no issue with format=xml.
@@ -575,11 +581,11 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        $vals['extmetadata'] = $extmetaArray;
                }
 
-               if ( $mime ) {
+               if ( $mime && $exists ) {
                        $vals['mime'] = $file->getMimeType();
                }
 
-               if ( $mediatype ) {
+               if ( $mediatype && $exists ) {
                        $vals['mediatype'] = $file->getMediaType();
                }
 
@@ -589,7 +595,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                        $vals['archivename'] = $file->getArchiveName();
                }
 
-               if ( $bitdepth ) {
+               if ( $bitdepth && $exists ) {
                        $vals['bitdepth'] = $file->getBitDepth();
                }
 
index 47a6f87..2c19c7d 100644 (file)
@@ -186,6 +186,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                        // T71222: MariaDB's optimizer, at least 10.1.37 and .38, likes to choose a wildly bad plan for
                        // some reason for this code path. Tell it not to use the wrong index it wants to pick.
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->addOption( 'IGNORE INDEX', [ 'logging' => [ 'times' ] ] );
                }
 
index 26c17c5..12e908f 100644 (file)
@@ -61,7 +61,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
         * @param string $name
         * @return QueryPage
         */
-       private function getSpecialPage( $name ) {
+       private function getSpecialPage( $name ) : QueryPage {
                $qp = $this->specialPageFactory->getPage( $name );
                if ( !$qp ) {
                        self::dieDebug(
index 7e4a891..47212b3 100644 (file)
@@ -279,6 +279,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendNamespaces( $property ) {
+               $nsProtection = $this->getConfig()->get( 'NamespaceProtection' );
+
                $data = [
                        ApiResult::META_TYPE => 'assoc',
                ];
@@ -303,6 +305,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[$ns]['content'] = $nsInfo->isContent( $ns );
                        $data[$ns]['nonincludable'] = $nsInfo->isNonincludable( $ns );
 
+                       if ( isset( $nsProtection[$ns] ) ) {
+                               if ( is_array( $nsProtection[$ns] ) ) {
+                                       $specificNs = implode( "|", array_filter( $nsProtection[$ns] ) );
+                               } elseif ( $nsProtection[$ns] !== '' ) {
+                                       $specificNs = $nsProtection[$ns];
+                               }
+                               if ( isset( $specificNs ) && $specificNs !== '' ) {
+                                       $data[$ns]['namespaceprotection'] = $specificNs;
+                               }
+                       }
+
                        $contentmodel = $nsInfo->getNamespaceContentModel( $ns );
                        if ( $contentmodel ) {
                                $data[$ns]['defaultcontentmodel'] = $contentmodel;
index 1924ca0..c84de8c 100644 (file)
@@ -70,11 +70,37 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                }
        }
 
-       private $propertyFilter = [
+       private static $propertyFilter = [
                'user', 'userid', 'comment', 'parsedcomment',
                'mediatype', 'archivename', 'uploadwarning',
        ];
 
+       /**
+        * Returns all possible parameters to siiprop
+        *
+        * @param array|null $filter List of properties to filter out
+        * @return array
+        */
+       public static function getPropertyNames( $filter = null ) {
+               if ( $filter === null ) {
+                       $filter = self::$propertyFilter;
+               }
+               return parent::getPropertyNames( $filter );
+       }
+
+       /**
+        * Returns messages for all possible parameters to siiprop
+        *
+        * @param array|null $filter List of properties to filter out
+        * @return array
+        */
+       public static function getPropertyMessages( $filter = null ) {
+               if ( $filter === null ) {
+                       $filter = self::$propertyFilter;
+               }
+               return parent::getPropertyMessages( $filter );
+       }
+
        public function getAllowedParams() {
                return [
                        'filekey' => [
@@ -87,9 +113,9 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                        'prop' => [
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DFLT => 'timestamp|url',
-                               ApiBase::PARAM_TYPE => self::getPropertyNames( $this->propertyFilter ),
+                               ApiBase::PARAM_TYPE => self::getPropertyNames(),
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+imageinfo-param-prop',
-                               ApiBase::PARAM_HELP_MSG_PER_VALUE => self::getPropertyMessages( $this->propertyFilter )
+                               ApiBase::PARAM_HELP_MSG_PER_VALUE => self::getPropertyMessages()
                        ],
                        'urlwidth' => [
                                ApiBase::PARAM_TYPE => 'integer',
index ce51a67..0171a37 100644 (file)
  * @file
  */
 
+use MediaWiki\Block\DatabaseBlock;
+
 /**
  * Query module to get information about a list of users
  *
  * @ingroup API
  */
 class ApiQueryUsers extends ApiQueryBase {
+       use ApiQueryBlockInfoTrait;
 
        private $tokenFunctions, $prop;
 
@@ -150,7 +153,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                $this->addWhereFld( 'user_id', $userids );
                        }
 
-                       $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) );
+                       $this->addBlockInfoToQuery( isset( $this->prop['blockinfo'] ) );
 
                        $data = [];
                        $res = $this->select( __METHOD__ );
@@ -232,13 +235,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $data[$key]['hidden'] = true;
                                }
                                if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) {
-                                       $data[$key]['blockid'] = (int)$row->ipb_id;
-                                       $data[$key]['blockedby'] = $row->ipb_by_text;
-                                       $data[$key]['blockedbyid'] = (int)$row->ipb_by;
-                                       $data[$key]['blockedtimestamp'] = wfTimestamp( TS_ISO_8601, $row->ipb_timestamp );
-                                       $data[$key]['blockreason'] = $commentStore->getComment( 'ipb_reason', $row )
-                                               ->text;
-                                       $data[$key]['blockexpiry'] = $row->ipb_expiry;
+                                       $data[$key] += $this->getBlockDetails( DatabaseBlock::newFromRow( $row ) );
                                }
 
                                if ( isset( $this->prop['emailable'] ) ) {
index 7783826..6b1c217 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use MediaWiki\Auth\AuthManager;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Reset password, with AuthManager
@@ -63,7 +64,11 @@ class ApiResetPassword extends ApiBase {
 
                $this->requireOnlyOneParameter( $params, 'user', 'email' );
 
-               $passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+               $passwordReset = new PasswordReset(
+                       $this->getConfig(),
+                       AuthManager::singleton(),
+                       MediaWikiServices::getInstance()->getPermissionManager()
+               );
 
                $status = $passwordReset->isAllowed( $this->getUser() );
                if ( !$status->isOK() ) {
index 1ee91c2..60b24f0 100644 (file)
@@ -38,12 +38,6 @@ class ApiRevisionDelete extends ApiBase {
                $user = $this->getUser();
                $this->checkUserRightsAny( RevisionDeleter::getRestriction( $params['type'] ) );
 
-               // @TODO Use PermissionManager::isBlockedFrom() instead.
-               $block = $user->getBlock();
-               if ( $block ) {
-                       $this->dieBlocked( $block );
-               }
-
                if ( !$params['ids'] ) {
                        $this->dieWithError( [ 'apierror-paramempty', 'ids' ], 'paramempty_ids' );
                }
@@ -97,6 +91,10 @@ class ApiRevisionDelete extends ApiBase {
                        $this->dieWithError( [ 'apierror-revdel-needtarget' ], 'needtarget' );
                }
 
+               if ( $this->getPermissionManager()->isBlockedFrom( $user, $targetObj ) ) {
+                       $this->dieBlocked( $user->getBlock() );
+               }
+
                $list = RevisionDeleter::createList(
                        $params['type'], $this->getContext(), $targetObj, $params['ids']
                );
index 7e9f56d..3f6f14c 100644 (file)
@@ -93,13 +93,14 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        $titles = $pageSet->getGoodTitles();
                        $title = reset( $titles );
                        if ( $title ) {
-                               $revid = $title->getNextRevisionID( $params['newerthanrevid'], Title::READ_LATEST );
-                               if ( $revid ) {
-                                       $timestamp = $dbw->timestamp(
-                                               MediaWikiServices::getInstance()->getRevisionStore()->getTimestampFromId( $title, $revid )
-                                       );
-                               } else {
-                                       $timestamp = null;
+                               $timestamp = null;
+                               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+                               $currRev = $rl->getRevisionById( $params['newerthanrevid'], Title::READ_LATEST );
+                               if ( $currRev ) {
+                                       $nextRev = $rl->getNextRevision( $currRev, Title::READ_LATEST );
+                                       if ( $nextRev ) {
+                                               $timestamp = $dbw->timestamp( $nextRev->getTimestamp() );
+                                       }
                                }
                        }
                }
index aff0183..f2b52cd 100644 (file)
@@ -20,7 +20,6 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Revision\RevisionStore;
 
 /**
  * @ingroup API
@@ -28,7 +27,9 @@ use MediaWiki\Revision\RevisionStore;
  */
 class ApiTag extends ApiBase {
 
-       /** @var RevisionStore */
+       use ApiBlockInfoTrait;
+
+       /** @var \MediaWiki\Revision\RevisionStore */
        private $revisionStore;
 
        public function execute() {
@@ -40,9 +41,9 @@ class ApiTag extends ApiBase {
                // make sure the user is allowed
                $this->checkUserRightsAny( 'changetags' );
 
-               // @TODO Use PermissionManager::isBlockedFrom() instead.
+               // Fail early if the user is sitewide blocked.
                $block = $user->getBlock();
-               if ( $block ) {
+               if ( $block && $block->isSitewide() ) {
                        $this->dieBlocked( $block );
                }
 
@@ -85,6 +86,7 @@ class ApiTag extends ApiBase {
        }
 
        protected function processIndividual( $type, $params, $id ) {
+               $user = $this->getUser();
                $idResult = [ $type => $id ];
 
                // validate the ID
@@ -92,9 +94,32 @@ class ApiTag extends ApiBase {
                switch ( $type ) {
                        case 'rcid':
                                $valid = RecentChange::newFromId( $id );
+                               if ( $valid && $this->getPermissionManager()->isBlockedFrom( $user, $valid->getTitle() ) ) {
+                                       $idResult['status'] = 'error';
+                                       // @phan-suppress-next-line PhanTypeMismatchArgument
+                                       $idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
+                                               'apierror-blocked',
+                                               'blocked',
+                                               [ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
+                                       ) );
+                                       return $idResult;
+                               }
                                break;
                        case 'revid':
                                $valid = $this->revisionStore->getRevisionById( $id );
+                               if (
+                                       $valid &&
+                                       $this->getPermissionManager()->isBlockedFrom( $user, $valid->getPageAsLinkTarget() )
+                               ) {
+                                       $idResult['status'] = 'error';
+                                       // @phan-suppress-next-line PhanTypeMismatchArgument
+                                       $idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
+                                                       'apierror-blocked',
+                                                       'blocked',
+                                                       [ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
+                                       ) );
+                                       return $idResult;
+                               }
                                break;
                        case 'logid':
                                $valid = self::validateLogId( $id );
index 373ec11..4678e1f 100644 (file)
@@ -636,6 +636,7 @@ class ApiUpload extends ApiBase {
                                }
                                ApiResult::setIndexedTagName( $details, 'detail' );
                                $msg->setApiData( $msg->getApiData() + [ 'details' => $details ] );
+                               // @phan-suppress-next-line PhanTypeMismatchArgument
                                $this->dieWithError( $msg );
                                break;
 
index dc9c516..58d2dee 100644 (file)
        "apierror-cantoverwrite-sharedfile": "الملف الهدف موجود في مستودع مشترك وليست لديك صلاحية لتجاوزه.",
        "apierror-cantsend": "لم تقم بتسجيل الدخول أو ليس لديك عنوان بريد إلكتروني مؤكد أو غير مسموح لك بإرسال بريد إلكتروني إلى مستخدمين آخرين; لذلك لا يمكنك إرسال بريد إلكتروني.",
        "apierror-cantundelete": "تعذر الاسترجاع: قد لا تكون المراجعات المطلوبة موجودة، أو ربما تم الاسترجاع بالفعل.",
+       "apierror-cantview-deleted-comment": "ليست لديك صلاحية لعرض التعليقات المحذوفة.",
+       "apierror-cantview-deleted-description": "ليست لديك صلاحية لعرض أوصاف الملفات المحذوفة.",
+       "apierror-cantview-deleted-metadata": "ليست لديك صلاحية لعرض البيانات الوصفية للملفات المحذوفة.",
+       "apierror-cantview-deleted-revision-content": "ليست لديك صلاحية لعرض محتوى المراجعات المحذوفة.",
        "apierror-changeauth-norequest": "فشل في إنشاء طلب التغيير.",
        "apierror-chunk-too-small": "الحد الأدنى لحجم القطعة هو $1 {{PLURAL:$1|بايت}} للقطع غير النهائية.",
        "apierror-cidrtoobroad": "لا يُقبَل مدى $1 CIDR أكبر من /$2.",
index 35e45f1..cc5e872 100644 (file)
        "apierror-cantoverwrite-sharedfile": "The target file exists on a shared repository and you do not have permission to override it.",
        "apierror-cantsend": "You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email.",
        "apierror-cantundelete": "Couldn't undelete: the requested revisions may not exist, or may have been undeleted already.",
+       "apierror-cantview-deleted-comment": "You don't have permission to view deleted comments.",
        "apierror-cantview-deleted-description": "You don't have permission to view descriptions of deleted files.",
        "apierror-cantview-deleted-metadata": "You don't have permission to view metadata of deleted files.",
+       "apierror-cantview-deleted-revision-content": "You don't have permission to view content of deleted revisions.",
        "apierror-changeauth-norequest": "Failed to create change request.",
        "apierror-chunk-too-small": "Minimum chunk size is $1 {{PLURAL:$1|byte|bytes}} for non-final chunks.",
        "apierror-cidrtoobroad": "$1 CIDR ranges broader than /$2 are not accepted.",
index 628edfa..12ece4c 100644 (file)
                        "Lucas Werkmeister (WMDE)"
                ]
        },
-       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> L’API MediaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes à l’API, voyez [[Special:ApiSandbox]].</p>",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> l’API de MediaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion ''mediawiki-api-announce''] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes à l’API, voyez [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
-       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MediaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: paramètre Maxlag]] pour plus d’information.",
+       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MediaWiki est installé sur une grappe de réplication de base de données. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel : paramètre Maxlag]] pour plus d’informations.",
        "apihelp-main-param-smaxage": "Fixer l’entête HTTP de contrôle de cache <code>s-maxage</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
        "apihelp-main-param-maxage": "Fixer l’entête HTTP de contrôle de cache <code>max-age</code> à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
-       "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si la valeur est <kbd>user</kbd>, ou s’il a le droit d’un utilisateur robot si la valeur est <kbd>bot</kbd>.",
+       "apihelp-main-param-assert": "Vérifier que l’utilisateur est connecté lorsque la valeur est <kbd>user</kbd> ou qu’il a le droit d’un utilisateur robot lorsque la valeur est <kbd>bot</kbd>.",
        "apihelp-main-param-assertuser": "Vérifier que l’utilisateur actuel est l’utilisateur nommé.",
        "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.",
        "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
        "apierror-cantoverwrite-sharedfile": "Le fichier cible existe dans un dépôt partagé et vous n’avez pas le droit de l’écraser.",
        "apierror-cantsend": "Vous n’êtes pas connecté, vous n’avez pas d’adresse de courriel confirmée, ou vous n’êtes pas autorisé à envoyer des courriels aux autres utilisateurs, donc vous ne pouvez envoyer de courriel.",
        "apierror-cantundelete": "Impossible d’annuler : les révisions demandées peuvent ne plus exister, ou avoir déjà été annulées.",
+       "apierror-cantview-deleted-comment": "Vous n’avez pas la permission de visualiser les commentaires supprimés.",
+       "apierror-cantview-deleted-description": "Vous n’avez pas le droit d’afficher les descriptions des fichiers supprimés.",
+       "apierror-cantview-deleted-metadata": "Vous n’avez pas le droit d’afficher les métadonnées des fichiers supprimés.",
+       "apierror-cantview-deleted-revision-content": "Vous n’avez pas la permission de visualiser le contenu des révisions supprimées.",
        "apierror-changeauth-norequest": "Échec à la création de la requête de modification.",
        "apierror-chunk-too-small": "La taille minimale d’un segment est de $1 {{PLURAL:$1|octet|octets}} pour les segments hors le dernier.",
        "apierror-cidrtoobroad": "Les plages CIDR $1 plus large que /$2 ne sont pas acceptées.",
index cb4cd81..f6076b4 100644 (file)
@@ -47,6 +47,9 @@
        "apihelp-block-param-reblock": "Se o usuario xa está bloqueado, sobreescribir o bloqueo existente.",
        "apihelp-block-param-watchuser": "Vixiar a páxina de usuario ou direccións IP e a de conversa deste usuario",
        "apihelp-block-param-tags": "Cambiar as etiquetas a aplicar á entrada no rexistro de bloqueos.",
+       "apihelp-block-param-partial": "Bloquear a un usuario en determinadas páxinas ou espazos de nomes no canto de todo o sitio.",
+       "apihelp-block-param-pagerestrictions": "Lista de títulos que o bloqueo impedirá editar ó usuario. Só se aplica cando <var>partial</var> (parcial) está definido como 'true' (verdadeiro).",
+       "apihelp-block-param-namespacerestrictions": "Lista de identificadores de espazos de nomes que o bloqueo impedirá que edite o usuario. Só se aplica cando <var>partial</var> (parcial) está definido como 'true' (verdadeiro).",
        "apihelp-block-example-ip-simple": "Bloquear dirección IP <kbd>192.0.2.5</kbd> durante tres días coa razón <kbd>Primeiro aviso</kbd>.",
        "apihelp-block-example-user-complex": "Bloquear indefinidamente ó usuario <kbd>Vandal</kbd> coa razón <kbd>Vandalism</kbd>, e impedir a creación de novas contas e envío de correos electrónicos.",
        "apihelp-changeauthenticationdata-summary": "Cambiar os datos de autenticación do usuario actual.",
index e2c5fe7..e7cf3d4 100644 (file)
        "apihelp-query-param-indexpageids": "לכלול פסקת pageids נוספת עם רשימת כל מזהי הדף שהוחזרו.",
        "apihelp-query-param-export": "יצוא הגרסאות הנוכחיות של כל הדפים הנתונים המחוללים.",
        "apihelp-query-param-exportnowrap": "להחזיר את ה־XML של היצוא בלי לעטוף אותו בתוצאת XML (אותו תסדיר כמו [[Special:Export]]). אפשר להשתמש בזה רק עם $1export.",
+       "apihelp-query-param-exportschema": "להשתמש בגרסה הנתונה של תסדיר היטל XML בעת היצוא. יכול לשמש רק עם <var>$1export</var>.",
        "apihelp-query-param-iwurl": "האם לקבל את ה־URL המלא אם הכותרת היא קישור בינוויקי.",
        "apihelp-query-param-rawcontinue": "להחזיר נתוני <samp>query-continue</samp> גולמיים להמשך.",
        "apihelp-query-example-revisions": "אחזור [[Special:ApiHelp/query+siteinfo|site info]] ו־[[Special:ApiHelp/query+revisions|revisions]] של <kbd>Main Page</kbd>.",
        "apihelp-query+langlinks-param-inlanguagecode": "קוד שפה בשביל שמות שפות מתורגמות.",
        "apihelp-query+langlinks-example-simple": "קבלת קישורים בין־לשוניים מהדף <kbd>Main Page</kbd>.",
        "apihelp-query+languageinfo-summary": "מחזירה מידע על שפות זמינות.",
+       "apihelp-query+languageinfo-extended-description": "אפשר להחיל [[mw:API:Query#Continuing queries|המשך]] אם אחזור המידע לוקח יותר מדי זמן בשביל בקשה אחת.",
        "apihelp-query+languageinfo-param-prop": "איזה מידע לקבל עבור כל שפה.",
+       "apihelp-query+languageinfo-paramvalue-prop-code": "קוד השפה. (הקוד הזה ייחודי למדיה־ויקי, אם כי יש חפיפה עם תקנים אחרים.)",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "קוד שפת לפי BCP-47.",
        "apihelp-query+languageinfo-paramvalue-prop-dir": "כיוון הכתיבה של השפה (<code>ltr</code> או <code>rtl</code>).",
+       "apihelp-query+languageinfo-paramvalue-prop-autonym": "השם העצמי של השפה, כלומר השם באותה השפה.",
+       "apihelp-query+languageinfo-paramvalue-prop-name": "השם בשפה בשפה שצוינה בפרמטר <var>uselang</var>, עם שפת גיבוי כשזה נחוץ.",
+       "apihelp-query+languageinfo-paramvalue-prop-fallbacks": "קודי השפה של שפות הגיבוי שמוגדרים עבור השפה הזאת. הגיבוי המשתמע הסופי ל־\"en\" אינו כלול (אבל שפות אחדות יכולות להיות מגובות ב־\"en\" במפורש).",
+       "apihelp-query+languageinfo-paramvalue-prop-variants": "קודי השפה של ההגוונים שהשפה הזאת תומכת בהם.",
+       "apihelp-query+languageinfo-param-code": "קודי השפה של השפות שאמורות להיות מוחזרות, או <code>*</code> כדי לקבל את כל השפות.",
        "apihelp-query+languageinfo-example-simple": "קבלת קודי שפה של כל השפות הנתמכות.",
+       "apihelp-query+languageinfo-example-autonym-name-de": "קבלת השמות העצמיים והשמות הגרמניים של כל השפות הנתמכות.",
+       "apihelp-query+languageinfo-example-fallbacks-variants-oc": "קבלת שפות הגיבוי וההגוונים של אוקסיטנית.",
+       "apihelp-query+languageinfo-example-bcp47-dir": "קבלת קודי שפה ב־BCP-47 וכיוון עבור כל השפות הנתמכות.",
        "apihelp-query+links-summary": "החזרת כל הקישורים מהדפים שצוינו.",
        "apihelp-query+links-param-namespace": "להציג קישורים רק במרחבי השם האלה.",
        "apihelp-query+links-param-limit": "כמה קישורים להחזיר.",
        "api-help-param-templated-var-first": "יש להחליף את הטקסט <var>&#x7B;$1&#x7D;</var> (בשם הפרמטר) עם הערכים של הפרמטר <var>$2</var>",
        "api-help-param-templated-var": "<var>&#x7B;$1&#x7D;</var> עם הערכים של הפרמטר <var>$2</var>",
        "api-help-datatypes-header": "סוגי נתונים",
-       "api-help-datatypes": "קלט למדיה־ויקי צריך להיות בקידוד UTF-8 מנורמל ב־NFC. מדיה־ויקי יכולה לנסות להמיר קלט אחר, אבל זה עלול לגרום לפעולות מסוימות (כגון [[Special:ApiHelp/edit|עריכות]] עם בדיקות MD5) להיכשל.\n\nחלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלת. כל הזמנים מצוינים ב־ UTC, לא תהיה השפעה לשום אזור זמן שיצוין.\n:* תאריך ושעה לפי ISO 8601‏, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (לא חובה לכתוב פיסוק ו־<kbd>Z</kbd>)\n:* תאריך ושעה לפי ISO 8601 עם חלקי שנייה (שלא תהיה להם שום השפעה), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (לא חובה לכתוב קווים מפרידים, נקודתיים ו־<kbd>Z</kbd>)\n:* תסדיר MediaWiki‏, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* תסדיר מספרי כללי, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (לאזור זמן אופציונלי של <kbd>GMT</kbd>‏, <kbd dir=\"ltr\">+<var>##</var></kbd>, או <kbd dir=\"ltr\">-<var>##</var></kbd> אין השפעה)\n:* תסדיר EXIF‏, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 2822 (אפשר להשמיט את אזור הזמן), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 850 (אפשר להשמיט את אזור הזמן), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר C ctime‏, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* שניות מאז 1970-01-01T00:00:00Z בתור מספר שלך בין 1 ל־13 (לא כולל <kbd>0</kbd>)\n:* המחרוזת <kbd>now</kbd>\n;מפריד ערכים מרובים חלופי\n:פרמטרים שלוקחים ערכים מרובים בדרך־כלל נשלחים עם הערכים מופרדים באמצעות תו מקל, למשל <kbd>param=value1|value2</kbd> או <kbd>param=value1%7Cvalue2</kbd>. אם הערך צריך להכיל את תו המקל, יש להשתמש ב־U+001F (מפריד יחידות) בתור המפריד ''וגם'' להוסיף לתחילת הערך U+001F, למשל <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
+       "api-help-datatypes": "קלט למדיה־ויקי צריך להיות בקידוד UTF-8 מנורמל ב־NFC. מדיה־ויקי יכולה לנסות להמיר קלט אחר, אבל זה עלול לגרום לפעולות מסוימות (כגון [[Special:ApiHelp/edit|עריכות]] עם בדיקות MD5) להיכשל.\n\nחלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים, ר' את [[mw:Special:MyLanguage/Timestamp|תיעוד תסדירי הקלט של ספריית Timestamp באתר mediawiki.org]] לפרטים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלץ: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>. בנוסף, המחרוזת <kbd>now</kbd> יכולה לשמש לציון חום־הזמן הנוכחי.\n;מפריד ערכים מרובים חלופי\n:פרמטרים שלוקחים ערכים מרובים בדרך־כלל נשלחים עם הערכים מופרדים באמצעות תו מקל, למשל <kbd>param=value1|value2</kbd> או <kbd>param=value1%7Cvalue2</kbd>. אם הערך צריך להכיל את תו המקל, יש להשתמש ב־U+001F (מפריד יחידות) בתור המפריד ''וגם'' להוסיף לתחילת הערך U+001F, למשל <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
        "api-help-templatedparams-header": "פרמטרים בתבניות",
        "api-help-templatedparams": "התכונה \"פרמטרים בתבניות\" תומכת במקרים שבהם מודול של API זקוק לערך כלשהו עבור ערכים של פרמטרים אחרים. למשל, אם היה מודול API לבקשת פרי, ייתכן שהוא היה זקוק לפרמטר בשם <var>פירות</var> על־מנת לציין מהם הפירות המבוקשים, ולפרמטר בתבנית בשם <var>{פרי}-כמות</var> על־מנת לציין את הכמות של כל פרי עבור הבקשה. לשם כך, לקוח API שמעוניין לקבל תפוח אחד, 5 בננות ו־20 תותים יכול היה ליצור בקשה בסגנון <kbd>פירות=תפוחים|בננות|תותים&תפוחים-כמות=1&בננות-כמות=5&תותים-כמות=20</kbd>.",
        "api-help-param-type-limit": "סוג: מספר שלם או <kbd>max</kbd>",
        "apierror-cantoverwrite-sharedfile": "קובץ היעד קיים במאגר משותף ואין לך הרשאה לעקוף אותו.",
        "apierror-cantsend": "לא נכנסת לחשבון, אין לך חשבון דואר אלקטרוני מאושר, או שאסור לך לשלוח דואר אלקטרוני למשתמשים אחרים, ולכן אין לך אפשרות לשלוח דואר אלקטרוני.",
        "apierror-cantundelete": "לא היה אפשר לשחזר ממחיקה: אולי הגרסאות המבוקשות אינן קיימות, ואולי הן כבר נמחקו.",
+       "apierror-cantview-deleted-comment": "אין לך הרשאה לצפות בהערות מחוקות.",
+       "apierror-cantview-deleted-description": "אין לך הרשאה לצפות בתיאורים של קבצים מחוקים.",
+       "apierror-cantview-deleted-metadata": "אין לך הרשאה לצפות במטא־נתונים של קבצים מחוקים.",
+       "apierror-cantview-deleted-revision-content": "אין לך הרשאה לצפות בתוכן של גרסאות מחוקות.",
        "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
        "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
        "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
        "apiwarn-deprecation-missingparam": "מכיוון שלא צוין <var>$1</var>, ישמש תסדיר ישן לפלט. התסדיר הזה מוכרז בתור מיושן, ובעתיד ישמש רק התסדיר החדש.",
        "apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
+       "apiwarn-deprecation-post-without-content-type": "בקשת POST נעשתה ללא כותר <code>Content-Type</code>. זה לא עובד באופן מהימן.",
        "apiwarn-deprecation-purge-get": "שימוש ב־<kbd>action=purge</kbd> דרך GET מיושן. יש להשתמש ב־POST במקום זה.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> מיושן. יש להשתמש ב־<kbd>$2</kbd> במקום זה.",
        "apiwarn-difftohidden": "לא היה אפשר לעשות השוואה עם גרסה $1: התוכן מוסתר.",
index e29c34a..9d5d349 100644 (file)
        "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta <samp>UI</samp> o <samp>REDIRECT</samp>. È necessario fornirlo, oppure fornire <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> con <kbd>amirequestsfor=$1</kbd> (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.",
        "apierror-bad-badfilecontexttitle": "Titolo non valido nel parametro <var>$1badfilecontexttitle</var>.",
+       "apierror-cantview-deleted-description": "Non si dispone dei permessi necessari per vedere le descrizioni dei file cancellati.",
+       "apierror-cantview-deleted-metadata": "Non si dispone dei permessi necessari per vedere i metadati dei file cancellati.",
+       "apierror-cantview-deleted-revision-content": "Non si dispone dei permessi necessari per vedere il contenuto delle versioni cancellate.",
        "apierror-compare-notext": "Il parametro <var>$1</var> non può essere usato senza <var>$2</var>.",
        "apierror-invalidoldimage": "Il parametro <var>oldimage</var> ha un formato non valido.",
        "apierror-invaliduserid": "L'ID utente <var>$1</var> non è valido.",
index acdb05c..eb588c2 100644 (file)
        "apihelp-edit-param-summary": "編集の要約。$1section=new で $1sectiontitle が設定されていない場合は節名としても利用されます。",
        "apihelp-edit-param-tags": "この版に適用する変更タグ。",
        "apihelp-edit-param-minor": "この編集に細部の変更の印を付ける",
-       "apihelp-edit-param-notminor": "細部の編集ではない。",
+       "apihelp-edit-param-notminor": "利用者設定で「{{int:tog-minordefault}}」を指定してあっても、細部の編集とマークしないでください。",
        "apihelp-edit-param-bot": "この編集をボットの編集としてマークする。",
        "apihelp-edit-param-basetimestamp": "編集前の版のタイムスタンプ。編集競合を検出するために使用されます。\n[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]] で取得できます。",
        "apihelp-edit-param-starttimestamp": "編集作業を開始したときのタイムスタンプ。編集競合を検出するために使用されます。適切な値は <var>[[Special:ApiHelp/main|curtimestamp]]</var> を使用して編集作業を開始するとき (たとえば、編集するページの本文を読み込んだとき) に取得できます。",
        "apihelp-options-example-change": "<kbd>skin</kbd> および <kbd>hideminor</kbd> の個人設定を変更する。",
        "apihelp-options-example-complex": "すべての個人設定を初期化し、<kbd>skin</kbd> および <kbd> nickname </kbd> を設定する。",
        "apihelp-paraminfo-summary": "API モジュールに関する情報を取得します。",
-       "apihelp-paraminfo-param-modules": "モジュールの名前のリスト (<var>action</var> および <var>format</var> パラメーターの値, または <kbd>main</kbd>). <kbd>+</kbd> を使用して下位モジュールを指定できます。",
+       "apihelp-paraminfo-param-modules": "モジュール名のリスト (<var>action</var> および <var>format</var> パラメーターまたは <kbd>main</kbd>の値)。特定の下位モジュールの指定は<kbd>+</kbd> 、全下位モジュールの指定は<kbd>+*</kbd>を使い、あるいは<kbd>+**</kbd>ですべての下位モジュールを再帰的に指定します。",
        "apihelp-paraminfo-param-helpformat": "ヘルプ文字列の形式。",
        "apihelp-paraminfo-param-querymodules": "クエリモジュール名のリスト (<var>prop</var>, <var>meta</var> or <var>list</var> パラメータの値)。<kbd>$1querymodules=foo</kbd> の代わりに <kbd>$1modules=query+foo</kbd> を使用してください。",
        "apihelp-paraminfo-example-1": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>, and <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> に関する情報を表示する。",
        "apihelp-parse-paramvalue-prop-revid": "構文解析されたページの版IDを追加します。",
        "apihelp-parse-paramvalue-prop-displaytitle": "構文解析されたウィキテキストのタイトルを追加します。",
        "apihelp-parse-paramvalue-prop-headitems": "ページの <code>&lt;head&gt;</code> の中に入れてアイテムを提供します。",
-       "apihelp-parse-paramvalue-prop-headhtml": "ページの解析された <code>&lt;head&gt;</code> を与える。",
+       "apihelp-parse-paramvalue-prop-headhtml": "ページの<code>&lt;html&gt;</code>と<code>&lt;head&gt;</code>の要素を開いて<code>&lt;body&gt;</code>を開示し、Doctype を解析する。",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "ページに固有のJavaScriptの設定変数を提供します。適用するには、<code>mw.config.set()</code>を使用します。",
        "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "JSON文字列としてページに固有のJavaScriptの設定変数を提供します。",
        "apihelp-parse-paramvalue-prop-indicators": "ページ上で使用されるページのステータスインジケータのHTMLを提供します。",
index c029636..6f390f9 100644 (file)
@@ -16,7 +16,8 @@
                        "Jonghaya",
                        "Jerrykim306",
                        "코코아",
-                       "Macofe"
+                       "Macofe",
+                       "렌즈"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|설명문서]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 알림 사항]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청]\n</div>\n<strong>상태:</strong> 이 페이지에 보이는 모든 기능은 정상적으로 작동하지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 변경될 수 있습니다. 업데이트 공지를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 \"MediaWiki-API-Error\" 키가 포함된 HTTP 헤더가 전송되며 반환되는 헤더와 오류 코드의 값은 모두 동일한 값으로 설정됩니다. 자세한 정보에 대해서는 [[mw:Special:MyLanguage/API:Errors and warnings/ko|API:오류와 경고]]를 참조하십시오.\n\n<strong>테스트하기:</strong> API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.",
        "apihelp-compare-paramvalue-prop-title": "'from'과 'to' 판의 문서 제목입니다.",
        "apihelp-compare-paramvalue-prop-user": "'from'과 'to' 판의 사용자 이름과 ID입니다.",
        "apihelp-compare-paramvalue-prop-comment": "'from'과 'to' 판의 설명입니다.",
-       "apihelp-compare-paramvalue-prop-parsedcomment": "'from'과 to' 판의 구문 분석된 설명입니다.",
+       "apihelp-compare-paramvalue-prop-parsedcomment": "'from'과 to' 판의 변환된 설명입니다.",
        "apihelp-compare-paramvalue-prop-size": "'from'과 'to' 판의 크기입니다.",
        "apihelp-compare-example-1": "판 1과 2의 차이를 생성합니다.",
        "apihelp-createaccount-summary": "새 사용자 계정을 만듭니다.",
        "apihelp-options-example-complex": "모든 환경 설정을 초기화하고 <kbd>skin</kbd>과 <kbd>nickname</kbd>을 설정합니다.",
        "apihelp-paraminfo-summary": "API 모듈의 정보를 가져옵니다.",
        "apihelp-paraminfo-param-helpformat": "도움말 문자열 포맷.",
-       "apihelp-parse-summary": "ë\82´ì\9a©ì\9d\98 êµ¬ë¬¸ì\9d\84 ë¶\84ì\84\9dí\95\98ê³  í\8c\8cì\84\9c 출력을 반환합니다.",
-       "apihelp-parse-param-summary": "구문 분석할 요약입니다.",
-       "apihelp-parse-paramvalue-prop-text": "위키텍스트의 구문 분석된 텍스트를 제공합니다.",
-       "apihelp-parse-paramvalue-prop-langlinks": "구문 분석된 위키텍스트의 언어 링크를 제공합니다.",
-       "apihelp-parse-paramvalue-prop-categories": "구문 분석된 위키텍스트의 분류를 제공합니다.",
+       "apihelp-parse-summary": "ë\82´ì\9a©ì\9d\84 ë³\80í\99\98í\95\98ê³  출력을 반환합니다.",
+       "apihelp-parse-param-summary": "변환할 요약입니다.",
+       "apihelp-parse-paramvalue-prop-text": "위키텍스트로 변환된 텍스트를 제공합니다.",
+       "apihelp-parse-paramvalue-prop-langlinks": "언어 링크를 위키텍스트로 변환하여 제공합니다.",
+       "apihelp-parse-paramvalue-prop-categories": "분류를 변환된 위키텍스트로 제공합니다.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "분류의 HTML 버전을 제공합니다.",
-       "apihelp-parse-paramvalue-prop-links": "구문 분석된 위키텍스트의 내부 링크를 제공합니다.",
-       "apihelp-parse-paramvalue-prop-templates": "구문 분석된 위키텍스트의 틀을 제공합니다.",
-       "apihelp-parse-paramvalue-prop-images": "구문 ë¶\84ì\84\9dë\90\9c ì\9c\84í\82¤í\85\8dì\8a¤í\8a¸ì\9d\98 ê·¸ë¦¼ì\9d\84 제공합니다.",
-       "apihelp-parse-paramvalue-prop-externallinks": "구문 분석된 위키텍스트의 외부 링크를 제공합니다.",
-       "apihelp-parse-paramvalue-prop-sections": "구문 분석된 위키텍스트의 문단을 제공합니다.",
-       "apihelp-parse-paramvalue-prop-revid": "구문 분석된 페이지의 판 ID를 추가합니다.",
-       "apihelp-parse-paramvalue-prop-displaytitle": "구문 분석된 위키텍스트의 제목을 추가합니다.",
+       "apihelp-parse-paramvalue-prop-links": "내부 링크를 위키텍스트로 변환하여 제공합니다.",
+       "apihelp-parse-paramvalue-prop-templates": "틀을 변환된 위키텍스트로 제공합니다.",
+       "apihelp-parse-paramvalue-prop-images": "그림ì\9d\84 ì\9c\84í\82¤í\85\8dì\8a¤í\8a¸ë¡\9c ë³\80í\99\98í\95\98ì\97¬ 제공합니다.",
+       "apihelp-parse-paramvalue-prop-externallinks": "외부 링크를 위키텍스트로 변환하여 제공합니다.",
+       "apihelp-parse-paramvalue-prop-sections": "문단을 변환된 위키텍스트로 제공합니다.",
+       "apihelp-parse-paramvalue-prop-revid": "변환할 페이지의 판 ID를 추가합니다.",
+       "apihelp-parse-paramvalue-prop-displaytitle": "제목을 변환된 위키텍스트로 추가합니다.",
        "apihelp-parse-paramvalue-prop-headitems": "문서의 <code>&lt;head&gt;</code> 안에 넣을 항목을 제공합니다.",
-       "apihelp-parse-paramvalue-prop-headhtml": "문서의 구문 분석된 <code>&lt;head&gt;</code>를 제공합니다.",
+       "apihelp-parse-paramvalue-prop-headhtml": "문서의 파싱된 doctype, 여는 <code>&lt;html&gt;</code>, <code>&lt;head&gt;</code>, <code>&lt;body&gt;</code>를 제공합니다.",
        "apihelp-parse-paramvalue-prop-modules": "문서에 사용되는 ResourceLoader 모듈을 제공합니다. 불러오려면, <code>mw.loader.using()</code>을 사용하세요. <kbd>jsconfigvars</kbd> 또는 <kbd>encodedjsconfigvars</kbd>는 <kbd>modules</kbd>와 함께 요청해야 합니다.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "문서에 특화된 자바스크립트 구성 변수를 제공합니다. 적용하려면 <code>mw.config.set()</code>을 사용하세요.",
-       "apihelp-parse-paramvalue-prop-iwlinks": "구문 분석된 위키텍스트의 인터위키 링크를 제공합니다.",
-       "apihelp-parse-paramvalue-prop-wikitext": "구문 분석된 위키텍스트 원문을 제공합니다.",
-       "apihelp-parse-paramvalue-prop-properties": "구문 분석된 위키텍스트에 정의된 다양한 속성을 제공합니다.",
-       "apihelp-parse-param-pst": "구문 분석 이전에 입력에 대한 사전 저장 변환을 수행합니다. 텍스트로 사용할 때에만 유효합니다.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "인터위키 링크를 위키텍스트로 변환하여 제공합니다.",
+       "apihelp-parse-paramvalue-prop-wikitext": "변환한 원문 위키텍스트를 제공합니다.",
+       "apihelp-parse-paramvalue-prop-properties": "정의된 다양한 속성을 변환된 위키텍스트로 제공합니다.",
+       "apihelp-parse-param-pst": "파싱에 앞서 입력에 대한 저장 직전의 변환을 수행합니다. 텍스트로 사용할 때에만 유효합니다.",
        "apihelp-parse-param-disablelimitreport": "파서 출력에서 제한 보고서(\"NewPP limit report\")를 제외합니다.",
        "apihelp-parse-param-disablepp": "<var>$1disablelimitreport</var>를 대신 사용합니다.",
        "apihelp-parse-param-disableeditsection": "파서 출력에서 문단 편집 링크를 제외합니다.",
        "apihelp-parse-param-disabletidy": "파서 출력에서 HTML 정리(예: tidy)를 수행하지 않습니다.",
-       "apihelp-parse-param-preview": "미리 보기 모드에서 구문 분석을 합니다.",
-       "apihelp-parse-param-sectionpreview": "문단 미리 보기 모드에서 구문 분석을 합니다. (미리 보기 모드도 활성화함)",
+       "apihelp-parse-param-preview": "미리 보기 모드에서 파싱합니다.",
+       "apihelp-parse-param-sectionpreview": "문단 미리 보기 모드에서 파싱합니다. (미리 보기 모드도 활성화함)",
        "apihelp-parse-param-disabletoc": "출력에서 목차를 제외합니다.",
        "apihelp-parse-param-useskin": "선택한 스킨을 파서 출력에 적용합니다. 다음의 속성에 영향을 줄 수 있습니다: <kbd>langlinks</kbd>, <kbd>headitems</kbd>, <kbd>modules</kbd>, <kbd>jsconfigvars</kbd>, <kbd>indicators</kbd>.",
        "apihelp-parse-param-contentformat": "입력 텍스트에 사용할 내용 직렬화 포맷입니다. $1text와 함께 사용할 때에만 유효합니다.",
-       "apihelp-parse-example-page": "페이지의 구문을 분석합니다.",
+       "apihelp-parse-example-page": "페이지를 파싱합니다.",
        "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.",
-       "apihelp-parse-example-summary": "요약을 구문 분석합니다.",
+       "apihelp-parse-example-summary": "요약을 변환합니다.",
        "apihelp-patrol-summary": "문서나 판을 점검하기.",
        "apihelp-patrol-param-rcid": "점검할 최근 바뀜 ID입니다.",
        "apihelp-patrol-param-revid": "점검할 판 ID입니다.",
        "apihelp-query+imageinfo-summary": "파일 정보와 업로드 역사를 반환합니다.",
        "apihelp-query+imageinfo-param-prop": "가져올 파일 정보입니다:",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "업로드된 판에 대한 타임스탬프를 추가합니다.",
-       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "판의 설명을 구문 분석합니다.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "판의 설명을 변환합니다.",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "파일에 대한 SHA-1 해시를 추가합니다.",
        "apihelp-query+imageinfo-paramvalue-prop-mediatype": "파일의 미디어 유형을 추가합니다.",
        "apihelp-query+imageinfo-param-urlheight": "$1urlwidth와 유사합니다.",
        "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "판의 콘텐츠 모델 ID.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "판의 텍스트.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "판의 태그.",
-       "apihelp-query+revisions+base-param-parse": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>를 ë\8c\80ì\8b  ì\82¬ì\9a©í\95©ë\8b\88ë\8b¤. í\8c\90 ë\82´ì\9a©ì\9d\98 êµ¬ë¬¸ì\9d\84 ë¶\84ì\84\9d합니다. ($1prop=content 필요) 성능 상의 이유로 이 옵션을 사용할 경우 $1limit은 1로 강제됩니다.",
+       "apihelp-query+revisions+base-param-parse": "<kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>를 ë\8c\80ì\8b  ì\82¬ì\9a©í\95\98ì\84¸ì\9a\94. í\8c\90 ë\82´ì\9a©ì\9d\84 í\8c\8cì\8b±합니다. ($1prop=content 필요) 성능 상의 이유로 이 옵션을 사용할 경우 $1limit은 1로 강제됩니다.",
        "apihelp-query+search-summary": "전문 검색을 수행합니다.",
        "apihelp-query+search-param-qiprofile": "쿼리 독립적인 프로파일 사용(순위 알고리즘에 영향있음)",
        "apihelp-query+search-paramvalue-prop-size": "바이트 단위로 문서의 크기를 추가합니다.",
        "apierror-cantimport-upload": "업로드된 페이지를 가져올 권한이 없습니다.",
        "apierror-cantimport": "페이지를 가져올 권한이 없습니다.",
        "apierror-cantsend": "로그인하지 않았거나 인증된 이메일 주소가 없거나 다른 사용자로 이메일을 보낼 권한이 없기 때문에 이메일을 보낼 수 없습니다.",
+       "apierror-cantview-deleted-description": "삭제된 파일의 설명을 볼 권한이 없습니다.",
+       "apierror-cantview-deleted-metadata": "삭제된 파일의 메타데이터를 볼 권한이 없습니다.",
+       "apierror-cantview-deleted-revision-content": "삭제된 판의 내용을 볼 권한이 없습니다.",
        "apierror-compare-maintextrequired": "<var>$1slots</var>에 <kbd>main</kbd>이 포함되어 있다면 <var>$1text-main</var> 변수는 필수입니다. (메인 슬롯을 삭제할 수 없습니다)",
        "apierror-compare-notext": "<var>$1</var> 변수는 <var>$2</var> 없이 사용할 수 없습니다.",
        "apierror-emptynewsection": "비어있는 새 문단을 만들 수 없습니다.",
index 907be26..51350a1 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Zygimantus",
                        "Eitvys200",
-                       "Hugo.arg"
+                       "Hugo.arg",
+                       "Homo"
                ]
        },
        "apihelp-main-param-action": "Kurį veiksmą atlikti.",
@@ -19,7 +20,7 @@
        "apihelp-createaccount-summary": "Kurti naują vartotojo paskyrą.",
        "apihelp-delete-summary": "Ištrinti puslapį.",
        "apihelp-delete-param-watch": "Pridėti puslapį prie dabartinio vartotojo stebimųjų sąrašo.",
-       "apihelp-delete-param-unwatch": "Pašalinti puslapį iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-delete-param-unwatch": "Pašalinti puslapį iš dabartinio naudotojo stebimųjų sąrašo.",
        "apihelp-delete-example-simple": "Ištrinti <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Ištrinti <kbd>Main Page</kbd> su priežastimi <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-summary": "Šis modulis buvo išjungtas.",
@@ -36,7 +37,7 @@
        "apihelp-edit-param-createonly": "Neredaguoti puslapio jei jis jau egzistuoja.",
        "apihelp-edit-param-nocreate": "Parodyti klaidą, jei puslapis neegzistuoja.",
        "apihelp-edit-param-watch": "Pridėti puslapį į dabartinio vartotojo stebimųjų sąrašą.",
-       "apihelp-edit-param-unwatch": "Pašalinti puslapį iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-edit-param-unwatch": "Pašalinti puslapį iš dabartinio naudotojo stebimųjų sąrašo.",
        "apihelp-edit-param-redirect": "Automatiškai išspręsti peradresavimus.",
        "apihelp-edit-param-contentmodel": "Naujam turiniui taikomas turinio modelis.",
        "apihelp-edit-example-edit": "Redaguoti puslapį.",
        "apihelp-move-param-movetalk": "Pervadinti aptarimo puslapį, jei jis egzistuoja.",
        "apihelp-move-param-noredirect": "Nekurti nukreipimo.",
        "apihelp-move-param-watch": "Pridėti puslapį ir nukreipimą į dabartinio vartotojo stebimųjų sąrašą.",
-       "apihelp-move-param-unwatch": "Pašalinti puslapį ir nukreipimą iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-move-param-unwatch": "Pašalinti puslapį ir nukreipimą iš dabartinio naudotojo stebimųjų sąrašo.",
        "apihelp-move-param-ignorewarnings": "Ignuoruoti bet kokius įspėjimus.",
        "apihelp-move-example-move": "Perkelti <kbd>Badtitle</kbd> į <kbd>Goodtitle</kbd> nepaliekant nukreipimo.",
        "apihelp-opensearch-summary": "Ieškoti viki naudojant OpenSearch protokolą.",
        "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
        "apihelp-query+watchlist-paramvalue-type-log": "Žurnalo įrašai.",
        "apihelp-resetpassword-param-user": "Iš naujo nustatomas vartotojas.",
-       "apihelp-resetpassword-param-email": "Iš naujo nustatomo vartotojo el. pašto adresas.",
+       "apihelp-resetpassword-param-email": "Iš naujo nustatomo naudotojo el. pašto adresas.",
        "apihelp-setpagelanguage-summary": "Keisti puslapio kalbą.",
        "apihelp-setpagelanguage-param-reason": "Keitimo priežastis.",
        "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
index 59553e9..f72c344 100644 (file)
@@ -73,7 +73,7 @@
        "apihelp-edit-param-summary": "Опис на уредувањето. Ова е и назив на поднасловот кога не се зададени $1section=new и $1sectiontitle.",
        "apihelp-edit-param-tags": "Ознаки за измена што се однесуваат на преработката.",
        "apihelp-edit-param-minor": "Означи го уредувањево како ситно.",
-       "apihelp-edit-param-notminor": "Ð\9dеÑ\81иÑ\82но Ñ\83Ñ\80едÑ\83ваÑ\9aе.",
+       "apihelp-edit-param-notminor": "Ð\94а Ð½Ðµ Ñ\81е Ð¾Ð´Ð±ÐµÐ»ÐµÐ¶Ñ\83ва Ð¾Ð²Ð° Ñ\83Ñ\80едÑ\83ваÑ\9aе ÐºÐ°ÐºÐ¾ Ñ\81иÑ\82но Ð´Ñ\83Ñ\80и Ð¸ Ð¿Ñ\80и Ð¿Ð¾Ñ\81Ñ\82авена ÐºÐ¾Ñ\80иÑ\81ниÑ\87каÑ\82а Ð¿Ð¾Ñ\81Ñ\82авка â\80\9e{{int:tog-minordefаult}}â\80\9c.",
        "apihelp-edit-param-bot": "Означи го уредувањето како ботовско.",
        "apihelp-edit-param-basetimestamp": "Датум и време на преработката на базата, кои се користат за утврдување на спротиставености во уредувањето. Може да се добие преку [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "Датум и време кога сте почнало уредувањето, кои се користат за утврдување на спротиставености во уредувањата. Соодветната вредност се добива користејќи <var>[[Special:ApiHelp/main|curtimestamp]]</var> кога ќе почнете со уредување (на пр. кога ќе се вчита содржината што ќе ја уредувате).",
        "apierror-cantchangecontentmodel": "Немате дозвола за менување содржинскиот модел на страница.",
        "apierror-cantimport-upload": "Немате дозвола да увезувате подигнати страници.",
        "apierror-cantimport": "Немате дозвола за увезуваање страници.",
+       "apierror-cantview-deleted-comment": "Немате дозвола за прегледување на избришаните коментари.",
+       "apierror-cantview-deleted-description": "Немате дозвола за прегледување описи на избришаните податотеки.",
+       "apierror-cantview-deleted-metadata": "Немате дозвола за прегледување метаподатоци на избришаните податотеки.",
+       "apierror-cantview-deleted-revision-content": "Немате дозвола за прегледување содржина на избришаните преработки.",
        "apierror-copyuploadbaddomain": "Подигањето преку URL не е дозволено од овој домен.",
        "apierror-copyuploadbadurl": "Подигањето не е дозволено од оваа URL-адреса.",
        "apierror-emptynewsection": "Создавањето на нови празни поднаслови не е дозволено.",
index e71a9dc..65a0913 100644 (file)
@@ -17,7 +17,8 @@
                        "InternerowyGołąb",
                        "CiaPan",
                        "Vlad5250",
-                       "Railfail536"
+                       "Railfail536",
+                       "Rail"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentacja]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista dyskusyjna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ogłoszenia dotyczące API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Błędy i propozycje]\n</div>\n<strong>Stan:</strong> Wszystkie funkcje opisane na tej stronie powinny działać, ale API nadal jest aktywnie rozwijane i mogą się zmienić w dowolnym czasie. Subskrybuj [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ listę dyskusyjną mediawiki-api-announce], aby móc na bieżąco dowiadywać się o aktualizacjach.\n\n<strong>Błędne żądania:</strong> Gdy zostanie wysłane błędne żądanie do API, zostanie wysłany w odpowiedzi nagłówek HTTP z kluczem \"MediaWiki-API-Error\" i zarówno jego wartość jak i wartość kodu błędu wysłanego w odpowiedzi będą miały taką samą wartość. Aby uzyskać więcej informacji, zobacz [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Błędy i ostrzeżenia]].\n\n<strong>Testowanie:</strong> Aby łatwo testować żądania API, zobacz [[Special:ApiSandbox]].",
        "apierror-cantimport": "Nie masz uprawnień do importowania stron.",
        "apierror-cantsend": "Nie jesteś zalogowany, nie masz potwierdzonego adresu e-mail, albo nie masz prawa wysyłać e-maili do innych użytkowników, więc nie możesz wysłać wiadomości e-mail.",
        "apierror-cantundelete": "Nie można przywrócić: dana wersja nie istnieje albo została już przywrócona.",
+       "apierror-cantview-deleted-comment": "Nie masz uprawnień do podglądu usuniętych komentarzy.",
+       "apierror-cantview-deleted-description": "Nie masz uprawnień do podglądu opisów usuniętych plików.",
+       "apierror-cantview-deleted-metadata": "Nie masz uprawnień do podglądu metadanych usuniętych plików.",
+       "apierror-cantview-deleted-revision-content": "Nie masz uprawnień do podglądu treści usuniętych wersji.",
        "apierror-exceptioncaught": "[$1] Stwierdzono wyjątek: $2",
        "apierror-filedoesnotexist": "Plik nie istnieje.",
        "apierror-import-unknownerror": "Nieznany błąd podczas importowania: $1.",
index 6e2c1f1..77f927d 100644 (file)
        "apierror-cantoverwrite-sharedfile": "O arquivo de destino existe em um repositório compartilhado e você não tem permissão para substituí-lo.",
        "apierror-cantsend": "Você não está logado, não possui um endereço de e-mail confirmado ou não tem permissão para enviar e-mails para outros usuários, por isso não pode enviar e-mails.",
        "apierror-cantundelete": "Não foi possível recuperar arquivos: as revisões solicitadas podem não existir ou talvez já tenham sido eliminadas.",
+       "apierror-cantview-deleted-comment": "Você não tem permissão para visualizar comentários excluídos.",
+       "apierror-cantview-deleted-description": "Você não tem permissão para visualizar descrições de arquivos excluídos.",
+       "apierror-cantview-deleted-metadata": "Você não tem permissão para visualizar os metadados dos arquivos excluídos.",
+       "apierror-cantview-deleted-revision-content": "Você não tem permissão para visualizar o conteúdo das revisões excluídas.",
        "apierror-changeauth-norequest": "Falha ao criar pedido de mudança.",
        "apierror-chunk-too-small": "O tamanho mínimo do bloco é $1 {{PLURAL:$1|byte|bytes}} para os pedaços não finais.",
        "apierror-cidrtoobroad": "Os intervalos CIDR $1 maiores que /$2 não são aceitos.",
index 8e31b51..0986c31 100644 (file)
        "apierror-cantoverwrite-sharedfile": "O ficheiro alvo existe num repositório partilhado e você não tem permissão para o substituir.",
        "apierror-cantsend": "Não está autenticado, não tem um endereço de correio eletrónico confirmado, ou não lhe é permitido enviar correio a outros utilizadores, por isso não pode enviar correios eletrónicos.",
        "apierror-cantundelete": "Não foi possível restaurar: as revisões solicitadas podem não existir ou podem já ter sido restauradas.",
+       "apierror-cantview-deleted-comment": "Não tem permissão para ver comentários eliminados.",
+       "apierror-cantview-deleted-description": "Não tem permissão para ver descrições de ficheiros eliminados.",
+       "apierror-cantview-deleted-metadata": "Não tem permissão para ver metadados de ficheiros eliminados.",
+       "apierror-cantview-deleted-revision-content": "Não tem permissão para ver o conteúdo de revisões eliminadas.",
        "apierror-changeauth-norequest": "A criação do pedido de modificação falhou.",
        "apierror-chunk-too-small": "O tamanho de segmento mínimo é $1 {{PLURAL:$1|byte|bytes}} para segmentos que não sejam segmentos finais.",
        "apierror-cidrtoobroad": "Não são aceites intervalos CIDR $1 maiores do que /$2.",
index e796d25..25e7522 100644 (file)
        "apihelp-block-param-userid": "{{doc-apihelp-param|block|userid}}",
        "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}\n{{doc-important|Do not translate \"5 months\", \"2 weeks\", \"infinite\", \"indefinite\" or \"never\"!}}",
        "apihelp-block-param-reason": "{{doc-apihelp-param|block|reason}}",
-       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n* See also {{msg-mw|ipb-hardblock}}",
+       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n\n* See also {{msg-mw|ipb-hardblock}}",
        "apihelp-block-param-nocreate": "{{doc-apihelp-param|block|nocreate}}\n* See also {{msg-mw|ipbcreateaccount}}",
        "apihelp-block-param-autoblock": "{{doc-singularthey}}\n{{doc-apihelp-param|block|autoblock}}\n* See also {{msg-mw|ipbenableautoblock}}",
-       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}\n* See also {{msg-mw|ipbemailban}}",
+       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}\n\n* See also {{msg-mw|ipbemailban}}",
        "apihelp-block-param-hidename": "{{doc-apihelp-param|block|hidename}}",
        "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}\n* See also {{msg-mw|ipb-disableusertalk}}",
        "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}",
        "apierror-cantoverwrite-sharedfile": "{{doc-apierror}}",
        "apierror-cantsend": "{{doc-apierror}}",
        "apierror-cantundelete": "{{doc-apierror}}",
+       "apierror-cantview-deleted-comment": "{{doc-apierror}}",
        "apierror-cantview-deleted-description": "{{doc-apierror}}",
        "apierror-cantview-deleted-metadata": "{{doc-apierror}}",
+       "apierror-cantview-deleted-revision-content": "{{doc-apierror}}",
        "apierror-changeauth-norequest": "{{doc-apierror}}",
        "apierror-chunk-too-small": "{{doc-apierror}}\n\nParameters:\n* $1 - Minimum size in bytes.",
        "apierror-cidrtoobroad": "{{doc-apierror}}\n\nParameters:\n* $1 - \"IPv4\" or \"IPv6\"\n* $2 - Minimum CIDR mask length.",
index 4d02204..3e5da0a 100644 (file)
@@ -38,7 +38,8 @@
                        "Vlad5250",
                        "Diralik",
                        "DmitTrix",
-                       "Марио"
+                       "Марио",
+                       "Katunchik"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> MediaWiki API — зрелый и стабильный интерфейс, активно поддерживаемый и улучшаемый. Мы стараемся избегать ломающих изменений, однако изредка они могут быть необходимы. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<p class=\"mw-apisandbox-link\"><strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].</p>",
        "apierror-cantoverwrite-sharedfile": "Целевой файл существует в общем репозитории и у вас нет прав перезаписать его.",
        "apierror-cantsend": "Вы не авторизованы, ваш электронный адрес не подтверждён или у вас нет прав на отправку электронной почты другим участникам, поэтому вы не можете отправить электронное письмо.",
        "apierror-cantundelete": "Невозможно восстановить: возможно, запрашиваемые версии не существуют или уже были восстановлены.",
+       "apierror-cantview-deleted-comment": "У вас нет разрешения на просмотр удаленных комментариев.",
+       "apierror-cantview-deleted-description": "У вас нет разрешения на просмотр описаний удаленных файлов.",
+       "apierror-cantview-deleted-metadata": "У вас нет разрешения на просмотр метаданных удаленных файлов.",
+       "apierror-cantview-deleted-revision-content": "У вас нет разрешения на просмотр содержимого удаленных редакций.",
        "apierror-changeauth-norequest": "Попытка создать запрос правки провалилась.",
        "apierror-chunk-too-small": "Минимальный размер кусочка — $1 {{PLURAL:$1|байт|байта|байт}}, если кусочек не является последним.",
        "apierror-cidrtoobroad": "Диапазоны $1 CIDR, шире /$2, не разрешены.",
index 14a7717..cd5b4ce 100644 (file)
        "apierror-cantoverwrite-sharedfile": "目標檔案存在於分享儲存庫上,因此您沒有權限來覆蓋掉。",
        "apierror-cantsend": "您尚未登入,您沒有已確認的電子郵件地址,或是您未被允許發送電子郵件給其他人,因此您不能發送電子郵件。",
        "apierror-cantundelete": "無法取消刪除:請求的修訂可能不存在,或是可能已被取消刪除。",
+       "apierror-cantview-deleted-comment": "您沒有權限來檢視被刪除的註釋。",
+       "apierror-cantview-deleted-description": "您沒有權限來檢視被刪除檔案的描述內容。",
+       "apierror-cantview-deleted-metadata": "您沒有權限來檢視被刪除檔案的詮釋資料。",
+       "apierror-cantview-deleted-revision-content": "您沒有權限來檢視被刪除修訂的內容。",
        "apierror-changeauth-norequest": "建立更改請求失敗。",
        "apierror-chunk-too-small": "對於非最終塊,最小塊的大小為 $1 {{PLURAL:$1|位元組|位元組}}。",
        "apierror-cidrtoobroad": "不能接受超出 /$2 的 $1 CIDR 範圍。",
index e27ebac..077bdca 100644 (file)
@@ -29,6 +29,7 @@ use MediaWiki\Config\ServiceOptions;
 use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\User\UserIdentity;
 use MWCryptHash;
+use Psr\Log\LoggerInterface;
 use User;
 use WebRequest;
 use WebResponse;
@@ -41,16 +42,12 @@ use Wikimedia\IPSet;
  * @since 1.34 Refactored from User and Block.
  */
 class BlockManager {
-       // TODO: This should be UserIdentity instead of User
-       /** @var User */
-       private $currentUser;
-
-       /** @var WebRequest */
-       private $currentRequest;
-
        /** @var PermissionManager */
        private $permissionManager;
 
+       /** @var ServiceOptions */
+       private $options;
+
        /**
         * TODO Make this a const when HHVM support is dropped (T192166)
         *
@@ -69,23 +66,23 @@ class BlockManager {
                'SoftBlockRanges',
        ];
 
+       /** @var LoggerInterface */
+       private $logger;
+
        /**
         * @param ServiceOptions $options
-        * @param User $currentUser
-        * @param WebRequest $currentRequest
         * @param PermissionManager $permissionManager
+        * @param LoggerInterface $logger
         */
        public function __construct(
                ServiceOptions $options,
-               User $currentUser,
-               WebRequest $currentRequest,
-               PermissionManager $permissionManager
+               PermissionManager $permissionManager,
+               LoggerInterface $logger
        ) {
                $options->assertRequiredOptions( self::$constructorOptions );
                $this->options = $options;
-               $this->currentUser = $currentUser;
-               $this->currentRequest = $currentRequest;
                $this->permissionManager = $permissionManager;
+               $this->logger = $logger;
        }
 
        /**
@@ -93,51 +90,116 @@ class BlockManager {
         * return a composite block that combines the strictest features of the applicable
         * blocks.
         *
-        * TODO: $user should be UserIdentity instead of User
+        * Different blocks may be sought, depending on the user and their permissions. The
+        * user may be:
+        * (1) The global user (and can be affected by IP blocks). The global request object
+        * is needed for checking the IP address, the XFF header and the cookies.
+        * (2) The global user (and exempt from IP blocks). The global request object is
+        * needed for checking the cookies.
+        * (3) Another user (not the global user). No request object is available or needed;
+        * just look for a block against the user account.
+        *
+        * Cases #1 and #2 check whether the global user is blocked in practice; the block
+        * may due to their user account being blocked or to an IP address block or cookie
+        * block (or multiple of these). Case #3 simply checks whether a user's account is
+        * blocked, and does not determine whether the person using that account is affected
+        * in practice by any IP address or cookie blocks.
         *
         * @internal This should only be called by User::getBlockedStatus
         * @param User $user
+        * @param WebRequest|null $request The global request object if the user is the
+        *  global user (cases #1 and #2), otherwise null (case #3). The IP address and
+        *  information from the request header are needed to find some types of blocks.
         * @param bool $fromReplica Whether to check the replica DB first.
         *  To improve performance, non-critical checks are done against replica DBs.
         *  Check when actually saving should be done against master.
         * @return AbstractBlock|null The most relevant block, or null if there is no block.
         */
-       public function getUserBlock( User $user, $fromReplica ) {
-               $isAnon = $user->getId() === 0;
+       public function getUserBlock( User $user, $request, $fromReplica ) {
                $fromMaster = !$fromReplica;
+               $ip = null;
 
-               // TODO: If $user is the current user, we should use the current request. Otherwise,
-               // we should not look for XFF or cookie blocks.
-               $request = $user->getRequest();
+               // If this is the global user, they may be affected by IP blocks (case #1),
+               // or they may be exempt (case #2). If affected, look for additional blocks
+               // against the IP address.
+               $checkIpBlocks = $request &&
+                       !$this->permissionManager->userHasRight( $user, 'ipblock-exempt' );
 
-               # We only need to worry about passing the IP address to the block generator if the
-               # user is not immune to autoblocks/hardblocks, and they are the current user so we
-               # know which IP address they're actually coming from
-               $ip = null;
-               $sessionUser = $this->currentUser;
-               // the session user is set up towards the end of Setup.php. Until then,
-               // assume it's a logged-out user.
-               $globalUserName = $sessionUser->isSafeToLoad()
-                       ? $sessionUser->getName()
-                       : IP::sanitizeIP( $this->currentRequest->getIP() );
-               if ( $user->getName() === $globalUserName &&
-                        !$this->permissionManager->userHasRight( $user, 'ipblock-exempt' ) ) {
-                       $ip = $this->currentRequest->getIP();
+               if ( $request && $checkIpBlocks ) {
+
+                       // Case #1: checking the global user, including IP blocks
+                       $ip = $request->getIP();
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $blocks = DatabaseBlock::newListFromTarget( $user, $ip, $fromMaster );
+                       $this->getAdditionalIpBlocks( $blocks, $request, !$user->isRegistered(), $fromMaster );
+                       $this->getCookieBlock( $blocks, $user, $request );
+
+               } elseif ( $request ) {
+
+                       // Case #2: checking the global user, but they are exempt from IP blocks
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $blocks = DatabaseBlock::newListFromTarget( $user, null, $fromMaster );
+                       $this->getCookieBlock( $blocks, $user, $request );
+
+               } else {
+
+                       // Case #3: checking whether a user's account is blocked
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $blocks = DatabaseBlock::newListFromTarget( $user, null, $fromMaster );
+
+               }
+
+               // Filter out any duplicated blocks, e.g. from the cookie
+               $blocks = $this->getUniqueBlocks( $blocks );
+
+               $block = null;
+               if ( count( $blocks ) > 0 ) {
+                       if ( count( $blocks ) === 1 ) {
+                               $block = $blocks[ 0 ];
+                       } else {
+                               $block = new CompositeBlock( [
+                                       'address' => $ip,
+                                       'byText' => 'MediaWiki default',
+                                       'reason' => wfMessage( 'blockedtext-composite-reason' )->plain(),
+                                       'originalBlocks' => $blocks,
+                               ] );
+                       }
                }
 
-               // User/IP blocking
-               // After this, $blocks is an array of blocks or an empty array
-               // TODO: remove dependency on DatabaseBlock
-               $blocks = DatabaseBlock::newListFromTarget( $user, $ip, $fromMaster );
+               Hooks::run( 'GetUserBlock', [ clone $user, $ip, &$block ] );
+
+               return $block;
+       }
 
-               // Cookie blocking
+       /**
+        * Get the cookie block, if there is one.
+        *
+        * @param AbstractBlock[] &$blocks
+        * @param UserIdentity $user
+        * @param WebRequest $request
+        * @return void
+        */
+       private function getCookieBlock( &$blocks, UserIdentity $user, WebRequest $request ) {
                $cookieBlock = $this->getBlockFromCookieValue( $user, $request );
-               if ( $cookieBlock instanceof AbstractBlock ) {
+               if ( $cookieBlock instanceof DatabaseBlock ) {
                        $blocks[] = $cookieBlock;
                }
+       }
+
+       /**
+        * Check for any additional blocks against the IP address or any IPs in the XFF header.
+        *
+        * @param AbstractBlock[] &$blocks Blocks found so far
+        * @param WebRequest $request
+        * @param bool $isAnon The user is logged out
+        * @param bool $fromMaster
+        * @return void
+        */
+       private function getAdditionalIpBlocks( &$blocks, WebRequest $request, $isAnon, $fromMaster ) {
+               $ip = $request->getIP();
 
                // Proxy blocking
-               if ( $ip !== null && !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) ) ) {
+               if ( !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) ) ) {
                        // Local list
                        if ( $this->isLocallyBlockedProxy( $ip ) ) {
                                $blocks[] = new SystemBlock( [
@@ -156,24 +218,8 @@ class BlockManager {
                        }
                }
 
-               // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
-               if ( $this->options->get( 'ApplyIpBlocksToXff' )
-                       && $ip !== null
-                       && !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) )
-               ) {
-                       $xff = $request->getHeader( 'X-Forwarded-For' );
-                       $xff = array_map( 'trim', explode( ',', $xff ) );
-                       $xff = array_diff( $xff, [ $ip ] );
-                       // TODO: remove dependency on DatabaseBlock
-                       $xffblocks = DatabaseBlock::getBlocksForIPList( $xff, $isAnon, $fromMaster );
-                       $blocks = array_merge( $blocks, $xffblocks );
-               }
-
                // Soft blocking
-               if ( $ip !== null
-                       && $isAnon
-                       && IP::isInRanges( $ip, $this->options->get( 'SoftBlockRanges' ) )
-               ) {
+               if ( $isAnon && IP::isInRanges( $ip, $this->options->get( 'SoftBlockRanges' ) ) ) {
                        $blocks[] = new SystemBlock( [
                                'address' => $ip,
                                'byText' => 'MediaWiki default',
@@ -183,26 +229,17 @@ class BlockManager {
                        ] );
                }
 
-               // Filter out any duplicated blocks, e.g. from the cookie
-               $blocks = $this->getUniqueBlocks( $blocks );
-
-               $block = null;
-               if ( count( $blocks ) > 0 ) {
-                       if ( count( $blocks ) === 1 ) {
-                               $block = $blocks[ 0 ];
-                       } else {
-                               $block = new CompositeBlock( [
-                                       'address' => $ip,
-                                       'byText' => 'MediaWiki default',
-                                       'reason' => wfMessage( 'blockedtext-composite-reason' )->plain(),
-                                       'originalBlocks' => $blocks,
-                               ] );
-                       }
+               // (T25343) Apply IP blocks to the contents of XFF headers, if enabled
+               if ( $this->options->get( 'ApplyIpBlocksToXff' )
+                       && !in_array( $ip, $this->options->get( 'ProxyWhitelist' ) )
+               ) {
+                       $xff = $request->getHeader( 'X-Forwarded-For' );
+                       $xff = array_map( 'trim', explode( ',', $xff ) );
+                       $xff = array_diff( $xff, [ $ip ] );
+                       // TODO: remove dependency on DatabaseBlock (T221075)
+                       $xffblocks = DatabaseBlock::getBlocksForIPList( $xff, $isAnon, $fromMaster );
+                       $blocks = array_merge( $blocks, $xffblocks );
                }
-
-               Hooks::run( 'GetUserBlock', [ clone $user, $ip, &$block ] );
-
-               return $block;
        }
 
        /**
@@ -255,7 +292,7 @@ class BlockManager {
 
                $blockCookieId = $this->getIdFromCookieValue( $cookieValue );
                if ( !is_null( $blockCookieId ) ) {
-                       // TODO: remove dependency on DatabaseBlock
+                       // TODO: remove dependency on DatabaseBlock (T221075)
                        $block = DatabaseBlock::newFromID( $blockCookieId );
                        if (
                                $block instanceof DatabaseBlock &&
@@ -368,15 +405,14 @@ class BlockManager {
                                $ipList = $this->checkHost( $hostname );
 
                                if ( $ipList ) {
-                                       wfDebugLog(
-                                               'dnsblacklist',
+                                       $this->logger->info(
                                                "Hostname $hostname is {$ipList[0]}, it's a proxy says $basename!"
                                        );
                                        $found = true;
                                        break;
                                }
 
-                               wfDebugLog( 'dnsblacklist', "Requested $hostname, not found in $basename." );
+                               $this->logger->debug( "Requested $hostname, not found in $basename." );
                        }
                }
 
@@ -419,12 +455,14 @@ class BlockManager {
                                                // TODO: Improve on simply tracking the first trackable block (T225654)
                                                foreach ( $block->getOriginalBlocks() as $originalBlock ) {
                                                        if ( $this->shouldTrackBlockWithCookie( $originalBlock, $isAnon ) ) {
+                                                               '@phan-var DatabaseBlock $originalBlock';
                                                                $this->setBlockCookie( $originalBlock, $response );
                                                                return;
                                                        }
                                                }
                                        } else {
                                                if ( $this->shouldTrackBlockWithCookie( $block, $isAnon ) ) {
+                                                       '@phan-var DatabaseBlock $block';
                                                        $this->setBlockCookie( $block, $response );
                                                }
                                        }
index 2646845..c6d6b8f 100644 (file)
@@ -519,17 +519,8 @@ class LocalisationCache {
         * @return array
         */
        protected function readPHPFile( $_fileName, $_fileType ) {
-               // Disable APC caching
-               Wikimedia\suppressWarnings();
-               $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
-               Wikimedia\restoreWarnings();
-
                include $_fileName;
 
-               Wikimedia\suppressWarnings();
-               ini_set( 'apc.cache_by_default', $_apcEnabled );
-               Wikimedia\restoreWarnings();
-
                $data = [];
                if ( $_fileType == 'core' || $_fileType == 'extension' ) {
                        foreach ( self::$allKeys as $key ) {
index 2ef9c9f..5a7f45e 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper class for category membership changes
@@ -273,11 +274,15 @@ class CategoryMembershipChange {
         * @return null|string
         */
        private function getPreviousRevisionTimestamp() {
-               $previousRev = Revision::newFromId(
-                               $this->pageTitle->getPreviousRevisionID( $this->pageTitle->getLatestRevID() )
-                       );
-
-               return $previousRev ? $previousRev->getTimestamp() : null;
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $latestRev = $rl->getRevisionByTitle( $this->pageTitle );
+               if ( $latestRev ) {
+                       $previousRev = $rl->getPreviousRevision( $latestRev );
+                       if ( $previousRev ) {
+                               return $previousRev->getTimestamp();
+                       }
+               }
+               return null;
        }
 
 }
index 79092ee..e60cc09 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLinked.
index a48e191..34d73d6 100644 (file)
@@ -23,7 +23,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 
 class ChangesList extends ContextSource {
@@ -455,13 +455,21 @@ class ChangesList extends ContextSource {
         * @param string &$s HTML to update
         * @param Title $title
         * @param string $logtype
+        * @param bool $useParentheses (optional) Wrap log entry in parentheses where needed
         */
-       public function insertLog( &$s, $title, $logtype ) {
+       public function insertLog( &$s, $title, $logtype, $useParentheses = true ) {
                $page = new LogPage( $logtype );
                $logname = $page->getName()->setContext( $this->getContext() )->text();
-               $s .= Html::rawElement( 'span', [
-                       'class' => 'mw-changeslist-links'
-               ], $this->linkRenderer->makeKnownLink( $title, $logname ) );
+               $link = $this->linkRenderer->makeKnownLink( $title, $logname, [
+                       'class' => $useParentheses ? '' : 'mw-changeslist-links'
+               ] );
+               if ( $useParentheses ) {
+                       $s .= $this->msg( 'parentheses' )->rawParams(
+                               $link
+                       )->escaped();
+               } else {
+                       $s .= $link;
+               }
        }
 
        /**
@@ -625,7 +633,7 @@ class ChangesList extends ContextSource {
         */
        public function insertComment( $rc ) {
                if ( $this->isDeleted( $rc, RevisionRecord::DELETED_COMMENT ) ) {
-                       return ' <span class="history-deleted">' .
+                       return ' <span class="history-deleted comment">' .
                                $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
                } else {
                        return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle(),
index e461762..d2c4dd4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Generates a list of changes using an Enhanced system (uses javascript).
index c15701b..8228bae 100644 (file)
@@ -87,7 +87,7 @@ class OldChangesList extends ChangesList {
 
                if ( $rc->mAttribs['rc_log_type'] ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
-                       $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'] );
+                       $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'], false );
                        $flags = $this->recentChangesFlags( [ 'unpatrolled' => $unpatrolled,
                                'bot' => $rc->mAttribs['rc_bot'] ], '' );
                        if ( $flags !== '' ) {
@@ -98,7 +98,7 @@ class OldChangesList extends ChangesList {
                        list( $name, $htmlubpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
                                resolveAlias( $rc->mAttribs['rc_title'] );
                        if ( $name == 'Log' ) {
-                               $this->insertLog( $html, $rc->getTitle(), $htmlubpage );
+                               $this->insertLog( $html, $rc->getTitle(), $htmlubpage, false );
                        }
                // Regular entries
                } else {
index d448eae..83720d3 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 class RCCacheEntryFactory {
 
@@ -56,7 +56,6 @@ class RCCacheEntryFactory {
         */
        public function newFromRecentChange( RecentChange $baseRC, $watched ) {
                $user = $this->context->getUser();
-               $counter = $baseRC->counter;
 
                $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
 
@@ -73,8 +72,8 @@ class RCCacheEntryFactory {
                // called too many times (50% of CPU time on RecentChanges!).
                $showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
 
-               $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
-               $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
+               $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks );
+               $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks );
                $cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
 
                // Make user links
@@ -109,11 +108,11 @@ class RCCacheEntryFactory {
        }
 
        /**
-        * @param RecentChange $cacheEntry
+        * @param RCCacheEntry $cacheEntry
         *
         * @return string
         */
-       private function buildCLink( RecentChange $cacheEntry ) {
+       private function buildCLink( RCCacheEntry $cacheEntry ) {
                $type = $cacheEntry->mAttribs['rc_type'];
 
                // New unpatrolled pages
@@ -182,11 +181,10 @@ class RCCacheEntryFactory {
        /**
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
-        * @param int $counter
         *
         * @return string
         */
-       private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+       private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks ) {
                $queryParams = $this->buildCurQueryParams( $cacheEntry );
                $curMessage = $this->getMessage( 'cur' );
                $logTypes = [ RC_LOG ];
@@ -217,11 +215,10 @@ class RCCacheEntryFactory {
        /**
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
-        * @param int $counter
         *
         * @return string
         */
-       private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+       private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks ) {
                $queryParams = $this->buildDiffQueryParams( $cacheEntry );
                $diffMessage = $this->getMessage( 'diff' );
                $logTypes = [ RC_NEW, RC_LOG ];
index 9ee000d..ba6cb2c 100644 (file)
@@ -524,9 +524,7 @@ class ChangeTags {
                                        ->userHasRight( $user, 'applychangetags' )
                        ) {
                                return Status::newFatal( 'tags-apply-no-permission' );
-                       } elseif ( $user->getBlock() ) {
-                               // @TODO Ensure that the block does not apply to the `applychangetags`
-                               //       right.
+                       } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
                                return Status::newFatal( 'tags-apply-blocked', $user->getName() );
                        }
                }
@@ -601,9 +599,7 @@ class ChangeTags {
                                        ->userHasRight( $user, 'changetags' )
                        ) {
                                return Status::newFatal( 'tags-update-no-permission' );
-                       } elseif ( $user->getBlock() ) {
-                               // @TODO Ensure that the block does not apply to the `changetags`
-                               //       right.
+                       } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
                                return Status::newFatal( 'tags-update-blocked', $user->getName() );
                        }
                }
@@ -1023,9 +1019,7 @@ class ChangeTags {
                                        ->userHasRight( $user, 'managechangetags' )
                        ) {
                                return Status::newFatal( 'tags-manage-no-permission' );
-                       } elseif ( $user->getBlock() ) {
-                               // @TODO Ensure that the block does not apply to the `managechangetags`
-                               //       right.
+                       } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
                                return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
@@ -1099,9 +1093,7 @@ class ChangeTags {
                                        ->userHasRight( $user, 'managechangetags' )
                        ) {
                                return Status::newFatal( 'tags-manage-no-permission' );
-                       } elseif ( $user->getBlock() ) {
-                               // @TODO Ensure that the block does not apply to the `managechangetags`
-                               //       right.
+                       } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
                                return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
@@ -1200,9 +1192,7 @@ class ChangeTags {
                                        ->userHasRight( $user, 'managechangetags' )
                        ) {
                                return Status::newFatal( 'tags-manage-no-permission' );
-                       } elseif ( $user->getBlock() ) {
-                               // @TODO Ensure that the block does not apply to the `managechangetags`
-                               //       right.
+                       } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
                                return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
@@ -1322,9 +1312,7 @@ class ChangeTags {
                                        ->userHasRight( $user, 'deletechangetags' )
                        ) {
                                return Status::newFatal( 'tags-delete-no-permission' );
-                       } elseif ( $user->getBlock() ) {
-                               // @TODO Ensure that the block does not apply to the `deletechangetags`
-                               //       right.
+                       } elseif ( $user->getBlock() && $user->getBlock()->isSitewide() ) {
                                return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
index 1827aab..ce82b71 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a logging table row with its associated change tags.
index 6b5482c..dffe6e1 100644 (file)
@@ -191,11 +191,11 @@ class SquidPurgeClient {
        /**
         * Queue a purge operation
         *
-        * @param string $url
+        * @param string $url Fully expanded URL (with host and protocol)
         */
        public function queuePurge( $url ) {
                global $wgSquidPurgeUseHostHeader;
-               $url = CdnCacheUpdate::expand( str_replace( "\n", '', $url ) );
+               $url = str_replace( "\n", '', $url ); // sanity
                $request = [];
                if ( $wgSquidPurgeUseHostHeader ) {
                        $url = wfParseUrl( $url );
index 170d5c2..8f4f058 100644 (file)
@@ -45,6 +45,9 @@ class CustomUppercaseCollation extends NumericUppercaseCollation {
        /** @var array $puaSubset List of private use area codes */
        private $puaSubset;
 
+       /** @var array */
+       private $firstLetters;
+
        /**
         * @note This assumes $alphabet does not contain U+F3000-U+F3FFF
         *
index 9fbb72c..533f639 100644 (file)
@@ -26,7 +26,7 @@
  * @author Daniel Kinzler
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
index 1803009..63b320e 100644 (file)
@@ -23,7 +23,6 @@
 
 use MediaWiki\Config\ServiceOptions;
 use MediaWiki\Logger\LoggerFactory;
-use Wikimedia\Rdbms\LBFactory;
 use Wikimedia\Rdbms\DatabaseDomain;
 
 /**
@@ -359,35 +358,6 @@ abstract class MWLBFactory {
                return $class;
        }
 
-       /**
-        * @param LBFactory $lbFactory
-        * @param string $dbType 'mysql', 'sqlite', etc.
-        * @internal For use with service wiring
-        */
-       public static function setSchemaAliases( LBFactory $lbFactory, $dbType ) {
-               if ( $dbType === 'mysql' ) {
-                       /**
-                        * When SQLite indexes were introduced in r45764, it was noted that
-                        * SQLite requires index names to be unique within the whole database,
-                        * not just within a schema. As discussed in CR r45819, to avoid the
-                        * need for a schema change on existing installations, the indexes
-                        * were implicitly mapped from the new names to the old names.
-                        *
-                        * This mapping can be removed if DB patches are introduced to alter
-                        * the relevant tables in existing installations. Note that because
-                        * this index mapping applies to table creation, even new installations
-                        * of MySQL have the old names (except for installations created during
-                        * a period where this mapping was inappropriately removed, see
-                        * T154872).
-                        */
-                       $lbFactory->setIndexAliases( [
-                               'ar_usertext_timestamp' => 'usertext_timestamp',
-                               'un_user_id' => 'user_id',
-                               'un_user_ip' => 'user_ip',
-                       ] );
-               }
-       }
-
        /**
         * Log a database deprecation warning
         * @param string $msg Deprecation message
index a48faf1..56fc0b3 100644 (file)
@@ -10,6 +10,9 @@ use Psr\Log\AbstractLogger;
  * goal.
  */
 class ConsoleLogger extends AbstractLogger {
+       /** @var string */
+       private $channel;
+
        /**
         * @param string $channel
         */
index ddffaa3..b983e97 100644 (file)
@@ -24,12 +24,12 @@ use Wikimedia\Assert\Assert;
 use MediaWiki\MediaWikiServices;
 
 /**
- * Handles purging appropriate CDN URLs given a title (or titles)
+ * Handles purging the appropriate CDN objects given a list of URLs or Title instances
  * @ingroup Cache
  */
 class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
        /** @var string[] Collection of URLs to purge */
-       protected $urls = [];
+       private $urls = [];
 
        /**
         * @param string[] $urlArr Collection of URLs to purge
@@ -99,10 +99,9 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
                // Reliably broadcast the purge to all edge nodes
-               $relayer = MediaWikiServices::getInstance()->getEventRelayerGroup()
-                                       ->getRelayer( 'cdn-url-purges' );
                $ts = microtime( true );
-               $relayer->notifyMulti(
+               $relayerGroup = MediaWikiServices::getInstance()->getEventRelayerGroup();
+               $relayerGroup->getRelayer( 'cdn-url-purges' )->notifyMulti(
                        'cdn-url-purges',
                        array_map(
                                function ( $url ) use ( $ts ) {
@@ -138,7 +137,7 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
                                foreach ( $chunks as $chunk ) {
                                        $client = new SquidPurgeClient( $server );
                                        foreach ( $chunk as $url ) {
-                                               $client->queuePurge( $url );
+                                               $client->queuePurge( self::expand( $url ) );
                                        }
                                        $pool->addClient( $client );
                                }
@@ -255,7 +254,7 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
         * @param string $url
         * @return string
         */
-       public static function expand( $url ) {
+       private static function expand( $url ) {
                return wfExpandUrl( $url, PROTO_INTERNAL );
        }
 
index 29846bf..9e45241 100644 (file)
  */
 
 /**
- * Class to invalidate the HTML cache of all the pages linking to a given title.
+ * Class to invalidate the HTML/file cache of all the pages linking to a given title
  *
  * @ingroup Cache
  */
 class HTMLCacheUpdate extends DataUpdate {
        /** @var Title */
-       public $mTitle;
-
+       private $title;
        /** @var string */
-       public $mTable;
+       private $table;
 
        /**
         * @param Title $titleTo
@@ -42,16 +41,16 @@ class HTMLCacheUpdate extends DataUpdate {
        function __construct(
                Title $titleTo, $table, $causeAction = 'unknown', $causeAgent = 'unknown'
        ) {
-               $this->mTitle = $titleTo;
-               $this->mTable = $table;
+               $this->title = $titleTo;
+               $this->table = $table;
                $this->causeAction = $causeAction;
                $this->causeAgent = $causeAgent;
        }
 
        public function doUpdate() {
                $job = HTMLCacheUpdateJob::newForBacklinks(
-                       $this->mTitle,
-                       $this->mTable,
+                       $this->title,
+                       $this->table,
                        [ 'causeAction' => $this->getCauseAction(), 'causeAgent' => $this->getCauseAgent() ]
                );
 
index 8345ee6..2bfdc0e 100644 (file)
@@ -1066,6 +1066,7 @@ class LinksUpdate extends DataUpdate {
        private function invalidateProperties( $changed ) {
                global $wgPagePropLinkInvalidations;
 
+               $jobs = [];
                foreach ( $changed as $name => $value ) {
                        if ( isset( $wgPagePropLinkInvalidations[$name] ) ) {
                                $inv = $wgPagePropLinkInvalidations[$name];
@@ -1073,12 +1074,16 @@ class LinksUpdate extends DataUpdate {
                                        $inv = [ $inv ];
                                }
                                foreach ( $inv as $table ) {
-                                       DeferredUpdates::addUpdate(
-                                               new HTMLCacheUpdate( $this->mTitle, $table, 'page-props' )
+                                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                                               $this->mTitle,
+                                               $table,
+                                               [ 'causeAction' => 'page-props' ]
                                        );
                                }
                        }
                }
+
+               JobQueueGroup::singleton()->lazyPush( $jobs );
        }
 
        /**
@@ -1192,4 +1197,14 @@ class LinksUpdate extends DataUpdate {
 
                return $this->db;
        }
+
+       /**
+        * Whether or not this LinksUpdate will also update pages which transclude the
+        * current page or otherwise depend on it.
+        *
+        * @return bool
+        */
+       public function isRecursive() {
+               return $this->mRecursive;
+       }
 }
index a508746..84f6fc0 100644 (file)
@@ -50,7 +50,7 @@ class SearchUpdate implements DeferrableUpdate {
         */
        public function __construct( $id, $title, $c = null ) {
                if ( is_string( $title ) ) {
-                       wfDeprecated( __METHOD__ . " with a string for the title", 1.34 );
+                       wfDeprecated( __METHOD__ . " with a string for the title", '1.34' );
                        $this->title = Title::newFromText( $title );
                        if ( $this->title === null ) {
                                throw new InvalidArgumentException( "Cannot construct the title: $title" );
@@ -62,10 +62,10 @@ class SearchUpdate implements DeferrableUpdate {
                $this->id = $id;
                // is_string() check is back-compat for ApprovedRevs
                if ( is_string( $c ) ) {
-                       wfDeprecated( __METHOD__ . " with a string for the content", 1.34 );
+                       wfDeprecated( __METHOD__ . " with a string for the content", '1.34' );
                        $c = new TextContent( $c );
                } elseif ( is_bool( $c ) ) {
-                       wfDeprecated( __METHOD__ . " with a boolean for the content", 1.34 );
+                       wfDeprecated( __METHOD__ . " with a boolean for the content", '1.34' );
                        $c = null;
                }
                $this->content = $c;
index 8a5caa2..7e4e53e 100644 (file)
@@ -1713,14 +1713,29 @@ class DifferenceEngine extends ContextSource {
         *     false signifies that there is no previous/next revision ($old is the oldest/newest one).
         */
        public function mapDiffPrevNext( $old, $new ) {
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
                if ( $new === 'prev' ) {
                        // Show diff between revision $old and the previous one. Get previous one from DB.
                        $newid = intval( $old );
-                       $oldid = $this->getTitle()->getPreviousRevisionID( $newid );
+                       $oldid = false;
+                       $newRev = $rl->getRevisionById( $newid );
+                       if ( $newRev ) {
+                               $oldRev = $rl->getPreviousRevision( $newRev );
+                               if ( $oldRev ) {
+                                       $oldid = $oldRev->getId();
+                               }
+                       }
                } elseif ( $new === 'next' ) {
                        // Show diff between revision $old and the next one. Get next one from DB.
                        $oldid = intval( $old );
-                       $newid = $this->getTitle()->getNextRevisionID( $oldid );
+                       $newid = false;
+                       $oldRev = $rl->getRevisionById( $oldid );
+                       if ( $oldRev ) {
+                               $newRev = $rl->getNextRevision( $oldRev );
+                               if ( $newRev ) {
+                                       $newid = $newRev->getId();
+                               }
+                       }
                } else {
                        $oldid = intval( $old );
                        $newid = intval( $new );
index 5fcf0e6..2448421 100644 (file)
@@ -26,9 +26,9 @@
  */
 class BadRequestError extends ErrorPageError {
 
-       public function report() {
+       public function report( $action = self::SEND_OUTPUT ) {
                global $wgOut;
                $wgOut->setStatusCode( 400 );
-               parent::report();
+               parent::report( $action );
        }
 }
index 4b18126..64216a4 100644 (file)
@@ -25,6 +25,8 @@
  * @ingroup Exception
  */
 class ErrorPageError extends MWException implements ILocalizedException {
+       const SEND_OUTPUT = 0;
+       const STAGE_OUTPUT = 1;
        public $title, $msg, $params;
 
        /**
@@ -60,13 +62,19 @@ class ErrorPageError extends MWException implements ILocalizedException {
                return wfMessage( $this->msg, $this->params );
        }
 
-       public function report() {
+       public function report( $action = self::SEND_OUTPUT ) {
                if ( self::isCommandLine() || defined( 'MW_API' ) ) {
                        parent::report();
                } else {
                        global $wgOut;
                        $wgOut->showErrorPage( $this->title, $this->msg, $this->params );
-                       $wgOut->output();
+                       // Allow skipping of the final output step, so that web-based page views
+                       // from MediaWiki.php, can inspect the staged OutputPage state, and perform
+                       // graceful shutdown via doPreOutputCommit first, just like for regular
+                       // output when there isn't an error page.
+                       if ( $action === self::SEND_OUTPUT ) {
+                               $wgOut->output();
+                       }
                }
        }
 }
index b4e483b..4a72d72 100644 (file)
@@ -350,7 +350,7 @@ class MWExceptionHandler {
 
                // Look at message to see if this is a class not found failure
                // HHVM: Class undefined: foo
-               // PHP5: Class 'foo' not found
+               // PHP7: Class 'foo' not found
                if ( preg_match( "/Class (undefined: \w+|'\w+' not found)/", $message ) ) {
                        // phpcs:disable Generic.Files.LineLength
                        $msg = <<<TXT
@@ -683,16 +683,21 @@ TXT;
         * This method must not assume the exception is an MWException,
         * it is also used to handle PHP exceptions or exceptions from other libraries.
         *
-        * @since 1.22
         * @param Exception|Throwable $e
         * @param string $catcher CAUGHT_BY_* class constant indicating what caught the error
+        * @param array $extraData (since 1.34) Additional data to log
+        * @since 1.22
         */
-       public static function logException( $e, $catcher = self::CAUGHT_BY_OTHER ) {
+       public static function logException( $e, $catcher = self::CAUGHT_BY_OTHER, $extraData = [] ) {
                if ( !( $e instanceof MWException ) || $e->isLoggable() ) {
                        $logger = LoggerFactory::getInstance( 'exception' );
+                       $context = self::getLogContext( $e, $catcher );
+                       if ( $extraData ) {
+                               $context['extraData'] = $extraData;
+                       }
                        $logger->error(
                                self::getLogNormalMessage( $e ),
-                               self::getLogContext( $e, $catcher )
+                               $context
                        );
 
                        $json = self::jsonSerializeException( $e, false, FormatJson::ALL_OK, $catcher );
index 87a3dc2..9fa1c7c 100644 (file)
@@ -67,10 +67,12 @@ class PermissionsError extends ErrorPageError {
                parent::__construct( 'permissionserrors', Message::newFromSpecifier( $errors[0] ) );
        }
 
-       public function report() {
+       public function report( $action = self::SEND_OUTPUT ) {
                global $wgOut;
 
                $wgOut->showPermissionsErrorPage( $this->errors, $this->permission );
-               $wgOut->output();
+               if ( $action === self::SEND_OUTPUT ) {
+                       $wgOut->output();
+               }
        }
 }
index bec0d90..cdeb402 100644 (file)
@@ -32,9 +32,9 @@ class ThrottledError extends ErrorPageError {
                );
        }
 
-       public function report() {
+       public function report( $action = ErrorPageError::SEND_OUTPUT ) {
                global $wgOut;
                $wgOut->setStatusCode( 429 );
-               parent::report();
+               parent::report( $action );
        }
 }
index 7a99765..ff992b0 100644 (file)
@@ -75,14 +75,15 @@ class UserNotLoggedIn extends ErrorPageError {
         * Redirect to Special:Userlogin if the specified message is compatible. Otherwise,
         * show an error page as usual.
         */
-       public function report() {
+       public function report( $action = self::SEND_OUTPUT ) {
                // If an unsupported message is used, don't try redirecting to Special:Userlogin,
                // since the message may not be compatible.
                if ( !in_array( $this->msg, LoginHelper::getValidErrorMessages() ) ) {
-                       parent::report();
+                       parent::report( $action );
+                       return;
                }
 
-               // Message is valid. Redirec to Special:Userlogin
+               // Message is valid. Redirect to Special:Userlogin
 
                $context = RequestContext::getMain();
 
@@ -98,6 +99,8 @@ class UserNotLoggedIn extends ErrorPageError {
                        'warning' => $this->msg,
                ] ) );
 
-               $output->output();
+               if ( $action === self::SEND_OUTPUT ) {
+                       $output->output();
+               }
        }
 }
index a50150e..833d553 100644 (file)
@@ -60,8 +60,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
        }
 
        /**
-        * @param string $newname
-        * @param bool $open
+        * @inheritDoc
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
index d0256fd..ad68109 100644 (file)
@@ -59,7 +59,7 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param string $newname
+        * @inheritDoc
         */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
@@ -92,8 +92,7 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param string $newname
-        * @param bool $open
+        * @inheritDoc
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
index 75e149c..143fb8e 100644 (file)
@@ -102,14 +102,16 @@ class DumpFilter {
        }
 
        /**
-        * @param string $newname
+        * @see DumpOutput::closeRenameAndReopen()
+        * @param string|string[] $newname
         */
        function closeRenameAndReopen( $newname ) {
                $this->sink->closeRenameAndReopen( $newname );
        }
 
        /**
-        * @param string $newname
+        * @see DumpOutput::closeAndRename()
+        * @param string|string[] $newname
         * @param bool $open
         */
        function closeAndRename( $newname, $open = false ) {
index 92118fe..2f5b3dc 100644 (file)
  * @ingroup Dump
  */
 class DumpMultiWriter {
+       /** @var array */
+       private $sinks;
+       /** @var int */
+       private $count;
 
        /**
         * @param array $sinks
index ab925b7..5c15c5f 100644 (file)
@@ -86,7 +86,7 @@ class DumpOutput {
         * and reopen new file with the old name. Use this
         * for writing out a file in multiple pieces
         * at specified checkpoints (e.g. every n hours).
-        * @param string|array $newname File name. May be a string or an array with one element
+        * @param string|string[] $newname File name. May be a string or an array with one element
         */
        function closeRenameAndReopen( $newname ) {
        }
@@ -95,7 +95,7 @@ class DumpOutput {
         * Close the old file, and move it to a specified name.
         * Use this for the last piece of a file written out
         * at specified checkpoints (e.g. every n hours).
-        * @param string|array $newname File name. May be a string or an array with one element
+        * @param string|string[] $newname File name. May be a string or an array with one element
         * @param bool $open If true, a new file with the old filename will be opened
         *   again for writing (default: false)
         */
index 0521c5a..4e61434 100644 (file)
@@ -73,15 +73,14 @@ class DumpPipeOutput extends DumpFileOutput {
        }
 
        /**
-        * @param string $newname
+        * @inheritDoc
         */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
        /**
-        * @param string $newname
-        * @param bool $open
+        * @inheritDoc
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
index ec0b344..fd200d1 100644 (file)
@@ -28,8 +28,9 @@
  */
 
 use MediaWiki\MediaWikiServices as MediaWikiServicesAlias;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * @ingroup SpecialPage Dump
@@ -67,7 +68,7 @@ class WikiExporter {
        /** @var XmlDumpWriter */
        private $writer;
 
-       /** @var Database */
+       /** @var IDatabase */
        protected $db;
 
        /** @var array|int */
@@ -86,7 +87,7 @@ class WikiExporter {
        }
 
        /**
-        * @param Database $db
+        * @param IDatabase $db
         * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
         *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
         *   - offset: non-inclusive offset at which to start the query
@@ -303,29 +304,36 @@ class WikiExporter {
                if ( $cond ) {
                        $where[] = $cond;
                }
-               # Get logging table name for logging.* clause
-               $logging = $this->db->tableName( 'logging' );
-
                $result = null; // Assuring $result is not undefined, if exception occurs early
 
                $commentQuery = CommentStore::getStore()->getJoin( 'log_comment' );
                $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
 
+               $tables = array_merge(
+                       [ 'logging' ], $commentQuery['tables'], $actorQuery['tables'], [ 'user' ]
+               );
+               $fields = [
+                       'log_id', 'log_type', 'log_action', 'log_timestamp', 'log_namespace',
+                       'log_title', 'log_params', 'log_deleted', 'user_name'
+               ] + $commentQuery['fields'] + $actorQuery['fields'];
+               $options = [
+                       'ORDER BY' => 'log_id',
+                       'USE INDEX' => [ 'logging' => 'PRIMARY' ],
+                       'LIMIT' => self::BATCH_SIZE,
+               ];
+               $joins = [
+                       'user' => [ 'JOIN', 'user_id = ' . $actorQuery['fields']['log_user'] ]
+               ] + $commentQuery['joins'] + $actorQuery['joins'];
+
                $lastLogId = 0;
                while ( true ) {
                        $result = $this->db->select(
-                               array_merge( [ 'logging' ], $commentQuery['tables'], $actorQuery['tables'], [ 'user' ] ),
-                               [ "{$logging}.*", 'user_name' ] + $commentQuery['fields'] + $actorQuery['fields'],
+                               $tables,
+                               $fields,
                                array_merge( $where, [ 'log_id > ' . intval( $lastLogId ) ] ),
                                __METHOD__,
-                               [
-                                       'ORDER BY' => 'log_id',
-                                       'USE INDEX' => [ 'logging' => 'PRIMARY' ],
-                                       'LIMIT' => self::BATCH_SIZE,
-                               ],
-                               [
-                                       'user' => [ 'JOIN', 'user_id = ' . $actorQuery['fields']['log_user'] ]
-                               ] + $commentQuery['joins'] + $actorQuery['joins']
+                               $options,
+                               $joins
                        );
 
                        if ( !$result->numRows() ) {
index 4db351b..264eabc 100644 (file)
@@ -26,6 +26,7 @@ use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\DBConnRef;
 use Wikimedia\Rdbms\MaintainableDBConnRef;
 use Wikimedia\Rdbms\DatabaseDomain;
+use Wikimedia\Rdbms\DBUnexpectedError;
 
 /**
  * DB accessible external objects.
@@ -113,7 +114,11 @@ class ExternalStoreDB extends ExternalStoreMedium {
         */
        public function store( $location, $data ) {
                $dbw = $this->getMaster( $location );
-               $dbw->insert( $this->getTable( $dbw ), [ 'blob_text' => $data ], __METHOD__ );
+               $dbw->insert(
+                       $this->getTable( $dbw, $location ),
+                       [ 'blob_text' => $data ],
+                       __METHOD__
+               );
                $id = $dbw->insertId();
                if ( !$id ) {
                        throw new MWException( __METHOD__ . ': no insert ID' );
@@ -149,10 +154,11 @@ class ExternalStoreDB extends ExternalStoreMedium {
        /**
         * Get a replica DB connection for the specified cluster
         *
+        * @since 1.34
         * @param string $cluster Cluster name
         * @return DBConnRef
         */
-       public function getSlave( $cluster ) {
+       public function getReplica( $cluster ) {
                $lb = $this->getLoadBalancer( $cluster );
 
                return $lb->getConnectionRef(
@@ -163,6 +169,17 @@ class ExternalStoreDB extends ExternalStoreMedium {
                );
        }
 
+       /**
+        * Get a replica DB connection for the specified cluster
+        *
+        * @param string $cluster Cluster name
+        * @return DBConnRef
+        * @deprecated since 1.34
+        */
+       public function getSlave( $cluster ) {
+               return $this->getReplica( $cluster );
+       }
+
        /**
         * Get a master database connection for the specified cluster
         *
@@ -211,15 +228,55 @@ class ExternalStoreDB extends ExternalStoreMedium {
         * Get the 'blobs' table name for this database
         *
         * @param IDatabase $db
+        * @param string|null $cluster Cluster name
         * @return string Table name ('blobs' by default)
         */
-       public function getTable( $db ) {
-               $table = $db->getLBInfo( 'blobs table' );
-               if ( is_null( $table ) ) {
-                       $table = 'blobs';
+       public function getTable( $db, $cluster = null ) {
+               if ( $cluster !== null ) {
+                       $lb = $this->getLoadBalancer( $cluster );
+                       $info = $lb->getServerInfo( $lb->getWriterIndex() );
+                       if ( isset( $info['blobs table'] ) ) {
+                               return $info['blobs table'];
+                       }
                }
 
-               return $table;
+               return $db->getLBInfo( 'blobs table' ) ?? 'blobs'; // b/c
+       }
+
+       /**
+        * Create the appropriate blobs table on this cluster
+        *
+        * @see getTable()
+        * @since 1.34
+        * @param string $cluster
+        */
+       public function initializeTable( $cluster ) {
+               global $IP;
+
+               static $supportedTypes = [ 'mysql', 'sqlite' ];
+
+               $dbw = $this->getMaster( $cluster );
+               if ( !in_array( $dbw->getType(), $supportedTypes, true ) ) {
+                       throw new DBUnexpectedError( $dbw, "RDBMS type '{$dbw->getType()}' not supported." );
+               }
+
+               $sqlFilePath = "$IP/maintenance/storage/blobs.sql";
+               $sql = file_get_contents( $sqlFilePath );
+               if ( $sql === false ) {
+                       throw new RuntimeException( "Failed to read '$sqlFilePath'." );
+               }
+
+               $rawTable = $this->getTable( $dbw, $cluster ); // e.g. "blobs_cluster23"
+               $encTable = $dbw->tableName( $rawTable );
+               $dbw->query(
+                       str_replace(
+                               [ '/*$wgDBprefix*/blobs', '/*_*/blobs' ],
+                               [ $encTable, $encTable ],
+                               $sql
+                       ),
+                       __METHOD__,
+                       $dbw::QUERY_IGNORE_DBO_TRX
+               );
        }
 
        /**
@@ -251,15 +308,23 @@ class ExternalStoreDB extends ExternalStoreMedium {
 
                $this->logger->debug( "ExternalStoreDB::fetchBlob cache miss on $cacheID" );
 
-               $dbr = $this->getSlave( $cluster );
-               $ret = $dbr->selectField( $this->getTable( $dbr ),
-                       'blob_text', [ 'blob_id' => $id ], __METHOD__ );
+               $dbr = $this->getReplica( $cluster );
+               $ret = $dbr->selectField(
+                       $this->getTable( $dbr, $cluster ),
+                       'blob_text',
+                       [ 'blob_id' => $id ],
+                       __METHOD__
+               );
                if ( $ret === false ) {
                        $this->logger->info( "ExternalStoreDB::fetchBlob master fallback on $cacheID" );
                        // Try the master
                        $dbw = $this->getMaster( $cluster );
-                       $ret = $dbw->selectField( $this->getTable( $dbw ),
-                               'blob_text', [ 'blob_id' => $id ], __METHOD__ );
+                       $ret = $dbw->selectField(
+                               $this->getTable( $dbw, $cluster ),
+                               'blob_text',
+                               [ 'blob_id' => $id ],
+                               __METHOD__
+                       );
                        if ( $ret === false ) {
                                $this->logger->error( "ExternalStoreDB::fetchBlob master failed to find $cacheID" );
                        }
@@ -283,9 +348,9 @@ class ExternalStoreDB extends ExternalStoreMedium {
         *   Unlocated ids are not represented
         */
        private function batchFetchBlobs( $cluster, array $ids ) {
-               $dbr = $this->getSlave( $cluster );
+               $dbr = $this->getReplica( $cluster );
                $res = $dbr->select(
-                       $this->getTable( $dbr ),
+                       $this->getTable( $dbr, $cluster ),
                        [ 'blob_id', 'blob_text' ],
                        [ 'blob_id' => array_keys( $ids ) ],
                        __METHOD__
@@ -302,7 +367,8 @@ class ExternalStoreDB extends ExternalStoreMedium {
                        );
                        // Try the master
                        $dbw = $this->getMaster( $cluster );
-                       $res = $dbw->select( $this->getTable( $dbr ),
+                       $res = $dbw->select(
+                               $this->getTable( $dbr, $cluster ),
                                [ 'blob_id', 'blob_text' ],
                                [ 'blob_id' => array_keys( $ids ) ],
                                __METHOD__ );
index 9e04d09..f369f00 100644 (file)
@@ -123,8 +123,28 @@ class FileBackendGroup {
                        }
                        $class = $config['class'];
 
-                       // @FIXME: ideally this would default to the DB domain (which includes the schema)
-                       $config['domainId'] = $config['domainId'] ?? ( $config['wikiId'] ?? wfWikiID() );
+                       if ( isset( $config['domainId'] ) ) {
+                               $domainId = $config['domainId'];
+                       } elseif ( isset( $config['wikiId'] ) ) {
+                               $domainId = $config['wikiId']; // b/c
+                       } else {
+                               // Only use the raw database/prefix for backwards compatibility
+                               $ld = WikiMap::getCurrentWikiDbDomain();
+                               $domainId = strlen( $ld->getTablePrefix() )
+                                       ? "{$ld->getDatabase()}-{$ld->getTablePrefix()}"
+                                       : $ld->getDatabase();
+                               // If the local wiki ID and local domain ID do not match, probably due to a
+                               // non-default schema, issue a warning. A non-default schema indicates that
+                               // it might be used to disambiguate different wikis.
+                               $wikiId = WikiMap::getWikiIdFromDbDomain( $ld );
+                               if ( $ld->getSchema() !== null && $domainId !== $wikiId ) {
+                                       wfWarn(
+                                               "\$wgFileBackend entry '$name' should have 'domainId' set.\n" .
+                                               "Legacy default 'domainId' is '$domainId' but wiki ID is '$wikiId'."
+                                       );
+                               }
+                       }
+                       $config['domainId'] = $domainId;
                        $config['readOnly'] = $config['readOnly'] ?? $readOnlyReason;
 
                        unset( $config['class'] ); // backend won't need this
index 42e78ff..f095066 100644 (file)
@@ -142,6 +142,12 @@ class FileRepo {
        /** @var WANObjectCache */
        protected $wanCache;
 
+       /**
+        * @var string
+        * @protected Use $this->getName(). Public for back-compat only
+        */
+       public $name;
+
        /**
         * @param array|null $info
         * @throws MWException
@@ -832,7 +838,11 @@ class FileRepo {
        /**
         * Store a file to a given destination.
         *
-        * @param string $srcPath Source file system path, storage path, or virtual URL
+        * Using FSFile/TempFSFile can improve performance via caching.
+        * Using TempFSFile can further improve performance by signalling that it is safe
+        * to touch the source file or write extended attribute metadata to it directly.
+        *
+        * @param string|FSFile $srcPath Source file system path, storage path, or virtual URL
         * @param string $dstZone Destination zone
         * @param string $dstRel Destination relative path
         * @param int $flags Bitwise combination of the following flags:
@@ -856,6 +866,8 @@ class FileRepo {
        /**
         * Store a batch of files
         *
+        * @see FileRepo::store()
+        *
         * @param array $triplets (src, dest zone, dest rel) triplets as per store()
         * @param int $flags Bitwise combination of the following flags:
         *   self::OVERWRITE         Overwrite an existing destination file instead of failing
@@ -878,11 +890,18 @@ class FileRepo {
                $operations = [];
                // Validate each triplet and get the store operation...
                foreach ( $triplets as $triplet ) {
-                       list( $srcPath, $dstZone, $dstRel ) = $triplet;
+                       list( $src, $dstZone, $dstRel ) = $triplet;
+                       $srcPath = ( $src instanceof FSFile ) ? $src->getPath() : $src;
                        wfDebug( __METHOD__
                                . "( \$src='$srcPath', \$dstZone='$dstZone', \$dstRel='$dstRel' )\n"
                        );
-
+                       // Resolve source path
+                       if ( $src instanceof FSFile ) {
+                               $op = 'store';
+                       } else {
+                               $src = $this->resolveToStoragePathIfVirtual( $src );
+                               $op = FileBackend::isStoragePath( $src ) ? 'copy' : 'store';
+                       }
                        // Resolve destination path
                        $root = $this->getZonePath( $dstZone );
                        if ( !$root ) {
@@ -898,13 +917,10 @@ class FileRepo {
                                return $this->newFatal( 'directorycreateerror', $dstDir );
                        }
 
-                       // Resolve source to a storage path if virtual
-                       $srcPath = $this->resolveToStoragePathIfVirtual( $srcPath );
-
                        // Copy the source file to the destination
                        $operations[] = [
-                               'op' => FileBackend::isStoragePath( $srcPath ) ? 'copy' : 'store',
-                               'src' => $srcPath, // storage path (copy) or local file path (store)
+                               'op' => $op,
+                               'src' => $src, // storage path (copy) or local file path (store)
                                'dst' => $dstPath,
                                'overwrite' => ( $flags & self::OVERWRITE ) ? true : false,
                                'overwriteSame' => ( $flags & self::OVERWRITE_SAME ) ? true : false,
@@ -964,6 +980,10 @@ class FileRepo {
         * This function can be used to write to otherwise read-only foreign repos.
         * This is intended for copying generated thumbnails into the repo.
         *
+        * Using FSFile/TempFSFile can improve performance via caching.
+        * Using TempFSFile can further improve performance by signalling that it is safe
+        * to touch the source file or write extended attribute metadata to it directly.
+        *
         * @param string|FSFile $src Source file system path, storage path, or virtual URL
         * @param string $dst Virtual URL or storage path
         * @param array|string|null $options An array consisting of a key named headers
@@ -975,39 +995,14 @@ class FileRepo {
                return $this->quickImportBatch( [ [ $src, $dst, $options ] ] );
        }
 
-       /**
-        * Purge a file from the repo. This does no locking nor journaling.
-        * This function can be used to write to otherwise read-only foreign repos.
-        * This is intended for purging thumbnails.
-        *
-        * @param string $path Virtual URL or storage path
-        * @return Status
-        */
-       final public function quickPurge( $path ) {
-               return $this->quickPurgeBatch( [ $path ] );
-       }
-
-       /**
-        * Deletes a directory if empty.
-        * This function can be used to write to otherwise read-only foreign repos.
-        *
-        * @param string $dir Virtual URL (or storage path) of directory to clean
-        * @return Status
-        */
-       public function quickCleanDir( $dir ) {
-               $status = $this->newGood();
-               $status->merge( $this->backend->clean(
-                       [ 'dir' => $this->resolveToStoragePathIfVirtual( $dir ) ] ) );
-
-               return $status;
-       }
-
        /**
         * Import a batch of files from the local file system into the repo.
         * This does no locking nor journaling and overrides existing files.
         * This function can be used to write to otherwise read-only foreign repos.
         * This is intended for copying generated thumbnails into the repo.
         *
+        * @see FileRepo::quickImport()
+        *
         * All path parameters may be a file system path, storage path, or virtual URL.
         * When "headers" are given they are used as HTTP headers if supported.
         *
@@ -1040,7 +1035,7 @@ class FileRepo {
 
                        $operations[] = [
                                'op' => $op,
-                               'src' => $src,
+                               'src' => $src, // storage path (copy) or local path/FSFile (store)
                                'dst' => $dst,
                                'headers' => $headers
                        ];
@@ -1051,6 +1046,33 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Purge a file from the repo. This does no locking nor journaling.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This is intended for purging thumbnails.
+        *
+        * @param string $path Virtual URL or storage path
+        * @return Status
+        */
+       final public function quickPurge( $path ) {
+               return $this->quickPurgeBatch( [ $path ] );
+       }
+
+       /**
+        * Deletes a directory if empty.
+        * This function can be used to write to otherwise read-only foreign repos.
+        *
+        * @param string $dir Virtual URL (or storage path) of directory to clean
+        * @return Status
+        */
+       public function quickCleanDir( $dir ) {
+               $status = $this->newGood();
+               $status->merge( $this->backend->clean(
+                       [ 'dir' => $this->resolveToStoragePathIfVirtual( $dir ) ] ) );
+
+               return $status;
+       }
+
        /**
         * Purge a batch of files from the repo.
         * This function can be used to write to otherwise read-only foreign repos.
@@ -1163,6 +1185,10 @@ class FileRepo {
         * Returns a Status object. On success, the value contains "new" or
         * "archived", to indicate whether the file was new with that name.
         *
+        * Using FSFile/TempFSFile can improve performance via caching.
+        * Using TempFSFile can further improve performance by signalling that it is safe
+        * to touch the source file or write extended attribute metadata to it directly.
+        *
         * Options to $options include:
         *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
         *
@@ -1193,6 +1219,8 @@ class FileRepo {
        /**
         * Publish a batch of files
         *
+        * @see FileRepo::publish()
+        *
         * @param array $ntuples (source, dest, archive) triplets or
         *   (source, dest, archive, options) 4-tuples as per publish().
         * @param int $flags Bitfield, may be FileRepo::DELETE_SOURCE to indicate
@@ -1271,7 +1299,7 @@ class FileRepo {
                        } else {
                                $operations[] = [
                                        'op' => 'store',
-                                       'src' => $src, // FSFile (preferred) or local file path
+                                       'src' => $src, // storage path (copy) or local path/FSFile (store)
                                        'dst' => $dstPath,
                                        'overwrite' => true, // replace current
                                        'headers' => $headers
index 17fa146..a968831 100644 (file)
@@ -94,6 +94,9 @@ class ArchivedFile {
        /** @var Title */
        protected $title; # image title
 
+       /** @var bool */
+       private $exists;
+
        /**
         * @throws MWException
         * @param Title $title
@@ -435,7 +438,9 @@ class ArchivedFile {
        function pageCount() {
                if ( !isset( $this->pageCount ) ) {
                        // @FIXME: callers expect File objects
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        if ( $this->getHandler() && $this->handler->isMultiPage( $this ) ) {
+                               // @phan-suppress-next-line PhanTypeMismatchArgument
                                $this->pageCount = $this->handler->pageCount( $this );
                        } else {
                                $this->pageCount = false;
index 0d5776b..73b08e6 100644 (file)
@@ -1467,13 +1467,15 @@ abstract class File implements IDBAccessObject {
                // Delete thumbnails and refresh file metadata cache
                $this->purgeCache();
                $this->purgeDescription();
-
                // Purge cache of all pages using this file
                $title = $this->getTitle();
                if ( $title ) {
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'imagelinks', 'file-purge' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'imagelinks',
+                               [ 'causeAction' => 'file-purge' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                }
        }
 
@@ -2040,7 +2042,7 @@ abstract class File implements IDBAccessObject {
         * Get the URL of the image description page. May return false if it is
         * unknown or not applicable.
         *
-        * @return string
+        * @return string|bool
         */
        function getDescriptionUrl() {
                if ( $this->repo ) {
index ceb8dda..6d29433 100644 (file)
@@ -452,6 +452,10 @@ class LocalFile extends File {
         * This covers fields that are sometimes not cached.
         */
        protected function loadExtraFromDB() {
+               if ( !$this->title ) {
+                       return; // Avoid hard failure when the file does not exist. T221812
+               }
+
                $fname = static::class . '::' . __FUNCTION__;
 
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
@@ -857,12 +861,24 @@ class LocalFile extends File {
        function getUser( $type = 'text' ) {
                $this->load();
 
-               if ( $type === 'object' ) {
-                       return $this->user;
-               } elseif ( $type === 'text' ) {
-                       return $this->user->getName();
-               } elseif ( $type === 'id' ) {
-                       return $this->user->getId();
+               if ( !$this->user ) {
+                       // If the file does not exist, $this->user will be null, see T221812.
+                       // Note: 'Unknown user' this is a reserved user name.
+                       if ( $type === 'object' ) {
+                               return User::newFromName( 'Unknown user', false );
+                       } elseif ( $type === 'text' ) {
+                               return 'Unknown user';
+                       } elseif ( $type === 'id' ) {
+                               return 0;
+                       }
+               } else {
+                       if ( $type === 'object' ) {
+                               return $this->user;
+                       } elseif ( $type === 'text' ) {
+                               return $this->user->getName();
+                       } elseif ( $type === 'id' ) {
+                               return $this->user->getId();
+                       }
                }
 
                throw new MWException( "Unknown type '$type'." );
@@ -876,9 +892,13 @@ class LocalFile extends File {
         * @since 1.27
         */
        public function getDescriptionShortUrl() {
+               if ( !$this->title ) {
+                       return null; // Avoid hard failure when the file does not exist. T221812
+               }
+
                $pageId = $this->title->getArticleID();
 
-               if ( $pageId !== null ) {
+               if ( $pageId ) {
                        $url = $this->repo->makeUrl( [ 'curid' => $pageId ] );
                        if ( $url !== false ) {
                                return $url;
@@ -1145,6 +1165,10 @@ class LocalFile extends File {
         * @return OldLocalFile[]
         */
        function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
+               if ( !$this->exists() ) {
+                       return []; // Avoid hard failure when the file does not exist. T221812
+               }
+
                $dbr = $this->repo->getReplicaDB();
                $oldFileQuery = OldLocalFile::getQueryInfo();
 
@@ -1198,9 +1222,13 @@ class LocalFile extends File {
         *  0      return line for current version
         *  1      query for old versions, return first one
         *  2, ... return next old version from above query
-        * @return bool
+        * @return stdClass|bool
         */
        public function nextHistoryLine() {
+               if ( !$this->exists() ) {
+                       return false; // Avoid hard failure when the file does not exist. T221812
+               }
+
                # Polymorphic function name to distinguish foreign and local fetches
                $fname = static::class . '::' . __FUNCTION__;
 
@@ -2026,9 +2054,13 @@ class LocalFile extends File {
 
        /**
         * Get the URL of the file description page.
-        * @return string
+        * @return string|bool
         */
        function getDescriptionUrl() {
+               if ( !$this->title ) {
+                       return false; // Avoid hard failure when the file does not exist. T221812
+               }
+
                return $this->title->getLocalURL();
        }
 
@@ -2041,6 +2073,10 @@ class LocalFile extends File {
         * @return string|false
         */
        function getDescriptionText( Language $lang = null ) {
+               if ( !$this->title ) {
+                       return false; // Avoid hard failure when the file does not exist. T221812
+               }
+
                $store = MediaWikiServices::getInstance()->getRevisionStore();
                $revision = $store->getRevisionByTitle( $this->title, 0, Revision::READ_NORMAL );
                if ( !$revision ) {
@@ -2090,6 +2126,10 @@ class LocalFile extends File {
         * @return bool|string
         */
        public function getDescriptionTouched() {
+               if ( !$this->exists() ) {
+                       return false; // Avoid hard failure when the file does not exist. T221812
+               }
+
                // The DB lookup might return false, e.g. if the file was just deleted, or the shared DB repo
                // itself gets it from elsewhere. To avoid repeating the DB lookups in such a case, we
                // need to differentiate between null (uninitialized) and false (failed to load).
index 85988f6..f363beb 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper class for file deletion
index 7cfc8c2..b76f3da 100644 (file)
@@ -29,9 +29,9 @@ class LocalFileLockError extends ErrorPageError {
                );
        }
 
-       public function report() {
+       public function report( $action = self::SEND_OUTPUT ) {
                global $wgOut;
                $wgOut->setStatusCode( 429 );
-               parent::report();
+               parent::report( $action );
        }
 }
index 21980b9..0cdc2d5 100644 (file)
@@ -46,6 +46,24 @@ class LocalFileMoveBatch {
        /** @var IDatabase */
        protected $db;
 
+       /** @var string */
+       protected $oldHash;
+
+       /** @var string */
+       protected $newHash;
+
+       /** @var string */
+       protected $oldName;
+
+       /** @var string */
+       protected $newName;
+
+       /** @var string */
+       protected $oldRel;
+
+       /** @var string */
+       protected $newRel;
+
        /**
         * @param File $file
         * @param Title $target
index c6d8ddf..4781a48 100644 (file)
@@ -88,6 +88,15 @@ abstract class ImageGalleryBase extends ContextSource {
        /** @var array */
        protected $mAttribs = [];
 
+       /** @var int */
+       protected $mPerRow;
+
+       /** @var int */
+       protected $mWidths;
+
+       /** @var int */
+       protected $mHeights;
+
        /** @var array */
        private static $modeMapping;
 
index 6e760fa..a5d7145 100644 (file)
@@ -149,6 +149,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( ConcatenatedGzipHistoryBlob::class, 'concatenatedgziphistoryblob' );
 }
index cd2a935..8858c8d 100644 (file)
@@ -69,6 +69,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( HistoryBlobCurStub::class, 'historyblobcurstub' );
 }
index c92e1b5..9a4df1f 100644 (file)
@@ -149,6 +149,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( HistoryBlobStub::class, 'historyblobstub' );
 }
diff --git a/includes/htmlform/CollapsibleFieldsetLayout.php b/includes/htmlform/CollapsibleFieldsetLayout.php
new file mode 100644 (file)
index 0000000..804f1b9
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+class CollapsibleFieldsetLayout extends OOUI\FieldsetLayout {
+       public function __construct( array $config = [] ) {
+               parent::__construct( $config );
+
+               $this->addClasses( [ 'mw-collapsible' ] );
+               if ( isset( $config[ 'collapsed' ] ) && $config[ 'collapsed' ] ) {
+                       $this->addClasses( [ 'mw-collapsed' ] );
+               }
+               $this->header->addClasses( [ 'mw-collapsible-toggle' ] );
+               $this->group->addClasses( [ 'mw-collapsible-content' ] );
+
+               $this->header->appendContent(
+                       new OOUI\IconWidget( [
+                               'icon' => 'expand',
+                               'label' => wfMessage( 'collapsible-expand' )->text(),
+                       ] ),
+                       new OOUI\IconWidget( [
+                               'icon' => 'collapse',
+                               'label' => wfMessage( 'collapsible-collapse' )->text(),
+                       ] )
+               );
+
+               $this->header->setAttributes( [
+                       'role' => 'button',
+               ] );
+       }
+}
index 04be6c4..58c1602 100644 (file)
@@ -1329,7 +1329,7 @@ class HTMLForm extends ContextSource {
                }
 
                return $elementstr
-                       ? Html::rawElement( 'div', [ 'class' => $elementsType ], $elementstr )
+                       ? Html::rawElement( 'div', [ 'class' => $elementsType . 'box' ], $elementstr )
                        : '';
        }
 
index 048abbb..b55b652 100644 (file)
@@ -657,6 +657,7 @@ abstract class HTMLFormField {
         * @param OOUI\Widget $inputField
         * @param array $config
         * @return OOUI\FieldLayout|OOUI\ActionFieldLayout
+        * @suppress PhanUndeclaredProperty Only some subclasses declare mClassWithButton
         */
        protected function getFieldLayoutOOUI( $inputField, $config ) {
                if ( isset( $this->mClassWithButton ) ) {
index baafa5e..94ba75e 100644 (file)
@@ -281,17 +281,10 @@ class OOUIHTMLForm extends HTMLForm {
 
        public function wrapForm( $html ) {
                if ( is_string( $this->mWrapperLegend ) ) {
-                       $classes = $this->mCollapsible ? [ 'mw-collapsible' ] : [];
-                       if ( $this->mCollapsed ) {
-                               $classes[] = 'mw-collapsed';
-                       }
-                       $content = new OOUI\FieldsetLayout( [
+                       $phpClass = $this->mCollapsible ? CollapsibleFieldsetLayout::class : OOUI\FieldsetLayout::class;
+                       $content = new $phpClass( [
                                'label' => $this->mWrapperLegend,
-                               'classes' => $classes,
-                               'group' => new OOUI\StackLayout( [
-                                       'expanded' => false,
-                                       'classes' => [ 'mw-collapsible-content' ],
-                               ] ),
+                               'collapsed' => $this->mCollapsed,
                                'items' => [
                                        new OOUI\Widget( [
                                                'content' => new OOUI\HtmlSnippet( $html )
index 354432b..05ab0bb 100644 (file)
@@ -11,6 +11,9 @@
  * @todo FIXME: If made 'required', only the text field should be compulsory.
  */
 class HTMLSelectAndOtherField extends HTMLSelectField {
+       /** @var string[] */
+       private $mFlatOptions;
+
        public function __construct( $params ) {
                if ( array_key_exists( 'other', $params ) ) {
                        // Do nothing
index 1eda33c..3df5b7e 100644 (file)
@@ -7,9 +7,6 @@ use MediaWiki\Widget\TitleInputWidget;
  * Automatically does validation that the title is valid,
  * as well as autocompletion if using the OOUI display format.
  *
- * Note: Forms using GET requests will need to make sure the title value is not
- * an empty string.
- *
  * Optional parameters:
  * 'namespace' - Namespace the page must be in
  * 'relative' - If true and 'namespace' given, strip/add the namespace from/to the title as needed
@@ -33,14 +30,6 @@ class HTMLTitleTextField extends HTMLTextField {
        }
 
        public function validate( $value, $alldata ) {
-               if ( $this->mParent->getMethod() === 'get' && $value === '' ) {
-                       // If the form is a GET form and has no value, assume it hasn't been
-                       // submitted yet, and skip validation
-                       // TODO This doesn't look right, we should be able to tell the difference
-                       // between "not submitted" (null) and "submitted but empty" (empty string).
-                       return parent::validate( $value, $alldata );
-               }
-
                // Default value (from getDefault()) is null, which breaks Title::newFromTextThrow() below
                if ( $value === null ) {
                        $value = '';
index 5b3bc25..0e4d842 100644 (file)
@@ -6,8 +6,6 @@ use MediaWiki\Widget\UserInputWidget;
  * Implements a text input field for user names.
  * Automatically auto-completes if using the OOUI display format.
  *
- * FIXME: Does not work for forms that support GET requests.
- *
  * Optional parameters:
  * 'exists' - Whether to validate that the user already exists
  * 'ipallowed' - Whether an IP adress is interpreted as "valid"
index 8433df6..84e7b73 100644 (file)
@@ -37,8 +37,8 @@ class HttpRequestFactory {
         * Generate a new MWHttpRequest object
         * @param string $url Url to use
         * @param array $options Possible keys for the array:
-        *    - timeout             Timeout length in seconds
-        *    - connectTimeout      Timeout for connection, in seconds (curl only)
+        *    - timeout             Timeout length in seconds or 'default'
+        *    - connectTimeout      Timeout for connection, in seconds (curl only) or 'default'
         *    - postData            An array of key-value pairs or a url-encoded form data
         *    - proxy               The proxy to use.
         *                          Otherwise it will use $wgHTTPProxy (if set)
@@ -59,13 +59,12 @@ class HttpRequestFactory {
         *    - 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
+        * @phan-param array{timeout?:int|string,connectTimeout?:int|string,postData?:array,proxy?:string,noProxy?:bool,sslVerifyHost?:bool,sslVerifyCert?:bool,caInfo?:string,maxRedirects?:int,followRedirects?:bool,userAgent?:string,method?:string,logger?:\Psr\Log\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 a4120a3..13ab9b7 100644 (file)
@@ -29,6 +29,7 @@ use GuzzleHttp\Psr7\StreamDecoratorTrait;
  *
  * @private for use by GuzzleHttpRequest only
  * @since 1.33
+ * @property StreamInterface $stream Defined in StreamDecoratorTrait via @property, not read by phan
  */
 class MWCallbackStream implements StreamInterface {
        use StreamDecoratorTrait;
index d1c14ae..0f3096e 100644 (file)
@@ -89,7 +89,7 @@ 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
+        * @phan-param array{timeout?:int|string,connectTimeout?:int|string,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
index 2f8f5dd..81e414e 100644 (file)
@@ -30,6 +30,9 @@ use MediaWiki\MediaWikiServices;
  * @ingroup SpecialPage
  */
 class ImportStreamSource implements ImportSource {
+       /** @var resource */
+       private $mHandle;
+
        /**
         * @param resource $handle
         */
index fdd1f77..b75ea1a 100644 (file)
  * @ingroup SpecialPage
  */
 class ImportStringSource implements ImportSource {
+       /** @var string */
+       private $mString;
+
+       /** @var bool */
+       private $mRead;
+
        /**
         * @param string $string
         */
index 0d1cc68..6eba4f3 100644 (file)
@@ -33,7 +33,8 @@ use MediaWiki\MediaWikiServices;
  * @ingroup SpecialPage
  */
 class WikiImporter {
-       private $reader = null;
+       /** @var XMLReader */
+       private $reader;
        private $foreignNamespaces = null;
        private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
        private $mSiteInfoCallback, $mPageOutCallback;
index c29ba21..e0799c0 100644 (file)
@@ -185,9 +185,16 @@ class WikiRevision implements ImportableUploadRevision, ImportableOldRevision {
        /** @var bool */
        private $mNoUpdates = false;
 
-       /** @var Config $config */
+       /**
+        * @deprecated since 1.31, along with self::downloadSource()
+        * @var Config $config
+        */
        private $config;
 
+       /**
+        * @param Config $config Deprecated since 1.31, along with self::downloadSource(). Just pass an
+        *  empty HashConfig.
+        */
        public function __construct( Config $config ) {
                $this->config = $config;
        }
index ac8c9e6..ce7e29d 100644 (file)
@@ -690,7 +690,7 @@ abstract class DatabaseInstaller {
                        $this->getPasswordBox( 'wgDBpassword', 'config-db-password' ) .
                        $this->parent->getHelpBox( 'config-db-web-help' );
                if ( $noCreateMsg ) {
-                       $s .= $this->parent->getWarningBox( wfMessage( $noCreateMsg )->plain() );
+                       $s .= Html::warningBox( wfMessage( $noCreateMsg )->plain(), 'config-warning-box' );
                } else {
                        $s .= $this->getCheckBox( '_CreateDBAccount', 'config-db-web-create' );
                }
index 08cfd86..eb96e05 100644 (file)
@@ -21,6 +21,9 @@
  */
 
 class InstallDocFormatter {
+       /** @var string */
+       private $text;
+
        public static function format( $text ) {
                $obj = new self( $text );
 
index a2179c6..6921361 100644 (file)
@@ -30,6 +30,7 @@
 class LocalSettingsGenerator {
 
        protected $extensions = [];
+       protected $skins = [];
        protected $values = [];
        protected $groupPermissions = [];
        protected $dbSettings = '';
index 64c017b..f0519c7 100644 (file)
@@ -29,7 +29,7 @@ use MediaWiki\MediaWikiServices;
  *
  * @ingroup Deployment
  * @since 1.17
- * @property DatabaseMysqlBase $db
+ * @property Wikimedia\Rdbms\DatabaseMysqlBase $db
  */
 class MysqlUpdater extends DatabaseUpdater {
        protected function getCoreUpdateList() {
@@ -327,6 +327,20 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'renameIndex', 'user_properties', 'user_properties_user_property', 'PRIMARY', false,
                                'patch-user_properties-fix-pk.sql' ],
                        [ 'addTable', 'comment', 'patch-comment-table.sql' ],
+                       [ 'addTable', 'revision_comment_temp', 'patch-revision_comment_temp-table.sql' ],
+                       // image_comment_temp is no longer needed when upgrading to MW 1.31 or newer,
+                       // as it is dropped later in the update process as part of 'migrateImageCommentTemp'.
+                       // File kept on disk and the updater entry here for historical purposes.
+                       // [ 'addTable', 'image_comment_temp', 'patch-image_comment_temp-table.sql' ],
+                       [ 'addField', 'archive', 'ar_comment_id', 'patch-archive-ar_comment_id.sql' ],
+                       [ 'addField', 'filearchive', 'fa_description_id', 'patch-filearchive-fa_description_id.sql' ],
+                       [ 'modifyField', 'image', 'img_description', 'patch-image-img_description-default..sql' ],
+                       [ 'addField', 'ipblocks', 'ipb_reason_id', 'patch-ipblocks-ipb_reason_id.sql' ],
+                       [ 'addField', 'logging', 'log_comment_id', 'patch-logging-log_comment_id.sql' ],
+                       [ 'addField', 'oldimage', 'oi_description_id', 'patch-oldimage-oi_description_id.sql' ],
+                       [ 'addField', 'protected_titles', 'pt_reason_id', 'patch-protected_titles-pt_reason_id.sql' ],
+                       [ 'addField', 'recentchanges', 'rc_comment_id', 'patch-recentchanges-rc_comment_id.sql' ],
+                       [ 'modifyField', 'revision', 'rev_comment', 'patch-revision-rev_comment-default.sql' ],
 
                        // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
                        [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
@@ -386,7 +400,11 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'modifyTable', 'job', 'patch-job-params-mediumblob.sql' ],
 
                        // 1.34
+                       [ 'dropIndex', 'archive', 'ar_usertext_timestamp',
+                               'patch-drop-archive-ar_usertext_timestamp.sql' ],
+                       [ 'dropIndex', 'archive', 'usertext_timestamp', 'patch-drop-archive-usertext_timestamp.sql' ],
                        [ 'dropField', 'logging', 'log_user', 'patch-drop-user-fields.sql' ],
+                       [ 'addIndex', 'user_newtalk', 'un_user_ip', 'patch-rename-mysql-user_newtalk-indexes.sql' ],
                ];
        }
 
index 9a3d4a3..e9b0c56 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabasePostgres;
 use Wikimedia\Rdbms\DBQueryError;
 use Wikimedia\Rdbms\DBConnectionError;
 
index b2c7d66..d7b1457 100644 (file)
@@ -483,6 +483,11 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'changeNullableField', 'protected_titles', 'pt_reason', 'NOT NULL', true ],
                        [ 'addPgField', 'protected_titles', 'pt_reason_id', 'INTEGER NOT NULL DEFAULT 0' ],
                        [ 'addTable', 'comment', 'patch-comment-table.sql' ],
+                       [ 'addTable', 'revision_comment_temp', 'patch-revision_comment_temp-table.sql' ],
+                       // image_comment_temp is no longer needed when upgrading to MW 1.31 or newer,
+                       // as it is dropped later in the update process as part of 'migrateImageCommentTemp'.
+                       // File kept on disk and the updater entry here for historical purposes.
+                       // [ 'addTable', 'image_comment_temp', 'patch-image_comment_temp-table.sql' ],
 
                        // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
                        [ 'addPgField', 'image', 'img_description_id', 'INTEGER NOT NULL DEFAULT 0' ],
index 7c3878c..4722443 100644 (file)
@@ -186,6 +186,19 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'renameIndex', 'user_properties', 'user_properties_user_property', 'PRIMARY', false,
                                'patch-user_properties-fix-pk.sql' ],
                        [ 'addTable', 'comment', 'patch-comment-table.sql' ],
+                       [ 'addTable', 'revision_comment_temp', 'patch-revision_comment_temp-table.sql' ],
+                       // image_comment_temp is no longer needed when upgrading to MW 1.31 or newer,
+                       // as it is dropped later in the update process as part of 'migrateImageCommentTemp'.
+                       // File kept on disk and the updater entry here for historical purposes.
+                       // [ 'addTable', 'image_comment_temp', 'patch-image_comment_temp-table.sql' ],
+                       [ 'addField', 'archive', 'ar_comment_id', 'patch-archive-ar_comment_id.sql' ],
+                       [ 'modifyField', 'image', 'img_description', 'patch-image-img_description-default..sql' ],
+                       [ 'addField', 'ipblocks', 'ipb_reason_id', 'patch-ipblocks-ipb_reason_id.sql' ],
+                       [ 'addField', 'logging', 'log_comment_id', 'patch-logging-log_comment_id.sql' ],
+                       [ 'addField', 'oldimage', 'oi_description_id', 'patch-oldimage-oi_description_id.sql' ],
+                       [ 'addField', 'protected_titles', 'pt_reason_id', 'patch-protected_titles-pt_reason_id.sql' ],
+                       [ 'addField', 'recentchanges', 'rc_comment_id', 'patch-recentchanges-rc_comment_id.sql' ],
+                       [ 'modifyField', 'revision', 'rev_comment', 'patch-revision-rev_comment-default.sql' ],
 
                        // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
                        [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
index b6e90a9..d9cd6de 100644 (file)
@@ -390,7 +390,8 @@ class WebInstaller extends Installer {
                        );
                }
                $text = $msg->useDatabase( false )->plain();
-               $this->output->addHTML( $this->getErrorBox( $text ) );
+               $box = Html::errorBox( $text, '', 'config-error-box' );
+               $this->output->addHTML( $box );
        }
 
        /**
@@ -637,34 +638,40 @@ class WebInstaller extends Installer {
        /**
         * Get HTML for an error box with an icon.
         *
+        * @deprecated since 1.34 Use Html::errorBox() instead.
         * @param string $text Wikitext, get this with wfMessage()->plain()
         *
         * @return string
         */
        public function getErrorBox( $text ) {
+               wfDeprecated( __METHOD__, '1.34' );
                return $this->getInfoBox( $text, 'critical-32.png', 'config-error-box' );
        }
 
        /**
         * Get HTML for a warning box with an icon.
         *
+        * @deprecated since 1.34 Use Html::warningBox() instead.
         * @param string $text Wikitext, get this with wfMessage()->plain()
         *
         * @return string
         */
        public function getWarningBox( $text ) {
+               wfDeprecated( __METHOD__, '1.34' );
                return $this->getInfoBox( $text, 'warning-32.png', 'config-warning-box' );
        }
 
        /**
         * Get HTML for an information message box with an icon.
         *
+        * @deprecated since 1.34.
         * @param string|HtmlArmor $text Wikitext to be parsed (from Message::plain) or raw HTML.
         * @param string|bool $icon Icon name, file in mw-config/images. Default: false
         * @param string|bool $class Additional class name to add to the wrapper div. Default: false.
         * @return string HTML
         */
        public function getInfoBox( $text, $icon = false, $class = false ) {
+               wfDeprecated( __METHOD__, '1.34' );
                $html = ( $text instanceof HtmlArmor ) ?
                        HtmlArmor::getHtml( $text ) :
                        $this->parse( $text, true );
@@ -1046,9 +1053,9 @@ class WebInstaller extends Installer {
                        $text = $status->getWikiText();
 
                        if ( $status->isOK() ) {
-                               $box = $this->getWarningBox( $text );
+                               $box = Html::warningBox( $text, 'config-warning-box' );
                        } else {
-                               $box = $this->getErrorBox( $text );
+                               $box = Html::errorBox( $text, '', 'config-error-box' );
                        }
 
                        $this->output->addHTML( $box );
index 7bec49a..3521fa1 100644 (file)
@@ -137,7 +137,7 @@ class WebInstallerOptions extends WebInstallerPage {
                        }
                } else {
                        $skinHtml .=
-                               $this->parent->getWarningBox( wfMessage( 'config-skins-missing' )->plain() ) .
+                               Html::warningBox( wfMessage( 'config-skins-missing' )->plain(), 'config-warning-box' ) .
                                Html::hidden( 'config_wgDefaultSkin', $chosenSkinName );
                }
 
index be55c32..07e2e75 100644 (file)
@@ -36,7 +36,7 @@ class WebInstallerRestart extends WebInstallerPage {
                }
 
                $this->startForm();
-               $s = $this->parent->getWarningBox( wfMessage( 'config-help-restart' )->plain() );
+               $s = Html::warningBox( wfMessage( 'config-help-restart' )->plain(), '', 'config-warning-box' );
                $this->addHTML( $s );
                $this->endForm( 'restart' );
 
index 168c937..dfea0a5 100644 (file)
@@ -7,7 +7,8 @@
                        "Zedlik",
                        "아라",
                        "Red Winged Duck",
-                       "Macofe"
+                       "Macofe",
+                       "Renessaince"
                ]
        },
        "config-desc": "Праграма ўсталяваньня MediaWiki",
@@ -85,7 +86,7 @@
        "config-uploads-not-safe": "'''Папярэджаньне:''' дырэкторыя для загрузак па змоўчваньні <code>$1</code> уразьлівая да выкананьня адвольнага коду.\nХоць MediaWiki і правярае ўсе файлы перад захаваньнем, вельмі рэкамэндуецца [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыць гэтую ўразьлівасьць] перад уключэньнем магчымасьці загрузкі файлаў.",
        "config-no-cli-uploads-check": "'''Папярэджаньне:''' Вашая дырэкторыя для загрузак па змоўчваньні (<code>$1</code>), не правераная на ўразьлівасьць да выкананьня адвольных скрыптоў падчас усталяваньня CLI.\n.",
        "config-brokenlibxml": "У Вашай сыстэме ўсталяваныя PHP і libxml2 зь несумяшчальнымі вэрсіямі, што можа прывесьці да пашкоджаньня зьвестак MediaWiki і іншых вэб-дастасаваньняў.\nАбнавіце libxml2 да вэрсіі 2.7.3 ці больш позьняй ([https://bugs.php.net/bug.php?id=45996 паведамленьне пра памылку на сайце PHP]).\nУсталяваньне перарванае.",
-       "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nResourceLoader, складнік MediaWiki, будзе абходзіць гэтае абмежаваньне, што адаб’ецца на прадукцыйнасьці.\nКалі магчыма, варта ўсталяваць у <code>php.ini</code> значэньне <code>suhosin.get.max_value_length</code> роўным 1024 ці больш, а таксама вызначыць тое ж значэньне для <code>$wgResourceLoaderMaxQueryLength</code> у <code>LocalSettings.php</code>.",
+       "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nMediaWiki патрабуе, каб <code>suhosin.get.max_value_length</code> складаў прынамсі $2. Адключыце гэтую наладу ці павялічце гэтае значэньня да $3 ў <code>php.ini</code>.",
        "config-using-32bit": "<strong>Папярэджаньне:</strong> падобна, што вашая сыстэма выкарыстоўвае 32-бітавыя цэлыя лікі. Гэта [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не рэкамэндуецца].",
        "config-db-type": "Тып базы зьвестак:",
        "config-db-host": "Хост базы зьвестак:",
index 649f841..866c3f5 100644 (file)
@@ -16,7 +16,8 @@
                        "Das Schäfchen",
                        "Florian",
                        "Macofe",
-                       "ThePiscin"
+                       "ThePiscin",
+                       "Tobi 406"
                ]
        },
        "config-desc": "Das MediaWiki-Installationsprogramm",
        "config-restart": "Ja, erneut starten",
        "config-welcome": "=== Prüfung der Installationsumgebung ===\nDie Basisprüfungen werden jetzt durchgeführt, um festzustellen, ob die Installationsumgebung für MediaWiki geeignet ist.\nNotiere diese Informationen und gib sie an, sofern du Hilfe beim Installieren benötigst.",
        "config-welcome-section-copyright": "=== Lizenz und Nutzungsbedingungen ===\n\n$1\n\nDieses Programm ist freie Software, d. h. es kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.\n\nDieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings '''ohne jegliche Garantie''' und sogar ohne die implizierte Garantie einer '''Marktgängigkeit''' oder '''Eignung für einen bestimmten Zweck'''. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.\n\nEine [$2 Kopie der GNU General Public License] sollte zusammen mit diesem Programm verteilt worden sein. Sofern dies nicht der Fall war, kann eine Kopie bei der Free Software Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, schriftlich angefordert oder auf deren Website [https://www.gnu.org/copyleft/gpl.html online gelesen] werden.",
-       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzer­anleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratoren­anleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]\n----\n* <doclink href=Readme>Lies mich</doclink>\n* <doclink href=ReleaseNotes>Versions­informationen</doclink>\n* <doclink href=Copying>Lizenz­bestimmungen</doclink>\n* <doclink href=UpgradeDoc>Aktualisierung</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/de Website von MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/de Benutzer­anleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/de Administratoren­anleitung]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/de Häufig gestellte Fragen]",
+       "config-sidebar-readme": "Lies mich",
+       "config-sidebar-relnotes": "Veröffentlichungsinformationen",
+       "config-sidebar-license": "Kopieren",
+       "config-sidebar-upgrade": "Aktualisieren",
        "config-env-good": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann installiert werden.",
        "config-env-bad": "Die Installationsumgebung wurde geprüft.\nMediaWiki kann nicht installiert werden.",
        "config-env-php": "Die Skriptsprache „PHP“ ($1) ist installiert.",
        "config-env-hhvm": "HHVM $1 ist installiert.",
-       "config-unicode-using-intl": "Zur  Unicode-Normalisierung wird die [https://pecl.php.net/intl PECL-Erweiterung intl] eingesetzt.",
-       "config-unicode-pure-php-warning": "'''Warnung:''' Die [https://pecl.php.net/intl PECL-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Webseite [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung (en)] gelesen werden.",
+       "config-unicode-using-intl": "Zur  Unicode-Normalisierung wird die [https://www.php.net/manual/de/book.intl.php PHP-Erweiterung intl] eingesetzt.",
+       "config-unicode-pure-php-warning": "'''Warnung:''' Die [https://www.php.net/manual/de/book.intl.php PHP-Erweiterung intl] ist für die Unicode-Normalisierung nicht verfügbar, so dass stattdessen die langsame pure-PHP-Implementierung genutzt wird.\nSofern eine Website mit großer Benutzeranzahl betrieben wird, sollten weitere Informationen auf der Seite [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-Normalisierung] gelesen werden.",
        "config-unicode-update-warning": "'''Warnung:''' Die installierte Version des Unicode-Normalisierungswrappers nutzt einer ältere Version der Bibliothek des [http://site.icu-project.org/ ICU-Projekts].\nDiese sollte [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiert] werden, sofern auf die Verwendung von Unicode Wert gelegt wird.",
        "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\n{{PLURAL:$2|Das folgende Datenbanksystem wird|Die folgenden Datenbanksysteme werden}} unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von <code>./configure --with-mysqli</code>.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das <code>php-mysql</code>-Paket installieren.",
-       "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.",
+       "config-outdated-sqlite": "<strong>Warnung:</strong> du hast SQLite $2, was unter der benötigten Version $1 liegt. SQLite wird daher nicht verfügar sein.",
        "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, sodass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.",
        "config-pcre-old": "<strong>Fataler Fehler:</strong> PCRE $1 oder neuer ist erforderlich!\nDie vorhandene PHP-Binärdatei ist mit PCRE $2 verknüpft.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Weitere Informationen].",
        "config-pcre-no-utf8": "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.\nMediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein.",
@@ -90,7 +95,7 @@
        "config-uploads-not-safe": "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.\nObwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen, diese [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
        "config-no-cli-uploads-check": "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien (<code>$1</code>) wird, während der Installation über die Kommandozeile, nicht auf Sicherheitsanfälligkeiten hinsichtlich willkürlicher Skriptausführungen geprüft.",
        "config-brokenlibxml": "Das System nutzt eine Kombination aus PHP- und libxml2-Versionen, die fehleranfällig ist und versteckte Datenfehler bei MediaWiki und anderen Webanwendungen verursachen kann.\nAktualisiere auf libxml2 2.7.3 oder später, um das Problem zu lösen. Installationsabbruch ([https://bugs.php.net/bug.php?id=45996 siehe hierzu die Fehlermeldung bei PHP]).",
-       "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nDer ResouceLoader von MediaWiki wird zwar unter diesen Bedingungen funktionieren, allerdings nur mit verminderter Leistungsfähigkeit.\nSofern möglich, sollte der Parameter <code>suhosin.get.max_value_length</code> in der Datei <code>php.ini</code> auf 1024 oder höher festgelegt werden.\nGleichzeitig muss der Parameter <code>$wgResourceLoaderMaxQueryLength</code> in der Datei <code>LocalSettings.php</code> auf den selben Wert eingestellt werden.",
+       "config-suhosin-max-value-length": "Suhosin ist installiert und beschränkt die Länge des GET-Parameters auf $1 Bytes.\nMediaWiki wird nur funktionieren, wenn code>suhosin.get.max_value_length</code> $2 oder höher ist. Deaktiviere diese Einstellung oder ändere sie in <code>php.ini</code> zu $3.",
        "config-using-32bit": "<strong>Warnung:</strong> Es scheint, als ob dein System mit 32-Bit-Ganzzahlen läuft. Dies wird [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit nicht empfohlen].",
        "config-db-type": "Datenbanksystem:",
        "config-db-host": "Datenbankserver:",
index 721a8dc..3617e18 100644 (file)
@@ -27,7 +27,7 @@
        "config-page-install": "Bar ke",
        "config-page-complete": "Temam!",
        "config-page-restart": "Barkerdışi fına ser kı",
-       "config-page-readme": "Mı bıwan",
+       "config-page-readme": "Mı bıwane",
        "config-page-releasenotes": "Notë versiyoni",
        "config-page-copying": "Kopyayeno",
        "config-page-upgradedoc": "Berzkerdış",
index eae79b0..e5ebb42 100644 (file)
        "config-restart": "Si, reinitia lo",
        "config-welcome": "=== Verificationes del ambiente ===\nVerificationes de base essera ora exequite pro determinar si iste ambiente es apte pro le installation de MediaWiki.\nNon oblida de includer iste information si tu cerca adjuta pro completar le installation.",
        "config-welcome-section-copyright": "=== Copyright and Terms ===\n\n$1\n\nIste programma es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.\n\nIste programma es distribuite in le sperantia que illo sia utile, ma '''sin garantia''', sin mesmo le implicite garantia de '''commercialisation''' o '''aptitude pro un proposito particular'''.\nVide le Licentia Public General de GNU pro plus detalios.\n\nVos deberea haber recipite [$2 un exemplar del Licentia Public General de GNU] con iste programma; si non, scribe al Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lege lo in linea].",
-       "config-sidebar": "* [https://www.mediawiki.org Pagina principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guida pro usatores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guida pro administratores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Lege me</doclink>\n* <doclink href=ReleaseNotes>Notas de iste version</doclink>\n* <doclink href=Copying>Conditiones de copia</doclink>\n* <doclink href=UpgradeDoc>Actualisation</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org Pagina principal de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Guida pro usatores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Guida pro administratores]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]",
+       "config-sidebar-readme": "Lege me",
+       "config-sidebar-relnotes": "Notas de iste version",
+       "config-sidebar-license": "Conditiones de copia",
+       "config-sidebar-upgrade": "Actualisation",
        "config-env-good": "Le ambiente ha essite verificate.\nTu pote installar MediaWiki.",
        "config-env-bad": "Le ambiente ha essite verificate.\nTu non pote installar MediaWiki.",
        "config-env-php": "PHP $1 es installate.",
@@ -79,7 +83,7 @@
        "config-uploads-not-safe": "'''Aviso:''' Le directorio predefinite pro files incargate <code>$1</code> es vulnerabile al execution arbitrari de scripts.\nBen que MediaWiki verifica tote le files incargate contra le menacias de securitate, il es altemente recommendate [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security remediar iste vulnerabilitate de securitate] ante de activar le incargamento de files.",
        "config-no-cli-uploads-check": "'''Attention:''' Le directorio predefinite pro files incargate (<code>$1</code>) non es verificate contra le vulnerabilitate\nal execution arbitrari de scripts durante le installation de CLI.",
        "config-brokenlibxml": "Vostre systema ha un combination de versiones de PHP e libxml2 que es defectuose e pote causar corruption celate de datos in MediaWiki e altere applicationes web.\nActualisa a libxml2 2.7.3 o plus recente ([https://bugs.php.net/bug.php?id=45996 problema reportate presso PHP]).\nInstallation abortate.",
-       "config-suhosin-max-value-length": "Suhosin es installate e limita parametro <code>length</code> de GET a $1 bytes.\nLe componente ResourceLoader de MediaWiki va contornar iste limite, ma isto prejudicara le rendimento.\nSi possibile, tu deberea mitter <code>suhosin.get.max_value_length</code> a 1024 o superior in <code>php.ini</code>, e mitter <code>$wgResourceLoaderMaxQueryLength</code> al mesme valor in <code>LocalSettings.php</code>.",
+       "config-suhosin-max-value-length": "Suhosin es installate e limita parametro <code>length</code> de GET a $1 bytes.\nMediaWiki require que <code>suhosin.get.max_value_length</code> sia al minus $2. Disactiva iste parametro, o augmenta iste valor a $3 in <code>php.ini</code>.",
        "config-using-32bit": "<strong>Attention:</strong> tu systema pare operar con integres de 32 bits. Isto [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit non es recommendate].",
        "config-db-type": "Typo de base de datos:",
        "config-db-host": "Servitor de base de datos:",
index 74d8895..3ce3fe2 100644 (file)
@@ -12,6 +12,7 @@
        "config-localsettings-upgrade": "L'arkivo <code>LocalSettings.php</code> trovesis.\nPor plubonigar l'instaluro, voluntez informar la valoro dil  <code>$wgUpgradeKey</code> en l'infra buxo.\nVu trovos ol en <code>LocalSettings.php</code>.",
        "config-session-error": "Eroro dum komenco di seciono: $1",
        "config-session-expired": "Vua sesiono probable finis.\nSesioni programesis por durar $1\nVu povas augmentar to per modifiko di <code>session.gc_maxlifetime</code> en php.ini.\nRikomencez l'instalo-procedo.",
+       "config-no-session": "La dati pri vua sesiono desaparis!\nVerifikez vua arkivo php.ini e certigez su pri <code>session.save_path</code> indikas la korekta libro di adresaro.",
        "config-your-language": "Vua idiomo:",
        "config-your-language-help": "Selektez l'idiomo por uzar dum l'instalo-procedo.",
        "config-wiki-language": "Wiki linguo:",
        "config-help-restart": "Ka vu deziras efacar omna dati qui vu sparis, e rikomencar la procedi pri instalo?",
        "config-restart": "Yes, rikomencez ol",
        "config-welcome-section-copyright": "=== Autoroyuro e termini ===\n\n$1\n\nCa informatikoprogramo esas libera; vu povas ridistributar ol e/o modifikar ol segun la termini de la Generala Licenco Publika GNU, quale stipulata da Free Software Foundation; segun lua versiono 2 o sequanta.\n\nNi expektas ke ca programo esas utila, kande ni distributas ol. <strong>Tamen, ni ne povas grantar ke ol fakte esos utila</strong>. Ni anke ne povas afirmar ke ol esos <strong>vendebla</strong> o <strong>ke ol esos utila por specifika intenco</strong>.\nLektez la Generala Licenco Publika GNU por plusa detali.\n\nKune ica programo vu certe recevis [$2  kopiuro di la Generala Licenco Publika GNU]. Se vu ne recevis ol, voluntez skribar a la fonduro Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lektez ol che l'interreto].",
+       "config-sidebar-readme": "Lektez me",
+       "config-sidebar-relnotes": "Informi pri la versiono",
+       "config-sidebar-license": "Kopiuro",
+       "config-sidebar-upgrade": "Nova versiono",
        "config-env-good": "Omno verifikesis.\nVu povas intalar MediaWiki.",
        "config-env-bad": "Omno verifikesis.\nVu NE POVAS intalar MediaWiki.",
        "config-env-php": "PHP $1 instalesis.",
        "config-env-hhvm": "HHVM $1 instalesis.",
+       "config-unicode-using-intl": "Uzanta [https://php.net/manual/en/book.intl.php PHP intl extension] por normaligo Unicode.",
        "config-unicode-pure-php-warning": "<strong>Atencez:</strong> La [https://php.net/manual/en/book.intl.php prolonguro PHP intl] ne esas disponebla por traktar skribo-normaligo \"Unicode\". Vice, uzesas la plu lenta laborado en pura PHP.\nSe vu administras pagini multe vizitata, vu mustas lektar la [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations skribo-normaligo Unicode].",
+       "config-unicode-update-warning": "<strong>Atencez:</strong> La versiono di ''Unicode normalization wrapper'' instalata en vua komputero uzas obsoleta versiono di la biblioteko del [http://site.icu-project.org/ projeto ICU].\nVu mustas instalar [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations la nova versiono] se vu deziras uzar Unicode.",
        "config-memory-raised": "Parametro <code>memory_limit</code> esas $1, modifikata a $2.",
        "config-memory-bad": "<strong>Atences:</strong> la limito por PHP <code>memory_limit</code> esas $1.\nTo probable esas nesuficanta.\nL'instalo-procedo povas faliar!",
        "config-apc": "[https://www.php.net/apc APC] instalesis",
        "config-apcu": "[https://www.php.net/apcu APCu] instalesis",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] instalesis",
+       "config-no-uri": "<strong>Eroro:</strong> Ne esis posibla identifikar l'existanta URI.\nInstalo interruptata.",
+       "config-no-cli-uri": "<strong>Avizo:</strong> Nula <code>--scriptpath</code> informata. Uzanta la preexistanta: <code>$1</code>.",
+       "config-using-server": "Uzanta ret-adreso (URL) dil servero \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Ret-adreso (URL) dil servero \"<nowiki>$1$2</nowiki>\".",
+       "config-db-type": "Tipo di datumaro:",
+       "config-db-host": "Loko dil datumaro:",
        "config-db-wiki-settings": "Identifikez ca wiki",
        "config-db-name": "Nomo dil datumaro (sen strekteti):",
        "config-db-install-account": "Konto dil uzero por instalo",
        "config-db-username": "Uzero-nomo dil datumaro:",
        "config-db-password": "Pasovorto dil datumaro:",
        "config-invalid-db-type": "Nevalida tipo di datumaro.",
+       "config-missing-db-name": "Vu mustas informar valoro por \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Vu mustas informar valoro por \"{{int:config-db-host}}\".",
+       "config-sqlite-readonly": "L'arkivo <code>$1</code> esas nur lektebla.",
+       "config-sqlite-cant-create-db": "Ne povis krear l'arkivo di datumaro <code>$1</code>.",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "Sama kam la wiki-nomo: $1",
        "config-ns-other": "Altra (definez precise)",
index 5da1914..7a614e8 100644 (file)
        "config-uploads-not-safe": "<strong>警告:</strong> アップロードの既定ディレクトリ <code>$1</code> に、任意のスクリプト実行に関する脆弱性があります。\nMediaWiki はアップロードされたファイルのセキュリティ上の脅威を確認しますが、アップロードを有効化する前に、[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security このセキュリティ上の脆弱性を解決する]ことを強く推奨します。",
        "config-no-cli-uploads-check": "<strong>警告:</strong> アップロード用のデフォルトディレクトリ (<code>$1</code>) が、CLIでのインストール中に任意のスクリプト実行の脆弱性チェックを受けていません。",
        "config-brokenlibxml": "このシステムで使われているPHPとlibxml2のバージョンのこの組み合わせにはバグがあります。具体的には、MediaWikiやその他のウェブアプリケーションでhiddenデータが破損する可能性があります。\nlibxml2を2.7.3以降のバージョンにアップグレードしてください([https://bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。\nインストールを終了します。",
-       "config-suhosin-max-value-length": "Suhosin がインストールされており、GET パラメーターの <code>length</code> を $1 バイトに制限しています。\nMediaWiki の ResourceLoader コンポーネントはこの制限を回避しますが、パフォーマンスは低下します。\n可能な限り、<code>php.ini</code> で <code>suhosin.get.max_value_length</code> を 1024 以上に設定し、同じ値を <code>LocalSettings.php</code> 内で <code>$wgResourceLoaderMaxQueryLength</code> に設定してください。",
+       "config-suhosin-max-value-length": "Suhosin がインストールされており、GET パラメーターの <code>length</code> を $1 バイトに制限しています。(訳注:\nMediaWiki の ResourceLoader コンポーネントはこの制限を回避しますが、パフォーマンスは低下します。)\n可能な限り、 <code>suhosin.get.max_value_length</code> を $2 以上に設定します。これを無効に変更するか、<code>php.ini</code> で $3 に増加してください。",
        "config-using-32bit": "<strong>警告:</strong>システムが32ビットで動作しているようです。 これは[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit 非推奨]です。",
        "config-db-type": "データベースの種類:",
        "config-db-host": "データベースのホスト:",
        "config-extension-not-found": "拡張機能「$1」の登録ファイルは見つかりませんでした",
        "config-extension-dependency": "拡張機能「$1」のインストール中に依存関係エラーが発生しました: $2",
        "mainpagetext": "<strong>MediaWiki はインストール済みです。</strong>",
-       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam あなたのウィキでスパムと戦う方法を学ぶ]"
+       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 利用者案内]を参照してください。\n\nウィキソフトウェアの使い方に関する情報は[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki をご使用の言語へ地域化]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam ご使用のウィキでスパムと戦う方法を学ぶ]"
 }
index c2d349a..ad0d285 100644 (file)
        "config-db-schema-help": "Stu schema 'n genere sarrà buono.\nSi 'o vulite cagnà facite sulamente si ne tenite abbesuogno.",
        "config-pg-test-error": "Nun se può connettà a 'o database <strong>$1</strong>: $2",
        "config-sqlite-dir": "Cartella 'e data 'e SQLite:",
-       "config-sqlite-dir-help": "SQLite astipa tutte 'e date dint'a n'uneco file.\n\n'A cartella ca starraje a innecà adda essere scrivibbele d' 'o server webe pe' tramente ca sta l'istallazione.\n\nAvess'a essere <strong>nun trasibbele via web</strong>, è pecchesto ca nun se sta mettenno addò stanno 'e file PHP.\n\nL'installatore scriverrà nzieme a chesta nu file <code>.htaccess</code>, ma si 'o tentativo scassasse, coccheruno putesse tenè acciesso dint' 'o database ncruro.\nChesto pure cunzidera 'e date ncruro 'e ll'utente (indirizze, password cifrate) accussì comme 'e verziune luvate e ati dati d'accesso limmetato dint' 'o wiki.\n\nCunzidera ll'opportunità 'e sistimà ô tiempo 'o database 'a n'ata parte, p'esempio int'a <code>/var/lib/mediawiki/tuowiki</code>.",
+       "config-sqlite-dir-help": "SQLite astipa tutte 'e date dint'a n'uneco file.\n\n'A cartella ca starraje a innecà adda essere scrivibbele d' 'o server webe pe' tramente ca sta l'istallazione.\n\nAvess'a essere <strong>nun trasibbele via web</strong>, è pecchesto ca nun se sta mettenno addò stanno 'e file PHP.\n\nL'installatore scriverrà nzieme a chesta nu file <code>.htaccess</code>, ma si 'o tentativo scassasse, coccheruno putesse tenè acciesso dint' 'o database ncruro.\nChesto cunzidera purzì 'e date ncruro 'e ll'utente (indirizze, password cifrate) accussì comme 'e verziune luvate e ati dati d'accesso limmetato dint' 'o wiki.\n\nCunzidera ll'opportunità 'e sistimà ô tiempo 'o database 'a n'ata parte, p'esempio int'a <code>/var/lib/mediawiki/tuowiki</code>.",
        "config-type-mysql": "MariaDB, MySQL o compatibbele",
        "config-support-info": "MediaWiki supporta 'e sisteme 'e database ccà abbascio:\n\n$1\n\nSi nfra chiste ccà nun vedite 'o sistema 'e database ca vulite ausà, allora avite liegge 'e instruziune ccà ncoppa pe' ne dà supporto.",
        "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MariaDB cumpatibbele. ([https://www.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
index ba5af6c..6195104 100644 (file)
        "config-restart": "Ja, start på nytt",
        "config-welcome": "=== Miljøsjekker ===\nGrunnleggende sjekker utføres for å se om dette miljøet er egnet for en MediaWiki-installasjon.\nDu bør oppgi resultatene fra disse sjekkene om du trenger hjelp under installasjonen.",
        "config-welcome-section-copyright": "=== Opphavsrett og vilkår ===\n\n$1\n\nMediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.\n\nDette programmet er distribuert i håp om at det vil være nyttig, men '''uten noen garanti'''; ikke engang implisitt garanti av '''salgbarhet''' eller '''egnethet for et bestemt formål'''.\nSe GNU General Public License for flere detaljer.\n\nDu skal ha mottatt [$2 en kopi av GNU General Public License] sammen med dette programmet; hvis ikke, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [https://www.gnu.org/copyleft/gpl.html les det på nettet].",
-       "config-sidebar": "* [https://www.mediawiki.org MediaWiki hjem]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Brukerguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratorguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ OSS]\n----\n* <doclink href=Readme>Les meg</doclink>\n* <doclink href=ReleaseNotes>Utgivelsesnotater</doclink>\n* <doclink href=Copying>Kopiering</doclink>\n* <doclink href=UpgradeDoc>Oppgradering</doclink>",
+       "config-sidebar": "* [https://www.mediawiki.org MediaWiki.org]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Brukerguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratorguide]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ OSS]",
+       "config-sidebar-readme": "Les meg",
+       "config-sidebar-relnotes": "Utgivelsesnotater",
+       "config-sidebar-license": "Kopiering",
+       "config-sidebar-upgrade": "Oppgradering",
        "config-env-good": "Miljøet har blitt sjekket.\nDu kan installere MediaWiki.",
        "config-env-bad": "Miljøet har blitt sjekket.\nDu kan ikke installere MediaWiki.",
        "config-env-php": "PHP $1 er installert.",
        "config-env-hhvm": "HHVM $1 er installert.",
-       "config-unicode-using-intl": "Bruker [https://pecl.php.net/intl intl PECL-utvidelsen] for Unicode-normalisering.",
-       "config-unicode-pure-php-warning": "'''Advarsel''': [https://pecl.php.net/intl intl PECL-utvidelsen] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese litt om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
+       "config-unicode-using-intl": "Bruker [https://php.net/manual/en/book.intl.php PHPs intl-utvidelse] for Unicode-normalisering.",
+       "config-unicode-pure-php-warning": "<strong>Advarsel:</strong> [https://php.net/manual/en/book.intl.php PHPs intl-utvidelse] er ikke tilgjengelig for å håndtere Unicode-normaliseringen, faller tilbake til en langsommere ren-PHP-implementasjon.\nOm du kjører et nettsted med høy trafikk bør du lese om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].",
        "config-unicode-update-warning": "<strong>Advarsel:</strong> Den installerte versjonen av Unicode-normalisereren bruker en eldre versjon av [http://site.icu-project.org/ ICU-prosjektets] bibliotek.\nDu bør [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations oppgradere] om du er bekymret for å bruke Unicode.",
        "config-no-db": "Fant ingen passende databasedriver! Du må installere en databasedriver for PHP.\nFølgende {{PLURAL:$2|databasetype|databasetyper}} støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysqli</code>.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, må du også installere for eksempel <code>php-mysql</code>-pakken.",
-       "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
+       "config-outdated-sqlite": "<strong>Advarsel:</strong> Du har SQLite $2, som er en eldre versjon enn minimumskravet SQLite $1. SQLite vil ikke være tilgjengelig.",
        "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
        "config-pcre-old": "'''Alvorlig:''' PCRE $1 eller senere kreves.\nDin PHP-kode er lenket med PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Nærmere informasjon].",
        "config-pcre-no-utf8": "'''Fatal''': PHPs PCRE modul ser ut til å være kompilert uten PCRE_UTF8-støtte.\nMediaWiki krever UTF-8-støtte for å fungere riktig.",
@@ -83,7 +87,7 @@
        "config-uploads-not-safe": "'''Advarsel:''' Din standardmappe for opplastinger <code>$1</code> er sårbar for kjøring av vilkårlige skript.\nSelv om MediaWiki sjekker alle opplastede filer for sikkerhetstrusler er det sterkt anbefalt å [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security lukke denne sikkerhetssårbarheten] før du aktiverer opplastinger.",
        "config-no-cli-uploads-check": "'''Advarsel:''' Din standard-katalog for opplastinger (<code>$1</code>) er ikke kontrollert for sårbarhet overfor vilkårlig skript-kjøring under CLI-installasjonen.",
        "config-brokenlibxml": "Ditt system bruker en kombinasjon av PHP- og libxml2-versjoner som har feil og kan forårsake skjult dataødeleggelse i MediaWiki og andre web-applikasjoner.\nOppgrader til libxml2 2.7.3 eller nyere ([https://bugs.php.net/bug.php?id=45996 Feil-liste for PHP]).\nInstalleringen ble abortert.",
-       "config-suhosin-max-value-length": "Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki sin ResourceLoader-komponent klarer å komme rundt denne begrensningen, men med redusert ytelse. Om mulig bør du sette <code>suhosin.get.max_value_length</code> til minst 1024 i <code>php.ini</code>, og sette <code>$wgResourceLoaderMaxQueryLength</code> til samme verdi i <code>LocalSettings.php</code>.",
+       "config-suhosin-max-value-length": "Suhosin er installert og begrenser GET-parameterlengder til $1 bytes.\nMediaWiki krever at <code>suoshin.get.max_value_length</code> er minst $2. Slå av denne innstillingen eller øk verdien til $3 i <code>php.ini</code>.",
        "config-using-32bit": "<strong>Adversel:</strong> Systemet ditt ser ut til å være 32-bit-basert, mens dette er [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit not advised].",
        "config-db-type": "Databasetype:",
        "config-db-host": "Databasevert:",
index fc66bdb..f3f211e 100644 (file)
@@ -24,7 +24,8 @@
                        "Sethakill",
                        "Peter Bowman",
                        "Ankam",
-                       "Railfail536"
+                       "Railfail536",
+                       "Rail"
                ]
        },
        "config-desc": "Instalator MediaWiki",
index f08ea75..75e1cad 100644 (file)
                        "MokaAkashiyaPT",
                        "Athena in Wonderland",
                        "CaiusSPQR",
-                       "Waldyrious"
+                       "Waldyrious",
+                       "Mansil alfalb"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-title": "Instalação do MediaWiki $1",
        "config-information": "Informação",
-       "config-localsettings-upgrade": "Foi detetado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor introduza o valor de <code>$wgUpgradeKey</code> na caixa abaixo.\nEncontra este valor em <code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "Foi detetado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, execute o <code>update.php</code>, por favor",
+       "config-localsettings-upgrade": "Foi detetado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor, insira o valor de <code>$wgUpgradeKey</code> na caixa abaixo.\nIrá encontrar este valor em <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Foi detetado um ficheiro <code>LocalSettings.php</code>.\nPara atualizar esta instalação, por favor, execute o <code>update.php</code>",
        "config-localsettings-key": "Chave de atualização:",
        "config-localsettings-badkey": "A chave de atualização que forneceu está incorreta.",
-       "config-upgrade-key-missing": "Foi detetada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor coloque a seguinte linha no final do seu <code>LocalSettings.php</code>:\n\n$1",
-       "config-localsettings-incomplete": "O ficheiro <code>LocalSettings.php</code> existente parece estar incompleto.\nA variável $1 não está definida.\nPor favor, defina esta variável no <code>LocalSettings.php</code> e clique \"{{int:Config-continue}}\".",
+       "config-upgrade-key-missing": "Foi detetada uma instalação existente do MediaWiki.\nPara atualizar esta instalação, por favor, coloque a seguinte linha no fim do seu <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "O ficheiro existente <code>LocalSettings.php</code> parece estar incompleto.\nA variável $1 não está definida.\nPor favor, altere <code>LocalSettings.php</code> e assim esta variável é definida, e clique em \"{{int:Config-continue}}\".",
        "config-localsettings-connection-error": "Ocorreu um erro ao ligar à base de dados usando as configurações especificadas no <code>LocalSettings.php</code>. Por favor corrija essas configurações e tente novamente.\n\n$1",
        "config-session-error": "Erro ao iniciar a sessão: $1",
        "config-session-expired": "Os seus dados de sessão parecem ter expirado.\nAs sessões estão configuradas para uma duração de $1.\nPode aumentar esta duração configurando <code>session.gc_maxlifetime</code> no php.ini.\nReinicie o processo de instalação.",
        "config-no-session": "Os seus dados de sessão foram perdidos!\nVerifique o seu php.ini e certifique-se de que em <code>session.save_path</code> está definido um diretório apropriado.",
-       "config-your-language": "A sua língua:",
-       "config-your-language-help": "Selecione a língua que será usada durante o processo de instalação.",
-       "config-wiki-language": "Língua da wiki:",
-       "config-wiki-language-help": "Selecione a língua que será predominante na wiki.",
+       "config-your-language": "O seu idioma:",
+       "config-your-language-help": "Selecione o idioma que será utilizado durante o processo de instalação.",
+       "config-wiki-language": "Idioma da wiki:",
+       "config-wiki-language-help": "Selecione o idioma que a wiki será predominante escrita.",
        "config-back": "← Voltar",
        "config-continue": "Continuar →",
-       "config-page-language": "Língua",
-       "config-page-welcome": "Bem-vindo(a) ao MediaWiki!",
+       "config-page-language": "Idioma",
+       "config-page-welcome": "Bem-vindo ao MediaWiki!",
        "config-page-dbconnect": "Ligar à base de dados",
        "config-page-upgrade": "Atualizar a instalação existente",
        "config-page-dbsettings": "Configurações da base de dados",
        "config-page-name": "Nome",
        "config-page-options": "Opções",
        "config-page-install": "Instalar",
-       "config-page-complete": "Terminado!",
+       "config-page-complete": "Concluída!",
        "config-page-restart": "Reiniciar a instalação",
        "config-page-readme": "Leia-me",
        "config-page-releasenotes": "Notas de lançamento",
        "config-page-copying": "A copiar",
        "config-page-upgradedoc": "A atualizar",
        "config-page-existingwiki": "Wiki existente",
-       "config-help-restart": "Deseja limpar todos os dados gravados que introduziu e reiniciar o processo de instalação?",
+       "config-help-restart": "Deseja limpar todos os dados guardados que inseriu e reiniciar o processo de instalação?",
        "config-restart": "Sim, reiniciar",
        "config-welcome": "=== Verificações do ambiente ===\nSerão agora realizadas verificações básicas para determinar se este ambiente é apropriado para instalação do MediaWiki.\nLembre-se de fornecer esta informação se necessitar de pedir ajuda para concluir a instalação.",
-       "config-welcome-section-copyright": "=== Direitos de autor e Condições de utilização ===\n\n$1\n\nEste programa é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a licença GNU General Public License para mais detalhes.\n\nEm conjunto com este programa deve ter recebido [$2 uma cópia da licença GNU General Public License]; se não a recebeu, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a na Internet].",
-       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/pt Ajuda]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/pt Manual técnico]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pt FAQ]",
+       "config-welcome-section-copyright": "=== Direitos de Autor e Termos ===\n\n$1\n\nEste programa é um software livre; pode redistribuí-lo e/ou modificá-lo nos termos da Licença Pública Geral GNU, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão mais recente.\n\nEste programa é distribuído na esperança de que seja útil, mas '''sem qualquer garantia'''; inclusive, sem a garantia implícita da '''possibilidade de ser comercializado''' ou de '''adequação para qualquer finalidade específica'''.\nConsulte a Licença Pública Geral GNU para mais detalhes.\n\nEm conjunto com este programa deveria ter recebido [$2 uma cópia da Licença Pública Geral GNU]; se não, peça-a por escrito a Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ou [https://www.gnu.org/copyleft/gpl.html leia-a on-line].",
+       "config-sidebar": "* [https://www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]\n* [https://www.mediawiki.org/wiki/Help:Contents/pt Guia do Utilizador]\n* [https://www.mediawiki.org/wiki/Manual:Contents/pt Guia do Administrador]\n* [https://www.mediawiki.org/wiki/Manual:FAQ/pt Perguntas Mais Frequentes]",
        "config-sidebar-readme": "Leia-me",
        "config-sidebar-relnotes": "Notas de lançamento",
        "config-sidebar-license": "Copiar",
        "config-pcre-old": "<strong>Erro fatal:</strong> É necessário o PCRE $1 ou versão posterior.\nO seu binário PHP foi linkado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].",
        "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.",
        "config-memory-raised": "A configuração <code>memory_limit</code> do PHP era $1; foi aumentada para $2.",
-       "config-memory-bad": "<strong>Aviso:</strong> A configuração <code>memory_limit</code> do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
-       "config-apc": "[https://www.php.net/apc APC] instalada",
-       "config-apcu": "[https://www.php.net/apcu APCu] instalado",
-       "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] instalada",
-       "config-no-cache-apcu": "<strong>Aviso:</strong> Não foi encontrado o [https://www.php.net/apcu APCu] nem o [https://www.iis.net/downloads/microsoft/wincache-extension WinCache].\nA cache de objetos não está ativa.",
-       "config-mod-security": "<strong>Aviso:</strong> O seu servidor de Internet tem o [https://modsecurity.org/ mod_security]/mod_security2 ativado. Muitas das suas configurações normais podem causar problemas ao MediaWiki e a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.\nSe possível, isto deve ser desativado. Se não, consulte a [https://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
+       "config-memory-bad": "<strong>Aviso:</strong> o parâmetro <code>memory_limit</code> é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!",
+       "config-apc": "[https://www.php.net/apc APC] está instalada",
+       "config-apcu": "[https://www.php.net/apcu APCu] está instalado",
+       "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] está instalada",
+       "config-no-cache-apcu": "<strong>Aviso:</strong> não foi possível encontrar o [https://www.php.net/apcu APCu] ou a [https://www.iis.net/downloads/microsoft/wincache-extension WinCache].\nA colocação em cache dos objetos não está ativa.",
+       "config-mod-security": "<strong>Aviso:</strong> o seu servidor da Web tem o [https://modsecurity.org/ mod_security]/mod_security2 ativado. Muitas configurações comuns irão causar problemas ao MediaWiki e a outro software que permite que os utilizadores publiquem conteúdos arbitrários.\nSe possível, isto deverá ser desativado. Se não, consulte a [https://modsecurity.org/documentation/ mod_security documentação] ou contacte o apoio do seu alojamento se encontrar erros aleatórios.",
        "config-diff3-bad": "O utilitário de comparação de texto GNU diff3 não foi encontrado. Pode ignorar esta situação por agora, mas poderá encontrar conflitos entre edições mais frequentemente.",
        "config-git": "Foi encontrado o software de controlo de versões Git: <code>$1</code>.",
        "config-git-bad": "Não foi encontrado o programa de controlo de versões Git. Pode ignorar esta situação por agora. Note que Especial:Versão não apresentará os resumos criptográficos das efetivações.",
        "config-uploads-not-safe": "<strong>Aviso:</strong> O diretório por omissão para carregamentos, <code>$1</code>, está vulnerável à execução arbitrária de listas de comandos (scripts).\nEmbora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
        "config-no-cli-uploads-check": "<strong>Aviso:</strong> O diretório por omissão para carregamentos, <code>$1</code>, não é verificado para determinar se é vulnerável à execução de listas arbitrárias de comandos durante a instalação por CLI (\"Command-line Interface\").",
        "config-brokenlibxml": "O seu sistema tem uma combinação de versões do PHP e do libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e noutras aplicações da Internet.\nAtualize para a versão 2.7.3 ou posterior do libxml2 ([https://bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).\nInstalação cancelada.",
-       "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO componente ResourceLoader do MediaWiki consegue exceder este limite, mas prejudicando o desempenho.\nSe lhe for possível, deve atribuir ao parâmetro <code>suhosin.get.max_value_length</code> o valor 1024 ou maior no ficheiro <code>php.ini</code>, e definir o mesmo valor para <code>$wgResourceLoaderMaxQueryLength</code> no ficheiro LocalSettings.php.",
+       "config-suhosin-max-value-length": "O Suhosin está instalado e limita o parâmetro GET <code>length</code> a $1 bytes.\nO MediaWiki requer que <code>suhosin.get.max_value_length</code> seja pelo menos $2. Desative esta definição, ou aumente este valor para $3 no <code>php.ini</code>.",
        "config-using-32bit": "<strong>Aviso:</strong> o seu sistema parece estar a funcionar com inteiros de 32 bits. Isto  [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit não é recomendado].",
        "config-db-type": "Tipo da base de dados:",
        "config-db-host": "Servidor da base de dados:",
        "config-db-name-help": "Escolha um nome para identificar a sua wiki.\nO nome não deve conter espaços.\n\nSe estiver a usar um servidor partilhado, o fornecedor do alojamento deve poder fornecer-lhe o nome de uma base de dados que possa usar, ou permite-lhe criar bases de dados através de um painel de controlo.",
        "config-db-install-account": "Conta do utilizador para a instalação",
        "config-db-username": "Nome do utilizador da base de dados:",
-       "config-db-password": "Palavra-passe do utilizador da base de dados:",
-       "config-db-install-username": "Introduza o nome de utilizador que será usado para aceder à base de dados durante o processo de instalação. Este utilizador não é o do MediaWiki; é o utilizador da base de dados.",
+       "config-db-password": "Palavra-passe da base de dados:",
+       "config-db-install-username": "Insira o nome de utilizador que será utilizado para aceder à base de dados durante o processo de instalação.\nNão é o nome de utilizador da conta MediaWiki; é o nome de utilizador da sua base de dados.",
        "config-db-install-password": "Introduza a palavra-passe do utilizador que será usado para aceder à base de dados durante o processo de instalação.\nEsta palavra-passe não é a do utilizador do MediaWiki; é a palavra-passe do utilizador da base de dados.",
        "config-db-install-help": "Introduza o nome de utilizador e a palavra-passe que serão usados para aceder à base de dados durante o processo de instalação.",
        "config-db-account-lock": "Usar o mesmo nome de utilizador e palavra-passe durante a operação normal",
        "config-db-wiki-account": "Conta de utilizador para a operação normal",
        "config-db-wiki-help": "Introduza o nome de utilizador e a palavra-passe que serão usados para aceder à base de dados durante a operação normal da wiki.\nSe o utilizador não existir na base de dados, mas a conta de instalação tiver privilégios suficientes, o utilizador que introduzir será criado na base de dados com os privilégios mínimos necessários para a operação normal da wiki.",
-       "config-db-prefix": "Prefixo para as tabelas da base de dados (sem hífenes):",
+       "config-db-prefix": "Prefixo para a tabela da base de dados (sem hífenes):",
        "config-db-prefix-help": "Se necessitar de partilhar uma só base de dados entre várias wikis, ou entre o MediaWiki e outra aplicação, pode escolher adicionar um prefixo ao nome de todas as tabelas desta instalação, para evitar conflitos.\nNão use espaços.\n\nNormalmente, este campo deve ficar vazio.",
-       "config-mysql-old": "É necessário o MySQL $1 ou posterior; tem a versão $2.",
+       "config-mysql-old": "É necessário o MySQL $1 ou superior. Tem a versão $2.",
        "config-db-port": "Porta da base de dados:",
-       "config-db-schema": "Esquema ''(schema)'' do MediaWiki (sem hífenes):",
-       "config-db-schema-help": "Normalmente, este esquema estará correto.\nAltere-o  se souber que precisa de o fazer.",
-       "config-pg-test-error": "Não foi possível criar uma ligação à base de dados <strong>$1</strong>: $2",
-       "config-sqlite-dir": "Diretório de dados do SQLite:",
+       "config-db-schema": "Esquema para o MediaWiki (sem hífenes):",
+       "config-db-schema-help": "Normalmente, este esquema estará correto.\nAltere-o apenas se souber que precisa de o fazer.",
+       "config-pg-test-error": "Não é possível aceder à base de dados <strong>$1</strong>: $2",
+       "config-sqlite-dir": "Diretoria de dados do SQLite:",
        "config-sqlite-dir-help": "O SQLite armazena todos os dados num único ficheiro.\n\nDurante a instalação, o servidor de Internet precisa de ter permissão de escrita no diretório que especificar.\n\nEste diretório <strong>não</strong> deve poder ser acedido diretamente da Internet, por isso está a ser colocado onde estão os seus ficheiros PHP.\n\nJuntamente com o diretório, o instalador irá criar um ficheiro <code>.htaccess</code>, mas se esta operação falhar é possível que alguém venha a ter acesso direto à base de dados.\nIsto inclui acesso aos dados dos utilizadores (endereços de correio eletrónico, palavras-passe encriptadas), às revisões eliminadas e a outros dados de acesso restrito na wiki.\n\nConsidere colocar a base de dados num local completamente diferente, como, por exemplo, em <code>/var/lib/mediawiki/asuawiki</code>.",
        "config-type-mysql": "MariaDB, MySQL (ou compatível)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
-       "config-support-info": "O MediaWiki suporta as seguintes plataformas de base de dados:\n\n$1\n\nSe a plataforma que pretende usar não está listada abaixo, siga as instruções nas hiperligações acima para ativar o suporte.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] é a base de dados preferida para o MediaWiki e a melhor suportada. O MediaWiki também trabalha com [{{int:version-db-mysql-url}} MySQL] e [{{int:version-db-percona-url}} Percona Server], que são compatíveis com MariaDB. ([https://www.php.net/manual/pt_BR/mysqli.installation.php Como compilar PHP com suporte para MySQL].)",
+       "config-support-info": "O MediaWiki suporta os seguintes sistemas de base de dados:\n\n$1\n\nSe não vê o sistema da base de dados que está a tentar utilizar listado abaixo, siga as instruções nas hiperligações acima para ativar o apoio.",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] é a base de dados primária para o MediaWiki e a melhor suportada. O MediaWiki também trabalha com [{{int:version-db-mysql-url}} MySQL] e [{{int:version-db-percona-url}} Servidor Percona], que são compatíveis com MariaDB. ([https://www.php.net/manual/en/mysqli.installation.php Como compilar PHP com suporte para MySQL].)",
        "config-dbsupport-postgres": "* O [{{int:version-db-postgres-url}} PostgreSQL] é uma plataforma popular de base de dados de código aberto, alternativa ao MySQL. ([https://www.php.net/manual/en/pgsql.installation.php Como compilar PHP com suporte para PostgreSQL].)",
        "config-dbsupport-sqlite": "* O [{{int:version-db-sqlite-url}} SQLite] é uma plataforma de base de dados ligeira muito bem suportada. ([https://www.php.net/manual/en/pdo.installation.php Como compilar PHP com suporte para SQLite], usa PDO.)",
-       "config-header-mysql": "Definições MariaDB/MySQL",
-       "config-header-postgres": "Definições PostgreSQL",
-       "config-header-sqlite": "Definições SQLite",
-       "config-invalid-db-type": "O tipo de base de dados é inválido",
-       "config-missing-db-name": "Tem de introduzir um valor para \"{{int:config-db-name}}\".",
-       "config-missing-db-host": "Tem de introduzir um valor para \"{{int:config-db-host}}\".",
-       "config-invalid-db-name": "O nome da base de dados, \"$1\",  é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.",
-       "config-invalid-db-prefix": "O prefixo da base de dados, \"$1\",  é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9), sublinhados (_) e hífens (-) dos caracteres ASCII.",
+       "config-header-mysql": "Definições de MariaDB/MySQL",
+       "config-header-postgres": "Definições de PostgreSQL",
+       "config-header-sqlite": "Definições de SQLite",
+       "config-invalid-db-type": "O tipo de base de dados é inválido.",
+       "config-missing-db-name": "Deve inserir um valor para \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Deve inserir um valor para \"{{int:config-db-host}}\".",
+       "config-invalid-db-name": "O nome da base de dados \"$1\" é inválido.\nUtilize apenas letras ASCII (a-z, A-Z), números (0-9), sublinhados (_) e hífenes (-).",
+       "config-invalid-db-prefix": "O prefixo da base de dados \"$1\" é inválido.\nUtilize apenas letras ASCII (a-z, A-Z), números (0-9), sublinhados (_) e hífenes (-).",
        "config-connection-error": "$1.\n\nVerifique o servidor, o nome do utilizador e a palavra-passe e tente novamente. Se estiver a usar \"localhost\" como servidor da base de dados, tente antes usar \"127.0.0.1\" (ou vice-versa).",
        "config-invalid-schema": "O esquema ''(schema)'' do MediaWiki, \"$1\", é inválido.\nUse só letras (a-z, A-Z), algarismos (0-9) e sublinhados (_) dos caracteres ASCII.",
-       "config-postgres-old": "É necessário o PostgreSQL $1 ou posterior; tem a versão $2.",
-       "config-sqlite-name-help": "Escolha o nome que identificará a sua wiki.\nNão use espaços ou hífens.\nEste nome será usado como nome do ficheiro de dados do SQLite.",
-       "config-sqlite-parent-unwritable-group": "Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretório que o contém <code><nowiki>$2</nowiki></code>.\n\nO instalador determinou em que nome de utilizador o seu servidor de internet está a correr.\nPara continuar, configure o diretório <code><nowiki>$3</nowiki></code> para poder ser escrito por este utilizador.\nPara fazê-lo em sistemas Unix ou Linux, use:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "Não é possível criar o diretório de dados <code><nowiki>$1</nowiki></code>, porque o servidor de internet não tem permissão de escrita no diretório que o contém <code><nowiki>$2</nowiki></code>.\n\nNão foi possível determinar em que nome de utilizador o seu servidor de internet está a correr.\nPara continuar, configure o diretório <code><nowiki>$3</nowiki></code> para que este possa ser globalmente escrito por esse utilizador (e por outros!).\nPara fazê-lo em sistemas Unix ou Linux, use:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
-       "config-sqlite-mkdir-error": "Ocorreu um erro ao criar o diretório de dados \"$1\".\nVerifique a localização e tente novamente.",
-       "config-sqlite-dir-unwritable": "Não foi possível escrever no diretório \"$1\".\nAltere as permissões para que ele possa ser escrito pelo servidor de internet e tente novamente.",
-       "config-sqlite-connection-error": "$1.\n\nVerifique o diretório de dados e o nome da base de dados abaixo e tente novamente.",
-       "config-sqlite-readonly": "Não é possível escrever no ficheiro <code>$1</code>.",
+       "config-postgres-old": "É necessário o PostgreSQL $1 ou superior. Tem a versão $2.",
+       "config-sqlite-name-help": "Escolha um nome que identifique a sua wiki.\nNão utilize espaços ou hífenes.\nIsto será utilizado para o nome do ficheiro dos dados de SQLite.",
+       "config-sqlite-parent-unwritable-group": "Não é possível criar a diretoria de dados <code><nowiki>$1</nowiki></code>, porque a diretoria fonte <code><nowiki>$2</nowiki></code> não é gravável pelo servidor da Web.\n\nO instalador determinou o nome de utilizador que o seu servidor da Web está a executar.\nTorne a diretoria <code><nowiki>$3</nowiki></code> gravável para continuar.\nPara fazê-lo no sistema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Não é possível criar a diretoria de dados <code><nowiki>$1</nowiki></code>, porque o a diretoria fonte <code><nowiki>$2</nowiki></code> não é gravável pelo servidor da Web.\n\nO instalador não conseguiu determinar em que nome de utilizador o seu servidor da Web está em execução.\nTorne a diretoria <code><nowiki>$3</nowiki></code> globalmente gravável por esta (e por outros!) para continuar.\nPara fazê-lo no sistema Unix/Linux:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-mkdir-error": "Ocorreu um erro ao criar a diretoria de dados \"$1\".\nVerifique a localização e tente novamente.",
+       "config-sqlite-dir-unwritable": "Não foi possível escrever na diretoria \"$1\".\nAltere as suas permissões para que o servidor da Web possa gravar na mesma, e tente novamente.",
+       "config-sqlite-connection-error": "$1.\n\nVerifique a diretoria de dados e o nome da base de dados abaixo e tente novamente.",
+       "config-sqlite-readonly": "O ficheiro <code>$1</code> não é gravável.",
        "config-sqlite-cant-create-db": "Não foi possível criar o ficheiro da base de dados <code>$1</code>.",
-       "config-sqlite-fts3-downgrade": "O PHP não tem suporte FTS3; a reverter o esquema das tabelas para o anterior",
-       "config-can-upgrade": "Esta base de dados contém tabelas do MediaWiki.\nPara atualizá-las para o MediaWiki $1, clique '''Continuar'''.",
-       "config-upgrade-error": "Ocorreu um erro ao atualizar as tabelas do MediaWiki na sua base de dados.\n\nPara mais informações consulte o registo acima, para tentar novamente clique <strong>Continuar</strong>.",
-       "config-upgrade-done": "Atualização terminada.\n\nAgora pode [$1 começar a usar a sua wiki].\n\nSe quiser regenerar o seu ficheiro <code>LocalSettings.php</code>, clique o botão abaixo.\nEsta operação '''não é recomendada''' a menos que esteja a ter problemas com a sua wiki.",
-       "config-upgrade-done-no-regenerate": "Atualização terminada.\n\nAgora pode [$1 começar a usar a sua wiki].",
-       "config-regenerate": "Regenerar LocalSettings.php →",
-       "config-show-table-status": "A consulta <code>SHOW TABLE STATUS</code> falhou!",
-       "config-unknown-collation": "'''Aviso:''' A base de dados está a utilizar uma colação ''(collation)'' desconhecida.",
-       "config-db-web-account": "Conta na base de dados para acesso pela internet",
-       "config-db-web-help": "Selecione o nome de utilizador e a palavra-passe que o servidor de Internet irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.",
-       "config-db-web-account-same": "Usar a mesma conta usada na instalação",
+       "config-sqlite-fts3-downgrade": "PHP tem em falta o suporte para FTS3; a reverter as tabelas para estado antigo.",
+       "config-can-upgrade": "Existem tabelas do MediaWiki nesta base de dados.\nPara atualizá-las para o MediaWiki $1, clique em <strong>Continuar</strong>.",
+       "config-upgrade-error": "Ocorreu um erro ao atualizar as tabelas do MediaWiki na sua base de dados.\n\nPara mais informação consulte o registo acima, para tentar novamente clique em <strong>Continuar</strong>.",
+       "config-upgrade-done": "Atualização concluída.\n\nAgora pode [$1 começar a utilizar a sua wiki].\n\nSe quiser regenerar o seu ficheiro <code>LocalSettings.php</code>, clique no botão abaixo.\nIsto <strong>não é recomendada</strong> a menos que esteja a ter problemas com a sua wiki.",
+       "config-upgrade-done-no-regenerate": "Atualização concluída.\n\nAgora pode [$1 começar a utilizar a sua wiki].",
+       "config-regenerate": "Regenerar LocalSettings.php →",
+       "config-show-table-status": "A consulta de <code>SHOW TABLE STATUS</code> falhou!",
+       "config-unknown-collation": "<strong>Aviso:</strong> a base de dados está a utilizar uma colação desconhecida.",
+       "config-db-web-account": "Conta da base de dados para aceder à Web",
+       "config-db-web-help": "Selecione o nome de utilizador e a palavra-passe que o servidor da Web irá utilizar para aceder ao servidor da base de dados, durante a operação normal da wiki.",
+       "config-db-web-account-same": "Utilizar a mesma conta usada na instalação",
        "config-db-web-create": "Criar a conta se ainda não existir",
        "config-db-web-no-create-privs": "A conta que especificou para a instalação não tem privilégios suficientes para criar uma conta.\nA conta que especificar aqui já tem de existir.",
        "config-mysql-engine": "Motor de armazenamento:",
index 3343d15..2dbc294 100644 (file)
        "config-uploads-not-safe": "'''Внимание:''' директория, используемая по умолчанию для загрузок (<code>$1</code>) уязвима к выполнению произвольных скриптов.\nХотя MediaWiki проверяет все загружаемые файлы на наличие угроз, настоятельно рекомендуется [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыть данную уязвимость] перед включением загрузки файлов.",
        "config-no-cli-uploads-check": "'''Предупреждение:''' каталог для загрузки по умолчанию ( <code>$1</code> ) не проверялся на уязвимости\n на выполнение произвольного сценария во время установки CLI.",
        "config-brokenlibxml": "В вашей системе имеется сочетание версий PHP и libxml2, которое может привести к скрытым повреждениям данных в MediaWiki и других веб-приложениях.\nОбновите libxml2 до версии 2.7.3 или старше ([https://bugs.php.net/bug.php?id=45996 сведения об ошибке]).\nУстановка прервана.",
-       "config-suhosin-max-value-length": "Suhosin Ñ\83Ñ\81Ñ\82ановлен Ð¸ Ð¾Ð³Ñ\80аниÑ\87иваеÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\80 GET <code>length</code> Ð´Ð¾ $1 {{PLURAL:$1|байÑ\82|байÑ\82а|байÑ\82}}. Ð\9aомпоненÑ\82 MediaWiki ResourceLoader Ð±Ñ\83деÑ\82 Ð¾Ð±Ñ\85одиÑ\82Ñ\8c Ñ\8dÑ\82о Ð¾Ð³Ñ\80аниÑ\87ение, Ð½Ð¾ Ñ\8dÑ\82о Ñ\81низиÑ\82 Ð¿Ñ\80оизводиÑ\82елÑ\8cноÑ\81Ñ\82Ñ\8c. Ð\95Ñ\81ли Ñ\8dÑ\82о Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾, Ñ\81ледÑ\83еÑ\82 Ñ\83Ñ\81Ñ\82ановиÑ\82Ñ\8c <code>suhosin.get.max_value_length</code> Ð² Ð·Ð½Ð°Ñ\87ение 1024 Ð¸Ð»Ð¸ Ð²Ñ\8bÑ\88е Ð² <code>php.ini</code>, Ð° Ñ\82акже Ñ\83Ñ\81Ñ\82ановиÑ\82Ñ\8c Ð´Ð»Ñ\8f <code>$wgResourceLoaderMaxQueryLength</code> Ñ\82акое Ð¶Ðµ Ð·Ð½Ð°Ñ\87ение Ð² LocalSettings.php.",
+       "config-suhosin-max-value-length": "Suhosin Ñ\83Ñ\81Ñ\82ановлен Ð¸ Ð¾Ð³Ñ\80аниÑ\87иваеÑ\82 Ð¿Ð°Ñ\80амеÑ\82Ñ\80 GET <code>length</code> Ð´Ð¾ $1 {{PLURAL:$1|байÑ\82|байÑ\82а|байÑ\82}}. Ð\94лÑ\8f MediaWiki Ñ\82Ñ\80ебÑ\83еÑ\82Ñ\81Ñ\8f, Ñ\87Ñ\82об Ð·Ð½Ð°Ñ\87ение <code>suhosin.get.max_value_length</code> Ð±Ñ\8bло Ñ\85оÑ\82Ñ\8f Ð±Ñ\8b $2. Ð\9eÑ\82клÑ\8eÑ\87иÑ\82е Ñ\8dÑ\82Ñ\83 Ð½Ð°Ñ\81Ñ\82Ñ\80ойкÑ\83 Ð¸Ð»Ð¸ Ñ\83велиÑ\87Ñ\8cÑ\82е Ð·Ð½Ð°Ñ\87ение Ð² <code>php.ini</code> Ð´Ð¾ $3.",
        "config-using-32bit": "<strong>Внимание:</strong> похоже, ваша система работает с 32-битными целыми числами. Это [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не рекомендуется].",
        "config-db-type": "Тип базы данных:",
        "config-db-host": "Хост базы данных:",
index 938f199..e9d578b 100644 (file)
@@ -93,7 +93,7 @@
        "config-uploads-not-safe": "'''Увага:''' Ваша типова папка для завантажень <code>$1</code> вразлива до виконання довільних скриптів.\nХоча MediaWiki перевіряє усі завантажені файли на наявність загроз, наполегливо рекомендується [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрити дану вразливість] перед тим, як дозволяти завантаження файлів.",
        "config-no-cli-uploads-check": "'''Увага:''' Ваша типова папка для завантажень (<code>$1</code>) не перевірялась на вразливість до виконання довільних скриптів під час встановлення CLI.",
        "config-brokenlibxml": "У Вашій системі невдале поєднання версій PHP і libxml2, яке може спричинити пошкодження прихованих даних у MediaWiki та інших веб-застосунках.\nОновіть libxml2 до версії 2.7.3 або пізнішої  ([https://bugs.php.net/bug.php?id=45996 відомості про помилку]).\nВстановлення перервано.",
-       "config-suhosin-max-value-length": "Suhosin Ð²Ñ\81Ñ\82ановлено Ñ\96 Ð¾Ð±Ð¼ÐµÐ¶Ñ\83Ñ\94 Ð¿Ð°Ñ\80амеÑ\82Ñ\80а GET  <code>length</code> Ð´Ð¾ $1 Ð±Ð°Ð¹Ñ\82а. Ð\9aомпоненÑ\82 MediaWiki ResourceLoader Ð±Ñ\83де Ð¾Ð±Ñ\85одиÑ\82и Ñ\86е Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ\8f, Ð¾Ð´Ð½Ð°Ðº Ñ\86е Ð·Ð¼ÐµÐ½Ñ\88иÑ\82Ñ\8c Ð¿Ñ\80одÑ\83кÑ\82ивнÑ\96Ñ\81Ñ\82Ñ\8c. Ð¯ÐºÑ\89о Ñ\86е Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾, Ð\92ам Ð²Ð°Ñ\80Ñ\82о Ð²Ñ\81Ñ\82ановиÑ\82и Ð·Ð½Ð°Ñ\87еннÑ\8f <code>suhosin.get.max_value_length</code> Ñ\8fк 1024 Ñ\96 Ð±Ñ\96лÑ\8cÑ\88е Ñ\83 <code>php.ini</code> Ñ\96 Ð²Ñ\81Ñ\82ановиÑ\82и Ñ\82аке Ð¶ Ð·Ð½Ð°Ñ\87еннÑ\8f <code>$wgResourceLoaderMaxQueryLength</code> Ñ\83 LocalSettings.php .",
+       "config-suhosin-max-value-length": "Suhosin Ð²Ñ\81Ñ\82ановлено Ñ\96 Ð²Ñ\96н Ð¾Ð±Ð¼ÐµÐ¶Ñ\83Ñ\94 GET-паÑ\80амеÑ\82Ñ\80 <code>length</code> Ð´Ð¾ $1 {{PLURAL:$1|байÑ\82|байÑ\82а|байÑ\82}}.   Ð\94лÑ\8f MediaWiki Ð¿Ð¾Ñ\82Ñ\80Ñ\96бно, Ñ\89об Ð·Ð½Ð°Ñ\87еннÑ\8f <code>suhosin.get.max_value_length</code> Ð±Ñ\83ло Ñ\85оÑ\87а Ð± $2. Ð\92имкнÑ\96Ñ\82Ñ\8c Ñ\86е Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ваннÑ\8f, Ð°Ð±Ð¾ Ð·Ð±Ñ\96лÑ\8cÑ\88Ñ\96Ñ\82Ñ\8c Ð·Ð½Ð°Ñ\87еннÑ\8f Ñ\83 <code>php.ini</code> Ð´Ð¾ $3.",
        "config-using-32bit": "<strong>Попередження:</strong> схоже, що Ваша система працює з 32-бітними цілими числами. Таке [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не рекомендується].",
        "config-db-type": "Тип бази даних:",
        "config-db-host": "Хост бази даних:",
index 5e7485c..f511229 100644 (file)
@@ -48,6 +48,9 @@ class MemoizedCallable {
        /** @var string Unique name of callable; used for cache keys. */
        private $callableName;
 
+       /** @var int */
+       private $ttl;
+
        /**
         * @throws InvalidArgumentException if $callable is not a callable.
         * @param callable $callable Function or method to memoize.
index 51d1081..19dd8fe 100644 (file)
@@ -1,4 +1,7 @@
 <?php
+
+use Wikimedia\AtEase\AtEase;
+
 /**
  * Methods to play with strings.
  *
@@ -340,4 +343,21 @@ class StringUtils {
                        return new ArrayIterator( explode( $separator, $subject ) );
                }
        }
+
+       /**
+        * Utility function to check if the given string is a valid regex. Avoids
+        * manually calling suppressWarnings and restoreWarnings, and provides a
+        * one-line solution without the need to use @.
+        *
+        * @since 1.34
+        * @param string $string The string you want to check being a valid regex
+        * @return bool
+        */
+       public static function isValidRegex( $string ) {
+               AtEase::suppressWarnings();
+               // @phan-suppress-next-line PhanParamSuspiciousOrder False positive
+               $isValid = preg_match( $string, '' );
+               AtEase::restoreWarnings();
+               return $isValid !== false;
+       }
 }
index 54d43d3..b036f05 100644 (file)
@@ -7,6 +7,10 @@
  * @since 1.27
  */
 class ComposerInstalled {
+       /**
+        * @var array[]
+        */
+       private $contents;
 
        /**
         * @param string $location
@@ -18,7 +22,7 @@ class ComposerInstalled {
        /**
         * Dependencies currently installed according to installed.json
         *
-        * @return array
+        * @return array[]
         */
        public function getInstalledDependencies() {
                $deps = [];
index 62231a8..f92759b 100644 (file)
@@ -7,6 +7,10 @@
  * @since 1.25
  */
 class ComposerJson {
+       /**
+        * @var array[]
+        */
+       private $contents;
 
        /**
         * @param string $location
@@ -18,7 +22,7 @@ class ComposerJson {
        /**
         * Dependencies as specified by composer.json
         *
-        * @return array
+        * @return string[]
         */
        public function getRequiredDependencies() {
                $deps = [];
index c5b5f00..7f6b875 100644 (file)
@@ -7,6 +7,10 @@
  * @since 1.25
  */
 class ComposerLock {
+       /**
+        * @var array[]
+        */
+       private $contents;
 
        /**
         * @param string $location
@@ -18,7 +22,7 @@ class ComposerLock {
        /**
         * Dependencies currently installed according to composer.lock
         *
-        * @return array
+        * @return array[]
         */
        public function getInstalledDependencies() {
                $deps = [];
index 9ed7ae3..26f3d3a 100644 (file)
@@ -73,7 +73,7 @@ class FSFileBackend extends FileBackendStore {
        /** @var string Required OS username to own files */
        protected $fileOwner;
 
-       /** @var bool Whether the OS is Windows (otherwise assumed Unix-like)*/
+       /** @var bool Whether the OS is Windows (otherwise assumed Unix-like) */
        protected $isWindows;
        /** @var string OS username running this script */
        protected $currentUser;
index 5caf250..d7d428e 100644 (file)
@@ -1396,12 +1396,12 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
+               $statuses = $this->doExecuteOpHandlesInternal( $fileOpHandles );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        $fileOpHandle->closeResources();
                }
 
-               return $res;
+               return $statuses;
        }
 
        /**
index edea75f..ce1e99f 100644 (file)
@@ -172,64 +172,33 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * Sanitize and filter the custom headers from a $params array.
-        * Only allows certain "standard" Content- and X-Content- headers.
+        * Filter/normalize a header map to only include mutable "content-"/"x-content-" headers
         *
-        * @param array $params
-        * @return array Sanitized value of 'headers' field in $params
-        */
-       protected function sanitizeHdrsStrict( array $params ) {
-               if ( !isset( $params['headers'] ) ) {
-                       return [];
-               }
-
-               $headers = $this->getCustomHeaders( $params['headers'] );
-               unset( $headers[ 'content-type' ] );
-
-               return $headers;
-       }
-
-       /**
-        * Sanitize and filter the custom headers from a $params array.
-        * Only allows certain "standard" Content- and X-Content- headers.
-        *
-        * When POSTing data, libcurl adds Content-Type: application/x-www-form-urlencoded
-        * if Content-Type is not set, which overwrites the stored Content-Type header
-        * in Swift - therefore for POSTing data do not strip the Content-Type header (the
-        * previously-stored header that has been already read back from swift is sent)
+        * Mutable headers can be changed via HTTP POST even if the file content is the same
         *
-        * @param array $params
-        * @return array Sanitized value of 'headers' field in $params
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (header => value) for Content-* headers mutable via POST
         */
-       protected function sanitizeHdrs( array $params ) {
-               return isset( $params['headers'] )
-                       ? $this->getCustomHeaders( $params['headers'] )
-                       : [];
-       }
-
-       /**
-        * @param array $rawHeaders
-        * @return array Custom non-metadata HTTP headers
-        */
-       protected function getCustomHeaders( array $rawHeaders ) {
-               $headers = [];
-
+       protected function extractMutableContentHeaders( array $headers ) {
+               $contentHeaders = [];
                // Normalize casing, and strip out illegal headers
-               foreach ( $rawHeaders as $name => $value ) {
+               foreach ( $headers as $name => $value ) {
                        $name = strtolower( $name );
-                       if ( preg_match( '/^content-length$/', $name ) ) {
-                               continue; // blacklisted
-                       } elseif ( preg_match( '/^(x-)?content-/', $name ) ) {
-                               $headers[$name] = $value; // allowed
-                       } elseif ( preg_match( '/^content-(disposition)/', $name ) ) {
-                               $headers[$name] = $value; // allowed
+                       if ( !preg_match( '/^(x-)?content-(?!length$)/', $name ) ) {
+                               // Only allow content-* and x-content-* headers (but not content-length)
+                               continue;
+                       } elseif ( $name === 'content-type' && !strlen( $value ) ) {
+                               // This header can be set to a value but not unset for sanity
+                               continue;
                        }
+                       $contentHeaders[$name] = $value;
                }
                // By default, Swift has annoyingly low maximum header value limits
-               if ( isset( $headers['content-disposition'] ) ) {
+               if ( isset( $contentHeaders['content-disposition'] ) ) {
                        $disposition = '';
                        // @note: assume FileBackend::makeContentDisposition() already used
-                       foreach ( explode( ';', $headers['content-disposition'] ) as $part ) {
+                       foreach ( explode( ';', $contentHeaders['content-disposition'] ) as $part ) {
                                $part = trim( $part );
                                $new = ( $disposition === '' ) ? $part : "{$disposition};{$part}";
                                if ( strlen( $new ) <= 255 ) {
@@ -238,36 +207,40 @@ class SwiftFileBackend extends FileBackendStore {
                                        break; // too long; sigh
                                }
                        }
-                       $headers['content-disposition'] = $disposition;
+                       $contentHeaders['content-disposition'] = $disposition;
                }
 
-               return $headers;
+               return $contentHeaders;
        }
 
        /**
-        * @param array $rawHeaders
-        * @return array Custom metadata headers
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (metadata header name => metadata value)
         */
-       protected function getMetadataHeaders( array $rawHeaders ) {
-               $headers = [];
-               foreach ( $rawHeaders as $name => $value ) {
+       protected function extractMetadataHeaders( array $headers ) {
+               $metadataHeaders = [];
+               foreach ( $headers as $name => $value ) {
                        $name = strtolower( $name );
                        if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
-                               $headers[$name] = $value;
+                               $metadataHeaders[$name] = $value;
                        }
                }
 
-               return $headers;
+               return $metadataHeaders;
        }
 
        /**
-        * @param array $rawHeaders
-        * @return array Custom metadata headers with prefix removed
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (metadata key name => metadata value)
         */
-       protected function getMetadata( array $rawHeaders ) {
+       protected function getMetadataFromHeaders( array $headers ) {
+               $prefixLen = strlen( 'x-object-meta-' );
+
                $metadata = [];
-               foreach ( $this->getMetadataHeaders( $rawHeaders ) as $name => $value ) {
-                       $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
+               foreach ( $this->extractMetadataHeaders( $headers ) as $name => $value ) {
+                       $metadata[substr( $name, $prefixLen )] = $value;
                }
 
                return $metadata;
@@ -283,19 +256,24 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $sha1Hash = Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 );
-               $contentType = $params['headers']['content-type']
+               // Headers that are not strictly a function of the file content
+               $mutableHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               // Make sure that the "content-type" header is set to something sensible
+               $mutableHeaders['content-type'] = $mutableHeaders['content-type']
                        ?? $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'content-length' => strlen( $params['content'] ),
-                               'etag' => md5( $params['content'] ),
-                               'content-type' => $contentType,
-                               'x-object-meta-sha1base36' => $sha1Hash
-                       ] + $this->sanitizeHdrsStrict( $params ),
+                       'headers' => array_merge(
+                               $mutableHeaders,
+                               [
+                                       'etag' => md5( $params['content'] ),
+                                       'content-length' => strlen( $params['content'] ),
+                                       'x-object-meta-sha1base36' =>
+                                               Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 )
+                               ]
+                       ),
                        'body' => $params['content']
                ] ];
 
@@ -309,6 +287,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -331,35 +311,57 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
+               // Open a handle to the source file so that it can be streamed. The size and hash
+               // will be computed using the handle. In the off chance that the source file changes
+               // during this operation, the PUT will fail due to an ETag mismatch and be aborted.
                AtEase::suppressWarnings();
-               $sha1Hash = sha1_file( $params['src'] );
+               $srcHandle = fopen( $params['src'], 'rb' );
                AtEase::restoreWarnings();
-               if ( $sha1Hash === false ) { // source doesn't exist?
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+               if ( $srcHandle === false ) { // source doesn't exist?
+                       $status->fatal( 'backend-fail-notexists', $params['src'] );
 
                        return $status;
                }
-               $sha1Hash = Wikimedia\base_convert( $sha1Hash, 16, 36, 31 );
-               $contentType = $params['headers']['content-type']
-                       ?? $this->getContentType( $params['dst'], null, $params['src'] );
 
-               $handle = fopen( $params['src'], 'rb' );
-               if ( $handle === false ) { // source doesn't exist?
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+               // Compute the MD5 and SHA-1 hashes in one pass
+               $srcSize = fstat( $srcHandle )['size'];
+               $md5Context = hash_init( 'md5' );
+               $sha1Context = hash_init( 'sha1' );
+               $hashDigestSize = 0;
+               while ( !feof( $srcHandle ) ) {
+                       $buffer = (string)fread( $srcHandle, 131072 ); // 128 KiB
+                       hash_update( $md5Context, $buffer );
+                       hash_update( $sha1Context, $buffer );
+                       $hashDigestSize += strlen( $buffer );
+               }
+               // Reset the handle back to the beginning so that it can be streamed
+               rewind( $srcHandle );
+
+               if ( $hashDigestSize !== $srcSize ) {
+                       $status->fatal( 'backend-fail-hash', $params['src'] );
 
                        return $status;
                }
 
+               // Headers that are not strictly a function of the file content
+               $mutableHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               // Make sure that the "content-type" header is set to something sensible
+               $mutableHeaders['content-type'] = $mutableHeaders['content-type']
+                       ?? $this->getContentType( $params['dst'], null, $params['src'] );
+
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'content-length' => filesize( $params['src'] ),
-                               'etag' => md5_file( $params['src'] ),
-                               'content-type' => $contentType,
-                               'x-object-meta-sha1base36' => $sha1Hash
-                       ] + $this->sanitizeHdrsStrict( $params ),
-                       'body' => $handle // resource
+                       'headers' => array_merge(
+                               $mutableHeaders,
+                               [
+                                       'content-length' => $srcSize,
+                                       'etag' => hash_final( $md5Context ),
+                                       'x-object-meta-sha1base36' =>
+                                               Wikimedia\base_convert( hash_final( $sha1Context ), 16, 36, 31 )
+                               ]
+                       ),
+                       'body' => $srcHandle // resource
                ] ];
 
                $method = __METHOD__;
@@ -372,10 +374,12 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
-               $opHandle->resourcesToClose[] = $handle;
+               $opHandle->resourcesToClose[] = $srcHandle;
 
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
@@ -406,10 +410,13 @@ class SwiftFileBackend extends FileBackendStore {
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'x-copy-from' => '/' . rawurlencode( $srcCont ) .
-                                       '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
-                       ] + $this->sanitizeHdrsStrict( $params ), // extra headers merged into object
+                       'headers' => array_merge(
+                               $this->extractMutableContentHeaders( $params['headers'] ?? [] ),
+                               [
+                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) . '/' .
+                                               str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                               ]
+                       )
                ] ];
 
                $method = __METHOD__;
@@ -418,10 +425,14 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
-                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               if ( empty( $params['ignoreMissingSource'] ) ) {
+                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               }
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -451,16 +462,17 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $reqs = [
-                       [
-                               'method' => 'PUT',
-                               'url' => [ $dstCont, $dstRel ],
-                               'headers' => [
-                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) .
-                                               '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
-                               ] + $this->sanitizeHdrsStrict( $params ) // extra headers merged into object
-                       ]
-               ];
+               $reqs = [ [
+                       'method' => 'PUT',
+                       'url' => [ $dstCont, $dstRel ],
+                       'headers' => array_merge(
+                               $this->extractMutableContentHeaders( $params['headers'] ?? [] ),
+                               [
+                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) . '/' .
+                                               str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                               ]
+                       )
+               ] ];
                if ( "{$srcCont}/{$srcRel}" !== "{$dstCont}/{$dstRel}" ) {
                        $reqs[] = [
                                'method' => 'DELETE',
@@ -477,10 +489,17 @@ class SwiftFileBackend extends FileBackendStore {
                        } elseif ( $request['method'] === 'DELETE' && $rcode === 204 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
-                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               if ( empty( $params['ignoreMissingSource'] ) ) {
+                                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               } else {
+                                       // Leave Status as OK but skip the DELETE request
+                                       return SwiftFileOpHandle::CONTINUE_NO;
+                               }
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -521,6 +540,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -554,17 +575,20 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               // POST clears prior headers, so we need to merge the changes in to the old ones
-               $metaHdrs = [];
+               // Swift object POST clears any prior headers, so merge the new and old headers here.
+               // Also, during, POST, libcurl adds "Content-Type: application/x-www-form-urlencoded"
+               // if "Content-Type" is not set, which would clobber the header value for the object.
+               $oldMetadataHeaders = [];
                foreach ( $stat['xattr']['metadata'] as $name => $value ) {
-                       $metaHdrs["x-object-meta-$name"] = $value;
+                       $oldMetadataHeaders["x-object-meta-$name"] = $value;
                }
-               $customHdrs = $this->sanitizeHdrs( $params ) + $stat['xattr']['headers'];
+               $newContentHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               $oldContentHeaders = $stat['xattr']['headers'];
 
                $reqs = [ [
                        'method' => 'POST',
                        'url' => [ $srcCont, $srcRel ],
-                       'headers' => $metaHdrs + $customHdrs
+                       'headers' => $oldMetadataHeaders + $newContentHeaders + $oldContentHeaders
                ] ];
 
                $method = __METHOD__;
@@ -743,9 +767,9 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                // Find prior custom HTTP headers
-               $postHeaders = $this->getCustomHeaders( $objHdrs );
+               $postHeaders = $this->extractMutableContentHeaders( $objHdrs );
                // Find prior metadata headers
-               $postHeaders += $this->getMetadataHeaders( $objHdrs );
+               $postHeaders += $this->extractMetadataHeaders( $objHdrs );
 
                $status = $this->newStatus();
                /** @noinspection PhpUnusedLocalVariableInspection */
@@ -1083,11 +1107,11 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doStreamFile( array $params ) {
                $status = $this->newStatus();
 
-               $flags = !empty( $params['headless'] ) ? StreamFile::STREAM_HEADLESS : 0;
+               $flags = !empty( $params['headless'] ) ? HTTPFileStreamer::STREAM_HEADLESS : 0;
 
                list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
                if ( $srcRel === null ) {
-                       StreamFile::send404Message( $params['src'], $flags );
+                       HTTPFileStreamer::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-invalidpath', $params['src'] );
 
                        return $status;
@@ -1095,7 +1119,7 @@ class SwiftFileBackend extends FileBackendStore {
 
                $auth = $this->getAuthentication();
                if ( !$auth || !is_array( $this->getContainerStat( $srcCont ) ) ) {
-                       StreamFile::send404Message( $params['src'], $flags );
+                       HTTPFileStreamer::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-stream', $params['src'] );
 
                        return $status;
@@ -1104,7 +1128,7 @@ class SwiftFileBackend extends FileBackendStore {
                // If "headers" is set, we only want to send them if the file is there.
                // Do not bother checking if the file exists if headers are not set though.
                if ( $params['headers'] && !$this->fileExists( $params ) ) {
-                       StreamFile::send404Message( $params['src'], $flags );
+                       HTTPFileStreamer::send404Message( $params['src'], $flags );
                        $status->fatal( 'backend-fail-stream', $params['src'] );
 
                        return $status;
@@ -1293,11 +1317,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $hdrs;
        }
 
-       /**
-        * @param FileBackendStoreOpHandle[] $fileOpHandles
-        *
-        * @return StatusValue[]
-        */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                /** @var SwiftFileOpHandle[] $fileOpHandles */
                '@phan-var SwiftFileOpHandle[] $fileOpHandles';
@@ -1334,13 +1353,18 @@ class SwiftFileBackend extends FileBackendStore {
                for ( $stage = 0; $stage < $reqCount; ++$stage ) {
                        $httpReqs = $this->http->runMulti( $httpReqsByStage[$stage] );
                        foreach ( $httpReqs as $index => $httpReq ) {
+                               /** @var SwiftFileOpHandle $fileOpHandle */
+                               $fileOpHandle = $fileOpHandles[$index];
                                // Run the callback for each request of this operation
-                               $callback = $fileOpHandles[$index]->callback;
-                               $callback( $httpReq, $statuses[$index] );
-                               // On failure, abort all remaining requests for this operation
-                               // (e.g. abort the DELETE request if the COPY request fails for a move)
-                               if ( !$statuses[$index]->isOK() ) {
-                                       $stages = count( $fileOpHandles[$index]->httpOp );
+                               $status = $statuses[$index];
+                               ( $fileOpHandle->callback )( $httpReq, $status );
+                               // On failure, abort all remaining requests for this operation. This is used
+                               // in "move" operations to abort the DELETE request if the PUT request fails.
+                               if (
+                                       !$status->isOK() ||
+                                       $fileOpHandle->state === $fileOpHandle::CONTINUE_NO
+                               ) {
+                                       $stages = count( $fileOpHandle->httpOp );
                                        for ( $s = ( $stage + 1 ); $s < $stages; ++$s ) {
                                                unset( $httpReqsByStage[$s][$index] );
                                        }
@@ -1670,9 +1694,9 @@ class SwiftFileBackend extends FileBackendStore {
         */
        protected function getStatFromHeaders( array $rhdrs ) {
                // Fetch all of the custom metadata headers
-               $metadata = $this->getMetadata( $rhdrs );
+               $metadata = $this->getMetadataFromHeaders( $rhdrs );
                // Fetch all of the custom raw HTTP headers
-               $headers = $this->sanitizeHdrs( [ 'headers' => $rhdrs ] );
+               $headers = $this->extractMutableContentHeaders( $rhdrs );
 
                return [
                        // Convert various random Swift dates to TS_MW
index 649225d..8697f9f 100644 (file)
@@ -34,6 +34,8 @@ abstract class FileBackendStoreOpHandle {
        public $backend;
        /** @var array */
        public $resourcesToClose = [];
+       /** @var callable name that identifies the function called */
+       public $call;
 
        /**
         * Close all open file handles
index 1119867..70ed46a 100644 (file)
  * @see FileBackendStoreOpHandle
  */
 class SwiftFileOpHandle extends FileBackendStoreOpHandle {
-       /** @var array List of Requests for MultiHttpClient */
+       /** @var array[] List of HTTP request maps for MultiHttpClient */
        public $httpOp;
-       /** @var Closure */
+       /** @var Closure Function to run after each HTTP request finishes */
        public $callback;
 
+       /** @var int Class CONTINUE_* constant */
+       public $state = self::CONTINUE_IF_OK;
+
+       /** @var int Continue with the next requests stages if no errors occured */
+       const CONTINUE_IF_OK = 0;
+       /** @var int Cancel the next requests stages */
+       const CONTINUE_NO = 1;
+
        /**
+        * Construct a handle to be use with SwiftFileOpHandle::doExecuteOpHandlesInternal()
+        *
+        * The callback returns a class CONTINUE_* constant and takes the following parameters:
+        *   - An HTTP request map array with 'response' filled
+        *   - A StatusValue instance to be updated as needed
+        *
         * @param SwiftFileBackend $backend
-        * @param Closure $callback Function that takes (HTTP request array, status)
+        * @param Closure $callback
         * @param array $httpOp MultiHttpClient op
         */
        public function __construct( SwiftFileBackend $backend, Closure $callback, array $httpOp ) {
index 6478a61..83dcc6b 100644 (file)
@@ -152,7 +152,7 @@ abstract class QuorumLockManager extends LockManager {
         * This is all or nothing; if any key is already pledged then this totally fails.
         *
         * @param int $bucket
-        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
+        * @param callable $callback Pledge method taking a server name and yielding a StatusValue
         * @return StatusValue
         */
        final protected function collectPledgeQuorum( $bucket, callable $callback ) {
@@ -194,7 +194,7 @@ abstract class QuorumLockManager extends LockManager {
         * Attempt to release pledges with the peers for a bucket
         *
         * @param int $bucket
-        * @param callable $callback Pledge method taking a server name and yeilding a StatusValue
+        * @param callable $callback Pledge method taking a server name and yielding a StatusValue
         * @return StatusValue
         */
        final protected function releasePledges( $bucket, callable $callback ) {
index bafe5e3..6fca043 100644 (file)
@@ -1089,7 +1089,7 @@ EOT;
 
                // Special code for ogg - detect if it's video (theora),
                // else label it as sound.
-               if ( $mime == 'application/ogg' && file_exists( $path ) ) {
+               if ( $mime == 'application/ogg' && is_string( $path ) && file_exists( $path ) ) {
                        // Read a chunk of the file
                        $f = fopen( $path, "rt" );
                        if ( !$f ) {
index 9d66326..16cd5ca 100644 (file)
@@ -68,6 +68,9 @@ class XmlTypeCheck {
         */
        protected $stackDepth = 0;
 
+       /** @var callable|null */
+       protected $filterCallback;
+
        /**
         * @var array Additional parsing options
         */
index 51f7316..77a7883 100644 (file)
@@ -46,7 +46,7 @@ class MultiWriteBagOStuff extends BagOStuff {
        /**
         * $params include:
         *   - caches: A numbered array of either ObjectFactory::getObjectFromSpec
-        *      arrays yeilding BagOStuff objects or direct BagOStuff objects.
+        *      arrays yielding BagOStuff objects or direct BagOStuff objects.
         *      If using the former, the 'args' field *must* be set.
         *      The first cache is the primary one, being the first to
         *      be read in the fallback chain. Writes happen to all stores
index ff87829..9f953e1 100644 (file)
@@ -47,9 +47,9 @@ class ReplicatedBagOStuff extends BagOStuff {
 
        /**
         * Constructor. Parameters are:
-        *   - writeFactory: ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
+        *   - writeFactory: ObjectFactory::getObjectFromSpec array yielding BagOStuff.
         *      This object will be used for writes (e.g. the master DB).
-        *   - readFactory: ObjectFactory::getObjectFromSpec array yeilding BagOStuff.
+        *   - readFactory: ObjectFactory::getObjectFromSpec array yielding 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]
index 629d2cd..2f44a55 100644 (file)
@@ -1269,7 +1269,7 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                // Nested callback process cache use is not lag-safe with regard to HOLDOFF_TTL since
                // process cached values are more lagged than persistent ones as they are not purged.
                if ( $pCache && $this->callbackDepth == 0 ) {
-                       $cached = $pCache->get( $this->getProcessCacheKey( $key, $version ), INF, false );
+                       $cached = $pCache->get( $this->getProcessCacheKey( $key, $version ), $pcTTL, false );
                        if ( $cached !== false ) {
                                return $cached;
                        }
@@ -2488,8 +2488,9 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
         */
        private function determineKeyClassForStats( $key ) {
                $parts = explode( ':', $key, 3 );
-
-               return $parts[1] ?? $parts[0]; // sanity
+               // Sanity fallback in case the key was not made by makeKey.
+               // Replace dots because they are special in StatsD (T232907)
+               return strtr( $parts[1] ?? $parts[0], '.', '_' );
        }
 
        /**
@@ -2544,6 +2545,9 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
                if ( !isset( $this->processCaches[$group] ) ) {
                        list( , $size ) = explode( ':', $group );
                        $this->processCaches[$group] = new MapCacheLRU( (int)$size );
+                       if ( $this->wallClockOverride !== null ) {
+                               $this->processCaches[$group]->setMockTime( $this->wallClockOverride );
+                       }
                }
 
                return $this->processCaches[$group];
@@ -2640,5 +2644,8 @@ class WANObjectCache implements IExpiringStore, IStoreKeyEncoder, LoggerAwareInt
        public function setMockTime( &$time ) {
                $this->wallClockOverride =& $time;
                $this->cache->setMockTime( $time );
+               foreach ( $this->processCaches as $pCache ) {
+                       $pCache->setMockTime( $time );
+               }
        }
 }
index 7be3b7d..464e68c 100644 (file)
@@ -850,27 +850,44 @@ abstract class DatabaseMysqlBase extends Database {
                }
 
                if ( $this->getLBInfo( 'is static' ) === true ) {
+                       $this->queryLogger->debug(
+                               "Bypassed replication wait; database has a static dataset",
+                               $this->getLogContext( [ 'method' => __METHOD__ ] )
+                       );
+
                        return 0; // this is a copy of a read-only dataset with no master DB
                } elseif ( $this->lastKnownReplicaPos && $this->lastKnownReplicaPos->hasReached( $pos ) ) {
+                       $this->queryLogger->debug(
+                               "Bypassed replication wait; replication already known to have reached $pos",
+                               $this->getLogContext( [ 'method' => __METHOD__ ] )
+                       );
+
                        return 0; // already reached this point for sure
                }
 
                // Call doQuery() directly, to avoid opening a transaction if DBO_TRX is set
                if ( $pos->getGTIDs() ) {
-                       // Ignore GTIDs from domains exclusive to the master DB (presumably inactive)
-                       $rpos = $this->getReplicaPos();
-                       $gtidsWait = $rpos ? MySQLMasterPos::getCommonDomainGTIDs( $pos, $rpos ) : [];
+                       // Get the GTIDs from this replica server too see the domains (channels)
+                       $refPos = $this->getReplicaPos();
+                       if ( !$refPos ) {
+                               $this->queryLogger->error(
+                                       "Could not get replication position",
+                                       $this->getLogContext( [ 'method' => __METHOD__ ] )
+                               );
+
+                               return -1; // this is the master itself?
+                       }
+                       // GTIDs with domains (channels) that are active and are present on the replica
+                       $gtidsWait = $pos::getRelevantActiveGTIDs( $pos, $refPos );
                        if ( !$gtidsWait ) {
                                $this->queryLogger->error(
-                                       "No GTIDs with the same domain between master ($pos) and replica ($rpos)",
-                                       $this->getLogContext( [
-                                               'method' => __METHOD__,
-                                       ] )
+                                       "No active GTIDs in $pos share a domain with those in $refPos",
+                                       $this->getLogContext( [ 'method' => __METHOD__, 'activeDomain' => $pos ] )
                                );
 
                                return -1; // $pos is from the wrong cluster?
                        }
-                       // Wait on the GTID set (MariaDB only)
+                       // Wait on the GTID set
                        $gtidArg = $this->addQuotes( implode( ',', $gtidsWait ) );
                        if ( strpos( $gtidArg, ':' ) !== false ) {
                                // MySQL GTIDs, e.g "source_id:transaction_id"
@@ -886,28 +903,28 @@ abstract class DatabaseMysqlBase extends Database {
                        $sql = "SELECT MASTER_POS_WAIT($encFile, $encPos, $timeout)";
                }
 
-               list( $res, $err ) = $this->executeQuery( $sql, __METHOD__, self::QUERY_IGNORE_DBO_TRX );
-               $row = $res ? $this->fetchRow( $res ) : false;
-               if ( !$row ) {
-                       throw new DBExpectedError( $this, "Replication wait failed: {$err}" );
-               }
+               $res = $this->query( $sql, __METHOD__, self::QUERY_IGNORE_DBO_TRX );
+               $row = $this->fetchRow( $res );
 
                // Result can be NULL (error), -1 (timeout), or 0+ per the MySQL manual
                $status = ( $row[0] !== null ) ? intval( $row[0] ) : null;
                if ( $status === null ) {
-                       if ( !$pos->getGTIDs() ) {
-                               // T126436: jobs programmed to wait on master positions might be referencing
-                               // binlogs with an old master hostname; this makes MASTER_POS_WAIT() return null.
-                               // Try to detect this case and treat the replica DB as having reached the given
-                               // position (any master switchover already requires that the new master be caught
-                               // up before the switch).
-                               $replicationPos = $this->getReplicaPos();
-                               if ( $replicationPos && !$replicationPos->channelsMatch( $pos ) ) {
-                                       $this->lastKnownReplicaPos = $replicationPos;
-                                       $status = 0;
-                               }
-                       }
+                       $this->queryLogger->error(
+                               "An error occurred while waiting for replication to reach $pos",
+                               $this->getLogContext( [ 'method' => __METHOD__, 'sql' => $sql ] )
+                       );
+               } elseif ( $status < 0 ) {
+                       $this->queryLogger->error(
+                               "Timed out waiting for replication to reach $pos",
+                               $this->getLogContext( [
+                                       'method' => __METHOD__, 'sql' => $sql, 'timeout' => $timeout
+                               ] )
+                       );
                } elseif ( $status >= 0 ) {
+                       $this->queryLogger->debug(
+                               "Replication has reached $pos",
+                               $this->getLogContext( [ 'method' => __METHOD__ ] )
+                       );
                        // Remember that this position was reached to save queries next time
                        $this->lastKnownReplicaPos = $pos;
                }
index fa2c1db..e1b8f9a 100644 (file)
@@ -190,39 +190,69 @@ class MySQLMasterPos implements DBMasterPos {
        }
 
        /**
+        * Set the GTID domain known to be used in new commits on a replication stream of interest
+        *
+        * This makes getRelevantActiveGTIDs() filter out GTIDs from other domains
+        *
+        * @see MySQLMasterPos::getRelevantActiveGTIDs()
+        * @see https://mariadb.com/kb/en/library/gtid/#gtid_domain_id
+        *
         * @param int|null $id @@gtid_domain_id of the active replication stream
+        * @return MySQLMasterPos This instance (since 1.34)
         * @since 1.31
         */
        public function setActiveDomain( $id ) {
                $this->activeDomain = (int)$id;
+
+               return $this;
        }
 
        /**
+        * Set the server ID known to be used in new commits on a replication stream of interest
+        *
+        * This makes getRelevantActiveGTIDs() filter out GTIDs from other origin servers
+        *
+        * @see MySQLMasterPos::getRelevantActiveGTIDs()
+        *
         * @param int|null $id @@server_id of the server were writes originate
+        * @return MySQLMasterPos This instance (since 1.34)
         * @since 1.31
         */
        public function setActiveOriginServerId( $id ) {
                $this->activeServerId = (int)$id;
+
+               return $this;
        }
 
        /**
+        * Set the server UUID known to be used in new commits on a replication stream of interest
+        *
+        * This makes getRelevantActiveGTIDs() filter out GTIDs from other origin servers
+        *
+        * @see MySQLMasterPos::getRelevantActiveGTIDs()
+        *
         * @param string|null $id @@server_uuid of the server were writes originate
+        * @return MySQLMasterPos This instance (since 1.34)
         * @since 1.31
         */
        public function setActiveOriginServerUUID( $id ) {
                $this->activeServerUUID = $id;
+
+               return $this;
        }
 
        /**
         * @param MySQLMasterPos $pos
         * @param MySQLMasterPos $refPos
-        * @return string[] List of GTIDs from $pos that have domains in $refPos
-        * @since 1.31
+        * @return string[] List of active GTIDs from $pos that have domains in $refPos
+        * @since 1.34
         */
-       public static function getCommonDomainGTIDs( MySQLMasterPos $pos, MySQLMasterPos $refPos ) {
-               return array_values(
-                       array_intersect_key( $pos->gtids, $refPos->getActiveGtidCoordinates() )
-               );
+       public static function getRelevantActiveGTIDs( MySQLMasterPos $pos, MySQLMasterPos $refPos ) {
+               return array_values( array_intersect_key(
+                       $pos->gtids,
+                       $pos->getActiveGtidCoordinates(),
+                       $refPos->gtids
+               ) );
        }
 
        /**
index 77b029f..5d33e69 100644 (file)
@@ -60,7 +60,7 @@ class LBFactoryMulti extends LBFactory {
        private $masterTemplateOverrides = [];
        /** @var array[] Map of (host => server config map overrides) for main and external servers */
        private $templateOverridesByServer = [];
-       /**  @var string[]|bool[] A map of section name to read-only message */
+       /** @var string[]|bool[] A map of section name to read-only message */
        private $readOnlyBySection = [];
 
        /** @var string An ILoadMonitor class */
@@ -85,7 +85,7 @@ class LBFactoryMulti extends LBFactory {
         * data can be before the load balancer tries to avoid using it. The map can have 'is static'
         * set to disable blocking  replication sync checks (intended for archive servers with
         * unchanging data).
-
+        *
         * @see LBFactory::__construct()
         * @param array $conf Additional parameters include:
         *   - hostsByName                 Optional (hostname => IP address) map.
index 4c68833..a3e57ae 100644 (file)
@@ -27,11 +27,6 @@ use InvalidArgumentException;
 
 /**
  * Trivial LoadBalancer that always returns an injected connection handle.
- *
- * Note that, while this LoadBalancer does not open any connections itself,
- * it still closes the injected connection at times, including during destruction.
- * It is therefore unsuitable for use in tests unless you have a Database instance
- * separate from the main test database (which is expected to stay open).
  */
 class LoadBalancerSingle extends LoadBalancer {
        /** @var IDatabase */
index eb645cc..343e35c 100644 (file)
@@ -90,6 +90,10 @@ class RedisConnectionPool implements LoggerAwareInterface {
                if ( !isset( $options['serializer'] ) || $options['serializer'] === 'php' ) {
                        $this->serializer = Redis::SERIALIZER_PHP;
                } elseif ( $options['serializer'] === 'igbinary' ) {
+                       if ( !defined( 'Redis::SERIALIZER_IGBINARY' ) ) {
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ': configured serializer "igbinary" not available' );
+                       }
                        $this->serializer = Redis::SERIALIZER_IGBINARY;
                } elseif ( $options['serializer'] === 'none' ) {
                        $this->serializer = Redis::SERIALIZER_NONE;
index d27643c..d49e3c5 100644 (file)
@@ -22,6 +22,8 @@
  * @since 1.25
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats block log entries.
  *
@@ -138,7 +140,9 @@ class BlockLogFormatter extends LogFormatter {
                $linkRenderer = $this->getLinkRenderer();
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
                        || !( $subtype === 'block' || $subtype === 'reblock' )
-                       || !$this->context->getUser()->isAllowed( 'block' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'block' )
                ) {
                        return '';
                }
index e05357c..23c582c 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class ContentModelLogFormatter extends LogFormatter {
        protected function getMessageParameters() {
                $lang = $this->context->getLanguage();
@@ -12,7 +14,9 @@ class ContentModelLogFormatter extends LogFormatter {
        public function getActionLinks() {
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
                        || $this->entry->getSubtype() !== 'change'
-                       || !$this->context->getUser()->isAllowed( 'editcontentmodel' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'editcontentmodel' )
                ) {
                        return '';
                }
index 3bc19ff..565a65f 100644 (file)
@@ -23,7 +23,8 @@
  * @since 1.22
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * This class formats delete log entries.
@@ -31,6 +32,12 @@ use MediaWiki\Storage\RevisionRecord;
  * @since 1.19
  */
 class DeleteLogFormatter extends LogFormatter {
+       /** @var array|null */
+       private $parsedParametersDeleteLog;
+
+       /**
+        * @inheritDoc
+        */
        protected function getMessageKey() {
                $key = parent::getMessageKey();
                if ( in_array( $this->entry->getSubtype(), [ 'event', 'revision' ] ) ) {
@@ -50,8 +57,11 @@ class DeleteLogFormatter extends LogFormatter {
                return $key;
        }
 
+       /**
+        * @inheritDoc
+        */
        protected function getMessageParameters() {
-               if ( isset( $this->parsedParametersDeleteLog ) ) {
+               if ( $this->parsedParametersDeleteLog !== null ) {
                        return $this->parsedParametersDeleteLog;
                }
 
@@ -136,7 +146,8 @@ class DeleteLogFormatter extends LogFormatter {
        public function getActionLinks() {
                $user = $this->context->getUser();
                $linkRenderer = $this->getLinkRenderer();
-               if ( !$user->isAllowed( 'deletedhistory' )
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' )
                        || $this->entry->isDeleted( LogPage::DELETED_ACTION )
                ) {
                        return '';
@@ -145,7 +156,7 @@ class DeleteLogFormatter extends LogFormatter {
                switch ( $this->entry->getSubtype() ) {
                        case 'delete': // Show undelete link
                        case 'delete_redir':
-                               if ( $user->isAllowed( 'undelete' ) ) {
+                               if ( $permissionManager->userHasRight( $user, 'undelete' ) ) {
                                        $message = 'undeletelink';
                                } else {
                                        $message = 'undeleteviewlink';
index 6791503..2e7f065 100644 (file)
@@ -233,7 +233,10 @@ class LogEventsList extends ContextSource {
                foreach ( LogPage::validTypes() as $type ) {
                        $page = new LogPage( $type );
                        $restriction = $page->getRestriction();
-                       if ( $this->getUser()->isAllowed( $restriction ) ) {
+                       if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), $restriction )
+                       ) {
                                $typesByName[$type] = $page->getName()->text();
                        }
                }
@@ -450,11 +453,12 @@ class LogEventsList extends ContextSource {
                }
 
                $del = '';
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                // Don't show useless checkbox to people who cannot hide log entries
-               if ( $user->isAllowed( 'deletedhistory' ) ) {
-                       $canHide = $user->isAllowed( 'deletelogentry' );
-                       $canViewSuppressedOnly = $user->isAllowed( 'viewsuppressed' ) &&
-                               !$user->isAllowed( 'suppressrevision' );
+               if ( $permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
+                       $canHide = $permissionManager->userHasRight( $user, 'deletelogentry' );
+                       $canViewSuppressedOnly = $permissionManager->userHasRight( $user, 'viewsuppressed' ) &&
+                               !$permissionManager->userHasRight( $user, 'suppressrevision' );
                        $entryIsSuppressed = self::isDeleted( $row, LogPage::DELETED_RESTRICTED );
                        $canViewThisSuppressedEntry = $canViewSuppressedOnly && $entryIsSuppressed;
                        if ( $row->log_deleted || $canHide ) {
@@ -508,7 +512,9 @@ class LogEventsList extends ContextSource {
                                in_array( $row->log_action, $action ) : $row->log_action == $action;
                        if ( $match && $right ) {
                                global $wgUser;
-                               $match = $wgUser->isAllowed( $right );
+                               $match = MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $wgUser, $right );
                        }
                }
 
@@ -572,7 +578,10 @@ class LogEventsList extends ContextSource {
                        $user = $wgUser;
                }
                $logRestrictions = MediaWikiServices::getInstance()->getMainConfig()->get( 'LogRestrictions' );
-               if ( isset( $logRestrictions[$type] ) && !$user->isAllowed( $logRestrictions[$type] ) ) {
+               if ( isset( $logRestrictions[$type] ) && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, $logRestrictions[$type] )
+               ) {
                        return false;
                }
                return true;
@@ -783,7 +792,10 @@ class LogEventsList extends ContextSource {
 
                // Don't show private logs to unprivileged users
                foreach ( $wgLogRestrictions as $logType => $right ) {
-                       if ( $audience == 'public' || !$user->isAllowed( $right ) ) {
+                       if ( $audience == 'public' || !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, $right )
+                       ) {
                                $hiddenLogs[] = $logType;
                        }
                }
index 9e63ffe..b4a6825 100644 (file)
@@ -163,7 +163,9 @@ class LogFormatter {
                $logRestrictions = $this->context->getConfig()->get( 'LogRestrictions' );
                $type = $this->entry->getType();
                return !isset( $logRestrictions[$type] )
-                       || $this->context->getUser()->isAllowed( $logRestrictions[$type] );
+                       || MediaWikiServices::getInstance()
+                                  ->getPermissionManager()
+                                  ->userHasRight( $this->context->getUser(), $logRestrictions[$type] );
        }
 
        /**
index 3871047..0b78a36 100644 (file)
@@ -53,6 +53,12 @@ class LogPager extends ReverseChronologicalPager {
        /** @var bool */
        private $actionRestrictionsEnforced = false;
 
+       /** @var array */
+       private $mConds;
+
+       /** @var string */
+       private $mTagFilter;
+
        /** @var LogEventsList */
        public $mLogEventsList;
 
@@ -80,12 +86,13 @@ class LogPager extends ReverseChronologicalPager {
                $this->mLogEventsList = $list;
 
                $this->limitType( $types ); // also excludes hidden types
+               $this->limitLogId( $logId );
+               $this->limitFilterTypes();
                $this->limitPerformer( $performer );
                $this->limitTitle( $title, $pattern );
                $this->limitAction( $action );
                $this->getDateCond( $year, $month, $day );
                $this->mTagFilter = $tagFilter;
-               $this->limitLogId( $logId );
 
                $this->mDb = wfGetDB( DB_REPLICA, 'logpager' );
        }
@@ -101,7 +108,18 @@ class LogPager extends ReverseChronologicalPager {
                return $query;
        }
 
-       // Call ONLY after calling $this->limitType() already!
+       private function limitFilterTypes() {
+               if ( $this->hasEqualsClause( 'log_id' ) ) { // T220834
+                       return;
+               }
+               $filterTypes = $this->getFilterParams();
+               foreach ( $filterTypes as $type => $hide ) {
+                       if ( $hide ) {
+                               $this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
+                       }
+               }
+       }
+
        public function getFilterParams() {
                global $wgFilterLogTypes;
                $filters = [];
@@ -121,9 +139,6 @@ class LogPager extends ReverseChronologicalPager {
                        }
 
                        $filters[$type] = $hide;
-                       if ( $hide ) {
-                               $this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
-                       }
                }
 
                return $filters;
@@ -146,7 +161,9 @@ class LogPager extends ReverseChronologicalPager {
                $needReindex = false;
                foreach ( $types as $type ) {
                        if ( isset( $wgLogRestrictions[$type] )
-                               && !$user->isAllowed( $wgLogRestrictions[$type] )
+                               && !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, $wgLogRestrictions[$type] )
                        ) {
                                $needReindex = true;
                                $types = array_diff( $types, [ $type ] );
@@ -344,6 +361,11 @@ class LogPager extends ReverseChronologicalPager {
                if ( !$this->mTagFilter && !array_key_exists( 'ls_field', $this->mConds ) ) {
                        $options[] = 'STRAIGHT_JOIN';
                }
+               if ( $this->performer !== '' ) {
+                       // T223151: MariaDB's optimizer, at least 10.1, likes to choose a wildly bad plan for
+                       // some reason for this code path. Tell it not to use the wrong index it wants to pick.
+                       $options['IGNORE INDEX'] = [ 'logging' => [ 'times' ] ];
+               }
 
                $info = [
                        'tables' => $tables,
@@ -462,12 +484,10 @@ class LogPager extends ReverseChronologicalPager {
                }
                $this->actionRestrictionsEnforced = true;
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_ACTION ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_ACTION ) .
                                ' != ' . LogPage::SUPPRESSED_USER;
                }
@@ -483,12 +503,10 @@ class LogPager extends ReverseChronologicalPager {
                }
                $this->performerRestrictionsEnforced = true;
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::DELETED_USER ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $this->mConds[] = $this->mDb->bitAnd( 'log_deleted', LogPage::SUPPRESSED_USER ) .
                                ' != ' . LogPage::SUPPRESSED_ACTION;
                }
index 7a6fb9d..925c976 100644 (file)
@@ -22,6 +22,8 @@
  * @since 1.25
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats merge log entries.
  *
@@ -47,7 +49,9 @@ class MergeLogFormatter extends LogFormatter {
 
        public function getActionLinks() {
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
-                       || !$this->context->getUser()->isAllowed( 'mergehistory' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'mergehistory' )
                ) {
                        return '';
                }
index 637a8e7..6797f98 100644 (file)
@@ -23,6 +23,8 @@
  * @since 1.22
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class formats move log entries.
  *
@@ -60,7 +62,9 @@ class MoveLogFormatter extends LogFormatter {
        public function getActionLinks() {
                if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) // Action is hidden
                        || $this->entry->getSubtype() !== 'move'
-                       || !$this->context->getUser()->isAllowed( 'move' )
+                       || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'move' )
                ) {
                        return '';
                }
index ba02457..81d9aa2 100644 (file)
@@ -101,7 +101,10 @@ class ProtectLogFormatter extends LogFormatter {
                ];
 
                // Show change protection link
-               if ( $this->context->getUser()->isAllowed( 'protect' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->context->getUser(), 'protect' )
+               ) {
                        $links[] = $linkRenderer->makeKnownLink(
                                $title,
                                $this->msg( 'protect_change' )->text(),
index cba68ef..4d176fb 100644 (file)
@@ -129,7 +129,10 @@ class EmailNotification {
                if ( $watchers === [] && !count( $wgUsersNotifiedOnAllChanges ) ) {
                        $sendEmail = false;
                        // Only send notification for non minor edits, unless $wgEnotifMinorEdits
-                       if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
+                       if ( !$minorEdit || ( $wgEnotifMinorEdits && !MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $editor, 'nominornewtalk' ) )
+                       ) {
                                $isUserTalkPage = ( $title->getNamespace() == NS_USER_TALK );
                                if ( $wgEnotifUserTalk
                                        && $isUserTalkPage
@@ -214,7 +217,10 @@ class EmailNotification {
 
                $userTalkId = false;
 
-               if ( !$minorEdit || ( $wgEnotifMinorEdits && !$editor->isAllowed( 'nominornewtalk' ) ) ) {
+               if ( !$minorEdit || ( $wgEnotifMinorEdits && !MediaWikiServices::getInstance()
+                                  ->getPermissionManager()
+                                  ->userHasRight( $editor, 'nominornewtalk' ) )
+               ) {
                        if ( $wgEnotifUserTalk
                                && $isUserTalkPage
                                && $this->canSendUserTalkEmail( $editor, $title, $minorEdit )
index 47fa16f..7b73902 100644 (file)
@@ -34,8 +34,8 @@ class UserMailer {
         * Send mail using a PEAR mailer
         *
         * @param Mail_smtp $mailer
-        * @param string $dest
-        * @param string $headers
+        * @param string[]|string $dest
+        * @param array $headers
         * @param string $body
         *
         * @return Status
@@ -382,6 +382,8 @@ class UserMailer {
                                throw new MWException( 'PEAR mail package is not installed' );
                        }
 
+                       $recips = array_map( 'strval', $to );
+
                        Wikimedia\suppressWarnings();
 
                        // Create the mail object using the Mail::factory method
@@ -391,19 +393,20 @@ class UserMailer {
                                Wikimedia\restoreWarnings();
                                return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() );
                        }
+                       '@phan-var Mail_smtp $mail_object';
 
                        wfDebug( "Sending mail via PEAR::Mail\n" );
 
                        $headers['Subject'] = self::quotedPrintable( $subject );
 
                        // When sending only to one recipient, shows it its email using To:
-                       if ( count( $to ) == 1 ) {
-                               $headers['To'] = $to[0]->toString();
+                       if ( count( $recips ) == 1 ) {
+                               $headers['To'] = $recips[0];
                        }
 
                        // Split jobs since SMTP servers tends to limit the maximum
                        // number of possible recipients.
-                       $chunks = array_chunk( $to, $wgEnotifMaxRecips );
+                       $chunks = array_chunk( $recips, $wgEnotifMaxRecips );
                        foreach ( $chunks as $chunk ) {
                                $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
                                // FIXME : some chunks might be sent while others are not!
index 3b904e8..d54dd6b 100644 (file)
@@ -240,6 +240,7 @@ class DjVuHandler extends ImageHandler {
         * @param File|FSFile $image
         * @param string $path
         * @return DjVuImage
+        * @suppress PhanUndeclaredProperty Custom property
         */
        function getDjVuImage( $image, $path ) {
                if ( !$image ) {
@@ -290,6 +291,7 @@ class DjVuHandler extends ImageHandler {
         * @param File $image
         * @param bool $gettext DOCUMENT (Default: false)
         * @return bool|SimpleXMLElement
+        * @suppress PhanUndeclaredProperty Custom property
         */
        public function getMetaTree( $image, $gettext = false ) {
                if ( $gettext && isset( $image->djvuTextTree ) ) {
index 92fad52..50b13a4 100644 (file)
@@ -42,6 +42,9 @@ class DjVuImage {
         */
        const DJVUTXT_MEMORY_LIMIT = 300000;
 
+       /** @var string */
+       private $mFilename;
+
        /**
         * @param string $filename The DjVu file name.
         */
index 8a26f60..dffb1f9 100644 (file)
@@ -122,14 +122,17 @@ class JpegMetadataExtractor {
                                $temp = self::jpegExtractMarker( $fh );
                                // check what type of app segment this is.
                                if ( substr( $temp, 0, 29 ) === "http://ns.adobe.com/xap/1.0/\x00" && $showXMP ) {
-                                       $segments["XMP"] = substr( $temp, 29 );
+                                       // use trim to remove trailing \0 chars
+                                       $segments["XMP"] = trim( substr( $temp, 29 ) );
                                } elseif ( substr( $temp, 0, 35 ) === "http://ns.adobe.com/xmp/extension/\x00" && $showXMP ) {
-                                       $segments["XMP_ext"][] = substr( $temp, 35 );
+                                       // use trim to remove trailing \0 chars
+                                       $segments["XMP_ext"][] = trim( substr( $temp, 35 ) );
                                } elseif ( substr( $temp, 0, 29 ) === "XMP\x00://ns.adobe.com/xap/1.0/\x00" && $showXMP ) {
                                        // Some images (especially flickr images) seem to have this.
                                        // I really have no idea what the deal is with them, but
                                        // whatever...
-                                       $segments["XMP"] = substr( $temp, 29 );
+                                       // use trim to remove trailing \0 chars
+                                       $segments["XMP"] = trim( substr( $temp, 29 ) );
                                        wfDebug( __METHOD__ . ' Found XMP section with wrong app identifier '
                                                . "Using anyways.\n" );
                                } elseif ( substr( $temp, 0, 6 ) === "Exif\0\0" ) {
index 5e99ac9..e49feae 100644 (file)
@@ -43,11 +43,6 @@ use MediaWiki\MediaWikiServices;
  *
  * Primary entry points:
  *
- * - ObjectCache::getMainWANInstance()
- *   Purpose: Memory cache.
- *   Stored in the local data-center's main cache (keyspace different from local-cluster cache).
- *   Delete events are broadcasted to other DCs main cache. See WANObjectCache for details.
- *
  * - ObjectCache::getLocalServerInstance( $fallbackType )
  *   Purpose: Memory cache for very hot keys.
  *   Stored only on the individual web server (typically APC or APCu for web requests,
@@ -60,13 +55,6 @@ use MediaWiki\MediaWikiServices;
  *   Stored centrally within the local data-center. Not replicated to other DCs.
  *   Configured by $wgMainCacheType.
  *
- * - ObjectCache::getMainStashInstance()
- *   Purpose: Ephemeral global storage.
- *   Stored centrally within the primary data-center.
- *   Changes are applied there first and replicated to other DCs (best-effort).
- *   To retrieve the latest value (e.g. not from a replica DB), use BagOStuff::READ_LATEST.
- *   This store may be subject to LRU style evictions.
- *
  * - ObjectCache::getInstance( $cacheType )
  *   Purpose: Special cases (like tiered memory/disk caches).
  *   Get a specific cache type by key in $wgObjectCaches.
@@ -351,30 +339,6 @@ class ObjectCache {
                return self::getInstance( $wgMainCacheType );
        }
 
-       /**
-        * Get the main WAN cache object.
-        *
-        * @since 1.26
-        * @return WANObjectCache
-        * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainWANObjectCache()
-        */
-       public static function getMainWANInstance() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return MediaWikiServices::getInstance()->getMainWANObjectCache();
-       }
-
-       /**
-        * Get the cache object for the main stash.
-        *
-        * @return BagOStuff
-        * @since 1.26
-        * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainObjectStash()
-        */
-       public static function getMainStashInstance() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return MediaWikiServices::getInstance()->getMainObjectStash();
-       }
-
        /**
         * Clear all the cached instances.
         */
index d713396..4a3445e 100644 (file)
@@ -194,6 +194,10 @@ class SqlBagOStuff extends MediumSpecificBagOStuff {
                                $conn = Database::factory( $type, $info );
                                $conn->clearFlag( DBO_TRX ); // auto-commit mode
                                $this->conns[$shardIndex] = $conn;
+                               // Automatically create the objectcache table for sqlite as needed
+                               if ( $conn->getType() === 'sqlite' ) {
+                                       $this->initSqliteDatabase( $conn );
+                               }
                        }
                        $conn = $this->conns[$shardIndex];
                } else {
@@ -206,10 +210,6 @@ class SqlBagOStuff extends MediumSpecificBagOStuff {
                        $attribs = $lb->getServerAttributes( $lb->getWriterIndex() );
                        $flags = $attribs[Database::ATTR_DB_LEVEL_LOCKING] ? 0 : $lb::CONN_TRX_AUTOCOMMIT;
                        $conn = $lb->getMaintenanceConnectionRef( $index, [], false, $flags );
-                       // Automatically create the objectcache table for sqlite as needed
-                       if ( $conn->getType() === 'sqlite' ) {
-                               $this->initSqliteDatabase( $conn );
-                       }
                }
 
                $this->logger->debug( sprintf( "Connection %s will be used for SqlBagOStuff", $conn ) );
index 1c2e782..b6e366e 100644 (file)
@@ -363,8 +363,16 @@ class Article implements Page {
                        }
                }
 
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $oldRev = $this->mRevision ? $this->mRevision->getRevisionRecord() : null;
                if ( $request->getVal( 'direction' ) == 'next' ) {
-                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                       $nextid = 0;
+                       if ( $oldRev ) {
+                               $nextRev = $rl->getNextRevision( $oldRev );
+                               if ( $nextRev ) {
+                                       $nextid = $nextRev->getId();
+                               }
+                       }
                        if ( $nextid ) {
                                $oldid = $nextid;
                                $this->mRevision = null;
@@ -372,7 +380,13 @@ class Article implements Page {
                                $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
                        }
                } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
-                       $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+                       $previd = 0;
+                       if ( $oldRev ) {
+                               $prevRev = $rl->getPreviousRevision( $oldRev );
+                               if ( $prevRev ) {
+                                       $previd = $prevRev->getId();
+                               }
+                       }
                        if ( $previd ) {
                                $oldid = $previd;
                                $this->mRevision = null;
@@ -794,7 +808,9 @@ class Article implements Page {
                                                        $outputPage->enableClientCache( false );
                                                        $outputPage->setRobotPolicy( 'noindex,nofollow' );
 
-                                                       $errortext = $error->getWikiText( false, 'view-pool-error' );
+                                                       $errortext = $error->getWikiText(
+                                                               false, 'view-pool-error', $this->getContext()->getLanguage()
+                                                       );
                                                        $outputPage->wrapWikiTextAsInterface( 'errorbox', $errortext );
                                                }
                                                # Connection or timeout error
@@ -1310,7 +1326,10 @@ class Article implements Page {
                }
 
                $outputPage->preventClickjacking();
-               if ( $user->isAllowed( 'writeapi' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'writeapi' )
+               ) {
                        $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
                }
 
@@ -1596,8 +1615,9 @@ class Article implements Page {
                                        'oldid' => $oldid
                                ] + $extraParams
                        );
-               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
-               $prevlink = $prev
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $prevExist = (bool)$rl->getPreviousRevision( $revision->getRevisionRecord() );
+               $prevlink = $prevExist
                        ? Linker::linkKnown(
                                $this->getTitle(),
                                $context->msg( 'previousrevision' )->escaped(),
@@ -1608,7 +1628,7 @@ class Article implements Page {
                                ] + $extraParams
                        )
                        : $context->msg( 'previousrevision' )->escaped();
-               $prevdiff = $prev
+               $prevdiff = $prevExist
                        ? Linker::linkKnown(
                                $this->getTitle(),
                                $context->msg( 'diff' )->escaped(),
@@ -1648,7 +1668,7 @@ class Article implements Page {
                }
 
                // the outer div is need for styling the revision info and nav in MobileFrontend
-               $outputPage->addSubtitle( "<div class=\"mw-revision\">" . $revisionInfo .
+               $outputPage->addSubtitle( "<div class=\"mw-revision warningbox\">" . $revisionInfo .
                        "<div id=\"mw-revision-nav\">" . $cdel .
                        $context->msg( 'revision-nav' )->rawParams(
                                $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
@@ -1827,7 +1847,10 @@ class Article implements Page {
                        [ 'delete', $this->getTitle()->getPrefixedText() ] )
                ) {
                        # Flag to hide all contents of the archived revisions
-                       $suppress = $request->getCheck( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+
+                       $suppress = $request->getCheck( 'wpSuppress' ) && MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'suppressrevision' );
 
                        $this->doDelete( $reason, $suppress );
 
@@ -1986,8 +2009,8 @@ class Article implements Page {
                                ]
                        );
                }
-
-               if ( $user->isAllowed( 'suppressrevision' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $user, 'suppressrevision' ) ) {
                        $fields[] = new OOUI\FieldLayout(
                                new OOUI\CheckboxInputWidget( [
                                        'name' => 'wpSuppress',
@@ -2045,7 +2068,7 @@ class Article implements Page {
                        ] )
                );
 
-               if ( $user->isAllowed( 'editinterface' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'editinterface' ) ) {
                        $link = Linker::linkKnown(
                                $ctx->msg( 'deletereason-dropdown' )->inContentLanguage()->getTitle(),
                                wfMessage( 'delete-edit-reasonlist' )->escaped(),
@@ -2100,7 +2123,7 @@ class Article implements Page {
                        if ( $error == '' ) {
                                $outputPage->wrapWikiTextAsInterface(
                                        'error mw-error-cannotdelete',
-                                       $status->getWikiText()
+                                       $status->getWikiText( false, false, $context->getLanguage() )
                                );
                                $deleteLogPage = new LogPage( 'delete' );
                                $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
index 9edaccc..cf2497f 100644 (file)
@@ -130,11 +130,10 @@ class ImageHistoryList extends ContextSource {
                $row = $selected = '';
 
                // Deletion link
-               if ( $local && ( $pm->userHasAnyRight( $user, 'delete', 'deletedhistory' ) )
-               ) {
+               if ( $local && ( $pm->userHasAnyRight( $user, 'delete', 'deletedhistory' ) ) ) {
                        $row .= '<td>';
                        # Link to remove from history
-                       if ( $user->isAllowed( 'delete' ) ) {
+                       if ( $pm->userHasRight( $user, 'delete' ) ) {
                                $q = [ 'action' => 'delete' ];
                                if ( !$iscur ) {
                                        $q['oldimage'] = $img;
@@ -146,9 +145,10 @@ class ImageHistoryList extends ContextSource {
                                );
                        }
                        # Link to hide content. Don't show useless link to people who cannot hide revisions.
-                       $canHide = $user->isAllowed( 'deleterevision' );
-                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
-                               if ( $user->isAllowed( 'delete' ) ) {
+                       $canHide = $pm->userHasRight( $user, 'deleterevision' );
+                       if ( $canHide || ( $pm->userHasRight( $user, 'deletedhistory' )
+                                       && $file->getVisibility() ) ) {
+                               if ( $pm->userHasRight( $user, 'delete' ) ) {
                                        $row .= '<br />';
                                }
                                // If file is top revision or locked from this user, don't link
index 653e443..bb15532 100644 (file)
@@ -603,7 +603,10 @@ EOT
                                );
                        }
 
-                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
+                       if ( $wgEnableUploads && MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'upload' )
+                       ) {
                                // Only show an upload link if the user can upload
                                $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
                                $nofile = [
index 2f3fac2..ff7ee4b 100644 (file)
@@ -27,7 +27,6 @@ use MovePage;
 use NamespaceInfo;
 use RepoGroup;
 use Title;
-use WatchedItemStore;
 use WatchedItemStoreInterface;
 use Wikimedia\Rdbms\ILoadBalancer;
 
@@ -44,7 +43,7 @@ class MovePageFactory {
        /** @var NamespaceInfo */
        private $nsInfo;
 
-       /** @var WatchedItemStore */
+       /** @var WatchedItemStoreInterface */
        private $watchedItems;
 
        /** @var PermissionManager */
index 40c63d2..8b2ff6b 100644 (file)
@@ -756,10 +756,14 @@ class PageArchive {
 
                        Hooks::run( 'ArticleUndelete',
                                [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] );
+
                        if ( $this->title->getNamespace() == NS_FILE ) {
-                               DeferredUpdates::addUpdate(
-                                       new HTMLCacheUpdate( $this->title, 'imagelinks', 'file-restore' )
+                               $job = HTMLCacheUpdateJob::newForBacklinks(
+                                       $this->title,
+                                       'imagelinks',
+                                       [ 'causeAction' => 'file-restore' ]
                                );
+                               JobQueueGroup::singleton()->lazyPush( $job );
                        }
                }
 
index acd506b..fd9f7b2 100644 (file)
@@ -176,9 +176,12 @@ class WikiFilePage extends WikiPage {
 
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $this->mTitle, 'imagelinks', 'file-purge' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $this->mTitle,
+                               'imagelinks',
+                               [ 'causeAction' => 'file-purge' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                } else {
                        wfDebug( 'ImagePage::doPurge no image for '
                                . $this->mFile->getName() . "; limiting purge to cache only\n" );
index bad75da..c8566ac 100644 (file)
@@ -1896,7 +1896,8 @@ class WikiPage implements Page, IDBAccessObject {
                // TODO: this check is here for backwards-compatibility with 1.31 behavior.
                // Checking the minoredit right should be done in the same place the 'bot' right is
                // checked for the EDIT_FORCE_BOT flag, which is currently in EditPage::attemptSave.
-               if ( ( $flags & EDIT_MINOR ) && !$user->isAllowed( 'minoredit' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( ( $flags & EDIT_MINOR ) && !$permissionManager->userHasRight( $user, 'minoredit' ) ) {
                        $flags = ( $flags & ~EDIT_MINOR );
                }
 
@@ -1916,7 +1917,6 @@ class WikiPage implements Page, IDBAccessObject {
                // TODO: this logic should not be in the storage layer, it's here for compatibility
                // with 1.31 behavior. Applying the 'autopatrol' right should be done in the same
                // place the 'bot' right is handled, which is currently in EditPage::attemptSave.
-               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                if ( $needsPatrol && $permissionManager->userCan(
                        'autopatrol', $user, $this->getTitle()
@@ -3249,14 +3249,12 @@ class WikiPage implements Page, IDBAccessObject {
                // Save
                $flags = EDIT_UPDATE | EDIT_INTERNAL;
 
-               if ( $guser->isAllowed( 'minoredit' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $guser, 'minoredit' ) ) {
                        $flags |= EDIT_MINOR;
                }
 
-               if ( $bot && ( MediaWikiServices::getInstance()
-                               ->getPermissionManager()
-                               ->userHasAnyRight( $guser, 'markbotedits', 'bot' ) )
-               ) {
+               if ( $bot && ( $permissionManager->userHasAnyRight( $guser, 'markbotedits', 'bot' ) ) ) {
                        $flags |= EDIT_FORCE_BOT;
                }
 
@@ -3291,7 +3289,6 @@ class WikiPage implements Page, IDBAccessObject {
                // TODO: this logic should not be in the storage layer, it's here for compatibility
                // with 1.31 behavior. Applying the 'autopatrol' right should be done in the same
                // place the 'bot' right is handled, which is currently in EditPage::attemptSave.
-               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                if ( $wgUseRCPatrol && $permissionManager->userCan(
                        'autopatrol', $guser, $this->getTitle()
@@ -3308,7 +3305,7 @@ class WikiPage implements Page, IDBAccessObject {
                // Set patrolling and bot flag on the edits, which gets rollbacked.
                // This is done even on edit failure to have patrolling in that case (T64157).
                $set = [];
-               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
+               if ( $bot && $permissionManager->userHasRight( $guser, 'markbotedits' ) ) {
                        // Mark all reverted edits as bot
                        $set['rc_bot'] = 1;
                }
@@ -3407,9 +3404,12 @@ class WikiPage implements Page, IDBAccessObject {
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
                // Invalidate caches of articles which include this page
-               DeferredUpdates::addUpdate(
-                       new HTMLCacheUpdate( $title, 'templatelinks', 'page-create' )
+               $job = HTMLCacheUpdateJob::newForBacklinks(
+                       $title,
+                       'templatelinks',
+                       [ 'causeAction' => 'page-create' ]
                );
+               JobQueueGroup::singleton()->lazyPush( $job );
 
                if ( $title->getNamespace() == NS_CATEGORY ) {
                        // Load the Category object, which will schedule a job to create
@@ -3451,9 +3451,12 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Images
                if ( $title->getNamespace() == NS_FILE ) {
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'imagelinks', 'page-delete' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'imagelinks',
+                               [ 'causeAction' => 'page-delete' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                }
 
                // User talk pages
@@ -3485,20 +3488,24 @@ class WikiPage implements Page, IDBAccessObject {
                $slotsChanged = null
        ) {
                // TODO: move this into a PageEventEmitter service
-
-               if ( $slotsChanged === null || in_array( SlotRecord::MAIN,  $slotsChanged ) ) {
+               $jobs = [];
+               if ( $slotsChanged === null || in_array( SlotRecord::MAIN, $slotsChanged ) ) {
                        // Invalidate caches of articles which include this page.
                        // Only for the main slot, because only the main slot is transcluded.
                        // TODO: MCR: not true for TemplateStyles! [SlotHandler]
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'templatelinks', 'page-edit' )
+                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'templatelinks',
+                               [ 'causeAction' => 'page-edit' ]
                        );
                }
-
                // Invalidate the caches of all pages which redirect here
-               DeferredUpdates::addUpdate(
-                       new HTMLCacheUpdate( $title, 'redirect', 'page-edit' )
+               $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                       $title,
+                       'redirect',
+                       [ 'causeAction' => 'page-edit' ]
                );
+               JobQueueGroup::singleton()->lazyPush( $jobs );
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
index e1f4f38..b803241 100644 (file)
@@ -1121,7 +1121,7 @@ class CoreParserFunctions {
         * @param Parser $parser
         * @param Title $title
         * @param string $vary ParserOuput vary-* flag
-        * @return Revision
+        * @return Revision|null
         * @since 1.23
         */
        private static function getCachedRevisionObject( $parser, $title, $vary ) {
index d4f66f7..597f851 100644 (file)
@@ -35,6 +35,7 @@ class PPDPart_Hash extends PPDPart {
                } else {
                        $accum = [];
                }
+               // @phan-suppress-next-line PhanTypeMismatchArgument
                parent::__construct( $accum );
        }
 }
index b27338c..9ec5834 100644 (file)
@@ -910,7 +910,7 @@ class Parser {
         */
        public function setTitle( $t ) {
                if ( !$t ) {
-                       $t = Title::newFromText( 'NO TITLE' );
+                       $t = Title::makeTitle( NS_SPECIAL, 'Badtitle/Parser' );
                }
 
                if ( $t->hasFragment() ) {
@@ -2312,6 +2312,11 @@ class Parser {
                $line = $a->current(); # Workaround for broken ArrayIterator::next() that returns "void"
                $s = substr( $s, 1 );
 
+               if ( is_null( $this->mTitle ) ) {
+                       throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
+               }
+               $nottalk = !$this->mTitle->isTalkPage();
+
                $useLinkPrefixExtension = $this->getTargetLanguage()->linkPrefixExtension();
                $e2 = null;
                if ( $useLinkPrefixExtension ) {
@@ -2319,14 +2324,6 @@ class Parser {
                        # e.g. in the case of 'The Arab al[[Razi]]', 'al' will be matched
                        $charset = $this->contLang->linkPrefixCharset();
                        $e2 = "/^((?>.*[^$charset]|))(.+)$/sDu";
-               }
-
-               if ( is_null( $this->mTitle ) ) {
-                       throw new MWException( __METHOD__ . ": \$this->mTitle is null\n" );
-               }
-               $nottalk = !$this->mTitle->isTalkPage();
-
-               if ( $useLinkPrefixExtension ) {
                        $m = [];
                        if ( preg_match( $e2, $s, $m ) ) {
                                $first_prefix = $m[2];
index 8eecbcc..1475c20 100644 (file)
@@ -54,6 +54,8 @@ class PasswordPolicyChecks {
 
        /**
         * Check password is longer than minimum, fatal.
+        * Intended for locking out users with passwords too short to trust, requiring them
+        * to recover their account by some other means.
         * @param int $policyVal minimal length
         * @param User $user
         * @param string $password
index 8a82add..68236e5 100644 (file)
@@ -20,7 +20,6 @@
 
 namespace MediaWiki\Preferences;
 
-use Config;
 use DateTime;
 use DateTimeZone;
 use Exception;
@@ -37,6 +36,7 @@ use MediaWiki\Auth\PasswordAuthenticationRequest;
 use MediaWiki\Config\ServiceOptions;
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
 use MessageLocalizer;
 use MWException;
 use MWTimestamp;
@@ -77,6 +77,9 @@ class DefaultPreferencesFactory implements PreferencesFactory {
        /** @var NamespaceInfo */
        protected $nsInfo;
 
+       /** @var PermissionManager */
+       protected $permissionManager;
+
        /**
         * TODO Make this a const when we drop HHVM support (T192166)
         *
@@ -84,6 +87,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
         * @since 1.34
         */
        public static $constructorOptions = [
+               'AllowRequiringEmailForResets',
                'AllowUserCss',
                'AllowUserCssPrefs',
                'AllowUserJs',
@@ -113,35 +117,29 @@ class DefaultPreferencesFactory implements PreferencesFactory {
        /**
         * Do not call this directly.  Get it from MediaWikiServices.
         *
-        * @param ServiceOptions|Config $options Config accepted for backwards compatibility
+        * @param ServiceOptions $options
         * @param Language $contLang
         * @param AuthManager $authManager
         * @param LinkRenderer $linkRenderer
-        * @param NamespaceInfo|null $nsInfo
+        * @param NamespaceInfo $nsInfo
+        * @param PermissionManager $permissionManager
         */
        public function __construct(
-               $options,
+               ServiceOptions $options,
                Language $contLang,
                AuthManager $authManager,
                LinkRenderer $linkRenderer,
-               NamespaceInfo $nsInfo = null
+               NamespaceInfo $nsInfo,
+               PermissionManager $permissionManager
        ) {
-               if ( $options instanceof Config ) {
-                       wfDeprecated( __METHOD__ . ' with Config parameter', '1.34' );
-                       $options = new ServiceOptions( self::$constructorOptions, $options );
-               }
-
                $options->assertRequiredOptions( self::$constructorOptions );
 
-               if ( !$nsInfo ) {
-                       wfDeprecated( __METHOD__ . ' with no NamespaceInfo argument', '1.34' );
-                       $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
-               }
                $this->options = $options;
                $this->contLang = $contLang;
                $this->authManager = $authManager;
                $this->linkRenderer = $linkRenderer;
                $this->nsInfo = $nsInfo;
+               $this->permissionManager = $permissionManager;
                $this->logger = new NullLogger();
        }
 
@@ -208,7 +206,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                # # Make sure that form fields have their parent set. See T43337.
                $dummyForm = new HTMLForm( [], $context );
 
-               $disable = !$user->isAllowed( 'editmyoptions' );
+               $disable = !$this->permissionManager->userHasRight( $user, 'editmyoptions' );
 
                $defaultOptions = User::getDefaultOptions();
                $userOptions = $user->getOptions();
@@ -389,8 +387,8 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        ];
                }
 
-               $canViewPrivateInfo = $user->isAllowed( 'viewmyprivateinfo' );
-               $canEditPrivateInfo = $user->isAllowed( 'editmyprivateinfo' );
+               $canViewPrivateInfo = $this->permissionManager->userHasRight( $user, 'viewmyprivateinfo' );
+               $canEditPrivateInfo = $this->permissionManager->userHasRight( $user, 'editmyprivateinfo' );
 
                // Actually changeable stuff
                $defaultPreferences['realname'] = [
@@ -620,7 +618,19 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                }
                        }
 
-                       if ( $this->options->get( 'EnableUserEmail' ) && $user->isAllowed( 'sendemail' ) ) {
+                       if ( $this->options->get( 'AllowRequiringEmailForResets' ) ) {
+                               $defaultPreferences['requireemail'] = [
+                                       'type' => 'toggle',
+                                       'label-message' => 'tog-requireemail',
+                                       'help-message' => 'prefs-help-requireemail',
+                                       'section' => 'personal/email',
+                                       'disabled' => $disableEmailPrefs,
+                               ];
+                       }
+
+                       if ( $this->options->get( 'EnableUserEmail' ) &&
+                               $this->permissionManager->userHasRight( $user, 'sendemail' )
+                       ) {
                                $defaultPreferences['disablemail'] = [
                                        'id' => 'wpAllowEmail',
                                        'type' => 'toggle',
@@ -910,7 +920,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'label-message' => 'tog-numberheadings',
                ];
 
-               if ( $user->isAllowed( 'rollback' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'rollback' ) ) {
                        $defaultPreferences['showrollbackconfirmation'] = [
                                'type' => 'toggle',
                                'section' => 'rendering/advancedrendering',
@@ -950,7 +960,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        ];
                }
 
-               if ( $user->isAllowed( 'minoredit' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'minoredit' ) ) {
                        $defaultPreferences['minordefault'] = [
                                'type' => 'toggle',
                                'section' => 'editing/editor',
@@ -1096,7 +1106,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $watchlistdaysMax = ceil( $this->options->get( 'RCMaxAge' ) / ( 3600 * 24 ) );
 
                # # Watchlist #####################################
-               if ( $user->isAllowed( 'editmywatchlist' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'editmywatchlist' ) ) {
                        $editWatchlistLinks = '';
                        $editWatchlistModes = [
                                'edit' => [ 'subpage' => false, 'flags' => [] ],
@@ -1210,20 +1220,20 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                ];
 
                // Kinda hacky
-               if ( $user->isAllowed( 'createpage' ) || $user->isAllowed( 'createtalk' ) ) {
+               if ( $this->permissionManager->userHasAnyRight( $user, 'createpage', 'createtalk' ) ) {
                        $watchTypes['read'] = 'watchcreations';
                }
 
-               if ( $user->isAllowed( 'rollback' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'rollback' ) ) {
                        $watchTypes['rollback'] = 'watchrollback';
                }
 
-               if ( $user->isAllowed( 'upload' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'upload' ) ) {
                        $watchTypes['upload'] = 'watchuploads';
                }
 
                foreach ( $watchTypes as $action => $pref ) {
-                       if ( $user->isAllowed( $action ) ) {
+                       if ( $this->permissionManager->userHasRight( $user, $action ) ) {
                                // Messages:
                                // tog-watchdefault, tog-watchmoves, tog-watchdeletion, tog-watchcreations, tog-watchuploads
                                // tog-watchrollback
@@ -1510,7 +1520,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                }
 
                /**
-                * @var HTMLForm $htmlForm
+                * @var PreferencesFormOOUI $htmlForm
                 */
                $htmlForm = new $formClass( $formDescriptor, $context, 'prefs' );
 
@@ -1523,6 +1533,10 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                ] ) );
 
                $htmlForm->setModifiedUser( $user );
+               $htmlForm->setOptionsEditable( $this->permissionManager
+                       ->userHasRight( $user, 'editmyoptions' ) );
+               $htmlForm->setPrivateInfoEditable( $this->permissionManager
+                       ->userHasRight( $user, 'editmyprivateinfo' ) );
                $htmlForm->setId( 'mw-prefs-form' );
                $htmlForm->setAutocomplete( 'off' );
                $htmlForm->setSubmitText( $context->msg( 'saveprefs' )->text() );
@@ -1530,7 +1544,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $htmlForm->setSubmitTooltip( 'preferences-save' );
                $htmlForm->setSubmitID( 'prefcontrol' );
                $htmlForm->setSubmitCallback(
-                       function ( array $formData, HTMLForm $form ) use ( $formDescriptor ) {
+                       function ( array $formData, PreferencesFormOOUI $form ) use ( $formDescriptor ) {
                                return $this->submitForm( $formData, $form, $formDescriptor );
                        }
                );
@@ -1595,7 +1609,9 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                $hiddenPrefs = $this->options->get( 'HiddenPrefs' );
                $result = true;
 
-               if ( !$user->isAllowedAny( 'editmyprivateinfo', 'editmyoptions' ) ) {
+               if ( !$this->permissionManager
+                               ->userHasAnyRight( $user, 'editmyprivateinfo', 'editmyoptions' )
+               ) {
                        return Status::newFatal( 'mypreferencesprotected' );
                }
 
@@ -1606,14 +1622,14 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                // (not really "private", but still shouldn't be edited without permission)
 
                if ( !in_array( 'realname', $hiddenPrefs )
-                       && $user->isAllowed( 'editmyprivateinfo' )
+                       && $this->permissionManager->userHasRight( $user, 'editmyprivateinfo' )
                        && array_key_exists( 'realname', $formData )
                ) {
                        $realName = $formData['realname'];
                        $user->setRealName( $realName );
                }
 
-               if ( $user->isAllowed( 'editmyoptions' ) ) {
+               if ( $this->permissionManager->userHasRight( $user, 'editmyoptions' ) ) {
                        $oldUserOptions = $user->getOptions();
 
                        foreach ( $this->getSaveBlacklist() as $b ) {
index c27ab4f..92e276d 100644 (file)
@@ -96,9 +96,15 @@ class SectionProfiler {
        public function getFunctionStats() {
                $this->collateData();
 
-               $totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
-               $totalReal = max( $this->end['real'] - $this->start['real'], 0 );
-               $totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
+               if ( is_array( $this->start ) ) {
+                       $totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
+                       $totalReal = max( $this->end['real'] - $this->start['real'], 0 );
+                       $totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
+               } else {
+                       $totalCpu = 0;
+                       $totalReal = 0;
+                       $totalMem = 0;
+               }
 
                $profile = [];
                foreach ( $this->collated as $fname => $data ) {
index d84a92a..0a1d5f7 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Derivative context for ResourceLoader modules.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
+ * A mutable version of ResourceLoaderContext.
+ *
  * Allows changing specific properties of a context object,
- * without changing the main one. Inspired by DerivativeContext.
+ * without changing the main one. Inspired by MediaWiki's DerivativeContext.
  *
+ * @ingroup ResourceLoader
  * @since 1.24
  */
 class DerivativeResourceLoaderContext extends ResourceLoaderContext {
index d0f6729..b4f0b7c 100644 (file)
@@ -27,10 +27,13 @@ use Psr\Log\NullLogger;
 use Wikimedia\Rdbms\Database;
 
 /**
- * This class generates message blobs for use by ResourceLoader modules.
+ * This class generates message blobs for use by ResourceLoader.
  *
- * A message blob is a JSON object containing the interface messages for a certain module in
- * a certain language.
+ * A message blob is a JSON object containing the interface messages for a
+ * certain module in a certain language.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class MessageBlobStore implements LoggerAwareInterface {
 
index 563b95e..3e55dfd 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Base class for resource loading system.
- *
  * 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
@@ -30,13 +28,21 @@ use Wikimedia\Rdbms\DBConnectionError;
 use Wikimedia\WrappedString;
 
 /**
- * Dynamic JavaScript and CSS resource loading system.
+ * @defgroup ResourceLoader ResourceLoader
+ *
+ * For higher level documentation, see <https://www.mediawiki.org/wiki/ResourceLoader/Architecture>.
+ */
+
+/**
+ * ResourceLoader is a loading system for JavaScript and CSS resources.
+ *
+ * For higher level documentation, see <https://www.mediawiki.org/wiki/ResourceLoader/Architecture>.
  *
- * Most of the documentation is on the MediaWiki documentation wiki starting at:
- *    https://www.mediawiki.org/wiki/ResourceLoader
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoader implements LoggerAwareInterface {
-       /** @var Config $config */
+       /** @var Config */
        protected $config;
        /** @var MessageBlobStore */
        protected $blobStore;
index 7cd53fe..5a62861 100644 (file)
@@ -1,6 +1,5 @@
 <?php
 /**
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -20,6 +19,7 @@
  */
 
 /**
+ * @ingroup ResourceLoader
  * @internal For use by ResourceLoaderStartUpModule only
  */
 class ResourceLoaderCircularDependencyError extends Exception {
index b38d722..6529a9a 100644 (file)
@@ -24,6 +24,7 @@ use Wikimedia\WrappedStringList;
 /**
  * Load and configure a ResourceLoader client on an HTML page.
  *
+ * @ingroup ResourceLoader
  * @since 1.28
  */
 class ResourceLoaderClientHtml {
index b9a7659..1274052 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Context for ResourceLoader modules.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -26,8 +24,11 @@ use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 
 /**
- * Object passed around to modules which contains information about the state
- * of a specific loader request.
+ * Context object that contains information about the state of a specific
+ * ResourceLoader web request. Passed around to ResourceLoaderModule methods.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderContext implements MessageLocalizer {
        const DEFAULT_LANG = 'qqx';
index 6c21e4b..3388058 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module based on local JavaScript/CSS files.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * ResourceLoader module based on local JavaScript/CSS files.
+ * Module based on local JavaScript/CSS files.
  *
  * The following public methods can query the database:
  *
  * - getDefinitionSummary / … / ResourceLoaderModule::getFileDependencies.
  * - getVersionHash / getDefinitionSummary / … / ResourceLoaderModule::getFileDependencies.
  * - getStyles / ResourceLoaderModule::saveFileDependencies.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderFileModule extends ResourceLoaderModule {
 
@@ -905,7 +906,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *     keyed by media type
         * @throws MWException
         */
-       public function readStyleFiles( array $styles, $flip, $context ) {
+       public function readStyleFiles( array $styles, $flip, ResourceLoaderContext $context ) {
                if ( !$styles ) {
                        return [];
                }
@@ -932,7 +933,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @return string CSS data in script file
         * @throws MWException If the file doesn't exist
         */
-       protected function readStyleFile( $path, $flip, $context ) {
+       protected function readStyleFile( $path, $flip, ResourceLoaderContext $context ) {
                $localPath = $this->getLocalPath( $path );
                $remotePath = $this->getRemotePath( $path );
                if ( !file_exists( $localPath ) ) {
@@ -972,7 +973,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @param ResourceLoaderContext $context
         * @return bool
         */
-       public function getFlip( $context ) {
+       public function getFlip( ResourceLoaderContext $context ) {
                return $context->getDirection() === 'rtl' && !$this->noflip;
        }
 
index dff9a39..c70081b 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- * An object to represent a path to a JavaScript/CSS file, along with a remote
- * and local base path, for use with ResourceLoaderFileModule.
- *
  * 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
@@ -24,6 +21,9 @@
 /**
  * An object to represent a path to a JavaScript/CSS file, along with a remote
  * and local base path, for use with ResourceLoaderFileModule.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderFilePath {
 
index 4d215d6..152a1f7 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- * ResourceLoader module for mediawiki.ForeignApi that has dynamically
- * generated dependencies, via a hook usable by extensions.
- *
  * 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
  */
 
 /**
- * ResourceLoader module for mediawiki.ForeignApi and its generated data
+ * Module for mediawiki.ForeignApi that has dynamically
+ * generated dependencies, via a hook usable by extensions.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderForeignApiModule extends ResourceLoaderFileModule {
        public function getDependencies( ResourceLoaderContext $context = null ) {
index 6497543..2b0f5ed 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Class encapsulating an image used in a ResourceLoaderImageModule.
- *
  * 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
@@ -25,6 +23,7 @@ use MediaWiki\Shell\Shell;
 /**
  * Class encapsulating an image used in a ResourceLoaderImageModule.
  *
+ * @ingroup ResourceLoader
  * @since 1.25
  */
 class ResourceLoaderImage {
@@ -337,6 +336,7 @@ class ResourceLoaderImage {
                // Reattach all direct children of the `<svg>` root node to the `<g>` wrapper
                while ( $root->firstChild ) {
                        $node = $root->firstChild;
+                       // @phan-suppress-next-line PhanUndeclaredProperty False positive
                        if ( !$titleNode && $node->nodeType === XML_ELEMENT_NODE && $node->tagName === 'title' ) {
                                // Remember the first encountered `<title>` node
                                $titleNode = $node;
index 902fa91..0585cfd 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for generated and embedded images.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -22,8 +20,9 @@
  */
 
 /**
- * ResourceLoader module for generated and embedded images.
+ * Module for generated and embedded images.
  *
+ * @ingroup ResourceLoader
  * @since 1.25
  */
 class ResourceLoaderImageModule extends ResourceLoaderModule {
index 637d6d2..a6e5f15 100644 (file)
  */
 
 /**
- * ResourceLoader module for populating language specific data, such as grammar forms.
+ * Module for populating language specific data, such as grammar forms.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderLanguageDataModule extends ResourceLoaderFileModule {
 
index 0269ec3..49501ff 100644 (file)
@@ -1,7 +1,28 @@
 <?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 /**
- * Subclass with context specific LESS variables
+ * Module augmented with context-specific LESS variables.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.32
  */
 class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule {
        protected $lessVariables = [];
index 38084bf..eca3a97 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Abstraction for ResourceLoader modules.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -32,6 +30,9 @@ use Wikimedia\ScopedCallback;
 
 /**
  * Abstraction for ResourceLoader modules, with name registration and maxage functionality.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 abstract class ResourceLoaderModule implements LoggerAwareInterface {
        /** @var Config */
@@ -127,7 +128,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         * @param ResourceLoaderContext $context
         * @return bool
         */
-       public function getFlip( $context ) {
+       public function getFlip( ResourceLoaderContext $context ) {
                return MediaWikiServices::getInstance()->getContentLanguage()->getDir() !==
                        $context->getDirection();
        }
index 7d39a58..e1a2711 100644 (file)
  */
 
 /**
- * ResourceLoaderFileModule which magically loads the right skinScripts and skinStyles for every
+ * Module which magically loads the right skinScripts and skinStyles for every
  * skin, using the specified OOUI theme for each.
  *
- * @since 1.30
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderOOUIFileModule extends ResourceLoaderFileModule {
        use ResourceLoaderOOUIModule;
index c860362..11c59a0 100644 (file)
@@ -21,6 +21,7 @@
 /**
  * Allows loading arbitrary sets of OOUI icons.
  *
+ * @ingroup ResourceLoader
  * @since 1.34
  */
 class ResourceLoaderOOUIIconPackModule extends ResourceLoaderOOUIImageModule {
index fdcc213..007bbd1 100644 (file)
@@ -21,7 +21,8 @@
 /**
  * Convenience methods for dealing with OOUI themes and their relations to MW skins.
  *
- * @since 1.30
+ * @ingroup ResourceLoader
+ * @internal
  */
 trait ResourceLoaderOOUIModule {
        protected static $knownScriptsModules = [ 'core' ];
index 236112e..0ae8371 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for site customizations.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * Module for site customizations
+ * Module for site customizations.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
 
index 79922bf..be4e31d 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for site style customizations.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * Module for site style customizations
+ * Module for site style customizations.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSiteStylesModule extends ResourceLoaderWikiModule {
 
index 0f33666..e7ab951 100644 (file)
  */
 
 /**
- * ResourceLoader module for skin stylesheets.
+ * Module for skin stylesheets.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
        /**
index 3191057..df8126e 100644 (file)
@@ -38,6 +38,9 @@ use MediaWiki\MediaWikiServices;
  * - safemode: Only register modules that have ORIGIN_CORE as their origin.
  *   This effectively disables ORIGIN_USER modules. (T185303)
  *   See also: OutputPage::disallowUserJs()
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        protected $targets = [ 'desktop', 'mobile' ];
@@ -55,7 +58,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * @param ResourceLoaderContext $context
         * @return array
         */
-       private function getConfigSettings( $context ) {
+       private function getConfigSettings( ResourceLoaderContext $context ) {
                $conf = $this->getConfig();
 
                /**
index de82502..75a2d7a 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for default user preferences.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -23,6 +21,9 @@
 
 /**
  * Module for default user preferences.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
 
index 026cea1..4794231 100644 (file)
  */
 
 /**
- * Module for user customizations scripts
+ * Module for user customizations scripts.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 
index 059a9b9..b89324c 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for user preference customizations.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  */
 
 /**
- * Module for user preference customizations
+ * Module for user preferences.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
 
index 69e8a97..fe949aa 100644 (file)
  */
 
 /**
- * Module for user customizations styles
+ * Module for user customizations styles.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserStylesModule extends ResourceLoaderWikiModule {
 
index 86012a0..21944ee 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for user tokens.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Krinkle
  */
 
 /**
- * Module for user tokens
+ * Module for user authorization tokens.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
 
index a2501c4..37501d4 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Abstraction for ResourceLoader modules that pull from wiki pages.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -23,7 +21,7 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -48,6 +46,9 @@ use MediaWiki\MediaWikiServices;
  *   - getDB()
  *   - isKnownEmpty()
  *   - getTitleInfo()
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderWikiModule extends ResourceLoaderModule {
 
index 5b03ad0..ab5d954 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a filearchive table row
index 8c080ba..33ce11b 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for an oldimage table row
index f4ea54f..746ca27 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Abstract base class for a list of deletable items. The list class
index edb86da..829eefa 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a logging table row
index fcdcb9a..adb3974 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index f61d378..604ab2c 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a live revision table row
index 0705503..011386e 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
index 9a9ab19..00e77e1 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 3ab96cb..6361a7a 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * General controller for RevDel, used by both SpecialRevisiondelete and
index bf90c06..85c01c8 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a live revision table row
index 09cdf72..a3380ff 100644 (file)
@@ -505,11 +505,10 @@ final class SessionManager implements SessionManagerInterface {
                }
 
                if ( count( $retInfos ) > 1 ) {
-                       $ex = new \OverflowException(
+                       throw new SessionOverflowException(
+                               $retInfos,
                                'Multiple sessions for this request tied for top priority: ' . implode( ', ', $retInfos )
                        );
-                       $ex->sessionInfos = $retInfos;
-                       throw $ex;
                }
 
                return $retInfos ? $retInfos[0] : null;
diff --git a/includes/session/SessionOverflowException.php b/includes/session/SessionOverflowException.php
new file mode 100644 (file)
index 0000000..2a5ed2b
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+namespace MediaWiki\Session;
+
+/**
+ * OverflowException specific to the SessionManager, used when the request had multiple possible
+ * sessions tied for top priority.
+ *
+ * @since 1.34
+ */
+class SessionOverflowException extends \OverflowException {
+       /** @var SessionInfo[] */
+       private $sessionInfos;
+
+       /**
+        * @param SessionInfo[] $sessionInfos Must have at least two elements
+        * @param string $msg
+        * @throws \InvalidArgumentException If $sessionInfos has less than 2 elements
+        */
+       function __construct( array $sessionInfos, $msg ) {
+               if ( count( $sessionInfos ) < 2 ) {
+                       throw new \InvalidArgumentException( 'Expected at least two SessionInfo objects.' );
+               }
+               parent::__construct( $msg );
+               $this->sessionInfos = $sessionInfos;
+       }
+
+       /**
+        * @return SessionInfo[]
+        */
+       public function getSessionInfos() : array {
+               return $this->sessionInfos;
+       }
+}
index 14c9a73..aa7a6d6 100644 (file)
@@ -176,13 +176,13 @@ class MediaWikiSite extends Site {
         *
         * @param string|bool $pageName Page name or false (default: false)
         *
-        * @return string
+        * @return string|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
 
-               if ( $url === false ) {
-                       return false;
+               if ( $url === null ) {
+                       return null;
                }
 
                if ( $pageName !== false ) {
index bcf8b32..401f6e4 100644 (file)
@@ -354,7 +354,7 @@ class Site implements Serializable {
 
        /**
         * Returns the full URL for the given page on the site.
-        * Or false if the needed information is not known.
+        * Or null if the needed information is not known.
         *
         * This generated URL is usually based upon the path returned by getLinkPath(),
         * but this is not a requirement.
@@ -365,13 +365,13 @@ class Site implements Serializable {
         *
         * @param bool|string $pageName
         *
-        * @return string|bool
+        * @return string|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
 
-               if ( $url === false ) {
-                       return false;
+               if ( $url === null ) {
+                       return null;
                }
 
                if ( $pageName !== false ) {
index 956bdab..571b6e4 100644 (file)
@@ -168,6 +168,7 @@ class SiteImporter {
                $pathTags = $siteElement->getElementsByTagName( 'path' );
                for ( $i = 0; $i < $pathTags->length; $i++ ) {
                        $pathElement = $pathTags->item( $i );
+                       '@phan-var DOMElement $pathElement';
                        $pathType = $this->getAttributeValue( $pathElement, 'type' );
                        $path = $pathElement->textContent;
 
@@ -177,6 +178,7 @@ class SiteImporter {
                $idTags = $siteElement->getElementsByTagName( 'localid' );
                for ( $i = 0; $i < $idTags->length; $i++ ) {
                        $idElement = $idTags->item( $i );
+                       '@phan-var DOMElement $idElement';
                        $idType = $this->getAttributeValue( $idElement, 'type' );
                        $id = $idElement->textContent;
 
index cd63796..dedf83a 100644 (file)
@@ -48,7 +48,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * @deprecated since 1.33 Use ->msg() or ->getMsg() instead.
         */
        function msgWiki( $str ) {
-               // TODO: Add wfDeprecated( __METHOD__, '1.33' ) after 1.33 got released
+               wfDeprecated( __METHOD__, '1.33' ); // Hard-deprecated in 1.34
                echo $this->getMsg( $str )->parseAsBlock();
        }
 
@@ -756,6 +756,7 @@ abstract class BaseTemplate extends QuickTemplate {
         */
        public function getTrail() {
                return WrappedString::join( "\n", [
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        MWDebug::getDebugHTML( $this->getSkin()->getContext() ),
                        $this->get( 'bottomscripts' ),
                        $this->get( 'reporttime' )
index 70df73b..327061c 100644 (file)
@@ -595,7 +595,7 @@ class SkinTemplate extends Skin {
                # $this->getTitle() will just give Special:Badtitle, which is
                # not especially useful as a returnto parameter. Use the title
                # from the request instead, if there was one.
-               if ( $this->getUser()->isAllowed( 'read' ) ) {
+               if ( $permissionManager->userHasRight( $this->getUser(), 'read' ) ) {
                        $page = $this->getTitle();
                } else {
                        $page = Title::newFromText( $request->getVal( 'title', '' ) );
@@ -636,7 +636,7 @@ class SkinTemplate extends Skin {
                                'active' => ( $href == $pageurl )
                        ];
 
-                       if ( $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+                       if ( $permissionManager->userHasRight( $this->getUser(), 'viewmywatchlist' ) ) {
                                $href = self::makeSpecialUrl( 'Watchlist' );
                                $personal_urls['watchlist'] = [
                                        'text' => $this->msg( 'mywatchlist' )->text(),
@@ -689,9 +689,8 @@ class SkinTemplate extends Skin {
                                $useCombinedLoginLink = false;
                        }
 
-                       $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink
-                               ? 'nav-login-createaccount'
-                               : 'pt-login';
+                       $loginlink = $permissionManager->userHasRight( $this->getUser(), 'createaccount' )
+                                                && $useCombinedLoginLink ? 'nav-login-createaccount' : 'pt-login';
 
                        $login_url = [
                                'text' => $this->msg( $loginlink )->text(),
@@ -727,7 +726,7 @@ class SkinTemplate extends Skin {
 
                        if (
                                $authManager->canCreateAccounts()
-                               && $this->getUser()->isAllowed( 'createaccount' )
+                               && $permissionManager->userHasRight( $this->getUser(), 'createaccount' )
                                && !$useCombinedLoginLink
                        ) {
                                $personal_urls['createaccount'] = $createaccount_url;
@@ -1074,8 +1073,7 @@ class SkinTemplate extends Skin {
 
                                if ( $permissionManager->quickUserCan( 'protect', $user, $title ) &&
                                         $title->getRestrictionTypes() &&
-                                        $permissionManager->getNamespaceRestrictionLevels( $title->getNamespace(),
-                                                $user ) !== [ '' ]
+                                        $permissionManager->getNamespaceRestrictionLevels( $title->getNamespace(), $user ) !== [ '' ]
                                ) {
                                        $mode = $title->isProtected() ? 'unprotect' : 'protect';
                                        $content_navigation['actions'][$mode] = [
@@ -1345,7 +1343,10 @@ class SkinTemplate extends Skin {
                                'href' => self::makeSpecialUrlSubpage( 'Log', $rootUser )
                        ];
 
-                       if ( $this->getUser()->isAllowed( 'block' ) ) {
+                       if ( MediawikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'block' )
+                       ) {
                                $nav_urls['blockip'] = [
                                        'text' => $this->msg( 'blockip', $rootUser )->text(),
                                        'href' => self::makeSpecialUrlSubpage( 'Block', $rootUser )
index 0954c45..bf5734a 100644 (file)
@@ -884,87 +884,85 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Get (cheap to compute) information about change tags.
+        * Get information about change tags, without parsing messages, for getRcFiltersConfigSummary().
+        *
+        * Message contents are the raw values (->plain()), because parsing messages is expensive.
+        * Even though we're not parsing messages, building a data structure with the contents of
+        * hundreds of i18n messages is still not cheap (see T223260#5370610), so the result of this
+        * function is cached in WANCache for 24 hours.
         *
         * Returns an array of associative arrays with information about each tag:
         * - name: Tag name (string)
         * - labelMsg: Short description message (Message object)
+        * - label: Short description message (raw message contents)
         * - descriptionMsg: Long description message (Message object)
+        * - description: Long description message (raw message contents)
         * - cssClass: CSS class to use for RC entries with this tag
         * - hits: Number of RC entries that have this tag
         *
         * @param ResourceLoaderContext $context
         * @return array[] Information about each tag
         */
-       protected static function getChangeTagInfo( ResourceLoaderContext $context ) {
-               $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
-               $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
-
-               $tagStats = ChangeTags::tagUsageStatistics();
-               $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
-
-               $result = [];
-               foreach ( $tagHitCounts as $tagName => $hits ) {
-                       if (
-                               (
-                                       // Only get active tags
-                                       isset( $explicitlyDefinedTags[ $tagName ] ) ||
-                                       isset( $softwareActivatedTags[ $tagName ] )
-                               ) &&
-                               // Only get tags with more than 0 hits
-                               $hits > 0
-                       ) {
-                               $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
-                               if ( $labelMsg === false ) {
-                                       // Tag is hidden, skip it
-                                       continue;
-                               }
-                               $result[] = [
-                                       'name' => $tagName,
-                                       // 'label' and 'description' filled in by getChangeTagList()
-                                       'labelMsg' => $labelMsg,
-                                       'descriptionMsg' => ChangeTags::tagLongDescriptionMessage( $tagName, $context ),
-                                       'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
-                                       'hits' => $hits,
-                               ];
-                       }
-               }
-               return $result;
-       }
-
-       /**
-        * Get information about change tags for use in getRcFiltersConfigSummary().
-        *
-        * This expands labelMsg and descriptionMsg to the raw values of each message, which captures
-        * changes in the messages but avoids the expensive step of parsing them.
-        *
-        * @param ResourceLoaderContext $context
-        * @return array[] Result of getChangeTagInfo(), with messages expanded to raw contents
-        */
        protected static function getChangeTagListSummary( ResourceLoaderContext $context ) {
-               $tags = self::getChangeTagInfo( $context );
-               foreach ( $tags as &$tagInfo ) {
-                       $tagInfo['labelMsg'] = $tagInfo['labelMsg']->plain();
-                       if ( $tagInfo['descriptionMsg'] ) {
-                               $tagInfo['descriptionMsg'] = $tagInfo['descriptionMsg']->plain();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'ChangesListSpecialPage-changeTagListSummary', $context->getLanguage() ),
+                       WANObjectCache::TTL_DAY,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $context ) {
+                               $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
+                               $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
+
+                               $tagStats = ChangeTags::tagUsageStatistics();
+                               $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
+
+                               $result = [];
+                               foreach ( $tagHitCounts as $tagName => $hits ) {
+                                       if (
+                                               (
+                                                       // Only get active tags
+                                                       isset( $explicitlyDefinedTags[ $tagName ] ) ||
+                                                       isset( $softwareActivatedTags[ $tagName ] )
+                                               ) &&
+                                               // Only get tags with more than 0 hits
+                                               $hits > 0
+                                       ) {
+                                               $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
+                                               if ( $labelMsg === false ) {
+                                                       // Tag is hidden, skip it
+                                                       continue;
+                                               }
+                                               $descriptionMsg = ChangeTags::tagLongDescriptionMessage( $tagName, $context );
+                                               $result[] = [
+                                                       'name' => $tagName,
+                                                       'labelMsg' => $labelMsg,
+                                                       'label' => $labelMsg->plain(),
+                                                       'descriptionMsg' => $descriptionMsg,
+                                                       'description' => $descriptionMsg ? $descriptionMsg->plain() : '',
+                                                       'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
+                                                       'hits' => $hits,
+                                               ];
+                                       }
+                               }
+                               return $result;
                        }
-               }
-               return $tags;
+               );
        }
 
        /**
         * Get information about change tags to export to JS via getRcFiltersConfigVars().
         *
-        * This removes labelMsg and descriptionMsg, and adds label and description, which are parsed,
-        * stripped and (in the case of description) truncated versions of these messages. Message
+        * This manipulates the label and description of each tag, which are parsed, stripped
+        * and (in the case of description) truncated versions of these messages. Message
         * parsing is expensive, so to detect whether the tag list has changed, use
         * getChangeTagListSummary() instead.
         *
+        * The result of this function is cached in WANCache for 24 hours.
+        *
         * @param ResourceLoaderContext $context
-        * @return array[] Result of getChangeTagInfo(), with messages parsed, stripped and truncated
+        * @return array[] Same as getChangeTagListSummary(), with messages parsed, stripped and truncated
         */
        protected static function getChangeTagList( ResourceLoaderContext $context ) {
-               $tags = self::getChangeTagInfo( $context );
+               $tags = self::getChangeTagListSummary( $context );
                $language = Language::factory( $context->getLanguage() );
                foreach ( $tags as &$tagInfo ) {
                        $tagInfo['label'] = Sanitizer::stripAllTags( $tagInfo['labelMsg']->parse() );
index ce80c1a..8be029a 100644 (file)
@@ -95,9 +95,8 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
 
        /**
         * Load basic request parameters for this Special page.
-        * @param string $subPage
         */
-       private function loadRequestParameters( $subPage ) {
+       private function loadRequestParameters() {
                if ( $this->mLoadedRequest ) {
                        return;
                }
@@ -105,7 +104,6 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $request = $this->getRequest();
 
                $this->mPosted = $request->wasPosted();
-               $this->mIsReturn = $subPage === 'return';
                $this->mAction = $request->getVal( 'action' );
                $this->mFromHTTP = $request->getBool( 'fromhttp', false )
                        || $request->getBool( 'wpFromhttp', false );
@@ -124,7 +122,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
        protected function load( $subPage ) {
                global $wgSecureLogin;
 
-               $this->loadRequestParameters( $subPage );
+               $this->loadRequestParameters();
                if ( $this->mLoaded ) {
                        return;
                }
@@ -203,7 +201,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
 
        protected function beforeExecute( $subPage ) {
                // finish initializing the class before processing the request - T135924
-               $this->loadRequestParameters( $subPage );
+               $this->loadRequestParameters();
                return parent::beforeExecute( $subPage );
        }
 
@@ -443,7 +441,9 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
                if ( $extraMessages ) {
                        $extraMessages = Status::wrap( $extraMessages );
-                       $out->addWikiTextAsInterface( $extraMessages->getWikiText() );
+                       $out->addWikiTextAsInterface(
+                               $extraMessages->getWikiText( false, false, $this->getLanguage() )
+                       );
                }
 
                $out->addHTML( $injected_html );
@@ -977,7 +977,11 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        }
                }
                if ( !$this->isSignup() && $this->showExtraInformation() ) {
-                       $passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+                       $passwordReset = new PasswordReset(
+                               $this->getConfig(),
+                               AuthManager::singleton(),
+                               MediaWikiServices::getInstance()->getPermissionManager()
+                       );
                        if ( $passwordReset->isAllowed( $this->getUser() )->isGood() ) {
                                $fieldDefinitions['passwordReset'] = [
                                        'type' => 'info',
@@ -1074,7 +1078,10 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
        private function showCreateAccountLink() {
                if ( $this->isSignup() ) {
                        return true;
-               } elseif ( $this->getUser()->isAllowed( 'createaccount' ) ) {
+               } elseif ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'createaccount' )
+               ) {
                        return true;
                } else {
                        return false;
index b7eb3c0..6ed5e12 100644 (file)
@@ -118,6 +118,30 @@ abstract class QueryPage extends SpecialPage {
                return $qp;
        }
 
+       /**
+        * Get a list of query pages disabled and with it's run mode
+        * @param Config $config
+        * @return string[]
+        */
+       public static function getDisabledQueryPages( Config $config ) {
+               $disableQueryPageUpdate = $config->get( 'DisableQueryPageUpdate' );
+
+               if ( !is_array( $disableQueryPageUpdate ) ) {
+                       return [];
+               }
+
+               $pages = [];
+               foreach ( $disableQueryPageUpdate as $name => $runMode ) {
+                       if ( is_int( $name ) ) {
+                               // The run mode may be omitted
+                               $pages[$runMode] = 'disabled';
+                       } else {
+                               $pages[$name] = $runMode;
+                       }
+               }
+               return $pages;
+       }
+
        /**
         * A mutator for $this->listoutput;
         *
@@ -632,13 +656,21 @@ abstract class QueryPage extends SpecialPage {
 
                                # If updates on this page have been disabled, let the user know
                                # that the data set won't be refreshed for now
-                               if ( is_array( $this->getConfig()->get( 'DisableQueryPageUpdate' ) )
-                                       && in_array( $this->getName(), $this->getConfig()->get( 'DisableQueryPageUpdate' ) )
-                               ) {
-                                       $out->wrapWikiMsg(
-                                               "<div class=\"mw-querypage-no-updates\">\n$1\n</div>",
-                                               'querypage-no-updates'
-                                       );
+                               $disabledQueryPages = self::getDisabledQueryPages( $this->getConfig() );
+                               if ( isset( $disabledQueryPages[$this->getName()] ) ) {
+                                       $runMode = $disabledQueryPages[$this->getName()];
+                                       if ( $runMode === 'disabled' ) {
+                                               $out->wrapWikiMsg(
+                                                       "<div class=\"mw-querypage-no-updates\">\n$1\n</div>",
+                                                       'querypage-no-updates'
+                                               );
+                                       } else {
+                                               // Messages used here: querypage-updates-periodical
+                                               $out->wrapWikiMsg(
+                                                       "<div class=\"mw-querypage-updates-" . $runMode . "\">\n$1\n</div>",
+                                                       'querypage-updates-' . $runMode
+                                               );
+                                       }
                                }
                        }
                }
index 7d33035..ba8e318 100644 (file)
@@ -292,7 +292,9 @@ class SpecialPage implements MessageLocalizer {
         * @return bool Does the user have permission to view the page?
         */
        public function userCanExecute( User $user ) {
-               return $user->isAllowed( $this->mRestriction );
+               return MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, $this->mRestriction );
        }
 
        /**
index 3f9c491..b83be91 100644 (file)
@@ -192,7 +192,12 @@ class SpecialPageFactory {
                'ApiHelp' => \SpecialApiHelp::class,
                'Blankpage' => \SpecialBlankpage::class,
                'Diff' => \SpecialDiff::class,
-               'EditTags' => \SpecialEditTags::class,
+               'EditTags' => [
+                       'class' => \SpecialEditTags::class,
+                       'services' => [
+                               'PermissionManager',
+                       ],
+               ],
                'Emailuser' => \SpecialEmailUser::class,
                'Movepage' => \MovePageForm::class,
                'Mycontributions' => \SpecialMycontributions::class,
@@ -204,7 +209,12 @@ class SpecialPageFactory {
                'NewSection' => \SpecialNewSection::class,
                'PermanentLink' => \SpecialPermanentLink::class,
                'Redirect' => \SpecialRedirect::class,
-               'Revisiondelete' => \SpecialRevisionDelete::class,
+               'Revisiondelete' => [
+                       'class' => \SpecialRevisionDelete::class,
+                       'services' => [
+                               'PermissionManager',
+                       ],
+               ],
                'RunJobs' => \SpecialRunJobs::class,
                'Specialpages' => \SpecialSpecialpages::class,
                'PageData' => \SpecialPageData::class,
index 9e49684..f4a33c8 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @ingroup SpecialPage
  * @since 1.27
@@ -35,7 +37,10 @@ class SpecialApiSandbox extends SpecialPage {
                $out = $this->getOutput();
                $this->addHelpLink( 'Help:ApiSandbox' );
 
-               $out->addJsConfigVars( 'apihighlimits', $this->getUser()->isAllowed( 'apihighlimits' ) );
+               $out->addJsConfigVars( 'apihighlimits', MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'apihighlimits' )
+               );
                $out->addModuleStyles( [
                        'mediawiki.special',
                        'mediawiki.hlist',
index 34c3371..3f98e93 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A special page that lists autoblocks
  *
@@ -81,7 +83,10 @@ class SpecialAutoblockList extends SpecialPage {
                        'ipb_parent_block_id IS NOT NULL'
                ];
                # Is the user allowed to see hidden blocks?
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds['ipb_deleted'] = 0;
                }
 
index 07214af..a03455b 100644 (file)
@@ -25,6 +25,7 @@ use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\Block\Restriction\PageRestriction;
 use MediaWiki\Block\Restriction\NamespaceRestriction;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\User\UserIdentity;
 
 /**
  * A special page that allows users with 'block' right to block users from
@@ -269,7 +270,10 @@ class SpecialBlock extends FormSpecialPage {
                ];
 
                # Allow some users to hide name from block log, blocklist and listusers
-               if ( $user->isAllowed( 'hideuser' ) ) {
+               if ( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'hideuser' )
+               ) {
                        $a['HideUser'] = [
                                'type' => 'check',
                                'label-message' => 'ipbhidename',
@@ -363,7 +367,10 @@ class SpecialBlock extends FormSpecialPage {
 
                        // If the username was hidden (ipb_deleted == 1), don't show the reason
                        // unless this user also has rights to hideuser: T37839
-                       if ( !$block->getHideName() || $this->getUser()->isAllowed( 'hideuser' ) ) {
+                       if ( !$block->getHideName() || MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'hideuser' )
+                       ) {
                                $fields['Reason']['default'] = $block->getReason();
                        } else {
                                $fields['Reason']['default'] = '';
@@ -545,7 +552,8 @@ class SpecialBlock extends FormSpecialPage {
                $user = $this->getUser();
 
                # Link to edit the block dropdown reasons, if applicable
-               if ( $user->isAllowed( 'editinterface' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $user, 'editinterface' ) ) {
                        $links[] = $linkRenderer->makeKnownLink(
                                $this->msg( 'ipbreason-dropdown' )->inContentLanguage()->getTitle(),
                                $this->msg( 'ipb-edit-dropdown' )->text(),
@@ -579,7 +587,7 @@ class SpecialBlock extends FormSpecialPage {
                        $text .= $out;
 
                        # Add suppression block entries if allowed
-                       if ( $user->isAllowed( 'suppressionlog' ) ) {
+                       if ( $permissionManager->userHasRight( $user, 'suppressionlog' ) ) {
                                LogEventsList::showLogExtract(
                                        $out,
                                        'suppress',
@@ -828,7 +836,10 @@ class SpecialBlock extends FormSpecialPage {
                }
 
                if ( $data['HideUser'] ) {
-                       if ( !$performer->isAllowed( 'hideuser' ) ) {
+                       if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $performer, 'hideuser' )
+                       ) {
                                # this codepath is unreachable except by a malicious user spoofing forms,
                                # or by race conditions (user has hideuser and block rights, loads block form,
                                # and loses hideuser rights before submission); so need to fail completely
@@ -938,7 +949,10 @@ class SpecialBlock extends FormSpecialPage {
                                }
                                # If the name was hidden and the blocking user cannot hide
                                # names, then don't allow any block changes...
-                               if ( $currentBlock->getHideName() && !$performer->isAllowed( 'hideuser' ) ) {
+                               if ( $currentBlock->getHideName() && !MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $performer, 'hideuser' )
+                               ) {
                                        return [ 'cant-see-hidden-user' ];
                                }
 
@@ -1106,13 +1120,15 @@ class SpecialBlock extends FormSpecialPage {
 
        /**
         * Can we do an email block?
-        * @param User $user The sysop wanting to make a block
+        * @param UserIdentity $user The sysop wanting to make a block
         * @return bool
         */
-       public static function canBlockEmail( $user ) {
-               global $wgEnableUserEmail, $wgSysopEmailBans;
+       public static function canBlockEmail( UserIdentity $user ) {
+               global $wgEnableUserEmail;
 
-               return ( $wgEnableUserEmail && $wgSysopEmailBans && $user->isAllowed( 'blockemail' ) );
+               return ( $wgEnableUserEmail && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'blockemail' ) );
        }
 
        /**
@@ -1138,7 +1154,10 @@ class SpecialBlock extends FormSpecialPage {
                if ( $performer->getBlock() ) {
                        if ( $target instanceof User && $target->getId() == $performer->getId() ) {
                                # User is trying to unblock themselves
-                               if ( $performer->isAllowed( 'unblockself' ) ) {
+                               if ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $performer, 'unblockself' )
+                               ) {
                                        return true;
                                        # User blocked themselves and is now trying to reverse it
                                } elseif ( $performer->blockedBy() === $performer->getName() ) {
index b3d2358..4ba9b65 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that lists existing blocks
@@ -82,8 +84,9 @@ class SpecialBlockList extends SpecialPage {
                        'Options' => [
                                'type' => 'multiselect',
                                'options-messages' => [
-                                       'blocklist-userblocks' => 'userblocks',
                                        'blocklist-tempblocks' => 'tempblocks',
+                                       'blocklist-indefblocks' => 'indefblocks',
+                                       'blocklist-userblocks' => 'userblocks',
                                        'blocklist-addressblocks' => 'addressblocks',
                                        'blocklist-rangeblocks' => 'rangeblocks',
                                ],
@@ -136,8 +139,12 @@ class SpecialBlockList extends SpecialPage {
         */
        protected function getBlockListPager() {
                $conds = [];
+               $db = $this->getDB();
                # Is the user allowed to see hidden blocks?
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds['ipb_deleted'] = 0;
                }
 
@@ -153,7 +160,7 @@ class SpecialBlockList extends SpecialPage {
                                case DatabaseBlock::TYPE_IP:
                                case DatabaseBlock::TYPE_RANGE:
                                        list( $start, $end ) = IP::parseRange( $target );
-                                       $conds[] = wfGetDB( DB_REPLICA )->makeList(
+                                       $conds[] = $db->makeList(
                                                [
                                                        'ipb_address' => $target,
                                                        DatabaseBlock::getRangeCond( $start, $end )
@@ -174,9 +181,6 @@ class SpecialBlockList extends SpecialPage {
                if ( in_array( 'userblocks', $this->options ) ) {
                        $conds['ipb_user'] = 0;
                }
-               if ( in_array( 'tempblocks', $this->options ) ) {
-                       $conds['ipb_expiry'] = 'infinity';
-               }
                if ( in_array( 'addressblocks', $this->options ) ) {
                        $conds[] = "ipb_user != 0 OR ipb_range_end > ipb_range_start";
                }
@@ -184,10 +188,21 @@ class SpecialBlockList extends SpecialPage {
                        $conds[] = "ipb_range_end = ipb_range_start";
                }
 
+               $hideTemp = in_array( 'tempblocks', $this->options );
+               $hideIndef = in_array( 'indefblocks', $this->options );
+               if ( $hideTemp && $hideIndef ) {
+                       // If both types are hidden, ensure query doesn't produce any results
+                       $conds[] = '1=0';
+               } elseif ( $hideTemp ) {
+                       $conds['ipb_expiry'] = $db->getInfinity();
+               } elseif ( $hideIndef ) {
+                       $conds[] = "ipb_expiry != " . $db->addQuotes( $db->getInfinity() );
+               }
+
                if ( $this->blockType === 'sitewide' ) {
-                       $conds[] = 'ipb_sitewide = 1';
+                       $conds['ipb_sitewide'] = 1;
                } elseif ( $this->blockType === 'partial' ) {
-                       $conds[] = 'ipb_sitewide = 0';
+                       $conds['ipb_sitewide'] = 0;
                }
 
                return new BlockListPager( $this, $conds );
@@ -243,4 +258,13 @@ class SpecialBlockList extends SpecialPage {
        protected function getGroupName() {
                return 'users';
        }
+
+       /**
+        * Return a IDatabase object for reading
+        *
+        * @return IDatabase
+        */
+       protected function getDB() {
+               return wfGetDB( DB_REPLICA );
+       }
 }
index 9431cef..392b4e9 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -114,6 +115,8 @@ class SpecialBrokenRedirects extends QueryPage {
                }
 
                $linkRenderer = $this->getLinkRenderer();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+
                // $toObj may very easily be false if the $result list is cached
                if ( !is_object( $toObj ) ) {
                        return '<del>' . $linkRenderer->makeLink( $fromObj ) . '</del>';
@@ -129,7 +132,7 @@ class SpecialBrokenRedirects extends QueryPage {
                // if the page is editable, add an edit link
                if (
                        // check user permissions
-                       $this->getUser()->isAllowed( 'edit' ) &&
+                       $permissionManager->userHasRight( $this->getUser(), 'edit' ) &&
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $fromObj )->supportsDirectEditing()
                ) {
@@ -145,7 +148,7 @@ class SpecialBrokenRedirects extends QueryPage {
 
                $out = $from . $this->msg( 'word-separator' )->escaped();
 
-               if ( $this->getUser()->isAllowed( 'delete' ) ) {
+               if ( $permissionManager->userHasRight( $this->getUser(), 'delete' ) ) {
                        $links[] = $linkRenderer->makeKnownLink(
                                $fromObj,
                                $this->msg( 'brokenredirects-delete' )->text(),
index 01f7e56..46fa17e 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class SpecialChangeContentModel extends FormSpecialPage {
 
        public function __construct() {
@@ -226,7 +228,10 @@ class SpecialChangeContentModel extends FormSpecialPage {
 
                $flags = $this->oldRevision ? EDIT_UPDATE : EDIT_NEW;
                $flags |= EDIT_INTERNAL;
-               if ( $user->isAllowed( 'bot' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'bot' )
+               ) {
                        $flags |= EDIT_FORCE_BOT;
                }
 
index c95aa1b..7331cd7 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Let users change their email address.
@@ -74,7 +75,10 @@ class SpecialChangeEmail extends FormSpecialPage {
 
                // This could also let someone check the current email address, so
                // require both permissions.
-               if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmyprivateinfo' )
+               ) {
                        throw new PermissionsError( 'viewmyprivateinfo' );
                }
 
index f86a133..dc31eba 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Special page allows users to request email confirmation message, and handles
  * processing of the confirmation code when the link in the email is followed
@@ -57,7 +59,10 @@ class SpecialConfirmEmail extends UnlistedSpecialPage {
 
                // This could also let someone check the current email address, so
                // require both permissions.
-               if ( !$this->getUser()->isAllowed( 'viewmyprivateinfo' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmyprivateinfo' )
+               ) {
                        throw new PermissionsError( 'viewmyprivateinfo' );
                }
 
@@ -136,7 +141,7 @@ class SpecialConfirmEmail extends UnlistedSpecialPage {
                        return Status::newGood( $this->msg( 'confirmemail_sent' )->text() );
                } else {
                        return Status::newFatal( new RawMessage(
-                               $status->getWikiText( 'confirmemail_sendfailed' )
+                               $status->getWikiText( 'confirmemail_sendfailed', false, $this->getLanguage() )
                        ) );
                }
        }
index 40c0edf..8f92cd5 100644 (file)
@@ -23,7 +23,6 @@
 
 use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Widget\DateInputWidget;
 
 /**
  * Special:Contributions, show user contributions in a paged list
@@ -43,11 +42,16 @@ class SpecialContributions extends IncludableSpecialPage {
                $out = $this->getOutput();
                // Modules required for viewing the list of contributions (also when included on other pages)
                $out->addModuleStyles( [
+                       'jquery.makeCollapsible.styles',
                        'mediawiki.interface.helpers.styles',
                        'mediawiki.special',
                        'mediawiki.special.changeslist',
                ] );
-               $out->addModules( 'mediawiki.special.recentchanges' );
+               $out->addModules( [
+                       'mediawiki.special.recentchanges',
+                       // Certain skins e.g. Minerva might have disabled this module.
+                       'mediawiki.page.ready'
+               ] );
                $this->addHelpLink( 'Help:User contributions' );
 
                $this->opts = [];
@@ -59,7 +63,7 @@ class SpecialContributions extends IncludableSpecialPage {
 
                if ( !strlen( $target ) ) {
                        if ( !$this->including() ) {
-                               $out->addHTML( $this->getForm() );
+                               $out->addHTML( $this->getForm( $this->opts ) );
                        }
 
                        return;
@@ -77,7 +81,7 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( ExternalUserNames::isExternal( $target ) ) {
                        $userObj = User::newFromName( $target, false );
                        if ( !$userObj ) {
-                               $out->addHTML( $this->getForm() );
+                               $out->addHTML( $this->getForm( $this->opts ) );
                                return;
                        }
 
@@ -89,12 +93,12 @@ class SpecialContributions extends IncludableSpecialPage {
                } else {
                        $nt = Title::makeTitleSafe( NS_USER, $target );
                        if ( !$nt ) {
-                               $out->addHTML( $this->getForm() );
+                               $out->addHTML( $this->getForm( $this->opts ) );
                                return;
                        }
                        $userObj = User::newFromName( $nt->getText(), false );
                        if ( !$userObj ) {
-                               $out->addHTML( $this->getForm() );
+                               $out->addHTML( $this->getForm( $this->opts ) );
                                return;
                        }
                        $id = $userObj->getId();
@@ -114,19 +118,31 @@ class SpecialContributions extends IncludableSpecialPage {
                }
 
                $ns = $request->getVal( 'namespace', null );
-               if ( $ns !== null && $ns !== '' ) {
+               if ( $ns !== null && $ns !== '' && $ns !== 'all' ) {
                        $this->opts['namespace'] = intval( $ns );
                } else {
                        $this->opts['namespace'] = '';
                }
 
+               // Backwards compatibility: Before using OOUI form the old HTML form had
+               // fields for nsInvert and associated. These have now been replaced with the
+               // wpFilters query string parameters. These are retained to keep old URIs working.
                $this->opts['associated'] = $request->getBool( 'associated' );
                $this->opts['nsInvert'] = (bool)$request->getVal( 'nsInvert' );
+               $nsFilters = $request->getArray( 'wpfilters', null );
+               if ( $nsFilters !== null ) {
+                       $this->opts['associated'] = in_array( 'associated', $nsFilters );
+                       $this->opts['nsInvert'] = in_array( 'nsInvert', $nsFilters );
+               }
+
                $this->opts['tagfilter'] = (string)$request->getVal( 'tagfilter' );
 
                // Allows reverts to have the bot flag in recent changes. It is just here to
                // be passed in the form at the top of the page
-               if ( $user->isAllowed( 'markbotedits' ) && $request->getBool( 'bot' ) ) {
+               if ( MediaWikiServices::getInstance()
+                                ->getPermissionManager()
+                                ->userHasRight( $user, 'markbotedits' ) && $request->getBool( 'bot' )
+               ) {
                        $this->opts['bot'] = '1';
                }
 
@@ -146,7 +162,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                "<div class=\"mw-negative-namespace-not-supported error\">\n\$1\n</div>",
                                [ 'negative-namespace-not-supported' ]
                        );
-                       $out->addHTML( $this->getForm() );
+                       $out->addHTML( $this->getForm( $this->opts ) );
                        return;
                }
 
@@ -198,9 +214,6 @@ class SpecialContributions extends IncludableSpecialPage {
                $this->addFeedLinks( $feedParams );
 
                if ( Hooks::run( 'SpecialContributionsBeforeMainOutput', [ $id, $userObj, $this ] ) ) {
-                       if ( !$this->including() ) {
-                               $out->addHTML( $this->getForm() );
-                       }
                        $pager = new ContribsPager( $this->getContext(), [
                                'target' => $target,
                                'namespace' => $this->opts['namespace'],
@@ -214,6 +227,9 @@ class SpecialContributions extends IncludableSpecialPage {
                                'nsInvert' => $this->opts['nsInvert'],
                                'associated' => $this->opts['associated'],
                        ], $this->getLinkRenderer() );
+                       if ( !$this->including() ) {
+                               $out->addHTML( $this->getForm( $this->opts ) );
+                       }
 
                        if ( IP::isValidRange( $target ) && !$pager->isQueryableRange( $target ) ) {
                                // Valid range, but outside CIDR limit.
@@ -373,7 +389,9 @@ class SpecialContributions extends IncludableSpecialPage {
                        );
                }
 
-               if ( $sp->getUser()->isAllowed( 'block' ) ) { # Block / Change block / Unblock links
+               # Block / Change block / Unblock links
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $sp->getUser(), 'block' ) ) {
                        if ( $target->getBlock() && $target->getBlock()->getType() != DatabaseBlock::TYPE_AUTO ) {
                                $tools['block'] = $linkRenderer->makeKnownLink( # Change block link
                                        SpecialPage::getTitleFor( 'Block', $username ),
@@ -400,7 +418,7 @@ class SpecialContributions extends IncludableSpecialPage {
                );
 
                # Suppression log link (T61120)
-               if ( $sp->getUser()->isAllowed( 'suppressionlog' ) ) {
+               if ( $permissionManager->userHasRight( $sp->getUser(), 'suppressionlog' ) ) {
                        $tools['log-suppression'] = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Log', 'suppress' ),
                                $sp->msg( 'sp-contributions-suppresslog', $username )->text(),
@@ -412,7 +430,7 @@ class SpecialContributions extends IncludableSpecialPage {
                # Don't show some links for IP ranges
                if ( !$isRange ) {
                        # Uploads: hide if IPs cannot upload (T220674)
-                       if ( !$isIP || $target->isAllowed( 'upload' ) ) {
+                       if ( !$isIP || $permissionManager->userHasRight( $target, 'upload' ) ) {
                                $tools['uploads'] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Listfiles', $username ),
                                        $sp->msg( 'sp-contributions-uploads' )->text()
@@ -428,7 +446,7 @@ class SpecialContributions extends IncludableSpecialPage {
 
                        # Add link to deleted user contributions for priviledged users
                        # Todo: T183457
-                       if ( $sp->getUser()->isAllowed( 'deletedhistory' ) ) {
+                       if ( $permissionManager->userHasRight( $sp->getUser(), 'deletedhistory' ) ) {
                                $tools['deletedcontribs'] = $linkRenderer->makeKnownLink(
                                        SpecialPage::getTitleFor( 'DeletedContributions', $username ),
                                        $sp->msg( 'sp-contributions-deleted', $username )->text()
@@ -453,52 +471,12 @@ class SpecialContributions extends IncludableSpecialPage {
 
        /**
         * Generates the namespace selector form with hidden attributes.
+        * @param array $pagerOptions with keys contribs, user, deletedOnly, limit, target, topOnly,
+        *  newOnly, hideMinor, namespace, associated, nsInvert, tagfilter, year, start, end
         * @return string HTML fragment
         */
-       protected function getForm() {
+       protected function getForm( array $pagerOptions ) {
                $this->opts['title'] = $this->getPageTitle()->getPrefixedText();
-               if ( !isset( $this->opts['target'] ) ) {
-                       $this->opts['target'] = '';
-               } else {
-                       $this->opts['target'] = str_replace( '_', ' ', $this->opts['target'] );
-               }
-
-               if ( !isset( $this->opts['namespace'] ) ) {
-                       $this->opts['namespace'] = '';
-               }
-
-               if ( !isset( $this->opts['nsInvert'] ) ) {
-                       $this->opts['nsInvert'] = '';
-               }
-
-               if ( !isset( $this->opts['associated'] ) ) {
-                       $this->opts['associated'] = false;
-               }
-
-               if ( !isset( $this->opts['start'] ) ) {
-                       $this->opts['start'] = '';
-               }
-
-               if ( !isset( $this->opts['end'] ) ) {
-                       $this->opts['end'] = '';
-               }
-
-               if ( !isset( $this->opts['tagfilter'] ) ) {
-                       $this->opts['tagfilter'] = '';
-               }
-
-               if ( !isset( $this->opts['topOnly'] ) ) {
-                       $this->opts['topOnly'] = false;
-               }
-
-               if ( !isset( $this->opts['newOnly'] ) ) {
-                       $this->opts['newOnly'] = false;
-               }
-
-               if ( !isset( $this->opts['hideMinor'] ) ) {
-                       $this->opts['hideMinor'] = false;
-               }
-
                // Modules required only for the form
                $this->getOutput()->addModules( [
                        'mediawiki.userSuggest',
@@ -506,15 +484,7 @@ class SpecialContributions extends IncludableSpecialPage {
                ] );
                $this->getOutput()->addModuleStyles( 'mediawiki.widgets.DateInputWidget.styles' );
                $this->getOutput()->enableOOUI();
-
-               $form = Html::openElement(
-                       'form',
-                       [
-                               'method' => 'get',
-                               'action' => wfScript(),
-                               'class' => 'mw-contributions-form'
-                       ]
-               );
+               $fields = [];
 
                # Add hidden params for tracking except for parameters in $skipParameters
                $skipParameters = [
@@ -522,7 +492,6 @@ class SpecialContributions extends IncludableSpecialPage {
                        'nsInvert',
                        'deletedOnly',
                        'target',
-                       'contribs',
                        'year',
                        'month',
                        'start',
@@ -538,204 +507,171 @@ class SpecialContributions extends IncludableSpecialPage {
                        if ( in_array( $name, $skipParameters ) ) {
                                continue;
                        }
-                       $form .= "\t" . Html::hidden( $name, $value ) . "\n";
-               }
 
-               $tagFilter = ChangeTags::buildTagFilterSelector(
-                       $this->opts['tagfilter'], false, $this->getContext() );
-
-               if ( $tagFilter ) {
-                       $filterSelection = Html::rawElement(
-                               'div',
-                               [],
-                               implode( "\u{00A0}", $tagFilter )
-                       );
-               } else {
-                       $filterSelection = Html::rawElement( 'div', [], '' );
-               }
-
-               $labelUsername = Xml::label(
-                       $this->msg( 'sp-contributions-username' )->text(),
-                       'mw-target-user-or-ip'
-               );
-               $input = Html::input(
-                       'target',
-                       $this->opts['target'],
-                       'text',
-                       [
-                               'id' => 'mw-target-user-or-ip',
-                               'size' => '40',
-                               'class' => [
-                                       'mw-input',
-                                       'mw-ui-input-inline',
-                                       'mw-autocomplete-user', // used by mediawiki.userSuggest
-                               ],
-                       ] + (
-                               // Only autofocus if target hasn't been specified
-                               $this->opts['target'] ? [] : [ 'autofocus' => true ]
-                       )
-               );
-
-               $targetSelection = Html::rawElement(
-                       'div',
-                       [],
-                       $labelUsername . ' ' . $input . ' '
-               );
-
-               $hidden = $this->opts['namespace'] === '' ? ' mw-input-hidden' : '';
-               $namespaceSelection = Xml::tags(
-                       'div',
-                       [],
-                       Xml::label(
-                               $this->msg( 'namespace' )->text(),
-                               'namespace'
-                       ) . "\u{00A0}" .
-                       Html::namespaceSelector(
-                               [ 'selected' => $this->opts['namespace'], 'all' => '', 'in-user-lang' => true ],
-                               [
-                                       'name' => 'namespace',
-                                       'id' => 'namespace',
-                                       'class' => 'namespaceselector',
-                               ]
-                       ) . "\u{00A0}" .
-                               Html::rawElement(
-                                       'span',
-                                       [ 'class' => 'mw-input-with-label' . $hidden ],
-                                       Xml::checkLabel(
-                                               $this->msg( 'invert' )->text(),
-                                               'nsInvert',
-                                               'nsinvert',
-                                               $this->opts['nsInvert'],
-                                               [
-                                                       'title' => $this->msg( 'tooltip-invert' )->text(),
-                                                       'class' => 'mw-input'
-                                               ]
-                                       ) . "\u{00A0}"
-                               ) .
-                               Html::rawElement( 'span', [ 'class' => 'mw-input-with-label' . $hidden ],
-                                       Xml::checkLabel(
-                                               $this->msg( 'namespace_association' )->text(),
-                                               'associated',
-                                               'nsassociated',
-                                               $this->opts['associated'],
-                                               [
-                                                       'title' => $this->msg( 'tooltip-namespace_association' )->text(),
-                                                       'class' => 'mw-input'
-                                               ]
-                                       ) . "\u{00A0}"
-                               )
-               );
+                       $fields[$name] = [
+                               'name' => $name,
+                               'type' => 'hidden',
+                               'default' => $value,
+                       ];
+               }
+
+               $target = $this->opts['target'] ?? null;
+               $fields['target'] = [
+                       'type' => 'text',
+                       'cssclass' => 'mw-autocomplete-user mw-ui-input-inline mw-input',
+                       'default' => $target ?
+                               str_replace( '_', ' ', $target ) : '' ,
+                       'label' => $this->msg( 'sp-contributions-username' )->text(),
+                       'name' => 'target',
+                       'id' => 'mw-target-user-or-ip',
+                       'size' => 40,
+                       'autofocus' => !$target,
+                       'section' => 'contribs-top',
+               ];
 
-               $filters = [];
-
-               if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
-                       $filters[] = Html::rawElement(
-                               'span',
-                               [ 'class' => 'mw-input-with-label' ],
-                               Xml::checkLabel(
-                                       $this->msg( 'history-show-deleted' )->text(),
-                                       'deletedOnly',
-                                       'mw-show-deleted-only',
-                                       $this->opts['deletedOnly'],
-                                       [ 'class' => 'mw-input' ]
-                               )
-                       );
-               }
+               $ns = $this->opts['namespace'] ?? null;
+               $fields['namespace'] = [
+                       'type' => 'namespaceselect',
+                       'label' => $this->msg( 'namespace' )->text(),
+                       'name' => 'namespace',
+                       'cssclass' => 'namespaceselector',
+                       'default' => $ns,
+                       'id' => 'namespace',
+                       'section' => 'contribs-top',
+               ];
+               $request = $this->getRequest();
+               $nsFilters = $request->getArray( 'wpfilters' );
+               $fields['nsFilters'] = [
+                       'class' => 'HTMLMultiSelectField',
+                       'label' => '',
+                       'name' => 'wpfilters',
+                       'flatlist' => true,
+                       // Only shown when namespaces are selected.
+                       'cssclass' => $ns === '' ?
+                               'contribs-ns-filters mw-input-with-label mw-input-hidden' :
+                               'contribs-ns-filters mw-input-with-label',
+                       // `contribs-ns-filters` class allows these fields to be toggled on/off by JavaScript.
+                       // See resources/src/mediawiki.special.recentchanges.js
+                       'infusable' => true,
+                       'options' => [
+                               $this->msg( 'invert' )->text() => 'nsInvert',
+                               $this->msg( 'namespace_association' )->text() => 'associated',
+                       ],
+                       'default' => $nsFilters,
+                       'section' => 'contribs-top',
+               ];
+               $fields['tagfilter'] = [
+                       'type' => 'tagfilter',
+                       'cssclass' => 'mw-tagfilter-input',
+                       'id' => 'tagfilter',
+                       'label-message' => [ 'tag-filter', 'parse' ],
+                       'name' => 'tagfilter',
+                       'size' => 20,
+                       'section' => 'contribs-top',
+               ];
 
-               $filters[] = Html::rawElement(
-                       'span',
-                       [ 'class' => 'mw-input-with-label' ],
-                       Xml::checkLabel(
-                               $this->msg( 'sp-contributions-toponly' )->text(),
-                               'topOnly',
-                               'mw-show-top-only',
-                               $this->opts['topOnly'],
-                               [ 'class' => 'mw-input' ]
-                       )
-               );
-               $filters[] = Html::rawElement(
-                       'span',
-                       [ 'class' => 'mw-input-with-label' ],
-                       Xml::checkLabel(
-                               $this->msg( 'sp-contributions-newonly' )->text(),
-                               'newOnly',
-                               'mw-show-new-only',
-                               $this->opts['newOnly'],
-                               [ 'class' => 'mw-input' ]
-                       )
-               );
-               $filters[] = Html::rawElement(
-                       'span',
-                       [ 'class' => 'mw-input-with-label' ],
-                       Xml::checkLabel(
-                               $this->msg( 'sp-contributions-hideminor' )->text(),
-                               'hideMinor',
-                               'mw-hide-minor-edits',
-                               $this->opts['hideMinor'],
-                               [ 'class' => 'mw-input' ]
-                       )
-               );
+               if ( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'deletedhistory' )
+               ) {
+                       $fields['deletedOnly'] = [
+                               'type' => 'check',
+                               'id' => 'mw-show-deleted-only',
+                               'label' => $this->msg( 'history-show-deleted' )->text(),
+                               'name' => 'deletedOnly',
+                               'section' => 'contribs-top',
+                       ];
+               }
+
+               $fields['topOnly'] = [
+                       'type' => 'check',
+                       'id' => 'mw-show-top-only',
+                       'label' => $this->msg( 'sp-contributions-toponly' )->text(),
+                       'name' => 'topOnly',
+                       'section' => 'contribs-top',
+               ];
+               $fields['newOnly'] = [
+                       'type' => 'check',
+                       'id' => 'mw-show-new-only',
+                       'label' => $this->msg( 'sp-contributions-newonly' )->text(),
+                       'name' => 'newOnly',
+                       'section' => 'contribs-top',
+               ];
+               $fields['hideMinor'] = [
+                       'type' => 'check',
+                       'cssclass' => 'mw-hide-minor-edits',
+                       'id' => 'mw-show-new-only',
+                       'label' => $this->msg( 'sp-contributions-hideminor' )->text(),
+                       'name' => 'hideMinor',
+                       'section' => 'contribs-top',
+               ];
 
+               // Allow additions at this point to the filters.
+               $rawFilters = [];
                Hooks::run(
                        'SpecialContributions::getForm::filters',
-                       [ $this, &$filters ]
-               );
-
-               $extraOptions = Html::rawElement(
-                       'div',
-                       [],
-                       implode( '', $filters )
+                       [ $this, &$rawFilters ]
                );
+               foreach ( $rawFilters as $filter ) {
+                       // Backwards compatibility support for previous hook function signature.
+                       if ( is_string( $filter ) ) {
+                               $fields[] = [
+                                       'type' => 'info',
+                                       'default' => $filter,
+                                       'raw' => true,
+                                       'section' => 'contribs-top',
+                               ];
+                               wfDeprecated(
+                                       __METHOD__ .
+                                       ' returning string[]',
+                                       '1.33'
+                               );
+                       } else {
+                               // Preferred append method.
+                               $fields[] = $filter;
+                       }
+               }
 
-               $dateRangeSelection = Html::rawElement(
-                       'div',
-                       [],
-                       Xml::label( $this->msg( 'date-range-from' )->text(), 'mw-date-start' ) . ' ' .
-                       new DateInputWidget( [
-                               'infusable' => true,
-                               'id' => 'mw-date-start',
-                               'name' => 'start',
-                               'value' => $this->opts['start'],
-                               'longDisplayFormat' => true,
-                       ] ) . '<br>' .
-                       Xml::label( $this->msg( 'date-range-to' )->text(), 'mw-date-end' ) . ' ' .
-                       new DateInputWidget( [
-                               'infusable' => true,
-                               'id' => 'mw-date-end',
-                               'name' => 'end',
-                               'value' => $this->opts['end'],
-                               'longDisplayFormat' => true,
-                       ] )
-               );
+               $fields['start'] = [
+                       'type' => 'date',
+                       'default' => '',
+                       'id' => 'mw-date-start',
+                       'label' => $this->msg( 'date-range-from' )->text(),
+                       'name' => 'start',
+                       'section' => 'contribs-date',
+               ];
+               $fields['end'] = [
+                       'type' => 'date',
+                       'default' => '',
+                       'id' => 'mw-date-end',
+                       'label' => $this->msg( 'date-range-to' )->text(),
+                       'name' => 'end',
+                       'section' => 'contribs-date',
+               ];
 
-               $submit = Xml::tags( 'div', [],
-                       Html::submitButton(
-                               $this->msg( 'sp-contributions-submit' )->text(),
-                               [ 'class' => 'mw-submit' ], [ 'mw-ui-progressive' ]
+               $htmlForm = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
+               $htmlForm
+                       ->setMethod( 'get' )
+                       // When offset is defined, the user is paging through results
+                       // so we hide the form by default to allow users to focus on browsing
+                       // rather than defining search parameters
+                       ->setCollapsibleOptions(
+                               ( $pagerOptions['target'] ?? null ) ||
+                               ( $pagerOptions['start'] ?? null ) ||
+                               ( $pagerOptions['end'] ?? null )
                        )
-               );
-
-               $form .= Xml::fieldset(
-                       $this->msg( 'sp-contributions-search' )->text(),
-                       $targetSelection .
-                       $namespaceSelection .
-                       $filterSelection .
-                       $extraOptions .
-                       $dateRangeSelection .
-                       $submit,
-                       [ 'class' => 'mw-contributions-table' ]
-               );
+                       ->setAction( wfScript() )
+                       ->setSubmitText( $this->msg( 'sp-contributions-submit' )->text() )
+                       ->setWrapperLegend( $this->msg( 'sp-contributions-search' )->text() );
 
                $explain = $this->msg( 'sp-contributions-explain' );
                if ( !$explain->isBlank() ) {
-                       $form .= Html::rawElement(
-                               'p', [ 'id' => 'mw-sp-contributions-explain' ], $explain->parse()
-                       );
+                       $htmlForm->addFooterText( "<p id='mw-sp-contributions-explain'>{$explain->parse()}</p>" );
                }
 
-               $form .= Xml::closeElement( 'form' );
+               $htmlForm->loadData();
 
-               return $form;
+               return $htmlForm->getHTML( false );
        }
 
        /**
index cc2fc80..637025c 100644 (file)
@@ -57,7 +57,9 @@ class SpecialCreateAccount extends LoginSignupSpecialPage {
        }
 
        public function userCanExecute( User $user ) {
-               return $user->isAllowed( 'createaccount' );
+               return MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'createaccount' );
        }
 
        public function checkPermissions() {
index cccca50..540ac5a 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
@@ -155,7 +156,9 @@ class SpecialDoubleRedirects extends QueryPage {
                // if the page is editable, add an edit link
                if (
                        // check user permissions
-                       $this->getUser()->isAllowed( 'edit' ) &&
+                       MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'edit' ) &&
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $titleA )->supportsDirectEditing()
                ) {
index 70a1bd4..0b4577e 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\Permissions\PermissionManager;
+
 /**
  * Special page for adding and removing change tags to individual revisions.
  * A lot of this is copied out of SpecialRevisiondelete.
@@ -51,8 +53,18 @@ class SpecialEditTags extends UnlistedSpecialPage {
        /** @var string */
        private $reason;
 
-       public function __construct() {
+       /** @var PermissionManager */
+       private $permissionManager;
+
+       /**
+        * @inheritDoc
+        *
+        * @param PermissionManager $permissionManager
+        */
+       public function __construct( PermissionManager $permissionManager ) {
                parent::__construct( 'EditTags', 'changetags' );
+
+               $this->permissionManager = $permissionManager;
        }
 
        public function doesWrites() {
@@ -67,13 +79,6 @@ class SpecialEditTags extends UnlistedSpecialPage {
                $user = $this->getUser();
                $request = $this->getRequest();
 
-               // Check blocks
-               // @TODO Use PermissionManager::isBlockedFrom() instead.
-               $block = $user->getBlock();
-               if ( $block ) {
-                       throw new UserBlockedError( $block );
-               }
-
                $this->setHeaders();
                $this->outputHeader();
 
@@ -124,7 +129,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
                        $this->ids
                );
 
-               $this->isAllowed = $user->isAllowed( 'changetags' );
+               $this->isAllowed = $this->permissionManager->userHasRight( $user, 'changetags' );
 
                $this->reason = $request->getVal( 'wpReason' );
                // We need a target page!
@@ -132,6 +137,12 @@ class SpecialEditTags extends UnlistedSpecialPage {
                        $output->addWikiMsg( 'undelete-header' );
                        return;
                }
+
+               // Check blocks
+               if ( $this->permissionManager->isBlockedFrom( $user, $this->targetObj ) ) {
+                       throw new UserBlockedError( $user->getBlock() );
+               }
+
                // Give a link to the logs/hist for this page
                $this->showConvenienceLinks();
 
@@ -454,7 +465,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
        protected function failure( $status ) {
                $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
                $this->getOutput()->wrapWikiTextAsInterface(
-                       'errorbox', $status->getWikiText( 'tags-edit-failure' )
+                       'errorbox', $status->getWikiText( 'tags-edit-failure', false, $this->getLanguage() )
                );
                $this->showForm();
        }
index b42cdea..c8b92bd 100644 (file)
@@ -253,7 +253,10 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        return 'mailnologin';
                }
 
-               if ( !$user->isAllowed( 'sendemail' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'sendemail' )
+               ) {
                        return 'badaccess';
                }
 
index ef1b3d8..72e881f 100644 (file)
@@ -273,7 +273,10 @@ class SpecialExpandTemplates extends SpecialPage {
                        // allowed and a valid edit token is not provided (T73111). However, MediaWiki
                        // does not currently provide logged-out users with CSRF protection; in that case,
                        // do not show the preview unless anonymous editing is allowed.
-                       if ( $user->isAnon() && !$user->isAllowed( 'edit' ) ) {
+                       if ( $user->isAnon() && !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'edit' )
+                       ) {
                                $error = [ 'expand_templates_preview_fail_html_anon' ];
                        } elseif ( !$user->matchEditToken( $request->getVal( 'wpEditToken' ), '', $request ) ) {
                                $error = [ 'expand_templates_preview_fail_html' ];
@@ -282,7 +285,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        }
 
                        if ( $error ) {
-                               $out->wrapWikiMsg( "<div class='previewnote'>\n$1\n</div>", $error );
+                               $out->wrapWikiMsg( "<div class='previewnote errorbox'>\n$1\n</div>", $error );
                                return;
                        }
                }
index 5a63581..e680d24 100644 (file)
@@ -327,7 +327,9 @@ class SpecialExport extends SpecialPage {
         * @return bool
         */
        private function userCanOverrideExportDepth() {
-               return $this->getUser()->isAllowed( 'override-export-depth' );
+               return MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $this->getUser(), 'override-export-depth' );
        }
 
        /**
index f21c206..428556f 100644 (file)
@@ -135,18 +135,19 @@ class SpecialImport extends SpecialPage {
                }
 
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                if ( !$user->matchEditToken( $request->getVal( 'editToken' ) ) ) {
                        $source = Status::newFatal( 'import-token-mismatch' );
                } elseif ( $this->sourceName === 'upload' ) {
                        $isUpload = true;
                        $this->usernamePrefix = $this->fullInterwikiPrefix = $request->getVal( 'usernamePrefix' );
-                       if ( $user->isAllowed( 'importupload' ) ) {
+                       if ( $permissionManager->userHasRight( $user, 'importupload' ) ) {
                                $source = ImportStreamSource::newFromUpload( "xmlimport" );
                        } else {
                                throw new PermissionsError( 'importupload' );
                        }
                } elseif ( $this->sourceName === 'interwiki' ) {
-                       if ( !$user->isAllowed( 'import' ) ) {
+                       if ( !$permissionManager->userHasRight( $user, 'import' ) ) {
                                throw new PermissionsError( 'import' );
                        }
                        $this->interwiki = $this->fullInterwikiPrefix = $request->getVal( 'interwiki' );
@@ -186,7 +187,8 @@ class SpecialImport extends SpecialPage {
                $out = $this->getOutput();
                if ( !$source->isGood() ) {
                        $out->wrapWikiTextAsInterface( 'error',
-                               $this->msg( 'importfailed', $source->getWikiText() )->plain()
+                               $this->msg( 'importfailed', $source->getWikiText( false, false, $this->getLanguage() ) )
+                                       ->plain()
                        );
                } else {
                        $importer = new WikiImporter( $source->value, $this->getConfig() );
@@ -199,7 +201,7 @@ class SpecialImport extends SpecialPage {
                                                "<div class=\"error\">\n$1\n</div>",
                                                [
                                                        'import-options-wrong',
-                                                       $statusRootPage->getWikiText(),
+                                                       $statusRootPage->getWikiText( false, false, $this->getLanguage() ),
                                                        count( $statusRootPage->getErrorsArray() )
                                                ]
                                        );
@@ -238,7 +240,7 @@ class SpecialImport extends SpecialPage {
                                # Zero revisions
                                $out->wrapWikiMsg(
                                        "<div class=\"error\">\n$1\n</div>",
-                                       [ 'importfailed', $result->getWikiText() ]
+                                       [ 'importfailed', $result->getWikiText( false, false, $this->getLanguage() ) ]
                                );
                        } else {
                                # Success!
@@ -325,10 +327,11 @@ class SpecialImport extends SpecialPage {
        private function showForm() {
                $action = $this->getPageTitle()->getLocalURL( [ 'action' => 'submit' ] );
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                $out = $this->getOutput();
                $this->addHelpLink( 'https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Import', true );
 
-               if ( $user->isAllowed( 'importupload' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'importupload' ) ) {
                        $mappingSelection = $this->getMappingFormPart( 'upload' );
                        $out->addHTML(
                                Xml::fieldset( $this->msg( 'import-upload' )->text() ) .
@@ -401,7 +404,7 @@ class SpecialImport extends SpecialPage {
                        $out->addWikiMsg( 'importnosources' );
                }
 
-               if ( $user->isAllowed( 'import' ) && !empty( $this->importSources ) ) {
+               if ( $permissionManager->userHasRight( $user, 'import' ) && !empty( $this->importSources ) ) {
                        # Show input field for import depth only if $wgExportMaxLinkDepth > 0
                        $importDepth = '';
                        if ( $this->getConfig()->get( 'ExportMaxLinkDepth' ) > 0 ) {
index f2a3f80..60aedda 100644 (file)
@@ -32,6 +32,12 @@ use Wikimedia\Rdbms\IDatabase;
 class SpecialLinkSearch extends QueryPage {
        /** @var array|bool */
        private $mungedQuery = false;
+       /** @var string|null */
+       private $mQuery;
+       /** @var int|null */
+       private $mNs;
+       /** @var string|null */
+       private $mProt;
 
        function setParams( $params ) {
                $this->mQuery = $params['query'];
index 02a468b..bc4f7e2 100644 (file)
@@ -40,6 +40,11 @@ class SpecialListFiles extends IncludableSpecialPage {
                        $search = $this->getRequest()->getText( 'ilsearch', '' );
                        $showAll = $this->getRequest()->getBool( 'ilshowall', false );
                }
+               if ( $userName ) {
+                       $pageTitle = $this->msg( 'listfiles_subpage', $userName );
+               } else {
+                       $pageTitle = $this->msg( 'listfiles' );
+               }
 
                $pager = new ImageListPager(
                        $this->getContext(),
@@ -51,6 +56,8 @@ class SpecialListFiles extends IncludableSpecialPage {
                );
 
                $out = $this->getOutput();
+               $out->setPageTitle( $pageTitle );
+               $out->addModuleStyles( 'mediawiki.special' );
                if ( $this->including() ) {
                        $out->addParserOutputContent( $pager->getBodyOutput() );
                } else {
index ac8baa1..7c85814 100644 (file)
@@ -94,7 +94,9 @@ class SpecialLog extends SpecialPage {
                if ( !LogPage::isLogType( $type ) ) {
                        $opts->setValue( 'type', '' );
                } elseif ( isset( $logRestrictions[$type] )
-                       && !$this->getUser()->isAllowed( $logRestrictions[$type] )
+                       && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), $logRestrictions[$type] )
                ) {
                        throw new PermissionsError( $logRestrictions[$type] );
                }
index 5b77d5a..1babf8c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Special page allowing users with the appropriate permissions to
index 6da362d..0767faf 100644 (file)
@@ -209,7 +209,9 @@ class MovePageForm extends UnlistedSpecialPage {
                }
 
                if ( count( $err ) == 1 && isset( $err[0][0] ) && $err[0][0] == 'file-exists-sharedrepo'
-                       && $user->isAllowed( 'reupload-shared' )
+                       && MediaWikiServices::getInstance()
+                                ->getPermissionManager()
+                                ->userHasRight( $user, 'reupload-shared' )
                ) {
                        $out->wrapWikiMsg(
                                "<div class='warningbox'>\n$1\n</div>\n",
@@ -374,7 +376,10 @@ class MovePageForm extends UnlistedSpecialPage {
                        );
                }
 
-               if ( $user->isAllowed( 'suppressredirect' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'suppressredirect' )
+               ) {
                        if ( $handlerSupportsRedirects ) {
                                $isChecked = $this->leaveRedirect;
                                $isDisabled = false;
@@ -520,6 +525,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
        function doSubmit() {
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                if ( $user->pingLimiter( 'move' ) ) {
                        throw new ThrottledError;
@@ -540,7 +546,7 @@ class MovePageForm extends UnlistedSpecialPage {
                # 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' ) )
+                       && !( $this->moveOverShared && $permissionManager->userHasRight( $user, 'reupload-shared' ) )
                        && !$repoGroup->getLocalRepo()->findFile( $nt )
                        && $repoGroup->findFile( $nt )
                ) {
@@ -551,7 +557,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                # Delete to make way if requested
                if ( $this->deleteAndMove ) {
-                       $permErrors = $nt->getUserPermissionsErrors( 'delete', $user );
+                       $permErrors = $permissionManager->getPermissionErrors( 'delete', $user, $nt );
                        if ( count( $permErrors ) ) {
                                # Only show the first error
                                $this->showForm( $permErrors, true );
@@ -592,7 +598,7 @@ class MovePageForm extends UnlistedSpecialPage {
 
                if ( !$handler->supportsRedirects() ) {
                        $createRedirect = false;
-               } elseif ( $user->isAllowed( 'suppressredirect' ) ) {
+               } elseif ( $permissionManager->userHasRight( $user, 'suppressredirect' ) ) {
                        $createRedirect = $this->leaveRedirect;
                } else {
                        $createRedirect = true;
@@ -607,7 +613,6 @@ class MovePageForm extends UnlistedSpecialPage {
                        $this->moveTalk = false;
                }
                if ( $this->moveSubpages ) {
-                       $permissionManager = $services->getPermissionManager();
                        $this->moveSubpages = $permissionManager->userCan( 'move-subpages', $user, $ot );
                }
 
index 537db9e..408bd92 100644 (file)
@@ -71,14 +71,14 @@ class SpecialMyLanguage extends RedirectSpecialArticle {
                if ( $subpage !== null ) {
                        $provided = Title::newFromText( $subpage );
                        $base = $provided;
-               }
 
-               if ( $provided && strpos( $subpage, '/' ) !== false ) {
-                       $pos = strrpos( $subpage, '/' );
-                       $basepage = substr( $subpage, 0, $pos );
-                       $code = substr( $subpage, $pos + 1 );
-                       if ( strlen( $code ) && Language::isKnownLanguageTag( $code ) ) {
-                               $base = Title::newFromText( $basepage );
+                       if ( $provided && strpos( $subpage, '/' ) !== false ) {
+                               $pos = strrpos( $subpage, '/' );
+                               $basepage = substr( $subpage, 0, $pos );
+                               $code = substr( $subpage, $pos + 1 );
+                               if ( strlen( $code ) && Language::isKnownLanguageTag( $code ) ) {
+                                       $base = Title::newFromText( $basepage );
+                               }
                        }
                }
 
index 3c009c3..8d6488d 100644 (file)
@@ -39,6 +39,11 @@ class SpecialPagesWithProp extends QueryPage {
         */
        private $existingPropNames = null;
 
+       /**
+        * @var int|null
+        */
+       private $ns;
+
        /**
         * @var bool
         */
@@ -64,6 +69,7 @@ class SpecialPagesWithProp extends QueryPage {
 
                $request = $this->getRequest();
                $propname = $request->getVal( 'propname', $par );
+               $this->ns = $request->getIntOrNull( 'namespace' );
                $this->reverse = $request->getBool( 'reverse' );
                $this->sortByValue = $request->getBool( 'sortbyvalue' );
 
@@ -78,6 +84,13 @@ class SpecialPagesWithProp extends QueryPage {
                                'label-message' => 'pageswithprop-prop',
                                'required' => true,
                        ],
+                       'namespace' => [
+                               'type' => 'namespaceselect',
+                               'name' => 'namespace',
+                               'label-message' => 'namespace',
+                               'all' => '',
+                               'default' => $this->ns,
+                       ],
                        'reverse' => [
                                'type' => 'check',
                                'name' => 'reverse',
@@ -134,7 +147,7 @@ class SpecialPagesWithProp extends QueryPage {
        }
 
        public function getQueryInfo() {
-               return [
+               $query = [
                        'tables' => [ 'page_props', 'page' ],
                        'fields' => [
                                'page_id' => 'pp_page',
@@ -153,6 +166,12 @@ class SpecialPagesWithProp extends QueryPage {
                        ],
                        'options' => []
                ];
+
+               if ( $this->ns !== null ) {
+                       $query['conds']['page_namespace'] = $this->ns;
+               }
+
+               return $query;
        }
 
        function getOrderFields() {
index 3524d79..2ef96ad 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Auth\AuthManager;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Special page for requesting a password reset email.
@@ -52,7 +53,11 @@ class SpecialPasswordReset extends FormSpecialPage {
 
        private function getPasswordReset() {
                if ( $this->passwordReset === null ) {
-                       $this->passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
+                       $this->passwordReset = new PasswordReset(
+                               $this->getConfig(),
+                               AuthManager::singleton(),
+                               MediaWikiServices::getInstance()->getPermissionManager()
+                       );
                }
                return $this->passwordReset;
        }
index 0bc9147..d541ead 100644 (file)
@@ -115,7 +115,10 @@ class SpecialPreferences extends SpecialPage {
        }
 
        protected function showResetForm() {
-               if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'editmyoptions' )
+               ) {
                        throw new PermissionsError( 'editmyoptions' );
                }
 
@@ -134,7 +137,10 @@ class SpecialPreferences extends SpecialPage {
        }
 
        public function submitReset( $formData ) {
-               if ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'editmyoptions' )
+               ) {
                        throw new PermissionsError( 'editmyoptions' );
                }
 
index 0bfe185..4683fe6 100644 (file)
@@ -185,7 +185,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                if (
                        !$this->including() &&
                        $this->getUser()->isLoggedIn() &&
-                       $this->getUser()->isAllowed( 'viewmywatchlist' )
+                       MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmywatchlist' )
                ) {
                        $this->registerFiltersFromDefinitions( [ $this->watchlistFilterGroupDefinition ] );
                        $watchlistGroup = $this->getFilterGroup( 'watchlist' );
@@ -279,7 +281,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $join_conds = array_merge( $join_conds, $rcQuery['joins'] );
 
                // JOIN on watchlist for users
-               if ( $user->isLoggedIn() && $user->isAllowed( 'viewmywatchlist' ) ) {
+               if ( $user->isLoggedIn() && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'viewmywatchlist' )
+               ) {
                        $tables[] = 'watchlist';
                        $fields[] = 'wl_user';
                        $fields[] = 'wl_notificationtimestamp';
index 26f3665..0921ada 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This is to display changes made to all articles linked in an article.
  *
@@ -91,7 +93,10 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
 
                // left join with watchlist table to highlight watched rows
                $uid = $this->getUser()->getId();
-               if ( $uid && $this->getUser()->isAllowed( 'viewmywatchlist' ) ) {
+               if ( $uid && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'viewmywatchlist' )
+               ) {
                        $tables[] = 'watchlist';
                        $select[] = 'wl_user';
                        $join_conds['watchlist'] = [ 'LEFT JOIN', [
index 50867dd..82d8b73 100644 (file)
@@ -90,7 +90,9 @@ class SpecialRedirect extends FormSpecialPage {
                }
                $userpage = Title::makeTitle( NS_USER, $username );
 
-               return Status::newGood( $userpage->getFullURL( '', false, PROTO_CURRENT ) );
+               return Status::newGood( [
+                       $userpage->getFullURL( '', false, PROTO_CURRENT ), 302
+               ] );
        }
 
        /**
index 7444225..750e2c3 100644 (file)
@@ -21,7 +21,9 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
+use MediaWiki\Permissions\PermissionManager;
 
 /**
  * Special page allowing users with the appropriate permissions to view
@@ -66,6 +68,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
        /** @var string */
        private $otherReason;
 
+       /** @var PermissionManager */
+       private $permissionManager;
+
        /**
         * UI labels for each type.
         */
@@ -107,8 +112,15 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                ],
        ];
 
-       public function __construct() {
+       /**
+        * @inheritDoc
+        *
+        * @param PermissionManager $permissionManager
+        */
+       public function __construct( PermissionManager $permissionManager ) {
                parent::__construct( 'Revisiondelete', 'deleterevision' );
+
+               $this->permissionManager = $permissionManager;
        }
 
        public function doesWrites() {
@@ -124,13 +136,6 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $output = $this->getOutput();
                $user = $this->getUser();
 
-               // Check blocks
-               // @TODO Use PermissionManager::isBlockedFrom() instead.
-               $block = $user->getBlock();
-               if ( $block ) {
-                       throw new UserBlockedError( $block );
-               }
-
                $this->setHeaders();
                $this->outputHeader();
                $request = $this->getRequest();
@@ -180,12 +185,19 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return;
                }
 
+               // Check blocks
+               if ( $this->permissionManager->isBlockedFrom( $user, $this->targetObj ) ) {
+                       throw new UserBlockedError( $user->getBlock() );
+               }
+
                $this->typeLabels = self::$UILabels[$this->typeName];
                $list = $this->getList();
                $list->reset();
-               $this->mIsAllowed = $user->isAllowed( RevisionDeleter::getRestriction( $this->typeName ) );
-               $canViewSuppressedOnly = $this->getUser()->isAllowed( 'viewsuppressed' ) &&
-                       !$this->getUser()->isAllowed( 'suppressrevision' );
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               $this->mIsAllowed = $permissionManager->userHasRight( $user,
+                       RevisionDeleter::getRestriction( $this->typeName ) );
+               $canViewSuppressedOnly = $permissionManager->userHasRight( $user, 'viewsuppressed' ) &&
+                       !$permissionManager->userHasRight( $user, 'suppressrevision' );
                $pageIsSuppressed = $list->areAnySuppressed();
                $this->mIsAllowed = $this->mIsAllowed && !( $canViewSuppressedOnly && $pageIsSuppressed );
 
@@ -202,7 +214,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        [ 'revdelete-hide-comment', 'wpHideComment', RevisionRecord::DELETED_COMMENT ],
                        [ 'revdelete-hide-user', 'wpHideUser', RevisionRecord::DELETED_USER ]
                ];
-               if ( $user->isAllowed( 'suppressrevision' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'suppressrevision' ) ) {
                        $this->checks[] = [ 'revdelete-hide-restricted',
                                'wpHideRestricted', RevisionRecord::DELETED_RESTRICTED ];
                }
@@ -214,7 +226,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $this->showForm();
                }
 
-               if ( $user->isAllowed( 'deletedhistory' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $qc = $this->getLogQueryCond();
                        # Show relevant lines from the deletion log
                        $deleteLogPage = new LogPage( 'delete' );
@@ -228,7 +240,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        );
                }
                # Show relevant lines from the suppression log
-               if ( $user->isAllowed( 'suppressionlog' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'suppressionlog' ) ) {
                        $suppressLogPage = new LogPage( 'suppress' );
                        $output->addHTML( "<h2>" . $suppressLogPage->getName()->escaped() . "</h2>\n" );
                        LogEventsList::showLogExtract(
@@ -267,7 +279,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                        [ 'action' => 'history' ]
                                );
                                # Link to deleted edits
-                               if ( $this->getUser()->isAllowed( 'undelete' ) ) {
+                               if ( MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $this->getUser(), 'undelete' )
+                               ) {
                                        $undelete = SpecialPage::getTitleFor( 'Undelete' );
                                        $links[] = $linkRenderer->makeKnownLink(
                                                $undelete,
@@ -471,7 +486,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                                Xml::closeElement( 'fieldset' ) . "\n" .
                                Xml::closeElement( 'form' ) . "\n";
                        // Show link to edit the dropdown reasons
-                       if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+                       if ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $this->getUser(), 'editinterface' )
+                       ) {
                                $link = $this->getLinkRenderer()->makeKnownLink(
                                        $this->msg( 'revdelete-reason-dropdown' )->inContentLanguage()->getTitle(),
                                        $this->msg( 'revdelete-edit-reasonlist' )->text(),
@@ -497,7 +515,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        'revdelete-text-others'
                );
 
-               if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'suppressrevision' )
+               ) {
                        $this->getOutput()->addWikiMsg( 'revdelete-suppress-text' );
                }
 
@@ -602,7 +623,9 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                }
                # Can the user set this field?
                if ( $bitParams[RevisionRecord::DELETED_RESTRICTED] == 1
-                       && !$this->getUser()->isAllowed( 'suppressrevision' )
+                       && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'suppressrevision' )
                ) {
                        throw new PermissionsError( 'suppressrevision' );
                }
@@ -644,7 +667,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
                $this->getOutput()->wrapWikiTextAsInterface(
                        'errorbox',
-                       $status->getWikiText( $this->typeLabels['failure'] )
+                       $status->getWikiText( $this->typeLabels['failure'], false, $this->getLanguage() )
                );
                $this->showForm();
        }
index 375694b..530c580 100644 (file)
@@ -52,7 +52,8 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                }
 
                // Validate request parameters
-               $optional = [ 'maxjobs' => 0, 'maxtime' => 30, 'type' => false, 'async' => true ];
+               $optional = [ 'maxjobs' => 0, 'maxtime' => 30, 'type' => false,
+                       'async' => true, 'stats' => false ];
                $required = array_flip( [ 'title', 'tasks', 'signature', 'sigexpiry' ] );
                $params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
                $missing = array_diff_key( $required, $params );
@@ -95,14 +96,20 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                                DeferredUpdates::POSTSEND
                        );
                } else {
-                       $this->doRun( $params );
-                       print "Done\n";
+                       $stats = $this->doRun( $params );
+
+                       if ( $params['stats'] ) {
+                               $this->getRequest()->response()->header( 'Content-Type: application/json' );
+                               print FormatJson::encode( $stats );
+                       } else {
+                               print "Done\n";
+                       }
                }
        }
 
        protected function doRun( array $params ) {
                $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) );
-               $runner->run( [
+               return $runner->run( [
                        'type'     => $params['type'],
                        'maxJobs'  => $params['maxjobs'] ?: 1,
                        'maxTime'  => $params['maxtime'] ?: 30
index 9a95249..34665dd 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A special page that lists tags for edits
  *
@@ -77,9 +79,10 @@ class SpecialTags extends SpecialPage {
                $out->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1\n</div>", 'tags-intro' );
 
                $user = $this->getUser();
-               $userCanManage = $user->isAllowed( 'managechangetags' );
-               $userCanDelete = $user->isAllowed( 'deletechangetags' );
-               $userCanEditInterface = $user->isAllowed( 'editinterface' );
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               $userCanManage = $permissionManager->userHasRight( $user, 'managechangetags' );
+               $userCanDelete = $permissionManager->userHasRight( $user, 'deletechangetags' );
+               $userCanEditInterface = $permissionManager->userHasRight( $user, 'editinterface' );
 
                // Show form to create a tag
                if ( $userCanManage ) {
@@ -329,7 +332,9 @@ class SpecialTags extends SpecialPage {
 
        protected function showDeleteTagForm( $tag ) {
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'deletechangetags' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'deletechangetags' ) ) {
                        throw new PermissionsError( 'deletechangetags' );
                }
 
@@ -376,6 +381,7 @@ class SpecialTags extends SpecialPage {
 
                $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( 'delete' )->getLocalURL() );
+               // @phan-suppress-next-line PhanUndeclaredProperty
                $form->tagAction = 'delete'; // custom property on HTMLForm object
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
                $form->setSubmitTextMsg( 'tags-delete-submit' );
@@ -388,7 +394,9 @@ class SpecialTags extends SpecialPage {
                $actionStr = $activate ? 'activate' : 'deactivate';
 
                $user = $this->getUser();
-               if ( !$user->isAllowed( 'managechangetags' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'managechangetags' ) ) {
                        throw new PermissionsError( 'managechangetags' );
                }
 
@@ -426,6 +434,7 @@ class SpecialTags extends SpecialPage {
 
                $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( $actionStr )->getLocalURL() );
+               // @phan-suppress-next-line PhanUndeclaredProperty
                $form->tagAction = $actionStr;
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
                // tags-activate-submit, tags-deactivate-submit
@@ -434,6 +443,12 @@ class SpecialTags extends SpecialPage {
                $form->show();
        }
 
+       /**
+        * @param array $data
+        * @param HTMLForm $form
+        * @return bool
+        * @suppress PhanUndeclaredProperty $form->tagAction
+        */
        public function processTagForm( array $data, HTMLForm $form ) {
                $context = $form->getContext();
                $out = $context->getOutput();
index 9b8022b..931b179 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\MediaWikiServices;
 
 /**
  * A special page for unblocking users
@@ -208,7 +209,10 @@ class SpecialUnblock extends SpecialPage {
 
                # If the name was hidden and the blocking user cannot hide
                # names, then don't allow any block removals...
-               if ( !$performer->isAllowed( 'hideuser' ) && $block->getHideName() ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $performer, 'hideuser' ) && $block->getHideName()
+               ) {
                        return [ 'unblock-hideuser' ];
                }
 
index 075b5df..c6f0721 100644 (file)
@@ -33,18 +33,28 @@ use Wikimedia\Rdbms\IResultWrapper;
  * @ingroup SpecialPage
  */
 class SpecialUndelete extends SpecialPage {
-       private $mAction;
-       private $mTarget;
-       private $mTimestamp;
-       private $mRestore;
-       private $mRevdel;
-       private $mInvert;
-       private $mFilename;
-       private $mTargetTimestamp;
-       private $mAllowed;
-       private $mCanView;
-       private $mComment;
-       private $mToken;
+       private $mAction;
+       private $mTarget;
+       private $mTimestamp;
+       private $mRestore;
+       private $mRevdel;
+       private $mInvert;
+       private $mFilename;
+       private $mTargetTimestamp;
+       private $mAllowed;
+       private $mCanView;
+       private $mComment;
+       private $mToken;
+       /** @var bool|null */
+       private $mPreview;
+       /** @var bool|null */
+       private $mDiff;
+       /** @var bool|null */
+       private $mDiffOnly;
+       /** @var bool|null */
+       private $mUnsuppress;
+       /** @var int[]|null */
+       private $mFileVersions;
 
        /** @var Title */
        private $mTargetObj;
@@ -92,7 +102,9 @@ class SpecialUndelete extends SpecialPage {
                $this->mDiff = $request->getCheck( 'diff' );
                $this->mDiffOnly = $request->getBool( 'diffonly', $this->getUser()->getOption( 'diffonly' ) );
                $this->mComment = $request->getText( 'wpComment' );
-               $this->mUnsuppress = $request->getVal( 'wpUnsuppress' ) && $user->isAllowed( 'suppressrevision' );
+               $this->mUnsuppress = $request->getVal( 'wpUnsuppress' ) && MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'suppressrevision' );
                $this->mToken = $request->getVal( 'token' );
 
                $block = $user->getBlock();
@@ -143,7 +155,7 @@ class SpecialUndelete extends SpecialPage {
                if ( $this->mTargetObj !== null ) {
                        return $permissionManager->userCan( $permission, $user, $this->mTargetObj );
                } else {
-                       return $user->isAllowed( $permission );
+                       return $permissionManager->userHasRight( $user, $permission );
                }
        }
 
@@ -169,7 +181,10 @@ class SpecialUndelete extends SpecialPage {
                        $out->addWikiMsg( 'undelete-header' );
 
                        # Not all users can just browse every deleted page from the list
-                       if ( $user->isAllowed( 'browsearchive' ) ) {
+                       if ( MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'browsearchive' )
+                       ) {
                                $this->showSearchForm();
                        }
 
@@ -764,7 +779,8 @@ class SpecialUndelete extends SpecialPage {
                LogEventsList::showLogExtract( $out, 'delete', $this->mTargetObj );
                # Show relevant lines from the suppression log:
                $suppressLogPage = new LogPage( 'suppress' );
-               if ( $this->getUser()->isAllowed( 'suppressionlog' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $this->getUser(), 'suppressionlog' ) ) {
                        $out->addHTML( Xml::element( 'h2', null, $suppressLogPage->getName()->text() ) . "\n" );
                        LogEventsList::showLogExtract( $out, 'suppress', $this->mTargetObj );
                }
@@ -816,7 +832,7 @@ class SpecialUndelete extends SpecialPage {
                                ] )
                        );
 
-                       if ( $this->getUser()->isAllowed( 'suppressrevision' ) ) {
+                       if ( $permissionManager->userHasRight( $this->getUser(), 'suppressrevision' ) ) {
                                $fields[] = new OOUI\FieldLayout(
                                        new OOUI\CheckboxInputWidget( [
                                                'name' => 'wpUnsuppress',
@@ -856,7 +872,7 @@ class SpecialUndelete extends SpecialPage {
                if ( $haveRevisions ) {
                        # Show the page's stored (deleted) history
 
-                       if ( $this->getUser()->isAllowed( 'deleterevision' ) ) {
+                       if ( $permissionManager->userHasRight( $this->getUser(), 'deleterevision' ) ) {
                                $history .= Html::element(
                                        'button',
                                        [
@@ -1200,7 +1216,8 @@ class SpecialUndelete extends SpecialPage {
                                '<div id="mw-error-cannotundelete">' .
                                $status->getWikiText(
                                        'cannotundelete',
-                                       'cannotundelete'
+                                       'cannotundelete',
+                                       $this->getLanguage()
                                ) . '</div>'
                        );
                }
@@ -1212,7 +1229,8 @@ class SpecialUndelete extends SpecialPage {
                                'error',
                                $status->getWikiText(
                                        'undelete-error-short',
-                                       'undelete-error-long'
+                                       'undelete-error-long',
+                                       $this->getLanguage()
                                )
                        );
                }
index 81c9d56..a2edca0 100644 (file)
@@ -311,16 +311,18 @@ class SpecialUpload extends SpecialPage {
        protected function showViewDeletedLinks() {
                $title = Title::makeTitleSafe( NS_FILE, $this->mDesiredDestName );
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                // Show a subtitle link to deleted revisions (to sysops et al only)
                if ( $title instanceof Title ) {
                        $count = $title->isDeleted();
-                       if ( $count > 0 && $user->isAllowed( 'deletedhistory' ) ) {
+                       if ( $count > 0 && $permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                                $restorelink = $this->getLinkRenderer()->makeKnownLink(
                                        SpecialPage::getTitleFor( 'Undelete', $title->getPrefixedText() ),
                                        $this->msg( 'restorelink' )->numParams( $count )->text()
                                );
-                               $link = $this->msg( $user->isAllowed( 'delete' ) ? 'thisisdeleted' : 'viewdeleted' )
-                                       ->rawParams( $restorelink )->parseAsBlock();
+                               $link = $this->msg(
+                                       $permissionManager->userHasRight( $user, 'delete' ) ? 'thisisdeleted' : 'viewdeleted'
+                               )->rawParams( $restorelink )->parseAsBlock();
                                $this->getOutput()->addHTML(
                                        Html::rawElement(
                                                'div',
@@ -486,7 +488,9 @@ class SpecialUpload extends SpecialPage {
                // Fetch the file if required
                $status = $this->mUpload->fetchFile();
                if ( !$status->isOK() ) {
-                       $this->showUploadError( $this->getOutput()->parseAsInterface( $status->getWikiText() ) );
+                       $this->showUploadError( $this->getOutput()->parseAsInterface(
+                               $status->getWikiText( false, false, $this->getLanguage() )
+                       ) );
 
                        return;
                }
@@ -557,7 +561,7 @@ class SpecialUpload extends SpecialPage {
                                $changeTags, $this->getUser() );
                        if ( !$changeTagsStatus->isOK() ) {
                                $this->showUploadError( $this->getOutput()->parseAsInterface(
-                                       $changeTagsStatus->getWikiText()
+                                       $changeTagsStatus->getWikiText( false, false, $this->getLanguage() )
                                ) );
 
                                return;
@@ -574,7 +578,9 @@ class SpecialUpload extends SpecialPage {
 
                if ( !$status->isGood() ) {
                        $this->showRecoverableUploadError(
-                               $this->getOutput()->parseAsInterface( $status->getWikiText() )
+                               $this->getOutput()->parseAsInterface(
+                                       $status->getWikiText( false, false, $this->getLanguage() )
+                               )
                        );
 
                        return;
index 5747f67..28626ea 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Special page to allow managing user group membership
  *
@@ -161,7 +163,10 @@ class UserrightsPage extends SpecialPage {
                         * (e.g. they don't have the userrights permission), then don't
                         * allow them to change any user rights.
                         */
-                       if ( !$user->isAllowed( 'userrights' ) ) {
+                       if ( !MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, 'userrights' )
+                       ) {
                                $block = $user->getBlock();
                                if ( $block && $block->isSitewide() ) {
                                        throw new UserBlockedError( $block );
@@ -172,7 +177,9 @@ class UserrightsPage extends SpecialPage {
 
                        // save settings
                        if ( !$fetchedStatus->isOK() ) {
-                               $this->getOutput()->addWikiTextAsInterface( $fetchedStatus->getWikiText() );
+                               $this->getOutput()->addWikiTextAsInterface(
+                                       $fetchedStatus->getWikiText( false, false, $this->getLanguage() )
+                               );
 
                                return;
                        }
@@ -203,7 +210,9 @@ class UserrightsPage extends SpecialPage {
                                        return;
                                } else {
                                        // Print an error message and redisplay the form
-                                       $out->wrapWikiTextAsInterface( 'error', $status->getWikiText() );
+                                       $out->wrapWikiTextAsInterface(
+                                               'error', $status->getWikiText( false, false, $this->getLanguage() )
+                                       );
                                }
                        }
                }
@@ -477,7 +486,9 @@ class UserrightsPage extends SpecialPage {
        function editUserGroupsForm( $username ) {
                $status = $this->fetchUser( $username, true );
                if ( !$status->isOK() ) {
-                       $this->getOutput()->addWikiTextAsInterface( $status->getWikiText() );
+                       $this->getOutput()->addWikiTextAsInterface(
+                               $status->getWikiText( false, false, $this->getLanguage() )
+                       );
 
                        return;
                }
@@ -515,7 +526,10 @@ class UserrightsPage extends SpecialPage {
                        if ( WikiMap::isCurrentWikiId( $dbDomain ) ) {
                                $dbDomain = '';
                        } else {
-                               if ( $writing && !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
+                               if ( $writing && !MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $this->getUser(), 'userrights-interwiki' )
+                               ) {
                                        return Status::newFatal( 'userrights-no-interwiki' );
                                }
                                if ( !UserRightsProxy::validDatabase( $dbDomain ) ) {
index 3d56330..84b3331 100644 (file)
@@ -381,12 +381,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                // Log entries with DELETED_ACTION must not show up unless the user has
                // the necessary rights.
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $bitmask = LogPage::DELETED_ACTION;
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
                } else {
                        $bitmask = 0;
index 2840086..5fe3605 100644 (file)
@@ -21,6 +21,7 @@
  * @todo Use some variant of Pager or something; the pagination here is lousy.
  */
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
@@ -416,7 +417,9 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                // if the page is editable, add an edit link
                if (
                        // check user permissions
-                       $this->getUser()->isAllowed( 'edit' ) &&
+                       MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'edit' ) &&
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $target )->supportsDirectEditing()
                ) {
index ea23973..36e14f0 100644 (file)
@@ -18,8 +18,6 @@
  * @file
  */
 
-use MediaWiki\MediaWikiServices;
-
 /**
  * Form to edit user preferences.
  *
@@ -29,8 +27,15 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
        // Override default value from HTMLForm
        protected $mSubSectionBeforeFields = false;
 
+       /** @var User|null */
        private $modifiedUser;
 
+       /** @var bool */
+       private $privateInfoEditable = true;
+
+       /** @var bool */
+       private $optionsEditable = true;
+
        /**
         * @param User $user
         */
@@ -49,6 +54,35 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
                }
        }
 
+       /**
+        * @return bool
+        */
+       public function isPrivateInfoEditable() {
+               return $this->privateInfoEditable;
+       }
+
+       /**
+        * Whether the
+        * @param bool $editable
+        */
+       public function setPrivateInfoEditable( $editable ) {
+               $this->privateInfoEditable = $editable;
+       }
+
+       /**
+        * @return bool
+        */
+       public function areOptionsEditable() {
+               return $this->optionsEditable;
+       }
+
+       /**
+        * @param bool $optionsEditable
+        */
+       public function setOptionsEditable( $optionsEditable ) {
+               $this->optionsEditable = $optionsEditable;
+       }
+
        /**
         * Get extra parameters for the query string when redirecting after
         * successful save.
@@ -73,16 +107,13 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
         * @return string
         */
        function getButtons() {
-               if ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $this->getModifiedUser(), 'editmyprivateinfo', 'editmyoptions' )
-               ) {
+               if ( !$this->areOptionsEditable() && !$this->isPrivateInfoEditable() ) {
                        return '';
                }
 
                $html = parent::getButtons();
 
-               if ( $this->getModifiedUser()->isAllowed( 'editmyoptions' ) ) {
+               if ( $this->areOptionsEditable() ) {
                        $t = $this->getTitle()->getSubpage( 'reset' );
 
                        $html .= new OOUI\ButtonWidget( [
@@ -109,6 +140,8 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
        function filterDataForSubmit( $data ) {
                foreach ( $this->mFlatFields as $fieldname => $field ) {
                        if ( $field instanceof HTMLNestedFilterable ) {
+                               // @phan-suppress-next-next-line PhanUndeclaredProperty All HTMLForm fields have mParams,
+                               // but the instanceof confuses phan, which doesn't support intersections
                                $info = $field->mParams;
                                $prefix = $info['prefix'] ?? $fieldname;
                                foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
index 1e5f816..0b4e058 100644 (file)
@@ -76,7 +76,10 @@ class UploadForm extends HTMLForm {
                parent::__construct( $descriptor, $context, 'upload' );
 
                # Add a link to edit MediaWiki:Licenses
-               if ( $this->getUser()->isAllowed( 'editinterface' ) ) {
+               if ( MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'editinterface' )
+               ) {
                        $this->getOutput()->addModuleStyles( 'mediawiki.special' );
                        $licensesLink = $linkRenderer->makeKnownLink(
                                $this->msg( 'licenses' )->inContentLanguage()->getTitle(),
index 0f5355d..c9c3b07 100644 (file)
@@ -19,6 +19,8 @@
  * @ingroup Pager
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class is used to get a list of active users. The ones with specials
  * rights (sysop, bureaucrat, developer) will have them displayed
@@ -43,6 +45,12 @@ class ActiveUsersPager extends UsersPager {
         */
        private $blockStatusByUid;
 
+       /** @var int */
+       private $RCMaxAge;
+
+       /** @var string[] */
+       private $excludegroups;
+
        /**
         * @param IContextSource|null $context
         * @param FormOptions $opts
@@ -118,7 +126,10 @@ class ActiveUsersPager extends UsersPager {
                        ] ];
                        $conds['ug2.ug_user'] = null;
                }
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                                 ->getPermissionManager()
+                                 ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
                                        'ipblocks', '1', [ 'ipb_user=user_id', 'ipb_deleted' => 1 ]
                                ) . ')';
index c804b09..6b8b93b 100644 (file)
@@ -46,6 +46,11 @@ class AllMessagesTablePager extends TablePager {
         */
        protected $prefix;
 
+       /**
+        * @var string
+        */
+       protected $suffix;
+
        /**
         * @var Language
         */
index 4441a33..718da6d 100644 (file)
@@ -137,7 +137,10 @@ class BlockListPager extends TablePager {
                                        $value,
                                        /* User preference timezone */true
                                ) );
-                               if ( $this->getUser()->isAllowed( 'block' ) ) {
+                               if ( MediaWikiServices::getInstance()
+                                               ->getPermissionManager()
+                                               ->userHasRight( $this->getUser(), 'block' )
+                               ) {
                                        $links = [];
                                        if ( $row->ipb_auto ) {
                                                $links[] = $linkRenderer->makeKnownLink(
@@ -358,7 +361,10 @@ class BlockListPager extends TablePager {
                $info['conds'][] = 'ipb_expiry > ' . $db->addQuotes( $db->timestamp() );
 
                # Is the user allowed to see hidden blocks?
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $info['conds']['ipb_deleted'] = 0;
                }
 
index d76dfb8..95749ba 100644 (file)
@@ -25,7 +25,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
@@ -269,6 +269,7 @@ class ContribsPager extends RangeChronologicalPager {
                        'options' => [],
                        'join_conds' => $revQuery['joins'],
                ];
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
                // WARNING: Keep this in sync with getTargetTable()!
                $user = User::newFromName( $this->target, false );
@@ -313,14 +314,11 @@ class ContribsPager extends RangeChronologicalPager {
                $queryInfo['conds'] = array_merge( $queryInfo['conds'], $this->getNamespaceCond() );
 
                // Paranoia: avoid brute force searches (T19342)
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $queryInfo['conds'][] = $this->mDb->bitAnd(
                                'rev_deleted', RevisionRecord::DELETED_USER
                                ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $queryInfo['conds'][] = $this->mDb->bitAnd(
                                'rev_deleted', RevisionRecord::SUPPRESSED_USER
                                ) . ' != ' . RevisionRecord::SUPPRESSED_USER;
index cd6294d..0ff54fd 100644 (file)
@@ -24,7 +24,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
@@ -90,13 +90,11 @@ class DeletedContribsPager extends IndexPager {
                ];
                $conds = array_merge( $userCond, $this->getNamespaceCond() );
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                // Paranoia: avoid brute force searches (T19792)
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', RevisionRecord::DELETED_USER ) . ' = 0';
-               } elseif ( !MediaWikiServices::getInstance()
-                       ->getPermissionManager()
-                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
-               ) {
+               } elseif ( !$permissionManager->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' ) ) {
                        $conds[] = $this->mDb->bitAnd( 'ar_deleted', RevisionRecord::SUPPRESSED_USER ) .
                                ' != ' . RevisionRecord::SUPPRESSED_USER;
                }
@@ -325,8 +323,9 @@ class DeletedContribsPager extends IndexPager {
                );
 
                $user = $this->getUser();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
 
-               if ( $user->isAllowed( 'deletedtext' ) ) {
+               if ( $permissionManager->userHasRight( $user, 'deletedtext' ) ) {
                        $last = $linkRenderer->makeKnownLink(
                                $undelete,
                                $this->messages['diff'],
@@ -344,7 +343,9 @@ class DeletedContribsPager extends IndexPager {
                $comment = Linker::revComment( $rev );
                $date = $this->getLanguage()->userTimeAndDate( $rev->getTimestamp(), $user );
 
-               if ( !$user->isAllowed( 'undelete' ) || !$rev->userCan( RevisionRecord::DELETED_TEXT, $user ) ) {
+               if ( !$permissionManager->userHasRight( $user, 'undelete' ) ||
+                        !$rev->userCan( RevisionRecord::DELETED_TEXT, $user )
+               ) {
                        $link = htmlspecialchars( $date ); // unusable link
                } else {
                        $link = $linkRenderer->makeKnownLink(
index 9415cea..81c3ffb 100644 (file)
@@ -30,10 +30,15 @@ class MergeHistoryPager extends ReverseChronologicalPager {
        /** @var array */
        public $mConds;
 
+       /** @var int */
+       private $articleID;
+
+       /** @var int */
+       private $maxTimestamp;
+
        public function __construct( SpecialMergeHistory $form, $conds, Title $source, Title $dest ) {
                $this->mForm = $form;
                $this->mConds = $conds;
-               $this->title = $source;
                $this->articleID = $source->getArticleID();
 
                $dbr = wfGetDB( DB_REPLICA );
index be4a1bd..9a78c5d 100644 (file)
@@ -64,11 +64,11 @@ class NewFilesPager extends RangeChronologicalPager {
        function getQueryInfo() {
                $opts = $this->opts;
                $conds = [];
-               $imgQuery = LocalFile::getQueryInfo();
-               $tables = $imgQuery['tables'];
-               $fields = [ 'img_name', 'img_timestamp' ] + $imgQuery['fields'];
+               $actorQuery = ActorMigration::newMigration()->getJoin( 'img_user' );
+               $tables = [ 'image' ] + $actorQuery['tables'];
+               $fields = [ 'img_name', 'img_timestamp' ] + $actorQuery['fields'];
                $options = [];
-               $jconds = $imgQuery['joins'];
+               $jconds = $actorQuery['joins'];
 
                $user = $opts->getValue( 'user' );
                if ( $user !== '' ) {
@@ -89,7 +89,7 @@ class NewFilesPager extends RangeChronologicalPager {
                                        'LEFT JOIN',
                                        [
                                                'ug_group' => $groupsWithBotPermission,
-                                               'ug_user = ' . $imgQuery['fields']['img_user'],
+                                               'ug_user = ' . $actorQuery['fields']['img_user'],
                                                'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ]
                                ];
@@ -107,7 +107,7 @@ class NewFilesPager extends RangeChronologicalPager {
                                'JOIN',
                                [
                                        'rc_title = img_name',
-                                       'rc_actor = ' . $imgQuery['fields']['img_actor'],
+                                       'rc_actor = ' . $actorQuery['fields']['img_actor'],
                                        'rc_timestamp = img_timestamp'
                                ]
                        ];
index 747dea2..bb5592c 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 use MediaWiki\Linker\LinkRenderer;
+use MediaWiki\MediaWikiServices;
 
 class ProtectedPagesPager extends TablePager {
 
@@ -159,7 +160,10 @@ class ProtectedPagesPager extends TablePager {
                                $formatted = htmlspecialchars( $this->getLanguage()->formatExpiry(
                                        $value, /* User preference timezone */true ) );
                                $title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
-                               if ( $this->getUser()->isAllowed( 'protect' ) && $title ) {
+                               if ( $title && MediaWikiServices::getInstance()
+                                                ->getPermissionManager()
+                                                ->userHasRight( $this->getUser(), 'protect' )
+                               ) {
                                        $changeProtection = $linkRenderer->makeKnownLink(
                                                $title,
                                                $this->msg( 'protect_change' )->text(),
index 296fe11..a00b371 100644 (file)
@@ -34,6 +34,12 @@ class ProtectedTitlesPager extends AlphabeticPager {
         */
        public $mConds;
 
+       /** @var string|null */
+       private $level;
+
+       /** @var int|null */
+       private $namespace;
+
        /**
         * @param SpecialProtectedtitles $form
         * @param array $conds
@@ -50,7 +56,6 @@ class ProtectedTitlesPager extends AlphabeticPager {
                $this->mConds = $conds;
                $this->level = $level;
                $this->namespace = $namespace;
-               $this->size = intval( $size );
                parent::__construct( $form->getContext() );
        }
 
@@ -90,7 +95,7 @@ class ProtectedTitlesPager extends AlphabeticPager {
                        $conds['pt_create_perm'] = $this->level;
                }
 
-               if ( !is_null( $this->namespace ) ) {
+               if ( $this->namespace !== null ) {
                        $conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace );
                }
 
index 57b575b..ee0ac00 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Pager
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This class is used to get a list of user. The ones with specials
  * rights (sysop, bureaucrat, developer) will have them displayed
@@ -37,6 +39,24 @@ class UsersPager extends AlphabeticPager {
         */
        protected $userGroupCache;
 
+       /** @var string */
+       protected $requestedGroup;
+
+       /** @var bool */
+       protected $editsOnly;
+
+       /** @var bool */
+       protected $temporaryGroupsOnly;
+
+       /** @var bool */
+       protected $creationSort;
+
+       /** @var bool|null */
+       protected $including;
+
+       /** @var string */
+       protected $requestedUser;
+
        /**
         * @param IContextSource|null $context
         * @param array|null $par (Default null)
@@ -105,7 +125,10 @@ class UsersPager extends AlphabeticPager {
                $conds = [];
 
                // Don't show hidden names
-               if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $this->getUser(), 'hideuser' )
+               ) {
                        $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
                }
 
index 3bd66d4..3ebb443 100644 (file)
@@ -237,6 +237,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param LinkTarget $title
         *
         * @return string
+        * @suppress PhanUndeclaredProperty
         */
        public function getPrefixedText( LinkTarget $title ) {
                if ( !isset( $title->prefixedText ) ) {
index 3368e29..f60c4e3 100644 (file)
  * @file
  * @ingroup Upload
  */
+
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Shell\Shell;
+use MediaWiki\User\UserIdentity;
 
 /**
  * @defgroup Upload Upload related
@@ -145,12 +148,13 @@ abstract class UploadBase {
         * identifying the missing permission.
         * Can be overridden by subclasses.
         *
-        * @param User $user
+        * @param UserIdentity $user
         * @return bool|string
         */
-       public static function isAllowed( $user ) {
+       public static function isAllowed( UserIdentity $user ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                foreach ( [ 'upload', 'edit' ] as $permission ) {
-                       if ( !$user->isAllowed( $permission ) ) {
+                       if ( !$permissionManager->userHasRight( $user, $permission ) ) {
                                return $permission;
                        }
                }
@@ -1312,7 +1316,7 @@ abstract class UploadBase {
                        $enc = null;
                }
 
-               if ( $enc ) {
+               if ( $enc !== null ) {
                        $chunk = iconv( $enc, "ASCII//IGNORE", $chunk );
                }
 
@@ -1954,7 +1958,10 @@ abstract class UploadBase {
                 * wfFindFile finds a file, it exists in a shared repository.
                 */
                $file = wfFindFile( $this->getTitle(), [ 'latest' => true ] );
-               if ( $file && !$user->isAllowed( 'reupload-shared' ) ) {
+               if ( $file && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'reupload-shared' )
+               ) {
                        return [ 'fileexists-shared-forbidden', $file->getName() ];
                }
 
@@ -1969,9 +1976,10 @@ abstract class UploadBase {
         * @return bool
         */
        public static function userCanReUpload( User $user, File $img ) {
-               if ( $user->isAllowed( 'reupload' ) ) {
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
+               if ( $permissionManager->userHasRight( $user, 'reupload' ) ) {
                        return true; // non-conditional
-               } elseif ( !$user->isAllowed( 'reupload-own' ) ) {
+               } elseif ( !$permissionManager->userHasRight( $user, 'reupload-own' ) ) {
                        return false;
                }
 
index b92fcc5..b87810d 100644 (file)
@@ -1,7 +1,4 @@
 <?php
-
-use MediaWiki\MediaWikiServices;
-
 /**
  * Backend for uploading files from a HTTP resource.
  *
@@ -24,6 +21,9 @@ use MediaWiki\MediaWikiServices;
  * @ingroup Upload
  */
 
+use MediaWiki\MediaWikiServices;
+use MediaWiki\User\UserIdentity;
+
 /**
  * Implements uploading from a HTTP resource.
  *
@@ -43,12 +43,15 @@ class UploadFromUrl extends UploadBase {
         * user is not allowed, return the name of the user right as a string. If
         * the user is allowed, have the parent do further permissions checking.
         *
-        * @param User $user
+        * @param UserIdentity $user
         *
         * @return bool|string
         */
-       public static function isAllowed( $user ) {
-               if ( !$user->isAllowed( 'upload_by_url' ) ) {
+       public static function isAllowed( UserIdentity $user ) {
+               if ( !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $user, 'upload_by_url' )
+               ) {
                        return 'upload_by_url';
                }
 
@@ -167,7 +170,9 @@ class UploadFromUrl extends UploadBase {
                $url = $request->getVal( 'wpUploadFileURL' );
 
                return !empty( $url )
-                       && $wgUser->isAllowed( 'upload_by_url' );
+                       && MediaWikiServices::getInstance()
+                                  ->getPermissionManager()
+                                  ->userHasRight( $wgUser, 'upload_by_url' );
        }
 
        /**
index ca3db5b..4c9099e 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * A CentralIdLookup provider that just uses local IDs. Useful if the wiki
  * isn't part of a cluster or you're using shared user tables.
@@ -69,7 +71,10 @@ class LocalIdLookup extends CentralIdLookup {
                        'user_id' => array_map( 'intval', array_keys( $idToName ) ),
                ];
                $join = [];
-               if ( $audience && !$audience->isAllowed( 'hideuser' ) ) {
+               if ( $audience && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $audience, 'hideuser' )
+               ) {
                        $tables[] = 'ipblocks';
                        $join['ipblocks'] = [ 'LEFT JOIN', 'ipb_user=user_id' ];
                        $fields[] = 'ipb_deleted';
@@ -100,7 +105,10 @@ class LocalIdLookup extends CentralIdLookup {
                        'user_name' => array_map( 'strval', array_keys( $nameToId ) ),
                ];
                $join = [];
-               if ( $audience && !$audience->isAllowed( 'hideuser' ) ) {
+               if ( $audience && !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $audience, 'hideuser' )
+               ) {
                        $tables[] = 'ipblocks';
                        $join['ipblocks'] = [ 'LEFT JOIN', 'ipb_user=user_id' ];
                        $where[] = 'ipb_deleted = 0 OR ipb_deleted IS NULL';
index fd8eb3f..38707de 100644 (file)
@@ -22,6 +22,7 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\TemporaryPasswordAuthenticationRequest;
+use MediaWiki\Permissions\PermissionManager;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use MediaWiki\Logger\LoggerFactory;
@@ -40,6 +41,9 @@ class PasswordReset implements LoggerAwareInterface {
        /** @var AuthManager */
        protected $authManager;
 
+       /** @var PermissionManager */
+       private $permissionManager;
+
        /** @var LoggerInterface */
        protected $logger;
 
@@ -50,9 +54,14 @@ class PasswordReset implements LoggerAwareInterface {
         */
        private $permissionCache;
 
-       public function __construct( Config $config, AuthManager $authManager ) {
+       public function __construct(
+               Config $config,
+               AuthManager $authManager,
+               PermissionManager $permissionManager
+       ) {
                $this->config = $config;
                $this->authManager = $authManager;
+               $this->permissionManager = $permissionManager;
                $this->permissionCache = new MapCacheLRU( 1 );
                $this->logger = LoggerFactory::getInstance( 'authentication' );
        }
@@ -93,7 +102,7 @@ class PasswordReset implements LoggerAwareInterface {
                        } elseif ( !$this->config->get( 'EnableEmail' ) ) {
                                // Maybe email features have been disabled
                                $status = StatusValue::newFatal( 'passwordreset-emaildisabled' );
-                       } elseif ( !$user->isAllowed( 'editmyprivateinfo' ) ) {
+                       } elseif ( !$this->permissionManager->userHasRight( $user, 'editmyprivateinfo' ) ) {
                                // Maybe not all users have permission to change private data
                                $status = StatusValue::newFatal( 'badaccess' );
                        } elseif ( $this->isBlocked( $user ) ) {
index 3e84b0b..fc96fe1 100644 (file)
@@ -1718,9 +1718,31 @@ class User implements IDBAccessObject, UserIdentity {
                // overwriting mBlockedby, surely?
                $this->load();
 
+               // TODO: Block checking shouldn't really be done from the User object. Block
+               // checking can involve checking for IP blocks, cookie blocks, and/or XFF blocks,
+               // which need more knowledge of the request context than the User should have.
+               // Since we do currently check blocks from the User, we have to do the following
+               // here:
+               // - Check if this is the user associated with the main request
+               // - If so, pass the relevant request information to the block manager
+               $request = null;
+
+               // The session user is set up towards the end of Setup.php. Until then,
+               // assume it's a logged-out user.
+               $sessionUser = RequestContext::getMain()->getUser();
+               $globalUserName = $sessionUser->isSafeToLoad()
+                       ? $sessionUser->getName()
+                       : IP::sanitizeIP( $sessionUser->getRequest()->getIP() );
+
+               if ( $this->getName() === $globalUserName ) {
+                       // This is the global user, so we need to pass the request
+                       $request = $this->getRequest();
+               }
+
                // @phan-suppress-next-line PhanAccessMethodInternal It's the only allowed use
                $block = MediaWikiServices::getInstance()->getBlockManager()->getUserBlock(
                        $this,
+                       $request,
                        $fromReplica
                );
 
@@ -1741,7 +1763,7 @@ class User implements IDBAccessObject, UserIdentity {
                // Avoid PHP 7.1 warning of passing $this by reference
                $thisUser = $this;
                // Extensions
-               Hooks::run( 'GetBlockedStatus', [ &$thisUser ] );
+               Hooks::run( 'GetBlockedStatus', [ &$thisUser ], '1.34' );
        }
 
        /**
@@ -2772,18 +2794,6 @@ class User implements IDBAccessObject, UserIdentity {
                }
        }
 
-       /**
-        * Set the password for a password reminder or new account email
-        *
-        * @deprecated Removed in 1.27. Use PasswordReset instead.
-        * @param string $str New password to set or null to set an invalid
-        *  password hash meaning that the user will not be able to use it
-        * @param bool $throttle If true, reset the throttle timestamp to the present
-        */
-       public function setNewpassword( $str, $throttle = true ) {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
        /**
         * Get the user's e-mail address
         * @return string User's email address
@@ -3716,11 +3726,17 @@ class User implements IDBAccessObject, UserIdentity {
                                $this->setNewtalk( false );
 
                                // If there is a new, unseen, revision, use its timestamp
-                               $nextid = $oldid
-                                       ? $title->getNextRevisionID( $oldid, Title::READ_LATEST )
-                                       : null;
-                               if ( $nextid ) {
-                                       $this->setNewtalk( true, Revision::newFromId( $nextid ) );
+                               if ( $oldid ) {
+                                       $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+                                       $oldRev = $rl->getRevisionById( $oldid, Title::READ_LATEST );
+                                       if ( $oldRev ) {
+                                               $newRev = $rl->getNextRevision( $oldRev );
+                                               if ( $newRev ) {
+                                                       // TODO: actually no need to wrap in a revision,
+                                                       // setNewtalk really only needs a RevRecord
+                                                       $this->setNewtalk( true, new Revision( $newRev ) );
+                                               }
+                                       }
                                }
                        } );
                }
@@ -4298,13 +4314,13 @@ class User implements IDBAccessObject, UserIdentity {
                                'password' => $password,
                        ]
                );
-               $res = AuthManager::singleton()->beginAuthentication( $reqs, 'null:' );
+               $res = $manager->beginAuthentication( $reqs, 'null:' );
                switch ( $res->status ) {
                        case AuthenticationResponse::PASS:
                                return true;
                        case AuthenticationResponse::FAIL:
                                // Hope it's not a PreAuthenticationProvider that failed...
-                               \MediaWiki\Logger\LoggerFactory::getInstance( 'authentication' )
+                               LoggerFactory::getInstance( 'authentication' )
                                        ->info( __METHOD__ . ': Authentication failed: ' . $res->message->plain() );
                                return false;
                        default:
index c185bab..b3489a2 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Handles searching prefixes of user names
  *
@@ -46,7 +48,10 @@ class UserNamePrefixSearch {
                $joinConds = [];
 
                // Filter out hidden user names
-               if ( $audience === 'public' || !$audience->isAllowed( 'hideuser' ) ) {
+               if ( $audience === 'public' || !MediaWikiServices::getInstance()
+                               ->getPermissionManager()
+                               ->userHasRight( $audience, 'hideuser' )
+               ) {
                        $tables[] = 'ipblocks';
                        $cond['ipb_deleted'] = [ 0, null ];
                        $joinConds['ipblocks'] = [ 'LEFT JOIN', 'user_id=ipb_user' ];
index f3a8810..77ea3d9 100644 (file)
@@ -34,7 +34,7 @@ class AvroValidator {
         * @return string|string[] An error or list of errors in the
         *  provided $datum. When no errors exist the empty array is
         *  returned.
-        * @suppress PhanUndeclaredMethod
+        * @suppress PhanUndeclaredMethod,PhanUndeclaredProperty
         */
        public static function getErrors( AvroSchema $schema, $datum ) {
                switch ( $schema->type ) {
index df5ea70..d8e4985 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Permissions\PermissionManager;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\User\UserIdentity;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
@@ -70,16 +71,21 @@ class WatchedItemQueryService {
        /** @var WatchedItemStoreInterface */
        private $watchedItemStore;
 
+       /** @var PermissionManager */
+       private $permissionManager;
+
        public function __construct(
                ILoadBalancer $loadBalancer,
                CommentStore $commentStore,
                ActorMigration $actorMigration,
-               WatchedItemStoreInterface $watchedItemStore
+               WatchedItemStoreInterface $watchedItemStore,
+               PermissionManager $permissionManager
        ) {
                $this->loadBalancer = $loadBalancer;
                $this->commentStore = $commentStore;
                $this->actorMigration = $actorMigration;
                $this->watchedItemStore = $watchedItemStore;
+               $this->permissionManager = $permissionManager;
        }
 
        /**
@@ -549,7 +555,7 @@ class WatchedItemQueryService {
                return $conds;
        }
 
-       private function getUserRelatedConds( IDatabase $db, User $user, array $options ) {
+       private function getUserRelatedConds( IDatabase $db, UserIdentity $user, array $options ) {
                if ( !array_key_exists( 'onlyByUser', $options ) && !array_key_exists( 'notByUser', $options ) ) {
                        return [];
                }
@@ -566,9 +572,11 @@ class WatchedItemQueryService {
 
                // Avoid brute force searches (T19342)
                $bitmask = 0;
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$this->permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $bitmask = RevisionRecord::DELETED_USER;
-               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
+               } elseif ( !$this->permissionManager
+                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
+               ) {
                        $bitmask = RevisionRecord::DELETED_USER | RevisionRecord::DELETED_RESTRICTED;
                }
                if ( $bitmask ) {
@@ -578,13 +586,15 @@ class WatchedItemQueryService {
                return $conds;
        }
 
-       private function getExtraDeletedPageLogEntryRelatedCond( IDatabase $db, User $user ) {
+       private function getExtraDeletedPageLogEntryRelatedCond( IDatabase $db, UserIdentity $user ) {
                // LogPage::DELETED_ACTION hides the affected page, too. So hide those
                // entirely from the watchlist, or someone could guess the title.
                $bitmask = 0;
-               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+               if ( !$this->permissionManager->userHasRight( $user, 'deletedhistory' ) ) {
                        $bitmask = LogPage::DELETED_ACTION;
-               } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
+               } elseif ( !$this->permissionManager
+                       ->userHasAnyRight( $user, 'suppressrevision', 'viewsuppressed' )
+               ) {
                        $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED;
                }
                if ( $bitmask ) {
index 06d8095..3ae00ea 100644 (file)
@@ -9,14 +9,22 @@ namespace MediaWiki\Widget;
  * @license MIT
  */
 class CheckMatrixWidget extends \OOUI\Widget {
-
-       protected $name = '';
-       protected $columns = [];
-       protected $rows = [];
-       protected $tooltips = [];
-       protected $values = [];
-       protected $forcedOn = [];
-       protected $forcedOff = [];
+       /** @var string|null */
+       protected $name;
+       /** @var string|null */
+       protected $id;
+       /** @var array */
+       protected $columns;
+       /** @var array */
+       protected $rows;
+       /** @var array */
+       protected $tooltips;
+       /** @var array */
+       protected $values;
+       /** @var array */
+       protected $forcedOn;
+       /** @var array */
+       protected $forcedOff;
 
        /**
         * Operates similarly to MultiSelectWidget, but instead of using an array of
index 7737067..913816c 100644 (file)
@@ -9,7 +9,8 @@ namespace MediaWiki\Widget;
  * @license MIT
  */
 class ComplexTitleInputWidget extends \OOUI\Widget {
-
+       /** @var array */
+       protected $config;
        protected $namespace = null;
        protected $title = null;
 
index 7802a2a..a360fb8 100644 (file)
@@ -9,8 +9,10 @@ namespace MediaWiki\Widget;
  * @license MIT
  */
 class NamespaceInputWidget extends \OOUI\DropdownInputWidget {
-
-       protected $includeAllValue = null;
+       /** @var string */
+       protected $includeAllValue;
+       /** @var int[] */
+       protected $exclude;
 
        /**
         * @param array $config Configuration options
index a946653..a792172 100644 (file)
@@ -12,9 +12,12 @@ use OOUI\TextInputWidget;
  * @license MIT
  */
 class SelectWithInputWidget extends \OOUI\Widget {
-
-       protected $textinput = null;
-       protected $dropdowninput = null;
+       /** @var array */
+       protected $config;
+       /** @var TextInputWidget */
+       protected $textinput;
+       /** @var DropdownInputWidget */
+       protected $dropdowninput;
 
        /**
         * A version of the SelectWithInputWidget, with `or` set to true.
index 18c05bf..26935b1 100644 (file)
@@ -13,9 +13,14 @@ use \OOUI\LabelWidget;
  * @license MIT
  */
 class SizeFilterWidget extends \OOUI\Widget {
-
-       protected $radioselectinput = null;
-       protected $textinput = null;
+       /** @var array */
+       protected $config;
+       /** @var LabelWidget */
+       protected $label;
+       /** @var RadioSelectInputWidget */
+       protected $radioselectinput;
+       /** @var TextInputWidget */
+       protected $textinput;
 
        /**
         * RadioSelectInputWidget and a TextInputWidget to set minimum or maximum byte size
index 43e184c..e96160c 100644 (file)
@@ -12,41 +12,34 @@ use OOUI\MultilineTextInputWidget;
  * @license MIT
  */
 abstract class TagMultiselectWidget extends \OOUI\Widget {
-
-       protected $selectedArray = [];
-       protected $inputName = null;
-       protected $inputPlaceholder = null;
-       protected $tagLimit = null;
+       /** @var array */
+       protected $selectedArray;
+       /** @var string|null */
+       protected $inputName;
+       /** @var string|null */
+       protected $inputPlaceholder;
+       /** @var array */
+       protected $input;
+       /** @var int|null */
+       protected $tagLimit;
 
        /**
         * @param array $config Configuration options
         *   - array $config['default'] Array of items to use as preset data
-        *   - array $config['name'] Name attribute (used in forms)
-        *   - array $config['placeholder'] Placeholder message for input
+        *   - string $config['name'] Name attribute (used in forms)
+        *   - string $config['placeholder'] Placeholder message for input
         *   - array $config['input'] Config options for the input widget
-        *   - number $config['tagLimit'] Maximum number of selected items
+        *   - int $config['tagLimit'] Maximum number of selected items
         */
        public function __construct( array $config = [] ) {
                parent::__construct( $config );
 
                // Properties
-               if ( isset( $config['default'] ) ) {
-                       $this->selectedArray = $config['default'];
-               }
-               if ( isset( $config['name'] ) ) {
-                       $this->inputName = $config['name'];
-               }
-               if ( isset( $config['placeholder'] ) ) {
-                       $this->inputPlaceholder = $config['placeholder'];
-               }
-               if ( isset( $config['input'] ) ) {
-                       $this->input = $config['input'];
-               } else {
-                       $this->input = [];
-               }
-               if ( isset( $config['tagLimit'] ) ) {
-                       $this->tagLimit = $config['tagLimit'];
-               }
+               $this->selectedArray = $config['default'] ?? [];
+               $this->inputName = $config['name'] ?? null;
+               $this->inputPlaceholder = $config['placeholder'] ?? null;
+               $this->input = $config['input'] ?? [];
+               $this->tagLimit = $config['tagLimit'] ?? null;
 
                $textarea = new MultilineTextInputWidget( array_merge( [
                        'name' => $this->inputName,
index 6ba7796..e675889 100644 (file)
@@ -12,7 +12,7 @@
        "--exclude": [
                "resources/src/jquery.tablesorter",
                "resources/src/jquery.tipsy",
-               "resources/src/jquery/jquery.color.js",
+               "resources/src/jquery.color/jquery.color.js",
                "resources/src/jquery/jquery.highlightText.js",
                "resources/src/jquery/jquery.mw-jump.js",
                "resources/src/mediawiki.base/legacy.wikibits.js",
index 9886425..f42bb88 100644 (file)
@@ -21,7 +21,7 @@
 use MediaWiki\MediaWikiServices;
 
 use MediaWiki\Logger\LoggerFactory;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Base class for language conversion.
index 353127d..783a211 100644 (file)
@@ -80,7 +80,7 @@ class Names {
                'az' => 'azərbaycanca', # Azerbaijani
                'azb' => 'تۆرکجه', # South Azerbaijani
                'ba' => 'башҡортса', # Bashkir
-               'ban' => 'Basa Bali', # Balinese
+               'ban' => 'Bali', # Balinese
                'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
                'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 639-3 since 2010-06-30 )
                'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
index 0a15530..8fe3be3 100644 (file)
@@ -2982,7 +2982,7 @@ public static $zh2Hant = [
 '𫄨' => '絺',
 '𫄷' => '繶',
 '𫄸' => '纁',
-'ð«\87­' => 'è\94¿',
+'ð«\87­' => 'è\92\8d',
 '𫌀' => '襀',
 '𫌨' => '覼',
 '𫍙' => '訑',
@@ -3707,6 +3707,8 @@ public static $zh2Hant = [
 '于少保' => '于少保',
 '于山国' => '于山國',
 '于山國' => '于山國',
+'于山岛' => '于山島',
+'于山島' => '于山島',
 '于帅' => '于帥',
 '于帥' => '于帥',
 '于幼军' => '于幼軍',
@@ -3724,7 +3726,6 @@ public static $zh2Hant = [
 '于志寧' => '于志寧',
 '于忠肃集' => '于忠肅集',
 '于忠肅集' => '于忠肅集',
-'于思' => '于思',
 '于慎行' => '于慎行',
 '于慧' => '于慧',
 '于成龍' => '于成龍',
@@ -3817,6 +3818,7 @@ public static $zh2Hant = [
 '于都县' => '于都縣',
 '于都縣' => '于都縣',
 '于里察' => '于里察',
+'于闐' => '于闐',
 '于阗' => '于闐',
 '于双戈' => '于雙戈',
 '于雙戈' => '于雙戈',
@@ -4114,6 +4116,7 @@ public static $zh2Hant = [
 '党進' => '党進',
 '党項' => '党項',
 '党项' => '党項',
+'入侵并' => '入侵並',
 '内脏' => '內臟',
 '内制' => '內製',
 '内面包' => '內面包',
@@ -4470,6 +4473,8 @@ public static $zh2Hant = [
 '叮叮当当' => '叮叮噹噹',
 '叮当' => '叮噹',
 '可紧可松' => '可緊可鬆',
+'可能干預' => '可能干預',
+'可能干预' => '可能干預',
 '可自制' => '可自制',
 '可鉴' => '可鑑',
 '台子女' => '台子女',
@@ -4802,7 +4807,7 @@ public static $zh2Hant = [
 '大型钟面' => '大型鐘面',
 '大多只' => '大多只',
 '大伙' => '大夥',
-'大干' => '大幹',
+'大干一' => '大幹一',
 '大批涌到' => '大批湧到',
 '大折儿' => '大摺兒',
 '大明历' => '大明曆',
@@ -5527,6 +5532,8 @@ public static $zh2Hant = [
 '恶直丑正' => '惡直醜正',
 '恶斗' => '惡鬥',
 '惴栗' => '惴慄',
+'意大利面临' => '意大利面臨',
+'意大利面臨' => '意大利面臨',
 '意大利面' => '意大利麵',
 '愛河里花子' => '愛河里花子',
 '爱河里花子' => '愛河里花子',
@@ -5991,6 +5998,8 @@ public static $zh2Hant = [
 '方向' => '方向',
 '方法里' => '方法裡',
 '于吉林' => '於吉林',
+'于格林' => '於格林',
+'于越南' => '於越南',
 '于震中' => '於震中',
 '于震前' => '於震前',
 '于震后' => '於震後',
@@ -6474,6 +6483,8 @@ public static $zh2Hant = [
 '浅淀' => '淺澱',
 '清心寡欲' => '清心寡欲',
 '渠冲' => '渠衝',
+'温岚' => '温嵐',
+'温嵐' => '温嵐',
 '测不准' => '測不準',
 '港制' => '港製',
 '游离' => '游離',
@@ -6699,6 +6710,7 @@ public static $zh2Hant = [
 '版本里' => '版本裡',
 '牙签' => '牙籤',
 '牛只' => '牛隻',
+'牢里' => '牢裡',
 '物欲' => '物慾',
 '抵牾' => '牴牾',
 '抵触' => '牴觸',
@@ -7028,7 +7040,6 @@ public static $zh2Hant = [
 '称赞' => '稱讚',
 '稻谷' => '稻穀',
 '稽征' => '稽徵',
-'谷人' => '穀人',
 '谷保家商' => '穀保家商',
 '谷仓' => '穀倉',
 '谷圭' => '穀圭',
@@ -7656,6 +7667,7 @@ public static $zh2Hant = [
 '药签' => '藥籤',
 '药面儿' => '藥麵兒',
 '苏昆' => '蘇崑',
+'𬞟' => '蘋',
 '苹婆' => '蘋婆',
 '苹果' => '蘋果',
 '苹果干' => '蘋果乾',
@@ -7751,6 +7763,7 @@ public static $zh2Hant = [
 '袋表' => '袋錶',
 '袖里' => '袖裡',
 '被废后' => '被廢後',
+'被卷回' => '被捲回',
 '被系上' => '被繫上',
 '被里' => '被裡',
 '被夸' => '被誇',
@@ -9319,6 +9332,7 @@ public static $zh2Hant = [
 '鹰雕' => '鹰鵰',
 '鹰鵰' => '鹰鵰',
 '咸、甜' => '鹹、甜',
+'咸吃' => '鹹吃',
 '咸味' => '鹹味',
 '咸嘴淡舌' => '鹹嘴淡舌',
 '咸土' => '鹹土',
@@ -11458,6 +11472,7 @@ public static $zh2Hans = [
 '葦' => '苇',
 '葯' => '药',
 '葷' => '荤',
+'蒍' => '𫇭',
 '蒓' => '莼',
 '蒔' => '莳',
 '蒞' => '莅',
@@ -13699,6 +13714,7 @@ public static $zh2Hans = [
 '孫乾' => '孙乾',
 '宏碁' => '宏碁',
 '官陞' => '官升',
+'尋陞' => '寻升',
 '將軍抽俥' => '将军抽俥',
 '將軍抽車' => '将军抽車',
 '爾冬陞' => '尔冬升',
@@ -14152,7 +14168,10 @@ public static $zh2TW = [
 '克罗地亚' => '克羅埃西亞',
 '克羅地亞' => '克羅埃西亞',
 '克里斯托弗' => '克里斯多福',
+'全角' => '全形',
 '万维网' => '全球資訊網',
+'全角度' => '全角度',
+'全角色' => '全角色',
 '八杆' => '八桿',
 '公共交通' => '公共運輸',
 '六杆' => '六桿',
@@ -14259,6 +14278,7 @@ public static $zh2TW = [
 '塞维利亚' => '塞維亞',
 '西維爾' => '塞維亞',
 '塞黑' => '塞蒙',
+'多美和普林西比' => '多美普林西比',
 '塔希提' => '大溪地',
 '共和联邦' => '大英國協',
 '英联邦' => '大英國協',
@@ -14330,6 +14350,7 @@ public static $zh2TW = [
 '希拉里' => '希拉蕊',
 '希特拉' => '希特勒',
 '残疾人奥林匹克' => '帕拉林匹克',
+'殘疾人奧林匹克' => '帕拉林匹克',
 '残奥会' => '帕運會',
 '殘奧會' => '帕運會',
 '巴尔米拉环礁' => '帕邁拉環礁',
@@ -14413,6 +14434,7 @@ public static $zh2TW = [
 '施罗德' => '施洛德',
 '旱烟' => '旱菸',
 '旱煙' => '旱菸',
+'比勒陀利' => '普利托利',
 '普利策' => '普利茲',
 '普利策奖' => '普立茲獎',
 '芯片' => '晶片',
@@ -14429,6 +14451,8 @@ public static $zh2TW = [
 '马恩岛' => '曼島',
 '木杆' => '木桿',
 '尾班車' => '末班車',
+'萨格勒布' => '札格瑞布',
+'薩格勒布' => '札格瑞布',
 '列奥纳多' => '李奧納多',
 '杜塞尔多夫' => '杜塞道夫',
 '杜塞爾多夫' => '杜塞道夫',
@@ -14496,6 +14520,8 @@ public static $zh2TW = [
 '海洛英' => '海洛因',
 '侯賽因' => '海珊',
 '侯赛因' => '海珊',
+'温得和克' => '溫荷克',
+'溫得和克' => '溫荷克',
 '鼠标' => '滑鼠',
 '汉诺威' => '漢諾瓦',
 '漢诺威' => '漢諾瓦',
@@ -14607,13 +14633,12 @@ public static $zh2TW = [
 '卢浮宫' => '羅浮宮',
 '樂行童軍' => '羅浮童軍',
 '意大利' => '義大利',
+'意大利面' => '義大利麵',
 '昂山素姬' => '翁山蘇姬',
 '昂山素季' => '翁山蘇姬',
 '圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
 '聖吉斯納域斯' => '聖克里斯多福及尼維斯',
 '聖佐治' => '聖喬治',
-'圣多美和普林西比' => '聖多美普林西比',
-'聖多美和普林西比' => '聖多美普林西比',
 '圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
 '聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣赫勒拿' => '聖赫倫那',
@@ -14836,6 +14861,8 @@ public static $zh2TW = [
 '亚拉巴马' => '阿拉巴馬',
 '阿联酋' => '阿聯',
 '阿聯酋' => '阿聯',
+'亚的斯亚贝巴' => '阿迪斯阿貝巴',
+'亞的斯亞貝巴' => '阿迪斯阿貝巴',
 '罗纳德·里根' => '隆納·雷根',
 '私隱' => '隱私',
 '耶加達' => '雅加達',
@@ -14958,6 +14985,7 @@ public static $zh2HK = [
 '因特网' => '互聯網',
 '網際網路' => '互聯網',
 '井里' => '井裏',
+'阿迪斯阿貝巴' => '亞的斯亞貝巴',
 '亮著' => '亮着',
 '亮著《' => '亮著《',
 '亮著作' => '亮著作',
@@ -15340,6 +15368,9 @@ public static $zh2HK = [
 '柯林頓' => '克林頓',
 '克羅埃西亞' => '克羅地亞',
 '奈洛比' => '內羅畢',
+'全角' => '全形',
+'全角度' => '全角度',
+'全角色' => '全角色',
 '公布' => '公佈',
 '公寓里' => '公寓裏',
 '冒著' => '冒着',
@@ -16406,7 +16437,7 @@ public static $zh2HK = [
 '格瑞那達' => '格林納達',
 '格莱美奖' => '格林美獎',
 '葛萊美獎' => '格林美獎',
-'格鲁吉亚' => '格魯吉亞',
+'喬治亞字母' => '格魯吉亞字母',
 '框里' => '框裏',
 '台式电脑' => '桌上型電腦',
 '台球' => '桌球',
@@ -16462,6 +16493,7 @@ public static $zh2HK = [
 '殺著錄' => '殺著錄',
 '壳里' => '殼裏',
 '殿里' => '殿裏',
+'普利托利亞' => '比勒陀利亞',
 '茅利塔尼亞' => '毛里塔尼亞',
 '模里西斯' => '毛里裘斯',
 '毛里求斯' => '毛里裘斯',
@@ -16587,6 +16619,7 @@ public static $zh2HK = [
 '溢著者' => '溢著者',
 '溢著述' => '溢著述',
 '溢著錄' => '溢著錄',
+'溫荷克' => '溫得和克',
 '演著' => '演着',
 '演著作' => '演著作',
 '演著名' => '演著名',
@@ -16657,6 +16690,7 @@ public static $zh2HK = [
 '版图里' => '版圖裏',
 '版本里' => '版本裏',
 '版权信息' => '版權資訊',
+'牢里' => '牢裏',
 '千里達及托巴哥' => '特立尼達和多巴哥',
 '牽著' => '牽着',
 '牽著作' => '牽著作',
@@ -17123,6 +17157,7 @@ public static $zh2HK = [
 '聖克里斯多福及尼維斯' => '聖吉斯納域斯',
 '聖多美普林西比' => '聖多美和普林西比',
 '聖文森及格瑞那丁' => '聖文森特和格林納丁斯',
+'聖文森國' => '聖文森特和格林納丁斯',
 '聖露西亞' => '聖盧西亞',
 '聖馬利諾' => '聖馬力諾',
 '聽不著' => '聽不着',
@@ -17243,6 +17278,7 @@ public static $zh2HK = [
 '肖邦' => '蕭邦',
 '薛丁格' => '薛定諤',
 '塞拉耶佛' => '薩拉熱窩',
+'札格瑞布' => '薩格勒布',
 '萨达姆' => '薩達姆',
 '藉著' => '藉着',
 '藏著' => '藏着',
@@ -18106,6 +18142,7 @@ public static $zh2CN = [
 '網際網絡' => '互联网',
 '網際網路' => '互联网',
 '亞歷山卓' => '亚历山大',
+'阿迪斯阿貝巴' => '亚的斯亚贝巴',
 '雅穆索戈' => '亚穆苏克罗',
 '交帳' => '交账',
 '亮著' => '亮着',
@@ -18636,6 +18673,7 @@ public static $zh2CN = [
 '聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖多美普林西比' => '圣多美和普林西比',
 '聖文森及格瑞那丁' => '圣文森特和格林纳丁斯',
+'聖文森國' => '圣文森特和格林纳丁斯',
 '聖馬利諾' => '圣马力诺',
 '蓋亞那' => '圭亚那',
 '坐著' => '坐着',
@@ -19413,6 +19451,7 @@ public static $zh2CN = [
 '格瑞那達' => '格林纳达',
 '格林美獎' => '格莱美奖',
 '葛萊美獎' => '格莱美奖',
+'喬治亞字母' => '格鲁吉亚字母',
 '森巴舞' => '桑巴舞',
 '梅赫西迪' => '梅赛德斯',
 '夢著' => '梦着',
@@ -19437,6 +19476,7 @@ public static $zh2CN = [
 '帕運會' => '残奥会',
 '帕拉林匹克' => '残疾人奥林匹克',
 '庇里牛斯' => '比利牛斯',
+'普利托利亞' => '比勒陀利亚',
 '披索' => '比索',
 '畢卡索' => '毕加索',
 '茅利塔尼亞' => '毛里塔尼亚',
@@ -19524,6 +19564,7 @@ public static $zh2CN = [
 '混帳' => '混账',
 '清澈' => '清澈',
 '清帳' => '清账',
+'溫荷克' => '温得和克',
 '渴著' => '渴着',
 '渴著書' => '渴著书',
 '渴著作' => '渴著作',
@@ -20108,6 +20149,7 @@ public static $zh2CN = [
 '獲著述' => '获著述',
 '菁寮' => '菁寮',
 '塞拉耶佛' => '萨拉热窝',
+'札格瑞布' => '萨格勒布',
 '落著' => '落着',
 '落著書' => '落著书',
 '落著作' => '落著作',
index 65c46bb..5722270 100644 (file)
        "changeemail-none": "(hana)",
        "changeemail-password": "Lageuem rahsia {{SITENAME}} droeneuh:",
        "changeemail-submit": "Gantoe surat-e",
-       "bold_sample": "Rakam teubai",
-       "bold_tip": "Haraih teubai",
-       "italic_sample": "Rakam singèt naseukah nyoë",
-       "italic_tip": "Rakam singèt",
-       "link_sample": "Nan peunawôt",
-       "link_tip": "Peunawôt dalam",
-       "extlink_sample": "http://www.example.com nan peunawôt",
-       "extlink_tip": "Peunawôt luwa (neubôh http:// bak awai)",
-       "headline_sample": "Naseukah nan",
-       "headline_tip": "Aneuk beunagi tingkat 1",
-       "nowiki_sample": "Bèk format naseukah nyoë",
-       "nowiki_tip": "Bèk seutot beuntuk wiki",
-       "image_tip": "Pasoë beureukaih",
-       "media_tip": "Peunawôt beureukaih",
-       "sig_tip": "Tanda jaroë Droëneuh ngön tanda watèë",
-       "hr_tip": "Garéh data",
        "summary": "Éhtisa:",
        "subject": "Bhaih:",
        "minoredit": "Nyoë lôn peusaneut bacut",
index 8066d91..ff58a7c 100644 (file)
        "resettokens-tokens": "Токенхэр:",
        "resettokens-done": "Токенхэр зэтедзыгъэх.",
        "resettokens-resetbutton": "ХэшыпыкIыгъэ токенхэр зэтедзэх",
-       "bold_sample": "Тхыбзэ Ӏужъу",
-       "bold_tip": "Тхыбзэ Ӏужъу",
-       "italic_sample": "Италикэ текст",
-       "italic_tip": "Италикэ текст",
-       "link_sample": "Зэпыщэм ыцӀэр",
-       "link_tip": "Къыдахьэрэ зэпыщэ",
-       "extlink_sample": "http://www.example.com зэпыщэм ыцӀэ",
-       "extlink_tip": "ДэкӀырэ зэпыщэ (http:// пэрыт пычыгъор зыщымгъэгъупш)",
-       "headline_sample": "Сатырышъхьэ текст",
-       "headline_tip": "Я-2-рэ чэзыу сатырышъхь",
-       "nowiki_sample": "Формат-хэӀэн зимыщыкӀэгъэ текстыр къигъэуцу",
-       "nowiki_tip": "Земгъэгъап вики-форматшэным",
-       "image_tip": "КӀоцӀрыгъэуцогъэ файл",
-       "media_tip": "Файл къакӀорэ зэпыщ",
-       "sig_tip": "Уи кӀэтхэжьыкӀэрэ уахътэрэ",
-       "hr_tip": "Горизонтал сатыр (пчъагъэу умыгъэфед)",
        "summary": "КӀэкӀэу:",
        "minoredit": "Мыр хэӀэзэныгъэ цӀыкӀу",
        "watchthis": "Мы нэкӀубгъом лъыплъ",
index 9b06853..a1b892a 100644 (file)
        "changeemail-newemail": "عنوان البريد الإلكتروني الجديد:",
        "changeemail-none": "(لا شيء)",
        "changeemail-submit": "غيّر البريد الإلكتروني",
-       "bold_sample": "نص غليظ",
-       "bold_tip": "نص غليظ",
-       "italic_sample": "نص مائل",
-       "italic_tip": "نص مائل",
-       "link_sample": "عنوان وصلة",
-       "link_tip": "وصلة داخلية",
-       "extlink_sample": "http://www.example.com عنوان الوصلة",
-       "extlink_tip": "وصلة خارجية (تذكر بادئة http://)",
-       "headline_sample": "نص عنوان رئيسي",
-       "headline_tip": "عنوان من المستوى الثاني",
-       "nowiki_sample": "أدخل النص غير المنسق هنا",
-       "nowiki_tip": "أهمل تهيئة الويكي",
-       "image_tip": "ملف مدرج",
-       "media_tip": "وصلة ملف",
-       "sig_tip": "توقيعك مع الساعة والتاريخ",
-       "hr_tip": "خط أفقي (تجنب الاستخدام بكثرة)",
        "summary": "ملخص:",
        "subject": "موضوع/عنوان:",
        "minoredit": "هذا تعديل طفيف",
index 636fc59..d144c3b 100644 (file)
        "changeemail-submit": "Wysig E-posadres",
        "changeemail-nochange": "Gee gerus 'n ander nuwe e-posadres",
        "resettokens-token-label": "$1 (huidige waarde: $2)",
-       "bold_sample": "Vetdruk",
-       "bold_tip": "Vetdruk",
-       "italic_sample": "Skuinsgedrukte teks",
-       "italic_tip": "Skuinsdruk",
-       "link_sample": "Skakelnaam",
-       "link_tip": "Interne skakel",
-       "extlink_sample": "http://www.voorbeeld.org skakel se titel",
-       "extlink_tip": "Eksterne skakel (onthou http:// vooraan)",
-       "headline_sample": "Opskrif",
-       "headline_tip": "Vlak 2-opskrif",
-       "nowiki_sample": "Plaas ongeformatteerde teks hier",
-       "nowiki_tip": "Ignoreer wiki-formattering",
-       "image_sample": "Voorbeeld.jpg",
-       "image_tip": "Medialêer",
-       "media_sample": "Voorbeeld.ogg",
-       "media_tip": "Lêerskakel",
-       "sig_tip": "Handtekening met datum",
-       "hr_tip": "Horisontale streep (selde nodig)",
        "summary": "Opsomming:",
        "subject": "Onderwerp:",
        "minoredit": "Klein wysiging",
index 1e2ada3..24b59bc 100644 (file)
        "resettokens-watchlist-token": "sapiaca tu aazihan [[Special:Watchlist|miazihay a piazihan tu sulit]] Atom/RSS mima-sabuhat",
        "resettokens-done": "maliyaw tu patizeng mima-sabuhat",
        "resettokens-resetbutton": "miliyaw patizeng mapili’ay a mima-sabuhat",
-       "bold_sample": "kibetulay a sulit",
-       "bold_tip": "kibetulay a sulit",
-       "italic_sample": "tukenihay nisulit",
-       "italic_tip": "tukenihay nisulit",
-       "link_sample": "misiket satangahan a sulit",
-       "link_tip": "labu-labu misiket",
-       "extlink_sample": "http://www.example.com misiket satangahan a sulit",
-       "extlink_tip": "hekal-hekal misiket (amana katawal saka http:// paangangan)",
-       "headline_sample": "sakacacay a selal nu satangahan a sulit",
-       "headline_tip": "sakatusa a selal nu satangahan a sulit",
-       "nowiki_sample": "pacucuk caayay kesehwaay a cudad",
-       "nowiki_tip": "sekipo Wiki kesehwa sulit nu kamu",
-       "image_tip": "nicunusay a tangan",
-       "media_tip": "tangan-tangan misiket",
-       "sig_tip": "misuay a sulit nu ngangan atu demiad, tuki",
-       "hr_tip": "Sapisasuala (cayka yadah kawiza)",
        "summary": "pecu’ nu lacul:",
        "subject": "satangahan:",
        "minoredit": "payni mikilulay a mikawaway-kalumyiti",
index 3d0da95..8a9f283 100644 (file)
        "resetpass-temp-password": "Fjalëkalimi i përkohshëm:",
        "passwordreset": "reset Fjalëkalimi",
        "passwordreset-username": "Emri i përdoruesit:",
-       "bold_sample": "Tekst i trashë",
-       "bold_tip": "Tekst i nximë",
-       "italic_sample": "Tekst i pjerrët",
-       "italic_tip": "Tekst kurziv",
-       "link_sample": "Titulli i vegzës",
-       "link_tip": "Vegëz e mbrendshme",
-       "extlink_sample": "http://www.example.com Titulli i vegzës",
-       "extlink_tip": "Vegëz e jashtme (mos e harro prefiksin http://)",
-       "headline_sample": "Teksti i kryetitullit",
-       "headline_tip": "Kryetitull i nivelit 2",
-       "nowiki_sample": "Vendos tekst të paformatueshëm këtu",
-       "nowiki_tip": "Shpërfille formatimin wiki",
-       "image_sample": "Shembull.jpg",
-       "image_tip": "Skedë e ndërthurrun",
-       "media_sample": "Shembull.ogg",
-       "media_tip": "Vegëz në skedë",
-       "sig_tip": "Nënshkrimi juej me gjithë kohën",
-       "hr_tip": "Vijë horizontale (përdoreni rallë)",
        "summary": "Përmbledhje:",
        "subject": "Tema/kryetitulli:",
        "minoredit": "Ky asht redaktim i vogël",
index 20d72d8..eda4df9 100644 (file)
        "changeemail-none": "(የለም)",
        "changeemail-password": "የ{{SITENAME}} መግቢያ ቃልዎ፦",
        "changeemail-submit": "አድራሻዎን ለመቀይር",
-       "bold_sample": "ጉልህ ፊደላት",
-       "bold_tip": "በጉልህ ፊደላት ይጻፍ",
-       "italic_sample": "ያንጋደደ ፊደላት",
-       "italic_tip": "ባንጋደደ (ኢታሊክ) ፊደላት ይጻፍ",
-       "link_sample": "የመያያዣ ስም",
-       "link_tip": "ባመለከቱት ቃላት ላይ የዊኪ-ማያያዣ ለማድረግ",
-       "extlink_sample": "http://www.example.com የውጭ መያያዣ",
-       "extlink_tip": "የውጭ መያያዣ ለመፍጠር (በ'http://' የሚቀደም)",
-       "headline_sample": "ንዑስ ክፍል",
-       "headline_tip": "የንዑስ-ክፍል አርዕስት ለመፍጠር",
-       "nowiki_sample": "በዚህ ውስጥ የሚከተት ሁሉ የዊኪ-ሥርአተ ቋንቋን ቸል ይላል",
-       "nowiki_tip": "የዊኪ-ሥርአተ ቋንቋን ቸል ለማድረግ",
-       "image_tip": "የስዕል መያያዣ ለመፍጠር",
-       "media_tip": "የድምጽ ፋይል መያያዣ ለመፍጠር",
-       "sig_tip": "ፊርማዎ ከነሰዓቱ (4x ~)",
-       "hr_tip": "አድማሳዊ መስመር (በ'----') ለመፍጠር",
        "summary": "ማጠቃለያ:",
        "subject": "ጥቅል ርዕስ:",
        "minoredit": "ይህ ለውጥ ጥቃቅን ነው።",
index e9634e3..1279b78 100644 (file)
        "resetpass-submit-cancel": "Sawaden miforic",
        "passwordreset": " misafaeloh patonek to mima’",
        "passwordreset-username": "o ngangan no micokaymasay",
-       "bold_sample": "kifetolay a tilid",
-       "bold_tip": "kifetolay a tilid",
-       "italic_sample": "matokenihay a tilid",
-       "italic_tip": "matokenihay a tilid",
-       "link_sample": "matongoday a sakacipinang a sowal",
-       "link_tip": "I laloma’ay a makakafit",
-       "extlink_sample": "http://www.example.com  mipakakafit to   sakacipinang a sowal",
-       "extlink_tip": "Makakafitay i papotal (aka kapawan a http:// a misatapang)",
-       "headline_sample": "o sakacipinang a sowal sorit i sakacecay a cakat",
-       "headline_tip": "o sakacipinang a sowal sorit i sakatosa a cakat",
-       "nowiki_sample": " co’eneken ko caay ko masalalekoay a sorit",
-       "nowiki_tip": "Kapawanan ko masalalekoay a sowal no Wiki",
-       "image_tip": "Sapakemel a tang^an",
-       "media_tip": " patatongod to tang’an",
-       "sig_tip": "o pisorit iso to ngangan ato romi’ad toki",
-       "hr_tip": "O rimadac no nanom\n(caay ka rarid a micokaymas)",
        "summary": " o nisa’amotoan a pakimad",
        "minoredit": "O sapado^do^ a mikawitan",
        "watchthis": "mitapal to inian a felih",
index 7b105b8..8ad164b 100644 (file)
        "changeemail-newemail": "No bi ha garra adreza de correu electronico",
        "changeemail-none": "(garra)",
        "changeemail-submit": "Cambiar adreza de correu-e",
-       "bold_sample": "Texto en negreta",
-       "bold_tip": "Texto en negreta",
-       "italic_sample": "Texto en cursiva",
-       "italic_tip": "Texto en cursiva",
-       "link_sample": "Títol d'o vinclo",
-       "link_tip": "Vinclo interno",
-       "extlink_sample": "http://www.example.com Títol d'o vinclo",
-       "extlink_tip": "Vinclo externo  (recuerde o prefixo http://)",
-       "headline_sample": "Texto de subtítol",
-       "headline_tip": "Soztítol de livel 2",
-       "nowiki_sample": "Escriba aquí texto sin formateyar",
-       "nowiki_tip": "Ignorar o formato wiki",
-       "image_sample": "Exemplo.jpg",
-       "image_tip": "Imachen incorporada",
-       "media_sample": "Exemplo.ogg",
-       "media_tip": "Vinclo ta un fichero",
-       "sig_tip": "Sinyatura, calendata y hora",
-       "hr_tip": "Linia horizontal (faiga-ne un emplego amoderau)",
        "summary": "Resumen:",
        "subject": "Tema/títol:",
        "minoredit": "He feito una edición menor",
index 69b7580..0d0a729 100644 (file)
        "resetpass-submit-cancel": "Undōn",
        "passwordreset": "Settan þafungword eft",
        "passwordreset-username": "Brūcendnama:",
-       "bold_sample": "Þicce traht",
-       "bold_tip": "Þicce traht",
-       "italic_sample": "Flōwende traht",
-       "italic_tip": "Flōwende traht",
-       "link_sample": "Hlencan nama",
-       "link_tip": "Innanweard hlenca",
-       "extlink_sample": "http://www.example.com hlencan nama",
-       "extlink_tip": "Ūtanweard hlenca (beþenc þone http:// foredǣl)",
-       "headline_sample": "Hēafodlīnan traht",
-       "headline_tip": "2. emnettes hēafodlīn",
-       "nowiki_sample": "Unendebyrdodne traht hēr settan",
-       "nowiki_tip": "Wiki endebyrdunge forgietan",
-       "image_sample": "Bisen.jpg",
-       "image_tip": "Ingesett ymele",
-       "media_sample": "Bisen.ogg",
-       "media_tip": "Ymelan hlenca",
-       "sig_tip": "Þīn selfmearc mid tīdmearce",
-       "hr_tip": "Brād līn (ne brūc oft)",
        "summary": "Scortness:",
        "subject": "Ymbe/hēafodlīn:",
        "minoredit": "Þēos is lytel adihtung",
index 300dc82..66b64ca 100644 (file)
        "pt-createaccount": "खाता बनाबऽ",
        "pt-userlogout": "सत्रांत (लॉग आउट)",
        "passwordreset": "कूटशब्द रीसेट",
-       "bold_sample": "मोटा पाठ",
-       "bold_tip": "मोटा अक्षर",
-       "italic_sample": "तिरछा अक्षर",
-       "italic_tip": "तिरछा अक्षर",
-       "link_sample": "कड़ी शीर्षक",
-       "link_tip": "आंतरिक कड़ी",
-       "extlink_sample": "http://www.example.com कड़ी शीर्षक",
-       "extlink_tip": "बाहरी कड़ी (उपसर्ग http:// जरूर लगाबऽ)",
-       "headline_sample": "शीर्षक",
-       "headline_tip": "द्वितीय-स्तर शीर्षक",
-       "nowiki_sample": "अप्रारूपित सामग्री यहाँ डालऽ",
-       "nowiki_tip": "विकि प्रारूपण नज़रंदाज़ करऽ",
-       "image_tip": "संलग्न संचिका",
-       "media_tip": "फाईल लिंक",
-       "sig_tip": "आपन॑ के हस्ताक्षर व समय",
-       "hr_tip": "हॉरिझॉंटल लाईन (कम इस्तेमाल करऽ)",
        "summary": "सारांश:",
        "subject": "विषय/शीर्षक",
        "minoredit": "इ एगऽ छोटऽ परिवर्तन छेकै",
index fc8e5f7..ce93ce2 100644 (file)
        "tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
        "tog-prefershttps": "استخدم دائما اتصالا آمنا عند تسجيل الدخول",
        "tog-showrollbackconfirmation": "إظهار رسالة تأكيد عند النقر على رابط الاسترجاع",
+       "tog-requireemail": "تتطلب البريد الإلكتروني لإعادة تعيين كلمة المرور",
        "underline-always": "دائما",
        "underline-never": "أبدا",
        "underline-default": "وفق المظهر أو المتصفح",
        "createaccountmail": "استخدم كلمة سر عشوائية مؤقتة وارسلها إلى عنوان البريد الإلكتروني المحدد أدناه",
        "createaccountmail-help": "يمكن استخدامه لإنشاء حساب لشخص آخر من دون معرفة كلمة المرور.",
        "createacct-realname": "الاسم الحقيقي (اختياري)",
-       "createacct-reason": "السبب",
+       "createacct-reason": "السبب (مسجل بشكل عام)",
        "createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
        "createacct-reason-help": "رسالة تظهر في سجل إنشاء الحسابات",
        "createacct-submit": "افتح الحساب",
        "resettokens-watchlist-token": "رمز تغذية الويب (آتوم/آس إس إس) [[Special:Watchlist|للتغيرات التي على قائمة مراقبتك]]",
        "resettokens-done": "تغيير المفاتيح",
        "resettokens-resetbutton": "غير المفاتيح المختارة",
-       "bold_sample": "نص غليظ",
-       "bold_tip": "نص غليظ",
-       "italic_sample": "نص مائل",
-       "italic_tip": "نص مائل",
-       "link_sample": "عنوان وصلة",
-       "link_tip": "وصلة داخلية",
-       "extlink_sample": "http://www.example.com عنوان الوصلة",
-       "extlink_tip": "وصلة خارجية (تذكر بادئة http://)",
-       "headline_sample": "نص عنوان رئيسي",
-       "headline_tip": "عنوان من المستوى الثاني",
-       "nowiki_sample": "أدخل النص غير المنسق هنا",
-       "nowiki_tip": "أهمل تهيئة الويكي",
-       "image_tip": "ملف مدرج",
-       "media_tip": "وصلة ملف",
-       "sig_tip": "توقيعك مع الساعة والتاريخ",
-       "hr_tip": "خط أفقي (تجنب الاستخدام بكثرة)",
        "summary": "ملخص:",
        "subject": "موضوع/عنوان:",
        "minoredit": "هذا تعديل طفيف",
        "prefs-help-email": "تحديد عنوان البريد الإلكتروني اختياري، ولكنه يلزم لإعادة تعيين كلمة المرور في حال نسيت كلمة المرور الخاصة بك.",
        "prefs-help-email-others": "يمكنك أيضا أن تسمح للآخرين الاتصال بك عن طريق وصلة في صفحة المستخدم أو نقاش المستخدم الخاصة بك. لا يكشف بريدك الإلكتروني عندما يراسلك أحد بهذه الطريقة، ولكن إذا قمت بالرد سيرى بريدك الإلكتروني.",
        "prefs-help-email-required": "عنوان البريد الإلكتروني مطلوب.",
+       "prefs-help-requireemail": "إذا تم تحديده، فسوف يرسل رسائل البريد الإلكتروني الخاصة بإعادة تعيين كلمة المرور فقط إذا كان الشخص الذي قام بإعادة الضبط قد قدم اسم المستخدم والبريد الإلكتروني لهذا الحساب.",
        "prefs-info": "المعلومات الأساسية",
        "prefs-i18n": "الترجمة",
        "prefs-signature": "التوقيع",
        "listfiles-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
        "imgfile": "ملف",
        "listfiles": "قائمة الملفات",
+       "listfiles_subpage": "المرفوعات بواسطة $1",
        "listfiles_thumb": "تصغير",
        "listfiles_date": "تاريخ",
        "listfiles_name": "الاسم",
        "ipblocklist-legend": "إيجاد مستخدم ممنوع",
        "blocklist-userblocks": "أخفِ منع الحسابات",
        "blocklist-tempblocks": "أخفِ المنع المؤقت",
+       "blocklist-indefblocks": "إخفاء عمليات المنع غير المحددة",
        "blocklist-addressblocks": "أخفِ منع عنوان أيبي واحد",
        "blocklist-type": "النوع:",
        "blocklist-type-opt-all": "الكل",
        "mycustomjsredirectprotected": "ليست لديك صلاحية لتعديل صفحة جافا سكريبت هذه لأنها تحويلة ولا تشير إلى نطاق المستخدمي الخاص بك.",
        "easydeflate-invaliddeflate": "المحتوى المقدم لا يتم تفريغه بشكل صحيح",
        "unprotected-js": "لأسباب تتعلق بالأمان; لا يمكن تحميل جافا سكريبت من الصفحات غير المحمية; الرجاء إنشاء جافا سكريبت فقط في نطاق ميدياويكي: أو كصفحة فرعية للمستخدم",
-       "userlogout-continue": "هل تريد تسجيل الخروج؟"
+       "userlogout-continue": "هل تريد تسجيل الخروج؟",
+       "rest-prefix-mismatch": "المسار المطلوب ($1) لم يكن داخل مسار جذر API REST ($2)",
+       "rest-wrong-method": "لم تكن طريقة الطلب  ($1)  {{PLURAL:$3|الطريقة|إحدى الطرق}} المسموح بها لهذا المسار ($2)",
+       "rest-no-match": "المسار النسبي المطلوب ($1) لا يتطابق مع أي معالج معروف"
 }
index 3960826..e8cc1e8 100644 (file)
        "passwordreset-email": "ܡܘܢܥܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:",
        "passwordreset-emailsentemail": "ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܐܫܬܕܪ ܠܣܘܝܡ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ",
        "changeemail": "ܫܚܠܦ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ",
-       "bold_sample": "ܟܬܒܬܐ ܥܒܝܬܐ",
-       "bold_tip": "ܟܬܒܬܐ ܥܒܝܬܐ",
-       "italic_sample": "ܟܬܒܬܐ ܦܠܝܡܬܐ",
-       "italic_tip": "ܟܬܒܬܐ ܦܠܝܡܬܐ",
-       "link_sample": "ܟܘܢܝܐ ܕܐܣܘܪܐ",
-       "link_tip": "ܐܣܘܪܐ ܓܘܝܐ",
-       "extlink_tip": "ܐܣܘܪܐ ܒܪܝܐ (ܕܟܘܪ http:// ܩܕܡܝܬܐ)",
-       "headline_sample": "ܨܚܚܐ ܕܦܪܫܓܢܐ ܪܫܝܐ",
-       "nowiki_sample": "ܣܢܘܦ ܟܬܒܬܐ ܕܠܐ ܣܕܝܪܘܬܐ ܗܪܟܐ",
-       "nowiki_tip": "ܒܣܝ ܣܕܝܪܘܬܐ ܕܘܝܩܝ",
-       "image_tip": "ܠܦܦܐ ܛܡܝܪܐ",
-       "media_tip": "ܐܣܘܪܐ ܕܠܦܦܐ",
-       "sig_tip": "ܪܡܝ ܐܝܕܟ ܥܡ ܙܒܢܐ ܘܣܝܩܘܡܐ",
        "summary": "ܦܣܝܩܬ̈ܐ ܕܫܘܚܠܦܐ:",
        "subject": "ܡܠܘܐܐ/ܡܘܢܥܐ ܪܫܝܐ:",
        "minoredit": "ܗܢܐ ܗܘ ܫܘܚܠܦܐ ܙܥܘܪܐ",
index d603a97..85357c2 100644 (file)
        "loginlanguagelabel": "Cezugun: $1",
        "pt-login": "Konkülen",
        "resetpass-submit-cancel": "Katrüntukun",
-       "bold_sample": "Kurükünualu wirin",
-       "bold_tip": "Kurükünualu wirin",
-       "italic_sample": "Küllüke wirin",
-       "italic_tip": "Küllüke wirin",
-       "link_sample": "Lasun ñi üy",
-       "link_tip": "Punwi lasun",
-       "extlink_sample": "http://www.example.com Lasun ñi üy",
-       "extlink_tip": "Kamapu lasun (Ngüneduamimi: wüne konkülekey \"http://\")",
-       "headline_sample": "Lonkolelu wirin",
-       "headline_tip": "Trürün 2 ñi lonkolelu wirin",
-       "nowiki_sample": "Üchaftukun ngenochumngen reke chi wirin tüfa mew.",
-       "nowiki_tip": "Kimfanuel wiki ñi chumkünuwe",
-       "image_tip": "Üchaftukülechi eltukawün",
-       "media_tip": "Eltukawün lasun",
-       "sig_tip": "Tami wirintukun üy ka antü/ora",
-       "hr_tip": "Kakül wif (Pünengelayafuy rumel)",
        "summary": "Pichi trokiñündungu:",
        "subject": "Dungu/üy:",
        "minoredit": "Püchin kümeelkünungey",
index e0cb754..ebc434f 100644 (file)
        "resettokens-watchlist-token": "المفتاح تاع السيل (Atom/RSS) تاع [[Special:Watchlist|التبدالات الّي فل ليستة تاع المتابعة تاعك]]",
        "resettokens-done": "المفاتح راهي تبدّلت.",
        "resettokens-resetbutton": "بدّل المفاتح الّي راك ختاريتها",
-       "bold_sample": "كتيبة غليظه",
-       "bold_tip": "كتيبة غليظه",
-       "italic_sample": "كتبة مايلة",
-       "italic_tip": "نص مايل",
-       "link_sample": "عنوان وصيلة",
-       "link_tip": "وصيلة داخليه",
-       "extlink_sample": "http://www.example.com اسم الوصيلة",
-       "extlink_tip": "وصيلة برانية (ما تنساش البديةhttp://)",
-       "headline_sample": "كتبة تاع علوان كبير",
-       "headline_tip": "عنوان من المستوى الثاني",
-       "nowiki_sample": "دخل الكتبة مشي مستفة هنا",
-       "nowiki_tip": "اهمل طريقةالويكي",
-       "image_tip": "ملف داخل",
-       "media_tip": "وصيلة ملف",
-       "sig_tip": "سنياتورتك بالساعة و التاريخ",
-       "hr_tip": "خط أفقي (ما تستعملوش بزاف)",
        "summary": "ملخص:",
        "subject": "موضوع:",
        "minoredit": "هذي تبديلة صغيرة",
index fd99dc8..f300cd6 100644 (file)
        "changeemail-newemail": "ĝonwan dial l-email jdid:",
        "changeemail-none": "(walo)",
        "changeemail-submit": "bddel l-email",
-       "bold_sample": "كتابة غليضة",
-       "bold_tip": "كتابة غليضة",
-       "italic_sample": "كتابة مايلة",
-       "italic_tip": "كتابة مايلة",
-       "link_sample": "Ĝonwan l-lyan",
-       "link_tip": "Lyan daĥili",
-       "extlink_sample": "http://www.example.com Ĝonwan l-lyan",
-       "extlink_tip": "Lyan ĥariji (ĝqel ĝla http:// préfiks)",
-       "headline_sample": "Neṣ de l-ĝonwan.",
-       "headline_tip": "Ĝonwan mosṫawa 2",
-       "nowiki_sample": "N-Neṣ li ma mformatéċ keṫbo hna",
-       "nowiki_tip": "Ĝti n-neĥĥal le l-formataj",
-       "image_sample": "Example.jpg",
-       "image_tip": "Fiċyé m'inséré",
-       "media_sample": "Example.ogg",
-       "media_tip": "Lyan dyal ċi fiċyé médya",
-       "sig_tip": "Ṫ-Ṫowqiĝ dyalek be s-saĝa o ṫ-ṫariĥ",
-       "hr_tip": "Ĥett horizontal (ma ṫkeṫṫerċ menno)",
        "summary": "Moleĥĥaṣ:",
        "subject": "Mowḍoĝ/Ĝonwan",
        "minoredit": "Hada ṫeĝdil sġir",
index 4bba0c1..1b51a30 100644 (file)
        "resetpass-temp-password": "باسورد مؤقته:",
        "passwordreset": "تمت إعادة ضبط كلمة السر",
        "passwordreset-username": "اسم اليوزر:",
-       "bold_sample": "حروف عريضه",
-       "bold_tip": "حروف عريضه",
-       "italic_sample": "كلام مايل",
-       "italic_tip": "كلام مايل",
-       "link_sample": "عنوان وصله",
-       "link_tip": "وصله داخليه",
-       "extlink_sample": "http://www.example.com عنوان الوصله",
-       "extlink_tip": "وصله خارجيه (افتكر تحط http:// قبل عنوان الوصله)",
-       "headline_sample": "راس الموضوع",
-       "headline_tip": "عنوان فرعى من المستوى التانى",
-       "nowiki_sample": "حط  الكلام اللى مش متنسق هنا",
-       "nowiki_tip": "ما تستعملش فورمات الويكى",
-       "image_tip": "ملف مغروس",
-       "media_tip": "وصلة ملف",
-       "sig_tip": "امضتك مع الساعه والتاريخ",
-       "hr_tip": "خط افقى (ما تستعملهموش كتير)",
        "summary": "ملخص:",
        "subject": "راس الموضوع/موضوع:",
        "minoredit": "التعديل ده تعديل صغير",
index bf951b4..78407ee 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|আপোনাৰ লক্ষ্যতালিকাৰ পৃষ্ঠাৰ সালসলনিৰ]] ৱেব ফীডৰ বাবে ট'কেন (Atom/RSS)",
        "resettokens-done": "ট'কেন ৰিছে'ট কৰা হ'ল।",
        "resettokens-resetbutton": "নিৰ্বাচিত ট'কেনসমূহ ৰিছে'ট কৰক",
-       "bold_sample": "গাঢ় পাঠ্য",
-       "bold_tip": "গাঢ় পাঠ্য",
-       "italic_sample": "হেলনীয়া পাঠ্য",
-       "italic_tip": "বেঁকা পাঠ্য",
-       "link_sample": "শিৰোনামা সংযোগ",
-       "link_tip": "আভ্যন্তৰীণ সংযোগ",
-       "extlink_sample": "http://www.example.com শীৰ্ষক সংযোগ",
-       "extlink_tip": "বাহ্যিক সংযোগ (http:// উপসৰ্গ মনত ৰাখিব)",
-       "headline_sample": "শিৰোনামা পাঠ্য",
-       "headline_tip": "দ্বিতীয় স্তৰৰ শিৰোনামা",
-       "nowiki_sample": "নসজোৱা পাঠ্য ইয়াত অন্তৰ্ভুক্ত কৰক",
-       "nowiki_tip": "ৱিকি-সম্মত সাজ-সজ্জা অৱজ্ঞা কৰক",
-       "image_tip": "এম্বেডেড ফাইল",
-       "media_tip": "ফাইল সংযোগ",
-       "sig_tip": "সময়ৰ সৈতে আপোনাৰ স্বাক্ষৰ",
-       "hr_tip": "পথালি ৰেখা (কমকৈ ব্যৱহাৰ কৰিব)",
        "summary": "সাৰাংশ:",
        "subject": "বিষয়:",
        "minoredit": "এইটো এটা অগুৰুত্বপূৰ্ণ সম্পাদনা",
index 538fd9b..ca9149a 100644 (file)
        "passwordreset": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485",
        "passwordreset-username": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M524x514S11541500x487S1154a477x490 S38a00464x490",
        "passwordreset-emailtitle": "M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 M538x522S18517516x486S1851f461x495S2ff00482x483S14c00513x436S14c08461x445S26a00511x469S26a10459x478 M536x521S2ff00482x483S10011515x491S28108515x461 {{SITENAME}}",
-       "bold_sample": "M531x518S32a00482x483S15410516x488 M516x515S10018484x485S1f010487x485",
-       "bold_tip": "M531x518S32a00482x483S15410516x488 M516x515S10018484x485S1f010487x485",
-       "italic_sample": "M516x515S10018484x485S1f010487x485 M537x516S15a17514x493S15a19474x493S26906504x486S26916464x485",
-       "italic_tip": "M516x515S10018484x485S1f010487x485 M537x516S15a17514x493S15a19474x493S26906504x486S26916464x485",
-       "media_tip": "M520x523S14c19480x496S15a01497x497S20710483x477 M521x525S1ce10499x476S1ce48479x476S20a00491x510",
-       "sig_tip": "M507x523S15a28494x496S26500493x477 M518x518S15a37483x483S11551491x493 M521x508S1f748479x493S1f740501x493 M522x518S10050490x488S15a56495x482S20500478x483 M518x516S20b00483x503S15a37495x486S20340491x485",
        "summary": "M554x524S14c40530x477S14c48446x493S26502515x490S26516468x508S20340495x490S20348487x507 S38a00464x490",
        "minoredit": "M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M515x512S1f010486x488S2f900502x507",
        "savearticle": "M519x513S10e02489x498S20302482x488 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498",
index c5a76e6..96329e5 100644 (file)
        "resettokens-watchlist-token": "Pase pa la canal de noticies web (Atom/RSS) de los [[Special:Watchlist|cambios en páxines de la llista de vixilancia]]",
        "resettokens-done": "Reaniciaronse los pases.",
        "resettokens-resetbutton": "Reaniciar los pases seleicionaos",
-       "bold_sample": "Testu en negrina",
-       "bold_tip": "Testu en negrina",
-       "italic_sample": "Testu en cursiva",
-       "italic_tip": "Testu en cursiva",
-       "link_sample": "Títulu del enllaz",
-       "link_tip": "Enllaz internu",
-       "extlink_sample": "http://www.example.com títulu del enllaz",
-       "extlink_tip": "Enllaz esternu (recuerda'l prefixu http://)",
-       "headline_sample": "Testu de cabecera",
-       "headline_tip": "Cabecera de nivel 2",
-       "nowiki_sample": "Pon equí testu ensin formatu",
-       "nowiki_tip": "Inorar el formatu wiki",
-       "image_sample": "Exemplu.jpg",
-       "image_tip": "Ficheru incrustáu",
-       "media_sample": "Exemplu.ogg",
-       "media_tip": "Enllaz del ficheru",
-       "sig_tip": "La to robla con data y hora",
-       "hr_tip": "Llinia horizontal (úsala con moderación)",
        "summary": "Resume:",
        "subject": "Asuntu:",
        "minoredit": "Esta ye una edición menor",
index acb7a74..59dd032 100644 (file)
        "passwordreset": "Ka ocehikaniin itewin koski masinaha",
        "passwordreset-username": "Icinikasowin:",
        "passwordreset-email": "Pamikicikwepitcikan matcetcicihikan:",
-       "bold_sample": "Atisokesinahikan e makatewasinatek",
-       "bold_tip": "Atisokesinahikan e makatewasinatek",
-       "italic_sample": "Atisokesinahikan ka kwectek",
-       "italic_tip": "Atisokesinahikan ka kwectek",
-       "link_sample": "Ka icinikatek takapikenikan",
-       "link_tip": "Pitc itapikesinikan",
-       "extlink_sample": "http://www.example.com ka icinikatek takapikenikan",
-       "extlink_tip": "Masinahikana ka ici tapitik kotakik masinahikanik",
-       "headline_sample": "Atisokesinahikan ke aicinikatek",
-       "headline_tip": "Icinikatamowinicic 2 ka iteritakok",
-       "nowiki_sample": "Acta atisokesinahikan aka moci ka ki otci nihipitcikatek ota",
-       "nowiki_tip": "Aka pamerita e itasinihak wiki",
-       "image_tip": "E pitakesinahikatek masinahikaniwoc",
-       "media_tip": "Ka ici tapitik onimiskimasinahikan",
-       "sig_tip": "Masinahotiso acit e tato konekisitc pisimw",
-       "hr_tip": "Ka mitaskosinatek(aka oraho)",
        "summary": "Nosem:",
        "minoredit": "Apicic meckotciparin",
        "watchthis": "Wi nosinetaine ohwe masinahikan",
index e6d2412..5311f70 100644 (file)
        "changeemail-newemail": "Warzafe e-mail mane",
        "changeemail-none": "(mek)",
        "changeemail-submit": "Betara va e-mail mane",
-       "bold_sample": "Bold krent",
-       "bold_tip": "Bold krent",
-       "italic_sample": "Italic krent",
-       "italic_tip": "Italic krent",
-       "link_sample": "Vergumveltgluyaxa",
-       "link_tip": "Kofa gluyaxa",
-       "extlink_sample": "http://www.example.com vergumveltgluyaxa",
-       "extlink_tip": "Divafa gluyaxa ( va http:// me vulkul )",
-       "headline_sample": "Krojkrent",
-       "headline_tip": "Vergumvelt ke 2-eafa ema",
-       "nowiki_sample": "Breviziskaf krent batliz cenkal",
-       "nowiki_tip": "Va wiki breviz afaná",
-       "image_sample": "Tula.jpg",
-       "image_tip": "Plekuyuna ewava",
-       "media_sample": "Tula.ogg",
-       "media_tip": "Gluyaxa va iyeltak",
-       "sig_tip": "Rinafa evlakirafa sugdara",
-       "hr_tip": "Zidafa gluyaxa ( me faversel )",
        "summary": "Vildeks:",
        "subject": "Detce :",
        "minoredit": "Betamaks.",
index bdbe4b0..25e2ae9 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|आप कय ध्यानसूची कय पन्नन् में बदलाव]] कय वेब फ़ीड (Atom/RSS)कय नाते टोकन",
        "resettokens-done": "टोकन रीसेट कई गय।",
        "resettokens-resetbutton": "चुनल टोकन रीसेट करा जाय",
-       "bold_sample": "मोट लेख",
-       "bold_tip": "मोट लेख",
-       "italic_sample": "तिरछा लेख",
-       "italic_tip": "इटैलिक लेख",
-       "link_sample": "कड़ी शीर्षक",
-       "link_tip": "आंतरिक कड़ी",
-       "extlink_sample": "http://www.example.com कड़ी शीर्षक",
-       "extlink_tip": "बाहरी कड़ी (उपसर्ग http:// जरुर लगावा जाई)",
-       "headline_sample": "शीर्षक लेख",
-       "headline_tip": "द्वितीय-स्तर शीर्षक",
-       "nowiki_sample": "अप्रारूपित लेख यहँ डारा जाय",
-       "nowiki_tip": "विकि प्रारूपण नज़रंदाज़ करा जाय",
-       "image_tip": "एम्बेड करल फ़ाइल",
-       "media_tip": "फ़ाइल कय कड़ी",
-       "sig_tip": "आप कय हस्ताक्षर अव समय",
-       "hr_tip": "सिधा लाइन (कम इस्तेमाल करा जाई)",
        "summary": "सारांश:",
        "subject": "विषय:",
        "minoredit": "ई छोट सम्पादन होय ।",
        "nocreate-loggedin": "आप कय नँवा पन्ना बनावे कय अनुमति नाई है ।",
        "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नाई है",
        "sectioneditnotsupported-text": "इ पन्ना पे अनुभाग सम्पादन समर्थित नाई है",
+       "modeleditnotsupported-title": "संपादन सपोर्ट नही करत",
+       "modeleditnotsupported-text": "सामग्री मॉडल $1 के बरे संपादन सपोर्ट नही अहै",
        "permissionserrors": "अनुमति त्रुटि",
        "permissionserrorstext": "निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते आप कय ऐसन करे कय अनुमति नाइ है:",
        "permissionserrorstext-withaction": "आप कय $2 कय अनुमति नाई है,निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते से:",
        "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।",
        "changecontentmodel": "पन्ने का सामग्री प्रारूप बदलें",
        "changecontentmodel-legend": "पृष्ठ सामग्री का नमूना",
-       "changecontentmodel-title-label": "पृष्ठ शीर्षक",
+       "changecontentmodel-title-label": "पृष्ठ शीर्षक:",
        "changecontentmodel-current-label": "Current content model:",
-       "changecontentmodel-model-label": "नयि à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95ा à¤¨à¤®à¥\82ना",
+       "changecontentmodel-model-label": "नयि à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95य à¤¨à¤®à¥\82ना:",
        "changecontentmodel-reason-label": "कारण:",
        "changecontentmodel-submit": "बदला",
        "changecontentmodel-success-title": "सामगरि का नामुने मे बदलाव हुुुाा हेेे",
index 402019e..c04aa00 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|İzləmə siyahınızdakı]] səhifələrdə dəyişikliklərin web feed-i (Atom / RSS) üçün jeton",
        "resettokens-done": "Jetonlar sıfırlandı.",
        "resettokens-resetbutton": "Seçilmiş jetonları sıfırla",
-       "bold_sample": "Qalın mətn",
-       "bold_tip": "Qalın mətn",
-       "italic_sample": "Kursiv mətn",
-       "italic_tip": "Kursiv mətn",
-       "link_sample": "Bağlantı başlığı",
-       "link_tip": "Daxili bağlantı",
-       "extlink_sample": "http://www.example.com başlıq",
-       "extlink_tip": "Xarici səhifə (http:// ekini unutma)",
-       "headline_sample": "Başlıq mətni",
-       "headline_tip": "2. səviyyə başlıq",
-       "nowiki_sample": "Formatlaşdırılmamış mətni bura daxil edin",
-       "nowiki_tip": "Viki formatını sayma",
-       "image_sample": "Misal.jpg",
-       "image_tip": "Şəkil əlavə etmə",
-       "media_sample": "Misal.ogg",
-       "media_tip": "Media-fayla keçid",
-       "sig_tip": "İmza və vaxt",
-       "hr_tip": "Horizontal cizgi",
        "summary": "Qısa məzmun:",
        "subject": "Mövzu:",
        "minoredit": "Kiçik redaktə",
index ad42134..6c0a046 100644 (file)
        "resettokens-watchlist-token": "نیشانلامیش یئمک وپی [[Special:Watchlist|ایزلنمیش سون دییشیک اولان صفحه لر]](اتم/آراس‌اس)",
        "resettokens-done": "رمز لری دَییشلندی.",
        "resettokens-resetbutton": "سئچیلمیش دَییشلنن رمزلر.",
-       "bold_sample": "قالین یازی",
-       "bold_tip": "قالین یازی",
-       "italic_sample": "اَیری یازی",
-       "italic_tip": "اَیری یازی",
-       "link_sample": "باغلانتی باشلیغی",
-       "link_tip": "ایچری باغلانتی‌سی",
-       "extlink_sample": "http://www.example.com باغلانتی باشلیغی",
-       "extlink_tip": "ائشیک باغلانتی (http:// اؤن‌اکی‌نی اونوتمایین)",
-       "headline_sample": "باشلیق متنی",
-       "headline_tip": "۲ یوکسک باشلیق",
-       "nowiki_sample": "فورمت‌لشدیریلمه‌میش یازی‌نی بورا داخیل ائدین",
-       "nowiki_tip": "ویکی فورمت‌لندیرمه‌سینی سایما",
-       "image_tip": "یئرلشدیریلمیش فایل",
-       "media_tip": "فایل باغلانتی‌سی",
-       "sig_tip": "سیزین ایمضانیز واخت ایله",
-       "hr_tip": "دوزئی خط (آز ایشلدین)",
        "summary": "قیساسی:",
        "subject": "موضوع:",
        "minoredit": "بو بیر کیچیک دَییشدیرمه‌دیر",
index 47496dd..65064f3 100644 (file)
        "resettokens-watchlist-token": " [[Special:Watchlist|күҙәтеүҙәрегеҙ исемлегендә биттәрҙең үҙгәрештәре]] веб-каналы өсөн токен(Atom/RSS)",
        "resettokens-done": "Токендар ташланды.",
        "resettokens-resetbutton": "Һайланған токендарҙы ташларға",
-       "bold_sample": "Ҡалын яҙылыш",
-       "bold_tip": "Ҡалын яҙылыш",
-       "italic_sample": "Курсив яҙылыш",
-       "italic_tip": "Курсив яҙылыш",
-       "link_sample": "Һылтанма исеме",
-       "link_tip": "Эске һылтанма",
-       "extlink_sample": "http://www.example.com һылтанма исеме",
-       "extlink_tip": "Тышҡы һылтанма (http:// префиксын онотмағыҙ)",
-       "headline_sample": "Исем",
-       "headline_tip": "2-се дәрәжәле исем",
-       "nowiki_sample": "Бында форматланмаған тексты өҫтәгеҙ.",
-       "nowiki_tip": "Вики-форматлауға иғтибар итмәҫкә",
-       "image_tip": "Индерелгән файл",
-       "media_tip": "Файл һылтанмаһы",
-       "sig_tip": "Имзағыҙ һәм ваҡыт",
-       "hr_tip": "Горизонталь һыҙыҡ (бик йыш ҡулланмағыҙ)",
        "summary": "Үҙгәртеү аңлатмаһы:",
        "subject": "Тема/исем:",
        "minoredit": "Әҙ генә үҙгәрештәр",
index 37e5947..d4ab79e 100644 (file)
                        "Joseagush",
                        "Wandering ant",
                        "Kadek Ayu Sulastri",
-                       "Luh Gede Krismayanti"
+                       "Luh Gede Krismayanti",
+                       "Amire80"
                ]
        },
        "tog-underline": "Garis ring beten pranala:",
-       "tog-hideminor": "engkebang suntingan ring gentosan sane pinih anyar",
-       "tog-hidepatrolled": "engkebang suntingan mapatrol ring gentosan sane pinih anyar",
+       "tog-hideminor": "Engkebang uahan alit saking uahan sané mangkin",
+       "tog-hidepatrolled": "Engkebang uahan sané kapatroli saking uahan sané mangkin",
        "tog-newpageshidepatrolled": "engkebang lembar mapatrol saking saking kepahan lembar anyar",
        "tog-hidecategorization": "Engkebang kacané",
        "tog-extendwatchlist": "kembangang kepahan pangiwasan antuk nampilang samian panguwahan, nenten sane anyar kewanten",
        "tog-numberheadings": "isinin nomor murda anggen cara otomatis",
        "tog-editondblclick": "sunting lembar nganggen klik kaping pindo",
        "tog-editsectiononrightclick": "sayagayang panyuntingan kepahan anggen ngeklik tengen ring kepahan judul",
-       "tog-watchcreations": "imbuhin lembar sane karyanin titiang ring kepahan pangiwasan",
+       "tog-watchcreations": "Tambeh kaca sané kardi titiang miwah berkas sané unggah titiang ring pangawasan titiang",
        "tog-watchdefault": "imbuhin lembar panyuntingansane sunting titiang ring kepahan pangiwasan",
-       "tog-watchmoves": "imbuhang lembar sane kakisidang titiang ring kepahan pangiwasan",
+       "tog-watchmoves": "Tambeh kaca miwan berkas sané gingsirang titiang ring pangawasan titiang",
        "tog-watchdeletion": "imbuhin lembar sane kaapus ring kepahan pangiwasan",
+       "tog-watchuploads": "Tambeh berkas anyar sané unggah titiang ring pangawasan titiang",
+       "tog-watchrollback": "Tambehin kaca sané sampun uliang tiang ka tengah pupulan pantauan tiangé",
        "tog-minordefault": "pingetin samian suntingan dados suntingan alit sane ajeg",
        "tog-previewontop": "tampilang pratayang sadurung kotak sunting lan nenten sadurungnyane",
        "tog-previewonfirst": "tampilang pratayang ring suntingan kapertama",
@@ -46,6 +49,8 @@
        "tog-watchlisthidebots": "engkebang panguwahan bot ring kepahan pangiwasan",
        "tog-watchlisthideminor": "engkebang panguwahan alit ring kepahan pangiwasan",
        "tog-watchlisthideliu": "engkebang suntingan penganggen malebu log ring kepahan pangiwasan",
+       "tog-watchlistreloadautomatically": "Ulangin pupulan pantauan manut otomatis ritatkala silih tunggil penyaringan kauah (JavaScript kaperluang)",
+       "tog-watchlistunwatchlinks": "Tambehin pacihna pantau/usap pantauan ka kaca sané kapantau tur kauah (JavaScript kaperluang anggén nganti tetujon puniki)",
        "tog-watchlisthideanons": "engkebangsuntingan penganggen tan maadan ring kepahan pangiwasan",
        "tog-watchlisthidepatrolled": "engkebang panguwahan mapatrol kepahan pangiwasan",
        "tog-watchlisthidecategorization": "Engkebang katégorisasi kacané",
@@ -55,6 +60,8 @@
        "tog-norollbackdiff": "Sampunang tampilang binanne sesampun ngewaliang",
        "tog-useeditwarning": "elingang titiang yening ngalahin lembar panyuntingan sadurung nyimpen pagentosan",
        "tog-prefershttps": "Setata nganggen sambungan sane aman rikala malebu log",
+       "tog-showrollbackconfirmation": "Sinahang konfirmasi ritatkala ngklik pranala sané kauliang\nTampilkan konfirmasi ketika mengeklik pranala pengembalian",
+       "tog-requireemail": "Perlu séwala éléktronik anggé nyumu ngardi kruna sandi",
        "underline-always": "Setata",
        "underline-never": "Nénten naénin",
        "underline-default": "kulit utawi penjelajah paaban",
@@ -73,7 +80,7 @@
        "mon": "Som",
        "tue": "Ang",
        "wed": "Bud",
-       "thu": "Wrs",
+       "thu": "Wra",
        "fri": "Suk",
        "sat": "San",
        "january": "Januari",
        "may": "Méi",
        "jun": "Jun",
        "jul": "Jul",
-       "aug": "Ags",
+       "aug": "Agu",
        "sep": "Sép",
        "oct": "Okt",
        "nov": "Nop",
        "dec": "Dés",
-       "january-date": "Januari $1",
-       "february-date": "Februari $1",
-       "march-date": "Maret $1",
-       "april-date": "April $1",
-       "may-date": "Mei $1",
-       "june-date": "Juni $1",
-       "july-date": "Juli $1",
-       "august-date": "Agustus $1",
-       "september-date": "September $1",
-       "october-date": "Oktober $1",
-       "november-date": "November $1",
-       "december-date": "Desember $1",
+       "january-date": "$1 Januari",
+       "february-date": "$1 Pébruari",
+       "march-date": "$1 Maret",
+       "april-date": "$1 April",
+       "may-date": "$1 Méi",
+       "june-date": "$1 Juni",
+       "july-date": "$1 Juli",
+       "august-date": "$1 Agustus",
+       "september-date": "$1 Séptémber",
+       "october-date": "$1 Oktober",
+       "november-date": "$1 Nopémber",
+       "december-date": "$1 Désémber",
        "period-am": "AM",
        "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Kategori}}",
        "category_header": "Kaca ring ketegori \"$1\"",
        "subcategories": "Subkategori",
        "category-media-header": "Média ring kategori \"$1\"",
-       "category-empty": "\"mangkin, nenten madaging lembar utawi pekakas ring golongan puniki\"",
-       "hidden-categories": "{{plural:$1|punduhan sane kaengkebang| punduhan sane kaengkebang}}",
-       "hidden-category-category": "Kategori mengkeb",
-       "category-subcat-count": "{{PLURAL:$2| golongan puniki madue {{PLURAL:$1|$1 subkategori}} puniki, saking genepan $2.}}",
-       "category-article-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
+       "category-empty": "<em>Kategori puniki mangkin nénten madaging kaca utawi média.</em>",
+       "hidden-categories": "{{plural:$1|Kategori sané kaengkebang}}",
+       "hidden-category-category": "Kategori sané kaengkebang",
+       "category-subcat-count": "{{PLURAL:$2|Kategori iki wantah madué subkategori ring sor puniki|Kategori iki madué {{PLURAL:$1|subkategori|$1 subkategori}} ring sor puniki, saking $2 akéhnyané.}}",
+       "category-subcat-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 kategori alit}} sakadi punika.",
+       "category-article-count": "{{PLURAL:$2|Kategori puniki wantah madué kaca ring sor puniki.|{{PLURAL:$1|Kaca|$1 kaca}} ring sor puniki wénten ring kategori puniki, saking $2 akéhnyané.}}",
+       "category-article-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 kaca}} sakadi punika.",
        "category-file-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
+       "category-file-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 berkas}} sakadi punika.",
        "listingcontinuesabbrev": "lant.",
        "index-category": "Lembar sane maindeks",
        "noindex-category": "Lembar sane nenten maindeks",
        "broken-file-category": "Suratan sane ngelah pranala usak",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Indik",
        "article": "Kaca daging",
-       "newwindow": "(bukak ring jendela anyar)",
+       "newwindow": "(métbét ring jendéla anyar)",
        "cancel": "Wangdé",
        "moredotdotdot": "Lianan...",
+       "morenotlisted": "Bacakan puniki asané nénten lengkap.",
        "mypage": "Kaca",
        "mytalk": "Pabligbagan",
        "anontalk": "Pabligbagan",
        "and": "&#32;miwah",
        "faq": "FAQ (pitaken sane jagi katakonang)",
        "actions": "Parilaksana",
-       "namespaces": "Genah wastan",
+       "namespaces": "Genah aran",
        "variants": "Varian",
        "navigation-heading": "Menu navigasi",
        "errorpagetitle": "Kaiwangan",
        "help": "Wantuan",
        "help-mediawiki": "Pitulung MediaWiki",
        "search": "Rereh",
+       "search-ignored-headings": "# <pre>\n# Murda sané jagi nénten karunguang olih pangrereh.\n# Suratan puniki jagi kalaksanayang sasampun kaca taler murda puniki kaindeks.\n# Ragané prasida ngmaksayang pangindeksan mawali kaca puniki antuk nglaksanayang suratan kosong (''null edit'')\n# Sintaksisnyané sakadi puniki:\n#   * Makasami saking watek \"#\" ka bait untat inggih punika silih tunggil pabligbagan.\n#   * Tiap bait ten-kosong inggih punika murda sané patut sané jagi nénten karunguang.\nReferensi\nPranala luar\nCingak taler\n #</pre>",
        "searchbutton": "Rereh",
        "go": "Lanturang",
        "searcharticle": "Rereh",
        "history": "Babad kaca",
        "history_short": "Babad",
        "history_small": "babad",
+       "updatedmarker": "kamutakhiran sekat pengunjung tiang sané kaping untat",
        "printableversion": "Vérsi cétak",
        "permalink": "Pranala ajeg",
        "print": "Citak",
        "view": "Cingak",
        "view-foreign": "Cingak ring $1",
        "edit": "Uah",
-       "create": "Karyanin",
-       "create-local": "Icénin daging sané marupa paparan lokal",
+       "edit-local": "Tambeh déskripsi lokal",
+       "create": "Kardi",
+       "create-local": "Tambeh déskripsi lokal",
        "delete": "Usap",
+       "undelete_short": "Wangdeang usap {{PLURAL:$1|$1 suratan}}",
        "viewdeleted_short": "Cingak {{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
        "protect": "Saib",
        "protect_change": "uah",
        "personaltools": "Pekakas praragan",
        "talk": "Pabligbagan",
        "views": "Pakantenan",
-       "toolbox": "Pekakas",
+       "toolbox": "Piranti",
+       "tool-link-userrights": "Uah{{GENDER:$1|pangangge}}",
+       "tool-link-userrights-readonly": "Cingak kelompok {{GENDER:$1|pangangge}}",
        "tool-link-emailuser": "Kirim surel ring {{GENDER:$1|pengguna}} puniki",
        "imagepage": "Cingak kaca berkas",
-       "mediawikipage": "Cingak kaca séwalapatra",
+       "mediawikipage": "Cingak kaca séwala",
        "templatepage": "Cingak kaca cétakan",
        "viewhelppage": "Cingak kaca wantuan",
        "categorypage": "Cingak kaca kategori",
        "redirectedfrom": "(Kagingsirang saking $1)",
        "redirectpagesub": "Kaca gingsiran",
        "redirectto": "Magingsir ring:",
-       "lastmodifiedat": "Kaca puniki kaping untat kauah rikala  $2, $1",
+       "lastmodifiedat": "Kaca puniki kaping untat kauah ri tatkala  $2, $1",
+       "viewcount": "Kaca puniki sampun diaksés ping {{PLURAL:$1|$1 kali}}.<br />",
        "protectedpage": "Kaca sané kasaibin",
        "jumpto": "Lanturang ka:",
        "jumptonavigation": "navigasi",
        "jumptosearch": "rereh",
+       "view-pool-error": "Ampura, server kari sibuk mangkin.\nAkéh pisan panganggé sané mautsaha nyingakin kaca puniki.\nAntosang jebos sadurung ragané jagi ngeaksés kaca puniki. \nMaaf, server sedang sibuk pada saat ini.\nTerlalu banyak pengguna berusaha melihat halaman ini.\nTunggu sebentar sebelum Anda mencoba lagi mengakses halaman ini.\n\n$1",
+       "generic-pool-error": "Ampura, server kari sibuk mangkin.\nKaliwat akéh panganggé sané mautsaha nyingakin sumber puniki.\nAntosang jebos sadurung ragané jagi ngaksés kaca puniki malih.",
+       "pool-timeout": "Liwat galah ngantosang kunci",
+       "pool-queuefull": "Pupulan antrian sampun penuh",
        "pool-errorunknown": "Iwang sané durung kauningin",
+       "pool-servererror": "Layanan pangitung pool punika nénten kasayagayang ($1).",
+       "poolcounter-usage-error": "Pikobet panganggean: $1",
        "aboutsite": "Indik {{SITENAME}}",
        "aboutpage": "Project:Indik",
+       "copyright": "Daging kasayagayang ring sor $1 ri tatkala nénten wénten uahan.",
        "copyrightpage": "{{ns:project}}:Hak cipta",
        "currentevents": "Kawéntenané mangkin",
        "currentevents-url": "Project:Kawéntenané mangkin",
        "helppage-top-gethelp": "Wantuan",
        "mainpage": "Kaca Utama",
        "mainpage-description": "Kaca utama",
+       "policy-url": "Project:Kapatutan",
        "portal": "Kori sekaa",
        "portal-url": "Project:Kori sekaa",
        "privacy": "Awig-awig indik data praragan",
        "privacypage": "Project:Awig-awig indik data praragan",
+       "badaccess": "Pikobet lugra",
+       "badaccess-group0": "Ragané nénten kadurusang antuk nglaksanayang parilaksana sakadi sané kapinta.\nAnda tidak diizinkan untuk melakukan tindakan yang Anda minta.",
+       "badaccess-groups": "Parilaksana sané kapinta kawatesin antuk pangangge ring tengah {{PLURAL:$2|kelompok}}: $1.",
+       "versionrequired": "Kaperluang MediaWiki manut $1",
+       "versionrequiredtext": "MediaWiki versi $1 kaperluang antuk nglaksanayang kaca puniki. Cingak [[Special:Version|kaca versi]]",
        "ok": "OK",
        "retrievedfrom": "Kapolihang saking \"$1\"",
-       "youhavenewmessages": "{{PLURAL:$3|Jero madué}} $1 ($2)",
-       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ida dané madué}} $1 saking {{PLURAL:$3|$3 sang anganggé lianan}} ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Ragané madué}} $1 ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Ragané 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}}",
+       "newmessageslinkplural": "{{PLURAL:$1|séwala anyar abesik|999=séwala anyar}}",
        "newmessagesdifflinkplural": "$1 {{PLURAL:$1|uahan}}",
-       "youhavenewmessagesmulti": "Ida dané madué séwalapatra anyar ring $1",
+       "youhavenewmessagesmulti": "Ragané madué séwala anyar ring $1",
        "editsection": "uah",
        "editold": "uah",
        "viewsourceold": "cingak wit",
        "toc": "Daging",
        "showtoc": "sinahang",
        "hidetoc": "engkebang",
+       "collapsible-collapse": "Alitin malih",
        "collapsible-expand": "buka",
        "confirmable-confirm": "{{GENDER:$1|Jero}} yakin?",
        "confirmable-yes": "Inggih",
        "confirmable-no": "Nénten",
+       "thisisdeleted": "Cingak utawi uliang $1?",
        "viewdeleted": "Cingak $1?",
        "restorelink": "{{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
        "feedlinks": "Asupan:",
        "feed-invalid": "Tipe permintaan asupan tusing beneh.",
+       "feed-unavailable": "Umpan sindikasi nénten kasayagayang",
+       "site-rss-feed": "Umpan RSS $1",
        "site-atom-feed": "$1 \"atom feed\"",
+       "page-rss-feed": "Umpan RSS \"$1\"",
        "page-atom-feed": "$1 \"atom feed\"",
        "red-link-title": "$1 (kaca nénten wénten)",
+       "sort-descending": "Urutang ka betén",
+       "sort-ascending": "Urutang menék",
        "nstab-main": "Kaca",
        "nstab-user": "Kaca sang anganggé",
+       "nstab-media": "Kaca media",
        "nstab-special": "Kaca kusus",
        "nstab-project": "Kaca proyék",
        "nstab-image": "Depukan",
-       "nstab-mediawiki": "Séwalapatra",
+       "nstab-mediawiki": "Séwala",
        "nstab-template": "Cétakan",
        "nstab-help": "Kaca wantuan",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Kaca utama",
+       "nosuchaction": "Nénten wénten parilaksana sakadi punika",
+       "nosuchactiontext": "Parilaksana sané kapinta olih URL punika nénten valid. Ragané asané iwang ngetik URL, utawi ngikutin silih tunggil pranala sané ten patut. Unduk puniki taler asané kaindikasian silih tunggil bug ring perangkat lunak sané kaanggén olih {{SITENAME}}.",
        "nosuchspecialpage": "Nénten wénten kaca kusus sakadi punika",
        "nospecialpagetext": "<strong>Ida nagih kaca pinih luwih sane nenten patut.</strong>\n\nWacakan kaca pinih luwih dados kacingak ring [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kaiwangan",
        "databaseerror": "Database kaluputan",
-       "databaseerror-query": "Kueri: $1",
+       "databaseerror-text": "Silih tunggil galat kueri basis data sampun kalaksanayang.\nIndik puniki asané kaindikasian wénten pikobet ring perangkat lunaknyané.",
+       "databaseerror-textcl": "Silih tunggil galat kueri basis data sampun kajadian.",
+       "databaseerror-query": "Kuéri: $1",
        "databaseerror-function": "Pungsi: $1",
        "databaseerror-error": "Pelih: $1",
-       "missing-article": "data utama nenten prasida nemu tulisan saking lembar sane sepatutne wenten, inggih punika  $1, $2\n\nindike puniki biasane keranayang olih pranala kaon nuju pabenahan sane dumun lembar sane sampun kaicalang\n\nyening nenten puniki sane ngranayang, ida dane minab sampun manggihin kaiwangang ring sajeroning piranti lunak.\nDurus sadokang indik puniki rin silih sinunggil anak \n\n[[Special:ListUsers/sysop|Pengurus]], antuk ngetik alamat URL sane katuju",
+       "transaction-duration-limit-exceeded": "Mangde nénten katunda saduran sané tegeh, kiriman puniki kawangdeang mawanin galah nyurat ($1) ngliwatin wates $2 ring limit dauh.\nYéning ragané jagi nguah akéh ring galah sané masikian, ngiring laksanayang ring karya sané alitan.",
+       "laggedslavemode": "Pangeling: Kaca asané nénten kadagingin uahan pinih anyar.",
+       "readonly": "Basis data kakunci",
+       "enterlockreason": "Asukan napi sané ngawinan penguncian, rumasuk kirang langkung ring galah napu kunci jagi kabuka",
+       "readonlytext": "Basis data kantun kakunci ring masukan miwah uahan sané anyar, asané pamecikan basis data, sasampun keadaan jagi normal sakadi sadurungnyané. \n\nPrajuru sané nglaksanayang panguncian ngemaang daging sakadi punika: $1",
+       "missing-article": "Genah datané nénten prasida manggihin suratan saking kaca sané sapatutné kapanggihin, mamurda \"$1\" $2.\n\nIndik puniki biasané keranayang olih pranala kaon nuju pabenahan sane dumun lembar sane sampun kaicalang\n\nyening nenten puniki sane ngranayang, ida dane minab sampun manggihin kaiwangang ring sajeroning piranti lunak.\nDurus sadokang indik puniki rin silih sinunggil anak \n\n[[Special:ListUsers/sysop|Pengurus]], antuk ngetik alamat URL sane katuju",
        "missingarticle-rev": "(pabenahan#:$1)",
+       "missingarticle-diff": "(Malianan: $1, $2)",
+       "readonly_lag": "Basis data sampun kakunci otomatis sakantun basis data sekunder nglaksanayang sinkronisasi antuk basis data sané utama",
+       "nonwrite-api-promise-error": "Manggala HTTP 'Promise-Non-Write-API-Action' sampun kakirim nanging paminta kabuat mantuké modul manyurat API.",
+       "internalerror": "Pikobet saking tengah",
+       "internalerror_info": "Pikobet saking tengah: $1",
+       "internalerror-fatal-exception": "Sajabaning fatal ngetik \"$1\"",
+       "filecopyerror": "Nénten mrasidayang nyadur berkas \"$1\" ka \"$2\".",
+       "filerenameerror": "Nénten prasida nguah wastan berkas \"$1\" manados \"$2\".",
+       "filedeleteerror": "Nénten prasida ngusap berkas \"$1\".",
+       "directorycreateerror": "Nénten prasida ngaé direktori \"$1\".",
+       "directoryreadonlyerror": "Direktori \"$1\" wantah-baca.",
+       "directorynotreadableerror": "Direktori \"$1\" nénten prasida kabaca.",
+       "filenotfound": "Nénten prasida ngusap berkas \"$1\".",
+       "unexpected": "Nilai di sisin jangkauan: \"$1\"=\"$2\".",
+       "formerror": "Pikobet: Nénten prasida ngirim blanko.",
+       "badarticleerror": "Parilaksana puniki nénten prasida ring kaca puniki.",
+       "cannotdelete": "Kaca utawi berkas \"$1\" nénten prasida kausap.\nAsané sampun kausap olih jadma lianan.",
+       "cannotdelete-title": "Nénten prasida ngusap kaca \"$1\"",
+       "delete-scheduled": "Kaca $1 karencanayang mangda kausap. Mangda trepti.",
+       "delete-hook-aborted": "Pangusapan kawangdeang olih kait parser.\nNénten wénten panlatarang.",
+       "no-null-revision": "Nénten prasida makarya revisi null anyar anggén kaca \"$1\"",
        "badtitle": "murda sane nenten manut",
        "badtitletext": "Judul halaman sane katagih nenten patut, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.\n\nmurda lembar sane kaarsa nenten sida kaedengang, kosong, utawi murda murda antarbasa utawi antarwiki sane iwang",
+       "title-invalid-empty": "Murda kaca sané kapinta nénten madaging napi-napi utawi madaging wantah wasta saking silih tunggil genah aran\nJudul halaman yang diminta kosong atau berisi hanya nama sebuah ruang nama.",
+       "title-invalid-utf8": "Murda kaca sané kapinta madué paiketan UTF-8 sané nénten resmi.",
+       "title-invalid-interwiki": "Murda madué pranala pantaraningwiki sané nénten prasida kaanggén ring murda.",
+       "title-invalid-talk-namespace": "Murda situs sané kapinta nuju ka kaca pablibagan sané nénten prasida kasayagayang.",
+       "title-invalid-characters": "Murda kaca sané kapinta madué watek sané ten resmi:\"$1\".",
+       "title-invalid-relative": "Murda madué alamat relatif. Murda kaca relatif (./, ../) nénten resmi, mawinan prasida ngawinan wangde ritatkala kapindatangan olih prajuru panganggé.",
+       "title-invalid-magic-tilde": "Murda kaca madué paiketan tilda sané nénten resmi (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Murda kaca sané kapinta kalintang dawa. Punika patut kasimbolang sareng $1 {{PLURAL:$1|byte|bytes}} ring simbol UTF-8.",
+       "title-invalid-leading-colon": "Murda kaca sané kapinta kakawitin antuk tanda petik kalih sané nénten resmi.",
+       "perfcached": "Data sakadi puniki kaambil saking pasinggahan miwah asané nénten data sané mutakhir. {{PLURAL:$1|Hasil}} sakwéhnyané wénten ring pasinggahan.",
+       "perfcachedts": "Data sakadi puniki kaambil saking pasinggahan miwah pinih untat kaanyarin ring $1. {{PLURAL:$4|Hasil}} sakwéhnyané wénten ring pasinggahan.",
+       "querypage-no-updates": "Pamutakhiran saking kaca puniki kantun kamatiang. Data sané wénten driki mangkin nénten jagi kamuat malih.",
        "viewsource": "Cingak wit",
        "viewsource-title": "Cingak wit saking $1",
-       "viewsourcetext": "Jero dados nyingakin miwah nurun wit kaca puniki.",
+       "actionthrottled": "Parilaksana kawatesin",
+       "actionthrottledtext": "Ragané kawatesin antuk nglaksanayang parilaksana puniki kalintang akéh ring galah sané nampek, miwah ragané sampun ngliwatin wates sané kadurusang. Ngiring ulang malih ring akudang menit malih.",
+       "protectedpagetext": "Kaca puniki sampun kakunci antuk ngahalangin pauahan utawi parilaksana lianan.",
+       "viewsourcetext": "Ragané dados nyingakin miwah nurun wit saking kaca puniki.",
+       "viewyourtext": "Ragané prasida nyingakin utawi nyadur sumber saking '''uahan Ragané''' ka kaca puniki.",
+       "protectedinterface": "Kaca puniki ngamuat teks pantaraningrai antuk perangkat lunak ring wiki puniki, miwah kalindungin ring parilaksana sané nénten patut. Antuk nambehin utawi nguah terjemahan ring makasami wiki, mangda nganggé [https://translatewiki.net/ translatewiki.net], pakarya pelokalan MediaWiki.",
+       "editinginterface": "<strong>Panginget:</strong> Ragané nguah silih tunggil kaca sané kaangén nyayagayang teks pantaraningrai antuk perangkat lunak.\nUahan ring kaca puniki jagi ngawinang mal ring pantaraningrai panganggé majeng panganggé lianan ring wiki puniki.",
+       "translateinterface": "Antuk nambehin utawi nguah terjemahan makasami wiki, mangda anggén   [https://translatewiki.net/ translatewiki.net], pakarya pelokalan MediaWiki.",
+       "cascadeprotected": "Kaca puniki sampun kajaga saking uwahan mawinan kasarengi ring {{PLURAL:$1|kaca|kaca-kaca}} sakadi punika sané sampun kajaga malarapan opsi \"madérét\":\n$2",
+       "namespaceprotected": "Ragané ten madué kawenangan ngakses antuk nguah kaca ring genah aran '''$1'''.",
+       "customcssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki, mawinan madaging tatacara praragan panganggé.",
+       "customjsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki mawinan madaging tatacara praragan panganggé.",
+       "customjsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScrip puniki, mawinan madaging tatacara praragan panganggé lianan.",
+       "sitecssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki mawinan parilaksana sakadi punika asané prasida mabuat ring makasami pamiarsa.",
+       "sitejsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki mawinan parilaksana sakadi punika prasida mabuat ring makasami pamiarsa.",
+       "sitejsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki mawinan parilaksana sakadi punika asané prasida mabuat ring makasami pamiarsa.",
+       "mycustomcssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki.",
+       "mycustomjsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki.",
+       "mycustomjsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki.",
+       "myprivateinfoprotected": "Ragané nénten madué izin antuk nguah informasi praragan ragané.",
+       "mypreferencesprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki.",
+       "ns-specialprotected": "Kaca ring genah aran {{ns:special}} nénten prasida kauah.",
+       "titleprotected": "Murda puniki kajaga saking pabuat saking [[User:$1|$1]].\nNapi ngawinan asapunika wantah kaicénin sakadi <em>$2</em>.",
+       "filereadonlyerror": "Nénten prasida memodifikasi berkas \"$1\" mawinan berkas repositori \"$2\" inggih punika mode baca-manten.\n\nPrajuru sané ngunci madué napi sané ngawinan asapunika: \"$3\".",
+       "invalidtitle": "Murda nénten resmi",
+       "invalidtitle-knownnamespace": "Murda sané nénten resmi antuk genah aran \"$2\" miwah teks \"$3\"",
+       "invalidtitle-unknownnamespace": "Judul sané nénten resmi antuk nomor genah aran nénten kauningin $1 miwah teks \"$2\"",
+       "exception-nologin": "Durung manjing log",
+       "exception-nologin-text": "Durusang manjing log mangda prasida ngaksés kaca utawi parilaksana puniki.",
+       "exception-nologin-text-manual": "Durusang $1 mangda prasida ngaksés kaca utawi parilaksa puniki.",
+       "virus-badscanner": "Pikobet konfigurasi: pemindai virus nénten kauningin: ''$1''",
+       "virus-scanfailed": "Pemindaian nénten prasida (kode $1)",
+       "virus-unknownscanner": "Antivirus nénten kauningin:",
+       "logouttext": "'''Ragané sampun medal log saking sistem.'''\n\nélingan yéning makudang-kudang kaca asané kantun nampilang ragané sakadi kantun manjing log, ngantos ragané ngicalang pasinggahan penjelajahan web Ragané.",
+       "logging-out-notify": "Ragané kantun medal log, antosang jebos.",
+       "logout-failed": "Nénten prasida medal log mangkin: $1",
+       "cannotlogoutnow-title": "Nénten prasida medal log mangkin",
+       "cannotlogoutnow-text": "Medal log nénten kadadosang ritatkala nganggén $1.",
+       "welcomeuser": "Rahajeng rauh, $1!",
+       "welcomecreation-msg": "Akun ragané sampun kakaryanin. Elingan uwah konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] ragané.",
        "yourname": "Peséngan sang anganggé:",
        "userlogin-yourname": "Peséngan sang anganggé",
-       "userlogin-yourname-ph": "Dagingin peséngan sang anganggé jero",
+       "userlogin-yourname-ph": "Dagingin peséngan sang anganggé ragané",
+       "createacct-another-username-ph": "Dagingin peséngan sang anganggé",
        "yourpassword": "Kruna sandi:",
        "userlogin-yourpassword": "Kruna sandi",
-       "userlogin-yourpassword-ph": "Dagingin kruna sandi jero",
+       "userlogin-yourpassword-ph": "Dagingin kruna sandi ragané",
        "createacct-yourpassword-ph": "Dagingin kruna sandi",
        "yourpasswordagain": "jumunin kruna sandi",
-       "createacct-yourpasswordagain": "Mastiang kruna kunci",
+       "createacct-yourpasswordagain": "Pastiang kruna sandi",
        "createacct-yourpasswordagain-ph": "Dagingin malih kruna sandi",
-       "userlogin-remembermypassword": "Banggayang mangda tetep ngranjing",
+       "userlogin-remembermypassword": "Banggayang mangda setata manjing log",
        "cannotlogin-title": "Nénten prasida manjing log",
+       "cannotlogin-text": "Nénten prasida manjing log.",
        "cannotloginnow-title": "Mangkin nénten prasida manjing log",
+       "cannotloginnow-text": "Nénten prasida manjing log yéning nganggé $1.",
+       "cannotcreateaccount-title": "Nénten prasida ngardi akun",
        "login": "Manjing log",
        "nav-login-createaccount": "Manjing log / karyanin akun",
        "logout": "Medal log",
        "notloggedin": "Durung manjing log",
        "userlogin-noaccount": "Durung madué akun?",
        "userlogin-joinproject": "Nyarengin {{SITENAME}}",
-       "createaccount": "Karyanin akun",
-       "userlogin-resetpassword-link": "Engsap ring kruna kunci?",
+       "createaccount": "Kardi akun",
+       "userlogin-resetpassword-link": "Lali ring kruna sandi ragané?",
        "userlogin-helplink2": "Wantuan indik manjing log",
-       "createacct-emailoptional": "Alamat email (becikang kadagingin)",
-       "createacct-email-ph": "Dagingin alamat email jero",
-       "createacct-submit": "Karyanin akun jero",
-       "createacct-benefit-heading": "{{SITENAME}} kakaryanin olih anak sakadi jero.",
+       "userlogin-createanother": "Kardi akun lianan",
+       "createacct-emailrequired": "Alamat séwala éléktronik",
+       "createacct-emailoptional": "Alamat séwala éléktronik (opsional)",
+       "createacct-email-ph": "Dagingin alamat séwala éléktronik ragané",
+       "createacct-another-email-ph": "Dagingin alamat séwala éléktronik",
+       "createacct-submit": "Kardi akun ragané",
+       "createacct-another-submit": "Kardi akun",
+       "createacct-continue-submit": "Lanturang ngardi akun",
+       "createacct-another-continue-submit": "Lanturang ngardi akun",
+       "createacct-benefit-heading": "{{SITENAME}} kakaryanin antuk anak sakadi ragané.",
        "createacct-benefit-body1": "{{PLURAL:$1|uahan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
        "createacct-benefit-body3": "{{PLURAL:$1|sang anuut}} sané mangkin",
+       "loginerror": "Pikobet manjing log",
+       "createacct-error": "Pikobet ngardi akun",
+       "createaccounterror": "Nénten prasida ngardi akun: $1",
+       "loginsuccesstitle": "Sampun manjing log",
+       "loginsuccess": "<strong>Ragané sané mangkin sampun manjing log {{SITENAME}} pinaka \"$1\".</strong>",
        "mailmypassword": "nyumu ngaryanin kruna sandi",
+       "accountcreated": "Akun sampun kakardi",
+       "accountcreatedtext": "Akun sang anganggé [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|pabligbagan]]) sampun kakardi.",
        "loginlanguagelabel": "Basa: $1",
        "pt-login": "Manjing log",
        "pt-login-button": "Manjing log",
-       "pt-createaccount": "Ngaryanin akun",
+       "pt-login-continue-button": "Lanturang manjing log.",
+       "pt-createaccount": "Kardi akun",
        "pt-userlogout": "Medal log",
+       "changepassword": "Uah kruna sandi",
+       "changepassword-success": "Kruna sandi ragané sampun kauah!",
+       "botpasswords": "Kruna sandi bot",
+       "botpasswords-createnew": "Kardi kruna sandi bot anyar",
+       "botpasswords-label-needsreset": "(perlu nyumu ngardi kruna sandi)",
        "botpasswords-label-create": "Ngae",
        "botpasswords-label-cancel": "Wangdé",
        "botpasswords-label-delete": "Usap",
-       "botpasswords-label-resetpassword": "Nyumu kruna sandi",
+       "botpasswords-label-resetpassword": "Nyumu ngardi kruna sandi",
+       "botpasswords-created-title": "Kruna sandi bot kakardi",
+       "resetpass_forbidden-reason": "Kruna sandi nénten prasida kauahin: $1",
+       "resetpass-submit-loggedin": "Uah kruna sandi",
        "resetpass-submit-cancel": "Wangdé",
-       "passwordreset": "Nyumu kruna sandi",
-       "bold_sample": "teks puniki mesurat tebel",
-       "bold_tip": "teks puniki mesurat tebel",
-       "italic_sample": "teks puniki masurat sendeh",
-       "italic_tip": "teks puniki masurat sendeh",
-       "link_sample": "murda pranala",
-       "link_tip": "pranala tengah",
-       "extlink_sample": "http://www.example.com murda pranala",
-       "extlink_tip": "pranala sisi (sampunang lali kakawitin http://)",
-       "headline_sample": "teks murda",
-       "headline_tip": "subgolongan undag 2",
-       "nowiki_sample": "lebuang teks sane nenten jagi keformat ring driki",
-       "nowiki_tip": "campahang format wiki",
-       "image_tip": "cantumin pupulan",
-       "media_tip": "Pranala depukan",
-       "sig_tip": "tanda tangan ida dane sareng tanda waktu",
-       "hr_tip": "garis horizontal",
+       "passwordreset": "Jumunin ngardi kruna sandi",
+       "changeemail-password": "Kruna sandi {{SITENAME}} ragané:",
        "summary": "Ringkesan:",
        "minoredit": "Puniki uahan alit",
-       "watchthis": "tinjo lembar puniki",
+       "watchthis": "Awasin kaca puniki",
        "savearticle": "Raksa kaca",
-       "publishpage": "Terbitang kaca",
+       "savechanges": "Raksa uahan",
+       "publishpage": "Wedar kaca",
+       "publishchanges": "Wedar uahan",
        "savearticle-start": "Raksa kaca...",
-       "publishpage-start": "Terbitang kaca…",
-       "preview": "tayangan sadurungnyane",
-       "showpreview": "Sinahang preview",
+       "savechanges-start": "Raksa uahan...",
+       "publishpage-start": "Wedar kaca…",
+       "publishchanges-start": "Wedar uahan...",
+       "preview": "Pracingak",
+       "showpreview": "Édéngang pracingak",
        "showdiff": "Cingak uahan",
        "anoneditwarning": "<strong>Pingetan:</strong> Ida dané nénten kacatet ngranjing. Alamat IP ida dané jagi kacatet ring sejarah (indik sané dumunan) ring lembar puniki. Yening ida dane <strong>[$1 log in]</strong> utawi <strong>[$2 create an account]</strong>, your edits will be attributed to your username, along with other benefits.",
+       "summary-preview": "Pracingak saking ringkesan uahan:",
+       "blockedtext": "<strong>Peséngan penganggé utawi genah IP ragané kablokir .</strong>\n\nBlokir puniki kalaksanayang olih $1.\nKablokir krana <em>$2</em>.\n\n* Kablokir saking: $8\n* Blokir kadaluwarsa ring: $6\n* Tetujon ngablokir: $7\n\nRagané dados ngubungin $1 utawi [[{{MediaWiki:Grouppage-sysop}}|prajuru]] antuk mabligbagin.\nRagané nénten dados nganggén fitur puniki \"{{int:emailuser}}\" sajabaning ragané sampun ngranjingang email sané patut ring [[Special:Preferences|pustaka]] tur ragané nénten kablokir antuk nganggén\nGenah IP ragané sané pinih anyar inggih punika $3, tur ID pamblokiran inggih punika #$5.\nTulung genahang silih sinunggil utawi kalih pidarta ring pitakén sané kakaryanin.",
        "loginreqlink": "manjing log",
+       "accmailtitle": "Kruna sandi kakirim",
        "newarticle": "(Anyar)",
        "newarticletext": "ida dane ngiring pranala nuju lembar sane durung wenten. yening jagi ngaryanang lembar punika, ketik daging lembar ring kotak sane wenten ring beten puniki. (cingak [$1 lembar wantuan] anggen wacana salanturnyane). yening ida dane nenten nyelapang neked ring lembar puniki, klik tombol \"back\" ring \"penjelajah web\" ida dane.",
-       "noarticletext": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngrereh murda nganggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} nguwah lembar puniki]</span>.",
-       "noarticletext-nopermission": "mangkin nenten wenten teks ring lembar puniki. ida dane prasida [[Special:Search/{{PAGENAME}}|ngarereh murda anggen lembar puniki]] ring lembar-lembar sane lianan, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngarereh log sane mapaiketan], utawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngubah lembar puniki]</span>.",
+       "anontalkpagetext": "<em>Niki inggih punika kaca pabligbagan sang penganggé sané nénten nguningayang wasta utawi nénten nganggén wasta.</em> Nika mawinan penganggé punika patut nganggén genah IP sané mawentuk angka antuk manyihnayang.\nGenah IP punika prasida kaanggén sareng-sareng olih makudang-kudang panganggé sané lianan. \nYéning Ragané sang penganggé sané nénten mawasta tur marasa ngamolihang pidarta sané nénten patut, ngiring \n[[Special:CreateAccount|ngaryanin akun]] utawi [[Special:UserLogin|sang penganggé ngranjing log]] antuk ngelidin kabingungan saking sang penganggé sané lianan ring galah sané lianan.",
+       "noarticletext": "Mangkin nénten wénten suratan ring kaca puniki.\nRagané prasida [[Special:Search/{{PAGENAME}}|ngrereh murda kaca puniki]] ring kaca lianan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sané mapaiketan],\nutawi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngardi kaca puniki]</span>.",
+       "noarticletext-nopermission": "Mangkin nénten wénten suratan ring kaca puniki.\nRagané prasida [[Special:Search/{{PAGENAME}}|ngrereh murda kaca puniki]] ring kaca lianan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ngrereh log sané mapaiketan]</span>, nanging ragané tan kalugra ngardi kaca puniki.",
        "userpage-userdoesnotexist-view": "Akun sang anganggé \"$1\" nénten madaptar.",
-       "previewnote": "\"elingang yening puniki wantah sane lintang.\" Panguwahan ida dane durung kasimpen!",
-       "continue-editing": "Magingsir ka genah ngauwah",
+       "clearyourcache": "<strong>Catetan:</strong>Sesampun karaksayang, Ragané patut ngentasin tembolok peramban wéb antuk nyingakin uahan.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> ritatkala ngaklik <em>Reload</em>, utawi teken <em>Ctrl-F5</em> utawi <em>Ctrl-R</em> (<em>⌘-R</em> ring Mac)\n* <strong>Google Chrome:</strong> Teken <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ring Mac)\n* <strong>Internet Explorer:</strong> Teken <em>Ctrl</em> ritatkala ngaklik <em>Refresh</em>, utawi teken <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Ngranjing ka <em>Ménu → Pengaturan </em> (<em>Opera → Pustaka</em> ring Mac) Salanturnyané ka <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "previewnote": "<strong>Éling yéning puniki wantah pracingak.</strong>\nUahan ragané durung karaksa!",
+       "continue-editing": "Magingsir ka genah panguah",
        "editing": "Nguahin $1",
        "creating": "Makarya $1",
        "editingsection": "Nguahin $1 (pahan)",
        "editingcomment": "Nguahin $1 (pahan anyar)",
+       "yourtext": "Suratan ragané",
+       "yourdiff": "Bina",
        "templatesused": "{{PLURAL:$1|Citakan}} sané kaanggén ring kaca puniki:",
+       "templatesusedpreview": "{{PLURAL:$1|Citakan}} sané kaanggén ring pracingak puniki:",
        "template-protected": "(kasaibin)",
        "template-semiprotected": "(semi-kasaibin)",
        "hiddencategories": "lembar niki inggih punika krama saking {{PLURAL:$1|1 golongan sane mengkeb|$1 golongan sane mengkeb}}",
-       "permissionserrors": "Kaiwangan ritatkala ngranjing",
-       "permissionserrorstext-withaction": "ida dané nénten madué kuasa ngranjing anggén $2, riantukan {{PLURAL:$1|alasan}} ring sor puniki:",
+       "permissionserrors": "Pikobet lugra",
+       "permissionserrorstext-withaction": "Ragané tan kalugra $2, antukan {{PLURAL:$1|larapan}} ring sor puniki:",
        "recreate-moveddeleted-warn": "\"pingetan\" ida dane ngawe malih lembar sane naenin maapus.'''\n\nmangda kayunin malih napike pantes lanturang suntingan ida dane. puniki log pengapusan lan pangisidan saking lembar puniki:",
        "moveddeleted-notice": "Kaca puniki sampun kausapin.\nAnggen pewarah, proteksi, lan pengisidan log saking lembar puniki cingakin pustaka beten.",
        "postedit-confirmation-created": "Kacanyané sampun kakaryanin.",
        "postedit-confirmation-saved": "Uahan jero sampun maraksa.",
+       "postedit-confirmation-published": "Uahan ragané sampun kawedar.",
        "content-model-wikitext": "sesuratan wiki",
        "post-expand-template-inclusion-warning": "pinget: ukuran templat sane keanggen kalangkung ageng. wenten templat sane kacampahang",
        "post-expand-template-inclusion-category": "lembar sane maukuran templat sane nglangkungin wates",
        "post-expand-template-argument-warning": "\"peminget\" lembar puniki madaging kiranglangkungnyane siki argumen templat anggen ukuran ekspansi sane kaliwat ageng. argumen-argumen punika sampun kacampahang.",
        "post-expand-template-argument-category": "lembar sane medaging argumen templat sane kacampahang",
+       "undo-failure": "Uwahan puniki nénten prasida kabalikang krana wénten konflik panguwahan antara.",
        "viewpagelogs": "Cingak log saking kaca puniki",
-       "currentrev-asof": "pabecikan sane anyar ring pinanggal$1",
+       "nohistory": "Nénten wénten babad uahan ring kaca puniki.",
+       "currentrev-asof": "Révisi sané pinih anyar ring $1",
        "revisionasof": "Uahan ri tatkala $1",
-       "revision-info": "Panguwahan per $1 olih {{GENDER:$6|$2}}$7",
+       "revision-info": "Révisi ri tatkala $1 antuk {{GENDER:$6|$2}}$7",
        "previousrevision": "← Uahan sadurungnyané",
        "nextrevision": "Uahan salanturnyané →",
        "currentrevisionlink": "Uahan sané mangkin",
        "cur": "mgkn",
        "last": "sdrg",
        "histlegend": "pilih kalih tombol radio lantur pecik tombol \"bandingang\" anggen ngebandingang indik lianan. klik siki tanggal anggen nyingak indik lianan lembar ring pinanggal punika.<br />(skr)= binanne saking indik lianan sane mangkin, (untat) = binanne saking indik lianan sane dumunan, '''k''' = panguwahan alit, '''b''' = panguwahan bot, → = panguwahan kepahan, ← = reringkesan otomatis",
-       "history-fieldset-title": "Nyaringin révisi",
+       "history-fieldset-title": "Saring révisi",
        "history-show-deleted": "wantah sane kaapus",
-       "histfirst": "pinih suwe",
+       "histfirst": "pinih sué",
        "histlast": "pinih anyar",
        "history-feed-title": "Babad uahan",
        "history-feed-description": "Babad uahan kaca puniki ring wiki",
        "history-feed-item-nocomment": "$1 ring $2",
-       "rev-delundel": "gentos pangatonan",
+       "rev-delundel": "uah pakantenan",
        "rev-showdeleted": "sinahang",
        "revdelete-hide-comment": "Uah ringkesan",
        "revdel-restore": "gentos pangatonan",
        "mergelog": "Gabung log",
        "revertmerge": "tansida nyarengin",
        "history-title": "Babad uahan saking \"$1\"",
-       "difference-title": "$1: sane malianan ring revisi",
+       "difference-title": "Bina pantaraning révisi \"$1\"",
        "lineno": "Carik $1:",
        "compareselectedversions": "bandingang penguwahan sane kapilih",
-       "editundo": "nguliang",
-       "diff-empty": "(Nénten wénten sané malianan)",
+       "editundo": "ulihang",
+       "diff-empty": "(Nénten mabina)",
        "diff-multi-sameuser": "({{PLURAL:$1|$1 revisi pantaraning}} olih pangawi sane pateh nenten kacumawisang)",
        "diff-multi-otherusers": "({{PLURAL:$1|Siki pamecikan pantaraning|$1 pamecikan pantaraning}} olih {{PLURAL:$2|siki pangangge lianan|$2 panggange}} nenten katampilan)",
-       "searchresults": "asil pangrereh",
-       "searchresults-title": "Asil pangrereh anggén \"$1\"",
+       "searchresults": "Asil pangrereh",
+       "searchresults-title": "Asil pangrereh indik \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} sadurungnyané",
        "nextn": "{{PLURAL:$1|$1}} salanturnyané",
        "prev-page": "kaca sadurungnyané",
-       "prevn-title": "$1 {{PLURAL:$1|asil}} sadurunge",
-       "nextn-title": "$1 {{PLURAL:$1|asil}} selanturnyane",
+       "prevn-title": "$1 {{PLURAL:$1|asil}} sadurungnyané",
+       "nextn-title": "$1 {{PLURAL:$1|asil}} salanturnyané",
        "shown-title": "Sinahang $1 {{PLURAL:$1|asil}} per kaca",
        "viewprevnext": "Cingak ($1 {{int:pipe-separator}}$2)($3)",
        "searchmenu-exists": "wenten lembar sane mamurda \"[[:$1]]\" ring wiki puniki. {{PLURAL:$2|0=| cingakin taler asil rerehan lianan sane kapolihang}}",
-       "searchmenu-new": "<strong> ngawi lembar \"[[:$1]] ring wiki puniki </ strong>! {{{{PLURAL:$2|}}| 0 = | cingak teler lembar sane kapolihang ring pangreregan | cingak taler asil pangrerehan sane kapolihang}}",
+       "searchmenu-new": "<strong>Kardi kaca \"[[:$1]]\" ring wiki puniki!</strong> {{PLURAL:$2|0=|Taler cingak kaca sané temunin ragané.|Taler cingak asil pangrereh.}}",
        "searchprofile-articles": "Kaca daging",
-       "searchprofile-images": "multimedia",
+       "searchprofile-images": "Multimédia",
        "searchprofile-everything": "Samian",
-       "searchprofile-advanced": "lanturane",
+       "searchprofile-advanced": "Lanturan",
        "searchprofile-articles-tooltip": "Rereh ring $1",
        "searchprofile-images-tooltip": "Rereh depukan",
-       "searchprofile-everything-tooltip": "pangrereh ring samian isi (taler lembar wecana)",
-       "searchprofile-advanced-tooltip": "Rereh ring genah wastan sané kapilih",
+       "searchprofile-everything-tooltip": "Rereh ring samian daging (rumasuk kaca pabligbagan)",
+       "searchprofile-advanced-tooltip": "Rereh ring genah aran sané kapilih",
        "search-result-size": "$1 ({{PLURAL:$2|1 kruna|$2 kruna}})",
        "search-result-category-size": "{{PLURAL:$1|1 krama|$1 krama}}({{PLURAL:$2|1  subgolongan|$2 subgolongan}}, {{PLURAL:$3|1 pupulan|$3 pupulan}})",
        "search-redirect": "(gingsiran saking $1)",
        "search-section": "(pahan $1)",
        "search-file-match": "(anut ring daging depukan)",
-       "search-suggest": "minab sane kearsaang $1",
+       "search-suggest": "Minab sané aptiang ragané: $1",
        "searchrelated": "paiketan",
        "searchall": "samian",
-       "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> of <strong>$3</strong>|Asil-asil <strong>$1 – $2</strong> saking <strong>$3</strong>}}",
-       "search-nonefound": "nenten wenten asil sane caklek ring arsa",
+       "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> saking <strong>$3</strong>|Asil <strong>$1 – $2</strong> saking <strong>$3</strong>}}",
+       "search-nonefound": "Nénten wénten asil sané cocok sareng kuéri.",
        "powersearch-ns": "Rereh ring genah wastan:",
-       "mypreferences": "Preferensi",
+       "mypreferences": "Préferénsi",
        "prefs-user-pages": "Kaca sang anganggé",
+       "prefs-resetpass": "Uah kruna sandi",
        "saveprefs": "Raksa",
        "prefs-editing": "Nguahin",
        "prefs-namespaces": "Genah wastan",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Prajuru",
        "right-edit": "Uah kaca",
-       "right-writeapi": "nganggén API sasuratan",
+       "right-writeapi": "Anggé API sasuratan",
        "right-delete": "Usap kaca",
        "right-editprotected": "Uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
        "grant-createeditmovepage": "Karyanin, uah, miwah gingsirang kaca",
        "grant-editprotected": "Uah kaca sané kasaibin",
+       "grant-rollback": "Waliang uahan ring kaca",
        "newuserlogpage": "Log makarya sang anganggé",
+       "rightslog": "Log panguwahan hak ngaksés",
        "action-read": "wacén kaca puniki",
-       "action-edit": "uah kaca puniki",
-       "action-createpage": "karyanin kaca puniki",
-       "action-createaccount": "karyanin akun sang anganggé puniki",
+       "action-edit": "nguah kaca puniki",
+       "action-createpage": "ngardi kaca puniki",
+       "action-createaccount": "kardi akun sang anganggé puniki",
+       "action-history": "cingak babad kaca puniki",
+       "action-move": "ngingsirang kaca puniki",
        "action-delete": "usap kaca puniki",
        "action-deletedhistory": "cingak babad kaca sané kausapin",
        "action-browsearchive": "rereh kaca sané kausapin",
-       "action-editprotected": "uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
+       "action-rollback": "ngwaliang kanti gelis uahan saking sang anganggé pinih untat sané nguah sinalih tunggil kaca",
+       "action-autopatrol": "nyihnain uahan ragané yéning sampun kapratroli",
+       "action-sendemail": "ngirim séwala éléktronik",
+       "action-editprotected": "nguah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
        "action-editsemiprotected": "uah kaca sané kasaibin \"{{int:protect-level-autoconfirmed}}\"",
        "nchanges": "$1 {{PLURAL:$1|uahan}}",
        "enhancedrc-history": "babad",
        "recentchanges-summary": "Track uahan sané mangkin ring wikiné indik kaca puniki.",
        "recentchanges-noresult": "Nénten wénten uahan ring galahnyané puniki sané anut sareng praciri puniki.",
        "recentchanges-feed-description": "molihang pagentosan anyar ring wiki ring \"umpan\" puniki",
-       "recentchanges-label-newpage": "Uahan puniki makarya kaca anyar",
+       "recentchanges-label-newpage": "Uahan puniki ngardi kaca anyar",
        "recentchanges-label-minor": "Punika uahan alit",
        "recentchanges-label-bot": "Uahan puniki kalaksanayang antuk bot",
        "recentchanges-label-unpatrolled": "Uahan puniki durung kapatroli",
        "recentchanges-label-plusminus": "Agengnyané kacané kauahin antuk akéhnyané bita puniki",
-       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
+       "recentchanges-legend-heading": "<strong>Legénda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taler cingak [[Special:NewPages|bacakan kaca anyar]])",
        "recentchanges-submit": "Sinahang",
        "rcfilters-activefilters-show": "Sinahang",
        "rcfilters-filter-major-label": "Uahan tan alit",
        "rcfilters-filter-pageedits-label": "Uahan kaca",
        "rcnotefrom": "Ring beten puniki inggih punika {{PLURAL:$5|panguwahan}} saking <strong>$3, $4</strong> (kaedengang ngantos <strong>$1</strong> panguwahan).",
-       "rclistfrom": "edengang  penguwahan sane anyar wit saking $3 $2",
+       "rclistfrom": "Édéngang uahan anyar saking $2, $3",
        "rcshowhideminor": "$1 uahan alit",
        "rcshowhideminor-show": "Sinahang",
        "rcshowhideminor-hide": "Engkebang",
        "rcshowhidemine-show": "Sinahang",
        "rcshowhidemine-hide": "Engkebang",
        "rcshowhidecategorization-show": "Sinahang",
-       "rclinks": "Edengang untat $1 gentosan anyar $2 dina kaping untat",
+       "rclinks": "Sinahang $1 uahan sané untat ring $2 dina sané lintang",
        "diff": "bina",
        "hist": "bbd",
        "hide": "Engkebang",
        "newpageletter": "A",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|bita}} sasampun kauah",
-       "rc-enhanced-expand": "edengang rerincian",
-       "rc-enhanced-hide": "engkebang rerincian",
-       "rc-old-title": "witnyané kakaryanin pinaka \"$1\"",
+       "rc-enhanced-expand": "Sinahang rerincian",
+       "rc-enhanced-hide": "Engkebang rerincian",
+       "rc-old-title": "witnyané kakardi pinaka \"$1\"",
        "recentchangeslinked": "Uahan mapaiketan",
        "recentchangeslinked-toolbox": "Uahan mapaiketan",
        "recentchangeslinked-title": "Uahan sané mapaiketan $1",
-       "recentchangeslinked-summary": "lembar kautamayang puniki ngicenin kepahan penguwahan kaping untat ring lembar-lembar sana mapaiket. Lembar sane [[Special:Watchlist|ida dane iwasin]] mapinget antuk sesuratan tebel",
-       "recentchangeslinked-page": "Peséngan kaca:",
+       "recentchangeslinked-summary": "Dagingin aran kaca antuk nyingakin uahan ring kaca-kaca sané kasambung kaca punika. (Antuk nyingakin kapahan kategori, dagingin {{ns:category}}:Aran kategori). Uahan kaca-kaca ring [[Special:Watchlist|Pangawasan ragané]] kasurat <strong>tebel</strong>.",
+       "recentchangeslinked-page": "Aran kaca:",
        "recentchangeslinked-to": "Sinahang uahan saking kaca-kaca sané linked kaca puniki",
        "upload": "Unggahang depukan",
        "uploadlogpage": "Log unggahan",
        "upload-dialog-button-cancel": "Wangdé",
        "upload-dialog-button-save": "Raksa",
        "backend-fail-delete": "Tan prasida ngusapin berkas \"$1\".",
+       "uploadstash-summary": "Kaca puniki nyayagayang aksés ring berkas sané sampun kaunggah utawi sané jagi kaunggah, nanging durung kawedar ring wikiné. Berkas-berkas punika nénten sinah ring samian anak sajabaning anak sané ngunggahang.",
        "license": "kepahan lugra",
        "license-header": "Lisénsi",
        "listfiles-delete": "usap",
        "listfiles": "Bacakan depukan",
        "file-anchor-link": "Depukan",
        "filehist": "Babad berkas",
-       "filehist-help": "klik ring pinanggal/galah anggen nyingakin pupulan niki rikala punika",
+       "filehist-help": "Klik ring tanggal/galah anggén nyingakin berkas puniki ri tatkala galah punika.",
        "filehist-deleteall": "usap samian",
-       "filehist-revert": "buwungang",
-       "filehist-current": "sané mangkin",
+       "filehist-revert": "wangdéang",
+       "filehist-current": "mangkin",
        "filehist-datetime": "Tanggal/Galah",
-       "filehist-thumb": "Miniatur",
-       "filehist-thumbtext": "miniatur anggen versi ring $1",
+       "filehist-thumb": "Gambar alit",
+       "filehist-thumbtext": "Gambar alit indik vérsi $1",
        "filehist-nothumb": "Tusing ade miniatur",
        "filehist-user": "Sang anganggé",
-       "filehist-dimensions": "ukuran",
-       "filehist-comment": "tureksa",
+       "filehist-dimensions": "Diménsi",
+       "filehist-comment": "Pasaur",
        "imagelinks": "Panganggén depukan",
        "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ring sor puniki nganggén depukan puniki:",
+       "linkstoimage-more": "Langkungan saking $1 {{PLURAL:$1|kaca|kaca-kaca}} nganggén berkas puniki.\nPupulan puniki nyinahang {{PLURAL:$1|kaca kapertama nganggén pranala langsung|$1 kaca sané nganggén pranala langsung}} ka berkasé puniki\nA [[Special:WhatLinksHere/$2|pupulan sané jangkep]] taler kasayagayang.",
        "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",
+       "filepage-nofile": "Nentén wénten berkas sané maaran sakadi punika.",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
-       "upload-disallowed-here": "Jero nénten dados numpuk depukan puniki.",
+       "upload-disallowed-here": "Ragané nénten dados numpuk depukan puniki.",
        "filedelete": "Usap $1",
        "filedelete-submit": "Usap",
        "filedelete-success": "<strong>$1</strong> sampun kausapin.",
        "booksources-search-legend": "Rereh wit buku",
        "booksources-search": "Rereh",
        "specialloguserlabel": "Panggange",
+       "speciallogtitlelabel": "Tetujon (Murda utawi {{ns:user}}:sang panganggé antuk penganggé)",
        "log": "Log",
        "logeventslist-submit": "Sinahang",
        "all-logs-page": "Makasami log publik",
+       "alllogstext": "Pupulan tampilan log makasami sané kasayagayang ring {{SITENAME}}.\nRagané dados ngalaksanayang watesan tampilan nganggén ngamilih soroh log, sang anganggé (sénsitif kapitalisasi), utawi murdan kaca (taler sénsitif kapitalisasi).",
        "logempty": "Nenten katemonin entri log sane patut",
        "allpages": "Makasami kaca",
        "allarticles": "Makasami kaca",
        "allinnamespace": "Makasami kaca (genah wastan $1)",
        "allpagessubmit": "Lanturang",
        "allpages-bad-ns": "{{SITENAME}} nénten madué genah wastan \"$1\".",
-       "allpages-hide-redirects": "Ngengkebang pagingsirian",
-       "categories": "Golongan",
+       "allpages-hide-redirects": "Engkebang kaca gingsirian",
+       "categories": "Kategori",
        "categories-submit": "Sinahang",
        "deletedcontributions": "Pituut sang anganggé sané kausapin",
        "linksearch-ns": "Genah wastan:",
        "linksearch-line": "$1 masambung saking $2",
        "listusers-submit": "Sinahang",
-       "listgrouprights-members": "kepahan krama",
-       "emailuser": "email sane nganggo niki",
-       "emailmessage": "Séwalapatra:",
-       "usermessage-editor": "Séwalapatra sistem",
-       "watchlist": "kepahan peninjoan",
-       "mywatchlist": "kepahan peninjoan",
+       "listgrouprights-members": "(bacakan krama)",
+       "emailuser": "Kirim séwala éléktronik ring sang anganggé puniki",
+       "emailmessage": "Séwala:",
+       "usermessage-editor": "Séwala sistem",
+       "watchlist": "Pangawasan",
+       "mywatchlist": "Pangawasan",
        "watchlistfor2": "Anggén $1 $2",
-       "watch": "cingak",
+       "watch": "Awasin",
        "unwatch": "tan sida maninjo",
-       "watchlist-details": "{{PLURAL:$1|$1 kaca}} wénten ring bacakan pantauan ida dané (rumasuk kaca pabligbagan).",
+       "watchlist-details": "{{PLURAL:$1|$1 kaca}} wénten ring Pangawasan ragané (rumasuk kaca pabligbagan).",
+       "wlheader-showupdated": "Kaca-kaca puniki sampun kauwah saking kunjungan ragané sané pinih untat, kasinahang sareng <strong>tebel</strong>.",
+       "wlnote": "Ring sor puniki {{PLURAL:$1|uahan sané pinih untat| <strong>$1</strong> uahan}} pinih untat {{PLURAL:$2|jam|<strong>$2</strong> jam}},ngantos $3, $4.",
        "watchlist-submit": "Sinahang",
        "wlshowhideminor": "uahan alit",
-       "watchlist-options": "milih kepahan peninjo",
+       "watchlist-options": "Opsi pangawasan",
        "enotif_reset": "Cihnayang makasami kaca sané sampun karauhin",
        "enotif_subject_deleted": "Kaca {{SITENAME}} $1 sampun {{GENDER:$2|kausap}} $2",
        "enotif_body_intro_deleted": "Kaca{{SITENAME}} $1 sampun {{GENDER:$2|kausapin}} ring $PAGEEDITDATE olih $2, cingak $3.",
        "historyaction-submit": "Sinahang uahan",
        "actioncomplete": "pelaksanan sampun wusan",
        "actionfailed": "pelaksana luput",
-       "dellogpage": "log pangapus",
+       "dellogpage": "Log pangusap",
+       "rollback-confirmation-yes": "Waliang",
        "rollback-confirmation-no": "Wangdé",
-       "rollbacklink": "mabalik",
-       "rollbacklinkcount": "balikang $1 {{PLURAL:$1|suratan}}",
+       "rollbacklink": "waliang",
+       "rollbacklinkcount": "waliang $1 {{PLURAL:$1|uahan}}",
        "changecontentmodel-title-label": "Murda kaca",
        "protectlogpage": "Log saiban",
        "protectedarticle": "nyaib \"[[$1]]\"",
+       "modifiedarticleprotection": "nguwah tingkatan panyambi antuk  \"[[$1]]\"",
        "protect-default": "Lugra makasami sang anganggé",
+       "protect-level-sysop": "Wantah prajuru sané kalugra",
        "restriction-edit": "Uah",
        "restriction-move": "Gingsirang",
        "undelete": "Cingak kaca sané kausapin",
        "undeleterevisions": "$1 {{PLURAL:$1|uahan}} kausapin",
-       "undeletelink": "cingak/uliang",
+       "undeletelink": "cingak/waliang",
        "undeleteviewlink": "cingak",
        "undelete-search-title": "Rereh kaca sané kausapin",
-       "namespace": "Genah wastan:",
-       "invert": "uliang pilihan",
-       "tooltip-invert": "Centang kotak puniki mangdané ngengkebang lembar sané kauwah ring genah wastan sané kapilih (miwah genah wastan sané mapaiketan yéning kacentang)",
-       "namespace_association": "Genah wasta sané mapaiketan",
-       "tooltip-namespace_association": "Céntang kotak puniki anggén nagingin genah wasta pabligbagan utawi subjék sané mapaiketan sareng genah wasta sané kapilih",
+       "namespace": "Genah aran:",
+       "invert": "Waliang pilihan",
+       "tooltip-invert": "Céntang kotak puniki mangda ngengkebang uahan kaca ring genah aran sané kapilih (miwah genah aran sané mapaiketan yéning kacéntang)",
+       "namespace_association": "Genah aran sané mapaiketan",
+       "tooltip-namespace_association": "Céntang kotak puniki mangda marengang genah aran pabligbagan utawi subyék sané mapaiketan genah aran sané kapilih",
        "blanknamespace": "(Utama)",
        "contributions": "Pituut {{GENDER:$1|sang anganggé}}",
        "contributions-title": "Pituut sang anganggé $1",
        "mycontris": "Pituut",
        "anoncontribs": "Pituut",
-       "contribsub2": "antuk {{GENDER:$3|$1}} ($2)",
+       "contribsub2": "Antuk {{GENDER:$3|$1}} ($2)",
+       "nocontribs": "Nénten wénten uwahan sané patut sareng cihna punika.",
        "uctop": "sane mangkin",
        "month": "Saking sasih (miwah sadurungnyané)",
        "year": "Saking warsa (miwah sadurungnyané):",
-       "sp-contributions-blocklog": "log pemblokiran",
+       "sp-contributions-blocklog": "log pangempet",
        "sp-contributions-deleted": "pituut {{GENDER:$1|sang anganggé}} sané kausapin",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "pabligbagan",
        "sp-contributions-search": "Rereh pituut",
        "sp-contributions-username": "Alamat IP wiadin peséngan sang anganggé:",
-       "sp-contributions-toponly": "tampilang wantah panguwahan sane anyar",
-       "sp-contributions-newonly": "Tampilang wantah panguwahan sane anyar",
+       "sp-contributions-toponly": "Wantah édéngang uahan sané pinih anyar",
+       "sp-contributions-newonly": "Wantah édéngang uahan sané ngardi kaca",
        "sp-contributions-submit": "Rereh",
        "whatlinkshere": "Pranala iriki",
-       "whatlinkshere-title": "lembar-lembar sane maduwe pranala kaping \"$1\"",
+       "whatlinkshere-title": "Kaca sané kasambung ring \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere": "lembar puniki maduwe pranala ke '''$2'''",
+       "linkshere": "Kaca-kaca ring sor puniki kasambung ring <strong>$2</strong>:",
        "nolinkshere": "Nénten wénten kaca sané madué pranala ring <strong>$2</strong>.",
        "isredirect": "Kaca gingsiran",
-       "istemplate": "sareng kasurat",
-       "isimage": "pranala pupulan-pupulan",
-       "whatlinkshere-prev": "{{PLURAL:$1|sadurungnyane|$1 sadurungnyane}}",
-       "whatlinkshere-next": "{{PLURAL:$1|selanturnyane}}",
+       "istemplate": "transklusi",
+       "isimage": "pranala berkas",
+       "whatlinkshere-prev": "{{PLURAL:$1|sadurungnyané|$1 sadurungnyané}}",
+       "whatlinkshere-next": "{{PLURAL:$1|salanturnyané|$1 salanturnyané}}",
        "whatlinkshere-links": "← pranala",
-       "whatlinkshere-hideredirs": "$1 pangalihan",
+       "whatlinkshere-hideredirs": "$1 kaca gingsiran",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "$1 pranala",
        "whatlinkshere-hideimages": "$1 pranala berkas",
-       "whatlinkshere-filters": "Panyaring",
+       "whatlinkshere-filters": "Panyaringan",
        "ipboptions": "2 jam:2 hours,1 dina:1 day,3 dina:3 days,1 minggu:1 week,2 minggu:2 weeks,1 sasih:1 month,3 sasih:3 months,6 sasih:6 months,1 taun:1 year,tanpa wates:infinite",
        "ipb-pages-label": "Kaca",
        "ipb-namespaces-label": "Genah wastan",
        "block-prevent-edit": "Nguahin",
-       "ipblocklist": "ngempetin sane nganggo",
+       "ipblocklist": "Sang anganggé sané kaempetin",
        "infiniteblock": "Nénten kawates",
        "blocklist-nousertalk": "tan prasida nguahin kaca pabligbagan praragan",
        "blocklist-editing-page": "kaca",
        "blocklist-editing-ns": "genah wastan",
-       "blocklink": "ngempetin",
+       "blocklink": "empet",
        "unblocklink": "ngicalang kaempetan",
-       "change-blocklink": "gentosin empetin",
+       "change-blocklink": "uah pangempet",
        "contribslink": "pituut",
-       "blocklogpage": "log pemblokiran",
+       "blocklogpage": "Log pangempet",
        "blocklogentry": "mlokir [[$1]] anggen pangwates galah $2$3",
-       "block-log-flags-nocreate": "ngawe akun kaicalang",
+       "reblock-logentry": "nguwah blokiran aturan antuk [[$1]] sareng galah kadaluwarsa $2 $3",
+       "block-log-flags-nocreate": "pangardi akun kapademang",
+       "proxyblocker": "Sané ngablokir proxy",
        "movelogpage": "Log gingsiran",
-       "revertmove": "buwungang",
-       "export": "ekspor lembar",
+       "revertmove": "wangdéang",
+       "export": "Ékspor kaca",
        "export-download": "Raksa pinaka berkas",
-       "allmessages": "Séwalapatra sistem",
+       "allmessages": "Séwala sistem",
        "allmessagesname": "pesengan",
        "allmessagesdefault": "teks lingga",
        "thumbnail-more": "Ngedénang",
        "thumbnail_error": "luput ngaryanin bentuk cenik $1",
        "import-interwiki-sourcepage": "Kaca wit:",
        "importlogpage": "Log impor",
-       "tooltip-pt-userpage": "Kaca {{GENDER:|sang anganggé jero}}",
-       "tooltip-pt-mytalk": "Kaca pabligbagan {{GENDER:|jero}}",
-       "tooltip-pt-preferences": "Preferensi {{GENDER:|jero}}",
-       "tooltip-pt-watchlist": "kepahan-kepahan lembar sane katinjo titiang",
-       "tooltip-pt-mycontris": "Bacakan pituut {{GENDER:|jero}}",
-       "tooltip-pt-login": "Jero kaaptiang mangda manjing log; yadiastun nénten wajib",
+       "tooltip-pt-userpage": "Kaca {{GENDER:|sang anganggé ragané}}",
+       "tooltip-pt-mytalk": "Kaca pabligbagan {{GENDER:|ragané}}",
+       "tooltip-pt-preferences": "Préferénsi {{GENDER:|ragané}}",
+       "tooltip-pt-watchlist": "Bacakan kaca sané uahannyané awasin ragané",
+       "tooltip-pt-mycontris": "Bacakan pituut {{GENDER:|ragané}}",
+       "tooltip-pt-login": "Ragané kaaptiang mangda manjing log; yadiastun nénten wajib",
        "tooltip-pt-logout": "Medal log",
-       "tooltip-pt-createaccount": "Jero kaaptiang mangda makarya akun miwah manjing log; yadiastun nénten wajib",
+       "tooltip-pt-createaccount": "Ragané kaaptiang mangda ngardi akun miwah manjing log; yadiastun nénten wajib",
        "tooltip-ca-talk": "Pabligbagan indik kaca daging",
        "tooltip-ca-edit": "Uah kaca puniki",
-       "tooltip-ca-addsection": "nyumunin kepahan anyar",
-       "tooltip-ca-viewsource": "Kaca puniki kasaibin.\nJero wantah prasida nyingakin witnyané",
+       "tooltip-ca-addsection": "Wiwit bagian anyar",
+       "tooltip-ca-viewsource": "Kaca puniki kasaibin.\nRagané wantah prasida nyingakin witnyané",
        "tooltip-ca-history": "Uahan sadurungnyané saking kaca puniki",
        "tooltip-ca-protect": "Saib kaca puniki",
        "tooltip-ca-unprotect": "Uah saiban kaca puniki",
        "tooltip-ca-delete": "Usap kaca puniki",
        "tooltip-ca-move": "Gingsirang kaca puniki",
-       "tooltip-ca-watch": "Imbuhin kaca puniki ring bacakan pantauan ida dané",
-       "tooltip-ca-unwatch": "apus lembar niki ring daftar paninjoan ida dane",
+       "tooltip-ca-watch": "Tambeh kaca puniki ring pangawasan ragané",
+       "tooltip-ca-unwatch": "Usap kaca puniki saking pangawasan ragané",
        "tooltip-search": "Rereh ring {{SITENAME}}",
        "tooltip-search-go": "Rereh kaca sané mapeséngan pateh sakadi puniki yéning wénten",
        "tooltip-search-fulltext": "Rereh kaca sané madaging sesuratan puniki",
        "tooltip-n-randompage": "Cihnayang kaca ulah-aluh",
        "tooltip-n-help": "Genah ngrereh wantuan",
        "tooltip-t-whatlinkshere": "Bacakan makasami kaca ring wiki sané nuju iriki",
-       "tooltip-t-recentchangeslinked": "Uahan sané mangkin saking kaca-kaca sané linked ring kaca puniki",
+       "tooltip-t-recentchangeslinked": "Uahan sané mangkin saking kaca-kaca sané kasambung ring kaca puniki",
        "tooltip-feed-atom": "\"atom feed\" anggen lembar puniki",
-       "tooltip-t-contributions": "Bacakan pituut olih {{GENDER:$1|sang anganggé puniki}}",
-       "tooltip-t-emailuser": "Ngirim surel majeng ring {{GENDER:$1|penganggo puniki}}",
+       "tooltip-t-contributions": "Bacakan pituut antuk {{GENDER:$1|sang anganggé puniki}}",
+       "tooltip-t-emailuser": "Kirim séwala éléktronik ring {{GENDER:$1|sang anganggé puniki}}",
        "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évisinnyané kacané puniki",
+       "tooltip-t-permalink": "Pranala ajeg anggén révisin 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",
+       "tooltip-ca-nstab-special": "Puniki kaca kusus tur nénten prasida kauah",
        "tooltip-ca-nstab-project": "Cingak kaca proyek",
        "tooltip-ca-nstab-image": "Cingak kaca depukannyané",
-       "tooltip-ca-nstab-mediawiki": "Cingak séwalapatra sistem",
+       "tooltip-ca-nstab-mediawiki": "Cingak séwala sistem",
        "tooltip-ca-nstab-template": "Cingak citakan",
        "tooltip-ca-nstab-help": "Cingak kaca wantuan",
        "tooltip-ca-nstab-category": "Cingak kaca kategori",
        "tooltip-minoredit": "pingetin puniki dados panguwahan kidik",
-       "tooltip-save": "Raksa uahan jero",
-       "tooltip-preview": "Pagentosan sane dumun duwen ida dane, mangda anggen niki sadurung jagi nyimpen!",
-       "tooltip-diff": "Sinahang uahan sané karyanin jero ring sesuratannyané",
-       "tooltip-compareselectedversions": "cingak binane makekalih kepahan lembar sane kasudi",
-       "tooltip-watch": "imbuhin lembar niki ring daftar paninjoan ida dane",
-       "tooltip-rollback": "\"nguliang\" muwungan jagi ngabecikang ring lembar puniki nuju haturan sane untat ngangge apisan klik",
-       "tooltip-undo": "\"nguliang\" ngabuwungin jagi ngabecikang niki lan ngagah kotak mecikang ngangge mode pratayang. dasar ipun prasida kaimbuhin ring kotak pamicutet",
+       "tooltip-save": "Raksa uahan ragané",
+       "tooltip-publish": "Wedar uahan ragané",
+       "tooltip-preview": "Pracingak uahan ragané. Rarisang nganggén pracingak puniki sadurung ngraksa.",
+       "tooltip-diff": "Édéngang uahan sané karyanin ragané ring suratannyané",
+       "tooltip-compareselectedversions": "Cingak bina pantaraning kalih révisi kaca puniki sané kapilih",
+       "tooltip-watch": "Tambeh kaca puniki ring pangawasan ragané",
+       "tooltip-rollback": "\"Waliang\" wantah ngwangdéang uahan kontributor sané pinih untat ring kaca puniki antuk klik apisan",
+       "tooltip-undo": "\"Ulihang\" wantah ngwangdéang uahan puniki miwah membuka formulir uahannyané ring mode pracingak. Larapan prasida katambehin ring ringkesannyané.",
        "tooltip-summary": "Dagingin ringkesan",
-       "simpleantispam-label": "Pamariksa anti-spam.\nPuniki <strong>wenten</strong> kaisi!",
+       "simpleantispam-label": "Panuréksa anti-spam.\n<strong>Sampunang</strong> nagingin puniki!",
        "pageinfo-title": "Pidarta indik \"$1\"",
        "pageinfo-header-basic": "Pidarta kaca",
        "pageinfo-header-edits": "Babad uahan",
        "pageinfo-header-restrictions": "Saiban kaca",
-       "pageinfo-header-properties": "Properti suratan",
-       "pageinfo-display-title": "Edengang judul",
+       "pageinfo-header-properties": "Properti kaca",
+       "pageinfo-display-title": "Murda tampilan",
+       "pageinfo-default-sort": "Kunci urut sané baku",
        "pageinfo-length": "Dawannyané kaca (ring bita)",
        "pageinfo-namespace": "Genah wastan",
        "pageinfo-article-id": "ID kaca",
        "pageinfo-language": "Basa ring daging kaca",
        "pageinfo-content-model": "Modél antuk daging kaca",
+       "pageinfo-robot-policy": "Kaindéksang antuk robot",
        "pageinfo-robot-index": "Kalugra",
        "pageinfo-robot-noindex": "Tan kalugra",
-       "pageinfo-watchers": "Akéh nomér sané negdeg kaca",
-       "pageinfo-few-watchers": "Kirang saking $1 {{PLURAL:$1|tamiu}}",
+       "pageinfo-watchers": "Akéh sané ngawasin kaca",
+       "pageinfo-few-watchers": "Kirang saking $1 {{PLURAL:$1|sané ngawasin}}",
        "pageinfo-redirects-name": "Akéh nomer sané magingsir ka kaca puniki",
        "pageinfo-subpages-name": "Kapahan kaca saking kaca puniki",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|kaalihang}}; $3 {{PLURAL:$3|nénten-kaalihang}})",
        "pageinfo-firstuser": "Sang makarya kaca",
-       "pageinfo-firsttime": "Galah ritatkala ngripta kaca",
-       "pageinfo-lastuser": "Panguwah sané pinih anyar",
+       "pageinfo-firsttime": "Tanggal ngardi kaca",
+       "pageinfo-lastuser": "Sang nguah pinih untat",
        "pageinfo-lasttime": "Galah antuk uahan sané pinih anyar",
-       "pageinfo-edits": "Akéh nomer sané kauwah",
+       "pageinfo-edits": "Akéh uahan",
        "pageinfo-authors": "Akéh nomer makasami antuk panyurat sané lianan",
        "pageinfo-recent-edits": "Akéh nomer sané kauwah (ring $1 sané sampun lintang)",
        "pageinfo-recent-authors": "Akéh nomer antuk panyurat sané lianan",
+       "pageinfo-magic-words": "{{PLURAL:$1Kruna}} sakti ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Kategori}} sané kaengkebang ($1)",
+       "pageinfo-templates": "Katranslusi {{PLURAL:$1|template|templates}} ($1)",
        "pageinfo-toolboxlink": "Pidarta kaca",
        "pageinfo-contentpage": "Kapeték dados kaca daging",
        "pageinfo-contentpage-yes": "Inggih",
+       "patrol-log-page": "Log patroli",
        "previousdiff": "← Uahan sadurungnyané",
        "nextdiff": "Uahan sané pinih anyar →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|kaca}}",
        "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",
+       "file-nohires": "Nénten kasayagaang résolusi sané lewih ageng.",
        "svg-long-desc": "Berkas SVG, jimbarnyané $1 × $2 piksel, agengnyané berkas: $3",
        "show-big-image": "Depukan sujati",
        "show-big-image-preview": "Agengnyané pratuduh puniki: $1.",
-       "show-big-image-other": "{{PLURAL:$2|Resolusi}} iianan: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Résolusi}} lianan: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "sunday-at": "Redite jam $1",
        "bad_image_list": "bentukne sekadi puniki:\n\nwantah kepahan daftar ( baris sane kakawitin anggen tanda *) sane kaitung pranala kapertama ring baris mangda pranala ring berkas sane kaon.\nPranala-Pranala sane selanturnyane ring baris sane pateh kamanahang antuk pinangging, inggih punika lembar sane prasida ngedengang berkas punika.",
        "metadata": "Métadata",
-       "metadata-help": "pupulan puniki madaging wacana imbuhan minab sane kaimbuhin olih kamera digital utawi scanner sane kaanggen antuk ngawi atawi \"mendigitalisasi\" pupulan. Yening pupulan niki sampun taen kautak-atik, rerincine sane wenten minab nenten samian nyiriang wacan saking gambar sane sampun kautak-atik niki.",
-       "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",
+       "metadata-help": "Berkas puniki madaging pidarta tambehan, minab katambehin saking kaméra digital utawi pemindai sané kaanggén ngardi utawi nigitalisasi.\nYéning berkasnyané sampun kamodifikasi saking kawéntenan witnyané, rincian saking witnyané minab nénten samian pateh malih saking berkas sané kamodifikasi.",
+       "metadata-fields": "Widang métadata gambar ring séwala 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",
        "table_pager_prev": "Kaca sadurungnyané",
        "watchlisttools-clear": "Ngicalang pupulan sané sampun karauhin",
        "watchlisttools-view": "Cingak uahan sane relevan",
-       "watchlisttools-edit": "Cingak miwah uah bacakan pantauan",
-       "watchlisttools-raw": "Uah kepahan paninjo mentah",
+       "watchlisttools-edit": "Cingak miwah uah pangawasan",
+       "watchlisttools-raw": "Uah pangawasan matah",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|pabligbagan]])",
        "duplicate-defaultsort": "pingetan: sereg pangurutan lingga \"$2\" nyampahang sereg pangurutan lingga sadurunge \"$1\"",
        "version-specialpages": "Kaca kusus",
        "redirect-user": "ID sang anganggé",
        "redirect-page": "ID kaca",
        "redirect-revision": "Uahan kaca",
-       "redirect-file": "Wastan berkas",
+       "redirect-file": "Aran berkas",
        "specialpages": "Kaca kusus",
        "external_image_whitelist": "#banggiang baris niki sapunapi kawentenanne<pre>\n#anggen fragmen akspresi reguler (wantah kepahan ring kekelaih//) ring sor puniki\n#fragmen-fragmen puniki jagi kaadungang sareng URL saking gambar-gambar eksternal (sane kasambungang langsung)\n#fragmen sane adung jagi katampilang dados gambar, sisanne wantah dados pranala kewanten\n#baris sane kakawitin antuk # jagi kadadosang baris komentar\n#niki nenten ngabinayang aksara ageng lan alit\n#genahang samian fragmen ekspresi reguler ring sor baris puniki. banggiang baris niki sapunapi kawentennane</pre>",
-       "tag-filter": "filter [[Special:Tags|tag]]:",
-       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Tag}}]]: $2",
+       "tag-filter": "Panyaring [[Special:Tags|cihna]]:",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Cihna}}]]: $2",
+       "tag-mw-rollback": "Waliang",
+       "tag-mw-rollback-description": "Uahan sané ngwaliang uahan sadurungnyané nganggén pranala waliang",
        "tags-active-yes": "Inggih",
        "tags-active-no": "Nénten",
        "tags-edit": "uah",
        "tags-delete-title": "Usap tag",
        "compare-page2": "Kaca 2",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngusapin}} kaca $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|ngwalikan}} kaca $3 ($4)",
-       "logentry-delete-revision": "$1 {{GENDER:$2|mauah}} kaca utama {{PLURAL:$5|$5  pamecikan}} ring kaca $3: $4",
-       "revdelete-content-hid": "dagingnyané kaengkebang",
-       "logentry-move-move": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ring $4",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|maglisiran}} kaca $3 ka $4 tur nenten ngawe pengalihan",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|maglisiran}} kaca $3 ka $4 tur nenten ngawe pengalihan",
-       "logentry-newusers-create": "Akun sang anganggé $1 {{GENDER:$2|kakaryanin}}",
-       "logentry-newusers-autocreate": "Akun sang anganggé $1 {{GENDER:$2|kakaryanin}} otomatis",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ngwaliang}} kaca $3 ($4)",
+       "logentry-delete-revision": "$1 {{GENDER:$2|nguahin}} pakantenan saking {{PLURAL:$5|$5  révisi}} ring kaca $3: $4",
+       "revdelete-content-hid": "daging kaengkebang",
+       "logentry-move-move": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4 tur nenten ngawe pengalihan",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4 tur nenten ngawe pengalihan",
+       "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|kacihnayang}} sampun kabecikang $4 saking kaca $3 kaawasin",
+       "logentry-newusers-create": "Akun sang anganggé $1 {{GENDER:$2|kakardi}}",
+       "logentry-newusers-byemail": "Akun sang anganggé $3 {{GENDER:$2|sampun kakardi}} antuk $1 miwah kruna sandi sampun kakirim antuk séwala éléktronik",
+       "logentry-newusers-autocreate": "Akun sang anganggé $1 {{GENDER:$2|kakardi}} otomatis",
        "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:",
+       "feedback-message": "Séwala:",
        "searchsuggest-search": "Rereh ring {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|rahina}}",
        "pagelanguage": "Uah basa ring kaca",
        "mw-widgets-abandonedit-keep": "Lanturang nguah",
        "randomrootpage": "Kaca pinih dasar sane mabrarakan",
        "log-action-filter-protect-protect": "Saiban",
-       "log-action-filter-protect-move_prot": "Ngingsirang saiban"
+       "log-action-filter-protect-move_prot": "Ngingsirang saiban",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Kruna sandi nénten dados pateh sareng peséngan sang anganggé"
 }
index 67059c7..75edef4 100644 (file)
        "resetpass-submit-cancel": "Obbrechen",
        "passwordreset": "Passwoat zrucksetzn",
        "passwordreset-username": "Nutzanama:",
-       "bold_sample": "Fetta Text",
-       "bold_tip": "Fetta Text",
-       "italic_sample": "Kursiva Text",
-       "italic_tip": "Kursiva Text",
-       "link_sample": "Link-Text",
-       "link_tip": "Interna Link",
-       "extlink_sample": "http://www.example.com Link-Text",
-       "extlink_tip": "Externa Link (http:// beochtn)",
-       "headline_sample": "Ibaschrift Text",
-       "headline_tip": "Ebane-2-Ibaschrift",
-       "nowiki_sample": "Nedformatiadn Text do eibaun",
-       "nowiki_tip": "Wiki-Format ignorian",
-       "image_tip": "Dateilink",
-       "media_tip": "Datei-Link",
-       "sig_tip": "Dei Untaschrift mit Zeitstempe",
-       "hr_tip": "Wogrechte Linie (sporsam vawendn)",
        "summary": "Zammfossung:",
        "subject": "Bedreff",
        "minoredit": "Nua Kloanigkeidn san vaendat worn",
index a9af2ef..4c4b3fd 100644 (file)
        "resettokens-watchlist-token": "ویب فیدء پجاروک [[Special:Watchlist|پیجانی تغییرات که آهانء رهگر کن ات]] (اتم/آراس‌اس)",
        "resettokens-done": "پجاروکانی واتر.",
        "resettokens-resetbutton": "درچتگین پجاروکانء واتر بکن",
-       "bold_sample": "پررنگین متن",
-       "bold_tip": "پررنگین متن",
-       "italic_sample": "ایتالیکی متن",
-       "italic_tip": "ایتالیکی متن",
-       "link_sample": "عنوان لینک",
-       "link_tip": "لینک درونی",
-       "extlink_sample": "http://www.example.com عنوان لینک",
-       "extlink_tip": "حارجی لینک(مشموش  http:// پیشوند)",
-       "headline_sample": "متن سرخط",
-       "headline_tip": "سطح ۲ سرخط",
-       "nowiki_sample": "متن بی فرمتءا ادان وارد کن",
-       "nowiki_tip": "فرمت وی کی شموش",
-       "image_tip": "فایل هورگین",
-       "media_tip": "لینک فایل",
-       "sig_tip": "شمی امضا گون مهر زمان",
-       "hr_tip": "خط افقی",
        "summary": "کمݔں:",
        "subject": "موضوع/سرخط:",
        "minoredit": "اݔشی یک ھُردݔں ٹگلے",
index 11f3e1f..7759c45 100644 (file)
        "resettokens-watchlist-token": "Paduos para sa hungitan nin web (Atom/RSS) kan [[Special:Watchlist|mga kaliwatan sa mga pahina nin saimong bantay-listahan]]",
        "resettokens-done": "Mga paduos pinagbago na.",
        "resettokens-resetbutton": "Pakibaguha an pinagpiling mga paduos",
-       "bold_sample": "Mahìbog na teksto",
-       "bold_tip": "Mahìbog na teksto",
-       "italic_sample": "Italikong teksto",
-       "italic_tip": "Italikong teksto",
-       "link_sample": "Titulo nin sugpon",
-       "link_tip": "Panlaog na sugpon",
-       "extlink_sample": "http://www.example.com títulong sugpon",
-       "extlink_tip": "Panluwas na sugpon(giromdomon an http:// pangenot na panigmit)",
-       "headline_sample": "Pamayuhang linya kan teksto",
-       "headline_tip": "Talangga 2 pamayuhang-linya",
-       "nowiki_sample": "Isaliot an dae nakapormat na teksto digde",
-       "nowiki_tip": "Balewalaon an pampormat na wiki",
-       "image_sample": "Halimbawa.jpg",
-       "image_tip": "Nakalubog na sagunson",
-       "media_sample": "Halimbawa.ogg",
-       "media_tip": "Kilyaw nin sagunson (file)",
-       "sig_tip": "An saimong pirma na igwang tatak-oras",
-       "hr_tip": "Pabalagbag na linya (gamiton paminsan-minsan)",
        "summary": "Sumaryo:",
        "subject": "Tema",
        "minoredit": "Ini sarong dikiton na pagliwat",
index 19585c8..58fa5b5 100644 (file)
        "resettokens-watchlist-token": "Токен стужкі (Atom/RSS) [[Special:Watchlist|зьменаў у вашым сьпісе назіраньня]]",
        "resettokens-done": "Токены скінутыя.",
        "resettokens-resetbutton": "Скінуць вылучаныя токены",
-       "bold_sample": "Тоўсты тэкст",
-       "bold_tip": "Тоўсты тэкст",
-       "italic_sample": "Курсіўны тэкст",
-       "italic_tip": "Курсіўны тэкст",
-       "link_sample": "Загаловак спасылкі",
-       "link_tip": "Унутраная спасылка",
-       "extlink_sample": "http://www.example.com загаловак спасылкі",
-       "extlink_tip": "Вонкавая спасылка (не забывайцеся пачынаць з http:// )",
-       "headline_sample": "Тэкст загалоўку",
-       "headline_tip": "Загаловак 2-га ўзроўню",
-       "nowiki_sample": "Устаўце сюды нефарматаваны тэкст",
-       "nowiki_tip": "Ігнараваць вікі-фарматаваньне",
-       "image_sample": "Прыклад.jpg",
-       "image_tip": "Укладзены файл",
-       "media_sample": "Прыклад.ogg",
-       "media_tip": "Спасылка на файл",
-       "sig_tip": "Ваш подпіс і момант часу",
-       "hr_tip": "Гарызантальная лінія (не выкарыстоўвайце часта)",
        "summary": "Кароткае апісаньне зьменаў:",
        "subject": "Тэма:",
        "minoredit": "Гэта дробная праўка",
        "specialmute-success": "Вашыя налады заглушэньня былі абноўленыя. Глядзіце ўсіх заглушаных удзельнікаў на старонцы [[Special:Preferences|вашых наладаў]].",
        "specialmute-submit": "Пацьвердзіць",
        "specialmute-label-mute-email": "Заглушыць лісты электроннай пошты ад гэтага ўдзельніка",
-       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для <b>{{BIDI:[[User:$1]]}}</b>.",
+       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для {{GENDER:$1|ўдзельніка|ўдзельніцы}} <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Запытанае імя ўдзельніка ня можа быць знойдзенае.",
-       "specialmute-email-footer": "Для кіраваньня наладамі электроннай пошты для {{BIDI:$2}}, калі ласка, наведайце <$1>.",
+       "specialmute-email-footer": "Для кіраваньня наладамі электроннай пошты {{GENDER:$1|ўдзельніка|ўдзельніцы}} {{BIDI:$2}}, калі ласка, наведайце <$1>.",
        "specialmute-login-required": "Калі ласка, увайдзіце, каб зьмяніць вашыя налады заглушэньня.",
        "mute-preferences": "Налады заглушэньня",
        "revid": "вэрсія $1",
index c356041..baac1c5 100644 (file)
        "virus-scanfailed": "не ўдалося праверыць (код $1)",
        "virus-unknownscanner": "невядомы антывірус:",
        "logouttext": "<strong>Вы выйшлі з сістэмы.</strong>\n\nЗаўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
+       "logging-out-notify": "Вы выходзіце з сістемы, калі ласка, пачакайце.",
        "logout-failed": "Немагчыма выйсці зараз: $1",
        "cannotlogoutnow-title": "Зараз немагчыма выйсці",
        "cannotlogoutnow-text": "Пры выкарыстанні $1 выхад з сістэмы немагчымы.",
        "resettokens-watchlist-token": "Токен струменя (Atom/RSS) [[Special:Watchlist|зменаў старонак у вашым спісе назірання]]",
        "resettokens-done": "Токены скінуты.",
        "resettokens-resetbutton": "Скінуць выбраныя токены",
-       "bold_sample": "Цёмны тэкст",
-       "bold_tip": "Цёмны тэкст",
-       "italic_sample": "Курсіўны тэкст",
-       "italic_tip": "Курсіўны тэкст",
-       "link_sample": "Назва спасылкі",
-       "link_tip": "Унутраная спасылка",
-       "extlink_sample": "http://www.example.com назва спасылкі",
-       "extlink_tip": "Вонкавая спасылка (памятайце аб прэфіксе http://)",
-       "headline_sample": "Тэкст загалоўка",
-       "headline_tip": "Загаловак 2 узроўню",
-       "nowiki_sample": "Гэта нефарматаваны тэкст",
-       "nowiki_tip": "Без вікі-фарматавання",
-       "image_sample": "Напрыклад.jpg",
-       "image_tip": "Файл у тэксце",
-       "media_sample": "Напрыклад.ogg",
-       "media_tip": "Спасылка на медыяфайл",
-       "sig_tip": "Ваш подпіс і адзначаны час",
-       "hr_tip": "Гарызантальная рыса (не злоўжывайце гэтым)",
        "summary": "Тлумачэнне:",
        "subject": "Тэма/загаловак:",
        "minoredit": "Дробная праўка",
        "search-interwiki-more": "(яшчэ)",
        "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Дачыняюцца*",
+       "search-invalid-sort-order": "Парадак сартавання ў $1 не распазнаны, будзе ўжыта сартаванне па змоўчанні. Правільныя запыты на сартаванне: $2",
        "searchrelated": "маюць дачыненне",
        "searchall": "усе",
        "showingresults": "Ніжэй паказаны да {{PLURAL:$1|'''$1''' выніку|'''$1''' вынікаў}}, пачынаючы з нумару '''$2'''.",
        "exbeforeblank": "змесціва перад ачысткаю было: '$1'",
        "delete-confirm": "Выдаліць \"$1\"",
        "delete-legend": "Выдаліць",
-       "historywarning": "<strong>Увага:</strong> Ð¡Ñ\82аÑ\80онка, Ñ\8fкÑ\83Ñ\8e Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c, Ð¼Ð°Ðµ Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e Ð· Ð¿Ñ\80Ñ\8bблÑ\96зна $1 {{PLURAL:$1|пÑ\80аÑ\9eкÑ\83|пÑ\80аÑ\9eкÑ\96|пÑ\80авак}}:",
+       "historywarning": "<strong>Увага:</strong> Ð¡Ñ\82аÑ\80онка, Ñ\8fкÑ\83Ñ\8e Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c, Ð¼Ð°Ðµ Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e Ð¿Ñ\80авак Ð· $1 {{PLURAL:$1|веÑ\80Ñ\81Ñ\96Ñ\8fй|веÑ\80Ñ\81Ñ\96Ñ\8fмÑ\96|веÑ\80Ñ\81Ñ\96Ñ\8fмÑ\96}}:",
        "historyaction-submit": "Паказаць",
        "confirmdeletetext": "Вы збіраецеся выдаліць старонку разам з усёй яе гісторыяй правак.\nПацвердзіце свой намер зрабіць гэта, сваё разуменне наступстваў, і што Вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|асноўнымі правіламі праекта]].",
        "actioncomplete": "Завершана аперацыя",
        "newimages-hidepatrolled": "Без паказу ўхваленых ўкладанняў",
        "newimages-mediatype": "Тып медиафайла:",
        "noimages": "Тут нічога няма.",
-       "gallery-slideshow-toggle": "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82ь мініяцюры",
+       "gallery-slideshow-toggle": "Ð\9fеÑ\80аклÑ\8eÑ\87Ñ\8bÑ\86ь мініяцюры",
        "ilsubmit": "Знайсці",
        "bydate": "п. датаў",
        "sp-newimages-showfrom": "Паказаць новыя файлы, пачынаючы з $2, $1",
index 485c9fe..8da3832 100644 (file)
        "createacct-another-email-ph": "Въведете електронна поща",
        "createaccountmail": "Използване на случайна временна парола, която се изпраща на посочената електронната поща",
        "createacct-realname": "Истинско име (незадължително)",
-       "createacct-reason": "Причина",
+       "createacct-reason": "Причина (публично видима)",
        "createacct-reason-ph": "Защо създавате друга сметка",
        "createacct-reason-help": "Съобщение, показвано в дневника на създадени сметки",
        "createacct-submit": "Създаване на сметката",
        "resettokens-watchlist-token": "Маркер за уеб хранилка (Atom/RSS) на [[Special:Watchlist|промени на страници от списъка Ви за наблюдение]]",
        "resettokens-done": "Маркерите са изчистени.",
        "resettokens-resetbutton": "Изчистване на избраните маркери",
-       "bold_sample": "Получер текст",
-       "bold_tip": "Получер (удебелен) текст",
-       "italic_sample": "Наклонен текст",
-       "italic_tip": "Наклонен текст",
-       "link_sample": "Име на препратка",
-       "link_tip": "Вътрешна препратка",
-       "extlink_sample": "http://www.example.com Текст на външната препратка",
-       "extlink_tip": "Външна препратка (не забравяйте http:// отпред)",
-       "headline_sample": "Заглавие на раздел",
-       "headline_tip": "Заглавие от 2-ро ниво",
-       "nowiki_sample": "Тук въведете текст",
-       "nowiki_tip": "Пренебрегване на форматиращите команди",
-       "image_sample": "Пример.jpg",
-       "image_tip": "Вмъкване на картинка",
-       "media_sample": "Пример.ogg",
-       "media_tip": "Препратка към файл",
-       "sig_tip": "Вашият подпис заедно с времева отметка",
-       "hr_tip": "Хоризонтална линия (използвайте пестеливо)",
        "summary": "Резюме:",
        "subject": "Заглавие:",
        "minoredit": "Това е малка промяна",
        "nocreate-loggedin": "Нямате необходимите права да създавате нови страници.",
        "sectioneditnotsupported-title": "Не се поддържа редактиране на раздели",
        "sectioneditnotsupported-text": "Не се поддържа редактиране на раздели на тази страница.",
+       "modeleditnotsupported-title": "Редактирането не се поддържа",
+       "modeleditnotsupported-text": "Редактирането не се поддържа за модел на съдържанието $1.",
        "permissionserrors": "Грешка при правата на достъп",
        "permissionserrorstext": "Нямате правата да извършите това действие по {{PLURAL:$1|следната причина|следните причини}}:",
        "permissionserrorstext-withaction": "Нямате разрешение за $2 поради {{PLURAL:$1|следната причина|следните причини}}:",
        "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": "Филтри",
        "listfiles-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "imgfile": "файл",
        "listfiles": "Списък на файловете",
+       "listfiles_subpage": "Качвания от $1",
        "listfiles_thumb": "Миникартинка",
        "listfiles_date": "Дата",
        "listfiles_name": "Име на файла",
        "changecontentmodel": "Промяна на модела на съдържанието на страница",
        "changecontentmodel-legend": "Промяна на модела на съдържанието",
        "changecontentmodel-title-label": "Заглавие на страницата:",
+       "changecontentmodel-current-label": "Текущ модел на съдържанието:",
        "changecontentmodel-model-label": "Нов модел на съдържанието:",
        "changecontentmodel-reason-label": "Причина:",
        "changecontentmodel-submit": "Променяне",
        "mycontris": "Приноси",
        "anoncontribs": "Приноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+       "contributions-subtitle": "За {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "negative-namespace-not-supported": "Именни пространства с негативни стойности не се поддържат.",
        "nocontribs": "Не са намерени промени, отговарящи на критерия.",
        "blocklist-userblocks": "Скриване блокирането на потребителски сметки",
        "blocklist-tempblocks": "Скриване на временни блокирания",
        "blocklist-addressblocks": "Скриване на отделни блокирания на IP адреси",
+       "blocklist-type": "Вид:",
        "blocklist-type-opt-all": "Всички",
        "blocklist-type-opt-sitewide": "За всички уикита",
        "blocklist-type-opt-partial": "Частично",
        "version-ext-colheader-description": "Описание",
        "version-ext-colheader-credits": "Автори",
        "version-license-title": "Лиценз за $1",
+       "version-credits-title": "Списък на авторите на $1",
        "version-poweredby-credits": "Това уики работи на базата на <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преводачи в translatewiki.net",
        "permanentlink": "Постоянна препратка",
        "permanentlink-revid": "ID на редакцията",
        "permanentlink-submit": "Към редакцията",
+       "newsection": "Нов раздел",
+       "newsection-page": "Целева страница",
        "dberr-problems": "Съжаляваме! Сайтът изпитва технически затруднения.",
        "dberr-again": "Изчакайте няколко минути и опитайте да презаредите.",
        "dberr-info": "(Няма достъп до базата от данни: $1)",
        "dberr-info-hidden": "(Няма връзка със сървъра на базата данни)",
-       "htmlform-invalid-input": "Има проблеми с част от въведения от вас вход",
+       "htmlform-invalid-input": "Има проблеми с част от въведения от вас текст",
        "htmlform-select-badoption": "Посочената от вас стойност не е валидна алтернатива.",
        "htmlform-int-invalid": "Въведената от вас стойност не е цяло число.",
        "htmlform-float-invalid": "Посочената стойност не е число.",
        "htmlform-int-toolow": "Посочената от вас стойност е под минимално допустимата $1.",
        "htmlform-int-toohigh": "Посочената от вас стойност надхвърля максимално допустимата $1.",
-       "htmlform-required": "Тази стойност се изисква",
+       "htmlform-required": "Тази стойност е задължителна.",
        "htmlform-submit": "Изпращане",
        "htmlform-reset": "Отказване на промените",
        "htmlform-selectorother-other": "Друга",
        "feedback-bugornote": "Ако сте готови подробно да опишете технически проблем, моля [$1 докладвайте го тук].\nВ противен случай, можете да използвате лесния формуляр по-долу. Коментарът ви ще бъде добавен към страницата „[$3 $2]“, наред с вашето потребителско име.",
        "feedback-cancel": "Отказ",
        "feedback-close": "Готово",
+       "feedback-external-bug-report-button": "Изпращане на техническа задача",
        "feedback-dialog-title": "Изпращане на обратна връзка",
        "feedback-error1": "Грешка: Неразпознат резултат от API",
        "feedback-error2": "Грешка: Неуспешна редакция",
        "duration-centuries": "$1 {{PLURAL:$1|век|века}}",
        "duration-millennia": "$1 {{PLURAL:$1|хилядолетие|хилядолетия}}",
        "rotate-comment": "Изображението е завъртяно на $1 {{PLURAL:$1|градус|градуса}} по часовниковата стрелка",
+       "limitreport-cputime": "Употреба на процесорното време",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунди}}",
+       "limitreport-walltime": "Употреба в режим на реално време",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунди}}",
+       "limitreport-ppvisitednodes": "Брой възли посетени от препроцесора",
        "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "Брой възли генерирани от препроцесора",
        "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт|байта}}",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт|байта}}",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-symbols": "Символи",
        "special-characters-group-greek": "Гръцки",
+       "special-characters-group-greekextended": "Гръцки (разширен)",
        "special-characters-group-cyrillic": "Кирилица",
        "special-characters-group-arabic": "Арабски",
        "special-characters-group-arabicextended": "Разширен арабски",
index b5ee9f0..94ca797 100644 (file)
        "resettokens-token-label": "$1 (انونین اندازه گ: $2)",
        "resettokens-done": "بیئر گردینتین نشانگ ئان.",
        "resettokens-resetbutton": "نشانی بوته ئین وسایلانی بیئرگردینتین.",
-       "bold_sample": "پر رنگین متن",
-       "bold_tip": "پر رنگین متن",
-       "italic_sample": "مورب متن",
-       "italic_tip": "مورب متن",
-       "link_sample": "خرابین ئنوان",
-       "link_tip": "داخلین لینک",
-       "extlink_sample": "http://www.example.com خرابین ئنوان",
-       "extlink_tip": "لینک په ڈنا (دیموند http://‎ ئا شه هوشا مه به ریت)",
-       "headline_sample": "متنئ سر ئنوان",
-       "headline_tip": "ئنوان سطح ۲",
-       "nowiki_sample": "ایدا چوکاٹ بندی نه بوته ئین متن ئه داخل کنیت",
-       "nowiki_tip": "نادیده گیپتین ویکی ئی چوکاٹ بندیا",
-       "image_tip": "متنی تئ اکس",
-       "media_tip": "فایل لینک",
-       "sig_tip": "شمی دستنام گو وختئ مهرئا",
-       "hr_tip": "افقی ئین خط (په مصرفئ کم کورتینا استفاده بیئت)",
        "summary": "خلاصه:",
        "subject": "موضو/ئنوان:",
        "minoredit": "ای یک گونڈین ایڈیٹئ است",
index 30ebb28..85165ed 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|आपके धियानसूची के पन्नन में बदलावसभ]] के वेब फीड (एटम/आरऍसऍस) खातिर टोकन",
        "resettokens-done": "टोकन रीसेट हो चुकल बा।",
        "resettokens-resetbutton": "चुनल गइल टोकन रीसेट करीं",
-       "bold_sample": "मोट अच्छर",
-       "bold_tip": "मोट अच्छर",
-       "italic_sample": "तिरछा पाठ",
-       "italic_tip": "तिरछा पाठ",
-       "link_sample": "कड़ी टाइटिल",
-       "link_tip": "अंदरूनी कड़ी",
-       "extlink_sample": "http://www.example.com कड़ी टाइटिल",
-       "extlink_tip": "बाहरी कड़ी (शुरू में http:// जरुर लगाईं)",
-       "headline_sample": "हेडिंग पाठ",
-       "headline_tip": "दुसरा लेवल के हेडिंग",
-       "nowiki_sample": "बिना-फारमेट कइल पाठ इहाँ डालीं",
-       "nowiki_tip": "विकि फारमेटिंग के अनदेखी करीं",
-       "image_sample": "उदाहरण.jpg",
-       "image_tip": "समाहित (एम्बेड कइल) फाइल",
-       "media_sample": "उदाहरण.ogg",
-       "media_tip": "फाइल कड़ी",
-       "sig_tip": "समय मोहर की संघे राउर दस्खत",
-       "hr_tip": "पड़ी लकीर (कम प्रयोग करीं)",
        "summary": "सारांश:",
        "subject": "बिसय:",
        "minoredit": "ई एगो छोट संपादन बा",
index 937c0bb..c82b5e0 100644 (file)
        "changeemail-none": "(kadada)",
        "changeemail-password": "Sandi {{SITENAME}} Pian:",
        "changeemail-submit": "Ganti suril",
-       "bold_sample": "Naskah kandal",
-       "bold_tip": "Naskah kandal",
-       "italic_sample": "Naskah hiring",
-       "italic_tip": "Naskah hiring",
-       "link_sample": "Judul tautan",
-       "link_tip": "Tautan dalam",
-       "extlink_sample": "http://www.example.com judul tautan",
-       "extlink_tip": "Tautan luar (Ingatakan bamula wan http://)",
-       "headline_sample": "Naskah judul",
-       "headline_tip": "Judul tingkat 2",
-       "nowiki_sample": "Masukakan naskah kada babantuk di sia",
-       "nowiki_tip": "Halinakan pambantukan/purmat wiki",
-       "image_tip": "Maktub'akan barakas",
-       "media_tip": "Tautan barakas",
-       "sig_tip": "Tandatangan Pian lawan tanda waktu",
-       "hr_tip": "Garis horisontal",
        "summary": "Kasimpulan:",
        "subject": "Parihal:",
        "minoredit": "Ngini adalah babakan sapalih",
index 224e4ae..c8b6b6c 100644 (file)
@@ -40,7 +40,8 @@
                        "Rasal Lia",
                        "আফতাবুজ্জামান",
                        "Tahmid02016",
-                       "Ifsad"
+                       "Ifsad",
+                       "Nokib Sarkar"
                ]
        },
        "tog-underline": "সংযোগের নিচে দাগ দেখানো হোক:",
@@ -87,6 +88,7 @@
        "tog-useeditwarning": "কোনো সম্পাদনা পাতা ত্যাগের সময় পরিবর্তনগুলি সংরক্ষিত না হয়ে থাকলে আমাকে সাবধান করা হোক",
        "tog-prefershttps": "অ্যাকাউন্টে প্রবেশ করার সময় সবসময় নিরাপদ সংযোগ ব্যবহার করুন",
        "tog-showrollbackconfirmation": "একটি রোলব্যাক লিঙ্ক ক্লিক করার সময় একটি নিশ্চিতকরণ বার্তা দেখান",
+       "tog-requireemail": "পাসওয়ার্ড পুনঃস্থাপন করার জন্য ইমেল প্রয়োজন",
        "underline-always": "সব সময়",
        "underline-never": "কখনো নয়",
        "underline-default": "আবরণ বা ব্রাউজারে যেমনভাবে নির্দিষ্ট করা আছে",
        "createaccountmail": "সাময়িকভাবে অজানা পাসওয়ার্ড ব্যবহার করুন এবং নির্ধারিত ইমেইল ঠিকানায় পাঠিয়ে দিন",
        "createaccountmail-help": "পাসওয়ার্ড জানা ছাড়াই অন্য ব্যক্তির জন্য অ্যাকাউন্ট তৈরি করতে ব্যবহার করা যেতে পারে।",
        "createacct-realname": "আসল নাম (ঐচ্ছিক)",
-       "createacct-reason": "কারণ",
+       "createacct-reason": "কারণ (জনসম্মুখে নিবন্ধিত)",
        "createacct-reason-ph": "কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন",
        "createacct-reason-help": "অ্যাকাউন্ট তৈরির লগে দেখানো বার্তা",
        "createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
        "resettokens-watchlist-token": "[[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন]] সংক্রান্ত ওয়েব ফিডের (Atom বা RSS) টোকেন",
        "resettokens-done": "টোকেনগুলি সফলভাবে পুনঃনির্ধারিত হয়েছে।",
        "resettokens-resetbutton": "নির্বাচিত টোকেনগুলি পুনঃনির্ধারণ করুন",
-       "bold_sample": "গাঢ় লেখা",
-       "bold_tip": "গাঢ় লেখা",
-       "italic_sample": "তির্যক লেখা",
-       "italic_tip": "তির্যক লেখা",
-       "link_sample": "অভ্যন্তরীণ সংযোগের শিরোনাম",
-       "link_tip": "অভ্যন্তরীণ সংযোগ",
-       "extlink_sample": "http://www.example.com বহিঃসংযোগ শিরোনাম",
-       "extlink_tip": "বহিঃসংযোগ (http:// উপসর্গটি যোগ করতে ভুলবেন না)",
-       "headline_sample": "শিরোনাম",
-       "headline_tip": "২য় স্তরের শিরোনাম",
-       "nowiki_sample": "অবিন্যাসকৃত পাঠ্য এখানে যোগ করুন",
-       "nowiki_tip": "উইকি বিন্যাসন উপেক্ষা করা হোক",
-       "image_sample": "উদাহরণ.jpg",
-       "image_tip": "গ্রথিত ফাইল",
-       "media_tip": "ফাইল সংযোগ",
-       "sig_tip": "সময় ও তারিখসহ আপনার স্বাক্ষর",
-       "hr_tip": "অনুভূমিক রেখা (সংযতভাবে ব্যবহার করুন)",
        "summary": "সারাংশ:",
        "subject": "বিষয়:",
        "minoredit": "এটি একটি অনুল্লেখ্য সম্পাদনা",
        "undo-norev": "সম্পাদনাটি বাতিল করা যাচ্ছেনা কারণ এটি আর নেই বা মুছে ফেলা হয়েছে।",
        "undo-nochange": "সম্পাদনাটি পূর্বেই বাতিল করা হয়েছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
+       "undo-summary-anon": "[[Special:Contributions/$2|$2]]-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
        "undo-summary-username-hidden": "একজন লুকানো ব্যবহারকারীর করা $1 নং সংশোধনটি বাতিল করা হয়েছে",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
        "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানার ব্যাপ্তি <strong>$1</strong>-এর মধ্যে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানাও (<strong>$4</strong>) রয়েছে। \n\n$3 কর্তৃক <em>$2</em> কারণ দেখানো হয়েছে।",
        "listfiles-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" নিবন্ধিত নয়।",
        "imgfile": "ফাইল",
        "listfiles": "ছবির তালিকা",
+       "listfiles_subpage": "$1 কর্তৃক আপলোডসমূহ",
        "listfiles_thumb": "সংক্ষেপচিত্র",
        "listfiles_date": "তারিখ",
        "listfiles_name": "নাম",
        "passwordpolicies-policy-maximalpasswordlength": "পাসওয়ার্ড $1 {{PLURAL:$1|অক্ষরের}} চেয়ে কম দীর্ঘ হতে হবে",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "পাসওয়ার্ড ১,০০,০০০ সর্বাধিক ব্যবহৃত পাসওয়ার্ডের তালিকায় থাকতে পারবে না।",
        "unprotected-js": "নিরাপত্তার কারণে জাভাস্ক্রিপ্ট অনিরাপদ পৃষ্ঠা থেকে লোড করা যাবে না। শুধুমাত্র মিডিয়াউইকি: নামস্থান বা ব্যবহারকারী উপপাতায় জাভাস্ক্রিপ্ট তৈরি করুন",
-       "userlogout-continue": "আপনি কি প্রস্থান করতে চান?"
+       "userlogout-continue": "আপনি কি প্রস্থান করতে চান?",
+       "rest-prefix-mismatch": "অনুরোধকৃত পথ ($1) রেস্ট API মূলপথের ($2) ভিতরে ছিল না।",
+       "rest-wrong-method": "অনুরোধ পদ্ধতি ($1) এই পথের {{PLURAL:$3|জন্য অনুমোদিত পদ্ধতির|জন্য অনুমোদিত পদ্ধতিগুলির}} অন্তর্ভুক্ত নয় ($2)",
+       "rest-no-match": "অনুরোধ করা আপেক্ষিক পথ ($1) কোনও পরিচিত হ্যান্ডলারের সাথে মেলে না"
 }
index ef89699..ec6526b 100644 (file)
        "changeemail-newemail": "དྲ་འཕྲིན་ཁ་བྱང་གསར་བ།",
        "changeemail-none": "(སྟོང་པ།)",
        "changeemail-submit": "དྲ་འཕྲིན་བརྗེ་བ།",
-       "bold_sample": "ཡིག་གཟུགས་སྦོམ་པོ།",
-       "bold_tip": "ཡིག་གཟུགས་སྦོམ་པོ།",
-       "italic_sample": "ཡིག་གཟུགས་གསེག་མ།",
-       "italic_tip": "ཡིག་གཟུགས་གསེག་མ།",
-       "link_sample": "མཚམས་སྦྱོར་ཁ་ཡིག",
-       "link_tip": "ཕྱི་རོལ་མཐུད་སྦྲེལ།",
-       "extlink_sample": "Http://www.example.com སྦྲེལ་མཐུད་ཁ་བྱང་།",
-       "extlink_tip": "ཕྱི་ཕྱོགས་དྲ་འབྲེལ།",
-       "headline_sample": "འགོ་བརྗོད་ཡིག་གཟུགས།",
-       "headline_tip": "རིམ་པ། ༢ འགོ་ཕྲེང་།",
-       "nowiki_sample": "རྣམ་བཞག་མེད་པའི་ཡི་གེ་འདྲེན་པ།",
-       "nowiki_tip": "ཝེ་ཁེའི་རྣམ་གཞག་དོར་བ།",
-       "image_tip": "བཙུད་འཇུག་ཡིག་ཆ།",
-       "media_tip": "ཡིག་ཆ་སྦྲེལ་མཐུད།",
-       "sig_tip": "མིང་རྟགས་མཉམ་དུ་ཟླ་ཚེས་ཐེལ་ཙེ།",
-       "hr_tip": "ཐད་ཐིག ༼ཆུད་ཟོས་མེད་པར།༽",
        "summary": "བསྡུས་དོན།:",
        "subject": "འགོ་བརྗོད།",
        "minoredit": "འདི་ནི་རྩོམ་སྒྲིག་ཕལ་བ་ཞིག་ཡིན།",
index 10cb897..d1a004f 100644 (file)
        "changeemail-no-info": "পাতা এহানাত হমিতে গেলেগা তি যেসারেউ লগইন করানি লাগতই।",
        "changeemail-none": "(নেই)",
        "changeemail-submit": "ই-মেইল সিলকর",
-       "bold_sample": "গাঢ়পা ৱাহি",
-       "bold_tip": "গাঢ়পা ৱাহি",
-       "italic_sample": "ইটালিক মেয়েক",
-       "italic_tip": "ইটালিক মেয়েক",
-       "link_sample": "চিঙনাঙ মিলাপ",
-       "link_tip": "ভিতরর মিলাপ",
-       "extlink_sample": "http://www.example.com চিঙনাঙ মিলাপ",
-       "extlink_tip": "বারেদের মিলাপ (মুঙে http:// বারনি না পাহুরিস)",
-       "headline_sample": "চিঙনাঙর খন্তাহানি",
-       "headline_tip": "থাক ২র চিঙনাঙ",
-       "nowiki_sample": "ফরমেট নাকরিসি মেয়েক বরা",
-       "nowiki_tip": "উইকির পাজালানিহান লালুয়া যাগা",
-       "image_tip": "তিলকরিসি ফাইলগ",
-       "media_tip": "ফাইল মিলাপ",
-       "sig_tip": "তর স্বাক্ষরহান লগে খেন্তাম বরিয়া",
-       "hr_tip": "পাথারি খাস (খানি করা ইয়া আতা)",
        "summary": "সারমর্ম:",
        "subject": "বিষয়/চিঙনাঙ:",
        "minoredit": "এহান হুরু-মুরু সম্পাদনাহানহে।",
index 99a3e29..3d23273 100644 (file)
        "resettokens-watchlist-token": "شناسانٱنڌاٛ خوراک ڤباٛی [[Special:Watchlist|آلشڌ بٱلٛگیٱلؽ کاْ دیناگری اْکونین]] (ٱتم/آراْس‌اْس)",
        "resettokens-done": "دوکرتشناسی شناسانٱنڌاٛیٱل",
        "resettokens-resetbutton": "دوکرتشناسی شناسانٱنڌاٛیٱل دزاْ آڤیڌاْ",
-       "bold_sample": "متن گٱپ نما",
-       "bold_tip": "متن گٱپ نما",
-       "italic_sample": "متن ایتالیک",
-       "italic_tip": "متن ایتالیک",
-       "link_sample": "داسوݩ هومپاٛیڤٱند",
-       "link_tip": "هومپاٛیڤٱند داخلی",
-       "extlink_sample": "http://www.example.com داسوݩ هومپاٛیڤٱند",
-       "extlink_tip": "(ڤٱن ڤا ڤیرت http:// prefix)\nهومپاٛیڤٱند  خارجی",
-       "headline_sample": "سرخٱت متن",
-       "headline_tip": "ریتراز 2 سرخٱت",
-       "nowiki_sample": "ز ایچو متن بی شیڤات خوتۊناْ ڤارڌ کونین",
-       "nowiki_tip": "ز شیڤات ڤیکی تی پۊشی کو.",
-       "image_tip": "جانیا چارقر گرهڌاْ",
-       "media_tip": "جانیا هومپاٛیڤٱند",
-       "sig_tip": "اْمزا ایسا ڤا گاتدیساْ",
-       "hr_tip": "خٱت ٱوفوتی (کم ڤٱنین ڤا کار)",
        "summary": "چکستٱ:",
        "subject": "داسوݩ",
        "minoredit": "یو یٱ ڤیرایشد کۊچیراْ",
index 2447773..1fffac0 100644 (file)
        "resettokens-watchlist-token": "Jedouer evit lanvad web (Atom/RSS) [[Special:Watchlist|kemmañ pajennoù eus ho roll evezhiañ]]",
        "resettokens-done": "Jedoueroù adderaouekaet.",
        "resettokens-resetbutton": "Adderaouekaat ar jedoueroù diuzet",
-       "bold_sample": "Testenn dev",
-       "bold_tip": "Testenn dev",
-       "italic_sample": "Testenn italek",
-       "italic_tip": "Testenn italek",
-       "link_sample": "Liamm titl",
-       "link_tip": "Liamm diabarzh",
-       "extlink_sample": "http://www.example.com liamm titl",
-       "extlink_tip": "Liamm diavaez (na zisoñjit ket http://)",
-       "headline_sample": "Testenn istitl",
-       "headline_tip": "Istitl live 2",
-       "nowiki_sample": "Lakait an destenn anfurmadet amañ",
-       "nowiki_tip": "Na ober van ouzh ereadur ar wiki",
-       "image_sample": "Skouer.jpg",
-       "image_tip": "Skeudenn enframmet",
-       "media_sample": "Skouer.ogg",
-       "media_tip": "Liamm restr media",
-       "sig_tip": "Ho sinadur gant an deiziad",
-       "hr_tip": "Liamm a-led (arabat implijout re)",
        "summary": "Diverrañ :",
        "subject": "Danvez :",
        "minoredit": "Kemm dister",
index d376b9e..b08b2ec 100644 (file)
        "resettokens-watchlist-token": "Token za web niz (Atom/RSS) [[Special:Watchlist|promjena na stranicama sa vašeg spiska praćenja]]",
        "resettokens-done": "Žetoni su resetovani",
        "resettokens-resetbutton": "Resetuj izabrane žetone",
-       "bold_sample": "Podebljan tekst",
-       "bold_tip": "Podebljan tekst",
-       "italic_sample": "Kurzivan tekst",
-       "italic_tip": "Kurzivan tekst",
-       "link_sample": "Naslov linka",
-       "link_tip": "Unutrašnji link",
-       "extlink_sample": "http://www.example.com opis adrese",
-       "extlink_tip": "Vanjski link (zapamti prefiks http://)",
-       "headline_sample": "Naslov",
-       "headline_tip": "Podnaslov",
-       "nowiki_sample": "Dodaj neformatirani tekst ovdje",
-       "nowiki_tip": "Zanemari wikiformatiranje",
-       "image_sample": "ime_slike.jpg",
-       "image_tip": "Uklopljena slika",
-       "media_sample": "ime_medija_fajla.ogg",
-       "media_tip": "Putanja ka multimedijalnoj datoteci",
-       "sig_tip": "Vaš potpis s trenutnim vremenom",
-       "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
        "subject": "Tema:",
        "minoredit": "Ovo je manja izmjena",
index cca63b2..139fe92 100644 (file)
        "botpasswords-label-needsreset": "(sandi porlu isitel mulak)",
        "botpasswords-needs-reset": "Hata sandi bot tu gorar bot \"$2\" ni {{GENDER:$1|user}} \"$1\" angkon na isitel mulak.",
        "passwordreset": "Gonti hata kunci",
-       "bold_sample": "Teks naapal",
-       "bold_tip": "Teks naapal",
-       "italic_sample": "Teks Italic",
-       "italic_tip": "Teks italic",
-       "link_sample": "Judul tautan",
-       "link_tip": "Pranala",
-       "extlink_sample": "http://www.example.com judul tautan",
-       "extlink_tip": "Tautan ruar (ingot http://prefix)",
-       "headline_sample": "Teks judul",
-       "headline_tip": "Judul tingkat 2",
-       "nowiki_sample": "Pamasuk teks naso iformat tuson",
-       "nowiki_tip": "Nangkon roaon pamformatan wiki",
-       "image_tip": "Berkas naisematkon",
-       "media_tip": "Tautan berkas",
-       "sig_tip": "Tekenanmu dot tando woktu",
-       "hr_tip": "Garis horizontal (pake dohot denggan)",
        "summary": "Ringkasan:",
        "minoredit": "On suntingan namenek",
        "watchthis": "Pamatai alamanon",
index 62b9f07..d8ad3cd 100644 (file)
        "passwordreset-email": "Email address:",
        "changeemail": "Ribayan a email adres",
        "changeemail-none": "(uda)",
-       "extlink_sample": "http://www.example.com titulo kan link",
        "watchthis": "Silungon ading pahina",
        "blockednoreason": "udang binutang na rason",
        "nosuchsectiontitle": "diri maturakan a seksyon",
index ba84f4e..bf8a682 100644 (file)
        "resettokens-watchlist-token": "Testimoni del canal web (Atom/RSS) dels [[Special:Watchlist|canvis a la llista de seguiment]]",
        "resettokens-done": "S'han reiniciat els testimonis.",
        "resettokens-resetbutton": "Reinicia els testimonis seleccionats",
-       "bold_sample": "Text en negreta",
-       "bold_tip": "Text en negreta",
-       "italic_sample": "Text en cursiva",
-       "italic_tip": "Text en cursiva",
-       "link_sample": "Títol de l'enllaç",
-       "link_tip": "Enllaç intern",
-       "extlink_sample": "http://www.example.com títol de l'enllaç",
-       "extlink_tip": "Enllaç extern (recordeu el prefix http://)",
-       "headline_sample": "Text de l'encapçalament",
-       "headline_tip": "Encapçalat de secció de 2n nivell",
-       "nowiki_sample": "Inseriu ací text sense format",
-       "nowiki_tip": "Ignora el format wiki",
-       "image_sample": "Exemple.jpg",
-       "image_tip": "Fitxer incrustat",
-       "media_sample": "Exemple.ogg",
-       "media_tip": "Enllaç del fitxer",
-       "sig_tip": "La vostra signatura amb marca horària",
-       "hr_tip": "Línia horitzontal (feu-la servir amb moderació)",
        "summary": "Resum:",
        "subject": "Assumpte:",
        "minoredit": "Aquesta és una modificació menor",
index b0b7e01..945690a 100644 (file)
        "changeemail-none": "(無)",
        "changeemail-password": "汝其{{SITENAME}}密碼:",
        "changeemail-submit": "修改電批地址",
-       "bold_sample": "粗體文字",
-       "bold_tip": "粗體文字",
-       "italic_sample": "敧其文字",
-       "italic_tip": "敧其文字",
-       "link_sample": "鏈接標題",
-       "link_tip": "內部鏈接",
-       "extlink_sample": "http://www.example.com 鏈接標題",
-       "extlink_tip": "外部鏈接(記𡅏http:// 開頭)",
-       "headline_sample": "標題文字",
-       "headline_tip": "第二等標題",
-       "nowiki_sample": "敆嚽塊插入無格式其文本",
-       "nowiki_tip": "無察維基格式",
-       "image_tip": "嵌入其文件",
-       "media_sample": "Liê.ogg",
-       "media_tip": "文件鏈接",
-       "sig_tip": "汝其帶時間戳其簽名",
-       "hr_tip": "水平線(廮𡅏保護使其)",
        "summary": "總結:",
        "subject": "主題:",
        "minoredit": "過幼修改",
index 050fac0..d2056c4 100644 (file)
        "resettokens-watchlist-token": "Веб-каналан (Atom/RSS) токен  [[Special:Watchlist|хьан тергаме могӀанан чура агӀонашна хийцамаш бар]]",
        "resettokens-done": "Токенаш кхиссина.",
        "resettokens-resetbutton": "Къастина токенаш кхоссар",
-       "bold_sample": "Йоза Ӏаьржа къастор",
-       "bold_tip": "Йоза Ӏаьржа къастор",
-       "italic_sample": "Курсиваца къастор",
-       "italic_tip": "Курсиваца къастор",
-       "link_sample": "Хьажориган коьрта могlа",
-       "link_tip": "Чоьхьа хьажорг",
-       "extlink_sample": "http://www.example.com хьажорг корта",
-       "extlink_tip": "Арахьара хьажорг (йиц ма йе хӀотталушерг http://)",
-       "headline_sample": "Йозан корта",
-       "headline_tip": "Корта 2-гlа локхаллийца",
-       "nowiki_sample": "Кхуза хӀоттаде хийца оьшуш доцу йоза",
-       "nowiki_tip": "Тергал ца бо вики-бáрамхlоттор",
-       "image_sample": "Example.jpg",
-       "image_tip": "Файл чуйиллар",
-       "media_sample": "Example.ogg",
-       "media_tip": "Хьажорг медиа-файлан тӀе",
-       "sig_tip": "Хьан куьгтаlор аъ хlоттина хан",
-       "hr_tip": "Ана сиз (сих сиха ма леладайша)",
        "summary": "Хийцамех лаьцна:",
        "subject": "ДӀахьедар/коьрта могӀа:",
        "minoredit": "Жима хийцам",
        "sitejspreview": "'''ХӀара хьалх хьажар ду, хӀара JavaScript-код.'''\n'''хӀинца Ӏалашйина яц!'''",
        "updated": "(Карла йаькхина)",
        "note": "'''Билгалдаккхар:'''",
-       "previewnote": "'''Дагахь дита хьайна! ХӀара деккъа хьалххе хьажар хилар.'''\nХьан хийцамаш хӀинца а дӀабазбина бац!.",
+       "previewnote": "'''Дагахь дита! ХӀара хьалххе хьажар хилар.'''\nХьан хийцамаш хӀинца а дӀабазбина бац!.",
        "continue-editing": "Кхин дӀа тадар",
        "session_fail_preview": "Сервер лара ца йира ахьа бина хийцамаш дӀаязба. Кхиъ цкъа а гӀортахь.\nНагахь санна хӀара гӀалат юха а далахь, [[Special:UserLogout|сеанс дӀа а къоьвлин]], юха а системин чугӀо.",
        "edit_form_incomplete": "'''Цхьайолу тадаран формаш серверан тӀекхаьчча яц. Тидаме хьажа хьай нисдарш доьхна дуй, ТӀакха южу гӀорта.'''",
index 7e55168..f1f0ad8 100644 (file)
        "pt-createaccount": "Paghimo og akawnt",
        "changepassword": "Usba ang pasword",
        "passwordreset": "Usba ang password",
-       "bold_sample": "Gilugom nga teksto",
-       "bold_tip": "Gilugom nga teksto",
-       "italic_sample": "Gitakilid nga teksto",
-       "italic_tip": "Gitakilid nga teksto",
-       "link_sample": "Titulo sa sumpay",
-       "link_tip": "Sumpay nga internal",
-       "extlink_sample": "http://www.example.com titulo sa sumpay",
-       "extlink_tip": "Sumpay sa gawas (hinumdomi http:// prefix)",
-       "headline_sample": "Teksto sa hedlayn",
-       "headline_tip": "Level 2 nga hedlayn",
-       "nowiki_sample": "Dinhi ang dili-pormaton nga teksto",
-       "nowiki_tip": "Dili i-wikipormat",
-       "image_tip": "Embedded nga payl",
-       "media_tip": "Sumpay sa payl",
-       "sig_tip": "Ang imong pirma uban ang takna",
-       "hr_tip": "Pahigda nga linya (palihog usahay ra gamita)",
        "summary": "Mubong sugid:",
        "subject": "Sabdyek/hedlayn:",
        "minoredit": "Ginagmay lang nga kausaban",
index f4ca5e3..7126069 100644 (file)
        "newpassword": "Password nuebu:",
        "retypenew": "Na'tekla nuebu na password:",
        "resetpass_submit": "Po'lo i password ya log in",
-       "bold_sample": "Tinige' potpot",
-       "bold_tip": "Tinige' potpot",
-       "italic_sample": "Tinige' mana'echong",
-       "italic_tip": "Tinige' mana'echong",
-       "link_sample": "Titulon inachetton",
-       "link_tip": "Inachetton sanhalom",
-       "extlink_sample": "http://www.example.com titulon inachetton",
-       "extlink_tip": "Inachetton sanhiyong (munga mamalefa ni http://)",
-       "headline_sample": "Tinige' i titulo mo'na",
-       "headline_tip": "Titulon nibet mina'dos",
-       "nowiki_tip": "Iknora i estrokturan wiki",
-       "image_tip": "Mana'halom na atkibu",
-       "media_tip": "Inachetton atkibu",
-       "sig_tip": "Fitma-mu yan i ora",
-       "hr_tip": "Råya ni umadespatta (uho' fan)",
        "summary": "Sumaria:",
        "subject": "Suhetu/titulo mo'na:",
        "minoredit": "Dikike' este na tiniliaka",
index e71e02f..4b93b9a 100644 (file)
        "history": "مێژووی پەڕە",
        "history_short": "مێژووی پەڕە",
        "history_small": "مێژوو",
-       "updatedmarker": "لە دوایین سەردانمدا نوێ کراوەتەوە",
+       "updatedmarker": "لە دوایین سەردانتدا نوێکراوەتەوە",
        "printableversion": "وەشانی ئامادەی چاپ",
        "permalink": "بەستەری ھەمیشەیی",
        "print": "چاپ",
        "password-login-forbidden": "بەکارهێنانی ئەم ناوی بەکارهێنەر و تێپەڕەووشەیە قەدەغەکراوە.",
        "mailmypassword": "تێپەڕوشەکە ڕێک بخەوە",
        "passwordremindertitle": "تێپەڕوشەیەکی نوێی کاتی بۆ  {{SITENAME}}",
-       "passwordremindertext": "کەسێک (لەوانەیە خۆت، لە ناونیشانی IPی $1ـەوە) داوای تێپەڕوشەیەکی نوێی کردووە بۆ {{SITENAME}} ($4). تێپەڕوشەیەکی کاتی بۆ بەکارھێنەر «$2» دروست کراوە و بە «$3» دانراوه. ئەگەر ئەمە داخوازی تۆ بووە، پێویستت بەوەیە ئێستا بچیتە ژوورەوە و تێپەڕوشەیەکی نوێ هەڵبژێریت. ماوەی‌ تێپەڕوشە کاتییەکەت لە {{PLURAL:$5|یەک ڕۆژدا|$5 ڕۆژدا}} بەسەر دەچێت.\n\nئەگەر کەسێکی تر ئەم داوایەی کردووە یان تێپەڕوشەکەت هاتووەتەوە بیرت و ئیدی پێویستت بە گۆڕینی نییە، دەتوانیت گوێ بەم پەیامە نەدەیت و لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
+       "passwordremindertext": "کەسێک (لە ناونیشانی IPی $1ـەوە) داوای تێپەڕوشەیەکی نوێی کردووە بۆ {{SITENAME}} ($4). تێپەڕوشەیەکی کاتی بۆ بەکارھێنەر «$2» دروست کراوە و بە «$3» دانراوه. ئەگەر ئەمە داخوازی تۆ بووە، پێویستت بەوەیە ئێستا بچیتە ژوورەوە و تێپەڕوشەیەکی نوێ هەڵبژێریت. ماوەی‌ تێپەڕوشە کاتییەکەت لە {{PLURAL:$5|یەک ڕۆژدا|$5 ڕۆژدا}} بەسەر دەچێت.\n\nئەگەر کەسێکی تر ئەم داوایەی کردووە یان تێپەڕوشەکەت هاتووەتەوە بیرت و ئیدی پێویستت بە گۆڕینی نییە، دەتوانیت گوێ بەم پەیامە نەدەیت و لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "noemail": "ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».",
        "noemailcreate": "دەبێ ناونیشانێکی دروستی ئیمەیل بنووسی",
        "passwordsent": "تێپەڕوشەیەکی نوێ نێررا بۆ ئەدرەسی ئیمێلی تۆمارکراوی «$1».\nتکایە دوای وەرگرتنی، دیسان بچۆ ژوورەوە.",
        "eauthentsent": "ئیمێلێکی پشتڕاستکردنەوە بۆ ناونیشانی ئیمێلی دیاریکراو نێررا.\nپێش ئەوەی ئیمەیلی تر بۆ ئەم ھەژمارە بنێررێت، دەبێت پەیڕەوی ڕێکارەکانی ناو ئیمێلەکە بکەیت بۆ پشتڕاستکردنەوەی ئەوەی کە ئەم هەژمارە بە ڕاستی ھی تۆیە.",
        "throttled-mailpassword": "ئیمەیلێکی ڕیکخستنەوەی تێپەڕوشە لە ماوەی {{PLURAL:$1|ساعەت}}ی ڕابردوودا نێردراوە.\nبۆ ڕێگری لە بەکارھێنانی خراپ، ھەر {{PLURAL:$1|ساعەت}} تاکە یەک ئیمەیلی ڕیکخستنەوەی تێپەڕوشە دەنێردرێت.",
        "mailerror": "هەڵە ڕوویدا لە ناردنی ئیمەیل: $1",
-       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ناونیشانی ئای-پییەی تۆ لە ڕۆژانی ڕابردوودا، دەستیان کردە بە درووست‌کردنی {{PLURAL:$1|هەژمارە}}، کە زۆرینە ڕیگەپێدان لە یەک ماوە‌دایە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
+       "acct_creation_throttle_hit": "بینەرانی ویکی بەکەڵک وەرگرتن لەم ناونیشانی ئای-پییەی تۆ دەستیان کردووە بە دروستکردنی {{PLURAL:$1|هەژمار}} لەدوایین $2، کە زۆرینە ڕیگەپێدان لەو ماوەیە.\nوەک ئەنجامی ئەو ڕووداوە، ئەو بینەرانی لەم ئای‌پی ئەدرەسە کەڵک وەر دەگرن لەم کاتەدا ناتوانن هەژماری دیکە درووست‌بکەن.",
        "emailauthenticated": "ناونیشانی ئیمەیلەکەت پشتڕاست کرایەوە لە $3ی $2دا.",
        "emailnotauthenticated": "ناونیشانی ئیمەیلەکەت ھێشتا پشتڕاست نەکراوتەوە.\nھیچ ئیمەیلێک بۆ ئەم تایبەتمەندییانەی ژێرەوە نانێردرێت.",
        "noemailprefs": "بۆ کەوتنە کاری ئەو تایبەتمەندیانە، لە هەڵبژاردەکانت ئەدرەسەکی ئی‌مێڵ دابین بکە.",
        "botpasswords-insert-failed": "نەتواندرا ناوی بۆت «$1» زیاد بکرێت. ئایا پێشووتر زیاد کراوە؟",
        "botpasswords-update-failed": "نەتواندرا ناوی بۆت «$1» نوێ بکرێتەوە. ئایا سڕدراوەتەوە؟",
        "botpasswords-created-title": "تێپەڕ وشەی بۆت دروست کرا",
-       "botpasswords-created-body": "تێپەڕوشەی بۆت بۆ بۆتی «$1» بەکارھێنەر «$2» دروست کرا.",
+       "botpasswords-created-body": "تێپەڕوشەی بۆت بۆ بۆتی «$1»ی {{GENDER:$2|بەکارھێنەر}} $2 دروست کرا.",
        "botpasswords-updated-title": "تێپەڕ وشەی بۆتەکە نوێ کرایەوە",
-       "botpasswords-updated-body": "تێپەڕ وشەی بۆت بۆ «$1»ی بەکارھێنەر «$2» نوێ کرایەوە.",
+       "botpasswords-updated-body": "تێپەڕ وشەی بۆت بۆ «$1»ی {{GENDER:$2|بەکارھێنەر}} «$2» نوێکرایەوە.",
        "botpasswords-deleted-title": "تێپەڕ وشەی بۆت سڕدرایەوە",
        "resetpass_forbidden": "تێپەڕوشەکە ناگۆڕدرێت",
        "resetpass-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە ئەشێ بچیتە ژوورەوە.",
        "changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
        "changeemail-submit": "ئەمەیل بگۆڕە",
        "changeemail-nochange": "تکایە ناونیشانی ئیمەیڵێکی جیاواز بەکار بھێنە.",
-       "bold_sample": "دەقی ئەستوور",
-       "bold_tip": "دەقی ئەستوور",
-       "italic_sample": "دەقی لار",
-       "italic_tip": "دەقی لار",
-       "link_sample": "نێوی بەستەر",
-       "link_tip": "بەستەری ناوخۆ",
-       "extlink_sample": "http://www.example.com سەردێڕی بەستەر",
-       "extlink_tip": "بەستەری دەرەکی (لەبیرت بێ نووسینی پێشگری http:// )",
-       "headline_sample": "دەقی سەردێڕ",
-       "headline_tip": "سەردێڕی ئاست ۲",
-       "nowiki_sample": "لەگەرە دەقی نەڕازراو تێ‌بخە",
-       "nowiki_tip": "لەبەرچاو نەگرتنی دارشتنەکانی ویکی",
-       "image_sample": "نموونە.jpg",
-       "image_tip": "وێنەی نێو دەق",
-       "media_sample": "نموونە.ogg",
-       "media_tip": "لینکی پەڕگە",
-       "sig_tip": "واژووەکەت بە مۆری ڕێکەوتەوە",
-       "hr_tip": "هێڵی ئاسۆیی (دەگمەن بەکاری بێنە)",
        "summary": "کورتەی دەستکاری:",
        "subject": "بابەت:",
        "minoredit": "ئەمە دەستکارییەکی بچووکە",
        "subject-preview": "پێشبینینی بابەت:",
        "previewerrortext": "ھەڵەیەک دروست بوو لەکاتی ھەوڵدان بۆ بینینی دەستکارییەکانت.",
        "blockedtitle": "بەکارھێنەر بەربەست کراوە",
-       "blocked-email-user": "<strong>ھەژمارەکەت لە ناردنی پۆستی ئەلیکترۆنی بەربەستکراوە، بەڵام ھێشتا دەتوانیت دەستکاری پەڕە بکەیت لەم ویکییەدا.</strong> دەتوانیت وردەکارییەکانی بەربەستن لە [[Special:MyContributions|بەشدارییەکانی ھەژمار]] ببینیت.\n\nبەربەستنەکە لەلایەن $1 کراوە.\n\n* دەستپێکردنی بەربەستن: $8\n* بەسەرچوونی بەربەستن: $6\n* ھەژماری مەبەست: $7\n* پێناسی بەربەستن #$5",
+       "blocked-email-user": "<strong>ھەژمارەکەت لە ناردنی پۆستی ئەلیکترۆنی بەربەستکراوە، بەڵام ھێشتا دەتوانیت دەستکاری پەڕە بکەیت لەم ویکییەدا.</strong> دەتوانیت وردەکارییەکانی بەربەستن لە [[Special:MyContributions|بەشدارییەکانی ھەژمار]] ببینیت.\n\nبەربەستنەکە لەلایەن $1 کراوە.\n\nھۆکاری ئاماژەپێکراو بۆ بەربەستن: <em>$2</em>\n\n* دەستپێکردنی بەربەستن: $8\n* بەسەرچوونی بەربەستن: $6\n* ھەژماری مەبەست: $7\n* پێناسی بەربەستن #$5",
        "blockedtext-partial": "<strong>ھەژمارەکەت یان ناونیشانی ئایپیی ھەژمارەکەت لە دەستکاریکردنی ئەم پەڕەیە بەربەست کراوە، بەڵام ھێشتا دەتوانیت دەستکاری پەڕەکانی تری ئەم ویکییە بکەیت.</strong> دەتوانیت وردەکاری تەواوی بەربەستنەکە لە [[Special:MyContributions|بەشدارییەکانی ھەژمار]] ببینیت.\n\nبەربەستنەکە لەلایەن $1 ئەنجام دراوە.\n\nھۆکاری ئاماژە پێکراو بۆ بەربەستن: <em>$2</em>\n\n* دەستپێکردنی بەربەستن: $8\n* بەسەرچوونی بەربەستن: $6\n* ھەژماری مەبەست: $7\n* پێناسی بەربەستن #$5",
-       "blockedtext": "'''ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.'''\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن ''$2''ە.\n\n* دەستپێکی بەربەست‌کران: $8\n* کۆتایی هاتنی بەربەست‌کران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئای‌پی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەست‌کراو #$5.\nتکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
+       "blockedtext": "<strong>ناوی بەکارهێنەری یان ئای‌پی ئەدرەسی تۆ بەربەست‌ کراوە.</strong>\n\nبەربەست لە لایەن $1 کراوە.\nهۆکاری بەربەست کردن <em>$2</em>ە.\n\n* دەستپێکی بەربەست‌کران: $8\n* کۆتایی هاتنی بەربەست‌کران: $6\n* بابەتی بەربەست: $7\n\nبۆ وتووێژ سەبارەت بە بەربەست‌کرانەکە دەبێ پەیوەندی بکەی بە $1 یان یەکێ دی لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوبەران]].\nلە بیرت بێ تاکوو ئیمەیل ئەدرەسێکی بڕوا پێ‌کراو لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]] ڕاچاو نەکەی، نابێت لە هەلی «ئیمەیل ناردن بۆ ئەم بەکارهێنەرە» کەڵک وەر بگری؛ کەڵک وەرگرتن لەوە بەربەست نەکراوە بۆت.\n\nئای‌پی ئەدرەسی ئێستای تۆ $3 و پێناسەی بەربەست‌کراو #$5.\nتکایە لە هەر پرس و داواکاریەکت‌دا هەموو وردەکاریەکانی سەرەوە بگونجێنە.",
        "autoblockedtext": "ناونیشانی IPی تۆ بە شێوەی خۆکارانە بەرگیری لێ کراوە چوونکە بەکارھێنەرێکی دیکە بە خراپی بە کاری ھێناوە و بە دەستی $1 بەرگیری لێ کراوە.\nبەم ھۆکارەوە:\n\n:<em>$2</em>\n\n* دەست پێ کردنی بەرگیری: $8\n* بە سەر چوونی بەرگیری: $6\n* Intended blockee: $7\n\nدەتوانیت پەیوەندی بکەیت بە $1 یان یەکێکی دیکە لە [[{{MediaWiki:Grouppage-sysop}}|بەڕێوەبەران]] بۆ وتووێژ لە سەر بەرگیرییەکە.\n\nتێ بگە کە ناتوانیت ئامرازی «ئیمێل بنێرە بۆ ئەم بەکارھێنەرە» بە کار بھێنیت مەگەر ئەوەی کە پێشتر لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر]]تدا ناونیشانێکی گونجاوی ئیمێلت تۆمار کردبێت و بەرگیریت لێ نەکرابێت لە بەکارھێنانی ئەو ئامرازەش.\n\nناونیشانی IPی ئێستای تۆ $3ـە و پێناسەی یەرگیرییەکە #$5ـە.\nتکایە ھەموو وردەکارییەکانی سەرەوە ھەبێت لە ھەر پرس و داوایک کە دەیکەیت.",
        "systemblockedtext": "ھەژمارەکەت یان ئایپییەکەت بە شێوەیەکی خۆگەڕانە لەلایەن میدیاویکییەوە بەربەستکراوە. ھۆکاری بەربەستنەکە ئەمەیە: \n\n:<em>$2</em>\n\n* دەستپێکردنی بەربەستن: $8\n* بەسەرچوونی بەربەستن: $6\n* ھەژماری مەبەست: $7\n\nناونیشانی ئایپیی ئێستات پێکھاتووە لە $3.\nتکایە ئەم زانیارییانە لەکاتی داواکردنی یارمەتی دابنێ.",
        "blockednoreason": "هیچ هۆکارێک نەدراوە",
        "histfirst": "کۆنترین",
        "histlast": "نوێترین",
        "historysize": "({{PLURAL:$1|1 بایت|$1 بایت}})",
-       "historyempty": "(پووچ)",
+       "historyempty": "واڵا",
        "history-feed-title": "مێژووی پێداچوونەوەکان",
        "history-feed-description": "مێژووی پیاچوونەوە بۆ ئەم پەڕە لە ویکییەکە",
        "history-feed-item-nocomment": "$1 لە $2",
        "right-reupload-own": "بارکردنەوە لەسەر ئەو پەڕگانەی وا هەن و خۆی باری کردووە",
        "right-reupload-shared": "بارکردنی خۆماڵیی ئەو پەڕگانەی وا ھەن لەسەر خەزێنەی ھاوبەش",
        "right-upload_by_url": "بارکردنی پەڕگەکان لە ناونیشانێکی ئینتەرنێتی",
-       "right-purge": "واڵاکردنی کەشی پێگە بۆ پەڕەیەک بەبێ پشتڕاستکردنەوە",
+       "right-purge": "واڵاکردنی کەشی پێگە بۆ پەڕەیەک",
        "right-autoconfirmed": "کاریگەری وەرنەگرتن لە سنوورەکانی خێراییی ئایپی",
        "right-bot": "هەڵسوکەوت وەک پرۆسەیەکی خۆگەڕ",
        "right-nominornewtalk": "دەستکاریی بچووکی پەڕەی وتووێژ جۆرێک نەبێتە ھۆی دروستبوونی پەیامی نوێ",
        "grant-createaccount": "دروستکردنی ھەژمار",
        "grant-createeditmovepage": "دروستکردن، دەستکاریکردن و گواستنەوەی پەڕەکان",
        "grant-delete": "سڕینەوەی پەڕەکان، بەسەرداچوونەوەکان و لۆگەکان",
-       "grant-editmyoptions": "دەستکاریی ھەڵبژاردەکانی خۆت",
+       "grant-editmyoptions": "دەستکاریی ھەڵبژاردەکان و ڕێکخستنەکانی JSONت",
        "grant-editmywatchlist": "دەستکاریکردنی لیستی چاودێرییەکەت",
        "grant-editpage": "پەڕە ھەبووەکان دەستکاری بکە",
        "grant-editprotected": "پەڕە پارێزراوەکان دەستکاری بکە",
        "action-deletechangetags": "سڕینەوەی تاگەکان لە بنکەدراوەکەدا",
        "action-purge": "پاکسازی ئەم پەڕەیە بکە",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
-       "enhancedrc-since-last-visit": "$1 لە ماوەی دوایین سەردانەوە",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|لە ماوەی دوایین سەردانەوە}}",
        "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "recentchanges-legend": "ھەڵبژاردەکانی دوایین گۆڕانکارییەکان",
        "rcfilters-activefilters-show": "نیشاندان",
        "rcfilters-advancedfilters": "پاڵوێنە پێشکەوتووەکان",
        "rcfilters-limit-title": "ئەنجام بۆ نیشاندان",
-       "rcfilters-limit-and-date-label": "$1 گۆڕانکاری، $2",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|گۆڕانکاری}}، $2",
        "rcfilters-date-popup-title": "ماوە بۆ گەڕان",
        "rcfilters-days-title": "ڕۆژ",
        "rcfilters-hours-title": "کاتژمێر",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|ڕۆژ}}",
-       "rcfilters-days-show-hours": "$1 سەعات",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|کاتژمێر}}",
        "rcfilters-highlighted-filters-list": "ڕووناککراو: $1",
        "rcfilters-quickfilters": "پاڵوێنە پاشەکەوتکراوەکان",
        "rcfilters-quickfilters-placeholder-title": "ھیچ پاڵوێنەیەک پاشەکەوت نەکراوە",
        "rcfilters-savedqueries-add-new-title": "پاشەکەوتکردنی ھەڵبژاردەکانی پاڵوێنەکەی ئێستا",
        "rcfilters-restore-default-filters": "ھێنانەوەی پاڵوێنە بنچینەییەکان",
        "rcfilters-clear-all-filters": "ھەموو فیلتەرەکان بسڕەوە",
-       "rcfilters-show-new-changes": "نیشاندانی نوێترین دەستکارییەکان",
-       "rcfilters-search-placeholder": "پاڵاوتنی گۆڕانکارییە نوێیەکان (بگەڕێ یان دەست بە نووسین بکە)",
+       "rcfilters-show-new-changes": "نیشاندانی گۆڕانکارییە نوێیەکان لە $1",
+       "rcfilters-search-placeholder": "گۆڕانکارییەکان بپاڵێوە (لیست بەکاربھێنە یان بگەڕێ بەدوای ناوی پاڵێوراو)",
        "rcfilters-empty-filter": "ھیچ پاڵوێنەیەک چالاک نییە. ھەموو بەشدارییەکان نیشان دەدرێن.",
        "rcfilters-filterlist-title": "پاڵێوکەکان",
        "rcfilters-filterlist-whatsthis": "ئەمە چۆن کاردەکات؟",
-       "rcfilters-filterlist-feedbacklink": "Ú\95اÛ\8c Ø®Û\86تÙ\85اÙ\86 Ù¾Û\8e Ø¨ÚµÛ\8e Ù\84Û\95سÛ\95ر Ø¦Û\95Ù\85 Ø¦Ø§Ù\85رازÛ\95 Ù\86Ù\88Û\8eÛ\8cانە",
+       "rcfilters-filterlist-feedbacklink": "Ú\95اÛ\8c Ø®Û\86تÙ\85اÙ\86 Ù¾Û\8e Ø¨ÚµÛ\8e Ù\84Û\95سÛ\95ر Ø¦Û\95Ù\85 Ø¦Ø§Ù\85رازÛ\8c Ù¾Ø§ÚµØ§Ù\88تÙ\86انە",
        "rcfilters-highlightbutton-title": "ئەنجامەکان ڕووناک بکە",
        "rcfilters-highlightmenu-title": "ڕەنگێکی نوێ ھەڵبژێرە",
        "rcfilters-filtergroup-authorship": "بەشدارییەکان",
        "rcfilters-watchlist-markseen-button": "ھەموو گۆڕانکارییەکان وەک بینراو نیشان بکە",
        "rcfilters-watchlist-edit-watchlist-button": "دەستکاریکردنی پێڕستی پەڕە چاودێریکراوەکانت",
        "rcfilters-watchlist-showupdated": "ئەو پەڕانەی دەستکاریکراون و لەکاتی دەستکاریکردنەکەوە سەردانت نەکردوونەتەوە بە <strong>تۆخ</strong> دەردەکەون، بە نیشانی پڕکراوەوە.",
-       "rcfilters-preference-label": "Ú¯Û\95Ú\95اÙ\86دÙ\86Û\95Ù\88Û\95Û\8c Ù\88Û\95شاÙ\86Û\8c Ù\86Ù\88Û\8eÛ\8c Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86",
+       "rcfilters-preference-label": "Ú\95Ù\88Ù\88کارÛ\8c Ø¨Û\8e Ø¬Ø§Ú¤Ø§Ø³Ú©Ø±Û\8cپت Ø¨Û\95کاربھÛ\8eÙ\86Û\95",
        "rcfilters-preference-help": "ئەم ھەڵبژاردەیە وەشانی نوێی ڕووکار و ھەموو ئامرازەکانی لەو کاتەوە زیاد کراون دەگەڕێنێتەوە.",
-       "rcfilters-watchlist-preference-label": "شاردنەوەی وەشانی نوێی پێڕستی چاودێری",
+       "rcfilters-watchlist-preference-label": "ڕووکاری بێ جاڤاسکریپت بەکاربھێنە",
        "rcfilters-watchlist-preference-help": "ئەم ھەڵبژاردەیە وەشانی نوێی ڕووکار و ھەموو ئامرازەکانی لەو کاتەوە زیاد کراون دەگەڕێنێتەوە.",
        "rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە <strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfromreset": "گەڕاندنەوەی ھەڵبژاردەی بەروار",
        "upload-recreate-warning": "'''ھۆشیار بە: پەرگەیەک بەو ناوەوە سڕاوەتەوە یان گوێزاوەتەوە.'''\n\nلۆگی سڕینەوە یان گواستنەوەی ئەم پەڕە لێرە لەبەردەستدایە:",
        "uploadtext": "فۆرمی خوارەوە بەکاربێنە بۆ بارکردنی پەڕگەکان.\nبۆ بینینی و گەڕان لەو پەڕگانەی پێشتر بار کراون، بڕۆ بۆ [[Special:FileList|لیستی پەڕگە بارکراوەکان]]، ھەروەھا [[Special:Log/upload|ڕەشنووسی بارکردنەکان]] و [[Special:Log/delete|ڕەشنووسی سڕینەوەکان]].\n\nبۆ بەکارھێنانی پەڕگەیەک لە پەڕەیەکدا، بەستەرێک بە یەکێک لەم شێوازانەی خوارەوە بە کار بێنە:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' بۆ بەکارهێنانی وەشانی تەواوی پەڕگە\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|دەقی جێگر]]</nowiki></code>''' بۆ بەکارهێنانی نمایشێکی بە پانتایی ٢٠٠ پیکسەڵ لە چوارچێوەیەک لە لای چەپەوە بە «دەقی جێگر» وەک شرۆڤە\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' بۆ بەستەرپێدان بە پەڕگەکە بێ نیشاندانی خودی پەڕگەکە",
        "upload-permitted": "جۆرە پەڕگە {{PLURAL:$2|ڕێگەپێدراوەکە|ڕێگەپێدراوەکان}}: $1.",
-       "upload-preferred": "جۆرە پەڕگانەی بە باشتر دەزانرێن: $1.",
-       "upload-prohibited": "جۆرە پەڕگانەی قەدەغە کراون: $1.",
+       "upload-preferred": "جۆرە پەڕگە {{PLURAL:$2|ڕێگەپێدراوەکە|ڕێگەپێدراوەکان}}: $1.",
+       "upload-prohibited": "جۆرە پەڕگە {{PLURAL:$2|قەدەغەکراوەکە|قەدەغەکراوەکان}}: $1.",
        "uploadlogpage": "لۆگی بارکردن",
        "uploadlogpagetext": "لەخوارەوە لیستی دوایین بارکراوەکان دەبینی.\nبۆ ئەوەی چاوێکیان لێ بکەی، [[Special:NewFiles|گالەری پەڕگە نوێکان]] ببینە.",
        "filename": "ناوی پەڕگە",
        "rollback-success": "دەستکارییەکانی $1 وەرگێرایەوە؛<br />\nگۆڕدرا بۆ دوایین پێداچوونەوەی $2.",
        "sessionfailure": "لەوەدەچی کێشەیەک لە دانیشتنی چوونەژوورەوەت (login session)دا ببێت.\nئەم کردەوە هەڵوەشێندرایەوە بۆ بەرگری لە دزینی دراوەکانی دانیشتن.\nتکایە بگەڕێوە بۆ پەڕەی پێشوو و نوێی بکەوە، ئینجا دیسان تاقیی بکەوە.",
        "changecontentmodel-legend": "گۆڕینی مۆدێلی ناوەڕۆک",
-       "changecontentmodel-title-label": "سەرناوی پەڕە",
+       "changecontentmodel-title-label": "سەرناوی پەڕە:",
        "changecontentmodel-reason-label": "هۆکار:",
        "changecontentmodel-submit": "گۆڕین",
        "log-name-contentmodel": "لۆگی گۆڕینی مۆدێلی ناوەڕۆک",
index 2559468..c3fd6fd 100644 (file)
        "pt-userlogout": "Scunnessione",
        "retypenew": "Scrive torna a nova parulla secreta:",
        "resetpass-submit-cancel": "Cancillà",
-       "bold_sample": "Grassettu",
-       "bold_tip": "Grassettu",
-       "italic_sample": "Italicu",
-       "italic_tip": "Italicu",
-       "link_sample": "Titulu di u ligame",
-       "link_tip": "Ligame internu",
-       "extlink_sample": "http://www.example.com tìtulu di ligame",
-       "extlink_tip": "Ligamu esternu (cù u prefissu http:// )",
-       "headline_sample": "Testu di intestatura",
-       "headline_tip": "Intestamentu di 2° livellu",
-       "nowiki_sample": "Inserisce quì u testu micca furmattatu",
-       "nowiki_tip": "Ignurà a furmattazione wiki",
-       "image_sample": "Esempiu.jpg",
-       "hr_tip": "Linia orizuntale (da imprudà incù ghjudiziu)",
        "summary": "sommariu",
        "minoredit": "Hè una mudifica minore",
        "watchthis": "Fighjulà 'ssa pagina",
index ff9ef93..c65ddb0 100644 (file)
        "resetpass_forbidden": "Indi pwede ma-islan ang password",
        "resetpass-no-info": "Nakasulod ka dapat para makadtu-an ang mini nga pahina sang diretso.",
        "resetpass-temp-password": "Temporaryo nga password:",
-       "bold_sample": "Madukot nga teksto",
-       "bold_tip": "Madukot nga teksto",
-       "italic_sample": "Gahilay nga teksto",
-       "italic_tip": "Gahilay nga teksto",
-       "link_sample": "Titulo sang link",
-       "link_tip": "Sa sulod nga link",
-       "extlink_sample": "http://www.example.com titulo nga link",
-       "extlink_tip": "Halin sa gwa nga link (tandaan ang http:// nga prefiks)",
-       "headline_sample": "Teksto sang pangulong-dinalan",
-       "headline_tip": "Lebel 2 pangulong-dinalan",
-       "nowiki_sample": "Isal-ot ang wala na-format nga teksto diya",
-       "nowiki_tip": "Pabay-an ang wiki nga sulundan",
-       "image_tip": "Ginpilit nga file",
-       "media_tip": "Link sa file",
-       "sig_tip": "Imo pirma upod sang timestamp",
-       "hr_tip": "Gapahigda nga linya (gamiton sang laka)",
        "summary": "Kabilugan:",
        "subject": "Ginatukoy/pangulong-dinalan:",
        "minoredit": "Ini gamay nga pag-ilis",
index b81a67f..51cdddc 100644 (file)
        "resetpass-submit-cancel": "Лягъу",
        "resetpass-wrong-oldpass": "Рухсетсиз мувакъкъат я да шимдики пароль.\nПаролинъизни энди мувафакъиетнен денъиштирдинъиз я да янъы бир мувакъкъат пароль истединъиз.",
        "resetpass-temp-password": "Мувакъкъат пароль:",
-       "bold_sample": "Къалын язылыш",
-       "bold_tip": "Къалын язылыш",
-       "italic_sample": "Италик (курсив) язылыш",
-       "italic_tip": "Италик (курсив) язылыш",
-       "link_sample": "Саифенинъ серлевасы",
-       "link_tip": "Ички багъланты",
-       "extlink_sample": "http://www.example.com саифенинъ серлевасы",
-       "extlink_tip": "Тыш багъланты (Адрес огюне http:// къоймагъа унутманъыз)",
-       "headline_sample": "Серлева язысы",
-       "headline_tip": "2-нджи севие серлева",
-       "nowiki_sample": "Сербест формат метининъизни мында язынъыз.",
-       "nowiki_tip": "вики формат этювини игнор эт",
-       "image_sample": "Resim.jpg",
-       "image_tip": "Эндирильген файл",
-       "media_sample": "Ses.ogg",
-       "media_tip": "Медиа файлына багъланты",
-       "sig_tip": "Имзанъыз ве тарих",
-       "hr_tip": "Горизонталь сызыкъ (пек сыкъ къулланманъыз)",
        "summary": "Денъиштирменинъ къыскъа тарифи:",
        "subject": "Мевзу:",
        "minoredit": "Бу, кичик денъиштирмедир",
index e0326c5..597afd2 100644 (file)
        "resetpass-submit-cancel": "Lâğu",
        "resetpass-wrong-oldpass": "Ruhsetsiz muvaqqat ya da şimdiki parol.\nParoliñizni endi muvafaqiyetnen deñiştirdiñiz ya da yañı bir muvaqqat parol istediñiz.",
        "resetpass-temp-password": "Muvaqqat parol:",
-       "bold_sample": "Qalın yazılış",
-       "bold_tip": "Qalın yazılış",
-       "italic_sample": "İtalik (kursiv) yazılış",
-       "italic_tip": "İtalik (kursiv) yazılış",
-       "link_sample": "Saifeniñ serlevası",
-       "link_tip": "İçki bağlantı",
-       "extlink_sample": "http://www.example.com saifeniñ serlevası",
-       "extlink_tip": "Tış bağlantı (Adres ögüne http:// qoymağa unutmañız)",
-       "headline_sample": "Serleva yazısı",
-       "headline_tip": "2-nci seviye serleva",
-       "nowiki_sample": "Serbest format metiniñizni mında yazıñız.",
-       "nowiki_tip": "viki format etüvini ignor et",
-       "image_sample": "Resim.jpg",
-       "image_tip": "Endirilgen fayl",
-       "media_sample": "Ses.ogg",
-       "media_tip": "Media faylına bağlantı",
-       "sig_tip": "İmzañız ve tarih",
-       "hr_tip": "Gorizontal sızıq (pek sıq qullanmañız)",
        "summary": "Deñiştirmeniñ qısqa tarifi:",
        "subject": "Mevzu:",
        "minoredit": "Bu, kiçik deñiştirmedir",
index 15f5ee1..884bd4d 100644 (file)
@@ -45,7 +45,8 @@
                        "Jaroslav Cerny",
                        "Slepi",
                        "Tchoř",
-                       "SimonV"
+                       "SimonV",
+                       "MrJaroslavik"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
@@ -63,7 +64,7 @@
        "tog-watchmoves": "Přidávat mnou přesouvané stránky a soubory mezi sledované",
        "tog-watchdeletion": "Přidávat stránky a soubory, které smažu, mezi sledované",
        "tog-watchuploads": "Přidávat mnou načtené soubory ke sledovaným",
-       "tog-watchrollback": "Přidávat stránky, které jsem {{GENDER:|vrátil|vrátila}} zpět, ke sledovaným",
+       "tog-watchrollback": "Přidávat stránky, kde jsem {{GENDER:|použil|použila}} vrácení zpět, ke sledovaným",
        "tog-minordefault": "Označovat editace implicitně jako malé",
        "tog-previewontop": "Zobrazovat náhled před editačním oknem (ne za ním)",
        "tog-previewonfirst": "Zobrazit při první editaci náhled",
@@ -91,7 +92,8 @@
        "tog-norollbackdiff": "Po vrácení změny nezobrazovat porovnání rozdílů",
        "tog-useeditwarning": "Upozornit, když budu opouštět editaci bez uložení změn",
        "tog-prefershttps": "Po přihlášení vždy používat zabezpečené připojení",
-       "tog-showrollbackconfirmation": "Při kliknutí na odkaz pro vrácení editace zobrazit žádost o potvrzení",
+       "tog-showrollbackconfirmation": "Při kliknutí na odkaz pro rychlý revert zobrazit žádost o potvrzení",
+       "tog-requireemail": "Pro obnovu hesla vyžadovat e-mail",
        "underline-always": "Vždy",
        "underline-never": "Nikdy",
        "underline-default": "Podle nastavení prohlížeče nebo vzhledu",
        "category_header": "Stránky v kategorii „$1“",
        "subcategories": "Podkategorie",
        "category-media-header": "Soubory v kategorii „$1“",
-       "category-empty": "''Tato kategorie neobsahuje žádné stránky či soubory.''",
+       "category-empty": "<em>Tato kategorie neobsahuje žádné stránky či soubory.</em>",
        "hidden-categories": "{{PLURAL:$1|Skrytá kategorie|Skryté kategorie|Skryté kategorie}}",
        "hidden-category-category": "Skryté kategorie",
        "category-subcat-count": "{{PLURAL:$2|V této kategorii je pouze následující podkategorie.|{{PLURAL:$1|Zobrazuje se jedna podkategorie|Zobrazují se $1 podkategorie|Zobrazuje se $1 podkategorií}} z celkového počtu $2 podkategorií v této kategorii.|{{PLURAL:$1|Zobrazuje se jedna podkategorie|Zobrazují se $1 podkategorie|Zobrazuje se $1 podkategorií}} z celkového počtu $2 podkategorií v této kategorii.}}",
        "createaccountmail": "Použít dočasné náhodné heslo a odeslat ho na uvedenou e-mailovou adresu",
        "createaccountmail-help": "Lze využít k založení účtu pro jinou osobu bez prozrazení hesla.",
        "createacct-realname": "Skutečné jméno (nepovinné)",
-       "createacct-reason": "Důvod",
+       "createacct-reason": "Důvod (veřejně zaznamenaný)",
        "createacct-reason-ph": "Proč si vytváříte další účet",
        "createacct-reason-help": "Zpráva zobrazená v knize nových uživatelů",
        "createacct-submit": "Vytvořit účet",
        "resettokens-watchlist-token": "Klíč k webovému kanálu (Atom/RSS) [[Special:Watchlist|změn sledovaných stránek]]",
        "resettokens-done": "Klíče reinicializovány",
        "resettokens-resetbutton": "Reinicializovat vybrané klíče",
-       "bold_sample": "Tučný text",
-       "bold_tip": "Tučný text",
-       "italic_sample": "Kurzíva",
-       "italic_tip": "Kurzíva",
-       "link_sample": "Název odkazu",
-       "link_tip": "Vnitřní odkaz",
-       "extlink_sample": "http://www.example.com Titulek odkazu",
-       "extlink_tip": "Externí odkaz (nezapomeňte na předponu http://)",
-       "headline_sample": "Text nadpisu",
-       "headline_tip": "Nadpis druhé úrovně",
-       "nowiki_sample": "Sem vložte neformátovaný text",
-       "nowiki_tip": "Ignorovat formátování wiki",
-       "image_sample": "Příklad.jpg",
-       "image_tip": "Soubor",
-       "media_sample": "Příklad.ogg",
-       "media_tip": "Odkaz na mediální soubor",
-       "sig_tip": "Váš podpis s datem a časem",
-       "hr_tip": "Vodorovná čára (používejte střídmě)",
        "summary": "Shrnutí editace:",
        "subject": "Předmět:",
        "minoredit": "Tato změna je malá editace.",
        "systemblockedtext": "Vaše IP adresa byla automaticky zablokována softwarem MediaWiki.\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec blokování: $6\n* Původně blokovaný uživatel: $7\n\nVaše současná IP adresa je $3.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
        "blockednoreason": "důvod nebyl zadán",
        "blockedtext-composite": "<strong>Vaše uživatelské jméno nebo IP adresa byla zablokována.</strong>\n\nUdaný důvod blokování:\n\n:<em>$2</em>\n\n* Začátek blokování: $8\n* Konec nejdelšího blokování: $6\n\n* $5\n\nVaše současná IP adresa je $3.\nProsíme, uveďte tyto údaje při komunikaci se správci.",
+       "blockedtext-composite-ids": "Odpovídající ID bloku: $1 (může být zablokována také vaše IP adresa)",
+       "blockedtext-composite-no-ids": "Vaše IP adresa se objevuje na několika černých listinách",
        "blockedtext-composite-reason": "Na váš účet a/nebo vaši IP adresu se vztahuje více blokování.",
        "whitelistedittext": "Pro editaci se musíte $1.",
        "confirmedittext": "Pro editaci stránek je vyžadováno potvrzení vaší e-mailové adresy.\nNa stránce [[Special:Preferences|nastavení]] zadejte a nechte potvrdit svou e-mailovou adresu.",
        "nocreate-loggedin": "Nemáte povoleno zakládat nové stránky.",
        "sectioneditnotsupported-title": "Editace sekcí není podporována",
        "sectioneditnotsupported-text": "Na této editační stránce není podporována editace jedné sekce.",
+       "modeleditnotsupported-title": "Editace není podporována",
+       "modeleditnotsupported-text": "Pro model obsahu $1 není podporována editace.",
        "permissionserrors": "Chyba povolení",
        "permissionserrorstext": "Nemáte povoleno toto provést z {{PLURAL:$1|následujícího důvodu|následujících důvodů|následujících důvodů}}:",
        "permissionserrorstext-withaction": "Z {{PLURAL:$1|následujícího důvodu|následujících důvodů}} nemáte oprávnění $2:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Prázdný objekt",
        "content-json-empty-array": "Prázdné pole",
+       "unsupported-content-model": "<strong>Varování:</strong> Model obsahu $1 není na této wiki podporován.",
+       "unsupported-content-diff": "Rozdíly obsahů s modelem $1 nejsou podporovány.",
+       "unsupported-content-diff2": "Rozdíly mezi obsahy s modely $1 a $2 nejsou na této wiki podporovány.",
        "deprecated-self-close-category": "Stránky s neplatnými sebeuzavírajícími HTML značkami",
        "deprecated-self-close-category-desc": "Stránka obsahuje neplatné sebeuzavírající HTML značky, například <code>&lt;b/></code> nebo <code>&lt;span/></code>. Jejich chování se v zájmu konzistence se specifikací HTML5 brzy změní, proto je jejich použití ve wikitextu zastaralé.",
        "duplicate-args-warning": "<strong>Upozornění:</strong> Stránka [[:$1]] volá [[:$2]] s více než jednou hodnotou parametru „$3“. Použije se jen poslední uvedená hodnota.",
        "undo-norev": "Tuto editaci není možné vrátit, protože neexistuje nebo byla smazána.",
        "undo-nochange": "Zdá se, že editace již byla zrušena.",
        "undo-summary": "Zrušena verze $1 od uživatele [[Special:Contributions/$2|$2]] ([[User talk:$2|diskuse]])",
+       "undo-summary-anon": "Zrušena verze $1 od uživatele [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Zrušena verze $1 od skrytého uživatele",
        "cantcreateaccount-text": "Zakládání nových účtů z této IP adresy (<strong>$1</strong>) bylo zablokováno {{GENDER:$3|uživatelem|uživatelkou}} [[User:$3|$3]].\n\n$3 uvádí toto zdůvodnění: <em>$2</em>",
        "cantcreateaccount-range-text": "Zakládání nových účtů z IP adres v rozsahu <strong>$1</strong>, který obsahuje i vaši IP adresu (<strong>$4</strong>), bylo zablokováno {{GENDER:$3|uživatelem|uživatelkou}} [[User:$3|$3]].\n\n$3 uvádí toto zdůvodnění: <em>$2</em>",
        "search-interwiki-more": "(více)",
        "search-interwiki-more-results": "další výsledky",
        "search-relatedarticle": "Související",
+       "search-invalid-sort-order": "Řazení $1 není známo, použije se výchozí řazení. Platná řazení jsou: $2",
+       "search-unknown-profile": "Vyhledávací profil $1 není znám, použije se výchozí profil.",
        "searchrelated": "související",
        "searchall": "vše",
        "showingresults": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.",
        "prefs-help-email": "Uvedení e-mailu není povinné, ale umožní zaslání nového hesla v případě, že své heslo zapomenete.",
        "prefs-help-email-others": "Také můžete dovolit ostatním uživatelům vás prostřednictvím uživatelské stránky kontaktovat.\nVaše adresa v takovém případě není prozrazena.",
        "prefs-help-email-required": "Je vyžadována e-mailová adresa.",
+       "prefs-help-requireemail": "Pokud je zaškrtnuto, e-mail pro obnovu hesla se zašle jen v případě, že osoba žádající o nové heslo uvede jak uživatelské jméno, tak e-mail tohoto účtu.",
        "prefs-info": "Základní údaje",
        "prefs-i18n": "Lokalizace",
        "prefs-signature": "Podpis",
        "backend-fail-contenttype": "Nelze určit typ obsahu souboru k uložení do „$1“.",
        "backend-fail-batchsize": "Koncový úložný systém přijal dávku s $1 {{PLURAL:$1|souborovou operací|souborovými operacemi}}; limit je {{PLURAL:$2|jedna operace|$2 operace|$2 operací}}.",
        "backend-fail-usable": "Nepodařilo se zapsat do souboru „$1“ kvůli nedostatečným oprávněním nebo chybějícím adresářům/kontejnerům.",
+       "backend-fail-stat": "Nepodařilo se načíst stav souboru „$1“.",
+       "backend-fail-hash": "Nepodařilo se určit kryptografický haš souboru „$1“.",
        "filejournal-fail-dbconnect": "Nelze se připojit k žurnálové databázi pro koncový úložný systém „$1“.",
        "filejournal-fail-dbquery": "Nepodařilo se aktualizovat žurnálovou databázi pro koncový úložný systém „$1“.",
        "lockmanager-notlocked": "Soubor „$1“ nelze odemknout, neboť není zamčen.",
        "listfiles-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.",
        "imgfile": "soubor",
        "listfiles": "Seznam souborů",
+       "listfiles_subpage": "Soubory {{GENDER:$1|uživatele|uživatelky}} $1",
        "listfiles_thumb": "Náhled",
        "listfiles_date": "Datum",
        "listfiles_name": "Název",
        "alreadyrolled": "Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.\n\nPoslední editaci této stránky {{GENDER:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Shrnutí editace bylo: <em>$1</em>.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
+       "revertpage-anon": "Editace uživatele „[[Special:Contributions/$2|$2]]“ vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
        "rollback-success": "Editace {{GENDER:$3|uživatele|uživatelky}} $1 byly vráceny na poslední verzi od {{GENDER:$4|uživatele|uživatelky}} $2.",
        "sessionfailure-title": "Chyba relace",
        "ipblocklist-legend": "Hledat zablokovaného uživatele",
        "blocklist-userblocks": "Skrýt zablokované účty",
        "blocklist-tempblocks": "Skrýt dočasná zablokování",
+       "blocklist-indefblocks": "Skrýt zablokování do odvolání",
        "blocklist-addressblocks": "Skrýt blokování jedné IP adresy",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Vše",
        "linkaccounts": "Propojení účtů",
        "linkaccounts-success-text": "Účet byl propojen.",
        "linkaccounts-submit": "Propojit účty",
+       "cannotunlink-no-provider-title": "Žádné propojené účty k rozpojení",
+       "cannotunlink-no-provider": "Neexistují žádné propojené účty, které by bylo možno rozpojit.",
        "unlinkaccounts": "Zrušení propojení účtů",
        "unlinkaccounts-success": "Propojení účtu bylo zrušeno.",
        "authenticationdatachange-ignored": "Změna autentizačních údajů nebyla zpracována. Možná není nakonfigurován žádný poskytovatel?",
index 88dcf0e..a813722 100644 (file)
        "resetpass-submit-cancel": "Anulujë",
        "passwordreset": "Zresëtëjë parolã",
        "passwordreset-username": "Pòzwa brëkòwnika",
-       "bold_sample": "Wëtłëszczony drëk",
-       "bold_tip": "Wëtłëszczony drëk",
-       "italic_sample": "Ùchëłi tekst",
-       "italic_tip": "Ùchëłi tekst (italic)",
-       "link_sample": "Titel lënka",
-       "link_tip": "Bënowi lënk",
-       "extlink_sample": "http://www.example.com titel lënka",
-       "extlink_tip": "Bùtnowi lënk (pamiãtôj ò http:// prefiks)",
-       "headline_sample": "Tekst nadgłówka",
-       "headline_tip": "Nadgłówk 2 lédżi",
-       "nowiki_sample": "Wstawi tuwò niesfòrmatowóny tekst",
-       "nowiki_tip": "Jignorëjë wiki-fòrmatowanié",
-       "image_sample": "Przëmiôr.jpg",
-       "image_tip": "Òbsôdzony lopk (n.p. òbrôzk)",
-       "media_sample": "Przëmiôr.ogg",
-       "media_tip": "Lënk lopka",
-       "sig_tip": "Twój pòdpisënk z datumã a czasã",
-       "hr_tip": "Hòrizontalnô linijô (brëkùjë szpórowno)",
        "summary": "Pòdrechòwanié:",
        "subject": "Téma:",
        "minoredit": "To je drobnô edicjô",
index b59502d..2c3c6c5 100644 (file)
        "passwordreset": "нова таина слова оуставлѥниѥ",
        "passwordreset-username": "польꙃєватєлꙗ имѧ :",
        "changeemail-none": "(нѣстъ)",
-       "link_sample": "съвѧꙁи имѧ",
-       "link_tip": "вънѫтрьнꙗ съвѧꙁь",
-       "extlink_sample": "http://www.example.com съвѧꙁи имѧ",
-       "extlink_tip": "вънѣщьнꙗ съвѧꙁь (помьни о http://)",
-       "headline_sample": "тїтла напьсаниѥ",
-       "headline_tip": "тїтлъ рѧда В҃",
-       "media_tip": "дѣла съвѧꙁь",
-       "sig_tip": "твои аѵтографъ и нꙑнѣшьна врѣмѧ и дьнь",
        "summary": "опьсаниѥ :",
        "subject": "ѳєма :",
        "minoredit": "малаꙗ мѣна",
index 70eb328..b989ec2 100644 (file)
        "passwordreset-domain": "Домен:",
        "changeemail-none": "(çук)",
        "resettokens": "Токенĕсене пăрах",
-       "bold_sample": "Çурмахулăм текст",
-       "bold_tip": "Çурмахулăм текст",
-       "italic_sample": "Тайлăк текст",
-       "italic_tip": "Тайлăк текст",
-       "link_sample": "Каçăн ячĕ",
-       "link_tip": "Шалти каçă",
-       "extlink_sample": "http://www.example.com каçăн ячĕ",
-       "extlink_tip": "Тулаш каçи (http:// префикс çинчен ан манăр)",
-       "headline_sample": "Пуçелĕк",
-       "headline_tip": "Иккĕмĕш шайри ят",
-       "nowiki_sample": "Кунта фотматламан текста кĕртĕр.",
-       "nowiki_tip": "Вики-ĕрешлевне пăхмалла мар",
-       "image_tip": "Кĕртсе лартнă ӳкерчĕк",
-       "media_tip": "Медиа-файл çине каçă",
-       "sig_tip": "Сирĕн алă пусни тата вăхăт",
-       "hr_tip": "Горизонтальлĕ йĕр (сахалтарах усă курăр)",
        "summary": "Улăштарнисене ăнлантарни:",
        "subject": "Тема:",
        "minoredit": "Пĕчĕк улшăну",
index fc9a9bd..b4c8942 100644 (file)
        "resettokens-watchlist-token": "Tocyn i borthiant gwe (Atom/RSS) y [[Special:Watchlist|newidiadau i'r tudalennau ar eich rhestr wylio]]",
        "resettokens-done": "Ailosodwyd y tocynnau.",
        "resettokens-resetbutton": "Ailosoder y tocynnau a ddewiswyd",
-       "bold_sample": "Testun cryf",
-       "bold_tip": "Testun cryf",
-       "italic_sample": "Testun italig",
-       "italic_tip": "Testun italig",
-       "link_sample": "Teitl y cyswllt",
-       "link_tip": "Cyswllt mewnol",
-       "extlink_sample": "http://www.example.com teitl y cyswllt",
-       "extlink_tip": "Cyswllt allanol (cofiwch y rhagddodiad http:// )",
-       "headline_sample": "Testun pennawd",
-       "headline_tip": "Pennawd lefel 2",
-       "nowiki_sample": "Rhowch destun di-fformatedig yma",
-       "nowiki_tip": "Anwybyddu'r gystrawen wici",
-       "image_sample": "Enghraifft.jpg",
-       "image_tip": "Ffeil mewnosodol",
-       "media_sample": "Example.ogg",
-       "media_tip": "Cyswllt ffeil media",
-       "sig_tip": "Eich llofnod gyda stamp amser",
-       "hr_tip": "Llinell lorweddol (peidiwch â'i gor-ddefnyddio)",
        "summary": "Crynodeb:",
        "subject": "Pwnc:",
        "minoredit": "Golygiad bychan yw hwn",
index b1a1cce..fac7ebd 100644 (file)
        "resettokens-watchlist-token": "Nøgle for web-feed (Atom/RSS) af [[Special:Watchlist|ændringer af sider på din overvågningsliste]]",
        "resettokens-done": "Nøgler er nulstillet.",
        "resettokens-resetbutton": "Nulstil valgte nøgler",
-       "bold_sample": "Fed tekst",
-       "bold_tip": "Fed tekst",
-       "italic_sample": "Kursiv tekst",
-       "italic_tip": "Kursiv tekst",
-       "link_sample": "Link titel",
-       "link_tip": "Intern link",
-       "extlink_sample": "http://www.example.com link titel",
-       "extlink_tip": "Ekstern link (husk http:// præfiks)",
-       "headline_sample": "Tekst til overskrift",
-       "headline_tip": "Niveau 2 overskrift",
-       "nowiki_sample": "Indsæt ikke formateret tekst her",
-       "nowiki_tip": "Ignorer wiki formatering",
-       "image_sample": "Eksempel.jpg",
-       "image_tip": "Indlejret fil",
-       "media_sample": "Eksempel.ogg",
-       "media_tip": "Fil link",
-       "sig_tip": "Din signatur med tidsstempel",
-       "hr_tip": "Horisontal linje (bruges sparsomt)",
        "summary": "Sammenfatning:",
        "subject": "Emne:",
        "minoredit": "Dette er en mindre ændring",
index 52813b9..25a2d9e 100644 (file)
        "changeemail-password": "Ihr {{SITENAME}}-Passwort:",
        "changeemail-throttled": "Sie haben zu viele Anmeldeversuche unternommen.\nBitte warten Sie $1, bevor Sie es erneut versuchen.",
        "resettokens-text": "Sie können Tokens zurücksetzen, welche Ihnen den Zugriff auf bestimmte private Daten ermöglichen, die mit Ihrem Benutzerkonto hier verknüpft sind.\n\nSie sollten dies nur machen, wenn Sie die Tokens versehentlich mit jemandem geteilt haben oder Ihr Konto gefährdet ist.",
-       "sig_tip": "Ihre Signatur mit Zeitstempel",
        "blankarticle": "<strong>Warnung:</strong> Die Seite, die Sie erstellen, ist leer.\nWenn Sie erneut auf „$1“ klicken, wird die Seite ohne Inhalt erstellt.",
        "anoneditwarning": "<strong>Warnung:</strong> Sie sind nicht angemeldet. Ihre IP-Adresse wird öffentlich sichtbar, falls Sie Bearbeitungen durchführst. Sofern Sie sich <strong>[$1 anmelden]</strong> oder <strong>[$2 ein Benutzerkonto erstellen]</strong>, werden Ihre Bearbeitungen zusammen mit anderen Beiträgen Ihrem Benutzernamen zugeordnet.",
        "anonpreviewwarning": "<em>Sie sind nicht angemeldet. Beim Speichern wird Ihre IP-Adresse in der Versionsgeschichte aufgezeichnet.</em>",
index 08aaa49..5c60cff 100644 (file)
                        "Andi-3",
                        "1233qwer1234qwer4",
                        "MarkusRost",
-                       "Mcandri13"
+                       "Mcandri13",
+                       "Tobi 406"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "tog-useeditwarning": "Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält",
        "tog-prefershttps": "Immer eine sichere Verbindung benutzen, solange ich angemeldet bin",
        "tog-showrollbackconfirmation": "Bei Klick auf „kommentarlos zurücksetzen“ eine Sicherheitsabfrage anzeigen",
+       "tog-requireemail": "E-Mail-Adresse zum Zurücksetzen des Passworts erforderlich",
        "underline-always": "immer",
        "underline-never": "nie",
        "underline-default": "abhängig von der Benutzeroberfläche oder Browsereinstellung",
        "createaccountmail": "Ein temporäres Zufallspasswort verwenden und an die angegebene E-Mail-Adresse versenden",
        "createaccountmail-help": "Kann verwendet werden, um für eine andere Person ein Benutzerkonto zu erstellen, ohne das Passwort zu erfahren.",
        "createacct-realname": "Bürgerlicher Name (optional)",
-       "createacct-reason": "Begründung",
+       "createacct-reason": "Begründung (öffentlich geloggt)",
        "createacct-reason-ph": "Warum erstellst du ein anderes Benutzerkonto?",
        "createacct-reason-help": "Im Neuanmeldungs-Logbuch angezeigte Nachricht",
        "createacct-submit": "Benutzerkonto erstellen",
        "resettokens-watchlist-token": "Token für den Webfeed (Atom/RSS) der [[Special:Watchlist|Änderungen an Seiten auf deiner Beobachtungsliste]]",
        "resettokens-done": "Tokens zurückgesetzt.",
        "resettokens-resetbutton": "Ausgewählte Token zurücksetzen",
-       "bold_sample": "Fetter Text",
-       "bold_tip": "Fetter Text",
-       "italic_sample": "Kursiver Text",
-       "italic_tip": "Kursiver Text",
-       "link_sample": "Link-Text",
-       "link_tip": "Interner Link",
-       "extlink_sample": "http://www.example.com Link-Text",
-       "extlink_tip": "Externer Link (http:// beachten)",
-       "headline_sample": "Ebene-2-Überschrift",
-       "headline_tip": "Ebene-2-Überschrift",
-       "nowiki_sample": "Unformatierten Text hier einfügen",
-       "nowiki_tip": "Unformatierter Text",
-       "image_sample": "Beispiel.jpg",
-       "image_tip": "Dateilink",
-       "media_sample": "Beispiel.ogg",
-       "media_tip": "Mediendatei-Link",
-       "sig_tip": "Deine Signatur mit Zeitstempel",
-       "hr_tip": "Horizontale Linie (sparsam verwenden)",
        "summary": "Zusammenfassung:",
        "subject": "Betreff:",
        "minoredit": "Nur Kleinigkeiten wurden verändert",
        "nocreate-loggedin": "Du hast nicht die erforderliche Berechtigung, um neue Seiten erstellen zu können.",
        "sectioneditnotsupported-title": "Die Bearbeitung von Abschnitten wird nicht unterstützt",
        "sectioneditnotsupported-text": "Die Bearbeitung von Abschnitten wird auf dieser Bearbeitungsseite nicht unterstützt.",
+       "modeleditnotsupported-title": "Bearbeiten nicht möglich",
+       "modeleditnotsupported-text": "Das Bearbeiten wird für Seiten des Inhaltsmodells $1 nicht unterstützt.",
        "permissionserrors": "Berechtigungsfehler",
        "permissionserrorstext": "Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Leeres Objekt",
        "content-json-empty-array": "Leeres Array",
+       "unsupported-content-model": "<strong>Warnung:</strong> Das Inhaltsmodell $1 wird auf diesem Wiki nicht unterstützt.",
+       "unsupported-content-diff": "Versionsvergleiche werden für Seiten des Inhaltsmodells $1 nicht unterstützt.",
+       "unsupported-content-diff2": "Versionsvergleiche zwischen den Inhaltsmodellen $1 und $2 werden auf diesem Wiki nicht unterstützt.",
        "deprecated-self-close-category": "Seiten, die ungültige selbstschließende HTML-Tags verwenden",
        "deprecated-self-close-category-desc": "Die Seite enthält ungültige selbstschließende HTML-Tags wie <code>&lt;b/></code> oder <code>&lt;span/></code>. Das Verhalten dieser Tags wird bald geändert, um mit der HTML5-Spezifikation konsistent zu sein, so dass ihre Verwendung im Wikitext veraltet ist.",
        "duplicate-args-warning": "<strong>Warnung:</strong> [[:$1]] ruft [[:$2]] mit mehr als einem Wert für den Parameter „$3“ auf. Nur der letzte angegebene Wert wird verwendet.",
        "undo-norev": "Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.",
        "undo-nochange": "Anscheinend wurde diese Bearbeitung bereits rückgängig gemacht.",
        "undo-summary": "Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.",
+       "undo-summary-anon": "Änderung $1 von [[Special:Contributions/$2|$2]] rückgängig gemacht",
        "undo-summary-username-hidden": "Änderung $1 eines versteckten Benutzers rückgängig gemacht.",
        "cantcreateaccount-text": "Die Erstellung eines Benutzerkontos von der IP-Adresse '''($1)''' aus wurde durch [[User:$3|$3]] gesperrt.\n\nGrund der Sperre: ''$2''",
        "cantcreateaccount-range-text": "Das Erstellen von Benutzerkonten von IP-Adressen im Bereich <strong>$1</strong>, der deine IP-Adresse (<strong>$4</strong>) enthält, wurde von [[User:$3|$3]] gesperrt.\n\nDer angegebene Grund von $3 lautet: <em>$2</em>",
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.",
        "prefs-help-email-others": "Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt aufnehmen, ohne dass du deine Identität offenlegen musst.",
        "prefs-help-email-required": "Es wird eine gültige E-Mail-Adresse benötigt.",
+       "prefs-help-requireemail": "Wird diese Option ausgewählt, werden nur dann E-Mails zum Zurücksetzen des Passworts versandt, wenn die Person beim Zurücksetzen den Benutzernamen und die E-Mail-Adresse dieses Kontos angegeben hat.",
        "prefs-info": "Basisinformationen",
        "prefs-i18n": "Sprache",
        "prefs-signature": "Signatur",
        "rcfilters-filter-showlinkedto-label": "Änderungen auf Seiten anzeigen, die verlinken auf",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Seiten</strong>, die <strong>auf</strong> die ausgewählte Seite <strong>verlinken</strong>",
        "rcfilters-target-page-placeholder": "Einen Seitennamen (oder eine Kategorie) eingeben",
+       "rcfilters-allcontents-label": "Alle Inhaltsseiten",
+       "rcfilters-alldiscussions-label": "Alle Diskussionsseiten",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfromreset": "Datumsauswahl zurücksetzen",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "backend-fail-contenttype": "Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.",
        "backend-fail-batchsize": "Der Datenbank wurde eine Stapelverarbeitungsdatei mit {{PLURAL:$1|einem Verarbeitungsschritt|$1 Verarbeitungsschritten}} übermittelt. Die zulässige Obergrenze liegt indes bei {{PLURAL:$2|einem Verarbeitungsschritt|$2 Verarbeitungsschritten}}.",
        "backend-fail-usable": "Die Datei „$1“ konnte entweder aufgrund eines nicht vorhandenen Verzeichnisses oder wegen unzureichender Berechtigungen weder abgerufen noch gespeichert werden.",
+       "backend-fail-stat": "Konnte den Status der Datei $1 nicht auslesen.",
+       "backend-fail-hash": "Konnte den kryptographischen Hash der Datei $1 nicht ermitteln.",
        "filejournal-fail-dbconnect": "Es konnte keine Verbindung zur Journaldatenbank des Datenbanksystems „$1“ hergestellt werden.",
        "filejournal-fail-dbquery": "Die Journaldatenbank des Datenbanksystems „$1“ konnte nicht aktualisiert werden.",
        "lockmanager-notlocked": "„$1“ konnte nicht entsperrt werden, da keine Sperrung besteht.",
        "listfiles-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
        "imgfile": "Datei",
        "listfiles": "Dateiliste",
+       "listfiles_subpage": "Von $1 hochgeladene Dateien",
        "listfiles_thumb": "Vorschaubild",
        "listfiles_date": "Datum",
        "listfiles_name": "Name",
        "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da bereits ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
+       "revertpage-anon": "Änderungen von [[Special:Contributions/$2|$2]] wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
        "rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte sende das Formular erneut ab.",
        "changecontentmodel": "Inhaltsmodell einer Seite ändern",
        "changecontentmodel-legend": "Inhaltsmodell ändern",
-       "changecontentmodel-title-label": "Seitentitel",
+       "changecontentmodel-title-label": "Seitentitel:",
        "changecontentmodel-current-label": "Aktuelles Inhaltsmodell:",
-       "changecontentmodel-model-label": "Neues Inhaltsmodell",
+       "changecontentmodel-model-label": "Neues Inhaltsmodell:",
        "changecontentmodel-reason-label": "Grund:",
        "changecontentmodel-submit": "Ändern",
        "changecontentmodel-success-title": "Das Inhaltsmodell wurde geändert",
        "ipblocklist-legend": "Suche nach einem gesperrten Benutzer",
        "blocklist-userblocks": "Benutzersperren ausblenden",
        "blocklist-tempblocks": "Befristete Sperren ausblenden",
+       "blocklist-indefblocks": "Unbefristete Sperren ausblenden",
        "blocklist-addressblocks": "Sperren einzelner IP-Adressen ausblenden",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Alle",
        "block-log-flags-angry-autoblock": "erweiterter Autoblock aktiviert",
        "block-log-flags-hiddenname": "Benutzername versteckt",
        "range_block_disabled": "Die Möglichkeit, ganze Adressräume zu sperren, ist nicht aktiviert.",
+       "ipb-prevent-user-talk-edit": "Das Bearbeiten der eigenen Diskussionsseite muss bei einer partiellen Sperre erlaubt bleiben, es sei denn, diese enthält Beschränkungen zum Benutzerdiskussions-Namensraum.",
        "ipb_expiry_invalid": "Die eingegebene Dauer ist ungültig.",
        "ipb_expiry_old": "Der Zeitpunkt des Ablaufs liegt in der Vergangenheit.",
        "ipb_expiry_temp": "Benutzernamens-Sperren mit der Verstecken-Option müssen permanent sein.",
        "move-page-legend": "Seite verschieben",
        "movepagetext": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nDu kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
+       "movepagetext-noredirectsupport": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst. Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen. \n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt. Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong> Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben. Du solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetalktext": "Falls du dieses Kästchen aktivierst, wird die dazugehörige Diskussionsseite automatisch auf den neuen Titel verschoben, sofern nicht bereits eine nicht-leere Diskussionsseite dort vorhanden ist.\n\nIn diesem Fall musst du die Seite manuell verschieben oder zusammenführen, falls erforderlich.",
        "moveuserpage-warning": "<strong>Warnung:</strong> Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, <em>nicht</em> aber der Benutzer umbenannt wird.",
        "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle der alten Kategorie zugeordneten Seiten werden <em>nicht</em> neu kategorisiert.",
        "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 bearbeitet.",
        "othercontribs": "Basierend auf der Arbeit von $1.",
        "others": "anderen",
-       "siteusers": "{{SITENAME}}-{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
-       "anonusers": "{{PLURAL:$2|unangemeldetem|unangemeldeten}} {{SITENAME}}-{{PLURAL:$2|Benutzer|Benutzern}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
+       "anonusers": "{{PLURAL:$2|unangemeldetem|unangemeldeten}} {{PLURAL:$2|Benutzer|Benutzern}} $1",
        "creditspage": "Seitenzuschreibung",
        "nocredits": "Für diese Seite sind keine Zuschreibungen vorhanden.",
        "spamprotectiontitle": "Spamschutzfilter",
        "linkaccounts": "Benutzerkonten verknüpfen",
        "linkaccounts-success-text": "Das Benutzerkonto wurde verknüpft.",
        "linkaccounts-submit": "Benutzerkonten verknüpfen",
+       "cannotunlink-no-provider-title": "Es gibt keine verbundenen Konten, die getrennt werden könnten.",
+       "cannotunlink-no-provider": "Es gibt keine verbundenen Konten, die getrennt werden könnten.",
        "unlinkaccounts": "Benutzerkonten trennen",
        "unlinkaccounts-success": "Das Benutzerkonto wurde getrennt.",
        "authenticationdatachange-ignored": "Die Änderung der Authentifizierungsdaten wurde nicht bearbeitet. Vielleicht wurde kein Anbieter konfiguriert?",
        "specialmute-label-mute-email": "E-Mails von diesem Benutzer stummschalten",
        "specialmute-header": "Bitte wähle deine Stummschaltungseinstellungen für Benutzer <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Der gesuchte Benutzername konnte nicht gefunden werden.",
+       "specialmute-error-no-options": "Stummschaltungs-Funktionen sind nicht verfügbar. Gründe dafür könnten sein: du hast deine E-Mail-Adresse nicht bestätigt oder ein Administrator hat die E-Mail-Funktionen deaktiviert oder eine E-Mail-Blacklist in diesem Wiki eingerichtet.",
        "specialmute-email-footer": "Um deine E-Mail Einstellungen für Benutzer {{BIDI:$2}} zu verwalten besuche bitte <$1>.",
        "specialmute-login-required": "Bitte melde dich an um deine Stummschaltungseinstellungen zu ändern.",
+       "mute-preferences": "Stummschaltungs-Einstellungen",
        "revid": "Version $1",
        "pageid": "Seitenkennung $1",
        "interfaceadmin-info": "$1\n\nBerechtigungen für das Bearbeiten von wikiweiten CSS/JS/JSON-Dateien wurden kürzlich vom Recht <code>editinterface</code> getrennt. Falls du nicht verstehst, warum du diesen Fehler erhältst, siehe [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Das Passwort kann nicht in der Liste der 100.000 am häufigsten verwendeten Passwörter sein.",
        "passwordpolicies-policyflag-forcechange": "muss bei der Anmeldung geändert werden",
        "passwordpolicies-policyflag-suggestchangeonlogin": "Änderung bei der Anmeldung vorschlagen",
+       "mycustomjsredirectprotected": "Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten, da sie eine Weiterleitung, die nicht in deinen Benutzernamensraum zeigt, enthält.",
        "easydeflate-invaliddeflate": "Der angegebene Inhalt ist nicht ordnungsgemäß komprimiert",
        "unprotected-js": "Aus Sicherheitsgründen kann JavaScript-Code nicht mehr von ungeschützten Seiten geladen werden. Erstelle die JavaScript-Seite bitte ausschließlich im Namensraum „MediaWiki“ oder als Benutzerunterseite.",
-       "userlogout-continue": "Möchtest du dich abmelden?"
+       "userlogout-continue": "Möchtest du dich abmelden?",
+       "rest-prefix-mismatch": "Der angeforderte Pfad ($1) kannte nicht innerhalb des REST-API-Root-Pfades ($2) gefunden werden"
 }
index 6ba40ff..ecddb15 100644 (file)
@@ -78,6 +78,7 @@
        "tog-norollbackdiff": "Peyser ardışi ra dıme ferqi measne",
        "tog-useeditwarning": "Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de",
        "tog-prefershttps": "Ronışten akerden de tım greyo itimadın bıkarne",
+       "tog-requireemail": "Parolapeysernayene rê email lazımo",
        "underline-always": "Tım",
        "underline-never": "Qet",
        "underline-default": "Cild ya zi cı geyrayoğo hesebiyaye",
@@ -86,8 +87,8 @@
        "editfont-sansserif": "Fontê Sans-serifi",
        "editfont-serif": "Font (çêşıdê nuştey) Serif",
        "sunday": "Bazar",
-       "monday": "Bahdêbazari",
-       "tuesday": "Telete",
+       "monday": "Dışeme",
+       "tuesday": "Sêşeme",
        "wednesday": "Çarşeme",
        "thursday": "Pancşeme",
        "friday": "Êne",
        "fri": "Yen",
        "sat": "Şem",
        "january": "Çele",
-       "february": "Gucige",
+       "february": "Sıbate",
        "march": "Adar",
        "april": "Nisan",
-       "may_long": "Gulan",
+       "may_long": "Gulane",
        "june": "Heziran",
        "july": "Temuz",
        "august": "Tebaxe",
        "september": "Keşkelun",
-       "october": "Cıtmeng",
-       "november": "Kelverdan",
-       "december": "Gağan",
+       "october": "Tışrino Verên",
+       "november": "Tışrino Peyên",
+       "december": "Kanun",
        "january-gen": "Çele",
-       "february-gen": "Şıbat",
+       "february-gen": "Sıbate",
        "march-gen": "Mert",
        "april-gen": "Nisane",
        "may-gen": "Gulane",
        "july-gen": "Temuz",
        "august-gen": "Tebaxe",
        "september-gen": "Keşkelun",
-       "october-gen": "Cıtmeng",
-       "november-gen": "Kelverdan",
-       "december-gen": "Gağan",
+       "october-gen": "Tışrino Verên",
+       "november-gen": "Tışrino Peyên",
+       "december-gen": "Kanun",
        "jan": "Çel",
-       "feb": "Şbt",
+       "feb": "Sbt",
        "mar": "Adr",
        "apr": "Nsn",
        "may": "Gul",
        "nov": "Tşp",
        "dec": "Gğn",
        "january-date": "$1 Çele",
-       "february-date": "$1 Şıbat",
+       "february-date": "$1 Sıbate",
        "march-date": "$1 Adar",
        "april-date": "$1 Nisan",
-       "may-date": "$1 Gulan",
+       "may-date": "$1 Gulane",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "august-date": "$1 Tebaxe",
        "september-date": "$1 Keşkelun",
        "october-date": "$1 Cıtmeng",
        "november-date": "$1 Kelverdan",
-       "december-date": "$1 Gağan",
+       "december-date": "$1 Kanun",
        "period-am": "VD",
        "period-pm": "BD",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
+       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriyi}}",
        "category_header": "Perrê kategoriya \"$1\"'i",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosye yê ke kategoriya \"$1\" dı",
        "category-file-count": "{{PLURAL:$2|Na kategori tenya dosya ya cêri muhtewa kena.|Na kategori de $2 ra pêro piya {{PLURAL:$1|1 dosya est a|$1 dosyey est ê}}.}}",
        "category-file-count-limited": "{{PLURAL:$1|Dosye|$1 Dosyey}} na kategori de yê.",
        "listingcontinuesabbrev": "dewam...",
-       "index-category": "Perrê rêzıni",
+       "index-category": "Pelê rêzıni",
        "noindex-category": "Perrê bêrêzıni",
        "broken-file-category": "Perri be linkanê dosya çewte",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Heqa",
        "article": "Pela zerreki",
        "newwindow": "(pençerey newey de beno a)",
-       "cancel": "İbtal",
+       "cancel": "Bıtexelne",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
-       "mypage": "Perr",
-       "mytalk": "Vaten",
-       "anontalk": "Vaten",
+       "mypage": "Pele",
+       "mytalk": "Werênayış",
+       "anontalk": "Werênayış",
        "navigation": "Pusula",
        "and": "&#32;u",
        "faq": "PVP",
        "printableversion": "Versiyono nustenaye",
        "permalink": "Gıreyo daimi",
        "print": "Bınustenê",
-       "view": "Bıvin",
+       "view": "Bıvêne",
        "view-foreign": "$1 de bıvin",
-       "edit": "Bıvurn",
+       "edit": "Bıvurne",
        "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraz",
        "create-local": "Şınasnayışê lokali cı ke",
-       "delete": "Bestern",
+       "delete": "Bestere",
        "undelete_short": "{{PLURAL:$1|nê vırnayışi|$1 vırnayışa}} peyser bıyarê",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bışevekne",
        "protect_change": "bıvırne",
        "unprotect": "Starnayışi bıvurne",
        "newpage": "Perra newi",
-       "talkpagelinktext": "vaten",
+       "talkpagelinktext": "werênayış",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "talk": "Vaten",
        "edithelp": "Peştdariya vurnayışi",
        "helppage-top-gethelp": "Peşti",
        "mainpage": "Perra Seri",
-       "mainpage-description": "Pera seri",
+       "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemati",
        "portal-url": "Project:Portalê cemati",
        "collapsible-collapse": "Teng ke",
        "collapsible-expand": "Hera kerê",
        "confirmable-confirm": "{{GENDER:$1|Şıma}} bêgumanê?",
-       "confirmable-yes": "E",
+       "confirmable-yes": "Eya",
        "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvin?",
        "restorelink": "{{PLURAL:$1|jew vurnayış besteriya|$1 vurnayışi besteriyaye}}",
-       "feedlinks": "Resnayış:",
+       "feedlinks": "Weyiyekerdış:",
        "feed-invalid": "Qeydey cıresnayışê  beğşi nêvêreno.",
        "feed-unavailable": "Cıresnayışê şebekey çıniyê",
        "site-rss-feed": "$1 Cıresnayışê RSSi",
        "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Perr",
+       "nstab-main": "Pele",
        "nstab-user": "Pera karberi",
        "nstab-media": "Pela medya",
-       "nstab-special": "Perra bağse",
+       "nstab-special": "Pela xısusiye",
        "nstab-project": "Perra procey",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
        "nstab-template": "Şablon",
        "nstab-help": "Perra pasti",
-       "nstab-category": "Kategori",
+       "nstab-category": "Kategoriye",
        "mainpage-nstab": "Pera seri",
        "nosuchaction": "Fealiyeto wınasi çıniyo",
        "nosuchactiontext": "URL ra kar qebul nêbı.\nŞıma belka URL şaş nuşt, ya zi gıreyi şaş ra ameyi.\nKeyepelê {{SITENAME}} eşkeno xeta aşkera bıkero.",
        "badarticleerror": "Kar  ke şıma kenê, qebul nêbi.",
        "cannotdelete": "Pel  \"$1\" o ke şıma nişane kerd hewn a neşı.\nBelka yewna ten kerdo hewn a.",
        "cannotdelete-title": "Şıma nêşenê pela \"$1\" besterê",
-       "delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
+       "delete-hook-aborted": "Esterıtışi terefê çengeli ra nêtexeliya.\nQet tesrih beyan nêbi.",
        "no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
        "badtitle": "Sernameyo xırabın",
        "badtitletext": "Sernameyê pela ke şıma waşt, nêvêrd, vengo ya zi zıwano miyanêno ğelet gırêdaye ya zi sernameyê wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernameyan de nêxebetiyenê.",
        "virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
        "virus-unknownscanner": "antiviruso ke nêzanyeno:",
        "logouttext": "'''Henda şıma hesab ra veciyay.'''\n\nDiqat kerê ke tayê perri şenê hewna zey şıma kewtê ra cı bıasê, heta şıma ver-virê şanekerê (browserê) xo besterê.",
+       "logging-out-notify": "Şımayê cı ra veciyê, kerem kerê bıpawên.",
        "logout-failed": "Enewke ronıştışo nêracneyêno:$1",
        "cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
        "cannotlogoutnow-text": "Gurenayışê $1i de veciyayış mımkın niyo.",
        "createacct-another-email-ph": "Adresa e-posta de fi",
        "createaccountmail": "Yew parolaya rastameyiya ravêrdiye bıgurene û parola ena adresa e-postey rê bırışe",
        "createacct-realname": "Nameyo raştıkên (mecburi niyo)",
-       "createacct-reason": "Sebeb",
+       "createacct-reason": "Sebeb (eşkera kewto cı)",
        "createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
        "createacct-reason-help": "Roceka hesabvıraştışi de mesaco asaye",
        "createacct-submit": "Hesabê xo vıraze",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
-       "botpasswords-label-cancel": "İbtal",
-       "botpasswords-label-delete": "Bestern",
+       "botpasswords-label-cancel": "Bıtexelne",
+       "botpasswords-label-delete": "Bestere",
        "botpasswords-label-resetpassword": "Parola raçarne",
        "botpasswords-label-grants": "İmtıyazê ravêrdeyi:",
        "botpasswords-label-grants-column": "Dayen",
        "resetpass_forbidden-reason": "Parola nêvuriyena: $1",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
-       "resetpass-submit-cancel": "İbtal",
+       "resetpass-submit-cancel": "Bıtexelne",
        "resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
        "resetpass-recycled": "Parolaya şımaya newiye, wa paroloya şımaya verêne ra ciya bo.",
        "resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo.  Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
        "resettokens-watchlist-token": "Web Feed rê nışan (Atom/RSS)ê [[Special:Watchlist|vêreno perranê lista şımawa seyrkerdışi]]",
        "resettokens-done": "Nışanan reset ke",
        "resettokens-resetbutton": "Nışananê weçıniteyan reset ke",
-       "bold_sample": "Metno qalın",
-       "bold_tip": "Metno qalın",
-       "italic_sample": "Metno çewt",
-       "italic_tip": "Metno çewt",
-       "link_sample": "Serekê gıri",
-       "link_tip": "Gırey Żerri",
-       "extlink_sample": "http://www.misal.com sernamey gırey",
-       "extlink_tip": "Gırey teberi (xo vira mekerên http:// prefix)",
-       "headline_sample": "metnê sernamey",
-       "headline_tip": "Sewiya 2ıne sername",
-       "nowiki_sample": "metnê formatkerdey berze etıya",
-       "nowiki_tip": "Goş formatê Wiki ra mekûwe",
-       "image_sample": "Nımune.jpg",
-       "image_tip": "Dosya tewrkerdiye",
-       "media_sample": "Nımune.ogg",
-       "media_tip": "Gırey dosye",
-       "sig_tip": "İmzay şıma be morê zemani",
-       "hr_tip": "Xeta verardiye (teserrufın bıgureyne/bıxebetne)",
        "summary": "Xulasa:",
        "subject": "Mewzu:",
        "minoredit": "No yew vırnayışo werdiyo",
        "rcfilters-watchlist-preference-label": "Mabeynrıyê non-JavaScript'i bıkarne",
        "rcfilters-filter-showlinkedfrom-label": "Gıreyê pelan ra vurnayışan bıvêne",
        "rcfilters-target-page-placeholder": "Yew nameyê pele (ya zi kategoriye) cı kerê",
+       "rcfilters-allcontents-label": "Zerrek pêro",
+       "rcfilters-alldiscussions-label": "Werênayışi pêro",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
        "rclistfromreset": "Weçinayışê tarixi ragoze",
        "rclistfrom": "$3 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
        "upload_directory_read_only": "Direktorê dosyayê ($1)î webserver de nieşkeno binuse.",
        "uploaderror": "Ğeletê bar kerdişî",
        "upload-recreate-warning": "'''Diqet: Yew dosya pê ena name wedariya ya zi vurniya.'''\n\nLogê wedariyayiş u berdişi seba ena pele a ti ra xezir kerda:",
-       "uploadtext": "Qey barkerdişê dosyayî, formê cêrinî bişuxulne.\nDosyayê ke vera cû bar biyê eke şima qayîl e ney dosyayan bivînê ya zî bigerî biewnê[[Special:FileList|listeyê dosyayê bar bîyaye]] (tekrar) bar bîyaye [[Special:Log/upload|rocaneyê barkerdişî]] de, hewn a şîyaye zî tîya de [[Special:Log/delete|rocaneyê hewn a kerdişî]] pawiyene.\n\nwexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişuxulne;\n* Qey xebitnayişê dosyayî: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></code>'''\n*Heto çep de zerreyê yew qutî de, qey xebitnayişi 'nuşteyê binîn' û 200 pikseli: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></code>'''\n* Dosya memocın, dosya te direk gırey bıerz: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></code>'''",
+       "uploadtext": "Seba '''dosya''' barkerdışi rê formê cerênê bıgurenê. Veri ra dosyeyê barbiyayeyan vênayış  u cıgeyrayışi rê bıewni rê [[Special:FileList|lista dosyeyan]], seba (fına) barbiyayeyan rê [[Special:Log/upload|rocekê barkerdışi]] u, esterıtan zi pela [[Special:Log/delete|rocekê esterıtışi]] de tepışiyeno.\n\nYew pele rê dosyacıkerdışi rê formanê cêrênan ra yewi bıgurenê;\n* Versiyonê gurenayışê dosyeyanê pêroyiyan rê: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></code>'''\n* Kışta çepê yew doreki miyan de, vêniyayo cı de  'metinê bıni' ra, 200 piksel ebadê dosyagurenayışi rê : '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></code>'''\n* Dosyaya nêmusnayışi ra, dosya rê direkt gıredayışi rê : '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></code>'''",
        "upload-permitted": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê vêrdeyan: $1.",
        "upload-preferred": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê tercihbiyayeyan: $1.",
        "upload-prohibited": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê tometebiyayeyan: $1.",
        "checkbox-all": "Pêro",
        "checkbox-none": "Çıniyo",
        "checkbox-invert": "Dimlaşt ke",
-       "allpages": "Pêro peli",
+       "allpages": "Peli pêro",
        "nextpage": "Pela bahdoyêne ($1)",
        "prevpage": "Pela veri ($1)",
        "allpagesfrom": "Herfa kı pa liste bo:",
        "sessionfailure": "cıkewtışê hesabê şıma de yew problem aseno;\nno kar semedê dızdiyê hesabi ibtal biyo.\nkerem kerê \"tepiya\" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.",
        "changecontentmodel": "Modelê zerrekê pele bıvurne",
        "changecontentmodel-legend": "Modelê zerreki bıvurne",
-       "changecontentmodel-title-label": "Sernameyê pele",
+       "changecontentmodel-title-label": "Sernameyê pele:",
        "changecontentmodel-current-label": "Mewcud zerrekê modeli:",
-       "changecontentmodel-model-label": "Modelê zerrekiyo newe",
+       "changecontentmodel-model-label": "Modelê zerrekiyo newe:",
        "changecontentmodel-reason-label": "Sebeb:",
        "changecontentmodel-submit": "Bıvırne",
        "changecontentmodel-success-title": "Modelê zerreki vurriya",
        "protect-othertime-op": "wexto bin",
        "protect-existing-expiry": "wextê qediyayişi yê mewcudi: $3, $2",
        "protect-existing-expiry-infinity": "Mewcud drmê qedyayışi:Bewext",
-       "protect-otherreason": "sebebo bin/sebebê ilaveyi",
+       "protect-otherreason": "Sebebo bin/ilaweyın:",
        "protect-otherreason-op": "Sebebo bin",
        "protect-dropdown": "*sebebê pawıtışi ye pêroyiye\n** vandalizmo hed ra vecaye\n** spamo hed ra vecaye\n** şêrê/herbê vurnayişi\n** pel o ke zaf wayirê trafiki yo",
        "protect-edit-reasonlist": "sebebê pawıtışi bıvurn",
        "maximum-size": "Ebatê maximumî",
        "pagesize": "(bitî)",
        "restriction-edit": "Bıvurne",
-       "restriction-move": "Bıkırış",
+       "restriction-move": "Bıkırışe",
        "restriction-create": "Vıraze",
        "restriction-upload": "Bar ke",
        "restriction-level-sysop": "tam pawiyayo",
        "undelete-search-title": "Bıgeyre pelanê eserıtiyan",
        "undelete-search-box": "bıgêr pelê hewn a biyayeyani",
        "undelete-search-prefix": "pel ê ke pê ney destpêkenî, ramocın",
+       "undelete-search-full": "Zerrekê sernameyanê pele bımocne:",
        "undelete-search-submit": "Cı geyre",
        "undelete-no-results": "Zerre arşîvê esterayîşî de peleyan match nibiyê.",
        "undelete-filename-mismatch": "Vurnayîşê ke pê wextê puli ye $1î nieşkenî biyare: nameyê dosyayî match nibeno",
        "sp-contributions-deleted": "iştırakê {{GENDER:$1|karberi}} esterdi",
        "sp-contributions-uploads": "Barkerdışi",
        "sp-contributions-logs": "qeydi",
-       "sp-contributions-talk": "vaten",
+       "sp-contributions-talk": "werênayış",
        "sp-contributions-userrights": "idareyê heqanê {{GENDER:$1|karberan}}",
        "sp-contributions-blocked-notice": "Eno karber/ena karbere emanet blokekerdeyo/blokekerdiya.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
-       "sp-contributions-search": "Dekerdena cı geyrê",
+       "sp-contributions-search": "İştırakan cı geyrê",
        "sp-contributions-username": "Adresa IPy ya zi nameyê karberi:",
        "sp-contributions-toponly": "Tenya tewr çım ra viyarnayışanê peyniyan bımocne",
        "sp-contributions-newonly": "Tenya vurnayışanê pelevıraştışi bımocne",
        "sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Gırey na perer",
+       "whatlinkshere": "Çı tiyayi rê gıre beno",
        "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Pera <strong>$2</strong> rê gıre dayen perri",
        "ipb-confirm": "Bloke kerdışi tesdik ke",
        "ipb-sitewide": "Site hemi de",
        "ipb-partial": "Qısmi",
+       "ipb-partial-help": "Peli ya zi nameyê cayanê spesifikan.",
        "ipb-pages-label": "Peli",
        "ipb-namespaces-label": "Heruna nameyan",
        "badipaddress": "Adresê IPî raşt niyo",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
        "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i",
        "ipb-blocklist-duration-left": "$1 vet",
+       "block-actions": "Hereketê kıliti:",
        "block-expiry": "Qedyayış:",
+       "block-options": "Weçinıtışê vêşi:",
        "block-prevent-edit": "Vurnayış",
        "block-reason": "Sebeb:",
        "block-target": "Nameyê karberi ya zi adresa eposteyi",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "unblocked-range": "Blokey $1'i wederya",
        "unblocked-id": "Blokê $1î wedariyayo",
+       "unblocked-ip": "Kılitê [[Special:Contributions/$1|$1]] dariyo we.",
        "blocklist": "Karberê kılitbiyayey",
        "autoblocklist": "Blokeyê otomatiki",
        "autoblocklist-submit": "Cı geyre",
        "autoblocklist-legend": "Lista blokanê otomatikan",
        "autoblocklist-localblocks": "{{PLURAL:$1|otoblokoyo lokal|otoblokeyê lokali}}",
+       "autoblocklist-total-autoblocks": "Amarê kılitkerdışê xoseri pêro piya: $1",
        "autoblocklist-otherblocks": "{{PLURAL:$1|otobloqeyo bin|otobloqeyê bini}}",
        "ipblocklist": "Karberê kılitbiyayey",
        "ipblocklist-legend": "Karberê kılit biyayey bıvin",
        "lockfilenotwritable": "dosyaya qefılnayişê databaseyi ser ra çiyek nênusyena.",
        "databasenotlocked": "Database a nibiya.",
        "lockedbyandtime": "({{GENDER:$1|$1}} ra $2 tepya $3 biyo)",
-       "move-page": "$1 Bıkırış",
+       "move-page": "$1 Bıkırışe",
        "move-page-legend": "Pele bere",
        "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
        "movepagetext-noredirectfixer": " Gırwenayışê formê bınêni do namey perre newe vırazo, pêro vêrorê cı bıkırışo namey newe ser.\nMa namey kıhanêri keni perra serşıkıtışi ser nameyo newe.\nŞıma şenê perra serşıkıtışı zi berê namey raştıkên bıvırnên.\n\nEger şıma nêwazenê, ma şıma ra reca keni şıma [[Special:DoubleRedirects|açarnayışo (tadayışo) dılet]] ya zi [[Special:BrokenRedirects|açarnayışo (tadayışon) çewt]]i kontrol kerên.\nŞıma gani kontrol kerên eger linki şınê perranê raştan ser.\n\nTeme eger ser yew name de yew nuşte esto, sistemê wiki '''nêşeno''' nuştey şıma bıkırışo. Eger ser enê namey de yew perra venge esta, sistemê wiki şeno nuştey şıma bıkırışo.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İqaz!'''\nNo kırıştış şeno yew perra populere rê wışkên u nêpawiyay bo. Ma şıma ra reca kenime, kerdışê xo ra ver peyniyê cı bıvênên.",
        "javascripttest-qunit-intro": "Mediawiki.org dı [dokumanê $1] bıvinê.",
        "tooltip-pt-userpage": "Pela {{GENDER:|şımaya karberi}}",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
-       "tooltip-pt-mytalk": "Pera {{GENDER:|şıma}}ya vaten",
+       "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
        "tooltip-pt-anontalk": "'''Ena adresa IP ra vurnayışa sero qal bıqerê'''",
        "tooltip-pt-preferences": "Tercihê {{GENDER:|şıma}}",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "watchlistedit-clear-legend": "Lista serykerdışê pak kerê",
        "watchlistedit-clear-explain": "Listeya serykerdış da şıma dı sernamey pêro besteryay",
        "watchlistedit-clear-titles": "Sernamey:",
+       "watchlistedit-clear-done": "Lista seyrkerdişê şıma biya pak.",
        "watchlisttools-clear": "Lista serykerdışê xo pak kı",
        "watchlisttools-view": "Vurnayışanê elaqedaran bıvêne",
        "watchlisttools-edit": "Lista seyrkerdışi bıvêne û bıvurne",
        "permanentlink": "Gıreyo daimi",
        "permanentlink-revid": "Revizyonê IDyi",
        "permanentlink-submit": "Şo revizyoni",
+       "newsection": "Leteyo newe",
+       "newsection-page": "Etiketê pele",
+       "newsection-submit": "Şo be pele",
        "dberr-problems": "Mayê muxulêm! Ena sita dı newke xırabiya teknik esta.",
        "dberr-again": "Dı-rê deqiqeyi vınde û heni bar ke.",
        "dberr-info": "(Erzmelumati ra xızmetkari nêreseno: $1)",
index b9a48fc..6413455 100644 (file)
        "resettokens-watchlist-token": "Token za webkanal (Atom/RSS) [[Special:Watchlist|změnow na bokach w twójich woglědowankach]]",
        "resettokens-done": "Tokeny slědk stajone.",
        "resettokens-resetbutton": "Wubrane tokeny slědk stajiś",
-       "bold_sample": "Tucny tekst",
-       "bold_tip": "Tucny tekst",
-       "italic_sample": "Kursiwny tekst",
-       "italic_tip": "Kursiwny tekst",
-       "link_sample": "Tekst wótkaza",
-       "link_tip": "Interny wótkaz",
-       "extlink_sample": "http://www.example.com nadpismo wótkaza",
-       "extlink_tip": "Eksterny wótkaz (źiwaś na http://)",
-       "headline_sample": "Nadpismo",
-       "headline_tip": "Nadpismo rowniny 2",
-       "nowiki_sample": "Zapódaj how njeformatěrowany tekst",
-       "nowiki_tip": "Wiki-syntaksu ignorěrowaś",
-       "image_sample": "Pokazka.jpg",
-       "image_tip": "Zasajźona dataja",
-       "media_sample": "pokazka.ogg",
-       "media_tip": "Datajowy wótkaz",
-       "sig_tip": "Twója signatura z casowym kołkom",
-       "hr_tip": "Horicontalna linija (rědko wužywaś)",
        "summary": "Zespominanje:",
        "subject": "Tema/Nadpismo:",
        "minoredit": "Snadna změna",
index 9921c13..6d32636 100644 (file)
        "changeemail-newemail": "Porikatan surat-i it kawawagu:",
        "changeemail-none": "(ingaa)",
        "changeemail-submit": "Alanai surat-i",
-       "bold_sample": "Polombono tik",
-       "bold_tip": "Polombono tik",
-       "italic_sample": "Tik lingging",
-       "italic_tip": "Tik lingging",
-       "link_sample": "Noputan tuluhon",
-       "link_tip": "Noputan poinsuang",
-       "extlink_sample": "http://www.example.com tuluon do noput",
-       "extlink_tip": "Noputan poinlabus (soroho no do potitimpuun http://)",
-       "headline_sample": "Tik potuluhon",
-       "headline_tip": "Nuludan-tulu loting ko-2",
-       "nowiki_sample": "Posuango tik awu-nokoulud do hiti",
-       "nowiki_tip": "Pologoso ponguludan wiki",
-       "image_tip": "Potopilo pail",
-       "media_tip": "Toput do pail",
-       "sig_tip": "Tinonduktunturunu miampai sinokot-timpu",
-       "hr_tip": "Puralan pointibabar (inta-taan do mongoguno)",
        "summary": "Koinibaan:",
        "subject": "Ahal/tuluhon",
        "minoredit": "Iti nopo nga niditan tokoto",
index 9ea6ec5..a60c5ac 100644 (file)
@@ -37,7 +37,7 @@
        "tog-shownumberswatching": "निगरानी गरिरहेका प्रयोगकर्ताहरूको संख्या धेखाउन्या",
        "tog-oldsig": "तमरो अहिलको हस्ताक्षर:",
        "tog-fancysig": "मेरा दस्तखतलाई विकि पाठको रुपमी लिने (स्वत लिङ्क बिना)",
-       "tog-uselivepreview": "पà¥\8dरतà¥\8dयà¤\95à¥\8dष à¤ªà¥\88लà¥\8dलà¥\80à¤\95à¥\8bरà¥\81प à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97र",
+       "tog-uselivepreview": "पà¥\83षà¥\8dठ à¤ªà¥\81नरà¥\8dभरण à¤¨à¤\85रà¥\87à¤\87 à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न à¤§à¥\87à¤\95ाà¤\83",
        "tog-forceeditsummary": "खाली सम्पादन शीर्षक प्रविष्टि गरेपछा मलाई सोधन्या",
        "tog-watchlisthideown": "मेरा सम्पादनहरू निगनारी सूचीबठेई लुकाऊन्या",
        "tog-watchlisthidebots": "बोट सम्पादनहरू ध्यान सूचीबठेई लुकाउन्या",
@@ -53,6 +53,7 @@
        "tog-norollbackdiff": "पैलास्थितिमी फर्काएपछा भिन्नता हटाउन्या",
        "tog-useeditwarning": "सम्पादनहरू सङ्ग्रह नगरिएका अवस्थामी अर्को पानामी जान खोज्या चेतावनी धेखाउन्या",
        "tog-prefershttps": "प्रवेश गरन्ज्या जबलै सुरक्षित जडानको प्रयोग गर्न्या",
+       "tog-requireemail": "पासवर्ड पुनःचयन खिलाइ इमेल चायीन्छ",
        "underline-always": "जबलै",
        "underline-never": "कभैई नाई",
        "underline-default": "खोल और ब्राउजर निर्धारित",
        "index-category": "क्रमाङ्कित पानाहरू",
        "noindex-category": "अनुक्रमित नअरियाऽ पन्नाअन",
        "broken-file-category": "टुटेको फाइल लिङ्कहरूसितको पाना",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "बारेमी",
        "article": "सामाग्री पानो",
        "newwindow": "(नौलो विन्डोमी खुलन्छ)",
        "returnto": "$1 मी फर्क।",
        "tagline": "{{SITENAME}} बठेइ",
        "help": "मद्दत",
+       "help-mediawiki": "मिडियाविकि का बारेमी मद्दत",
        "search": "खोजी",
        "search-ignored-headings": " #<!-- leave this line exactly as it is --> <pre>\n# Headings that will be ignored by search.\n# Changes to this take effect as soon as the page with the heading is indexed.\n# You can force page reindexing by doing a null edit.\n# The syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment.\n#   * Every non-blank line is the exact title to ignore, case and everything.\nReferences\nExternal links\nSee also\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "खोज:",
        "redirectto": "पठाएको पाना:",
        "lastmodifiedat": "यै पन्नालाई छाड्डीबार $1मी $2 बजे सम्पादन गरियाऽ थ्यो।",
        "viewcount": "यो पाना हेरियाको थियो {{PLURAL:$1|एकपटक|$1 पटक}}",
-       "protectedpage": "सà¥\81रà¤\95à¥\8dषित à¤\97रà¥\8dयाà¤\95ा à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82",
+       "protectedpage": "सà¥\81रà¤\95à¥\8dषित à¤\97रियाà¤\95ा à¤ªà¤¨à¥\8dनाà¤\85न",
        "jumpto": "यैमी फट्टाक:",
        "jumptonavigation": "भ्रमण गरऽ",
        "jumptosearch": "खोजऽ",
        "view-pool-error": "माफ गर्या , अहिल सर्भरहरूमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरू यै पाना हेद्या प्रयास गरी रह्या छन्।\nकृपया यो पाना पुन: हेर्नु अगाडि थोक्कै पख ।\n\n$1",
        "generic-pool-error": "माफ गर्या , अहिल सर्भरहरूमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरू यै पाना हेद्या प्रयास गरी रह्या छन् ।\nकृपया यो पाना पुन: हेर्नु अगाडि थोक्कै पख ।",
-       "pool-timeout": "समय à¤¸à¤\95ियà¥\8b à¤¬à¤¨à¥\8dद à¤\97रà¥\8dनà¥\87 à¤ªà¥\8dरतà¥\80à¤\95à¥\8dषामी",
-       "pool-queuefull": "पà¥\8dरतà¥\80क्षा पङ्क्ति भरियो",
+       "pool-timeout": "बनà¥\8dद à¤\97दà¥\8dदाà¤\87 à¤¸à¤®à¤¯à¤¸à¥\80मा à¤¸à¤\95à¥\80नà¥\8dया à¤ªà¥\8dरतिà¤\95à¥\8dषा मी",
+       "pool-queuefull": "पà¥\8dरतिक्षा पङ्क्ति भरियो",
        "pool-errorunknown": "अज्ञात गल्ती",
        "pool-servererror": "पुल काउन्टर सेवा उपलब्ध नाइथिन् ($1)।",
        "poolcounter-usage-error": "प्रयोग गल्ती:$1",
        "versionrequired": "MediaWiki संस्करण $1 चाईन्या",
        "versionrequiredtext": "ये पाना प्रयोग गर्नका लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर  [[Special:Version|version page]]",
        "ok": "भयो",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": " \"$1\" बठे निकालियाऽ",
        "youhavenewmessages": "{{PLURAL:$3|तम सित छन}} $1 ($2)।",
        "youhavenewmessagesfromusers": "{{PLURAL:$3|अर्खा प्रयोगकर्ता|$3 प्रयोगकर्ताअन}} ($2) मी है {{PLURAL:$4|तम सित}} $1 छन।",
        "site-atom-feed": "$1 एटम फीड",
        "page-rss-feed": "\"$1\" आरएसएस फिड",
        "page-atom-feed": "\"$1\" एटम फिड",
+       "feed-rss": "आरएसएस",
        "red-link-title": "$1 (पन्ना उपलब्ध नाइँथिन)",
        "sort-descending": "अवरोहण क्रममी मिलाउन्या",
        "sort-ascending": "आरोहण क्रममी मिलाउन्या",
        "badarticleerror": "यो कार्य यै पनामी गर्न नाईंमिल्लो।",
        "cannotdelete": "\"$1\" पाना वा फाइल मेट्ट सकिएन।\nयो पैल्लीबठे मेटियाको हुनु पडन्छ।",
        "cannotdelete-title": "पाना  \"$1\" लाई मेट्टू सकिएन",
+       "delete-scheduled": "$1 पन्ना मेटौनाइ खिलाइ समय निर्धारित अरीरैछ।\nकृपया धीरज राखः।",
        "delete-hook-aborted": "हुकले सम्पादनकार्य बन्द गरिदियो ।\nकोइ कारण दिइएन ।",
        "no-null-revision": "$1 पाना लागि खालि पुनरावलोकन सिर्जना गर्न सकिएन",
        "badtitle": "गलत शीर्षक",
        "ns-specialprotected": "विशेष पृष्ठहरू सम्पादन अद्दु नाइँ सकिनो।",
        "titleprotected": "[[User:$1|$1]]द्वारा ये शीर्षक निर्माणहुनबठे जोगाइया छ।\nकारण <em>$2</em> हो ।",
        "filereadonlyerror": "\"$1\" फाइललाई परिवर्तन अद्दु नाइँ सकिनो क्याईकि फाइल भण्डार \"$2\" केवल पड्ड्या स्थिति (read-only mode)मी छ।\n\nयेलाई सुरक्षित अद्द्या प्रवन्धकले यो कारण दीराइछ: ''$3''।",
+       "invalidtitle": "अमान्य शीर्षक",
        "invalidtitle-knownnamespace": "\"$2\" नाउँबार रे \"$3\" पाठ भया: अमान्य शीर्षक",
        "invalidtitle-unknownnamespace": "अपछ्याणो नाउँबार अङ्क $1 रे पाठ \"$2\" भया: अमान्य शीर्षक",
        "exception-nologin": "प्रवेश (लग ईन) नगरिएको",
        "virus-scanfailed": "जँचाई असफल(कोड $1)",
        "virus-unknownscanner": "थानभया एन्टीभाइरस:",
        "logouttext": "<strong>तमी अहिल बाहिर निस्क्याका  छौ।</strong>\n\nयाद राख्या तमीले ब्राउजरको क्याच खालि नगर्यासम्म कुनै पानाहरूमी तमी अझैं प्रवेश गरिरख्याको धेकाउन सक्छ।",
+       "logging-out-notify": "तम लगआउट हुन्नाछः, पख्याः हाँ।",
+       "logout-failed": "अइल लगआउट नाइहोइसकियो: $1",
        "cannotlogoutnow-title": "अईल भाईर निकल्ल नाइँ पाईनो",
        "cannotlogoutnow-text": "भाईर निकल्ल असंभव छ जब प्रयोग $1",
        "welcomeuser": "$1स्वागत छ!",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordremindertitle": "{{SITENAME}}का लागि नयाँ अस्थायी पासवर्ड",
        "passwordremindertext": "कसैले (सायद तमी, IP ठेगाना $1 बाट), {{SITENAME}}($4) को लागि नौलो पासवर्ड अनुरोध गर्या छ । प्रयोगकर्ता \"$2\" को लागि नौलो अस्थायी पासवर्ड \"$3\"तयार पारिया छ । यदि यो तमरो इच्छामी भयाको भया अहिले तमीले लगइन गरीबर नौलो पासवर्ड छान्नु पड्ड्या हुन्छ ।\nतमरो अस्थायी पासवर्ड  {{PLURAL:$5|एक दिन|$5 दिनहरू पछि}} अमान्य हुन्याछ ।\n\nयदि कोही अरुले नै अनुरोध गर्याको हो भण्या , या तमीले आफ्नो पासवर्ड सम्झ्यौ भण्या, अथवा\nत्यैलाई परिवर्तन गर्न चाहन्नौ भण्या, तमीले यो सन्देसको वेवास्ता गद्दसक्द्याहौ र पुरानै पासवर्ड प्रयोग गरिरहन सक्द्याहौ ।",
+       "noemailcreate": "तम ले मान्य इमेल ठिगाना दिन आवश्यक छ।",
        "blocked-mailpassword": "तमरा IP ठेगानालाई सम्पादन गद्द बठे रोक लाइराइछ। दुरुपयोग रोक्दाइ, तमरा IP ठेगाना बठेइ प्रवेसशब्द पुनर्लाभ प्रक्रिया प्रयोग अद्द्या अनुमति आथिन।",
        "mailerror": " चिठी :$1 पठाउँदा गल्ती भयो",
        "noemailprefs": "निम्न सुविधाहरू राम्डरी काम गद्दको लागि तमरो रोजाईमी आफ्नो ई-मेल ठेगाना खुलाओ ।",
        "resettokens-token-label": "$1 (यैलको मूल्यः $2)",
        "resettokens-done": "टोकन पूर्वरुपमी फर्काइयो ।",
        "resettokens-resetbutton": "चयन गरिया टोकनहरूलाई पुनमिलाउनुहोस्",
-       "bold_sample": "गाढा अक्षर",
-       "bold_tip": "गाढा अक्षर",
-       "italic_sample": "इटालिक पाठ",
-       "italic_tip": "इटालिक पाठ",
-       "link_sample": "शीर्षक लिंङ्क",
-       "link_tip": "भित्रि लिङ्क",
-       "extlink_sample": "http://www.उदाहरण.com लिङ्क शीर्षक",
-       "extlink_tip": "भाईरको लिङ्क (समझ्या http:// prefix)",
-       "headline_sample": "शीर्षक अक्षर",
-       "headline_tip": "दोसरो स्तर शीर्षपंक्ति",
-       "nowiki_sample": "प्रारुप नभया पाठ याँ दिया",
-       "nowiki_tip": "विकि फरम्याटिङ्लाई वास्ता जनगरया",
-       "image_tip": "इम्बेडेड(जडान गरिया) चित्र",
-       "media_tip": "फाइल लिङ्क",
-       "sig_tip": "तमरो समयछाप सहितको दस्तखत",
-       "hr_tip": "क्षितिजिय रेखा (कम प्रयोग गर्नुहोस्)",
        "summary": "सारांश:",
        "subject": "विषय:",
        "minoredit": "यो नानो सम्पादन हो",
        "anoneditwarning": "<strong>चेतावनी:</strong> तमले प्रवेश अरेको नाइथिन । तमरो आइपि ठेगाना पाना सम्पादन इतिहासमि दर्ता गरिन्या छ र यो सब्बैले हेद्द सक्कान । यदि तमलाईँ <strong>[$1 लगईन]</strong> वा <strong>[$2 नयाँ खाता बनाउन्या] गर्याभण्या तमबठे गरियाको सम्पादन तमरो प्रयोगकर्तानाममि जोडिन्याछ ।",
        "missingsummary": "'''यादगर्या :''' तमीले सम्पादन सारांश दियाका छैनौ ।\nयदि तमीले \"$1\"  थिच्यौ भण्या , सारांश बिना नै सङ्ग्रहित गरिन्या छ ।",
        "selfredirect": "<strong>चेतावनी:</strong> तम यै पानालाई आफुमी पुनः निर्देशित गद्द लाग्याछौ ।\nहुनसक्छ तम अनुप्रेषितको लागि गलत लक्ष्य निर्दिष्ट गद्द लाग्याछौ, वा गलत पानाको सम्पादन गद्द लाग्याछौ ।\nतम पुनः एकपल्ट \"$1\" क्लिक गद्दाछौ, पुनः निर्देशित तसै लै बनाइन्याछ।",
-       "missingcommenttext": "à¤\95à¥\83पया à¤¤à¤²à¤¤à¤¿à¤° à¤\9fिपà¥\8dपणà¥\80 à¤°à¤¾à¤\96 ।",
+       "missingcommenttext": "à¤\95à¥\83पया à¤\9fिपà¥\8dपणà¥\80 à¤°à¤¾à¤\96à¤\83।",
        "missingcommentheader": "'''याद गर :''' तमले टिप्पणीमी विषय /शीर्ष पंक्ति  दियाका छैनौ ।\nतमले फेरि \"$1\"  थिच्यौ भण्या , तमरो सम्पादन यसै रुपमी संग्रहित हुन्याछ ।",
        "summary-preview": "सम्पादन सारांशोः पूर्वालोकन:",
        "subject-preview": "विषयोः पूर्वरुप:",
        "page_first": "पैल्लो",
        "page_last": "छाड्डीबारको",
        "histlegend": "अन्तर चयन:संशोधनहरूको तुलनाको लागि रेडियो बाकसमी क्लिक गरिबर इण्टर गर अथवा तल दियाको बटनमी थिच <br />\nलिजेंड: (चालू): '''({{int:cur}})''' = अवतरणको बीचमी अन्तर, '''({{int:last}})''' = पैल्लीका अवतरणको बीचमी अन्तर, '''{{int:minoreditletter}}''' = नानो परिवर्तन।",
-       "history-fieldset-title": "सà¤\82शà¥\8bधनà¤\85न à¤\96िलाà¤\87 à¤\96à¥\8bà¤\9cऽ",
+       "history-fieldset-title": "सà¤\82शà¥\8bधनà¤\85न à¤\9bानà¤\83",
        "history-show-deleted": "संशोधन मेटियाको मात्तरै",
        "histfirst": "सबहै पुरानो",
        "histlast": "नयाँ",
        "historysize": "({{PLURAL:$1|१ अक्षर|$1 अक्षरहरू}})",
-       "historyempty": "(खाली)",
+       "historyempty": "खालि",
        "history-feed-title": "पुनरावलोकन इतिहास",
        "history-feed-description": "विकीमा यो पानको पुनरावलोकन इतिहास",
        "history-feed-item-nocomment": "$1  $2मी",
        "rev-deleted-user": "(प्रयोगकर्ता नाम हटाइयो)",
        "rev-deleted-event": "(लग विवरण हटाइयो)",
        "rev-suppressed-text-unhide": "यै पानाको पुनरावलोकन '''दमन''' गरियाको छ ।\nविस्तृत जानकारी [{{fullurl:{{#Special:Log}}/delete|पानो={{FULLPAGENAMEE}}}} दमन लग] पाउन सकिन्छ ।\nयदि तम अगाडि बढ्ड चाहन्छौ भण्या पनि तमीले  [$1 यि संशोधनहरू हेद्द] पाउन्या हौ ।",
-       "rev-delundel": "दधà¥\87à¤\96ाà¤\89नà¥\87/लà¥\81à¤\95ाà¤\89नà¥\8dया",
+       "rev-delundel": "दà¥\83शà¥\8dयता à¤¬à¤¦à¥\87लà¤\83",
        "rev-showdeleted": "धेकाउन्या",
        "revisiondelete": "पुनरावलोकनअन मेट्याऽ/मेट्याऽ रद्द अद्द्या",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "prefs-editwatchlist-clear": "तमरो अवलोकनसूची मेटा",
        "prefs-watchlist-days": "ध्यान सूचीमी धेकाउने दिनहरू:",
        "prefs-watchlist-days-max": "बर्ती है बर्ती $1 {{PLURAL:$1|दिन|दिनअन}}",
-       "prefs-watchlist-edits": "à¤\89à¤\9aà¥\8dà¤\9aतम à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¸à¤\82à¤\96à¥\8dया à¤¬à¤¢à¤¾à¤\87à¤\8fà¤\95à¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मà¥\80  à¤§à¤\95ाà¤\89नà¤\95ा à¤²à¤¾à¤\97ि :",
+       "prefs-watchlist-edits": "à¤\85वलà¥\8bà¤\95नसà¥\82à¤\9aà¥\80 à¤®à¥\80 à¤§à¥\87à¤\95à¥\8cना à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\85न à¤\95à¥\8b à¤\89à¤\9aà¥\8dà¤\9aतम à¤¸à¤\82à¤\96à¥\8dया:",
        "prefs-watchlist-edits-max": "सबै है ज्यादा संख्या : १०००",
        "prefs-watchlist-token": "अवलोकन सूची टोकन:",
        "prefs-misc": "साधारण",
        "timezoneregion-europe": "युरोप",
        "timezoneregion-indian": "हिन्द महासागर",
        "timezoneregion-pacific": "प्राशान्त महासागर",
-       "allowemail": "à¤\94र à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताबठà¥\87 à¤ªà¥\8cनà¥\8dया à¤\88मà¥\87ल à¤¸à¤\95à¥\8dषम à¤\97र।",
+       "allowemail": "à¤\94र à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\85न à¤²à¤¾à¤\87 à¤®à¥\81à¤\87 à¤²à¤¾à¤\87 à¤\88मà¥\87ल à¤ªà¤ à¥\8cनà¥\87à¤\87 à¤\85नà¥\81मति à¤¦à¤¿à¤¯",
        "prefs-searchoptions": "खोज",
        "prefs-namespaces": "नामठौर:",
        "default": "पूर्वनिर्धारित",
        "prefs-files": "फाइलहरू",
        "prefs-custom-css": "अनुकुलित CSS",
        "prefs-custom-js": "अनुकुल जाभास्क्रिप्ट",
-       "prefs-common-config": "साà¤\9dा CSS/à¤\9cाभा à¤¸à¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤¸à¤¬à¥\88 à¤\95ि à¤²à¥\87à¤\96ा:",
+       "prefs-common-config": "सबà¥\88 à¤\96à¥\8bलà¤\85न à¤\96िलाà¤\87 à¤¸à¤¾à¤\9dा à¤¸à¥\80à¤\8fसà¤\8fस/à¤\9cà¥\87सन/à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f:",
        "prefs-reset-intro": "तम ये पृष्ठलाई आफनो अभिरुचीहरू साइट पूर्वावस्थामी फर्काउनत फर्काउन प्रयोग गद्दु सकन्छौ । तै पाछा ये लाई रद्द गद्दु सकन्छौ ।",
        "prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया:",
        "youremail": "ईमेल",
        "grouppage-bureaucrat": "{{ns:project}}:प्रशासकअन",
        "grouppage-suppress": "{{ns:project}}:लुकौन्या",
        "right-read": "पृष्ठहरू पढ",
-       "right-edit": "पà¥\83षà¥\8dठहरà¥\82 à¤¸à¤®à¥\8dपादन à¤\97र",
+       "right-edit": "पनà¥\8dनाà¤\85न à¤¸à¤®à¥\8dपादन à¤\97रà¤\83",
        "right-createpage": "पृष्ठ निर्माण गर(छलफल पृष्ठहरू बाहेक)",
        "right-createtalk": "छलफल पृष्ठ सृजना गर",
        "right-createaccount": "नयाँ प्रयोगकर्ता खाता सृजना गर।",
        "right-reupload-own": "आफैले अपलोड  गरया रई आया फाइल अधिलेखन गर्न्या",
        "right-reupload-shared": "साझा मिडिया भण्डारमी स्थानियरुपमी फाइलहरू अधिक्रमण गर्न्या",
        "right-upload_by_url": "URL बठे फाइल उर्ध्वभरण गर्ने",
-       "right-purge": "साà¤\87à¤\9fà¤\95à¥\8b à¤\95à¥\8dयाश( cache) à¤¨à¤¿à¤¶à¥\8dà¤\9aित à¤¨à¤\97रिà¤\95नà¥\88 à¤ªà¤°à¥\8dà¤\9c(Purge) à¤\97रà¥\8dनà¥\87",
+       "right-purge": "यà¥\87à¤\87 à¤ªà¤¨à¥\8dना à¤\95à¥\8b à¤¸à¤¾à¤\87à¤\9f à¤\95à¥\8dयाश(cache) à¤ªà¤°à¥\8dà¤\9c(Purge) à¤\97रà¤\83",
        "right-writeapi": "लेखन API प्रयोग गद्य्या",
        "right-delete": "पृष्ठहरू मेट्ने",
        "right-bigdelete": "लामो इतिहास भयाका पानाहरू मेट्ट्या",
        "right-userrights-interwiki": "अन्य विकिहरूमी प्रयोगकर्ताहरूको अधिकार सम्पादन गद्या",
        "right-override-export-depth": "गहिराइ ५ सम्म लिंक गरियाका पानाहरू सहित निर्यात गद्या",
        "right-sendemail": "अन्य प्रयोगकर्तानलाई इमेल पठाउन्या",
-       "grant-editmycssjs": "तमरो प्रयोगकर्ता CSS/JavaScript सम्पादन गरऽ",
-       "grant-editmyoptions": "तमरा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\85भिरà¥\81à¤\9aà¥\80à¤\87नलाà¤\88 à¤¸à¤®à¥\8dपादन à¤\97रऽ",
+       "grant-editmycssjs": "तमरो प्रयोगकर्ता CSS/JSON/JavaScript सम्पादन गरः",
+       "grant-editmyoptions": "तमरा à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\85भिरà¥\81à¤\9aिà¤\87न à¤°à¥\87 à¤\9cà¥\87सन(JSON) à¤®à¤¿à¤²à¤¾à¤¨ à¤¸à¤®à¥\8dपादन à¤\97रà¤\83",
        "grant-editmywatchlist": "तमरो अवलोकनसूची सम्पादन गर",
        "grant-editpage": "भैरया पृष्ठहरू सम्पादन गर",
        "grant-editprotected": "सुरक्षित पृष्ठ सम्पादन",
        "recentchanges-legend-heading": "<strong>आदर्श वाक्य:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नौला पानाको सूची]] यैलाई लै हेरिदिय)",
        "rcfilters-savedqueries-rename": "पुनर्नामकरण",
-       "rcfilters-savedqueries-remove": "हà¤\9fाऽ",
+       "rcfilters-savedqueries-remove": "मà¥\87à¤\9fà¤\83",
        "rcfilters-savedqueries-new-name-label": "नाउँ",
        "rcfilters-savedqueries-cancel-label": "रद्द",
        "rcfilters-filter-editsbyself-label": "तम हताँ अरियाऽ फेरबदेलाअन",
        "rcfilters-filter-editsbyother-label": "अउर हताँ अरियाऽ फेरबदेलाअन",
        "rcfilters-filter-editsbyother-description": "तमरा आफ्फुनाइ बाहेक अउर सप्पै फेरबदेलाअन।",
        "rcfilters-filtergroup-lastrevision": "छाड्डीबारोः संशोधन",
-       "rcfilters-filter-lastrevision-label": "à¤\9bाडà¥\8dडà¥\80बारà¥\8bà¤\83 संशोधन",
+       "rcfilters-filter-lastrevision-label": "सबहà¥\88 à¤¨à¥\8cलà¥\8b संशोधन",
        "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउन्या",
        "rcshowhideminor": "$1 सानतिनो सम्पादन",
        "rcshowhideminor-show": "धेकाइदिय",
        "filehist-comment": "टिप्पणी",
        "imagelinks": "फाइल उपयोग",
        "linkstoimage": "यै चित्रमी निम्न{{PLURAL:$1|पाना जोडिनान{{PLURAL:$1|}}|$1 पानाहरू जोडिनान्}}:",
-       "nolinkstoimage": "यà¥\8b à¤\9aितà¥\8dरसित à¤²à¤¿à¤\82à¤\95भयाà¤\95ि à¤\95à¥\8bà¤\87 à¤ªà¤¾à¤¨à¤¾ à¤¨à¤¾à¤\87थà¥\80",
+       "nolinkstoimage": "यà¥\87à¤\87 à¤«à¤¾à¤\87ल à¤ªà¥\8dरयà¥\8bà¤\97 à¤­à¤¯à¤¾à¤\83 à¤\95à¥\8bà¤\87 à¤²à¥\88 à¤ªà¤¨à¥\8dना à¤¨à¤¾à¤\87थिन।",
        "morelinkstoimage": "यै फाइलको [[Special:WhatLinksHere/$1|थप लिंकहरू]] हेर ।",
        "sharedupload-desc-here": "यो फाइल $1 बठे हो र और  परियोजनाहरू बठे पन प्रयोग गद्द सकिन्याछ । \nताखाइ यैको [$2 फ़ाइल विवरण पानो]मि रयाका विवरण तल्तिर दियाको छ।",
        "filepage-nofile": "येइ नाउँ को कोइ लै फाइल नाइथिन।",
        "tooltip-rollback": "\"पूर्वरुप\" ले यो पानाक्क सम्पादन(हरू) खारेज अरिबरे पानालाई एक क्लिकमि पाछाडीको सम्पादनमि पुगाइदिन्छ ।",
        "tooltip-undo": "\"रद्द\"ले पछिल्लो सम्पादन खारेज गरिबरे पूर्वावलोकनमा धेकाउछ ।\nयैले सारांशमा कारण राख्ख दिन्याछ।",
        "tooltip-summary": "नानो सारांश हालिदिय",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|प्रयोगकर्ता|प्रयोगकर्ताहरू}} $1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|प्रयोगकर्ता}}|प्रयोगकर्ताअन}} $1",
        "anonusers": "{{SITENAME}} का नाम नभयाका {{PLURAL:$2| प्रयोगकर्ता|प्रयोगकर्ताहरू}} $1",
        "simpleantispam-label": "ऐन्टी-स्प्याम जाँच।\nयैलाई <strong>नाइँ</strong> भद्य्या!",
        "pageinfo-title": "\"$1\" खिलाइ जानकारी",
        "imgmultipagenext": "अर्खो पन्ना →",
        "imgmultigo": "जाऽ!",
        "imgmultigoto": "$1 पन्ना मैं जाऽ",
-       "size-bytes": "$1 अक्षरहरू",
+       "size-bytes": "$1 {{PLURAL:$1|बाइट|बाइटअन}}",
        "size-kilobytes": "$1 किलोबाइट",
        "size-megabytes": "$1 मेगाबाइट",
        "size-gigabytes": "$1 गिगाबाइट",
index 71def46..dd511c2 100644 (file)
        "changeemail-throttled": "Ètee kpɔ be yeage ɖe eme hedo kpoe zi geɖe akpa le ɣeyiɣi kpui siawo me. Taflatsɛ lala $1 hafi nàgatee kpɔ.",
        "changeemail-nochange": "Taflatsɛ ŋlɔ email adrɛs yeye.",
        "resettokens-watchlist-token": "Ɖɔɖeɖɔdzi nukakala (Atom/RSS) ƒe mɔfiadzesi nyaŋui ƒe [[Special:Tɔtrɔkpɔƒe|tɔtrɔ siwo wowɔ le axa siwo le wò tɔtrɔkpɔƒe ŋu]]",
-       "bold_sample": "Nuŋɔŋlɔ toto",
-       "bold_tip": "Nuŋɔŋlɔ toto",
-       "italic_sample": "Nuŋɔŋlɔ biɖeŋgɔ",
-       "italic_tip": "Nuŋɔŋlɔ biɖeŋgɔ",
-       "sig_tip": "Wò asidenute kple gaƒoƒoa",
        "subject": "Tanya:",
        "minoredit": "Esia nye tɔtrɔ sue aɖe ko",
        "watchthis": "Kpɔ axa sia",
index 4cf6771..b6226b5 100644 (file)
        "resettokens-watchlist-token": "Token p'r al feed web (Atom/RSS) dal [[Special:Watchlist|mudéfichi al pàgini ch'ét tîn sòt' ôc]]",
        "resettokens-done": "Token turnê a impustêr.",
        "resettokens-resetbutton": "Més a zēro i token sernî",
-       "bold_sample": "Grasèt",
-       "bold_tip": "Grasèt",
-       "italic_sample": "Cursîv",
-       "italic_tip": "Cursîv",
-       "link_sample": "Tétol dal colegamèint",
-       "link_tip": "Colegamèint intêren",
-       "extlink_sample": "http://www.example.com tétol dal colegamèint",
-       "extlink_tip": "Colegamèin d'ed fōra (ricôrdet ed mèter préma http://)",
-       "headline_sample": "Intestasiòun",
-       "headline_tip": "Intestasiòun ed 2° livèl",
-       "nowiki_sample": "Mèt dèinter ché al tèst mìa furmatê",
-       "nowiki_tip": "An badêr mìa la furmatasiòun wiki",
-       "image_tip": "Mèt dèinter al file",
-       "media_tip": "Colegamèint al file",
-       "sig_tip": "Fîrma cun la dâta e l'ōra",
-       "hr_tip": "Rîga spiâna (drōva cun giudési)",
        "summary": "Ogèt:",
        "subject": "Argumèint:",
        "minoredit": "Còsta l'é 'na mudéfica céca",
index 18534a1..266fdb4 100644 (file)
        "resettokens-watchlist-token": "Κλειδί για την δικτυακή ροή (Atom/RSS) των [[Special:Watchlist|αλλαγών σε σελίδες στη λίστα παρακολούθησής σας]]",
        "resettokens-done": "Επαναφορά κλειδιών.",
        "resettokens-resetbutton": "Επαναφορά επιλεγμένων κλειδιών",
-       "bold_sample": "Έντονο κείμενο",
-       "bold_tip": "Έντονο κείμενο",
-       "italic_sample": "Πλάγιο κείμενο",
-       "italic_tip": "Κείμενο με πλάγιους χαρακτήρες",
-       "link_sample": "Τίτλος συνδέσμου",
-       "link_tip": "Εσωτερικός σύνδεσμος",
-       "extlink_sample": "http://www.example.com τίτλος συνδέσμου",
-       "extlink_tip": "Εξωτερικός σύνδεσμος (μην ξεχνάτε το πρόθεμα http://)",
-       "headline_sample": "Κείμενο επικεφαλίδας",
-       "headline_tip": "Επικεφαλίδα επιπέδου 2",
-       "nowiki_sample": "Εισαγωγή μη μορφοποιημένου κειμένου εδώ",
-       "nowiki_tip": "Να αγνοηθεί η μορφοποίηση wiki",
-       "image_sample": "paradeigma.jpg",
-       "image_tip": "Ενσωματωμένο αρχείο",
-       "media_sample": "paradeigma.ogg",
-       "media_tip": "Σύνδεσμος αρχείου",
-       "sig_tip": "Η υπογραφή σας με ώρα και ημερομηνία",
-       "hr_tip": "Οριζόντια γραμμή (να χρησιμοποιείται με φειδώ)",
        "summary": "Σύνοψη:",
        "subject": "Θέμα:",
        "minoredit": "Αυτή είναι μια μικροαλλαγή",
index b42423f..188383b 100644 (file)
        "passwordreset-username": "Username:",
        "changeemail-none": "(none)",
        "resettokens-tokens": "Tokens:",
-       "bold_sample": "Bold text",
-       "italic_sample": "Italic text",
        "savearticle": "Save page",
        "anonpreviewwarning": "<em>You are not logged in. Saving will record your IP address in this page's edit history.</em>",
        "blockedtext": "<strong>Your username or IP address has been blocked.</strong>\n\nThe block was made by $1.\nThe reason given is <em>$2</em>.\n\n* Start of block: $8\n* Expiration of block: $6\n* Intended blockee: $7\n\nYou can contact $1 or another [[{{MediaWiki:Grouppage-sysop}}|administrator]] to discuss the block.\nYou cannot use the \"{{int:emailuser}}\" feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.\nYour current IP address is $3, and the block ID is #$5.\nPlease include all above details in any queries you make.",
index f6ea46c..8092bf6 100644 (file)
@@ -47,6 +47,7 @@
        "tog-useeditwarning": "Warn me when I leave an edit page with unsaved changes",
        "tog-prefershttps": "Always use a secure connection while logged in",
        "tog-showrollbackconfirmation": "Show a confirmation prompt when clicking on a rollback link",
+       "tog-requireemail": "Require email for password resets",
        "underline-always": "Always",
        "underline-never": "Never",
        "underline-default": "Skin or browser default",
        "perfcached": "The following data is cached and may not be up to date. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "The following data is cached, and was last updated $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Updates for this page are currently disabled.\nData here will not presently be refreshed.",
+       "querypage-updates-periodical": "Updates for this page are run periodically.",
        "viewsource": "View source",
        "viewsource-title": "View source for $1",
        "actionthrottled": "Action throttled",
        "createaccountmail": "Use a temporary random password and send it to the specified email address",
        "createaccountmail-help": "Can be used to create account for another person without learning the password.",
        "createacct-realname": "Real name (optional)",
-       "createacct-reason": "Reason",
+       "createacct-reason": "Reason (publicly logged)",
        "createacct-reason-ph": "Why you are creating another account",
        "createacct-reason-help": "Message shown in the account creation log",
        "createacct-imgcaptcha-help": "",
        "resettokens-watchlist-token": "Token for the web feed (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
        "resettokens-done": "Tokens reset.",
        "resettokens-resetbutton": "Reset selected tokens",
-       "bold_sample": "Bold text",
-       "bold_tip": "Bold text",
-       "italic_sample": "Italic text",
-       "italic_tip": "Italic text",
-       "link_sample": "Link title",
-       "link_tip": "Internal link",
-       "extlink_sample": "http://www.example.com link title",
-       "extlink_tip": "External link (remember http:// prefix)",
-       "headline_sample": "Headline text",
-       "headline_tip": "Level 2 headline",
-       "nowiki_sample": "Insert non-formatted text here",
-       "nowiki_tip": "Ignore wiki formatting",
-       "image_sample": "Example.jpg",
-       "image_tip": "Embedded file",
-       "media_sample": "Example.ogg",
-       "media_tip": "File link",
        "sig-text": "--$1",
-       "sig_tip": "Your signature with timestamp",
-       "hr_tip": "Horizontal line (use sparingly)",
        "summary": "Summary:",
        "subject": "Subject:",
        "minoredit": "This is a minor edit",
        "prefs-help-email": "Email address is optional, but is needed for password resets, should you forget your password.",
        "prefs-help-email-others": "You can also choose to let others contact you by email through a link on your user or talk page.\nYour email address is not revealed when other users contact you.",
        "prefs-help-email-required": "Email address is required.",
+       "prefs-help-requireemail": "If checked, will only send password reset emails if the resetting person has provided both username and email for this account.",
        "prefs-info": "Basic information",
        "prefs-i18n": "Internationalisation",
        "prefs-signature": "Signature",
        "listfiles-userdoesnotexist": "User account \"$1\" is not registered.",
        "imgfile": "file",
        "listfiles": "File list",
+       "listfiles_subpage": "Uploads by $1",
        "listfiles_thumb": "Thumbnail",
        "listfiles_date": "Date",
        "listfiles_name": "Name",
        "ipblocklist-legend": "Find a blocked user",
        "blocklist-userblocks": "Hide account blocks",
        "blocklist-tempblocks": "Hide temporary blocks",
+       "blocklist-indefblocks": "Hide indefinite blocks",
        "blocklist-addressblocks": "Hide single IP blocks",
        "blocklist-type": "Type:",
        "blocklist-type-opt-all": "All",
        "mycustomjsredirectprotected": "You do not have permission to edit this JavaScript page because it is a redirect and it does not point inside your userspace.",
        "easydeflate-invaliddeflate": "Content provided is not properly deflated",
        "unprotected-js": "For security reasons JavaScript cannot be loaded from unprotected pages. Please only create javascript in the MediaWiki: namespace or as a User subpage",
-       "userlogout-continue": "Do you want to log out?"
+       "userlogout-continue": "Do you want to log out?",
+       "rest-prefix-mismatch": "The requested path ($1) was not inside the REST API root path ($2)",
+       "rest-wrong-method": "The request method ($1) was not {{PLURAL:$3|the allowed method for this path|one of the allowed methods for this path}} ($2)",
+       "rest-no-match": "The requested relative path ($1) did not match any known handler"
 }
index a472dc5..35223c3 100644 (file)
        "resettokens-watchlist-token": "Ĵetono por la retfluo (Atom/RSS) de [[Special:Watchlist|ŝanĝoj je paĝoj sur via atentaro]]",
        "resettokens-done": "Ĵetonoj restarigitaj.",
        "resettokens-resetbutton": "Restarigi elektitajn ĵetonojn",
-       "bold_sample": "Grasa teksto",
-       "bold_tip": "Grasa teksto",
-       "italic_sample": "Kursiva teksto",
-       "italic_tip": "Kursiva teksto",
-       "link_sample": "Titolo de la ligilo",
-       "link_tip": "Interna ligilo",
-       "extlink_sample": "http://www.example.com ligtitolo",
-       "extlink_tip": "Ekstera ligilo (ne forgesu la prefikson http://)",
-       "headline_sample": "Titola teksto",
-       "headline_tip": "Titololinio je dua nivelo",
-       "nowiki_sample": "Enigi ne formatitan tekston ĉi tie",
-       "nowiki_tip": "Ignori vikiformatadon",
-       "image_sample": "Ekzemplo.jpg",
-       "image_tip": "Enigita dosiero",
-       "media_sample": "Ekzemplo.ogg",
-       "media_tip": "Ligilo al dosiero",
-       "sig_tip": "Via subskribo kun tempindiko",
-       "hr_tip": "Horizontala linio (uzu ŝpareme)",
        "summary": "Resumo:",
        "subject": "Temo:",
        "minoredit": "Ĉi tiu ŝanĝo estas redakteto",
index 484a448..bdf7e75 100644 (file)
                        "Agusbou2015",
                        "Waldyrious",
                        "Johny Weissmuller Jr",
-                       "Dark Dragoon"
+                       "Dark Dragoon",
+                       "Elisardojm"
                ]
        },
        "tog-underline": "Subrayar enlaces:",
        "tog-useeditwarning": "Avisarme cuando abandone una página en edición con cambios sin guardar",
        "tog-prefershttps": "Utilizar siempre conexiones seguras en mis sesiones",
        "tog-showrollbackconfirmation": "Mostrar una pantalla de confirmación al hacer clic en un enlace de reversión",
+       "tog-requireemail": "Es necesario un correo electrónico para reinicializar las contraseña",
        "underline-always": "Siempre",
        "underline-never": "Nunca",
        "underline-default": "Configuración predeterminada de la apariencia o el navegador",
        "createaccountmail": "Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada",
        "createaccountmail-help": "Puede usarse para crear una cuenta para otra persona sin revelar la contraseña.",
        "createacct-realname": "Nombre real (opcional)",
-       "createacct-reason": "Motivo",
+       "createacct-reason": "Motivo (registrado públicamente)",
        "createacct-reason-ph": "Por qué estás creando otra cuenta",
        "createacct-reason-help": "Mensaje que se muestra en el registro de creación de cuentas",
        "createacct-submit": "Crea tu cuenta",
        "resettokens-watchlist-token": "Clave del canal (Atom/RSS) de [[Special:Watchlist|cambios en las páginas de tu lista de seguimiento]]",
        "resettokens-done": "Restablecimiento de claves.",
        "resettokens-resetbutton": "Restablecer las claves",
-       "bold_sample": "Texto en negrita",
-       "bold_tip": "Texto en negrita",
-       "italic_sample": "Texto en cursiva",
-       "italic_tip": "Texto en cursiva",
-       "link_sample": "Título del enlace",
-       "link_tip": "Enlace interno",
-       "extlink_sample": "http://www.ejemplo.com título del enlace",
-       "extlink_tip": "Enlace externo (recuerda añadir el prefijo http://)",
-       "headline_sample": "Texto de encabezado",
-       "headline_tip": "Título de 2.º nivel",
-       "nowiki_sample": "Insertar aquí texto sin formato",
-       "nowiki_tip": "Ignorar el formato wiki",
-       "image_sample": "Ejemplo.jpg",
-       "image_tip": "Archivo incrustado",
-       "media_sample": "Ejemplo.ogg",
-       "media_tip": "Enlace a archivo",
-       "sig_tip": "Tu firma con fecha y hora",
-       "hr_tip": "Línea horizontal (utilizar con moderación)",
        "summary": "Resumen:",
        "subject": "Asunto:",
        "minoredit": "Esta es una edición menor",
        "undo-norev": "No se ha podido deshacer la edición porque no existe o ha sido borrada.",
        "undo-nochange": "Parece que ya se había deshecho la edición.",
        "undo-summary": "Se ha deshecho la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]])",
+       "undo-summary-anon": "Deshacer la modificación $1 de [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Se ha deshecho la revisión $1 de un usuario oculto",
        "cantcreateaccount-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas desde esta dirección IP (<strong>$1</strong>).\n\nEl motivo dado por $3 es <em>$2</em>",
        "cantcreateaccount-range-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas de usuario desde direcciones IP en el rango <strong>$1</strong>, en el que se encuentra tu dirección IP (<strong>$4</strong>).\n\nEl motivo dado por $3 es <em>$2</em>",
        "search-interwiki-more": "(más)",
        "search-interwiki-more-results": "más resultados",
        "search-relatedarticle": "Relacionado",
+       "search-invalid-sort-order": "La ordenación $1 no está reconocida, se aplicará la ordenación por defecto. Las ordenaciones válidas sonː $2",
        "search-unknown-profile": "No se reconoce el perfil de búsqueda $1; se aplicará el perfil predeterminado.",
        "searchrelated": "relacionado",
        "searchall": "todos",
        "prefs-help-email": "La dirección de correo electrónico es opcional, pero es necesaria para el restablecimiento de tu contraseña, en caso de que la olvides.",
        "prefs-help-email-others": "También puedes permitir que otros usuarios contacten contigo por correo electrónico a través de un enlace en tu página de usuario o de discusión.\nTu dirección de correo no se muestra cuando otros usuarios se ponen en contacto contigo.",
        "prefs-help-email-required": "Es necesario proporcionar una dirección de correo electrónico.",
+       "prefs-help-requireemail": "Si está marcado, solo enviará correos electrónicos de restablecimiento de contraseña si la persona que hace el reinicio proporcionó un nombre de usuario y correo electrónico para esta cuenta.",
        "prefs-info": "Información básica",
        "prefs-i18n": "Internacionalización",
        "prefs-signature": "Firma",
        "action-editusercss": "editar archivos CSS de otros usuarios",
        "action-edituserjson": "editar archivos JSON de otros usuarios",
        "action-edituserjs": "editar archivos JavaScript de otros usuarios",
-       "action-editsitecss": "editar CSS global de la web",
+       "action-editsitecss": "editar CSS global del sitio",
        "action-editsitejson": "editar JSON global de la web",
-       "action-editsitejs": "editar JavaScript global de la web",
+       "action-editsitejs": "editar JavaScript global del sitio",
        "action-editmyusercss": "editar tus propios archivos CSS",
        "action-editmyuserjson": "editar tus propios archivos JSON",
        "action-editmyuserjs": "editar tus propios archivos JavaScript",
        "alreadyrolled": "No se puede revertir la última edición de [[:$1]] hecha por [[User:$2|$2]] ([[User talk:$2|discusión]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguien más ya ha editado o revertido esa página.\n\nLa última edición fue hecha por [[User:$3|$3]] ([[User talk:$3|discusión]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "El resumen de la edición fue: <em>$1</em>.",
        "revertpage": "Revertidos los cambios de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc.]]) a la última edición de [[User:$1|$1]]",
+       "revertpage-anon": "Revertidas las modificaciones de [[Special:Contributions/$2|$2]] a la última versión de [[User:$1|$1]]",
        "revertpage-nouser": "Revertidas las ediciones hechas por un usuario oculto a la última revisión hecha por {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Revertidas las ediciones de {{GENDER:$3|$1}};\nrecuperada la última versión de {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Error de sesión",
        "ipblocklist-legend": "Encontrar a un usuario bloqueado",
        "blocklist-userblocks": "Ocultar bloqueos de cuenta",
        "blocklist-tempblocks": "Ocultar bloqueos temporales",
+       "blocklist-indefblocks": "Ocultar los bloqueos indefinidos",
        "blocklist-addressblocks": "Ocultar bloqueos de una sola dirección IP",
        "blocklist-type": "Tipo:",
        "blocklist-type-opt-all": "Todo",
-       "blocklist-type-opt-sitewide": "En toda la web",
+       "blocklist-type-opt-sitewide": "En todo el sitio",
        "blocklist-type-opt-partial": "Parcial",
        "blocklist-rangeblocks": "Ocultar bloqueos por intervalo",
        "blocklist-timestamp": "Marca de tiempo",
index 93bf174..b2aa80c 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|Jälgimisloendis olevatel lehekülgedel tehtud muudatuste]] veebivoo (Atom/RSS) luba",
        "resettokens-done": "Load lähtestatud.",
        "resettokens-resetbutton": "Lähtesta valitud load",
-       "bold_sample": "Rasvane kiri",
-       "bold_tip": "Rasvane kiri",
-       "italic_sample": "Kaldkiri",
-       "italic_tip": "Kaldkiri",
-       "link_sample": "Lingitav pealkiri",
-       "link_tip": "Siselink",
-       "extlink_sample": "http://www.example.com Lingi nimi",
-       "extlink_tip": "Välislink (ära unusta eesliidet http://)",
-       "headline_sample": "Pealkiri",
-       "headline_tip": "2. taseme pealkiri",
-       "nowiki_sample": "Sisesta vormindamata tekst",
-       "nowiki_tip": "Ignoreeri vikivormindust",
-       "image_sample": "Näidis.jpg",
-       "image_tip": "Manusfail",
-       "media_sample": "Näidis.ogg",
-       "media_tip": "Link failile",
-       "sig_tip": "Sinu allkiri ajatempliga",
-       "hr_tip": "Rõhtkriips (kasuta liialdamata)",
        "summary": "Resümee:",
        "subject": "Teema:",
        "minoredit": "See on pisiparandus",
index 305043e..bd3f140 100644 (file)
        "resettokens-watchlist-token": "(Atom/RSS) jarioarentzako tokenak [[Special:Watchlist|jarraitzen dituzun orrialdeen aldaketetarako]]",
        "resettokens-done": "Tokenak berrezarrita.",
        "resettokens-resetbutton": "Hautatutako tokenak berrezarri",
-       "bold_sample": "Letra lodiko testua",
-       "bold_tip": "Letra lodiko testua",
-       "italic_sample": "Testu etzana",
-       "italic_tip": "Testu etzana",
-       "link_sample": "Loturaren izenburua",
-       "link_tip": "Barne lotura",
-       "extlink_sample": "http://www.example.com loturaren izenburua",
-       "extlink_tip": "Kanpo lotura (gogoratu http:// aurrizkia)",
-       "headline_sample": "Goiburuko testua",
-       "headline_tip": "2. mailako goiburukoa",
-       "nowiki_sample": "Formatu gabeko testua hemen idatzi",
-       "nowiki_tip": "Ez egin jaramonik wiki formatuari",
-       "image_sample": "Adibidea.jpg",
-       "image_tip": "Txertatutako irudia",
-       "media_sample": "Adibidea.ogg",
-       "media_tip": "Media fitxategi lotura",
-       "sig_tip": "Zure sinadura, gehi data eta ordua",
-       "hr_tip": "Lerro horizontala (gutxitan erabili)",
        "summary": "Laburpena:",
        "subject": "Gaia:",
        "minoredit": "Aldaketa hau txikia da",
index d554442..fca6f19 100644 (file)
@@ -7,7 +7,8 @@
                        "Naudefj",
                        "SPQRobin",
                        "Shirayuki",
-                       "Spacebirdy"
+                       "Spacebirdy",
+                       "Servien"
                ]
        },
        "exif-imagewidth": "Breedte",
        "exif-gpsstatus-v": "Meetinteroperabiliteit",
        "exif-gpsmeasuremode-2": "2-dimensionele meting",
        "exif-gpsmeasuremode-3": "3-dimensionele meting",
-       "exif-gpsspeed-k": "Kilometer per huur",
+       "exif-gpsspeed-k": "Kilometer per uur",
        "exif-gpsspeed-m": "Myl per huur",
        "exif-gpsspeed-n": "Knope",
        "exif-gpsdestdistance-k": "Kilometers",
index 8bb3f07..af20011 100644 (file)
        "exif-scenetype-1": "Přímo fotografováno",
        "exif-customrendered-0": "Běžné zpracování",
        "exif-customrendered-1": "Uživatelské zpracování",
+       "exif-customrendered-2": "HDR (bez uložení originálu)",
+       "exif-customrendered-3": "HDR (originál uložen)",
+       "exif-customrendered-4": "Originál (pro HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Portrétní HDR",
+       "exif-customrendered-8": "Portrét",
        "exif-exposuremode-0": "Automatická expozice",
        "exif-exposuremode-1": "Ruční expozice",
        "exif-exposuremode-2": "Bracketing",
index 76bd5e0..3326a75 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "C.R.",
                        "E. abu Filumena",
-                       "SabineCretella"
+                       "SabineCretella",
+                       "Sannita"
                ]
        },
        "exif-imagewidth": "Larghezza",
        "exif-imagedescription": "Titulo 'e l'immaggene",
        "exif-make": "Frabbeca ca muntaje 'a camera",
        "exif-model": "Mudello d' 'a camera",
-       "exif-software": "Software ausàto",
+       "exif-software": "Software ausato",
        "exif-artist": "Autore",
        "exif-copyright": "Titolare d' 'o Copyright",
-       "exif-exifversion": "Verzione d'Exif",
+       "exif-exifversion": "Verzione 'e ll'exif",
        "exif-flashpixversion": "Verziona Flashpix suppurtata",
        "exif-colorspace": "Spazio d' 'e culore",
        "exif-componentsconfiguration": "Significato d'ogne componente",
index d2c74f5..ae53416 100644 (file)
        "exif-scenetype-1": "Direktefotografert bilde",
        "exif-customrendered-0": "Normal prosess",
        "exif-customrendered-1": "Tilpasset prosess",
+       "exif-customrendered-2": "HDR (ingen original lagret)",
+       "exif-customrendered-3": "HDR (original lagret)",
+       "exif-customrendered-4": "Original (for HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Portrett-HDR",
+       "exif-customrendered-8": "Portrett",
        "exif-exposuremode-0": "Automatisk eksponering",
        "exif-exposuremode-1": "Manuell eksponering",
        "exif-exposuremode-2": "Automatisk alternativeksponering",
index 3eea40f..57fac84 100644 (file)
                        "Servien"
                ]
        },
-       "exif-imagewidth": "Wiedte",
-       "exif-imagelength": "Heugte",
+       "exif-imagewidth": "Wydde",
+       "exif-imagelength": "Höygde",
        "exif-bitspersample": "Bits per komponent",
-       "exif-compression": "Kompressiemethode",
-       "exif-photometricinterpretation": "Beeldpuntsamenstelling",
-       "exif-orientation": "Oriëntasie",
-       "exif-samplesperpixel": "Antal compenenten",
-       "exif-planarconfiguration": "Gegevensstructuur",
+       "exif-compression": "Kompressymetode",
+       "exif-photometricinterpretation": "Bealdpuntsamenstelling",
+       "exif-orientation": "Orientaty",
+       "exif-samplesperpixel": "Antal kompenenten",
+       "exif-planarconfiguration": "Gegeavensstruktuur",
        "exif-ycbcrsubsampling": "Subsamplingsverhouwige van Y tot C",
-       "exif-ycbcrpositioning": "Y- en C-posisionering",
-       "exif-xresolution": "Horizontale resolusie",
-       "exif-yresolution": "Verticale resolusie",
-       "exif-stripoffsets": "Lokasie aofbeeldingsgegevens",
-       "exif-rowsperstrip": "Riejen per strip",
-       "exif-stripbytecounts": "Bytes per ekomprimeerden strip",
-       "exif-jpeginterchangeformat": "Aofstaand tot JPEG SOI",
-       "exif-jpeginterchangeformatlength": "Bytes van JPEG-gegevens",
+       "exif-ycbcrpositioning": "Y- en C-positionering",
+       "exif-xresolution": "Horizontale resoluty",
+       "exif-yresolution": "Vertikale resoluty",
+       "exif-stripoffsets": "Lokaty afbealdingsgegeavens",
+       "exif-rowsperstrip": "Rygen per strip",
+       "exif-stripbytecounts": "Bytes per komprimeerde strip",
+       "exif-jpeginterchangeformat": "Afstand tot JPEG SOI",
+       "exif-jpeginterchangeformatlength": "Bytes van JPEG-gegeavens",
        "exif-whitepoint": "Witpuntchromaticiteit",
-       "exif-primarychromaticities": "Chromasiteit van primaere kleuren",
-       "exif-ycbcrcoefficients": "Transformasiematrixkoëfficiënten veur de kleurruumte",
-       "exif-referenceblackwhite": "Referensieweerden veur zwart/wit",
-       "exif-datetime": "Tiedstip van digitalisasie",
-       "exif-imagedescription": "Aofbeeldingnaam",
+       "exif-primarychromaticities": "Chromaciteit van primäre klören",
+       "exif-ycbcrcoefficients": "Transformatymatrixkoefficienten vöär de klöörruumde",
+       "exif-referenceblackwhite": "Referensywaerden vöär swart/wit",
+       "exif-datetime": "Tydstip van digitalisaty",
+       "exif-imagedescription": "Afbealdingname",
        "exif-make": "Kameramark",
        "exif-model": "Kameramodel",
-       "exif-software": "Programmatuur die gebruukt wörden",
-       "exif-artist": "Eschreven deur",
-       "exif-copyright": "Auteursrechtenhouwer",
-       "exif-exifversion": "Exif-versie",
-       "exif-flashpixversion": "Ondersteunden Flashpix-versie",
-       "exif-colorspace": "Kleurruumte",
-       "exif-componentsconfiguration": "Betekenisse van elk compenent",
-       "exif-compressedbitsperpixel": "Beeldkompressiemethode",
-       "exif-pixelxdimension": "Aofbeeldingsbreedte",
-       "exif-pixelydimension": "Aofbeeldingsheugte",
-       "exif-usercomment": "Opmarkingen",
-       "exif-relatedsoundfile": "Biebeheurend geluudsbestaand",
-       "exif-datetimeoriginal": "Tiedstip van datagenerasie",
-       "exif-datetimedigitized": "Tiedstip van digitalisasie",
-       "exif-subsectime": "Subseconden tiedstip bestaandswieziging",
-       "exif-subsectimeoriginal": "Subseconden tiedstip datagenerasie",
-       "exif-subsectimedigitized": "Subseconden tiedstip digitalisasie",
-       "exif-exposuretime": "Belochtingstied",
+       "exif-software": "Programmatuur dee gebruked wördt",
+       "exif-artist": "Autöör",
+       "exif-copyright": "Autöörsrechtenholder",
+       "exif-exifversion": "Exif-versy",
+       "exif-flashpixversion": "Understöände Flashpix-versy",
+       "exif-colorspace": "Klöörruumde",
+       "exif-componentsconfiguration": "Beteykenisse van elk kompenent",
+       "exif-compressedbitsperpixel": "Bealdkompressymetode",
+       "exif-pixelxdimension": "Afbealdingsbreydde",
+       "exif-pixelydimension": "Afbealdingshöygde",
+       "exif-usercomment": "Upmarkingen",
+       "exif-relatedsoundfile": "Bybehöyrend gelüüdsbestand",
+       "exif-datetimeoriginal": "Tydstip van datageneraty",
+       "exif-datetimedigitized": "Tydstip van digitalisaty",
+       "exif-subsectime": "Subsekonden tydstip bestandswysiging",
+       "exif-subsectimeoriginal": "Subsekonden tydstip datageneraty",
+       "exif-subsectimedigitized": "Subsekonden tydstip digitalisaty",
+       "exif-exposuretime": "Belichtingstyd",
        "exif-exposuretime-format": "$1 sek ($2)",
        "exif-fnumber": "F-getal",
-       "exif-exposureprogram": "Belochtingsprogramma",
-       "exif-spectralsensitivity": "Spektrale geveuligheid",
-       "exif-isospeedratings": "ISO-weerde.",
+       "exif-exposureprogram": "Belichtingsprogramma",
+       "exif-spectralsensitivity": "Spektrale gevöligheid",
+       "exif-isospeedratings": "ISO-waerde",
        "exif-shutterspeedvalue": "Slutersnelheid in APEX",
        "exif-aperturevalue": "Diafragma in APEX",
        "exif-brightnessvalue": "Helderheid in APEX",
-       "exif-exposurebiasvalue": "Belochtingscompensasie",
-       "exif-maxaperturevalue": "Maximale diafragmaweerde van de lenze",
-       "exif-subjectdistance": "Aofstaand tot onderwarp",
-       "exif-meteringmode": "Methode lochmeting",
-       "exif-lightsource": "Lochbron",
+       "exif-exposurebiasvalue": "Belichtingskompensaty",
+       "exif-maxaperturevalue": "Maksimale diafragma-oapening",
+       "exif-subjectdistance": "Afstand tot underwarp",
+       "exif-meteringmode": "Metode lichtmeating",
+       "exif-lightsource": "Lichtbron",
        "exif-flash": "Flitser",
-       "exif-focallength": "Braandpuntofstand",
-       "exif-subjectarea": "Objektruumte",
-       "exif-flashenergy": "Flitserstarkte",
-       "exif-focalplanexresolution": "X-resolusie van CDD",
-       "exif-focalplaneyresolution": "Y-resolusie van CCD",
-       "exif-focalplaneresolutionunit": "Eenheid CCD-resolusie",
-       "exif-subjectlocation": "Objeklokasie",
-       "exif-exposureindex": "Belochtingsindex",
-       "exif-sensingmethod": "Meetmethode",
-       "exif-filesource": "Bestaandsnaam op de hardeschieve",
-       "exif-scenetype": "Scènetype",
-       "exif-customrendered": "An-epassen beeldbewarking",
-       "exif-exposuremode": "Belochtingsinstelling",
+       "exif-focallength": "Brandpuntafstand",
+       "exif-subjectarea": "Objektruumde",
+       "exif-flashenergy": "Flitserstarkde",
+       "exif-focalplanexresolution": "Sensorresoluty horizontaal",
+       "exif-focalplaneyresolution": "Sensorresoluty vertikaal",
+       "exif-focalplaneresolutionunit": "Eynheid CCD-resoluty",
+       "exif-subjectlocation": "Objektlokaty",
+       "exif-exposureindex": "Belichtingsindeks",
+       "exif-sensingmethod": "Meatmetode",
+       "exif-filesource": "Bestandsbron",
+       "exif-scenetype": "Scenetype",
+       "exif-customrendered": "Anpasde bealdverwarking",
+       "exif-exposuremode": "Belichtingsinstelling",
        "exif-whitebalance": "Witbalans",
-       "exif-digitalzoomratio": "Digitale zoomfactor",
-       "exif-focallengthin35mmfilm": "Braandpuntaofstaand (35mm-equivalent)",
-       "exif-scenecapturetype": "Soort opname",
-       "exif-gaincontrol": "Piekbeheersing",
+       "exif-digitalzoomratio": "Digitale zoomfaktor",
+       "exif-focallengthin35mmfilm": "Brandpuntafstand (35mm-ekwivalent)",
+       "exif-scenecapturetype": "Soort upnåme",
+       "exif-gaincontrol": "Pykbeheyrsing",
        "exif-contrast": "Kontrast",
-       "exif-saturation": "Verzaojiging",
-       "exif-sharpness": "Scharpte",
-       "exif-devicesettingdescription": "Umschrieving apperaotinstellingen",
-       "exif-subjectdistancerange": "Aofstaandskategorie",
-       "exif-imageuniqueid": "Unieke ID-aofbeelding",
-       "exif-gpsversionid": "GPS-versienummer",
-       "exif-gpslatituderef": "Noorder- of zujerbreedte",
-       "exif-gpslatitude": "Breedte",
-       "exif-gpslongituderef": "Ooster- of westerlengte",
-       "exif-gpslongitude": "Lengtegraod",
-       "exif-gpsaltituderef": "Heugtereferensie",
-       "exif-gpsaltitude": "Heugte",
-       "exif-gpstimestamp": "GPS-tied (atoomklokke)",
-       "exif-gpssatellites": "Satellieten die gebruuk bin veur de meting",
-       "exif-gpsstatus": "Ontvangerstaotus",
-       "exif-gpsmeasuremode": "Meetmodus",
-       "exif-gpsdop": "Meetpresisie",
-       "exif-gpsspeedref": "Snelheidseenheid",
-       "exif-gpsspeed": "Snelheid van GPS-ontvanger",
-       "exif-gpstrackref": "Referensie veur bewegingsrichting",
-       "exif-gpstrack": "Bewegingsrichting",
-       "exif-gpsimgdirectionref": "Referensie veur aofbeeldingsrichting",
-       "exif-gpsimgdirection": "Aofbeeldingsrichtige",
-       "exif-gpsmapdatum": "Geodetiese onderzeuksgegevens die gebruukt bin",
-       "exif-gpsdestlatituderef": "Referensie veur breedtegraod tot bestemming",
-       "exif-gpsdestlatitude": "Breedtegraod bestemming",
-       "exif-gpsdestlongituderef": "Referensie veur lengtegraod bestemming",
-       "exif-gpsdestlongitude": "Lengtegraod bestemming",
-       "exif-gpsdestbearingref": "Referensie veur richting naor bestemming",
-       "exif-gpsdestbearing": "Richting naor bestemming",
-       "exif-gpsdestdistanceref": "Referensie veur aofstaand tot bestemming",
-       "exif-gpsdestdistance": "Aofstaand tot bestemming",
-       "exif-gpsprocessingmethod": "Naam van de GPS-verwarkingsmethode",
-       "exif-gpsareainformation": "Naam van t GPS-gebied",
-       "exif-gpsdatestamp": "GPS-daotum",
-       "exif-gpsdifferential": "Differensiële GPS-korreksie",
-       "exif-jpegfilecomment": "Opmarking bie JPEG-bestaand",
+       "exif-saturation": "Versådiging",
+       "exif-sharpness": "Skarpde",
+       "exif-devicesettingdescription": "Ümskryving apparaatinstellingen",
+       "exif-subjectdistancerange": "Bereik objektafstand",
+       "exif-imageuniqueid": "Unike ID-afbealding",
+       "exif-gpsversionid": "GPS-versynummer",
+       "exif-gpslatituderef": "Noorder- of süderbreydde",
+       "exif-gpslatitude": "Breydde",
+       "exif-gpslongituderef": "Ouster- of westerlängde",
+       "exif-gpslongitude": "Längdegråd",
+       "exif-gpsaltituderef": "Höygdereferensy",
+       "exif-gpsaltitude": "Höygde",
+       "exif-gpstimestamp": "GPS-tyd (atoomklokke)",
+       "exif-gpssatellites": "Satelliten dee gebruked binnet vöär de meating",
+       "exif-gpsstatus": "Untvangerståtus",
+       "exif-gpsmeasuremode": "Meatmodus",
+       "exif-gpsdop": "Meatprecisy",
+       "exif-gpsspeedref": "Snelheid eynheid",
+       "exif-gpsspeed": "Snelheid van GPS-untvanger",
+       "exif-gpstrackref": "Referensy vöär beweagingsrichting",
+       "exif-gpstrack": "Beweagingsrichting",
+       "exif-gpsimgdirectionref": "Referensy vöär afbealdingsrichting",
+       "exif-gpsimgdirection": "Afbealdingsrichting",
+       "exif-gpsmapdatum": "Geodetiske undersööksgegeavens dee gebruked binnet",
+       "exif-gpsdestlatituderef": "Referensy vöär breyddegråd tot bestemming",
+       "exif-gpsdestlatitude": "Breyddegråd bestemming",
+       "exif-gpsdestlongituderef": "Referensy vöär längdegråd bestemming",
+       "exif-gpsdestlongitude": "Längdegråd bestemming",
+       "exif-gpsdestbearingref": "Referensy vöär richting nå bestemming",
+       "exif-gpsdestbearing": "Richting nå bestemming",
+       "exif-gpsdestdistanceref": "Referensy vöär afstand tot bestemming",
+       "exif-gpsdestdistance": "Afstand tot bestemming",
+       "exif-gpsprocessingmethod": "Name van de GPS-verwarkingsmetode",
+       "exif-gpsareainformation": "Name van et GPS-gebeed",
+       "exif-gpsdatestamp": "GPS-dåtum",
+       "exif-gpsdifferential": "Differentiele GPS-korrekty",
+       "exif-jpegfilecomment": "Upmarking by JPEG-bestand",
        "exif-keywords": "Trefwoorden",
-       "exif-worldregioncreated": "Regio in de wereld waor de aofbeelding emaakt is",
-       "exif-countrycreated": "Laand waor de aofbeelding emaakt is",
-       "exif-countrycodecreated": "Kode veur t laand waor de aofbeelding emaakt is",
-       "exif-provinceorstatecreated": "Provinsie of staot waor de aofbeelding emaakt is",
-       "exif-citycreated": "Plaotse waor de aofbeelding emaakt is",
-       "exif-sublocationcreated": "Wiek van de plaotse waor de aofbeelding emaakt is",
-       "exif-worldregiondest": "Weeregeven wereldregio",
-       "exif-countrydest": "Weeregeven laand",
-       "exif-countrycodedest": "Kode veur t weeregeven laand",
-       "exif-provinceorstatedest": "Weeregeven provinsie of staot",
-       "exif-citydest": "Weeregeven plaotse",
-       "exif-sublocationdest": "Weeregeven wiek in plaotse",
-       "exif-objectname": "Korte naam",
-       "exif-specialinstructions": "Spesiale instruksies",
-       "exif-headline": "Kopjen",
-       "exif-credit": "Krediet/leverancier",
+       "exif-worldregioncreated": "Regio in de wearld wår de afbealding maked is",
+       "exif-countrycreated": "Land wår de afbealding maked is",
+       "exif-countrycodecreated": "Kode vöär et land wår de afbealding maked is",
+       "exif-provinceorstatecreated": "Provinsy of ståt wår de afbealding maked is",
+       "exif-citycreated": "Plaatse wår de afbealding maked is",
+       "exif-sublocationcreated": "Wyk van de plaatse wår de afbealding maked is",
+       "exif-worldregiondest": "Weadergeaven wearldregio",
+       "exif-countrydest": "Weadergeaven land",
+       "exif-countrycodedest": "Kode vöär et weadergeaven land",
+       "exif-provinceorstatedest": "Weadergeaven provinsy of ståt",
+       "exif-citydest": "Weadergeaven plaatse",
+       "exif-sublocationdest": "Weadergeaven wyk in plaatse",
+       "exif-objectname": "Korte name",
+       "exif-specialinstructions": "Speciale instruktys",
+       "exif-headline": "Upskrivt",
+       "exif-credit": "Kredit/leaveransyr",
        "exif-source": "Bron",
-       "exif-editstatus": "Bewarkingsstaotus van de aofbeelding",
-       "exif-urgency": "Urgensie",
-       "exif-fixtureidentifier": "Groepsnaam",
-       "exif-locationdest": "Weeregeven lokasie",
-       "exif-locationdestcode": "Kode veur de weeregeven lokasie",
-       "exif-objectcycle": "Tied van de dag waor de media veur bedoeld is",
-       "exif-contact": "Kontaktgegevens",
-       "exif-writer": "Schriever",
-       "exif-languagecode": "Taal",
-       "exif-iimversion": "IIM-versie",
-       "exif-iimcategory": "Kategorie",
-       "exif-iimsupplementalcategory": "Anvullende kategorieën",
-       "exif-datetimeexpires": "Niet te gebruken nao",
-       "exif-datetimereleased": "Uutebröcht op",
-       "exif-originaltransmissionref": "Oorspronkelike taaklokasiekode",
+       "exif-editstatus": "Bewarkingsståtus van de afbealding",
+       "exif-urgency": "Urgensy",
+       "exif-fixtureidentifier": "Grupsname",
+       "exif-locationdest": "Weadergeaven lokaty",
+       "exif-locationdestcode": "Kode vöär de weadergeaven lokaty",
+       "exif-objectcycle": "Tyd van de dag wår de media vöär bedoold is",
+       "exif-contact": "Kontaktgegeavens",
+       "exif-writer": "Skryver",
+       "exif-languagecode": "Språke",
+       "exif-iimversion": "IIM-versy",
+       "exif-iimcategory": "Kategory",
+       "exif-iimsupplementalcategory": "Anvüllende kategoryen",
+       "exif-datetimeexpires": "Neet te gebruken nå",
+       "exif-datetimereleased": "Uutbröcht up",
+       "exif-originaltransmissionref": "Oorsprungelike språklokatykode",
        "exif-identifier": "ID",
-       "exif-lens": "Lenze die gebruukt wörden",
-       "exif-serialnumber": "Serienummer van de camera",
-       "exif-cameraownername": "Eigenaar van camera",
+       "exif-lens": "Brukede lense",
+       "exif-serialnumber": "Serynummer van de kamera",
+       "exif-cameraownername": "Eigenaar van kamera",
        "exif-label": "Etiket",
-       "exif-datetimemetadata": "Daotum waorop de metadata veur t lest bie-ewörken bin",
-       "exif-nickname": "Informele naam van de aofbeelding",
-       "exif-rating": "Werdering (op n schaole van 5)",
-       "exif-rightscertificate": "Rechtenbeheercertificaot",
-       "exif-copyrighted": "Auteursrechtstaotus",
-       "exif-copyrightowner": "Auteursrechtenhouwer",
-       "exif-usageterms": "Gebruuksveurweerden",
-       "exif-webstatement": "Internetauteursrechverklaoring",
-       "exif-originaldocumentid": "Uniek ID van t originele dokument",
-       "exif-licenseurl": "Webadres veur auteursrechlisensie",
-       "exif-morepermissionsurl": "Alternatieve lisensiegegevens",
-       "exif-attributionurl": "Gebruuk de volgende verwiezing bie hergebruuk van dit wark",
-       "exif-preferredattributionname": "Gebruuk de volgende makersvermelding bie hergebruuk van dit wark",
-       "exif-pngfilecomment": "Opmarking bie PNG-bestaand",
+       "exif-datetimemetadata": "Dåtum wårup de metadata vöär et lätst bywarked is",
+       "exif-nickname": "Informele name van de afbealding",
+       "exif-rating": "Wardering (up en skale van 5)",
+       "exif-rightscertificate": "Rechtenbeheyrcertifikaat",
+       "exif-copyrighted": "Autöörsrechtenståtus",
+       "exif-copyrightowner": "Autöörsrechtenholder",
+       "exif-usageterms": "Gebruuksbeding",
+       "exif-webstatement": "Binnennetse autöörsrechtenverklåring",
+       "exif-originaldocumentid": "Unik ID van et originele dokument",
+       "exif-licenseurl": "Webadres vöär autöörsrechtenlicensy",
+       "exif-morepermissionsurl": "Alternative licensygegeavens",
+       "exif-attributionurl": "Bruuk de volgende verwysing as dit wark herbruked wördt",
+       "exif-preferredattributionname": "Bruuk de volgende makersvermelding as dit wark herbruked wördt",
+       "exif-pngfilecomment": "Upmarking by PNG-bestand",
        "exif-disclaimer": "Vöärbehold",
-       "exif-contentwarning": "Waorschuwing over inhoud",
-       "exif-giffilecomment": "Opmarking bie GIF-bestaand",
-       "exif-intellectualgenre": "Soort onderwarp",
-       "exif-subjectnewscode": "Onderwarpkode",
-       "exif-scenecode": "IPTC-scènekode",
-       "exif-event": "Aofebeelden gebeurtenisse",
-       "exif-organisationinimage": "Aofebeelden organisasie",
-       "exif-personinimage": "Aofebeeld persoon",
-       "exif-originalimageheight": "Heugte van de aofbeelding veur biesniejen",
-       "exif-originalimagewidth": "Breedte van de aofbeelding veur biesniejen",
-       "exif-compression-1": "Niet ekomprimeerd",
-       "exif-compression-2": "CCITT-groep 3 1-dimensionale an-epasten \"Huffman run length\"-kodering",
-       "exif-compression-3": "CCITT-groep 3 faxcodering",
-       "exif-compression-4": "CCITT-groep 4 faxcodering",
-       "exif-copyrighted-true": "Auteursrechtelik bescharmp",
-       "exif-copyrighted-false": "Auteursrechtenstaotus niet vasteleegd",
-       "exif-unknowndate": "Onbekende daotum",
+       "exif-contentwarning": "Inholdswårsküwing",
+       "exif-giffilecomment": "Upmarking by GIF-bestand",
+       "exif-intellectualgenre": "Soort underwarp",
+       "exif-subjectnewscode": "Underwarpkode",
+       "exif-scenecode": "IPTC-scenekode",
+       "exif-event": "Afbealdede geböärtenisse",
+       "exif-organisationinimage": "Afbealdede organisaty",
+       "exif-personinimage": "Afbealded persoon",
+       "exif-originalimageheight": "Höygde van de afbealding vöär et bysnyden",
+       "exif-originalimagewidth": "Breydde van de afbealding vöär et bysnyden",
+       "exif-compression-1": "Neet komprimeerd",
+       "exif-compression-2": "CCITT-grup 3 1-dimensionale anpasde \"Huffman run length\"-kodering",
+       "exif-compression-3": "CCITT-grup 3 fakskodering",
+       "exif-compression-4": "CCITT-grup 4 fakskodering",
+       "exif-copyrighted-true": "Autöörsrechtelik beskarmd",
+       "exif-copyrighted-false": "Autöörsrechtenståtus neet upgeaven",
+       "exif-photometricinterpretation-0": "Swart-wit (wit is 0)",
+       "exif-photometricinterpretation-1": "Swart-wit (swart is 0)",
+       "exif-photometricinterpretation-3": "Palette",
+       "exif-photometricinterpretation-4": "Transparansymasker",
+       "exif-photometricinterpretation-5": "Skeiden (wårskynlik CMYK)",
+       "exif-photometricinterpretation-8": "CIE L*a*b*",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (ICC-kodering)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (ITU-kodering)",
+       "exif-unknowndate": "Unbekende dåtum",
        "exif-orientation-1": "Normaal",
-       "exif-orientation-2": "horizontaal espegeld",
-       "exif-orientation-3": "180° edreid",
-       "exif-orientation-4": "verticaal edreid",
-       "exif-orientation-5": "espegeld um as linksboven-rechtsonder",
-       "exif-orientation-6": "90° linksummedreid",
-       "exif-orientation-7": "90° linksummedreid",
-       "exif-orientation-8": "90° rechtsummedreid",
-       "exif-planarconfiguration-1": "Grof gegevensformaot",
-       "exif-planarconfiguration-2": "planar gegevensformaot",
-       "exif-colorspace-65535": "Niet-ekalibreerd",
-       "exif-componentsconfiguration-0": "besteet niet",
-       "exif-exposureprogram-0": "Niet umschreven",
-       "exif-exposureprogram-1": "Haandmaotig",
+       "exif-orientation-2": "horizontaal spegeld",
+       "exif-orientation-3": "180° draid",
+       "exif-orientation-4": "vertikaal draid",
+       "exif-orientation-5": "90° teagen de klokke in draid en vertikaal spegeld",
+       "exif-orientation-6": "90° teagen de klokke in draid",
+       "exif-orientation-7": "90° mid de klokke middraid en vertikaal spegeld",
+       "exif-orientation-8": "90° mid de klokke middraid",
+       "exif-planarconfiguration-1": "Grov formaat",
+       "exif-planarconfiguration-2": "Planäär formaat",
+       "exif-colorspace-65535": "Neet kalibreerd",
+       "exif-componentsconfiguration-0": "besteyt neet",
+       "exif-exposureprogram-0": "Unbekend",
+       "exif-exposureprogram-1": "Handmåtig",
        "exif-exposureprogram-2": "Normaal",
        "exif-exposureprogram-3": "Diafragmaprioriteit",
        "exif-exposureprogram-4": "Sluterprioriteit",
-       "exif-exposureprogram-5": "Kreatief (veurkeur veur grote scharptediepte)",
-       "exif-exposureprogram-6": "Aksie (veurkeur veur hoge slutersnelheid)",
-       "exif-exposureprogram-7": "Portret (detailopname mit onscharpe achtergrond)",
-       "exif-exposureprogram-8": "Laandschap (scharpe achtergrond)",
-       "exif-subjectdistance-value": "$1 m",
-       "exif-meteringmode-0": "Onbekend",
+       "exif-exposureprogram-5": "Kreativ programma (vöärköär vöär groute skarpdedeepde)",
+       "exif-exposureprogram-6": "Akty (vöärköär vöär houge slutersnelheid)",
+       "exif-exposureprogram-7": "Portret (detailupnåme mid unskarpe achtergrund)",
+       "exif-exposureprogram-8": "Landskap (skarpe achtergrund)",
+       "exif-subjectdistance-value": "$1 meter",
+       "exif-meteringmode-0": "Unbekend",
        "exif-meteringmode-1": "Gemiddeld",
-       "exif-meteringmode-2": "Gemiddeld, naodrok op midden",
+       "exif-meteringmode-2": "Middencentreerd",
        "exif-meteringmode-3": "Spot",
-       "exif-meteringmode-4": "MultiSpot",
+       "exif-meteringmode-4": "Multi-spot",
        "exif-meteringmode-5": "Multi-segment (patrone)",
-       "exif-meteringmode-6": "Deelmeting",
-       "exif-meteringmode-255": "Aanders",
-       "exif-lightsource-0": "Onbekend",
-       "exif-lightsource-1": "Daglocht",
-       "exif-lightsource-2": "Tl-locht",
-       "exif-lightsource-3": "Tungsten (lamplocht)",
+       "exif-meteringmode-6": "Deylmeating",
+       "exif-meteringmode-255": "Anders",
+       "exif-lightsource-0": "Unbekend",
+       "exif-lightsource-1": "Daglicht",
+       "exif-lightsource-2": "TL-licht",
+       "exif-lightsource-3": "Tungsten (lamplicht)",
        "exif-lightsource-4": "Flitser",
-       "exif-lightsource-9": "Mooi weer",
-       "exif-lightsource-10": "Bewolk",
-       "exif-lightsource-11": "Schaoduw",
-       "exif-lightsource-12": "Fluorescerend daglocht (D 5700 – 7100K)",
-       "exif-lightsource-13": "Witfluorescerend daglocht (N 4600 – 5400K)",
-       "exif-lightsource-14": "Koel witfluorescerend (W 3900 – 4500K)",
-       "exif-lightsource-15": "Witfluorescerend (WW 3200 – 3700K)",
-       "exif-lightsource-17": "Standardlocht A",
-       "exif-lightsource-18": "Standardlocht B",
-       "exif-lightsource-19": "Standardlocht C",
-       "exif-lightsource-24": "ISO-studiokunstlocht",
-       "exif-lightsource-255": "Aanders",
-       "exif-flash-fired-0": "Flits is niet aofegaon",
-       "exif-flash-fired-1": "Mit flitser",
-       "exif-flash-return-0": "flits stuurt gien gegevens",
-       "exif-flash-return-2": "gien weerkaotsing van de flits vastesteld",
-       "exif-flash-return-3": "weerkaotsing van de flits vastesteld",
-       "exif-flash-mode-1": "verplicht mit flitser",
-       "exif-flash-mode-2": "flitser verplicht onderdrokt",
-       "exif-flash-mode-3": "automatiese modus",
-       "exif-flash-function-1": "Gien flitserfunksie",
-       "exif-flash-redeye-1": "rooie ogen-filter",
+       "exif-lightsource-9": "Mooi weader",
+       "exif-lightsource-10": "Bewolked",
+       "exif-lightsource-11": "Skadüw",
+       "exif-lightsource-12": "Daglicht fluorescerend (D 5700 – 7100K)",
+       "exif-lightsource-13": "Dagwit fluorescerend (N 4600 – 5400K)",
+       "exif-lightsource-14": "Kool wit fluorescerend (W 3900 – 4500K)",
+       "exif-lightsource-15": "Wit fluorescerend (WW 3200 – 3700K)",
+       "exif-lightsource-17": "Standardlicht A",
+       "exif-lightsource-18": "Standardlicht B",
+       "exif-lightsource-19": "Standardlicht C",
+       "exif-lightsource-24": "ISO-studiokünstlicht",
+       "exif-lightsource-255": "Anders",
+       "exif-flash-fired-0": "Flits is neet afgån",
+       "exif-flash-fired-1": "Flits is afgån",
+       "exif-flash-return-0": "flits stüürt geen gegeavens",
+       "exif-flash-return-2": "geen weaderkaatsing van de flits vaststeld",
+       "exif-flash-return-3": "wederkaatsing van de flits vaststeld",
+       "exif-flash-mode-1": "verplicht mid flits",
+       "exif-flash-mode-2": "flits verplicht underdrukked",
+       "exif-flash-mode-3": "automatiske modus",
+       "exif-flash-function-1": "Geen flitsfunkty",
+       "exif-flash-redeye-1": "roude-ougenredukty",
        "exif-focalplaneresolutionunit-2": "duum",
-       "exif-sensingmethod-1": "Niet vastesteld",
-       "exif-sensingmethod-2": "Eén-chip-kleursensor",
-       "exif-sensingmethod-3": "Twee-chips-kleursensor",
-       "exif-sensingmethod-4": "Dree-chips-kleurensensor",
-       "exif-sensingmethod-5": "Kleurvolgende gebiedssensor",
-       "exif-sensingmethod-7": "Dreeliendige sensor",
-       "exif-sensingmethod-8": "Kleurvolgende gebiedssensor",
+       "exif-sensingmethod-1": "Neet vaststeld",
+       "exif-sensingmethod-2": "Eyn-chip-klöörsensor",
+       "exif-sensingmethod-3": "Twey-chip-klöörsensor",
+       "exif-sensingmethod-4": "Dree-chip-klöörensensor",
+       "exif-sensingmethod-5": "Klöörvolgende gebeedssensor",
+       "exif-sensingmethod-7": "Dreelynige sensor",
+       "exif-sensingmethod-8": "Klöörvolgende gebeedssensor",
        "exif-filesource-3": "Digitale fotokamera",
-       "exif-scenetype-1": "n Drekt efotografeerden aofbeelding",
-       "exif-customrendered-0": "Normaal",
-       "exif-customrendered-1": "An-epas",
-       "exif-exposuremode-0": "Automaties",
-       "exif-exposuremode-1": "Haandmaotig",
-       "exif-exposuremode-2": "Belochtingsrie",
-       "exif-whitebalance-0": "Automaties",
-       "exif-whitebalance-1": "Haandmaotig",
-       "exif-scenecapturetype-0": "standard",
-       "exif-scenecapturetype-1": "laandschap",
-       "exif-scenecapturetype-2": "pertret",
-       "exif-scenecapturetype-3": "Nachtscène",
-       "exif-gaincontrol-0": "Gien",
-       "exif-gaincontrol-1": "Lege pieken umhoge",
-       "exif-gaincontrol-2": "Hoge pieken umhoge",
-       "exif-gaincontrol-3": "Lege pieken ummeneer",
-       "exif-gaincontrol-4": "Hoge pieken ummeneer",
+       "exif-scenetype-1": "Een direkt fotografeerde afbealding",
+       "exif-customrendered-0": "Normale verwarking",
+       "exif-customrendered-1": "Anpasde verwarking",
+       "exif-customrendered-2": "HDR (geen origineel seakerd)",
+       "exif-customrendered-3": "HDR (origineel seakerd)",
+       "exif-customrendered-4": "Origineel (vöär HDR)",
+       "exif-customrendered-6": "Panorama",
+       "exif-customrendered-7": "Portret-HDR",
+       "exif-customrendered-8": "Portret",
+       "exif-exposuremode-0": "Automatisk",
+       "exif-exposuremode-1": "Handmåtige belichting",
+       "exif-exposuremode-2": "Belichtingsryge",
+       "exif-whitebalance-0": "Automatiske witbalans",
+       "exif-whitebalance-1": "Handmåtige witbalans",
+       "exif-scenecapturetype-0": "Standard",
+       "exif-scenecapturetype-1": "Landskap",
+       "exif-scenecapturetype-2": "Portret",
+       "exif-scenecapturetype-3": "Nachtscene",
+       "exif-gaincontrol-0": "Geen",
+       "exif-gaincontrol-1": "Laege pyken ümhouge",
+       "exif-gaincontrol-2": "Houge pyken ümhouge",
+       "exif-gaincontrol-3": "Laege pyken ümdale",
+       "exif-gaincontrol-4": "Houge pyken ümdale",
        "exif-contrast-0": "Normaal",
-       "exif-contrast-1": "Zachte",
+       "exif-contrast-1": "Sachte",
        "exif-contrast-2": "Hard",
        "exif-saturation-0": "Normaal",
-       "exif-saturation-1": "Leeg",
-       "exif-saturation-2": "Hoge",
+       "exif-saturation-1": "Laeg",
+       "exif-saturation-2": "Houge",
        "exif-sharpness-0": "Normaal",
-       "exif-sharpness-1": "Zachte",
+       "exif-sharpness-1": "Sachte",
        "exif-sharpness-2": "Hard",
-       "exif-subjectdistancerange-0": "Onbekend",
-       "exif-subjectdistancerange-1": "Macro",
-       "exif-subjectdistancerange-2": "Kortbie",
-       "exif-subjectdistancerange-3": "Veeraof",
-       "exif-gpslatitude-n": "Noorderbreedte",
-       "exif-gpslatitude-s": "Zujerbreedte",
-       "exif-gpslongitude-e": "Oosterlengte",
-       "exif-gpslongitude-w": "Westerlengte",
-       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter|meter}} boven de zeespegel",
-       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter|meter}} onder de zeespegel",
-       "exif-gpsstatus-a": "Bezig mit meten",
-       "exif-gpsstatus-v": "Meetinteroperebiliteit",
-       "exif-gpsmeasuremode-2": "2-dimensionale meting",
-       "exif-gpsmeasuremode-3": "3-dimensionale meting",
-       "exif-gpsspeed-k": "Kilometer per uur",
-       "exif-gpsspeed-m": "Miel per ure",
-       "exif-gpsspeed-n": "Kneupen",
+       "exif-subjectdistancerange-0": "Unbekend",
+       "exif-subjectdistancerange-1": "Makro",
+       "exif-subjectdistancerange-2": "Kortby",
+       "exif-subjectdistancerange-3": "Wyd weg",
+       "exif-gpslatitude-n": "Noorderbreydde",
+       "exif-gpslatitude-s": "Süderbreydde",
+       "exif-gpslongitude-e": "Ousterlängde",
+       "exif-gpslongitude-w": "Westerlängde",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|meter}} boaven de seyspegel",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|meter}} under de seyspegel",
+       "exif-gpsstatus-a": "Beasig mid meaten",
+       "exif-gpsstatus-v": "Meatinteroperabiliteit",
+       "exif-gpsmeasuremode-2": "2-dimensionale meating",
+       "exif-gpsmeasuremode-3": "3-dimensionale meating",
+       "exif-gpsspeed-k": "Kilometer per üre",
+       "exif-gpsspeed-m": "Myl per üre",
+       "exif-gpsspeed-n": "Knoupen",
        "exif-gpsdestdistance-k": "Kilometer",
-       "exif-gpsdestdistance-m": "Miel",
-       "exif-gpsdestdistance-n": "Zeemielen",
-       "exif-gpsdop-excellent": "Uutstekend ($1)",
-       "exif-gpsdop-good": "Goed ($1)",
+       "exif-gpsdestdistance-m": "Myl",
+       "exif-gpsdestdistance-n": "Seymylen",
+       "exif-gpsdop-excellent": "Uutsteakend ($1)",
+       "exif-gpsdop-good": "Good ($1)",
        "exif-gpsdop-moderate": "Gemiddeld ($1)",
-       "exif-gpsdop-fair": "Redelik ($1)",
-       "exif-gpsdop-poor": "Slicht ($1)",
-       "exif-objectcycle-a": "Allinnig smarnens",
-       "exif-objectcycle-p": "Allinnig savends",
-       "exif-objectcycle-b": "'s Mannen én 's avens",
-       "exif-gpsdirection-t": "Waore richting",
-       "exif-gpsdirection-m": "Magnetiese richting",
-       "exif-ycbcrpositioning-1": "In t midden",
-       "exif-ycbcrpositioning-2": "E-kositueerd",
-       "exif-dc-contributor": "Luui die bie-edreugen hebben",
+       "exif-gpsdop-fair": "Readelik ($1)",
+       "exif-gpsdop-poor": "Slecht ($1)",
+       "exif-objectcycle-a": "Allinnig smargens",
+       "exif-objectcycle-p": "Allinnig såvends",
+       "exif-objectcycle-b": "Smargens en såvends",
+       "exif-gpsdirection-t": "Wåre richting",
+       "exif-gpsdirection-m": "Magnetiske richting",
+       "exif-ycbcrpositioning-1": "In et midden",
+       "exif-ycbcrpositioning-2": "Kositueerd",
+       "exif-dc-contributor": "Bydragers",
        "exif-dc-coverage": "Ruumtelike of temporele reikwiedte van media",
        "exif-dc-date": "Daotum(s)",
-       "exif-dc-publisher": "Uutgever",
-       "exif-dc-relation": "Verwaante media",
+       "exif-dc-publisher": "Uutgeaver",
+       "exif-dc-relation": "Verwande media",
        "exif-dc-rights": "Rechten",
        "exif-dc-source": "Bronmedia",
        "exif-dc-type": "Soort media",
index f8709f3..64725b4 100644 (file)
@@ -6,7 +6,8 @@
                        "Matma Rex",
                        "Sp5uhe",
                        "Stlmch",
-                       "Railfail536"
+                       "Railfail536",
+                       "Rail"
                ]
        },
        "exif-imagewidth": "Szerokość",
index 44e3c94..fdc959c 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 5752bee..74bc787 100644 (file)
        "exif-gpsspeed": "Хәрәкәт тизлеге",
        "exif-gpsdatestamp": "GPS датасы",
        "exif-keywords": "Иң мөһиме",
+       "exif-countrydest": "Күрсәтелгән ил",
+       "exif-countrycodedest": "Күрсәтелгән илнең коды",
+       "exif-provinceorstatedest": "Күрсәтелгән өлкә яки штат",
+       "exif-citydest": "Күрсәтелгән шәһәр",
+       "exif-sublocationdest": "Күрсәтелгән шәһәрнең җире",
+       "exif-objectname": "Кыска исем",
        "exif-headline": "Башисем",
        "exif-source": "Чыганак",
        "exif-contact": "Элемтә өчен мәгълүмат",
        "exif-iimversion": "IIM юрамасы",
        "exif-iimcategory": "Төркем",
        "exif-iimsupplementalcategory": "Өстәмә төркемнәр",
-       "exif-datetimereleased": "ЧÑ\8bгаÑ\80Ñ\8bлÑ\83 вакыты",
+       "exif-datetimereleased": "ЧÑ\8bгаÑ\80Ñ\8bлÑ\8bÑ\88 вакыты",
        "exif-identifier": "Идентификатор",
+       "exif-cameraownername": "Камера иясе",
        "exif-label": "Билгеләү",
        "exif-copyrighted": "Авторлык хокукы халәте",
        "exif-copyrightowner": "Авторлык хокукы иясе",
        "exif-subjectdistance-value": "$1 {{PLURAL:$1|метр}}",
        "exif-meteringmode-0": "Билгесез",
        "exif-meteringmode-1": "Уртача",
+       "exif-meteringmode-2": "Үзәк буенча уртача үлчәүле",
        "exif-meteringmode-3": "Нокталы",
        "exif-meteringmode-4": "Күп нокталы",
        "exif-meteringmode-5": "Паттернлы",
        "exif-meteringmode-255": "Башка",
        "exif-lightsource-0": "Билгесез",
        "exif-lightsource-1": "Көндезге яктылык",
+       "exif-lightsource-2": "Көн яктылыгы лампасы",
+       "exif-lightsource-3": "Кыздыру лампасы",
        "exif-lightsource-4": "Яктылык",
        "exif-lightsource-9": "Аяз",
        "exif-lightsource-10": "Болытлы",
        "exif-lightsource-11": "Күләгә",
+       "exif-lightsource-12": "Көн яктылыгы лампасы (D 5700–7100 K)",
+       "exif-lightsource-13": "Көн яктылыгы лампасы (N 4600–5400 K)",
+       "exif-lightsource-14": "Көн яктылыгы лампасы (W 3900–4500 K)",
+       "exif-lightsource-15": "Көн яктылыгы лампасы (WW 3200–3700 K)",
        "exif-flash-mode-3": "автоматик режим",
        "exif-focalplaneresolutionunit-2": "дюйм",
        "exif-sensingmethod-1": "Билгесез",
+       "exif-customrendered-6": "Манзара",
        "exif-scenecapturetype-0": "Стандарт",
        "exif-scenecapturetype-1": "Ландшафт",
        "exif-scenecapturetype-2": "Портрет",
        "exif-gpslatitude-s": "көньяк киңлек",
        "exif-gpslongitude-e": "көнчыгыш озынлык",
        "exif-gpslongitude-w": "көнбатыш озынлык",
-       "exif-gpsstatus-a": "Үлчәү тәмамланмаган",
+       "exif-gpsaltitude-above-sealevel": "Диңгез биеклеге өстеннән $1 {{PLURAL:$1|метр}}",
+       "exif-gpsaltitude-below-sealevel": "Диңгез биеклеге астыннан $1 {{PLURAL:$1|метр}}",
+       "exif-gpsstatus-a": "Үлчәү бара",
        "exif-gpsstatus-v": "Мәгълүматларны җибәрүгә әзер",
+       "exif-gpsmeasuremode-2": "2 координат буенча үлчәү",
+       "exif-gpsmeasuremode-3": "3 координат буенча үлчәү",
        "exif-gpsspeed-k": "км/сәг",
        "exif-gpsspeed-m": "миль/сәг",
        "exif-gpsspeed-n": "узел",
        "exif-dc-type": "Медиа төре",
        "exif-rating-rejected": "Кире кагылды",
        "exif-isospeedratings-overflow": "65535 тән күбрәк",
+       "exif-iimcategory-clj": "Җинаять һәм хокук",
        "exif-iimcategory-fin": "Экономика һәм бизнес",
+       "exif-iimcategory-edu": "Мәгариф",
        "exif-iimcategory-evn": "Әйләнә-тирәдәге мохит",
        "exif-iimcategory-hth": "Сәламәтлек",
        "exif-iimcategory-lab": "Хезмәт",
        "exif-iimcategory-rel": "Дин һәм иман",
        "exif-iimcategory-sci": "Фән һәм техника",
        "exif-iimcategory-spo": "Спорт",
+       "exif-iimcategory-war": "Сугыш, низаг һәм чуалыш",
        "exif-iimcategory-wea": "Һава торышы",
        "exif-urgency-normal": "Гадәти ($1)",
        "exif-urgency-low": "Түбән ($1)",
index 50d1db2..72c8fbe 100644 (file)
@@ -10,7 +10,8 @@
                        "Qiyue2001",
                        "Xiaomingyan",
                        "神樂坂秀吉",
-                       "予弦"
+                       "予弦",
+                       "Wenyuan Liu"
                ]
        },
        "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-customrendered-7": "竖向 HDR",
+       "exif-customrendered-8": "竖向",
        "exif-exposuremode-0": "自动曝光",
        "exif-exposuremode-1": "手动曝光",
        "exif-exposuremode-2": "自动曝光感知调节",
index 5df7c15..4d42667 100644 (file)
        "resetpass-submit-loggedin": "Escambial consínia",
        "resetpass-submit-cancel": "Cancelal",
        "resetpass-temp-password": "Consínia temporal:",
-       "bold_sample": "Testu en letra \"Bold\"",
-       "bold_tip": "Testu en letra \"Bold\"",
-       "italic_sample": "Testu en letra \"Itálica\"",
-       "italic_tip": "Testu en letra \"Itálica\"",
-       "link_sample": "Atihal entítulu",
-       "link_tip": "Atihu entelnu",
-       "extlink_sample": "http://www.example.com Entítulu el atihu",
-       "extlink_tip": "Atihu esternu (alcuerdati el prefihu http://)",
-       "headline_sample": "Entítulu",
-       "headline_tip": "Entítulu e nivel 2",
-       "nowiki_sample": "Añiil testu sin hormatu aquí",
-       "nowiki_tip": "Inoral hormatu güiqui",
-       "image_sample": "Sabulugal.jpg",
-       "image_tip": "Imahin encuairá",
-       "media_sample": "Sabulugal.ogg",
-       "media_tip": "Atihu d'archivu",
-       "sig_tip": "Firma, fecha i ora",
-       "hr_tip": "Línia orizontal (deseparaol)",
        "summary": "Síntesis:",
        "subject": "Tema/entítulu:",
        "minoredit": "Esta es una eición chiquenina",
index 0b0f7ce..66db5bd 100644 (file)
        "resettokens-watchlist-token": "شناسانندهٔ خوراک وبِی [[Special:Watchlist|تغییرات صفحه‌هایی که پی‌گیری می‌کنید]] (اتم/آراس‌اس)",
        "resettokens-done": "بازنشانی شناساننده‌ها.",
        "resettokens-resetbutton": "بازشناسی شناساننده‌های گزیده‌شده.",
-       "bold_sample": "متن پررنگ",
-       "bold_tip": "متن پررنگ",
-       "italic_sample": "متن مورب",
-       "italic_tip": "متن مورب",
-       "link_sample": "عنوان پیوند",
-       "link_tip": "پیوند درونی",
-       "extlink_sample": "http://www.example.com عنوان پیوند",
-       "extlink_tip": "پیوند به بیرون (پیشوند http://‎ را فراموش نکنید)",
-       "headline_sample": "متن عنوان",
-       "headline_tip": "عنوان سطح ۲",
-       "nowiki_sample": "متن قالب‌بندی‌نشده اینجا وارد شود",
-       "nowiki_tip": "نادیده‌گرفتن قالب‌بندی ویکی",
-       "image_sample": "Example.jpg",
-       "image_tip": "تصویر داخل متن",
-       "media_sample": "Example.ogg",
-       "media_tip": "پیوند پرونده",
-       "sig_tip": "امضای شما و برچسب زمان",
-       "hr_tip": "خط افقی (از آن کم استفاده کنید)",
        "summary": "خلاصه:",
        "subject": "عنوان:",
        "minoredit": "این ویرایش، جزئی است",
index 994b1e1..20d2991 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|Tarkkailulistan]] verkkosyötteen (Atom tai RSS) avain",
        "resettokens-done": "Avaimet on uudistettu.",
        "resettokens-resetbutton": "Uudista valitut avaimet",
-       "bold_sample": "Lihavoitu teksti",
-       "bold_tip": "Lihavointi",
-       "italic_sample": "Kursivoitu teksti",
-       "italic_tip": "Kursivointi",
-       "link_sample": "linkki",
-       "link_tip": "Sisäinen linkki",
-       "extlink_sample": "http://www.example.com linkin otsikko",
-       "extlink_tip": "Ulkoinen linkki (muista http:// edessä)",
-       "headline_sample": "Otsikkoteksti",
-       "headline_tip": "Otsikko",
-       "nowiki_sample": "Lisää muotoilematon teksti tähän",
-       "nowiki_tip": "Tekstiä, jota wiki ei muotoile",
-       "image_sample": "Esimerkki.jpg",
-       "image_tip": "Tallennettu tiedosto",
-       "media_sample": "Esimerkki.ogg",
-       "media_tip": "Tiedostolinkki",
-       "sig_tip": "Allekirjoitus aikaleiman kanssa",
-       "hr_tip": "Vaakasuora viiva",
        "summary": "Yhteenveto:",
        "subject": "Aiheotsikko:",
        "minoredit": "Tämä on pieni muutos",
        "version-specialpages": "Toimintosivut",
        "version-parserhooks": "Jäsenninkytkökset",
        "version-variables": "Muuttujat",
-       "version-editors": "Muokkaajat",
+       "version-editors": "Muokkaimet",
        "version-antispam": "Roskalinkkien estäminen",
        "version-other": "Muut",
        "version-mediahandlers": "Median käsittelijät",
        "logentry-partialblock-block-page": "{{PLURAL:$1|sivua|sivuja}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|nimiavaruutta|nimiavaruuksia}} $2",
        "logentry-partialblock-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} muokkaamasta $7. Eston kesto on $5 $6",
-       "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} muokkauseston asetuksia estäen muokkausten tekemisen $7. Eston kesto on $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} muokkauseston asetuksia niin, että hän ei voi muokata $7. Eston kesto on $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} suorittamasta määrättyjä toimenpiteitä (lukuun ottamatta muokkaamista). Eston kesto on $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} toimintaeston asetuksia, jotka koskevat määrättyjä toimenpiteitä. Eston kesto on $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|esti}} käyttäjän {{GENDER:$4|$3}}. Eston kesto on $5 $6",
index 5ce9fd5..57f8978 100644 (file)
        "passwordreset-email": "E-postin atressi:",
        "changeemail": "Muuta tai poista E-postin atressi",
        "changeemail-newemail": "Uusi E-postin atressi:",
-       "bold_sample": "Lihava teksti",
-       "bold_tip": "Lihava teksti",
-       "italic_sample": "Kyrsiveerattu teksti",
-       "italic_tip": "Kyrsiveerattu",
-       "link_sample": "linkin nimi",
-       "link_tip": "Sisäinen linkki",
-       "extlink_sample": "http://www.example.com linkin rypriikki",
-       "extlink_tip": "Eksterni linkki (muista http:// eessä)",
-       "headline_sample": "Rypriikkiteksti",
-       "headline_tip": "Aste 2 rypriikki",
-       "nowiki_sample": "Lissää muotoilematon teksti tähhään",
-       "nowiki_tip": "Iknureeraa wiki formateerinkin",
-       "image_tip": "Piilotettu fiili",
-       "media_tip": "Linkki fiilhiin",
-       "sig_tip": "Allekirjotus aikaleimala",
-       "hr_tip": "Horisontaali linja (käytethään säästävästi)",
        "summary": "Yhteenveto",
        "minoredit": "Tämä on pieni muutos",
        "watchthis": "Valvo tätä sivua",
index 74a6574..a41b631 100644 (file)
        "resettokens-token-label": "$1 (dagsins virði: $2)",
        "resettokens-done": "Nullstilla lyklar.",
        "resettokens-resetbutton": "Nullstilla útvaldu lyklar (tokens)",
-       "bold_sample": "Feitir stavir",
-       "bold_tip": "Feitir stavir",
-       "italic_sample": "Skákstavir",
-       "italic_tip": "Skákstavir",
-       "link_sample": "Slóðarheiti",
-       "link_tip": "Innanhýsis slóð",
-       "extlink_sample": "http://www.example.com slóðarheiti",
-       "extlink_tip": "Útvortis slóð (minst til http:// forskoytið)",
-       "headline_sample": "Yvirskriftartekstur",
-       "headline_tip": "Annars stigs yvirskrift",
-       "nowiki_sample": "Skriva ikki-formateraðan tekst her",
-       "nowiki_tip": "Ignorera wiki-forsniðan",
-       "image_sample": "Dømi.jpg",
-       "image_tip": "Innset mynd",
-       "media_sample": "Dømi.ogg",
-       "media_tip": "Fílu slóð",
-       "sig_tip": "Tín undirskrift við tíðarstempli",
-       "hr_tip": "Vatnrøtt linja (vera sparin við)",
        "summary": "Samandráttur:",
        "subject": "Evni:",
        "minoredit": "Hetta er smábroyting",
index 5132718..53d54a2 100644 (file)
        "tog-useeditwarning": "M’avertir quand je quitte une page en cours de modification sans avoir sauvegardé",
        "tog-prefershttps": "Toujours utiliser une connexion sécurisée lorsque je suis connecté",
        "tog-showrollbackconfirmation": "Afficher une demande de confirmation en cliquant sur un lien d’annulation",
+       "tog-requireemail": "Nécessiter un courriel pour les réinitialisations de mot de passe",
        "underline-always": "Toujours",
        "underline-never": "Jamais",
        "underline-default": "Valeur par défaut du thème ou du navigateur",
        "thursday": "jeudi",
        "friday": "vendredi",
        "saturday": "samedi",
-       "sun": "Dim.",
-       "mon": "Lun.",
-       "tue": "Mar.",
-       "wed": "Mer.",
-       "thu": "Jeu.",
-       "fri": "Ven.",
-       "sat": "Sam.",
+       "sun": "dim.",
+       "mon": "lun.",
+       "tue": "mar.",
+       "wed": "mer.",
+       "thu": "jeu.",
+       "fri": "ven.",
+       "sat": "sam.",
        "january": "janvier",
        "february": "février",
        "march": "mars",
        "createaccountmail": "Utiliser un mot de passe aléatoire temporaire et l’envoyer à l’adresse de courriel spécifiée",
        "createaccountmail-help": "Peut être utilisé pour créer un compte pour une autre personne sans connaître le mot de passe.",
        "createacct-realname": "Nom réel (facultatif)",
-       "createacct-reason": "Motif",
+       "createacct-reason": "Motif (connecté publiquement)",
        "createacct-reason-ph": "Pourquoi créez-vous un autre compte",
        "createacct-reason-help": "Message affiché dans le journal de création de compte",
        "createacct-submit": "Créez votre compte",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
        "loginsuccess": "<strong>Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».</strong>",
-       "nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateur sont sensibles à la casse.\nVérifiez l’orthographe, ou [[Special:CreateAccount|créez un nouveau compte]].",
+       "nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateur sont sensibles à la casse.\nVérifiez l’orthographe ou [[Special:CreateAccount|créez un nouveau compte]].",
        "nosuchusershort": "Il n’y a pas de contributeur avec le nom « $1 ».\nVeuillez vérifier l’orthographe.",
        "nouserspecified": "Vous devez saisir un nom d’utilisateur.",
        "login-userblocked": "{{GENDER:$1|Cet utilisateur|Cette utilisatrice}} est bloqué{{GENDER:$1||e}}. La connexion n’est pas autorisée.",
        "password-login-forbidden": "L’utilisation de ce nom d’utilisateur ou de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "passwordremindertitle": "Nouveau mot de passe temporaire pour {{SITENAME}}",
-       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de\npasse pour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et défini comme « $3 ». Si c’était bien votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande, ou si vous vous avez retrouvé votre mot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message\net continuer à utiliser votre ancien mot de passe.",
+       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de passe\npour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et défini comme « $3 ». Si c’était bien votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande ou si vous vous avez retrouvé votre\nmot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message et\ncontinuer à utiliser votre ancien mot de passe.",
        "noemail": "Aucune adresse de courriel n’a été enregistrée pour l’utilisat{{GENDER:$1|eur|rice}} « $1 ».",
        "noemailcreate": "Vous devez fournir une adresse de courriel valide",
        "passwordsent": "Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisat{{GENDER:$1|eur|rice}} « $1 ».\nVeuillez vous reconnecter après l’avoir reçu.",
        "resettokens-watchlist-token": "Jeton pour le flux (Atom/RSS) web de [[Special:Watchlist|modifications de pages de votre liste de suivi]]",
        "resettokens-done": "Jetons réinitialisés.",
        "resettokens-resetbutton": "Réinitialiser les jetons sélectionnés",
-       "bold_sample": "Texte gras",
-       "bold_tip": "Texte gras",
-       "italic_sample": "Texte italique",
-       "italic_tip": "Texte italique",
-       "link_sample": "Titre du lien",
-       "link_tip": "Lien interne",
-       "extlink_sample": "http://www.example.com/ titre du lien",
-       "extlink_tip": "Lien externe (n'oubliez pas le préfixe http://)",
-       "headline_sample": "Texte du titre",
-       "headline_tip": "Sous-titre niveau 2",
-       "nowiki_sample": "Entrez le texte non formaté ici",
-       "nowiki_tip": "Ignorer la syntaxe wiki",
-       "image_sample": "Exemple.jpg",
-       "image_tip": "Fichier inséré",
-       "media_sample": "Exemple.ogg",
-       "media_tip": "Lien vers un fichier média",
-       "sig_tip": "Votre signature avec la date",
-       "hr_tip": "Ligne horizontale (ne pas en abuser)",
        "summary": "Résumé :",
        "subject": "Sujet :",
        "minoredit": "Modification mineure",
        "blockedtitle": "L’utilisateur est bloqué.",
        "blocked-email-user": "<strong>Votre nom d’utilisateur a été bloqué pour l’envoi de courriels. Vous pouvez toujours modifier d’autres pages sur ce wiki.</strong> Vous pouvez voir tous les détails du blocage sur [[Special:MyContributions|contributions du compte]].\n\nCe blocage a été fait par $1.\n\nLe motif fourni est <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Cible souhaitée du blocage : $7\n* ID du blocage nº $5",
        "blockedtext-partial": "<strong>Votre nom d’utilisateur ou votre adresse IP a été bloqué pour effectuer des modifications sur cette page. Vous pouvez toujours modifier d’autres pages sur ce wiki.</strong> Vous pouvez voir tous les détails sur ce blocage sur [[Special:MyContributions|contributions du compte]].\n\nLe blocage a été effectué par $1.\n\nLe motif fourni est <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Cible souhaitée du blocage : $7\n* ID du blocage nº $5",
-       "blockedtext": "<strong>Votre compte utilisateur ou votre adresse IP a été bloqué.</strong>\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité ne vous a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
-       "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité « {{int:emailuser}} » que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité ne vous a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
+       "blockedtext": "<strong>Votre compte utilisateur ou votre adresse IP a été bloqué.</strong>\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité ne vous a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
+       "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est:\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité « {{int:emailuser}} » que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité ne vous a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "systemblockedtext": "Votre nom d'utilisateur ou votre adresse IP ont été bloqués automatiquement par MediaWiki.\nLa raison donnée est la suivante:\n\n: <em>$2</em>.\n\n* Le début du blocage: $8\n* Expiration du délai de blocage: $6\n* Elément concerné: $7\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "blockednoreason": "aucune raison donnée",
        "blockedtext-composite": "<strong>Votre nom d'utilisateur ou votre adresse IP ont été bloqués.</strong>\n\nLa raison invoquée est :\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage le plus long : $6\n* $5\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chaque demande que vous ferez.",
        "userpage-userdoesnotexist": "Le compte utilisateur « <nowiki>$1</nowiki> » n’est pas enregistré. Veuillez vérifier que vous voulez créer cette page.",
        "userpage-userdoesnotexist-view": "Le compte utilisateur « $1 » n'est pas enregistré.",
        "blocked-notice-logextract": "Cet utilisateur est actuellement bloqué.\nLa dernière entrée du journal des blocages est affichée ci-dessous pour référence :",
-       "clearyourcache": "<strong>Note :</strong> après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* <strong>Firefox / Safari :</strong> maintenez la touche <em>Maj</em> (<em>Shift</em>) en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac) \n* <strong>Google Chrome :</strong> appuyez sur <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> sur un Mac) \n* <strong>Internet Explorer :</strong> maintenez la touche <em>Ctrl</em> en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> \n* <strong>Opera :</strong> allez dans <em>Menu → Settings</em> (<em>Opera → Préférences</em> sur un Mac) et ensuite à <em>Confidentialité & sécurité → Effacer les données d’exploration → Images et fichiers en cache</em>.",
+       "clearyourcache": "<strong>Note :</strong> après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* <strong>Firefox / Safari :</strong> maintenez la touche <em>Maj</em> (<em>Shift</em>) en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac).\n* <strong>Google Chrome :</strong> appuyez sur <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> sur un Mac).\n* <strong>Internet Explorer :</strong> maintenez la touche <em>Ctrl</em> en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em>.\n* <strong>Opera :</strong> allez dans <em>Menu → Settings</em> (<em>Opera → Préférences</em> sur un Mac) et ensuite à <em>Confidentialité et sécurité → Effacer les données d’exploration → Images et fichiers en cache</em>.",
        "usercssyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l’enregistrer.",
-       "userjsonyoucanpreview": "<strong>Conseil :</strong> Utiliser le bouton « {{int:showpreview}} » pour tester votre nouveau JSON avant enregistrement.",
+       "userjsonyoucanpreview": "<strong>Conseil :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouveau JSON avant enregistrement.",
        "userjsyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l’enregistrer.",
-       "usercsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser votre propre feuille CSS. \nElle n’a pas encore été enregistrée !</strong>",
+       "usercsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser votre propre feuille CSS.\nElle n’a pas encore été enregistrée !</strong>",
        "userjsonpreview": "<strong>Rappelez-vous que vous êtes seulement en train de tester/voir un aperçu de votre configuration utilisateur JSON.\nElle n’a pas encore été enregistrée !</strong>",
-       "userjspreview": "<strong>Rappelez-vous que vous ne faites que visualiser ou tester votre code JavaScript.\nIl n’a pas encore été enregistré !</strong>",
-       "sitecsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser cette feuille de style. \nElle n’a pas encore été enregistrée !</strong>",
+       "userjspreview": "<strong>Rappelez-vous que vous ne faites que visualiser ou tester votre code JavaScript.\nIl n’a pas encore été enregistré!</strong>",
+       "sitecsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser cette feuille de style. \nElle n’a pas encore été enregistrée!</strong>",
        "sitejsonpreview": "<strong>Souvenez-vous que vous ne faites que regarder un aperçu de cette configuration JSON.\nElle n’a pas encore été enregistrée !</strong>",
-       "sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript. \nIl n’a pas encore été enregistré !</strong>",
-       "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ». \nLes pages personnelles avec extensions .css, .json et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
+       "sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript.\nIl n’a pas encore été enregistré !</strong>",
+       "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ».\nLes pages personnelles avec extensions .css, .json et .js utilisent des titres en minuscules, par exemple <tt>{{ns:user}}:Foo/vector.css</tt> et non <tt>{{ns:user}}:Foo/Vector.css</tt>.",
        "updated": "(Mis à jour)",
        "note": "<strong>Note :</strong>",
        "previewnote": "<strong>Rappelez-vous que ce n’est qu’une prévisualisation.</strong>\nVos modifications n’ont pas encore été enregistrées !",
        "continue-editing": "Aller à la zone de modification",
        "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.",
-       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
+       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]] puis en vous reconnectant. Vérifiez également que votre navigateur accepte les témoins (''cookies'') de ce site.",
        "session_fail_preview_html": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\n<em>Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation est masquée afin de prévenir les attaques par JavaScript.</em>\n\n<strong>Si la tentative de modification est légitime, veuillez réessayer.</strong>\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous, et vérifiez que votre navigateur accepte les témoins (''cookies'') de ce site.",
        "token_suffix_mismatch": "<strong>Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.</strong>\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
        "edit_form_incomplete": "<strong>Certaines parties du formulaire de modification n’ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.</strong>",
        "editingsection": "Modification de $1 (section)",
        "editingcomment": "Modification de $1 (nouvelle section)",
        "editconflict": "Conflit de modification : $1",
-       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « $1 ».",
+       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « $1 ».",
        "yourtext": "Votre texte",
        "storedversion": "La version enregistrée",
        "editingold": "<strong>Attention : vous êtes en train de modifier une ancienne version de cette page.</strong>\nSi vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.",
-       "unicode-support-fail": "Votre navigateur semble ne pas rendre en charge l'Unicode. Ceci est nécessaire pour modifier les pages, aussi vos modifications n'ont pas été sauvegardées.",
+       "unicode-support-fail": "Votre navigateur semble ne pas rendre en charge lUnicode. Ceci est nécessaire pour modifier les pages, aussi vos modifications n'ont pas été sauvegardées.",
        "yourdiff": "Différences",
-       "copyrightwarning": "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). \nSi vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public ou d’une ressource libre similaire. \n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
-       "copyrightwarning2": "Notez bien que toutes les contributions à {{SITENAME}} peuvent être modifiées, transformées ou supprimées par d’autres utilisateurs. \nSi vous ne désirez pas que vos écrits soient modifiés contre votre gré, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).\n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
+       "copyrightwarning": "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). \nSi vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br /> \nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public ou d’une ressource libre similaire.\n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
+       "copyrightwarning2": "Notez bien que toutes les contributions à {{SITENAME}} peuvent être modifiées, transformées ou supprimées par d’autres utilisateurs.\nSi vous ne désirez pas que vos écrits soient modifiés contre votre gré, merci de ne pas les soumettre ici.<br />\nVous nous promettez aussi que vous avez écrit ceci vous-même ou que vous l’avez copié d’une source provenant du domaine public ou d’une ressource libre (voir $1 pour plus de détails).\n<strong>N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !</strong>",
        "editpage-cannot-use-custom-model": "Le modèle de contenu de cette page ne peut pas être modifié.",
        "longpageerror": "<strong>Erreur : Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.</strong>\nIl ne peut pas être sauvegardé.",
-       "readonlywarning": "<strong>AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.</strong>\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur système ayant verrouillé la base de données a donné l’explication suivante : $1",
-       "protectedpagewarning": "<strong>AVERTISSEMENT : cette page est protégée afin que seuls les utilisateurs ayant le statut d'administrateur puissent la modifier.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
-       "semiprotectedpagewarning": "<strong>Note :</strong>Cette page a été protégée pour que seuls les contributeurs confirmés automatiquement puissent la modifier. \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
-       "cascadeprotectedwarning": "<strong>ATTENTION :</strong> Cette page a été protégée de manière à ce que seuls les utilisateurs avec [[Special:ListGroupRights|des droits spécifiques]] puissent la modifier car elle est incluse dans {{PLURAL:$1|la page suivante, protégée en cascade|les pages suivantes, protégées en cascade}} :",
-       "titleprotectedwarning": "<strong>ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.</strong> \nLa dernière entrée du journal est affichée ci-dessous pour référence :",
+       "readonlywarning": "<strong>AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.</strong>\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur système ayant verrouillé la base de données a donné l’explication suivante : $1",
+       "protectedpagewarning": "<strong>AVERTISSEMENT : cette page est protégée afin que seuls les utilisateurs ayant le statut d’administrateur puissent la modifier.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
+       "semiprotectedpagewarning": "<strong>Note :</strong>Cette page a été protégée pour que seuls les contributeurs confirmés automatiquement puissent la modifier.\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
+       "cascadeprotectedwarning": "<strong>ATTENTION :</strong> cette page a été protégée de manière à ce que seuls les utilisateurs avec [[Special:ListGroupRights|des droits spécifiques]] puissent la modifier car elle est incluse dans {{PLURAL:$1|la page suivante, protégée en cascade|les pages suivantes, protégées en cascade}} :",
+       "titleprotectedwarning": "<strong>ATTENTION : cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.</strong>\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
        "templatesused": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} par cette page :",
        "templatesusedpreview": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette prévisualisation :",
        "templatesusedsection": "{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette section :",
        "edittools": "<!-- Tout texte entré ici sera affiché sous les boîtes de modification ou les formulaires de téléversement de fichier. -->",
        "edittools-upload": "—",
        "nocreatetext": "{{SITENAME}} a restreint la possibilité de créer de nouvelles pages.\nVous pouvez revenir en arrière et modifier une page existante, ou bien [[Special:UserLogin|vous connecter ou créer un compte]].",
-       "nocreate-loggedin": "Vous n'avez pas la permission de créer de nouvelles pages.",
+       "nocreate-loggedin": "Vous navez 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 prise en charge",
        "modeleditnotsupported-text": "La modification n’est pas prise en charge 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}} :",
+       "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}}:",
        "contentmodelediterror": "Vous ne pouvez pas modifier cette révision car son modèle de contenu est <code>$1</code>, ce qui diffère du modèle de contenu actuel de la page <code>$2</code>.",
-       "recreate-moveddeleted-warn": "<strong>Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.</strong>\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page.\nLes journaux des suppressions et déplacements pour cette page sont fournis ici pour information :",
+       "recreate-moveddeleted-warn": "<strong>Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.</strong>\n\nAssurez-vous qu’il est pertinent de poursuivre les modifications sur cette page.\nLes journaux des suppressions et déplacements pour cette page sont fournis ici pour information :",
        "moveddeleted-notice": "Cette page a été supprimée.\nLes journaux des suppressions, protections et déplacements pour la page sont fournis ci-dessous pour référence.",
        "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions, protections et déplacements pour la page sont fournis ci-dessous pour référence.",
        "log-fulllog": "Voir le journal complet",
        "edit-gone-missing": "N’a pas pu mettre à jour la page.\nIl semble qu’elle ait été supprimée.",
        "edit-conflict": "Conflit de modification.",
        "edit-no-change": "Votre modification a été ignorée car aucun changement n’a été apporté au texte.",
-       "edit-slots-cannot-add": "{{PLURAL:$1|L’emplacement suivant n’est pas supporté|Les emplacements suivants ne sont pas supportés}} ici : $2.",
-       "edit-slots-cannot-remove": "{{PLURAL:$1|L’emplacement suivant est obligatoire et ne peut pas être supprimé|Les emplacements suivants sont obligatoires et ne peuvent pas être supprimés}} : $2.",
-       "edit-slots-missing": "{{PLURAL:$1|L’emplacement suivant est absent|Les emplacements suivants sont absents}} : $2.",
+       "edit-slots-cannot-add": "{{PLURAL:$1|L’emplacement suivant n’est pas supporté|Les emplacements suivants ne sont pas supportés}} ici: $2.",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|L’emplacement suivant est obligatoire et ne peut pas être supprimé|Les emplacements suivants sont obligatoires et ne peuvent pas être supprimés}}: $2.",
+       "edit-slots-missing": "{{PLURAL:$1|L’emplacement suivant est absent|Les emplacements suivants sont absents}}: $2.",
        "postedit-confirmation-created": "La page a été créée.",
        "postedit-confirmation-restored": "La page a été restaurée.",
        "postedit-confirmation-saved": "Votre modification a été enregistrée.",
        "content-not-allowed-here": "Le contenu « $1 » n’est pas autorisé sur la page [[:$2]] dans l’emplacement « $3 »",
        "editwarning-warning": "Quitter cette page vous fera perdre toutes les modifications que vous avez faites.\nSi vous êtes connecté{{GENDER:||e}}, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.",
        "editpage-invalidcontentmodel-title": "Modèle de contenu non pris en charge",
-       "editpage-invalidcontentmodel-text": "Le modèle de contenu \"$1\" n'est pas pris en charge.",
+       "editpage-invalidcontentmodel-text": "Le modèle de contenu « $1 » n’est pas pris en charge.",
        "editpage-notsupportedcontentformat-title": "Format de contenu non pris en charge",
-       "editpage-notsupportedcontentformat-text": "Le format de contenu $1 n'est pas pris en charge par le modèle de contenu $2 .",
+       "editpage-notsupportedcontentformat-text": "Le format de contenu $1 nest pas pris en charge par le modèle de contenu $2 .",
        "slot-name-main": "Principal",
        "content-model-wikitext": "wikitexte",
        "content-model-text": "texte brut",
        "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.",
+       "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ésormais 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.",
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Attention :</strong> cette page contient de trop nombreux appels à des fonctions coûteuses de l’analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maintenant $1.",
-       "expensive-parserfunction-category": "Pages avec trop d'appels dispendieux aux fonctions de l'analyseur syntaxique",
+       "expensive-parserfunction-category": "Pages avec trop d’appels dispendieux aux fonctions de l’analyseur syntaxique",
        "post-expand-template-inclusion-warning": "<strong>Attention :</strong> cette page contient trop d’inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
        "post-expand-template-inclusion-category": "Pages contenant trop d'inclusions de modèles",
-       "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante. \nCes arguments n’ont donc pas été inclus.",
+       "post-expand-template-argument-warning": "<strong>Attention :</strong> cette page contient au moins un paramètre de modèle dont la taille après expansion est trop importante.\nCes arguments n’ont donc pas été inclus.",
        "post-expand-template-argument-category": "Pages contenant des paramètres de modèle non évalués",
        "parser-template-loop-warning": "Modèle en boucle détecté : [[$1]]",
        "template-loop-category": "Pages avec des boucles de modèle",
-       "template-loop-category-desc": "La page contient une boucle dans le modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
-       "template-loop-warning": "<strong>Avertissement :</strong> Cette page appelle [[:$1]] ce qui provoque une boucle de modèles (un appel récursif infini).",
+       "template-loop-category-desc": "La page contient une boucle de modèle, c.à.d. un modèle qui s’appelle lui-même récursivement.",
+       "template-loop-warning": "<strong>Avertissement :</strong> cette page appelle [[:$1]] ce qui provoque une boucle de modèles (un appel récursif potentiellement infini).",
        "parser-template-recursion-depth-warning": "Limite de profondeur des appels récursifs de modèles dépassée ($1)",
        "language-converter-depth-warning": "Limite de profondeur du convertisseur de langue dépassée ($1)",
        "node-count-exceeded-category": "Pages dépassant le nombre de nœuds maximal",
        "expansion-depth-exceeded-category": "Pages dépassant la profondeur d'expansion maximale",
        "expansion-depth-exceeded-category-desc": "La page dépasse la profondeur d’expansion maximale.",
        "expansion-depth-exceeded-warning": "Page dépassant la profondeur d’expansion maximale",
-       "parser-unstrip-loop-warning": "Boucle non dépilable détectée",
-       "unstrip-depth-warning": "Limite de récursion non dépilable dépassée ($1)",
+       "parser-unstrip-loop-warning": "Boucle de développement (<code>unstrip</code>) détectée",
+       "unstrip-depth-warning": "Limite de récursion de développement (<code>unstrip</code>) dépassée ($1)",
        "unstrip-depth-category": "Pages où la limite de profondeur de développement est dépassée",
-       "unstrip-size-warning": "Limite de taille de développement dépassée ($1)",
+       "unstrip-size-warning": "Limite de taille de développement (<code>unstrip</code>) dépassée ($1)",
        "unstrip-size-category": "Pages où la limite de taille de développement est dépassée",
        "converter-manual-rule-error": "Erreur détectée dans la règle manuelle de conversion de langue",
-       "undo-success": "Cette modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation si c’est bien ce que vous voulez faire.",
+       "undo-success": "La précédente modification va être annulée.\nVeuillez vérifier les différences ci-dessous, puis publier l’annulation ci-dessous si c’est bien ce que vous voulez faire.",
        "undo-failure": "Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.",
-       "undo-main-slot-only": "La modification n'a pas pu être annulée car elle implique un contenu en dehors de la tranche principale.",
+       "undo-main-slot-only": "La modification na pas pu être annulée car elle implique un contenu en dehors de la tranche principale.",
        "undo-norev": "La modification n’a pas pu être défaite parce qu’elle est inexistante ou qu’elle a été supprimée.",
        "undo-nochange": "Il semblerait que la modification ait déjà été annulée.",
        "undo-summary": "Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])",
        "undo-summary-anon": "Annuler la modification $1 de [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Annuler la révision $1 par un utilisateur masqué",
-       "cantcreateaccount-text": "La création de compte depuis cette adresse IP (<strong>$1</strong>) a été bloquée par [[User:$3|$3]]. \n\nLa raison donnée par $3 était : <em>$2</em>",
-       "cantcreateaccount-range-text": "La création de compte depuis les adresses IP de la plage <strong>$1</strong>, où se trouve votre adresse IP (<strong>$4</strong>), a été bloquée par [[User:$3|$3]].\n\nLe motif fourni par $3 est <em>$2</em>",
+       "cantcreateaccount-text": "La création de compte depuis cette adresse IP (<strong>$1</strong>) a été bloquée par [[User:$3|$3]]. \n\nLa raison donnée par $3 était: <em>$2</em>",
+       "cantcreateaccount-range-text": "La création de compte depuis les adresses IP de la plage <strong>$1</strong>, où se trouve votre adresse IP (<strong>$4</strong>), a été bloquée par [[User:$3|$3]].\n\nLe motif fourni par $3 est : <em>$2</em>",
        "viewpagelogs": "Voir les opérations sur cette page",
        "nohistory": "Il n’existe pas d’historique des modifications pour cette page.",
        "currentrev": "Version actuelle",
        "last": "diff",
        "page_first": "première",
        "page_last": "dernière",
-       "histlegend": "Sélection du diff : cochez les boutons radio des versions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende : <strong>({{int:cur}})</strong> = différence avec la dernière version, <strong>({{int:last}})</strong> = différence avec la version précédente, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
-       "history-fieldset-title": "Filtrer les versions",
+       "histlegend": "Sélection du diff : cochez les boutons radio des versions à comparer et appuyez sur entrée ou sur le bouton en bas.<br />\nLégende : <strong>({{int:cur}})</strong> = différence avec la dernière version, <strong>({{int:last}})</strong> = différence avec la version précédente, <strong>{{int:minoreditletter}}</strong> = modification mineure.",
+       "history-fieldset-title": "Filtrer les révisions",
        "history-show-deleted": "Révision supprimée uniquement",
        "histfirst": "les plus anciennes",
        "histlast": "les plus récentes",
        "historysize": "($1 octet{{PLURAL:$1||s}})",
        "historyempty": "vide",
        "history-feed-title": "Historique des versions",
-       "history-feed-description": "Historique des versions pour cette page sur le wiki",
+       "history-feed-description": "Historique des révisions pour cette page sur le wiki",
        "history-feed-item-nocomment": "$1 le $2",
-       "history-feed-empty": "La page demandée n'existe pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver de nouvelles pages en rapport avec le sujet.",
+       "history-feed-empty": "La page demandée nexiste pas.\nElle a peut-être été effacée ou renommée.\nEssayez de [[Special:Search|rechercher sur le wiki]] pour trouver de nouvelles pages en rapport avec le sujet.",
        "history-edit-tags": "Modifier les balises des versions sélectionnées",
        "rev-deleted-comment": "(résumé de modification retiré)",
        "rev-deleted-user": "(nom d'utilisateur retiré)",
        "rev-showdeleted": "afficher",
        "revisiondelete": "Supprimer ou restaurer des événements",
        "revdelete-nooldid-title": "Version cible non valide",
-       "revdelete-nooldid-text": "Vous n’avez pas précisé de révision(s) cible(s) pour cette fonction, ou bien la révision spécifiée n’existe pas, ou bien vous tentez de masquer la révision actuelle.",
+       "revdelete-nooldid-text": "Vous n’avez pas précisé de révision(s) cible(s) pour cette fonction, ou la révision spécifiée n’existe pas, ou bien vous tentez de masquer la révision actuelle.",
        "revdelete-no-file": "Le fichier spécifié n'existe pas.",
-       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
+       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "revdelete-show-file-submit": "Oui",
-       "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]] :",
-       "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]] :",
-       "logdelete-selected": "{{PLURAL:$1|Événement d'historique sélectionné|Événements d'historique sélectionnés}} :",
+       "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Événement d’historique sélectionné|Événements d’historique sélectionnés}} :",
        "revdelete-text-text": "Les révisions supprimées continueront à apparaître dans l’historique de la page, mais une partie de leur contenu sera inaccessible au public.",
        "revdelete-text-file": "Les versions de fichier supprimées continueront à apparaître dans l’historique des fichiers, mais une partie de leur contenu sera indisponible au public.",
-       "logdelete-text": "Les Ã©vènements supprimés du journal continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
-       "revdelete-text-others": "Les autres administrateurs seront toujours en mesure d'accéder au contenu caché et le restaurer, à moins que des restrictions supplémentaires soient fixées.",
-       "revdelete-confirm": "Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].",
-       "revdelete-suppress-text": "La suppression ne doit être utilisée <strong>que</strong> dans les cas suivants :\n* informations potentiellement diffamatoires\n* informations personnelles inappropriées\n*: <em>adresse, numéro de téléphone, numéro de sécurité sociale, …</em>",
+       "logdelete-text": "Les Ã©vénements supprimés du journal continueront à apparaître dans les journaux, mais une partie de leur contenu sera indisponible au public.",
+       "revdelete-text-others": "Les autres administrateurs seront toujours en mesure daccéder au contenu caché et le restaurer, à moins que des restrictions supplémentaires soient fixées.",
+       "revdelete-confirm": "Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].",
+       "revdelete-suppress-text": "La suppression ne doit être utilisée <strong>que</strong> dans les cas suivants:\n* informations potentiellement diffamatoires\n* informations personnelles inappropriées\n*: <em>adresse, numéro de téléphone, numéro de sécurité sociale, …</em>",
        "revdelete-legend": "Mettre en place des restrictions de visibilité",
        "revdelete-hide-text": "Texte de la révision",
        "revdelete-hide-image": "Masquer le contenu du fichier",
        "revdelete-hide-name": "Masquer la cible et les paramètres",
        "revdelete-hide-comment": "Résumé de modification",
-       "revdelete-hide-user": "Nom d’utilisateur/Adresse IP de l’éditeur",
-       "revdelete-hide-restricted": "Supprimer ces données aux administrateurs ainsi qu'aux autres",
+       "revdelete-hide-user": "Nom d’utilisateur / adresse IP de l’auteur",
+       "revdelete-hide-restricted": "Supprimer ces données aux administrateurs ainsi quaux autres",
        "revdelete-radio-same": "(ne pas changer)",
        "revdelete-radio-set": "Masqué",
        "revdelete-radio-unset": "Visible",
        "revdelete-suppress": "Masquer également les données pour les administrateurs",
        "revdelete-unsuppress": "Enlever les restrictions sur les versions restaurées",
-       "revdelete-log": "Motif :",
+       "revdelete-log": "Motif:",
        "revdelete-submit": "Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}",
        "revdelete-success": "Visibilité des versions mise à jour.",
-       "revdelete-failure": "'''La visibilité de la version n'a pas pu être mise à jour :'''\n$1",
+       "revdelete-failure": "'''La visibilité de la version n'a pas pu être mise à jour:'''\n$1",
        "logdelete-success": "Visibilité du journal modifiée.",
        "logdelete-failure": "'''La visibilité du journal n'a pas pu être définie :'''\n$1",
        "revdel-restore": "modifier la visibilité",
        "prefs-help-email": "L'adresse de courriel est facultative, mais elle est nécessaire pour réinitialiser votre mot de passe, en cas d'oubli.",
        "prefs-help-email-others": "Vous pouvez aussi choisir de laisser les autres vous contacter par courriel via un lien sur votre page de discussion ou page utilisateur. \nVotre adresse courriel n'est pas révélée quand les autres utilisateurs vous contactent.",
        "prefs-help-email-required": "Une adresse de courriel est requise.",
+       "prefs-help-requireemail": "Si coché, enverra seulement les courriels de réinitialisation des mots de passe si la personne qui réinitialise a fourni à la fois un nom d’utilisateur et un courriel pour ce compte.",
        "prefs-info": "Informations de base",
        "prefs-i18n": "Internationalisation",
        "prefs-signature": "Signature",
        "uploaded-event-handler-on-svg": "Fixer des attributs de gestionnaire d’événement <code>$1=\"$2\"</code> n’est pas autorisé dans les fichiers SVG.",
        "uploaded-href-attribute-svg": "<a> les éléments ne peuvent être liés (href) qu’aux cibles de données : (fichier inclus), http:// ou https://, ou un fragment (#, même document). Pour les autres éléments, comme <image>, seuls data: et fragment sont autorisés. Essayez les images incluses lors de l’export de votre SVG. <code>&lt;$1 $2=\"$3\"&gt;</code> obtenu.",
        "uploaded-href-unsafe-target-svg": "Un href vers des données non sûres a été trouvé dans le fichier SVG téléversé : URI cible <code>&lt;$1 $2=\"$3\"&gt;</code>.",
-       "uploaded-animate-svg": "Balise « animate » trouvée, qui pourrait modifier le href en utilisant l’attribut « from » <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléversé.",
+       "uploaded-animate-svg": "Balise « animate » trouvée qui pourrait modifier le href en utilisant l’attribut « from » <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléversé.",
        "uploaded-setting-event-handler-svg": "Positionner les attributs du gestionnaire d’événements n'est pas possible, <code>&lt;$1 $2=\"$3\"&gt;</code> trouvé dans le fichier SVG téléversé.",
        "uploaded-setting-href-svg": "L’utilisation de la balise « set » pour ajouter un attribut « href » à l’élément parent est interdite.",
-       "uploaded-wrong-setting-svg": "L’utilisation de la balise « set » pour ajouter une cible distante, de données ou de type script,  à un attribut quelconque, est interdite. <code>&lt;set to=\"$1\"&gt;</code> a été trouvé dans le fichier SVG téléversé.",
+       "uploaded-wrong-setting-svg": "L’utilisation de la balise « set » pour ajouter à un attribut quelconque une cible distante, de données ou de script est interdite. <code>&lt;set to=\"$1\"&gt;</code> a été trouvé dans le fichier SVG téléversé.",
        "uploaded-setting-handler-svg": "Les SVG qui positionnent l’attribut « handler » avec distant/données/script sont bloqués. <code>$1=\"$2\"</code> a été trouvé dans le fichier SVG téléversé.",
        "uploaded-remote-url-svg": "Les SVG qui positionnent un attribut de style avec une URL distante sont bloqués. <code>$1=\"$2\"</code> trouvé dans le fichier SVG téléversé.",
        "uploaded-image-filter-svg": "Filtre d’image avec URL trouvé : <code>&lt;$1 $2=\"$3\"&gt;</code> dans le fichier SVG téléversé.",
        "uploadstash-errclear": "La suppression des fichiers a échoué.",
        "uploadstash-refresh": "Actualiser la liste des fichiers",
        "uploadstash-thumbnail": "afficher la vignette",
-       "uploadstash-exception": "Impossible de stocker le téléversement dans la réserve ($1) : « $2 ».",
+       "uploadstash-exception": "Impossible de stocker le téléversement dans la réserve ($1): « $2 ».",
        "uploadstash-bad-path": "Le chemin n’existe pas.",
        "uploadstash-bad-path-invalid": "Le chemin n’est pas valide.",
        "uploadstash-bad-path-unknown-type": "Type « $1 » inconnu.",
        "listfiles-userdoesnotexist": "Le compte utilisateur « $1 » n’est pas enregistré.",
        "imgfile": "fichier",
        "listfiles": "Liste de fichiers",
+       "listfiles_subpage": "Téléchargés par $1",
        "listfiles_thumb": "Miniature",
        "listfiles_date": "Date",
        "listfiles_name": "Nom",
        "ipblocklist-legend": "Chercher un utilisateur bloqué",
        "blocklist-userblocks": "Masquer les blocages de comptes",
        "blocklist-tempblocks": "Masquer les blocages temporaires",
+       "blocklist-indefblocks": "Masquer les blocs non définis",
        "blocklist-addressblocks": "Masquer les blocages d’adresses IP uniques",
        "blocklist-type": "Type :",
        "blocklist-type-opt-all": "Tous",
        "tooltip-pt-watchlist": "Une liste des pages dont vous suivez les modifications",
        "tooltip-pt-mycontris": "La liste de {{GENDER:|vos}} contributions",
        "tooltip-pt-anoncontribs": "Une liste des modifications effectuées depuis cette adresse IP",
-       "tooltip-pt-login": "Nous vous encourageons à vous connecter ; ce n’est cependant pas obligatoire",
+       "tooltip-pt-login": "Nous vous encourageons à vous connecter ; ce n’est cependant pas obligatoire.",
        "tooltip-pt-login-private": "Vous devez vous connecter pour utiliser ce wiki",
        "tooltip-pt-logout": "Se déconnecter",
-       "tooltip-pt-createaccount": "Nous vous encourageons à créer un compte utilisateur et vous connecter; ce n’est cependant pas obligatoire",
+       "tooltip-pt-createaccount": "Nous vous encourageons à créer un compte utilisateur et vous connecter ; ce n’est cependant pas obligatoire.",
        "tooltip-ca-talk": "Discussion au sujet de cette page de contenu",
        "tooltip-ca-edit": "Modifier le wikicode",
        "tooltip-ca-addsection": "Commencer une nouvelle section",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Page dans laquelle|Pages dans lesquelles}} cette page est incluse ($1)",
-       "pageinfo-toolboxlink": "Information sur la page",
+       "pageinfo-toolboxlink": "Informations sur la page",
        "pageinfo-redirectsto": "Rediriger vers",
        "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage": "Comptée comme page de contenu",
        "mycustomjsredirectprotected": "Vous n’avez pas le droit de modifier cette page JavaScript parce qu’elle est une redirection et qu’elle ne pointe pas dans votre espace utilisateur.",
        "easydeflate-invaliddeflate": "Le contenu fourni n'est pas correctement développé",
        "unprotected-js": "Pour des raisons de sécurité, JavaScript ne peut pas être chargé depuis des pages non protégées. Veuillez ne créer du javascript que dans l’espace de noms MediaWiki: ou comme sous-page utilisateur",
-       "userlogout-continue": "Voulez-vous vous déconnecter ?"
+       "userlogout-continue": "Voulez-vous vous déconnecter ?",
+       "rest-prefix-mismatch": "Le chemin requis ($1) n’était pas dans le chemin racine de l’API REST ($2)",
+       "rest-wrong-method": "La méthode requise ($1) n’était pas {{PLURAL:$3|la méthode autorisée pour ce chemin|une des méthodes autorisées pour ce chemin}} ($2)",
+       "rest-no-match": "Le chemin relatif requis ($1) ne correspondait à aucun gestionnaire connu"
 }
index 0448259..2226a73 100644 (file)
        "changeemail-none": "(aucun)",
        "changeemail-password": "Ton mot de passe sur {{SITENAME}}:",
        "changeemail-submit": "Changer l’adresse d'email",
-       "bold_sample": "Gras",
-       "bold_tip": "Gras",
-       "italic_sample": "Italique",
-       "italic_tip": "Italique",
-       "link_sample": "Nom du lien",
-       "link_tip": "Lien intérieur",
-       "extlink_sample": "http://www.example.com nom du lien",
-       "extlink_tip": "Lien extérieur (Oubliez pas de mettre http:// avant.)",
-       "headline_sample": "Sujet",
-       "headline_tip": "Sujet niveau 2",
-       "nowiki_sample": "Mettez du texte non-préparé ici",
-       "nowiki_tip": "Ignorez le code wiki",
-       "image_sample": "Exemple.jpg",
-       "image_tip": "Mettez un portrait",
-       "media_sample": "Exemple.ogg",
-       "media_tip": "Lien dossier",
-       "sig_tip": "Votre signature avec la date",
-       "hr_tip": "Ligne horizontale (Abusez-lé pas.)",
        "summary": "Description:",
        "subject": "Sujet:",
        "minoredit": "Ça ici, c'est un petit changement.",
index d2afe37..d781bbc 100644 (file)
        "resettokens-watchlist-token": "Jeton por lo flux (Atom/RSS) Vouèbe de [[Special:Watchlist|changements de pâges de voutra lista de gouârda]]",
        "resettokens-done": "Jetons rebetâs a zérô.",
        "resettokens-resetbutton": "Rebetar los jetons chouèsis",
-       "bold_sample": "Grôs tèxto",
-       "bold_tip": "Grôs tèxto",
-       "italic_sample": "Tèxto étalico",
-       "italic_tip": "Tèxto étalico",
-       "link_sample": "Titro du lim",
-       "link_tip": "Lim de dedens",
-       "extlink_sample": "http://www.example.com titro du lim",
-       "extlink_tip": "Lim de defôr (oubliâd pas lo prèfixo http://)",
-       "headline_sample": "Tèxto du titro",
-       "headline_tip": "Sot-titro nivél 2",
-       "nowiki_sample": "Buchiéd lo tèxto pas formatâ ique",
-       "nowiki_tip": "Ignorar lo formatâjo vouiqui",
-       "image_sample": "Ègzemplo.jpg",
-       "image_tip": "Fichiér apondu",
-       "media_sample": "Ègzemplo.ogg",
-       "media_tip": "Lim de vers un fichiér",
-       "sig_tip": "Voutra signatura avouéc la dâta et l’hora",
-       "hr_tip": "Legne plana (pas nen abusar)",
        "summary": "Rèsumâ :",
        "subject": "Chousa :",
        "minoredit": "O est un petiôt changement",
index f867a5a..9174a9e 100644 (file)
        "resettokens-watchlist-token": "Token för webfeed (Atom/RSS) mä [[Special:Watchlist|feranrangen faan sidjen, diar dü uun't uug behual wel]]",
        "resettokens-done": "Tokems san turagsaat wurden.",
        "resettokens-resetbutton": "Enkelt tokens turagsaat",
-       "bold_sample": "Fäät buksteewen",
-       "bold_tip": "Fäät buksteewen",
-       "italic_sample": "Kursiif buksteewen",
-       "italic_tip": "Kursiif buksteewen",
-       "link_sample": "Link-tekst",
-       "link_tip": "Intern ferwisang",
-       "extlink_sample": "http://www.example.com link-tekst",
-       "extlink_tip": "Ekstern ferwisang (seenk am http:// prefix)",
-       "headline_sample": "Auerskraft (grate 2)",
-       "headline_tip": "Auerskraft (grate 2)",
-       "nowiki_sample": "Ünformatiaret tekst diar tusaat.",
-       "nowiki_tip": "Ünformatiaret tekst",
-       "image_tip": "Iinbünjen datei",
-       "media_tip": "Meediendatei-link",
-       "sig_tip": "Din onerskraft mä tidjstempel",
-       "hr_tip": "Horisontaal streg (ei auerdriiw diarmä)",
        "summary": "Tuupfaadet:",
        "subject": "Teemo:",
        "minoredit": "Det as man en letj feranrang",
index ac4eedc..8316338 100644 (file)
        "resetpass-submit-cancel": "Scancele",
        "passwordreset": "Azere la password",
        "passwordreset-username": "Non utent:",
-       "bold_sample": "Test in gruessut",
-       "bold_tip": "Test in gruessut",
-       "italic_sample": "Test in corsîf",
-       "italic_tip": "Test in corsîf",
-       "link_sample": "Titul dal leam",
-       "link_tip": "Leams internis",
-       "extlink_sample": "http://www.example.com titul leam",
-       "extlink_tip": "Leam esterni (visiti dal prefìs http://)",
-       "headline_sample": "Test dal titul",
-       "headline_tip": "Titul di nivel 2",
-       "nowiki_sample": "Inserìs test no formatât culì",
-       "nowiki_tip": "Ignore la formatazion wiki",
-       "image_sample": "Esempli.jpg",
-       "image_tip": "Figure includude",
-       "media_sample": "Esempli.ogg",
-       "media_tip": "Leam a un file multimediâl",
-       "sig_tip": "La tô firme cun ore e date",
-       "hr_tip": "Rie orizontâl (no stâ doprâle masse spes)",
        "summary": "Somari:",
        "subject": "Argoment (intestazion):",
        "minoredit": "Chest al è un piçul cambiament",
index a0983f1..6f1c119 100644 (file)
        "resettokens-watchlist-token": "Kaai foar de webfied (Atom/RSS) fan [[Special:Watchlist|wizigings oan jo folchlistsiden]]",
        "resettokens-done": "Kaaien fernijd.",
        "resettokens-resetbutton": "Selektearre kaaien fernije",
-       "bold_sample": "Fette tekst",
-       "bold_tip": "Fette tekst",
-       "italic_sample": "Skeane tekst",
-       "italic_tip": "Skeane tekst",
-       "link_sample": "Link titel",
-       "link_tip": "Ynterne ferwizing",
-       "extlink_sample": "http://www.example.com linktekst",
-       "extlink_tip": "Eksterne link (ferjit http:// net)",
-       "headline_sample": "Koptekst",
-       "headline_tip": "Underkopke",
-       "nowiki_sample": "Foechje hjir platte tekst yn",
-       "nowiki_tip": "Wiki-opmaak negearje",
-       "image_sample": "Foarbyld.jpg",
-       "image_tip": "Mediabestân",
-       "media_tip": "Link nei bestân",
-       "sig_tip": "Jo sinjatuer mei dei en oere",
-       "hr_tip": "Horizontale line (mei ferdrach brûke)",
        "summary": "Gearfetting:",
        "subject": "Underwerp:",
        "minoredit": "Dit is fan lytse betsjutting",
index 88103d8..d075bdc 100644 (file)
        "passwordreset-email": "Seoladh ríomhphoist:",
        "changeemail-none": "(neamhní)",
        "changeemail-password": "D'fhocal faire {{SITENAME}}:",
-       "bold_sample": "Cló trom",
-       "bold_tip": "Cló trom",
-       "italic_sample": "Cló iodálach",
-       "italic_tip": "Cló iodálach",
-       "link_sample": "Teideal an naisc",
-       "link_tip": "Nasc inmheánach",
-       "extlink_sample": "http://www.example.com ainm naisc",
-       "extlink_tip": "Nasc seachtrach (cuimhnigh an réimír http://)",
-       "headline_sample": "Cló ceannlíne",
-       "headline_tip": "Ceannlíne Leibhéil 2",
-       "nowiki_sample": "Cuir téacs neamhfhormáidithe anseo",
-       "nowiki_tip": "Cuir vicífhormáidiú ar ceal",
-       "image_sample": "Sámpla.jpg",
-       "image_tip": "Íomhá leabaithe",
-       "media_sample": "Sámpla.ogg",
-       "media_tip": "Nasc do chomhad meáin",
-       "sig_tip": "Do shíniú le stampa ama",
-       "hr_tip": "Líne cothrománach (inúsáidte go coigilteach)",
        "summary": "Achoimriú:",
        "subject": "Ábhar/ceannlíne:",
        "minoredit": "Is mionathrú é seo",
index 9ac4cb6..1a16d7b 100644 (file)
        "loginlanguagelabel": "Dil: $1",
        "retypenew": "Eni parolu tekrar girin",
        "resetpass_forbidden": "Saytında parol yok nicä diiştirilsin",
-       "bold_sample": "Kalın tekst",
-       "bold_tip": "Kalın tekst",
-       "italic_sample": "İtalik tekst",
-       "italic_tip": "İtalik tekst",
-       "link_sample": "Sayfanın adı",
-       "link_tip": "İç baalantı",
-       "extlink_sample": "http://www.example.com adres adı",
-       "extlink_tip": "Dış baalantı (Unutmayın adresin önüne http:// koymaa)",
-       "headline_sample": "Başlık teksti",
-       "headline_tip": "2. düzey başlık",
-       "nowiki_sample": "Serbest format yazınızı buraya yazınız",
-       "nowiki_tip": "Wiki formatlamasını ignor et",
-       "image_tip": "Pätret eklemää",
-       "media_tip": "Faylına baalantı",
-       "sig_tip": "İmzanız hem data",
-       "hr_tip": "Gorizontal liniya (çok sık kullanmayın)",
        "summary": "Kısaca:",
        "subject": "Konu/başlık:",
        "minoredit": "Küçük diişilmäkler",
index 29a361e..6abecec 100644 (file)
        "resetpass_forbidden": "到{{SITENAME}}上改伓正密码",
        "resetpass-submit-loggedin": "设过帐户密码",
        "resetpass-submit-cancel": "取消",
-       "bold_sample": "粗体字",
-       "bold_tip": "粗体字",
-       "italic_sample": "斜体字",
-       "italic_tip": "斜体字",
-       "link_sample": "链接标题",
-       "link_tip": "内部链接",
-       "extlink_sample": "http://www.example.com 链接标题",
-       "extlink_tip": "外部链接(头上加 http://)",
-       "headline_sample": "标题文字",
-       "headline_tip": "二级标题",
-       "nowiki_sample": "到个首扻入非格式文本",
-       "nowiki_tip": "扻入非格式文本",
-       "image_tip": "扻进文件",
-       "media_tip": "档案链接",
-       "sig_tip": "倷带时间𠮶签名",
-       "hr_tip": "横线 (好生使用)",
        "summary": "摘要:",
        "subject": "主题/头条:",
        "minoredit": "个系只细修改",
index e7cd619..0b339ac 100644 (file)
        "resetpass_forbidden": "到{{SITENAME}}上改伓正密碼",
        "resetpass-submit-loggedin": "設過帳戶密碼",
        "resetpass-submit-cancel": "取消",
-       "bold_sample": "粗體字",
-       "bold_tip": "粗體字",
-       "italic_sample": "斜體字",
-       "italic_tip": "斜體字",
-       "link_sample": "連結標題",
-       "link_tip": "內部連結",
-       "extlink_sample": "http://www.example.com 連結標題",
-       "extlink_tip": "外部連結(頭上加 http://)",
-       "headline_sample": "標題文字",
-       "headline_tip": "二級標題",
-       "nowiki_sample": "到箇首扻入非格式文本",
-       "nowiki_tip": "扻入非格式文本",
-       "image_tip": "扻進文件",
-       "media_tip": "檔案連結",
-       "sig_tip": "汝帶時間嗰簽名",
-       "hr_tip": "橫線 (好生使用)",
        "summary": "摘要:",
        "subject": "主題/頭條:",
        "minoredit": "箇係隻細修改",
index 058d0ad..c55dcd0 100644 (file)
        "resettokens-watchlist-token": "Jéton pou flux (Atom/RSS) web di [[Special:Watchlist|modifikasyon di paj di zòt lis di swivi]]",
        "resettokens-done": "Jéton réynisyalizé.",
        "resettokens-resetbutton": "Réynisyalizé jéton-yan ki sélègsyonnen",
-       "bold_sample": "Tègs gra",
-       "bold_tip": "Tègs gra",
-       "italic_sample": "Tègs italik",
-       "italic_tip": "Tègs italik",
-       "link_sample": "Tit di yannaj",
-       "link_tip": "Yannaj entèrn",
-       "extlink_sample": "http://www.example.com/ tit di yannaj",
-       "extlink_tip": "Yannaj èstèrn (pa bliyé préfigs-a http://)",
-       "headline_sample": "Tègs di tit",
-       "headline_tip": "Titit nivèl 2",
-       "nowiki_sample": "Rantré tègs-a ki pa fòrmaté isi",
-       "nowiki_tip": "Ignoré sentags wiki-a",
-       "image_tip": "Fiché enséré",
-       "media_tip": "Yannaj bò'd roun fiché médja",
-       "sig_tip": "Zòt signatir ké dat",
-       "hr_tip": "Lign orizontal (pa an abizé)",
        "summary": "Rézimen :",
        "subject": "Sijè :",
        "minoredit": "Sa modifikasyon sa minò.",
index a025c24..f27c961 100644 (file)
        "resettokens-watchlist-token": "Tòcan airson an inbhir-lìn (Atom/RSS) a sheallas dhut [[Special:Watchlist|atharraichean air duilleagan a tha air a' chlàr-fhaire agad]]",
        "resettokens-done": "Chaidh na tòcanan ath-shuidheachadh.",
        "resettokens-resetbutton": "Ath-shuidhich na tòcanan a chaidh a thaghadh",
-       "bold_sample": "Teacs trom",
-       "bold_tip": "Teacs trom",
-       "italic_sample": "Teacsa Eadailteach",
-       "italic_tip": "Teacsa Eadailteach",
-       "link_sample": "Tiotal a' cheangail",
-       "link_tip": "Ceangal am broinn na làraich",
-       "extlink_sample": "http://www.example.com tiotal a' cheangail",
-       "extlink_tip": "Ceangal dhan taobh a-muigh (cuimhnich an ro-leasachan http://)",
-       "headline_sample": "Teacsa ceann-loidhne",
-       "headline_tip": "Ceann-loidhne ìre 2",
-       "nowiki_sample": "Cuir a-steach teacsa gun fhòrmatadh an-seo",
-       "nowiki_tip": "Leig seachad fòrmatadh uicidh",
-       "image_sample": "Eisimpleir.jpg",
-       "image_tip": "Faidhle air a leabachadh",
-       "media_sample": "Eisimpleir.ogg",
-       "media_tip": "Ceangal faidhle",
-       "sig_tip": "D' ainm sgrìobhte le stampa-ama",
-       "hr_tip": "Loidhne rèidh (na cleachd ro thric e)",
        "summary": "Gearr-chunntas:",
        "subject": "Cuspair:",
        "minoredit": "Seo mùthadh beag",
index d8dffa5..3ad54a4 100644 (file)
@@ -76,6 +76,7 @@
        "tog-useeditwarning": "Avisar ao deixar unha páxina de edición cos cambios sen gardar",
        "tog-prefershttps": "Utilizar sempre unha conexión segura para acceder ao sistema",
        "tog-showrollbackconfirmation": "Amosar unha mensaxe de confirmación ó facer clic nunha ligazón de reversión",
+       "tog-requireemail": "É necesario un correo electrónico para reinicializar os contrasinais",
        "underline-always": "Sempre",
        "underline-never": "Nunca",
        "underline-default": "Opción predeterminada da aparencia ou do navegador",
        "createaccountmail": "Utilizar un contrasinal aleatorio temporal e envialo ao enderezo de correo electrónico especificado",
        "createaccountmail-help": "Pode usarse para crear unha conta para outra persoa sen coñecer o contrasinal.",
        "createacct-realname": "Nome real (opcional)",
-       "createacct-reason": "Motivo",
+       "createacct-reason": "Motivo (rexistrado publicamente)",
        "createacct-reason-ph": "Por que crea outra conta?",
        "createacct-reason-help": "Mensaxe amosada no rexistro de creación de contas",
        "createacct-submit": "Crear a conta",
        "resettokens-watchlist-token": "Pase para a fonte de novas (Atom/RSS) web dos [[Special:Watchlist|cambios feitos nas páxinas da súa lista de vixilancia]]",
        "resettokens-done": "Restablecéronse os pases.",
        "resettokens-resetbutton": "Restablecer os pases seleccionados",
-       "bold_sample": "Texto en letra grosa",
-       "bold_tip": "Texto en letra grosa",
-       "italic_sample": "Texto en cursiva",
-       "italic_tip": "Texto en cursiva",
-       "link_sample": "Título da ligazón",
-       "link_tip": "Ligazón interna",
-       "extlink_sample": "http://www.exemplo.com título da ligazón",
-       "extlink_tip": "Ligazón externa (lembre o prefixo http://)",
-       "headline_sample": "Texto de cabeceira",
-       "headline_tip": "Cabeceira de nivel 2",
-       "nowiki_sample": "Insira aquí un texto sen formato",
-       "nowiki_tip": "Ignorar o formato wiki",
-       "image_sample": "Exemplo.jpg",
-       "image_tip": "Ficheiro incorporado",
-       "media_sample": "Exemplo.ogg",
-       "media_tip": "Ligazón a un ficheiro",
-       "sig_tip": "A súa sinatura con data e hora",
-       "hr_tip": "Liña horizontal (úsea con moderación)",
        "summary": "Resumo:",
        "subject": "Asunto:",
        "minoredit": "Esta é unha edición pequena",
        "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-ids": "Identificadores de bloqueo relevantes: $1 (o seu enderezo IP pode atoparse tamén nalgunha lista negra)",
        "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.",
        "nocreate-loggedin": "Non ten os permisos necesarios para crear páxinas novas.",
        "sectioneditnotsupported-title": "A edición de seccións non está soportada",
        "sectioneditnotsupported-text": "A edición de seccións non está soportada nesta páxina.",
+       "modeleditnotsupported-title": "Non se permite a edición",
+       "modeleditnotsupported-text": "Non se admite a edición no modelo de contidos $1.",
        "permissionserrors": "Erro de permisos",
        "permissionserrorstext": "Non ten os permisos necesarios para facelo {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "permissionserrorstext-withaction": "Non ten os permisos necesarios para $2, {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "content-model-json": "JSON",
        "content-json-empty-object": "Obxecto baleiro",
        "content-json-empty-array": "Matriz baleira",
+       "unsupported-content-model": "<strong>Atención:</strong> nesta wiki non se admite o modelo de contidos $1.</strong>",
+       "unsupported-content-diff": "Non se admiten as diferenzas entre edicións no modelo de contidos $1.",
+       "unsupported-content-diff2": "As diferenzas entre edicións dos modelos de contido $1 e $2 non están soportadas nesta wiki.",
        "deprecated-self-close-category": "Páxinas que usan etiquetas HTML de auto-pechado non válidas",
        "deprecated-self-close-category-desc": "A páxina contén algunha etiqueta HTML de auto-pechado non válida, como <code>&lt;b/></code> ou <code>&lt;span/></code>. O comportamento destas etiquetas vai cambiar axiña para gardar a consistencia coa especificación HTML5, polo que cómpre desbotar o seu uso no texto wiki.",
        "duplicate-args-warning": "<strong>Atención:</strong> \"[[:$1]]\" está chamando a \"[[:$2]]\" con máis dun valor para o parámetro \"$3\". Só se usará o último valor proporcionado.",
        "undo-norev": "A edición non se pode desfacer porque non existe ou foi eliminada.",
        "undo-nochange": "Semella que alguén xa desfixo a edición.",
        "undo-summary": "Desfíxose a edición $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]])",
+       "undo-summary-anon": "Desfacer a modificación $1 de [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Desfíxose a edición $1 dun usuario agochado",
        "cantcreateaccount-text": "A creación de contas desde este enderezo IP ('''$1''') foi bloqueada por [[User:$3|$3]].\n\nA razón dada por $3 foi ''$2''",
        "cantcreateaccount-range-text": "O usuario [[User:$3|$3]] bloqueou a creación de contas desde enderezos IP no rango <strong>$1</strong>, no que se atopa o seu enderezo IP (<strong>$4</strong>).\n\nA razón que deu $3 foi <em>$2</em>.",
        "search-interwiki-more": "(máis)",
        "search-interwiki-more-results": "máis resultados",
        "search-relatedarticle": "Relacionado",
+       "search-invalid-sort-order": "A ordenación $1 non está recoñecida, aplicarase a ordenación por defecto. As ordenacións válidas sonː $2",
+       "search-unknown-profile": "No se recoñece o perfil de procura $1; aplicarase o perfil predeterminado.",
        "searchrelated": "relacionado",
        "searchall": "todo",
        "showingresults": "{{PLURAL:$1|Móstrase <strong>1</strong> resultado|Móstranse <strong>$1</strong> resultados}}, comezando polo número <strong>$2</strong>.",
        "prefs-help-email": "O enderezo de correo electrónico é opcional, pero permite que se lle envíe un contrasinal novo se se esquece del.",
        "prefs-help-email-others": "Tamén pode optar por deixar que outras persoas se poñan en contacto con vostede a través dunha ligazón na súa páxina de usuario e de conversa.\nO seu enderezo non se revela cando contacten con vostede.",
        "prefs-help-email-required": "Cómpre o enderezo de correo electrónico.",
+       "prefs-help-requireemail": "Se está marcado, só enviará correos electrónicos de restablecemento de contrasinal se a persoa que fai o reinicio proporcionou un nome de usuario e correo electrónico para esta conta.",
        "prefs-info": "Información básica",
        "prefs-i18n": "Internacionalización",
        "prefs-signature": "Sinatura",
        "right-editmyusercss": "Editar os ficheiros CSS propios",
        "right-editmyuserjson": "Editar os ficheiros JSON do propio usuario",
        "right-editmyuserjs": "Editar os ficheiros JavaScript propios",
+       "right-editmyuserjsredirect": "Editar os seus propios ficheios JavaScript de usuario cando sexan redireccións",
        "right-viewmywatchlist": "Ver a lista de vixilancia propia",
        "right-editmywatchlist": "Editar a lista de vixilancia propia. Teña en conta que algunhas accións engadirán páxinas igualmente mesmo sen este dereito.",
        "right-viewmyprivateinfo": "Ver os datos privados propios (por exemplo, o enderezo de correo electrónico ou o nome real)",
        "action-editmyusercss": "editar os ficheiros CSS propios",
        "action-editmyuserjson": "editar os ficheiros JSON propios",
        "action-editmyuserjs": "editar os ficheiros JavaScript propios",
+       "action-editmyuserjsredirect": "editar os seus proprios ficheiros JavaScript de usuario que son redireccións",
        "action-viewsuppressed": "ver revisións agochadas de calquera usuario",
        "action-hideuser": "bloquear un nome de usuario, agochándoo do público",
        "action-ipblock-exempt": "evitar bloqueos de IPs, autobloqueos e bloqueos de rango",
        "backend-fail-contenttype": "Non se puido determinar o tipo de contido do ficheiro a almacenar en \"$1\".",
        "backend-fail-batchsize": "O sistema de almacenamento recibiu un feixe de $1 {{PLURAL:$1|operación|operacións}} de ficheiro; o límite está en $2 {{PLURAL:$2|operación|operacións}}.",
        "backend-fail-usable": "Non se puido ler ou escribir o ficheiro \"$1\" debido a que os permisos son insuficientes ou faltan os directorios/contenedores.",
+       "backend-fail-stat": "Non se puido ler o estado do ficheiro \"$1\".",
+       "backend-fail-hash": "Non se puido determinar o resumo criptográfico do ficheiro \"$1\".",
        "filejournal-fail-dbconnect": "Non se pode conectar coa base de datos do rexistro do sistema de almacenamento \"$1\".",
        "filejournal-fail-dbquery": "Non se pode actualizar a base de datos do rexistro do sistema de almacenamento \"$1\".",
        "lockmanager-notlocked": "Non se puido desbloquear \"$1\". Non está bloqueado.",
        "alreadyrolled": "Non se pode desfacer a edición en \"[[:$1]]\" feita por [[User:$2|$2]] ([[User talk:$2|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); alguén máis editou ou desfixo os cambios desta páxina.\n\nA última edición fíxoa [[User:$3|$3]] ([[User talk:$3|conversa]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O resumo de edición foi: <em>$1</em>.",
        "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
+       "revertpage-anon": "Revertidas as modificacións de [[Special:Contributions/$2|$2]] á última versión de [[User:$1|$1]]",
        "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Desfixéronse as edicións de {{GENDER:$3|$1}};\nvolveuse á última edición, feita por {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPor favor, volva enviar o formulario.",
        "changecontentmodel": "Cambiar o modelo de contido dunha páxina",
        "changecontentmodel-legend": "Cambiar o modelo de contido",
-       "changecontentmodel-title-label": "Título da páxina",
-       "changecontentmodel-model-label": "Novo modelo de contido",
+       "changecontentmodel-title-label": "Título da páxinaː",
+       "changecontentmodel-current-label": "Modelo de contido actual:",
+       "changecontentmodel-model-label": "Novo modelo de contidoː",
        "changecontentmodel-reason-label": "Motivo:",
        "changecontentmodel-submit": "Cambiar",
        "changecontentmodel-success-title": "Modificouse o modelo de contido",
        "ipblocklist-legend": "Procurar un usuario bloqueado",
        "blocklist-userblocks": "Agochar os bloqueos de contas",
        "blocklist-tempblocks": "Agochar os bloqueos temporais",
+       "blocklist-indefblocks": "Ocultar os bloqueos indefinidos",
        "blocklist-addressblocks": "Agochar os bloqueos a enderezos IP únicos",
        "blocklist-type": "Tipo:",
        "blocklist-type-opt-all": "Todos",
        "block-log-flags-angry-autoblock": "realzou o autobloqueo permitido",
        "block-log-flags-hiddenname": "nome de usuario agochado",
        "range_block_disabled": "A funcionalidade de administrador de crear rangos de bloqueos está deshabilitada.",
+       "ipb-prevent-user-talk-edit": "Débese permitir editar a propia páxina de conversa nun bloqueo parcial, agás que inclúa unha restrición no espazo de nomes \"Usuario conversa\".",
        "ipb_expiry_invalid": "O tempo de duración non é válido.",
        "ipb_expiry_old": "O tempo de expiración é no pasado.",
        "ipb_expiry_temp": "Os bloqueos a nomes de usuario agochados deberían ser permanentes.",
        "move-page-legend": "Mover unha páxina",
        "movepagetext": "Ao usar o formulario inferior vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.\nO título vello vaise converter nunha páxina de redirección ao novo título.\nPode actualizar automaticamente as redireccións que van dar ao título orixinal.\nSe escolle non facelo, asegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].\nVostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.\n\nTeña en conta que a páxina <strong>non</strong> será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.\nIsto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.\n\n<strong>Nota:</strong>\nEste cambio nunha páxina popular pode ser drástico e inesperado;\npor favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
        "movepagetext-noredirectfixer": "Ao usar o formulario inferior vai cambiar o nome da páxina, movendo todo o seu historial ao novo nome.\nO título vello vaise converter nunha páxina de redirección ao novo título.\nAsegúrese de verificar que non hai redireccións [[Special:DoubleRedirects|dobres]] ou [[Special:BrokenRedirects|crebadas]].\nVostede é responsable de asegurarse de que as ligazóns continúan a apuntar cara a onde se supón que deberían.\n\nTeña en conta que a páxina <strong>non</strong> será trasladada se xa existe unha páxina co novo título, a menos que esta última sexa unha redirección e non teña historial de edicións.\nIsto significa que pode volver renomear unha páxina ao seu nome antigo se comete un erro, e que non pode sobrescribir unha páxina que xa existe.\n\n<strong>Nota:</strong>\nEste cambio nunha páxina popular pode ser drástico e inesperado;\npor favor, asegúrese de que entende as consecuencias disto antes de proseguir.",
+       "movepagetext-noredirectsupport": "Ó usar o seguinte formulario, renomearase unha páxina e trasladarase todo o seu historial ó novo nome.\nÉ responsable de asegurarse de que tódalas ligazóns tralo traslado seguen apuntando cara onde deberían.\n\nLembre que a páxina <strong>non</strong> se trasladará se xa existe unha páxina co título novo.\nIsto significa que poderá renomear unha páxina ó seu título orixinal se cometeu un erro, pero non poderá sobrescribir unha páxina existente.\n\n<strong>Nota:</strong>\nEste pode ser un cambio drástico e inesperado para unha páxina popular;\nasegúrese de entender as consecuencias antes de seguir adiante.",
        "movepagetalktext": "Se marca esta caixa, a páxina de conversa asociada moverase automaticamente ó título novo a menos que xa exista unha páxina de conversa non baleira alí.\n\nNeste caso, deberá trasladar ou fusionar manualmente a páxina se así o desexa.",
        "moveuserpage-warning": "'''Aviso:''' Está a piques de mover unha páxina de usuario. Por favor, teña en conta que só se trasladará a páxina e que o usuario '''non''' será renomeado.",
        "movecategorypage-warning": "'''Aviso:''' Está a piques de mover unha páxina de categoría. Por favor, teña en conta que só se trasladará a páxina e que as páxinas presentes na categoría vella '''non''' serán recategorizadas na categoría nova.",
        "move-subpages": "Mover as subpáxinas (ata $1)",
        "move-talk-subpages": "Mover as subpáxinas da páxina de conversa (ata $1)",
        "movepage-page-exists": "A páxina \"$1\" xa existe e non pode ser sobrescrita automaticamente.",
+       "movepage-source-doesnt-exist": "A páxina $1 non existe polo que non pode ser trasladada.",
        "movepage-page-moved": "A páxina \"$1\" foi movida a \"$2\".",
        "movepage-page-unmoved": "A páxina \"$1\" non pode ser movida a \"$2\".",
        "movepage-max-pages": "Foi movido o número máximo {{PLURAL:$1|dunha páxina|de $1 páxinas}} e non poderán ser movidas automaticamente máis.",
        "delete_and_move_reason": "Eliminado para facer sitio para mover \"[[$1]]\"",
        "selfmove": "O título é o mesmo; \nnon se pode mover unha páxina sobre si mesma.",
        "immobile-source-namespace": "Non se poden mover as páxinas que están no espazo de nomes \"$1\"",
+       "immobile-source-namespace-iw": "Non é posible trasladar páxinas doutras wikis dende esta.",
        "immobile-target-namespace": "Non se poden mover as páxinas ao espazo de nomes \"$1\"",
        "immobile-target-namespace-iw": "A ligazón interwiki non é válida para o movemento da páxina.",
        "immobile-source-page": "Esta páxina non se pode mover.",
        "immobile-target-page": "Non se pode mover a ese título.",
+       "movepage-invalid-target-title": "O nome solicitado non é válido.",
        "bad-target-model": "O destino desexado utiliza un modelo de contido diferente. Non se pode facer a conversión entre $1 e $2.",
        "imagenocrossnamespace": "Non se pode mover o ficheiro a un espazo de nomes que non o admite",
        "nonfile-cannot-move-to-file": "Non se pode mover algo que non é un ficheiro ao espazo de nomes reservado aos ficheiros",
        "tooltip-pt-watchlist": "A lista de páxinas cuxas modificacións está a seguir",
        "tooltip-pt-mycontris": "Lista das súas contribucións",
        "tooltip-pt-anoncontribs": "Unha lista das modificacións feitas desde este enderezo IP",
-       "tooltip-pt-login": "Recoméndaselle rexistrarse, se ben non é obrigatorio",
+       "tooltip-pt-login": "É recomendable que se rexistre, se ben non é obrigatorio",
        "tooltip-pt-login-private": "Precisa conectarse para usa esta wiki",
        "tooltip-pt-logout": "Saír ao anonimato",
-       "tooltip-pt-createaccount": "Recoméndaselle crear unha conta e acceder ao sistema, se ben non é obrigatorio",
+       "tooltip-pt-createaccount": "É recomendable que cree unha conta e acceda ao sistema, se ben non é obrigatorio",
        "tooltip-ca-talk": "Conversa acerca do contido desta páxina",
        "tooltip-ca-edit": "Edite esta páxina",
        "tooltip-ca-addsection": "Comezar unha nova sección",
        "tooltip-p-logo": "Visitar a páxina principal",
        "tooltip-n-mainpage": "Visitar a páxina principal",
        "tooltip-n-mainpage-description": "Visitar a páxina principal",
-       "tooltip-n-portal": "Información acerca do proxecto, o que pode facer e os lugares onde atopar as cousas",
+       "tooltip-n-portal": "Información acerca do proxecto, do que pode facer e dos lugares onde atopar as cousas",
        "tooltip-n-currentevents": "Información acerca de acontecementos de actualidade",
        "tooltip-n-recentchanges": "A lista de modificacións recentes no wiki",
        "tooltip-n-randompage": "Cargar unha páxina ao chou",
        "linkaccounts": "Vincular contas",
        "linkaccounts-success-text": "A conta foi vinculada.",
        "linkaccounts-submit": "Vincular contas",
+       "cannotunlink-no-provider-title": "Non hai contas ligadas a desligar",
+       "cannotunlink-no-provider": "Non hai contas ligadas que poidan desligarse.",
        "unlinkaccounts": "Desvincular contas",
        "unlinkaccounts-success": "A conta foi desvinculada.",
        "authenticationdatachange-ignored": "Os cambios de datos de autenticación non foron xerados. Está configurado o provedor?",
        "edit-error-short": "Erro: $1",
        "edit-error-long": "Erros:\n\n$1",
        "specialmute": "Silenciar",
-       "specialmute-success": "As súas preferencias de silenciamento foron actualizadas. Ver todos os usuarios silenciados en [[Special:Preferences]].",
+       "specialmute-success": "As súas preferencias de silenciamento foron actualizadas. Ver todos os usuarios silenciados nas súas [[Special:Preferences|preferencias]].",
        "specialmute-submit": "Confirmar",
        "specialmute-label-mute-email": "Silenciar os correos electrónicos deste usuario",
-       "specialmute-header": "Por favor, seleccione as súas preferencias de silenciamento para <b>{{BIDI:[[User:$1]]}}</b>.",
+       "specialmute-header": "Por favor, seleccione as súas preferencias de silenciamento para o usuario <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Non se atopou o nome de usuario indicado.",
-       "specialmute-email-footer": "Para xestionar as preferencias de correo electrónico de {{BIDI:$2}}, por favor,  visite <$1>.",
+       "specialmute-error-no-options": "As funcionalidades de silenciamento non están dispoñibles. Isto pode ser porque: non confirmou o seu enderezo de correo electrónico ou o administrador da wiki desactivou as funcionalidades de correo electrónico e/ou a lista negra de enderezos de correo electrónico para esta wiki.",
+       "specialmute-email-footer": "Para xestionar as preferencias de correo electrónico do usuario {{BIDI:$2}}, por favor,  visite <$1>.",
        "specialmute-login-required": "Por favor, inicie sesión para alterar as súas preferencias de silenciamento.",
+       "mute-preferences": "Preferencias de silenciamento",
        "revid": "revisión $1",
        "pageid": "identificador de páxina $1",
        "interfaceadmin-info": "$1\n\nOs permisos para editar os ficheiros CSS/JS/JSON globais separáronse recentemente do dereito <code>editinterface</code>. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "O contrasinal non pode estar na lista dos 100.000 contrasinais máis usados.",
        "passwordpolicies-policyflag-forcechange": "debe modificarse ó iniciar sesión",
        "passwordpolicies-policyflag-suggestchangeonlogin": "suxerir cambio ó iniciar sesión",
+       "mycustomjsredirectprotected": "Non ten permiso para editar esta páxina JavaScript porque é unha redirección e non apunta cara ó seu propio espazo de usuario.",
        "easydeflate-invaliddeflate": "O contido fornecido non está debidamente comprimido",
        "unprotected-js": "Por motivos de seguridade non se pode cargar JavaScript desde páxinas non protexidas. Por favor, cree só JavaScript no espazo de nomes MediaWiki ou como subpáxina de usuario",
        "userlogout-continue": "Quere rematar a sesión?"
index 890a16c..843b980 100644 (file)
        "passwordreset-emailelement": "کارگيري نؤم: \n$1\n\nمؤوقتي رمز: \n$2",
        "changeemail-newemail": "تازه ايميلˇ آدرس:",
        "changeemail-none": "(هيچ)",
-       "bold_sample": "پۊررنگˇ وؤت",
-       "bold_tip": "پۊررنگˇ وؤت",
-       "italic_sample": "کجˇ وؤت",
-       "italic_tip": "کجˇ وؤت",
-       "link_sample": "خالˇ تيتر",
-       "link_tip": "دۊيريني خال",
-       "extlink_sample": "http://www.example.com خالˇ تيتر",
-       "extlink_tip": "بيريني خال (http://‎ پيشونده ىادانکۊنين)",
-       "headline_sample": "تيترˇ وؤت",
-       "headline_tip": "سطحˇ ۲ˇ تيتر",
-       "nowiki_sample": "قالب-بندي نۊبؤ وؤت ائره واردأبي",
-       "image_tip": "وؤتˇ مئنˇ تصوير",
-       "media_tip": "فاىلˇ خال",
-       "sig_tip": "شيمي ايمضا ؤ زمتˇ برچسب",
-       "hr_tip": "اؤفؤقي خط (اۊن أجي کم کارأگيرين)",
        "summary": "فيچالسه:",
        "minoredit": "اي نيميزگره دچينواچينه",
        "watchthis": "اي ولگه پى بگير",
index 9faad52..3f68f63 100644 (file)
@@ -13,7 +13,8 @@
                        "The Discoverer",
                        "Cliffa fernandes",
                        "Rxy",
-                       "Isidore Dantas"
+                       "Isidore Dantas",
+                       "Abijeet Patro"
                ]
        },
        "tog-hideminor": "हालींच बदल केल्ल्यांतले बारीक संपादन लिपय",
        "tog-previewonfirst": "पयल्याच संपादनाचेर पुर्वनियाळ दाखय",
        "tog-enotifwatchlistpages": "म्हज्या सादुरवळेरेंतलें पान वा फायल बदल्ली जाल्यार म्हाका इमेल करात",
        "tog-shownumberswatching": "ध्यान दवरपी वांगड्यांची संख्या दाखय",
-       "tog-oldsig": "सद्याची निशाणी",
-       "tog-uselivepreview": "लायव à¤ªà¥\81रà¥\8dवनियाळाà¤\9aà¥\8b à¤µà¤¾à¤ªà¤°",
+       "tog-oldsig": "तà¥\81à¤\9cà¥\8dया à¤¸à¤§्याची निशाणी",
+       "tog-uselivepreview": "पान à¤ªà¤°à¤¤ à¤\89à¤\97डनासताना à¤\9dलà¤\95 à¤¦à¤¾à¤\96य",
        "tog-watchlisthideown": "सादुरवळेरीतलें म्हजे संपादन लिपय",
        "tog-watchlisthidebots": "ध्यानसुचीतले रोबोट संपादन लिपय",
        "tog-watchlisthideminor": "सादुरवळेरीतले ल्हान संपादन लिपय",
        "tog-showhiddencats": "लिपोवन दवरिल्ले विभाग दाखय",
        "underline-always": "सदा (केधन्नय) (केन्नय)",
        "underline-never": "केधन्नयना (केन्नना)",
-       "underline-default": "बà¥\8dराà¤\89à¤\9c़र à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dà¤\9f",
+       "underline-default": "सà¥\8dà¤\95à¥\80न à¤µà¤¾ à¤¬à¥\8dरावसरा à¤ªà¥\8dरमाणà¥\87à¤\82",
        "sunday": "आयतार",
        "monday": "सोमार",
        "tuesday": "मंगळार",
        "category_header": "\"$1\" ह्या वर्गातलीं पानां",
        "subcategories": "उपवर्ग",
        "category-media-header": "\"$1\" वर्गातलें प्रसार माध्यम",
+       "category-empty": "<em>ह्या वर्गान सध्या एकूय पान वा माध्यम ना.</em>",
        "hidden-categories": "{{PLURAL:$1|लिपिल्लें वर्ग|लिपिल्लें वर्ग }}",
        "hidden-category-category": "लिपयिल्ले विभाग",
        "category-subcat-count": "{{PLURAL:$2|ह्या वर्गान फकत सकयल दिल्ले उपविभाग आसात.|ह्या वर्गातल्या $2 वट्ट {{PLURAL:$1|सकयल दिल्ले उपवर्ग आसात.|$1सकयल दिल्ले उपवर्ग आसात.}}}}",
        "category-article-count": "{{PLURAL:$2|ह्या वर्गांत सकयल दिल्लीं पानां आसात.|ह्या वर्गांत सकलय दिल्लीं {{PLURAL:$1|पानां आसात|$1 पानां आसात}}, वट्ट पानां $2}}",
        "category-file-count": "{{PLURAL:$2|ह्या वर्गांत फकत सकयली फायल आसपावता.|ह्या वर्गांत सकयल दिल्लीं {{PLURAL:$1|फायल|$1 फायलीं}} आसता, वट्ट फायलीं $2}}",
        "listingcontinuesabbrev": "चालू.",
-       "noindex-category": "बिननिर्देशांकी पानां",
+       "noindex-category": "सुचीपत्रान जोडूंक-नासलेलीं पानां",
+       "broken-file-category": "तुटलेल्या फायलींचो दुवे आसलेलीं पानां",
        "about": "विशीं",
        "article": "मजकूराचीं पानां",
        "newwindow": "(नव्या ज़ोणेलांत उकतें जाता)",
        "cancel": "रद्द करात",
        "moredotdotdot": "आनीक",
-       "morenotlisted": "हà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤ªà¥\82रà¥\8dण à¤¨à¤¾",
+       "morenotlisted": "हà¥\80 à¤¸à¥\81à¤\9aà¥\80 à¤ªà¥\82रà¥\8dण à¤¨à¤¾à¤¸à¥\82à¤\82à¤\95 à¤¶à¤\95à¥\8dता.",
        "mypage": "पान",
        "mytalk": "चर्चा",
        "navigation": "दिशा-नियंत्रण",
        "poolcounter-usage-error": "उपयोगी त्रुटि: $1",
        "aboutsite": "{{SITENAME}}विशीं",
        "aboutpage": "Project:विशीं",
+       "copyright": "मजकूर $1 हाच्या खाला उपलब्ध आसा खेरीज हेर नोंदी केल्या शिवाय.",
        "copyrightpage": "{{ns:project}}:प्रात-हक",
        "currentevents": "चालंत घडणुकों",
        "currentevents-url": "Project:चालंत घडणुको",
        "privacypage": "Project:गुप्ततायेचें धोरण",
        "ok": "बरें",
        "retrievedfrom": "\"$1\" चे कडल्यान परतून मेळयलें",
+       "youhavenewmessages": "{{PLURAL:$3|तुमकां}} $1 ($2) आसात.",
+       "youhavenewmessagesfromusers": "तुका {{PLURAL:$3एक वापरपी|$3 वापरपी}} कडल्यान $1 {{PLURAL:$4|आसा|आसात}} ($2).‎",
+       "newmessageslinkplural": "{{PLURAL:$1|नवो संदेश|999=नवे संदेश}}‎",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|निमाणो बदल|999=निमाणे बदल}}",
        "youhavenewmessagesmulti": "$1 चेर तुका नवो संदेश आसा",
        "editsection": "बदल",
        "editold": "बदल",
        "collapsible-expand": "विस्तार",
        "confirmable-yes": "हय",
        "confirmable-no": "ना",
-       "thisisdeleted": "पळय आनी परतून हाड 1?",
+       "thisisdeleted": "$1 पळय वा परत हाड?",
        "viewdeleted": "दाखयात $1?",
        "feedlinks": "पुरवय :",
        "feed-invalid": "चुकीचें सब्सक्रिप्शन फीड प्रकार",
        "mainpage-nstab": "मुखेल पान",
        "nosuchaction": "असले तरेचे कार्य ना",
        "nosuchspecialpage": "असले कांयच विशेश पान ना",
+       "nospecialpagetext": "<strong>तुवें एक अवैद खेरीत पान मागलां.</strong>\n\nएक खेरीत पानाची वळेरी तुका हांगासर मेळूं येता [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "चूक",
        "databaseerror": "डॅटाबॅज त्रुटी",
        "databaseerror-textcl": "डॅटाबेज विरोध त्रुटी आयिल्ली आसा",
        "databaseerror-query": "अनुरोध: $1",
        "databaseerror-error": "चूक: $1",
-       "missing-article": "डेटाबेजाक \"$1\" $2 ह्या नांवाचें जे मजकूराचें पान मेळूंक जाय आसलें तें मेळ्ळेंना. हें चड करून जेन्ना काडून उडयिल्ल्या पानाक मुजत सोंपिळ्ळे डिफ वा इतिहासाचो दुवो दिवप जाता तेन्ना घडटा..जर अशें नासत तर तुमकां सॉफ्टवेरांत चूक सांपडूंक जाय हें अँडमिनिस्ट्रेटराक URLची नोंद करून कळयात.",
+       "missing-article": "डेटाबेजाक \"$1\" $2 ह्या नांवाचें जे मजकूराचें पान मेळूंक जाय आसलें तें मेळ्ळेंना. हें चड करून जेन्ना काडून उडयिल्ल्या पानाक मुजत सोंपिळ्ळे डिफ वा इतिहासाचो दुवो दिवप जाता तेन्ना घडटा..जर अशें नासत तर तुमकां सॉफ्टवेरांत चूक सांपडूंक जाय हें अँडमिनिस्ट्रेटराक URLची नोंद करून कळयात.\n\n\nम्हायतीकोश (Database) हांतूत मेळूंक जाय आसलें तें मजकूर \"$1\" $2 मेळूंक नां.\n\nहरर्शीं, अशें एक पोरणें एक फरक वा एका पानाच्या इतिहासाचो दुवो काडून उडयला, तेन्ना जाता.\n\nअशें न्हय जाल्यार, तुका सोफ्टवेरान चूक सांपडलेया जायत.\nउपकार करून एका [[Special:ListUsers/sysop|कार्भारीच्या]] नतरेक हाड, अतरजाळ्यांत जागो सोदपी (यु. आर. एल.) हाची नोंद घेवन.",
        "missingarticle-rev": "पुनर्नियाळ $1",
        "badtitle": "चुकीचो माथाळो",
        "badtitletext": "विनवणी केल्लें पानाचो माथाळो अवैध, रितो वा अयोग्य तरेन आंतरभाशी वा आंतर विकी माथाळ्या कडे जोडिल्लो आशिल्लो. तातूंत माथाळ्यांत वापरुं नजो अशी एक वा चड अक्षरां आसूं येतात.",
        "viewsource": "उगम पळेयात",
+       "viewsource-title": "$1‎ खातीर मूळ पळय",
+       "viewsourcetext": "तुज्यान ह्या पानाचें मूळ पळोवंक आनी नकल करुंक जाता.",
        "yourname": "वापरप्याचे नांव",
        "userlogin-yourname": "वापरप्याचे नांव",
        "userlogin-yourname-ph": "वापरप्याचे नांव घालात",
        "loginerror": "लॉन इन त्रुटी",
        "createacct-error": "खातें निर्माण त्रुटी",
        "createaccounterror": "खातें तयार करूंक जायना: $1",
-       "loginsuccesstitle": "लà¥\89न à¤\87न à¤¯à¤¶à¤¸à¥\8dवà¥\80 à¤\9cालां",
+       "loginsuccesstitle": "सतà¥\8dरारà¤\82भ à¤\9cालà¥\87ं",
        "nosuchusershort": "\"$1\" ह्या नांवान कोण वापरपी ना.\nउतरां तपासून पळय",
        "nouserspecified": "वापरप्याचें नांव तुवें सांगूंक जाय",
        "login-userblocked": "ह्या वापरप्याक बंद केला. लॉग इन करूंक जायना.",
-       "wrongpassword": "à¤\9aà¥\81à¤\95िà¤\9aà¥\87à¤\82 à¤\97à¥\81पà¥\80त à¤\89तर à¤\98ातलाà¤\82.\nà¤\89पà¤\95ार à¤\95रà¥\82न à¤ªà¤°à¤¤à¥\82न यत्न कर.",
+       "wrongpassword": "à¤\9aà¥\81à¤\95à¥\80à¤\9aà¥\87à¤\82 à¤µà¤¾à¤ªà¤°à¤ªà¥\8dयाà¤\9aà¥\87à¤\82 à¤¨à¤¾à¤\82व à¤µà¤¾ à¤\97à¥\81पà¥\80तà¤\89तर à¤\98ातलाà¤\82.\nà¤\89पà¤\95ार à¤\95रà¥\82न à¤ªà¤°à¤¤à¥\82न à¤ªà¥\8dरयत्न कर.",
        "wrongpasswordempty": "गुपीत उतर घालूंक ना.\nउपकार करून परतून यत्न कर.",
        "passwordtoolong": "गुपीत उतर हाच्या परस चड व्हड आसूंक फावना{{PLURAL:$1|1 वर्ण|$1 वर्णां}}.",
        "password-name-match": "तुजें गुपीत उतर वापरप्याच्या नांवा परस वेगळें आसूंक जाय.",
        "emaildisabled": "ही साइट मेल धाडपाक शकना.",
        "accountcreated": "खातें तयाओर केलें",
        "createaccount-title": "{{SITENAME}} हाका लागून खातें तयार केलां",
-       "login-abort-generic": "तà¥\81मà¤\9aà¥\87à¤\82 à¤²à¥\89à¤\97 à¤\87न à¤\85पà¥\87शà¥\80 à¤¥à¤¾à¤°à¤²à¤¾à¤\82 - à¤¨à¤¿à¤¶à¥\8dफलीत",
+       "login-abort-generic": "तà¥\81à¤\9cà¥\87à¤\82 à¤¸à¤¤à¥\8dरारà¤\82भ à¤\85पà¥\87शà¥\80 à¤¥à¤¾à¤°à¤²à¤¾à¤\82 â\80\93 à¤¨à¤¿à¤¶à¤«à¤³ीत",
        "login-migrated-generic": "तुमचें खातें स्थलांतरीत जालां आनी तुजें वापरप्याचें नांव ह्या विकीचेर उपस्थीत ना.",
        "loginlanguagelabel": "भास:$1",
        "pt-login": "सत्रारंभ",
        "newpassword": "नवें गुपीत उतर",
        "retypenew": "नवें गुपीत उतर परतून टाइप कर",
        "resetpass_submit": "गुपीत उतर तयार कर आनी लॉग इन कर",
-       "changepassword-success": "तुजें गुपीत उतर बदलप यशस्वी थारलां",
+       "changepassword-success": "तुजें गुपीतउतर बदल्लां!",
        "resetpass_forbidden": "गुपीत उतरां बदलूंक शकनात",
        "resetpass-submit-loggedin": "गुपीत उतर बदलात",
        "resetpass-submit-cancel": "रद्द करात",
        "passwordreset-domain": "डोमेन:",
        "passwordreset-email": "ईमेल नामो:",
        "passwordreset-emailelement": "वापरप्याचें नांव: \n$1\n\nतात्पुरतें गुपीत उतर: \n$2",
-       "passwordreset-emailsentemail": "à¤\97à¥\81पà¥\80त à¤\89तर à¤ªà¤°à¤¤à¥\82न à¤¤à¤¯à¤¾à¤° à¤\95रपाà¤\9aà¥\8b à¤\88मà¥\87ल à¤§à¤¾à¤¡à¤²à¤¾",
-       "changeemail": "à¤\88मà¥\87ल à¤¸à¤\82दà¥\87श à¤¬à¤¦à¤²à¥\8dला",
+       "passwordreset-emailsentemail": "हà¥\8b à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8b à¤¤à¥\81à¤\9cà¥\8dया à¤¹à¤¿à¤¶à¥\8bबाà¤\82त à¤\9cà¥\8bडलà¥\8bलà¥\8bà¤\82 à¤\86सा à¤\9cालà¥\8dयार, à¤\97à¥\81पà¥\80तà¤\89तर à¤ªà¤°à¤¤à¥\82न à¤¥à¤¾à¤°à¤¾à¤µà¤ªà¤¾à¤\9aà¥\8b à¤\88मà¥\87ल à¤§à¤¾à¤¡à¤²à¥\87लà¥\87à¤\82 à¤\9cातà¥\87लà¥\87à¤\82.",
+       "changeemail": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8b à¤¬à¤¦à¤² à¤µà¤¾ à¤\95ाड",
        "changeemail-oldemail": "सद्याचो ईमेल नामो:",
        "changeemail-newemail": "नवो ईमेल नामो:",
        "changeemail-none": "(कांय ना)",
        "resettokens-no-tokens": "पुनर्स्थापित करपा खातीर कसलेंच चावी ना",
        "resettokens-tokens": "चाव्यो :",
        "resettokens-token-label": "$1 (सद्याचें मूल्य: $2)",
-       "bold_sample": "डाट बरप",
-       "bold_tip": "डाट मजकूर",
-       "italic_sample": "पालसो बरप",
-       "italic_tip": "पालसो मजकूर",
-       "link_sample": "दुवेचो माथाळो",
-       "link_tip": "भीतरलो दुवो",
-       "extlink_sample": "http://www.udaronn.in दुवयाचो माथाळो",
-       "extlink_tip": "भायलो दुवो (उपसर्ग http:// याद दवरात)",
-       "headline_sample": "माथाळयाचो मजकूर",
-       "headline_tip": "दुसऱ्या पांवड्याचो माथाळो",
-       "nowiki_sample": "असरूपीत मजकूर हांगा शिरकटायात",
-       "nowiki_tip": "विकिचें सरूपण आडनदर करात",
-       "image_tip": "अंत: स्थापीत फायल",
-       "media_tip": "फायलीचो दुवो",
-       "sig_tip": "वेळ-छाप सयत तुमची निशाणी",
-       "hr_tip": "आडवी वळ (उणो वापरचो)",
        "summary": "आपरोस:",
        "subject": "विशय:",
        "minoredit": "हें दाकटें संपादन",
        "showpreview": "पूर्वनियाळ दाखय",
        "showdiff": "बदल दाखयात",
        "anoneditwarning": "'''शिटकावणी:''' तुवें सत्रारंभ करूंक ना.\nतुजो IP पत्तो ह्या पानाच्या संपादन इतिहासांत नोंद जातलो.जर तुमी <strong>[$1 सत्रारंभ]</strong> करता वा <strong>[$2 खातें उगडटा]</strong> जाल्यार हेर सुविधांसयत तुमच्या संपादनाचें श्रेय तुमच्या सदस्य नांवाचेर दितलें.",
-       "missingcommenttext": "à¤\89पà¤\95ार à¤\95रà¥\82न à¤¤à¥\81मà¤\9aà¥\8dयà¥\8b à¤¶à¤¿à¤°à¥\8b à¤¸à¤\95यल à¤\98ाल.",
+       "missingcommenttext": "à¤\89पà¤\95ार à¤\95रà¥\82न à¤¤à¥\81à¤\9cà¥\8b à¤¶à¥\87रà¥\8b à¤¬à¤°à¤¯.",
        "blockedtitle": "वापरप्याक बंद केला",
+       "blockedtext": "<strong>तुजें वापरप्याचें नांव वा आय पा पत्तो आडावपांत आयला.</strong>\n\nआडावप $1 हाणें केलां.\nकारण दिलां तें <em>$2</em>.\n\n* आडावपाची सुरवात: $8\n* आडावप सोंपोवपाचो वेळ: $6\n* आडावपाक येवजिला: $7\n\nतुज्यान $1-आक वा दूसऱ्या [[{{MediaWiki:Grouppage-sysop}}|कारभार्याक]] आडावणे विशीं भासाभास करुंक संपर्क करुंक जाता. तुज्यान \"{{int:emailuser}}\" सभावगूण वापरुंक जायना खेरीज एक वैद ईमेल पत्तो तुज्या [[Special:Preferences|खातें पसंतिंत]] निशचीत केल्या शिवाय आनी तुका तें वापरपाक आडावंक ना जाल्यार. तुजो चालंत IP पत्तो आसा $3, आनी आडावणेच्यो आंक #$5 आसा. सगळ्यो वयल्यो बारिकसाणी तूं करताय त्या विचारांत समावेश कर.",
        "blockednoreason": "कांयच कारण दिवंक ना",
        "loginreqtitle": "लॉग इन जाय",
        "loginreqlink": "सत्रारंभ करात",
        "accmailtitle": "गुपीत उतर धाडलां",
        "newarticle": "(नवें)",
        "newarticletext": "जें पान अजून अस्तित्वांत ना अशा पानाचे दुवे फाटल्यान तुमी आसात. पान रचपाक सकयले चौकटींत टायप करपाक सुरु करात (चड म्हायती खातीर [$1 आदाराचें पान] पळेयात) जर ह्या पानार तुमी चुकून पावल्यात तर ब्रावजराचो बॅक (<strong>फटीं</strong>) हो बटन दामात",
-       "noarticletext": "सद्या ह्या पानाचेर कसलीच मजकूर ना. \nतुमी हेर पानांचेर [[Special:Search/{{PAGENAME}}|हो माथाळो]] सोदूं शकतात,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंदीत लॉग सोदूं शकतात],\nवा ह्या पानाक [{{fullurl:{{FULLPAGENAME}}|action=edit}} संपादीत] करूं शकतात</span>।",
+       "anontalkpagetext": "----\n<em>हें भासाभासेचें पान एक निनामी वापरप्याक जाणें अजून एक खातें उगडुंक ना, वो तो तें वापर्ना.</em>\nह्या खातीर आमकां आंकड्यांचो IP पत्तो वापरुंक पडता ताका वळखुंक.\nतसलो IP पत्तो साबार वापरप्यानी वापरूं येता.\nतूं जर एक निनामी वापरपी आसा आनी तुका दिसता की तुमका संबंद नासलेले शेरे तुजे विशीं केल्यात, उपकार करून [[Special:CreateAccount|एक खातें रच]] वा[[Special:UserLogin|सत्रारंभ कर]] फुडले गुस्पप निनामी वापरप्या ताळूंक.‎",
+       "noarticletext": "सध्याक हें पान रिंते आसा.\nतुज्यान दूसऱ्या पानानी [[Special:Search/{{PAGENAME}}| ह्या पानाचे नांव सोदूंक जाता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}} संबंधी सत्रानी सोदूंक जाता], वा [{{fullurl:{{FULLPAGENAME}}|action=edit}} हें पान रचूंक जाता]</span>.",
        "noarticletext-nopermission": "तुर्ताक ह्या पानाचेर कसलोच मजकूर ना. तुमी हेर पानांचेर [[Special:Search/{{PAGENAME}}|ह्या माथाळ्याचो सोद]] घेवं शकतात,\nवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंदीत लॉग सोदूं शकतात]</span>, पूण तुमकां हें पानाची रचणूक करपाची परवानगी ना।",
        "userpage-userdoesnotexist-view": "\"$1\" ह्या वापरप्याच्या खात्याची नोंदणी करूंक ना.",
+       "clearyourcache": "<strong>चत्राय:</strong> सांबाळ्ळ्या उपरांत, तुका घडयेक तुज्या ब्रावसराचो कॅश कडसरावंक पडत बदल पळोंवचे खातीर.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> > धर <em>Reload</em> क्लीक करताना, वा दाम <em>Ctrl-F5</em> वा <em>Ctrl-R</em> (<em>⌘-R</em> मॅक-आचेर)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> दाम (<em>⌘-Shift-R</em> एका मॅक-आचेर)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> dhor <em>Refresh</em> क्लीक करताना, वा दाम <em>Ctrl-F5</em>\n* <strong>Opera:</strong> हांगा वच: <em>Menu → Settings</em> (<em>Opera → Preferences</em> मॅक-आचेर) आनी उपरांत <em>Privacy & security → Clear browsing data → Cached images and files</em>.‎",
        "previewnote": "'''ही फकत एक दाखवण हें मतींत दवरात.'''\nतुमचें बदल आडून राखून दवरूंक ना!",
+       "continue-editing": "संपादन करपाच्या जाग्यार वच",
        "editing": "संपादता $1",
        "creating": "$1 रोचता",
        "editingsection": "(विभाग) $1 संपादन",
        "yourtext": "तुमचो मजकूर",
        "templatesused": "ह्या पानाचेर {{PLURAL:$1|वापरिल्लें}} सांचे",
+       "templatesusedpreview": "{{PLURAL:$1सांचो|सांचे}} ह्या झलकेंत वापरल्यात:‎",
        "template-protected": "(राखिल्लें)",
        "template-semiprotected": "(अर्द-सुरक्षीत)",
        "hiddencategories": "हें पान {{PLURAL:$1|लिपिल्ले वर्गाचें}} आसा",
+       "permissionserrors": "परवांगेची चूक",
        "permissionserrorstext-withaction": "ह्या {{PLURAL:$1|कारण|कारणां}}: खातीर तुका $2 मान्यताय ना.",
        "recreate-moveddeleted-warn": "शिटकावणीः तुमी आदीं काडून उडयिल्लें पान परतून तयार करतात ह्या पानाचे फासून उडोवपी आनी दुसरे कडे व्हरपी लाग फकत सोपेपणा खातीर दिल्यात",
-       "moveddeleted-notice": "हà¥\87à¤\82 à¤ªà¤¾à¤¨ à¤\95ाडà¥\82न à¤\89डयला.\nहà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8b à¤\95ाडà¥\82न à¤\89डà¥\8bवपà¥\80 à¤\86नà¥\80 à¤¹à¤¾à¤²à¥\8bवपà¥\80 à¤²à¥\89à¤\97 संदर्भा खातीर सकयल दिला.",
+       "moveddeleted-notice": "हà¥\87à¤\82 à¤ªà¤¾à¤¨ à¤\95ाडà¥\82न à¤\89डयला.\nहà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87à¤\82 à¤\95ाडà¥\82न à¤\89डà¥\8bवपाà¤\9aà¥\87à¤\82, à¤°à¤¾à¤\96पाà¤\9aà¥\87à¤\82, à¤\86नà¥\80 à¤¹à¤¾à¤²à¥\8bवपाà¤\9aà¥\87à¤\82 à¤¸à¤¤à¥\8dर  संदर्भा खातीर सकयल दिला.",
        "content-model-wikitext": "विकीमजकूर",
        "content-model-text": "सादोमजकूर",
        "post-expand-template-inclusion-warning": "<strong>शिटकावणीः</strong> सांचो धरून आकार अगडबंब जाता, कांय सांच्याचो आसपाव जावचो ना.",
        "post-expand-template-inclusion-category": "जंय सांचे धरून आवांठ व्हड जाता अशीं पानां",
        "post-expand-template-argument-warning": "<strong>शिटकावणीः</strong> ह्या पानाचेर खुब व्हड आंवाठ आशिल्लो एक तरी सांच्याचो मुद्दो आसा. हे मुद्दे भायरायल्यात",
        "post-expand-template-argument-category": "भायरायिल्ल्या सांच्यांसंबंदीचे मुद्दे आशिल्लीं पानां",
+       "undo-failure": "बदल परतावूंक जावंक ना कित्याक गुस्पणेचे मदले बदल आसात.",
        "viewpagelogs": "ह्या पाना खातीर सोत्रां पळेयात",
        "currentrev-asof": "$1 मेरेनचो सगळ्यांत निमणो पुनर्नियाळ",
        "revisionasof": " $1 मेरेन पुनर्नियाळ",
        "page_first": "पयलें",
        "page_last": "निमणें",
        "histlegend": "फरकाची निवडणी : पुनर्नियाळांची तुळा करपा खातीर रेडियो चौकटीं चेर कुरु करात आनी ''एंटर'' ना तर तळाकडे आशिल्लो बुतांव दामात।<br />\nविवरण : <strong>({{int:cur}})</strong> = हालींची पुनर्नियाळा बरोबर फरक, <strong>({{int:last}})</strong> = आदली पुनर्नियाळा बरोबर फरक, <strong>{{int:minoreditletter}}</strong> = दाक्टें बदल।",
-       "history-fieldset-title": "à¤\9aाळपाà¤\9aà¥\8b à¤\87तिहास",
-       "history-show-deleted": "फà¤\95त à¤\95ाडà¥\82न à¤\89डयिलà¥\8dलें",
+       "history-fieldset-title": "à¤\89à¤\9cळणà¥\8dयà¥\8b à¤\9aाळ",
+       "history-show-deleted": "फà¤\95त à¤\89à¤\9cळणà¥\80 à¤\95ाडà¥\82न à¤\89दयलà¥\87लें",
        "histfirst": "पोरणो",
        "histlast": "नवो ताल्ल",
+       "history-feed-title": "पुनर्नियाळाचो इतिहास",
+       "history-feed-description": "विकीचेर ह्या पाना खातीर पुनर्नियाळाचो इतिहास",
        "history-feed-item-nocomment": "$1 हांगा $2",
        "rev-delundel": "दृश्य मानताय बदलात",
        "rev-showdeleted": "दाखयात",
        "revdel-restore": "दृश्य मानताय बदलात",
        "pagehist": "पानाचो इतिहास",
        "mergehistory-reason": "कारण:",
+       "mergelog": "विलीन करपाचें सत्र",
        "revertmerge": "वेगळावप",
        "history-title": "\"$1\" च्या पुनर्नियाळाचो इतिहास",
        "difference-title": "\"$1\" च्या आवृत्तींत अंतर",
        "lineno": "$1 वळ :",
        "compareselectedversions": "वेंचिल्ल्या पुनर्नियाळांची तुळा करात",
        "editundo": "केल्लें परतावचें",
+       "diff-empty": "(कांय फरक ना)‎",
        "diff-multi-sameuser": "(ह्या वांगड्या सयत {{PLURAL:$1|केल्लें मदलें एक अवतरण दाखोवंक ना|केल्लें मदलें $1 अवतरण दाखोवंक ना}})",
+       "diff-multi-otherusers": "({{PLURAL:$2|एक हेर वापरप्या|$2 हेर वापरप्यां}} वर्वीं {{PLURAL:$1|एक मदली उजळणी|$1 मदल्यो उजळण्यो}} दाखोवंक ना)‎",
        "searchresults": "सोदाचो निकाल",
        "searchresults-title": "\"$1\" हाच्या सोदाचे परिणामां",
        "prevn": "आदलें{{PLURAL:$1|$1}}",
        "searchprofile-everything-tooltip": "सगळो मजकूर सोदात(चर्चेचें पाना सयत)",
        "searchprofile-advanced-tooltip": "खाशेल्या नांवथोळाणी सोदात",
        "search-result-size": "$1 ({{PLURAL:$2|1 उतर|$2 उतरां}})",
-       "search-result-category-size": "{PLURAL:$1|1 सदस्य|$1 सदस्य}} ({{PLURAL:$2|1 उपगट|$2 उपगट}}, {{PLURAL:$3|1 फायल|$3 फायलीं}})",
-       "search-redirect": "(पुनर्निर्देशन $1)",
+       "search-result-category-size": "{{PLURAL:$1|$1 वांगडी}} ({{PLURAL:$2|$2 उपवर्ग}}, {{PLURAL:$3|1 फायल|$3 फायली}})",
+       "search-redirect": "($1 सावन पुनर्निर्देशीत)",
        "search-section": "(विभाग $1)",
+       "search-file-match": "(फायलीच्या मजकुराक जुळटा)‎",
        "search-suggest": "तुमकां $1 अशें म्हणपाचें आसलें?",
        "search-rewritten": "$1 हाचो निकाल दाखयता.नाजाल्यार $2 हें सोदात.",
        "search-interwiki-more": "(आनी)",
        "prefs-watchlist": "सादुरवळेरी",
        "youremail": "इमेल",
        "yourrealname": "खरें नांवः",
+       "group-bot": "रोबोटां",
+       "group-sysop": "कारभारी",
+       "grouppage-bot": "{{ns:project}}:रोबोटां",
+       "grouppage-sysop": "{{ns:project}}:कारभारी",
        "right-writeapi": "Write API चो उपेग",
        "newuserlogpage": "वापरपी रोचनेचे वळेरी",
+       "rightslog": "वापरप्याच्या हकांचो सत्र",
        "action-edit": "हें पान संपादीत कर",
-       "nchanges": "$1 {{PLURAL:$1|बदल|बदल}}",
+       "action-createaccount": "हें वापरप्याचें खातें रच",
+       "nchanges": "$1 {{PLURAL:$1|बदल}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges": "हालींचे बदल",
        "recentchanges-legend": "हालींच जाल्ल्या बदलाचो विकल्प",
        "recentchanges-summary": "ह्या विकीचेर हालींच जाल्ल्या बदलांचो माग ह्या भरणांतल्यान दवरात",
+       "recentchanges-noresult": "दिलेल्या काळाचे बदल ह्या निकशाक जुळनांत.‎",
        "recentchanges-feed-description": "ह्या विकीचेर हालींच जाल्ल्या बदलांचो माग ह्या भरणांतल्यान दवरात.",
        "recentchanges-label-newpage": "ह्या संपादनांन नवें पान निर्माण केला.",
        "recentchanges-label-minor": "हें दाक्टे संपादन",
        "recentchanges-label-plusminus": "ह्या पानाचो आकार इतल्या बाइट्सन बदललो",
        "recentchanges-legend-heading": "<strong>कुंजी:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages| नव्या पानांची सुची]] पळयात)",
-       "rcnotefrom": "$2 पासून केल्ले बदल सकयल दिल्यात ($1 मेरेन दाखयल्यात)",
+       "rcnotefrom": "सकयल <strong>$3, $4</strong> सावन {{PLURAL:$5 जालेले बदल दिल्यात}} (<strong>$1</strong> मेरेन {{PLURAL:$5|दाखयलां|दाखयल्यांत}}).",
        "rclistfrom": "$3 $2 साकून नवें बदल दाखयात",
        "rcshowhideminor": "$1 दाकट्यो बदल",
        "rcshowhideminor-show": "दाखयात",
        "rcshowhidebots-show": "दाखयात",
        "rcshowhidebots-hide": "लिपयात",
        "rcshowhideliu": "$1 अधिकृत नोंदीचे वापरपी",
+       "rcshowhideliu-show": "दाखयात",
        "rcshowhideliu-hide": "लिपयात",
        "rcshowhideanons": "$1 निनांवी वापरपी",
        "rcshowhideanons-show": "दाखयात",
        "rcshowhideanons-hide": "लिपयात",
+       "rcshowhidepatr": "$1 पारो केलेले सुदारप",
        "rcshowhidepatr-show": "दाखयात",
        "rcshowhidepatr-hide": "लिपयात",
        "rcshowhidemine": "$1 म्हजें संपादन आंकडे",
        "rcshowhidemine-show": "दाखयात",
        "rcshowhidemine-hide": "लिपयात",
-       "rclinks": "फाà¤\9fलà¥\8dया $2 à¤¦à¤¿à¤¸à¤¾à¤\82नà¥\80 à¤\9cालà¥\8dलà¥\8b $1 बदल दाखयात",
+       "rclinks": "शà¥\87वà¤\9fà¤\9aà¥\87 $2 à¤¦à¤¿à¤¸à¤¾à¤¨à¥\80à¤\82 à¤\9cालà¥\8dलà¥\87 $1 बदल दाखयात",
        "diff": "फरक",
        "hist": "इति",
        "hide": "लिपयात",
        "rc-change-size-new": "$1 {{PLURAL:$1|बाय्ट|बाय्टी}} बदल केल्या उपरांत",
        "rc-enhanced-expand": "म्हायती दाखय",
        "rc-enhanced-hide": "म्हायती लिपय",
+       "rc-old-title": "आरंभांत रचलली \"$1\" ह्या नांवान‎",
        "recentchangeslinked": "संबंदित बदल",
        "recentchangeslinked-toolbox": "संबंदीत बदल",
        "recentchangeslinked-title": "\"$1\" च्या संबंदातले बदल",
        "recentchangeslinked-to": "ह्या पाना बदला दिल्ल्या पानांक जडून आशिल्ल्या पानांचे बदल दाखय",
        "upload": "फायल अपलोड करात",
        "uploadbtn": "फायल अपलोड करात",
+       "uploadlogpage": "अपलोडाचें सत्र",
        "filedesc": "सारांश",
        "fileuploadsummary": "आपरोस:",
        "license": "लायसन्सीग",
        "filehist-datetime": "दिस / वेळ",
        "filehist-thumb": "ल्हान-इमाज़",
        "filehist-thumbtext": " $1मेरेनचे आवृत्ती खातीर ल्हान-इमाज़",
+       "filehist-nothumb": "ल्हान-इमाज ना",
        "filehist-user": "वापरपी",
        "filehist-dimensions": "परिमाण",
        "filehist-comment": "शेरो",
        "imagelinks": "फायलिचो वापर",
-       "linkstoimage": "हे फायलीक सकयल दिल्ल्यो पानाच्यो जोडण्यो {{PLURAL:$1|आसात}}.",
-       "nolinkstoimage": "हे फायलीक दुवो आशिल्लीं आनीक पानां नात.",
+       "linkstoimage": "{{PLURAL:$1|हें पान|$1 हीं पानां}} ही फायल {{PLURAL:$1|वापरता|वापरतात}}:",
+       "linkstoimage-more": "$1 परस अदीक {{PLURAL:$1|पान वापरता|पानां वापरतात}} ही फायल.\nसकयली वळेरी दाखयता {{PLURAL:$1|पयलें पान|पयलीं $1 पानां}} जें हीच फायल वापरता. एक [[Special:WhatLinksHere/$2|पूर्ण वळेरी]] उपलब्ध आसा.‎",
+       "nolinkstoimage": "ह्या फायलीक वापरतात तसलीं पानां नांत.",
+       "linkstoimage-redirect": "$1 (फायल पुनर्देशन) $2",
        "sharedupload-desc-here": "ही फयल $1 हांगाची आनी ती हे प्रकल्पां खातीर वापरल्यार चलता. (तिच्या $2 ह्या फयलींतलें वर्णनाचे पान) तातूंतलें वर्णन सकयल दिलां.",
+       "filepage-nofile": "ह्या नांवाची फायल असतित्वांत ना.",
        "upload-disallowed-here": "तूं ह्या फायलीचेर अधिलेखीत करूंक शकना",
        "randompage": "खंयचेंय पान",
        "statistics": "संख्याशास्त्र",
        "statistics-pages": "पान:",
        "statistics-files": "फायल अपलोड करात",
+       "double-redirect-fixer": "पुनर्निर्देशन थारावपी",
        "brokenredirects-edit": "बदल",
        "brokenredirects-delete": "काडून उडयात",
        "nbytes": "$1 {{PLURAL:$1|बाय्ट}}",
        "nmembers": "$1 {{PLURAL:$1|वांगडी}}",
        "prefixindex": "उपसर्ग आशिल्लीं सगळीं पानां",
-       "usercreated": "$1 ह्या दिसा $2 ह्या वेळार तयार केलें",
+       "listusers": "वापरप्यांची वळेरी",
+       "usercreated": "$3 हाणें $1 दिसा $2 वोराचेर {{GENDER:$3|रचलेलें}}",
        "newpages": "नवीं पानां",
        "move": "हालय",
        "pager-newer-n": "{{PLURAL:$1|नवो 1|नवें $1}}",
        "booksources": "पुस्तकांचो स्त्रोत",
        "booksources-search-legend": "पुस्तकाचे स्त्रोत सोदात",
        "booksources-search": "सोद",
+       "specialloguserlabel": "करपी:",
+       "speciallogtitlelabel": "मोख (माथाळो वा {{ns:user}}:वापरप्याचें नांव):",
        "log": "सोत्रां",
+       "all-logs-page": "सगळीं भौसाचीं सत्रां",
+       "alllogstext": "{{SITENAME}} हाच्यो सगळ्या उपलब्ध सत्रांची एकठांय दाखोवणी.\nतुज्यान तुजो देखावो अर्नूं येता एक सत्राचो प्रकार विंचून, वापरप्याचें नांव (व्हदल्या आनी धाकट्या अक्षरा मदें फरक पडटा), वा पोरणें जालेलें पान (हांगाय व्ह़डले आनी धाक्टे अक्षरा मदें फरक पडटा).‎",
+       "logempty": "सत्रान जुळपी नग नांत.‎",
        "allpages": "सगळीं पाना",
        "nextpage": "फुडलें पान ($1)",
        "prevpage": "फाटलें पान ($1)",
        "allarticles": "सगळीं पानां",
        "allpagessubmit": "वचात",
+       "allpages-hide-redirects": "पुनर्देर्शनां लिपय",
        "categories": "वर्ग",
        "linksearch-ns": "नांवाची सुवात",
        "linksearch-ok": "सोद",
        "listgrouprights-members": "सदस्यांची वळेरी",
        "emailuser": "ह्या वापरप्याक इमेल करात.",
        "emailusername": "वापरप्याचे नांव",
+       "usermessage-editor": "यंत्रणाचो संदेशकार",
        "watchlist": "सादुरवळेरी",
        "mywatchlist": "सादुरवळेरी",
        "watchlistfor2": "$1 $2 खातीर",
        "addedwatchtext": "\"[[:$1]]\" आनी हाचे भासाभास पान तुमचें [[Special:Watchlist|सादुरवळेरेक]] जोडलां.",
        "watch": "नदर दवरात",
        "unwatch": "पळोवंक नासलें",
-       "watchlist-details": "लक्ष {{PLURAL:$1|$1वळेरींतलें|$1 वळेंरींतली}} {{PLURAL:$1|$1पान|$1 पानां}} उलोवपाची पानां सोडून",
+       "watchlist-details": "तुज्या सादूरवळेरिंत {{PLURAL:$1|$1 पान आसा|$1 पानां आसात}} (त्या भायर उलोवपाचीं पानां आसात).",
+       "wlheader-showupdated": "तुज्या फाटले भेटे सावन बदल्ल्यान तीं पानां <strong>दाट</strong> दाखयल्यांत.",
+       "wlnote": "सकयल {{PLURAL:$1|हो निमाणो बदल|हें निमाण्यो <strong>$1</strong> बदल}} निमाण्या {{PLURAL:$2|वोरान|<strong>$2</strong>वोरानीं}}, $3, $4 पर्यान.‎",
        "watchlist-options": "सादुरवळेरींतलो पर्याय",
+       "enotif_reset": "सगळीं पानां भेट दिलेलीं म्हूण खुणाय",
        "delete-legend": "काडून उडयात",
        "actioncomplete": "क्रिया पुराय जाल्या",
        "actionfailed": "क्रिया अपेस जाल्या",
        "changecontentmodel-reason-label": "कारण:",
        "protectlogpage": "सुरक्षितेचें सोत्र",
        "protectedarticle": "राखिल्ले\"[[$1]]\"",
+       "modifiedarticleprotection": "सुरक्षेची पातळी \"[[$1]]\"‎ हाचे खातीर बदल्ल्या",
+       "protect-default": "सगळ्या वापरप्यांक परवांगी दी",
        "restriction-edit": "बदल",
        "restriction-move": "दुसरेकडे व्हरात",
        "restriction-create": "निर्माण कर",
        "contributions-title": "$1 खातीर वापरप्याचीं योगदानां",
        "mycontris": "योगदान",
        "anoncontribs": "योगदान",
+       "contribsub2": "{{GENDER:$3|$1}} हाच्यो ($2)",
+       "nocontribs": "ह्या निशकशांक खयंचेच बदल जूळ्ळेले मेळूंक नांत.",
        "uctop": "हालीचें",
        "month": "ह्या म्हयन्या सावन (आनी आदलें):",
        "year": "ह्या वर्सा सावन (आनी आदलें):",
        "sp-contributions-search": "योगदानां सोदात",
        "sp-contributions-username": "आयपी नामो वा वापरप्याचें नांव",
        "sp-contributions-toponly": "फकत सगळ्यांत हालींचे पुनर्नियाळ आशिल्लीं संपादन दाखयात",
+       "sp-contributions-newonly": "फकत तसलेचच बदल दाखय, जांचे वर्वीं पान रचलां",
        "sp-contributions-submit": "सोद",
        "whatlinkshere": "हाका कितें जडता",
        "whatlinkshere-title": " \"$1\" हाका दुवे आशिल्लीं पानां",
        "linkshere": "मुखावेली पानां <strong>$2</strong>: हाका जडतात",
        "nolinkshere": "<strong>$2</strong> हाका खंयच्याच पानाचो दुवो ना",
        "isredirect": "पुनर्निर्देशन पान",
-       "istemplate": "$1 दूसरात-समावेस",
+       "istemplate": "दुरास्थ-समावेस",
        "isimage": "फायलीचो दुवो",
        "whatlinkshere-prev": "{{PLURAL:$1|आदलें|आदलीं $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|फुडलें|फुडलें $1}}",
        "whatlinkshere-links": "← दुवे",
        "whatlinkshere-hideredirs": "$1 पुनर्निर्देशन",
-       "whatlinkshere-hidetrans": "$1 à¤¦à¥\82सà¥\8dरात-समावà¥\87श",
+       "whatlinkshere-hidetrans": "$1 à¤¦à¥\81रासà¥\8dथ-समावà¥\87स",
        "whatlinkshere-hidelinks": "$1 दुवे",
-       "whatlinkshere-hideimages": "$1 फायल दुवे",
+       "whatlinkshere-hideimages": "$1 फायलींचे दुवे",
        "whatlinkshere-filters": "गाळणे",
-       "ipboptions": "2 वरां: 2hours ,1 दीस:1 day,3 दीस:3 days,1 सुमान:1 week,2 सुमनां:2 weeks,1 म्हयनो:1 month,3 म्हयने:3 months,6 म्हयने:6 months,1 वर्स:1 year,अनिश्चीत:infinte",
+       "ipboptions": "2 वरां:2 hours,1 दीस:1 day,3 दीस:3 days,1 सुमान:1 week,2 सुमनां:2 weeks,1 म्हयनो:1 month,3 म्हयने:3 months,6 म्हयने:6 months,1 वर्स:1 year,शेवट ना:infinite",
        "ipblocklist": "आडायल्लें वापरपी",
+       "infiniteblock": "शेवट ना",
        "blocklink": "आडावणी",
        "change-blocklink": "विभाग सुदारप",
        "contribslink": "योगदान",
        "blocklogpage": "कार्यवळेरी आडायात",
-       "blocklogentry": "$2 $3 हो सोंपपी वेळ आशिल्लो $1 बंद दवरल्ला",
+       "blocklogentry": "[[$1]] आक आडायला, इतल्या वेळाक: $2, कारण: $3",
+       "reblock-logentry": "आडावपाचें बसोवप बदल्लां [[$1]] हाचे खातीर सोंपोवपाचो वेळ दिला $2 $3‎",
        "block-log-flags-nocreate": "खातें निर्माण जावूंक ना",
+       "proxyblocker": "प्रतिनिधी सिरविदोर आडावपी‎",
        "movepagebtn": "पान हालय",
        "movelogpage": "पान हालोवण्यांचो सोत्र",
        "revertmove": "मूळ पदार व्हरप",
        "allmessagesdefault": "पूर्वनिर्धारित संदेशाचो मजकूर",
        "thumbnail-more": "व्हड करात",
        "thumbnail_error": "$1ः लघुप्रतिमा करतांनाची चूक",
-       "tooltip-pt-userpage": "तुमचें वापरपाचें पान",
-       "tooltip-pt-mytalk": "तुमचें चर्चेचें पान",
+       "importlogpage": "आयाताचें सत्र",
+       "tooltip-pt-userpage": "{{GENDER:|तुमचें वापरप्याचें}} पान",
+       "tooltip-pt-mytalk": "{{GENDER:|तुमचें}} भासाभासाचें पान",
        "tooltip-pt-preferences": "{{GENDER:|तुमची}} पसंती",
        "tooltip-pt-watchlist": "तुमी बदल करपा खातीर देखरेख करतात त्या पानांची वळेरी",
-       "tooltip-pt-mycontris": "तुमच्या योगदानांची वळेरी",
+       "tooltip-pt-mycontris": "{{GENDER:|तुमच्या}} योगदानांची वळेरी",
        "tooltip-pt-login": "सत्रारंभ करप बरें, पूण तशी सक्ती ना.",
        "tooltip-pt-logout": "सत्र शेवट",
        "tooltip-pt-createaccount": "तुमी खातें उगडून सत्रारंभ करचें अशें सुचयतात, पूण तें सक्तीचें ना.",
        "tooltip-t-whatlinkshere": "हांगा दुवे आशिल्ल्या सगळ्या विकी पानांची वळेरी",
        "tooltip-t-recentchangeslinked": "ह्या पानावेल्यान दुवे दिल्ल्या पानांतले हालींचे बदल",
        "tooltip-feed-atom": "ह्या पाना खातीर ऍटम पूर्वण",
-       "tooltip-t-contributions": "ह्या वापरप्याची योगदानाची वळेरी",
+       "tooltip-t-contributions": "{{GENDER:$1|ह्या वापरप्याची}} योगदानाची वळेरी",
        "tooltip-t-emailuser": "{{GENDER:$1|ह्या उपेगकर्त्याक}} इ-मेल धाडात",
        "tooltip-t-upload": "फायली अपलोड करात",
        "tooltip-t-specialpages": "सगळ्या विशेश पानांची वळेरी",
        "tooltip-ca-nstab-special": "हें एक खेरीत पान, आनी हें बदलूंक जायना",
        "tooltip-ca-nstab-project": "प्रकल्पाचें पान पळेयात",
        "tooltip-ca-nstab-image": "फायलीचें पान पळेयात",
+       "tooltip-ca-nstab-mediawiki": "यंत्रणाचो संदेश पळय",
        "tooltip-ca-nstab-template": "सांचो पळेयात",
        "tooltip-ca-nstab-category": "वर्गांचे पान पळेयात",
        "tooltip-minoredit": "हो ल्हानसो बदल म्हूण कुरू करात",
        "tooltip-rollback": "निमाण्या योगदान करप्यान ह्या पानाचेर केल्लें संपादन रोलबॅक  (फाटीं घेयात) एकाच क्लीकान मूळ पदार हाडटा",
        "tooltip-undo": "\"आदलें स्थितीर हाडचें\" ह्या बदलाक परत व्हरुन संपादन स्थितीन झलक रितीन दाखयतात.\nहाचेवरवीं सारांशान आदल्या स्थितीर हाडपाचें कारण बरोवं शकता.",
        "tooltip-summary": "आपरोसाची नोंदणी करात",
-       "simpleantispam-label": "एन्टी-स्पैम तपासप.\nहे भरी<strong>नकाय</strong>!",
+       "simpleantispam-label": "स्पमविरूध तपासणी.\nहें भर <strong>नाका</strong>!",
+       "pageinfo-title": "\"$1\" ‎खातीर म्हायती",
+       "pageinfo-header-basic": "मूळ म्हायती",
+       "pageinfo-header-edits": "बदलाचो इतिहास",
+       "pageinfo-header-restrictions": "पानाची सुरक्षा",
+       "pageinfo-header-properties": "पानाचे गुणधर्म",
+       "pageinfo-display-title": "मांडलेलें माथाळें",
+       "pageinfo-default-sort": "डिफोल्ट आरीन मांडूंक चावी",
+       "pageinfo-length": "पानाची लांबाय (बायटांत)‎",
+       "pageinfo-article-id": "पानाचो आंक",
+       "pageinfo-language": "पानाच्या मजकुराची भास",
+       "pageinfo-content-model": "पानाच्या मजकुराचो नमुनो",
+       "pageinfo-robot-policy": "रोबोटां कडल्यान सुचेंत घालप",
+       "pageinfo-robot-index": "परवांगी आसा",
+       "pageinfo-robot-noindex": "परवांगी ना",
+       "pageinfo-watchers": "पानाचेर दिश्ट दवरतेल्यांचो आंकडो",
+       "pageinfo-few-watchers": "$1 परस थोडें {{PLURAL:$1|दिश्ट दवरपी}}‎",
+       "pageinfo-redirects-name": "ह्या पाना खातीर पुनर्निर्देशनांचो आंकडो",
+       "pageinfo-subpages-name": "ह्या पानाच्या ऊप-पानाचो आंकडो",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देशन|पुनर्निर्देशनां}}; $3 {{PLURAL:$3|पुनर्निर्देशन नासलेलें}})‎",
+       "pageinfo-firstuser": "पान रचपी",
+       "pageinfo-firsttime": "पान रचपाची तारीख",
+       "pageinfo-lastuser": "हालींचो संपादक",
+       "pageinfo-lasttime": "हालींच्या बदलाची तारीख",
+       "pageinfo-edits": "एकूण बदलाचो आंकडो",
+       "pageinfo-authors": "वेगळे बरोवप्यांचो एकूण आंकडो",
+       "pageinfo-recent-edits": "हालींच्या बदलांचे आंकडे (गेले $1)‎",
+       "pageinfo-recent-authors": "हालींचे वेगळे बरोवपी",
+       "pageinfo-magic-words": "{{PLURAL:$1|जादवाचें उतर|जादवाचीं उतरां}} ($1)‎",
+       "pageinfo-hidden-categories": "लिपयलेले {{PLURAL:$1|वर्ग}} ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|सांचो दुरास्थ-समावेस जाला|सांचे दुरास्थ-समावेस जाले}} ($1)‎",
        "pageinfo-toolboxlink": "पानाची म्हायती",
+       "pageinfo-contentpage": "एक मजकुराचें पान कशें धरपांत आयलां",
        "pageinfo-contentpage-yes": "हय",
+       "patrol-log-page": "पारो करप्याचे सत्र",
        "previousdiff": "← आदलें संपादन",
        "nextdiff": "नवें संपादन →",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|पान|पानां}}",
        "file-info-size": "$1 × $2 चित्रतत्व, फायलीचो आकार: $3, माइम प्रकार: $4",
+       "file-info-size-pages": "$1 × $2 चित्रत्वां, फायलिचो आकार: $3, MIME प्रकार: $4, $5 {{PLURAL:$5|पान|पानां}}‎",
        "file-nohires": "हाच्या परस वयले बारिक्साय उपल्बद ना",
        "svg-long-desc": "SVG फायल, नांवाक $1 × $2 चित्रतत्वां, फायलीचो आकार: $3",
        "show-big-image": "मुळावी फायल",
        "monthsall": "सगळे",
        "confirm-rollback-button": "बरें",
        "confirm-rollback-top": "ह्या पाना वयलें संपादन आशिल्ले तशें करात?",
+       "imgmultipagenext": "फुडलें पान →",
+       "imgmultigo": "वचात!",
+       "imgmultigoto": "$1 ‎पानार वचात",
+       "watchlisttools-clear": "सादूरवळेरी निवळ कर",
        "watchlisttools-view": "प्रस्तूत बदल पळयात.",
        "watchlisttools-edit": "सादुरवळेरी पळय आनी संपादीत करात",
+       "watchlisttools-raw": "सादूरवळेरिची मूळान बदल कर",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|उलयात]])",
+       "redirect": "फायल, वापरपी, पान, उजळणी वा सत्र आंक‎ वर्वीं पुनर्देशन कर",
+       "redirect-summary": "हें विशेश पान पुनर्देशीत करता एका फायलीक (फायलीचें नांव दिल्यार), एका पानाक (उजळणेचो आंक वा पानाचो आंक दिल्यार), एक वापरप्याच्या पानाक (एके वापरप्याचो आंक दिल्यार), वा एक सत्र नोंद (सत्राचो आंक दिल्यार). वापर: [[{{#Special:Redirect}}/file/देखीक.jpg]],  [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], vo [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "वचात",
+       "redirect-lookup": "सुचींत पळय:",
        "redirect-value": "मोल:",
+       "redirect-user": "वापरप्यांचो आंक",
+       "redirect-page": "पानाचो आंक",
+       "redirect-revision": "पानाची उजळणी",
+       "redirect-file": "फायलीचें नांव",
        "specialpages": "विशेश पानां",
        "tag-filter": "[[Special:Tags|कुर्वेचीट]] गाळणो:",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2",
        "tags-active-yes": "हय",
        "tags-active-no": "ना",
+       "tags-hitcount": "$1 {{PLURAL:$1|बदल}}",
        "htmlform-title-not-exists": "$1 अस्तित्वांत ना.",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
+       "logentry-delete-restore": "$1 हाणें {{GENDER:$2|परत हाडलां}} पान $3 ($4)‎",
+       "logentry-delete-revision": "$1 हाणें {{PLURAL:$5|उजळणेचें}} दिसणे  $3, ह्या पानार {{GENDER:$2|बदल्ला}}: $4‎",
+       "revdelete-content-hid": "मजकूर लिपयला",
        "logentry-move-move": "$1 हाणें $3 पानाक $4 {{GENDER:$2|हालयला}}",
+       "logentry-move-move-noredirect": "$1, हाणें पान $3 सावन $4 {{GENDER:$2|हालयलां}} पुनर्देर्शन दवरिनासतानां",
+       "logentry-move-move_redir": "$1 हाणें पान $3 सावन $4 {{GENDER:$2||हालयल्लो}} पुनर्दिशनावयर",
+       "logentry-patrol-patrol-auto": "$1-आन $3, ह्या पानाचें $4, ह्या उजळणेचो पारो केलां म्हण आपोआप {{GENDER:$2|खुणायलां}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
+       "logentry-newusers-autocreate": "वापरप्याचें खातें $1 आपोआप {{GENDER:$2|रचून}} आयलें",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपलोड केला}} $3",
+       "logentry-upload-overwrite": "$1, हाणें $3‎, हाची एक नवी आवृत्ती {{GENDER:$2|अपलोड केलां}}",
        "searchsuggest-search": "{{SITENAME}} सोद",
+       "duration-days": "$1 {{PLURAL:$1|दीस}}",
        "special-characters-group-latin": "रोमी",
        "special-characters-group-latinextended": "रोमी (आनिंक-उइ)",
        "special-characters-group-ipa": "IPA",
        "special-characters-group-khmer": "ख्मेर",
        "mw-widgets-dateinput-no-date": "तारीख निवडूंक ना",
        "mw-widgets-dateinput-placeholder-day": "वर्स-म्हयनो-दीस",
-       "mw-widgets-dateinput-placeholder-month": "वर्स-म्हयनो"
+       "mw-widgets-dateinput-placeholder-month": "वर्स-म्हयनो",
+       "randomrootpage": "खयंचेंय मूळ पान"
 }
index 1fe99ac..e339a77 100644 (file)
@@ -17,7 +17,7 @@
        "tog-enotifwatchlistpages": "Mhojea sadurvollerintlem pan vo fayl bodol'li zalear mhaka email dhadd",
        "tog-shownumberswatching": "Nodor dovorpi vaporpeanche sonkhya dakhoi",
        "tog-oldsig": "Tujea sod'dheachi soy:",
-       "tog-uselivepreview": "Pan porot ugdinastana zolok dahkoi",
+       "tog-uselivepreview": "Pan porot ughoddnastana zholok dakhoi",
        "tog-watchlisthideown": "Sadurvollerint mhoje bodol lipoi",
        "tog-watchlisthidebots": "Sadurvollerint robotani kel'le bodol lipoi",
        "tog-watchlisthideminor": "Sadurvollerint dhaktem bodol lipoi",
        "listingcontinuesabbrev": "chalu",
        "index-category": "Suchi-potran zodlelim panam",
        "noindex-category": "Suchi-potran zoddunk-naslelim panam",
-       "broken-file-category": "Tuttlolea faylinchea duve aslelim panam‎",
+       "broken-file-category": "Tuttlolea faylinche duve aslelim panam‎",
        "about": "Hea vixoiavoir",
        "article": "Vixoi sombondhi pan",
        "newwindow": "(novea zonelant uktem zata)",
        "youhavenewmessages": "Tumkam $1 ($2) asat.",
        "youhavenewmessagesfromusers": "Tuka {{PLURAL:$3|ek vaporpi|$3 vaporpi}} koddlean $1 {{PLURAL:$4|asa|asat}} ($2).‎",
        "newmessageslinkplural": "{{PLURAL:$1|novo sondex|999=nove sondex}}‎",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|nimanno bodol|999=nimanneo bodol}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|nimanno bodol|999=nimanne bodol}}",
        "youhavenewmessagesmulti": "$1 cher tuka noveo sondex asat",
        "editsection": "bodol",
        "editold": "bodol",
        "databaseerror-textcl": "Totv-kox (database) sodtana chuk ghodli",
        "databaseerror-query": "Anurodh: $1",
        "databaseerror-error": "Chuk: $1",
-       "missing-article": "Totv-kox (Database) hantun mellunk zai aslem tem mozkur \"$1\" $2 mellunk-nam.\n\nHorxim, oxem ek pornem frk vo eka panachea itihasacho duvo kadun udoila, tedna zata.\n\nOxem nhoi zalear, tuka softwer-an chuk sampodlam zait.\nUpkar korun eka [[Special:ListUsers/sysop|karbhari]]chea nodrek hadd, Internet Zago Sodpi (URL) hachi nond gheun.",
+       "missing-article": "Totv-kox (Database) hantun mellunk zai aslem tem mozkur \"$1\" $2 mellunk-nam.\n\nHorxim, oxem ek pornem frk vo eka panachea itihasacho duvo kaddun uddoila, ten’na zata.\n\nOxem nhoi zalear, tuka software-ant chuk sampoddlea zait.\nUpkar korun eka [[Special:ListUsers/sysop|karbhari]]chea nodrek hadd, Ontorzalleant Zago Sodpi (URL) hachi nond ghevn.",
        "missingarticle-rev": "(uzollnni#: $1)",
        "missingarticle-diff": "(Frk: $1, $2)",
        "badtitle": "Chukichem nanv",
        "loginerror": "Sotrorombhachi truti",
        "createacct-error": "Khatem rochtanam truti",
        "createaccounterror": "Khatem rochunk zaunk na: $1",
-       "loginsuccesstitle": "Sotrorombh zalem",
+       "loginsuccesstitle": "Sotrarombh zalem",
        "nosuchusershort": "\"$1\" hea nanvan konn vapurpi na.\nNanv boroitana chuk zali gai?",
        "nouserspecified": "Vapurpeachem nanv diunk-uch zai.",
        "login-userblocked": "Hea vapurpeak addaila. Sotrorombh korunk zaina.",
        "emaildisabled": "Hi site mail dhadpak xokona.",
        "accountcreated": "Khatem rochlem.",
        "createaccount-title": "{{SITENAME}} -ak khatem rochlem",
-       "login-abort-generic": "Tujem sotrorombh opexi tharlam - Nixfolit",
+       "login-abort-generic": "Tujem sotrorombh opexi tharlam - Nixfollit",
        "login-migrated-generic": "Tujem khatem stholontrit zalam ani vapurpeachem nanv hea wikicher anink ostitvant na.",
        "loginlanguagelabel": "Bhas: $1",
        "pt-login": "Sotrorombh",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Email potto:",
        "passwordreset-emailelement": "Vapurpeachem nanv: \n$1\n\nTatpurtem gupitutor: \n$2",
-       "passwordreset-emailsentemail": "Ho email pot'to tujea kontak zodlelem asa zalear, gupitutor portun tharaipacho email dhadlelem zatelem.",
-       "changeemail": "Email potto bodol vo kad",
+       "passwordreset-emailsentemail": "Ho email pot'to tujea hixobant zoddlolo asa zalear, gupitutor portun tharavpacho email dhaddlelem zatelem.",
+       "changeemail": "Email po’tto bodol vo kadd",
        "changeemail-oldemail": "Sodhyacho email potto:",
        "changeemail-newemail": "Novo email potto:",
        "changeemail-none": "(kai na)",
        "resettokens-no-tokens": "Punorsthapit korpa khatir koslench chavi na.",
        "resettokens-tokens": "Chavio:",
        "resettokens-token-label": "$1 (sodhyache valor: $2)",
-       "bold_sample": "Datt mozkur",
-       "bold_tip": "Datt mozkur",
-       "italic_sample": "Palso mozkur",
-       "italic_tip": "Palso mozkur",
-       "link_sample": "Duvyeche nanv",
-       "link_tip": "Bhitorlo duvo",
-       "extlink_sample": "http://www.udaronn.in duvyachem nanv",
-       "extlink_tip": "Bhailo duvo (survatek http:// visronakai)",
-       "headline_sample": "Mathalleacho mozkur",
-       "headline_tip": "Dusrea patllicho mathallo",
-       "nowiki_sample": "Sworup diunk naslelem mozkur hanga ghal",
-       "nowiki_tip": "Wiki sworup durlokx kor",
-       "image_tip": "Bosoileli fayl",
-       "media_tip": "Failicho duvo",
-       "sig_tip": "Tuji soi, vell-chaap soit",
-       "hr_tip": "Adhvem rang (unnem vapor)",
        "summary": "Sar:",
        "subject": "Vishoy:",
        "minoredit": "Hem ek dhaktem bodol",
        "anoneditwarning": "<strong>Chotrai:</strong> Tuven sotrorombh korunk nai. Tu bodol korit zalear tuzo IP pot'to soglleank polleunk zatelem. Tu <strong>[$1 sotrorombh korit]</strong> vo <strong>[$2 kont rochit]</strong> zalear, tuje bodol tuzo vaporpeachem nanvak zoddteleo ani anik-ui faide asat.",
        "missingcommenttext": "Upkar korun tuzo xero boroi.",
        "blockedtitle": "Vapurpeak addaila",
-       "blockedtext": "<strong>Tujem vaporpeachem nanv vo IP pot'to addavpant aila.</strong>\n\nAddavop $1 hannem kelam.\nKaronn dilam tem <em>$2</em>.\n\n* Addavpachi survat: $8\n* Addavpachea somp’pacho vell: $6\n* Addavpak ievjila: $7\n\nTujean $1-ak vo dusrea [[{{MediaWiki:Grouppage-sysop}}|karbhariak]] addavnne bodol bhasabhas korunk sompork korunk zata. Tujean \"{{int:emailuser}}\" sobhavgunn vaprunk zaina kheriz ek void email pot'to tujea [[Special:Preferences|khatem posontint]] nischit kelea xivai ani tuka tem vaporpak addavnk na zalear. Tuzo chalont IP pot'to asa $3, ani addavnnecheo ank #$5 asa. Soglleo voileo bariksanno tum kortai tea vicharant somavex kor.",
+       "blockedtext": "<strong>Tujem vaporpeachem nanv vo IP pot'to addavpant aila.</strong>\n\nAddavop $1 hannem kelam.\nKaronn dilam tem <em>$2</em>.\n\n* Addavpachi survat: $8\n* Addavop sompovpacho vell: $6\n* Addavpak ievjila: $7\n\nTujean $1-ak vo dusrea [[{{MediaWiki:Grouppage-sysop}}|karbhariak]] addavnne vixim bhasabhas korunk sompork korunk zata. Tujean \"{{int:emailuser}}\" sobhavgunn vaprunk zaina kheriz ek void email pot'to tujea [[Special:Preferences|khatem posontint]] nischit kelea xivai ani tuka tem vaporpak addavnk na zalear. Tuzo chalont IP pot'to asa $3, ani addavnnecheo ank #$5 asa. Soglleo voileo bariksanno tum kortai tea vicharant somavex kor.",
        "blockednoreason": "Kainch karonn diunk na",
        "loginreqtitle": "Sotrorombh gorjechem",
        "loginreqlink": "sotrorombh kor",
        "accmailtitle": "Gupitutor dhaddlea",
        "newarticle": "(Novem)",
        "newarticletext": "Tuven ek duveche patlav kelai, zachem pan azun rochunk na.\nPan rochunk, khallchea chovkottan boroi (anik mahitik [$1 adar pan] polloi).\nTu hangasor chukin pavlai zalear tujea internet browser-achi <strong>Fatim</strong> vo <strong>Back</strong> butao dab.",
-       "anontalkpagetext": "----\n<em>Hem bhasabhasechem pan ek ninami vaporpeak zannem ozun ek khatem ugddunk na, vo to tem vaporna.</em>\nHea khatir amkam ankddeancho IP pot'to vaprunk podta taka vollkhunk.\nToslo IP pot'to sabar vaporpeamni vaprum ieta.\nTum zor ek ninami vaporpi asa ani tuka dista ki sombondit xere tuje vixim keleat, upkar korun [[Special:CreateAccount|ek khatem roch]] vo [[Special:UserLogin|log in]] fuddle guspop ninami vaporpeanchem tallunk.‎",
+       "anontalkpagetext": "----\n<em>Hem bhasabhasechem pan ek ninami vaporpeak zannem ozun ek khatem ugddunk na, vo to tem vaporna.</em>\nHea khatir amkam ankddeancho IP pot'to vaprunk podta taka vollkhunk.\nToslo IP pot'to sabar vaporpeamni vaprum ieta.\nTum zor ek ninami vaporpi asa ani tuka dista ki tukam sombond naslele xere tuje vixim keleat, upkar korun [[Special:CreateAccount|ek khatem roch]] vo [[Special:UserLogin|sotrarombh kor]] fuddle guspop ninami vaporpeanchem tallunk.‎",
        "noarticletext": "Sodheak hem pan ritem asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], vo [{{fullurl:{{FULLPAGENAME}}|action=edit}} hem pan rochunk zata]</span>.",
        "noarticletext-nopermission": "Sodheak hem pan ritem asa.\nTujean dusrea panani [[Special:Search/{{PAGENAME}}|hea panache nanv sodunk zata]], vo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sombondhi sotrani sodunk zata], pun tuka hem pan rochunk porvangi na.",
        "userpage-userdoesnotexist-view": "\"$1\" hea vapurpeachea khateachi nondnni korunk na.",
-       "clearyourcache": "<strong>Note:</strong> Samball’llea uprant, tuka ghoddiek tujea browseracho cache koddsoravnk poddot bodol pollonvche khatir.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> dhor <em>Reload</em> klik kortana, vo dam <em>Ctrl-F5</em> vo <em>Ctrl-R</em> (<em>⌘-R</em> Mac-acher)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> dam (<em>⌘-Shift-R</em> eka Mac-acher)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> dhor <em>Refresh</em> klik kortana, vo dam <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Hanga voch: <em>Menu → Settings</em> (<em>Opera → Preferences</em> Mac-acher) ani uprant <em>Privacy & security → Clear browsing data → Cached images and files</em>.‎",
+       "clearyourcache": "<strong>Chotrai:</strong> Samball’llea uprant, tuka ghoddiek tujea browseracho cache koddsoravnk poddot bodol pollonvche khatir.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> dhor <em>Reload</em> klik kortana, vo dam <em>Ctrl-F5</em> vo <em>Ctrl-R</em> (<em>⌘-R</em> Mac-acher)\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> dam (<em>⌘-Shift-R</em> eka Mac-acher)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> dhor <em>Refresh</em> klik kortana, vo dam <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Hanga voch: <em>Menu → Settings</em> (<em>Opera → Preferences</em> Mac-acher) ani uprant <em>Privacy & security → Clear browsing data → Cached images and files</em>.‎",
        "previewnote": "<strong>Hem fokot ek zholok mhonn ugddas dhor.</strong>\nTuje bodol azun sambhallun dovrunk nant!",
        "continue-editing": "Sompadon korpachea zagear voch",
        "editing": "Sompadon kortai: $1",
        "permissionserrors": "Porvangechi chuk",
        "permissionserrorstext-withaction": "$2, hem korpak tuka porvangi na, {{PLURAL:$1|hea karnnak lagon|hea karnnank lagun}}:",
        "recreate-moveddeleted-warn": "<strong>Xittkavnni: Tum ek pan porot rochtai jem fattim kadun udoilelem.<strong>\n\nPanacho sompadon korop sarkem zalear dhean di.\nPan kadoupachem ani halovpachem sotr, sovloti khatir hangasor dilelem asa:",
-       "moveddeleted-notice": "Hem pan kadun udoilelem asa.\nPanachea kadun udounechi, rakhpachi, ani hallovnechi sotr sondorba khatir sokoil dilea.",
+       "moveddeleted-notice": "Hem pan kaddun udoilelem asa.\nPanachem kaddun uddovpachem, rakhpachem, ani halovpachem sotr sondhorba khatir sokoil dila.",
        "content-model-wikitext": "wikimozkur",
        "content-model-text": "Sado mozkur",
        "post-expand-template-inclusion-warning": "<strong>Chotrai:</strong> Sancho zoddpacho akar chod vhodlem asa.\nThodde sache zoddchenant.",
        "page_last": "akhirchem",
        "histlegend": "Frk nivoddni: Jeo uzollneo tuka comparar korunk zai, tenche fudle ''radio'' butao petoi ani ''Enter'' nazalear khalcho butao dab.<br />\nVivron: <strong>({{int:cur}})</strong> = halinchi uzollnie borobor forok, <strong>({{int:last}})</strong> = adli uzollnie borobor forok, <strong>{{int:minoreditletter}}</strong> = dhaktem bodol.",
        "history-fieldset-title": "Uzollnneo chall",
-       "history-show-deleted": "Fokot uzollnni kadun udoilelem",
+       "history-show-deleted": "Fokot uzollnni kadun uddoilolem",
        "histfirst": "sogleavon adhlem",
        "histlast": "sogleavon novem",
        "history-feed-title": "Uzollnniancho itihas",
        "revdel-restore": "Disnnem bodol",
        "pagehist": "Panacho itihas",
        "mergehistory-reason": "Karonn:",
-       "mergelog": "Vilin korpacho sotr",
+       "mergelog": "Vilin korpachem sotr",
        "revertmerge": "Doxim kor",
        "history-title": "\"$1\" hachea uzollnnecho itihas",
        "difference-title": "\"$1\"-chea avrutint ontor",
        "editundo": "kel'lem portavchem",
        "diff-empty": "(Kaim forok na)‎",
        "diff-multi-sameuser": "(Heach vaporpean {{PLURAL:$1|kel'lo modlo ek bodol dakhounk na|kel'le modle $1 bodol dakhounk nan}})",
-       "diff-multi-otherusers": "({{PLURAL:$1|Ek modli uzollnni|$1 modleo uzollnneo}} {{PLURAL:$2|ek her vaporpi|$2 her vaporpi}}, hache vorvim dakhovnk na)‎",
+       "diff-multi-otherusers": "({{PLURAL:$2|Ek her vaporpea|$2 her vaporpeam}} vorvim {{PLURAL:$1|ek modli uzollnni|$1 modleo uzollnneo}} dakhovnk na)",
        "searchresults": "Sodache porinaman",
        "searchresults-title": "\"$1\" -khatir sodache porinaman",
        "prevn": "adlem {{PLURAL:$1|$1}}",
        "prefs-help-email": "Email potto sokticho na, pun tum gupitutor visroxi zalear gupitutor punorsthapon korunk email pottechi goroz podta.",
        "prefs-help-email-others": "Tujean dusreank tujea vapurpeacho panar vo bhasabhasache panar aslele eke email duve vorvim tuje xim sompork korunk diunk zata.\nDusre tuje xim sompork kortat tednam tuzo email potto tankam kollchenam.",
        "userrights-user-editname": "Ek vapurpeachem nanv ghal:",
-       "group-bot": "Robotam",
+       "group-bot": "Robottam",
        "group-sysop": "Karbhari",
        "group-all": "(soglle)",
        "grouppage-bot": "{{ns:project}}:Robotam",
        "right-move": "Panam haloi",
        "right-writeapi": "Borovpeache API-cho upeog",
        "newuserlogpage": "Vapurpi rochnnechem sotr",
-       "rightslog": "Vaporpeachea hokancho sotr",
+       "rightslog": "Vaporpeachea hokanchem sotr",
        "action-edit": "hem pan sudar",
        "action-createaccount": "hem vaporpeachem khatem roch",
        "nchanges": "$1 {{PLURAL:$1|bodol}}",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|nove pananchi suchi]]-ui polloi)",
        "rcfilters-tag-remove": "'$1' kadd",
        "rcfilters-legend-heading": "<strong>Sonkxepachi volleri:</strong>",
+       "rcfilters-group-results-by-page": "Pana pormonnem pongddache porinnam",
        "rcfilters-activefilters": "Kriaxil challnneo",
        "rcfilters-activefilters-hide": "Lipoi",
        "rcfilters-activefilters-show": "Dakhoi",
        "rcfilters-savedqueries-unsetdefault": "Default aslolem kaddun uddoi",
        "rcfilters-savedqueries-remove": "Kadun udoi",
        "rcfilters-savedqueries-new-name-label": "Nanv",
+       "rcfilters-savedqueries-new-name-placeholder": "Challnnecho hetu vornnon kor",
        "rcfilters-savedqueries-apply-label": "Challnni roch",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Default challnni roch",
        "rcfilters-savedqueries-cancel-label": "Rod'd kor",
        "rcfilters-savedqueries-add-new-title": "Chalont challnnechi manddavoll samball",
        "rcfilters-savedqueries-already-saved": "Heo challnneo adinch samball’lloleo asat. Ek novi Samball’lloli Challnni rochunk, tujeo manddavolleo bodol.",
        "rcfilters-filterlist-feedbacklink": "Hea challnnechea avtam vixim tuka kitem dista tem amkam sang",
        "rcfilters-highlightmenu-title": "Ek rong vinch",
        "rcfilters-filterlist-noresults": "Kosleoch challnneo mellunk nant",
+       "rcfilters-state-message-fullcoverage": "Hea pongddantle soglleo challnneo vinchop mhonnche kainch vinchop na, hea khatir he challnnek kainch porinnam na. Pongddant  hacho somavex asa: $1",
        "rcfilters-filtergroup-authorship": "Iogdanachem borovp",
        "rcfilters-filter-editsbyself-label": "Tuven kel'leo bodol",
        "rcfilters-filter-editsbyself-description": "Tujeo svotacheo yogdanam.",
        "rcfilters-filter-editsbyother-label": "Dusreanim kel'le bodol",
        "rcfilters-filter-editsbyother-description": "Tuje khas bhairavn, soglle bodol",
        "rcfilters-filtergroup-user-experience-level": "Vaporpeachi nondnni ani onnbhov",
+       "rcfilters-filter-user-experience-level-registered-label": "Nondnni kelolem",
        "rcfilters-filter-user-experience-level-registered-description": "Sotrarombh zalole sompadok.",
+       "rcfilters-filter-user-experience-level-unregistered-label": "Nondnni korunk naslolem",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Sompadok je sotrarombhit nant.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Nondnni aslole sompadok zanche 10 poros unnem sompadon vo 4 disanchem kario asa.",
        "rcfilters-filter-user-experience-level-learner-label": "Xikpi",
+       "rcfilters-filter-user-experience-level-learner-description": "Nondnni kelole sompadok zancho onnubhov \"Nove ievpi\" ani \"Onnbhovi vaporpi\" modem urta.",
        "rcfilters-filter-user-experience-level-experienced-label": "Onnbhovi vaporpi",
+       "rcfilters-filter-user-experience-level-experienced-description": "500 odik sompadon ani 30 disanchem kario aslolem nondnni kelolem sompadok.",
        "rcfilters-filtergroup-automated": "Apoap zalolem iogdan",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Apoap avtamni kelolem sompadon",
        "rcfilters-filter-humans-description": "Monxani kelolem sompadon",
        "rcfilters-filter-reviewstatus-unpatrolled-description": "Paro kela mhonn hatan vo apoap khunnavnk naslolem sompadon.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Paro korunk naslolem",
+       "rcfilters-filter-reviewstatus-manual-description": "Sompadon zaka paro kelam mhonn hatan khunnailam.",
+       "rcfilters-filter-reviewstatus-manual-label": "Hatan paro korpant ailolem",
+       "rcfilters-filter-reviewstatus-auto-label": "Apoap paro korpant ailolem",
        "rcfilters-filtergroup-significance": "Mhotv",
        "rcfilters-filter-minor-label": "Dhakte bodol",
        "rcfilters-filter-minor-description": "Borovpean dhaktem mhonn khunne chitt kelolem sompadon",
        "rcfilters-filter-major-description": "Dhaktem mhonn khunne chitt korunk naslolem sompadon",
        "rcfilters-filtergroup-watchlist": "Sadurvollerintlim panam",
        "rcfilters-filter-watchlist-watched-label": "Sadurvollerintlim",
+       "rcfilters-filter-watchlist-watched-description": "Tujea Sadurvollerichea panamche bodol.",
        "rcfilters-filter-watchlist-watchednew-label": "Sadurvolleriche nove bodol",
        "rcfilters-filter-watchlist-watchednew-description": "Bodol ghoddleat ten’na savn tuvem bhett divnk nant tea sadurvollerintlim panache bodol.",
-       "rcfilters-filter-watchlist-notwatched-label": "Sadurvollerintlim nhoi",
+       "rcfilters-filter-watchlist-notwatched-label": "Sadurvollerint na",
        "rcfilters-filter-watchlist-notwatched-description": "Sadurvollerichim panank bodol soddun her sogllem.",
        "rcfilters-filtergroup-watchlistactivity": "Sadurvollerichem kario",
        "rcfilters-filter-watchlistactivity-unseen-label": "Pollovnk naslole bodol",
        "rcfilters-view-tags": "Khunnechittichem sompadon",
        "rcfilters-view-tags-tooltip": "Sompadonacheo khunne chitti vaprun porinnam chall",
        "rcfilters-view-tags-help-icon-tooltip": "Khunnechittichem sompadona babtint odik xikun ghe",
+       "rcfilters-liveupdates-button-title-off": "Nove bodol ghoddtta ten’na dakhol kor",
        "rcfilters-watchlist-markseen-button": "Soglle bodol polleleat mhonn khunnai.",
+       "rcfilters-watchlist-edit-watchlist-button": "Nodor dovorlolea panachi volleri sompadon kor",
        "rcfilters-watchlist-showupdated": "Bodol zal'leak savn je panank tuvem bhett dinvk na, te bodol <strong>datt</strong> okxoramni, ani ghott khunnamni dileat.",
+       "rcfilters-filter-showlinkedfrom-option-label": "Vinchlolea panant <strong>savn zulltat tim panam</strong>",
        "rcfilters-filter-showlinkedto-label": "Panak zoddtat tea panache bodol dakhoi",
+       "rcfilters-filter-showlinkedto-option-label": "Vinchlolea panak <strong>zulltat tim pana</strong>",
        "rcfilters-target-page-placeholder": "Ek panache nanv ( vo vorg) ghal",
        "rcnotefrom": "Sokoil <strong>$3, $4<strong> savn {{PLURAL:$5|zalelem bodol dilam|zalelem bodol dileant}} (<strong>$1<strong> meren {{PLURAL:$5|dakhoilam|dakhoileant}}).",
        "rclistfrom": "$3 $2 savn suru zatelim nove bodol dakhoi",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byti}} bodol kel'lea uprant",
        "rc-enhanced-expand": "Bariksann dakhoi",
        "rc-enhanced-hide": "Bariksann lipoi",
-       "rc-old-title": "orombhant rochloli \"$1\" hea nanvan‎.",
+       "rc-old-title": "arombhant rochloli \"$1\" hea nanvan‎",
        "recentchangeslinked": "Sombondit bodol",
        "recentchangeslinked-feed": "Sombondit bodol",
        "recentchangeslinked-toolbox": "Sombondit bodol",
        "filehist-comment": "Xero",
        "imagelinks": "Faylicho vapor",
        "linkstoimage": "{{PLURAL:$1|Hem pan|$1 Him panam}} hi fayl {{PLURAL:$1|vaporta|vaportat}}:",
-       "linkstoimage-more": "$1 poros odik {{PLURAL:$1|pan vaporta|panam vaporta}} hi fayl.\nSokoili volleri dakhoita {{PLURAL:$1|poilem pan|poilim $1 panam}} jem hich fayl vaporta. Ek [[Special:WhatLinksHere/$2|purnn volleri]] uplobdh asa.‎",
+       "linkstoimage-more": "$1 poros odik {{PLURAL:$1|pan vaporta|panam vaportat}} hi fayl.\nSokoili volleri dakhoita {{PLURAL:$1|poilem pan|poilim $1 panam}} jem hich fayl vaporta. Ek [[Special:WhatLinksHere/$2|purnn volleri]] uplobdh asa.‎",
        "nolinkstoimage": "Hea faylik vaportat toslim panam nant",
        "linkstoimage-redirect": "$1 (fayl punornirdexon) $2",
        "sharedupload-desc-here": "Hi fayl $1, hachi ani dusrea prokolpanim hachem upeog korunk zata.\nHachem [$2 faylichem vivron panan] asleli vivron khala dilea:",
        "longpages": "Lamb panam",
        "protectedpages-filters": "Challnneo:",
        "listusers": "Vaporpeanchi volleri",
-       "usercreated": "$3 hannem $1 disa $2 vaztam rochlelem",
+       "usercreated": "$3 hannem $1 disa $2 vorancher rochlolem",
        "newpages": "Novim panam",
        "move": "Zago bodol",
        "pager-newer-n": "{{PLURAL:$1|novem 1|novim $1}}",
        "specialloguserlabel": "Korpi:",
        "speciallogtitlelabel": "Mokh (mathallo vo {{ns:user}}:vapurpeachem nanv):",
        "log": "Sotram",
-       "all-logs-page": "Soglle bhousache sotram",
-       "alllogstext": "{{SITENAME}} hacheo sogllea uplobdh sotranchi ektthaim dakhovnni.\nTujean tuzo dekhavo ornum ieta ek sotracho prokar vinchun, vaporpeachem nanv (vhodle and dhakte okxora modem forok podta), vo porinnam zalolem pan (hanga-ui vhodle and dhakte okxora modem forok podta).‎",
+       "all-logs-page": "Sogllim bhousachim sotram",
+       "alllogstext": "{{SITENAME}} hacheo sogllea uplobdh sotranchi ektthaim dakhovnni.\nTujean tuzo dekhavo ornum ieta ek sotracho prokar vinchun, vaporpeachem nanv (vhoddlea ani dhakttea okxora modem forok poddtta), vo porinnam zalolem pan (hangai vhoddle and dhaktte okxora modem forok poddtta).",
        "logempty": "Sotran zullpi nog nant.‎",
        "allpages": "Sogllim panam",
        "nextpage": "Fuddlem pan ($1)",
        "allpagesfrom": "Hanga thavn suru zatelea panank dakhoi:",
        "allarticles": "Sogllim panam",
        "allpagessubmit": "Voch",
-       "allpages-hide-redirects": "Punornirdexonam lipoi",
+       "allpages-hide-redirects": "Punornirdexona lipoi",
        "categories": "Vorg",
        "sp-deletedcontributions-contribs": "iogdan",
        "linksearch-ns": "Nanv-tholl:",
        "watch": "Nodor dovor",
        "watchthispage": "Hea panar dixtt dovor",
        "unwatch": "Nodor kadd",
-       "watchlist-details": "Tujea Sadurvollerint {{PLURAL:$1|$1 pan asa|$1 panam asat}} (te-bhair ulovpachim panam asat).",
+       "watchlist-details": "Tujea Sadurvollerint {{PLURAL:$1|$1 pan asa|$1 panam asat}} (tea-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.‎",
+       "wlnote": "Sokoil {{PLURAL:$1|ho nimanno bodol|hem nimanneo <strong>$1</strong> bodol}} nimannea {{PLURAL:$2|voran|<strong>$2</strong> voramni}}, $3, $4 porian.‎",
        "watchlist-options": "Sadurvollericheo poryay",
        "watching": "Disht dovortanv...",
        "unwatching": "Disht kaddthanv...",
        "linkshere": "Sokoilim panam <strong>$2</strong> ak zoddtat:",
        "nolinkshere": "Khoincheim pan <strong>$2</strong> ak zoddna.",
        "isredirect": "punornirdexon pan",
-       "istemplate": "Durasth-somaves",
+       "istemplate": "durasth-somaves",
        "isimage": "faylicho duvo",
        "whatlinkshere-prev": "{{PLURAL:$1|adlem|adlem $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|fuddlem|fuddlim $1}}",
        "whatlinkshere-links": "← duve",
-       "whatlinkshere-hideredirs": "$1 punornirdexonam",
-       "whatlinkshere-hidetrans": "$1 durasth-somaveso",
+       "whatlinkshere-hideredirs": "$1 punornirdexona",
+       "whatlinkshere-hidetrans": "$1 durasth-somavex",
        "whatlinkshere-hidelinks": "$1 duve",
        "whatlinkshere-hideimages": "$1 faylinche duve",
        "whatlinkshere-filters": "Challnio",
        "change-blocklink": "Addavnnni bodol",
        "contribslink": "yogdan",
        "blocklogpage": "addavnnechem sotr",
-       "blocklogentry": "[[$1]] addailelem $2 asun vellacho ont: $3",
-       "reblock-logentry": "addavpachem bosovp bodol’lam [[$1]] hache khatir sompacho vell dilam $2 $3‎",
+       "blocklogentry": "[[$1]] ak addaila, itlea vellak: $2, karonn: $3",
+       "reblock-logentry": "addavpachem bosovp bodol’lam [[$1]] hache khatir sompovpacho vell dila $2 $3‎",
        "block-log-flags-nocreate": "Khatem rochop opatr kelam",
        "proxyblocker": "Protinidhi-sirvidor addavpi‎",
        "move-page": "$1 haloi",
        "movepage-moved": "<strong>\"$1\" haka \"$2\" hanga haloila</strong>",
        "movepage-moved-redirect": "Punornirdexon rochun ailam.",
        "movepage-moved-noredirect": "Punornirdexon rochop addaila.",
+       "movepage-delete-first": "Mokhichea panak chodd uzollnneo asat ek pan halovtana kadun udovche khatir. Poilim hostukim pan kadun udoi, ani uprant porot proiotn kor.",
+       "movepage-page-exists": "Pan $1 adinch ostitvant asa ani apoap tache voir borounk zaina.",
        "movepage-page-moved": "$1 panak $2 hanga haloila.",
        "movepage-page-unmoved": "$1 haka $2 hanga halounk zaunk na.",
        "movelogpage": "Pan halovneancho sotr",
        "allmessagesdefault": "Default sondex mozkur",
        "thumbnail-more": "Vhodlem kor",
        "thumbnail_error": "Lhan-imaz toiar kortana chuk zali. Karonn: $1",
-       "importlogpage": "Aiatacho sotr",
+       "importlogpage": "Aiatachem sotr",
        "tooltip-pt-userpage": "{{GENDER:|Tujem vaporpeachem}} pan",
        "tooltip-pt-mytalk": "{{GENDER:|Tumchem}} bhasabhasachem pan",
        "tooltip-pt-preferences": "{{GENDER:|Tumcheo}} avddi",
        "tooltip-ca-nstab-special": "Hem ek kherit pan, ani hem bodlunk zaina",
        "tooltip-ca-nstab-project": "Prokolpachem pan polloi",
        "tooltip-ca-nstab-image": "Faylichem pan polloi",
-       "tooltip-ca-nstab-mediawiki": "Iontronacho sondex polloi",
+       "tooltip-ca-nstab-mediawiki": "Iontronnacho sondex polloi",
        "tooltip-ca-nstab-template": "Sancho polloi",
        "tooltip-ca-nstab-category": "Vorgachem pan polloi",
        "tooltip-minoredit": "Haka ek kirkoll sudharop mhunn khunnay",
        "tooltip-rollback": "\"Kovllop\" hea panak nimannea yogdan korpean kello (kelle) bodol eka kollant portota.",
        "tooltip-undo": "\"Rodd' kor\" sudharop portita ani sudharopak Zholok ritin ukodta. Tem saran karon zoddunk dita.",
        "tooltip-summary": "Mottvo sar ghal",
-       "simpleantispam-label": "Spam-virudh topasni.\nHem bhori <strong>nakai</strong>!",
+       "simpleantispam-label": "Spam-virudh topasnni.\nHem bhor <strong>nakai</strong>!",
        "pageinfo-title": "\"$1\" ‎khatir mhaiti",
        "pageinfo-header-basic": "Mull mhaiti‎",
        "pageinfo-header-edits": "Bodolacho itihas",
        "pageinfo-header-properties": "Panache gunndhorm",
        "pageinfo-display-title": "Manddlolem mathallem",
        "pageinfo-default-sort": "Default arin manddunk chavi",
-       "pageinfo-length": "Panachi lambai (bayt-ant)‎",
+       "pageinfo-length": "Panachi lambai (baytt-ant)‎",
        "pageinfo-article-id": "Panacho ank",
        "pageinfo-language": "Panachea mozkurachi bhas",
        "pageinfo-content-model": "Panachea mozkuracho nomuno",
-       "pageinfo-robot-policy": "Robotam koddlean suchien ghalop",
+       "pageinfo-robot-policy": "Robotam koddlean suchent ghalop",
        "pageinfo-robot-index": "Porvangi asa",
        "pageinfo-robot-noindex": "Porvangi nam",
        "pageinfo-watchers": "Panacher dixtt dovortoleancho ankddo",
        "pageinfo-toolboxlink": "Panachi mahiti",
        "pageinfo-contentpage": "Ek mozkurachem pan koxem dhorpant ailam‎",
        "pageinfo-contentpage-yes": "Hoi",
-       "patrol-log-page": "Paro korpeacho sotr",
+       "patrol-log-page": "Paro korpachem sotr",
        "previousdiff": "←  Adlo bodol",
        "nextdiff": "Fuddlem bodol →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|pan|panam}}",
        "redirect": "Fayl, vaporpi, pan, uzollnni vo sotr ank‎ vorvim punornirdexon kor",
        "redirect-summary": "Hem vixex pan punornirdexit korta eka faylik (faylichem nanv dilear), eke panak (uziollnecho ank vo panacho ank dilear), ek vaporpeachem panak (eke vaporpeache ank dilear), vo ek sotr nond (sotrachem ank dilear). Vapor: [[{{#Special:Redirect}}/file/Dekhik.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], vo [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Voch‎",
-       "redirect-lookup": "Suchien polloi:",
+       "redirect-lookup": "Suchint polloi:",
        "redirect-value": "Mol:",
-       "redirect-user": "Vaporpeacho ank",
+       "redirect-user": "Vaporpeancho ank",
        "redirect-page": "Panacho ank",
        "redirect-revision": "Panachi uzollnni",
        "redirect-file": "Faylichem nanv",
        "htmlform-title-not-exists": "$1 ostitvant na.",
        "logentry-delete-delete": "$1, hannem {{GENDER:$2|kadun udoile}} pan $3",
        "logentry-delete-restore": "$1 hannem {{GENDER:$2|porot haddlam}} pan $3 ($4)‎",
-       "logentry-delete-revision": "$1 hannem {{PLURAL:$5|uzolliechem}} disnem  $3, hea panar {{GENDER:$2|bodol’la}}: $4‎",
+       "logentry-delete-revision": "$1 hannem {{PLURAL:$5|uzollnnechem}} disnnem $3, hea panar {{GENDER:$2|bodol’la}}: $4‎",
        "revdelete-content-hid": "mozkur lipoila",
        "logentry-move-move": "$1, hannem $3 panak $4 {{GENDER:$2|haloilea}}",
        "logentry-move-move-noredirect": "$1, hannem pan $3 savn $4 {{GENDER:$2|haloilam}} punornirdexon dorinastanam‎",
        "logentry-move-move_redir": "$1 hannem pan $3 savn $4 {{GENDER:$2|haloilolo}} punornirdexonavoir",
-       "logentry-patrol-patrol-auto": "$1-an $3, hea panachem $4, hea uzollniecho paro kelam mhonn apoap {{GENDER:$2|khunnailam}}.",
+       "logentry-patrol-patrol-auto": "$1-an $3, hea panachem $4, hea uzollnnecho paro kelam mhonn apoap {{GENDER:$2|khunnailam}}.",
        "logentry-newusers-create": "Vapurpeacho kont $1 {{GENDER:$2|rochlam}}",
        "logentry-newusers-autocreate": "Vaporpeachem khatem $1 apoap {{GENDER:$2|rochun}} ailem",
        "logentry-upload-upload": "$1-an $3 {{GENDER:$2|upload kela}}",
index 58fddbe..2b95547 100644 (file)
        "botpasswords-label-cancel": "Bataliya",
        "botpasswords-label-delete": "Luluta",
        "passwordreset": "Boli'a tahe u'unti",
-       "bold_sample": "Teks botiye ma cetakiyolo mohulodu",
-       "bold_tip": "Teks mohulodu",
-       "italic_sample": "Teks botiye ma cetakiyolo yinti-yintili",
-       "italic_tip": "Teks yinti-yintili",
-       "link_sample": "Judul wumbuta",
-       "link_tip": "Wumbuta to delomiyo",
-       "extlink_sample": "http://www.example.com judul wumbuta",
-       "extlink_tip": "Wumbuta to diluwari (eelayi awalan http://)",
-       "headline_sample": "Judul teks",
-       "headline_tip": "Lenggota 2 Judul",
-       "nowiki_sample": "Tuwota teks u ja format teeye",
-       "nowiki_tip": "Pelehiya moformat wiki",
-       "image_tip": "Dembinga berkas",
-       "media_tip": "Wumbuta lo berkas",
-       "sig_tip": "Pali lo ulu'umu wawu tuwoto wakutu",
-       "hr_tip": "Garisi bula-bulawahu",
        "summary": "Limbu'o",
        "minoredit": "Utiye biloli'o ngo'idi",
        "watchthis": "Dahayi halaman botiye",
index 70648d7..f968ec3 100644 (file)
        "resetpass-submit-cancel": "𐍃𐍅𐌴𐌹𐌱",
        "passwordreset": "𐌰𐍆𐍄𐍂𐌰 𐍃𐌰𐍄𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
        "passwordreset-username": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
-       "bold_sample": "𐍃𐍅𐌹𐌽𐌸𐍉𐍃 𐌱𐍉𐌺𐍉𐍃",
-       "bold_tip": "𐍃𐍅𐌹𐌽𐌸𐍉𐍃 𐌱𐍉𐌺𐍉𐍃",
-       "italic_sample": "𐍅𐍂𐌰𐌹𐌵𐍉𐍃 𐌱𐍉𐌺𐍉𐍃",
-       "italic_tip": "𐍅𐍂𐌰𐌹𐌵𐍉𐍃 𐌱𐍉𐌺𐍉𐍃",
-       "link_sample": "𐌲𐌰𐍅𐌹𐍃𐍃𐌹-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
-       "link_tip": "𐌹𐌽𐌽𐌰𐌽𐌰 𐌲𐌰𐍅𐌹𐍃𐍃",
-       "extlink_sample": "http://www.example.com 𐌲𐌰𐍅𐌹𐍃𐍃𐌹-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
-       "extlink_tip": "𐌿𐍄𐌰𐌲𐌰𐍅𐌹𐍃𐍃 (𐌲𐌰𐌼𐌹𐌽𐌸𐌴𐌹 http:// 𐍆𐌰𐌿𐍂𐌰𐌻𐌰𐌲𐌴𐌹𐌽𐍃)",
-       "headline_sample": "𐌿𐍆𐌰𐍂𐍃𐍄𐍂𐌹𐌺𐌰𐌱𐍉𐌺𐍉𐍃",
-       "headline_tip": "𐌷𐌰𐌿𐌷𐌹𐌸𐌰 •𐌱• 𐌿𐍆𐌰𐍂𐍃𐍄𐍂𐌹𐌺𐍃",
-       "nowiki_sample": "𐍃𐌰𐍄𐌴𐌹 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽𐌿𐌷 𐌲𐌰𐍂𐍅𐌹 𐌷𐌴𐍂",
-       "nowiki_tip": "𐌽𐌹 𐌱𐍂𐌿𐌺𐌴𐌹 𐍅𐌹𐌺𐌹-𐍆𐌰𐌿𐍂𐌼𐌰𐍄𐌴𐌹𐌽𐌰𐌹𐍃",
-       "image_tip": "𐌹𐌽𐌻𐌰𐌲𐌹𐌸 𐍆𐌰𐌾𐌻",
-       "media_tip": "𐌲𐌰𐍅𐌹𐍃𐍃 𐌳𐌿 𐍆𐌰𐌾𐌻𐌰",
-       "sig_tip": "𐌸𐌴𐌹𐌽𐌰 𐌿𐍆𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐌼𐌹𐌸 𐌲𐌻𐌰𐌲𐌲𐍅𐌰𐌼𐌼𐌰 𐌼𐌴𐌻𐌰",
-       "hr_tip": "𐍂𐌰𐌹𐌷𐍄𐍃 𐍃𐍄𐍂𐌹𐌺𐍃 (𐌽𐌹 𐌱𐍂𐌿𐌺𐌴𐌹 𐌿𐍆𐌰𐍂𐍆𐌹𐌻𐌿)",
        "summary": "𐌼𐌰𐌿𐍂𐌲𐌿𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃:",
        "subject": "𐌿𐍆𐍅𐌰𐌿𐍂𐍀𐌰:",
        "minoredit": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
index 83be9d1..32c6414 100644 (file)
        "passwordreset-username": "Ὄνομα χρωμένου:",
        "changeemail-none": "(οὐδέν)",
        "changeemail-submit": "Ἀλλάττειν ἠλ.-ταχυδρομεῖον",
-       "bold_sample": "Γράμματα παχέα",
-       "bold_tip": "Γράμματα παχέα",
-       "italic_sample": "Γράμματα πλάγια",
-       "italic_tip": "Γράμματα πλάγια",
-       "link_sample": "Συνδέσμου ὄνομα",
-       "link_tip": "Σύνδεσμος οἰκεῖος",
-       "extlink_sample": "http://www.example.com ὄνομα συνδέσμου",
-       "extlink_tip": "Ἐξώτερος σύνδεσμος (μέμνησο τοῦ προθέματος http://)",
-       "headline_sample": "Κείμενον ἐπικεφαλίδος",
-       "headline_tip": "Κλίμακος 2 ἐπικεφαλίς",
-       "nowiki_sample": "Εἰσάγειν ἀμόρφωτον κείμενον ὧδε",
-       "nowiki_tip": "Ἀγνοεῖν βικι-μορφοποιίαν",
-       "image_tip": "Ἐμβεβαπτισμένον ἀρχεῖον",
-       "media_tip": "Τὸ προσάγον πρὸς τὸ φορτίον",
-       "sig_tip": "Ὑπογραφή σου μετὰ χρονοσφραγίδος",
-       "hr_tip": "Ὁριζόντιος γραμμή (χρηστέα φειδωλώς)",
        "summary": "Σύνοψις:",
        "subject": "Χρῆμα:",
        "minoredit": "Μικρὰ ἥδε ἡ μεταβολή",
index 9352100..3a735a3 100644 (file)
        "resettokens-watchlist-token": "Token fir dr Webfeed (Atom/RSS) vu dr [[Special:Watchlist|Änderigen an Syten uf Dyre Beobachtigslischt]]",
        "resettokens-done": "Token zruckgsetzt.",
        "resettokens-resetbutton": "Uusgwehlti Token zrucksetze",
-       "bold_sample": "fetti Schrift",
-       "bold_tip": "Fetti Schrift",
-       "italic_sample": "kursiv gschribe",
-       "italic_tip": "Kursiv gschribe",
-       "link_sample": "Stichwort",
-       "link_tip": "Interne Link",
-       "extlink_sample": "http://www.example.com Linktekscht",
-       "extlink_tip": "Externer Link (http:// beachte)",
-       "headline_sample": "Abschnitts-Überschrift",
-       "headline_tip": "Überschrift Äbeni 2",
-       "nowiki_sample": "Doo nit-formatierte Text yygee",
-       "nowiki_tip": "Wiki-Formatierige ignoriere",
-       "image_sample": "Byschpil.jpg",
-       "image_tip": "Bildverwys",
-       "media_sample": "Byschpil.ogg",
-       "media_tip": "Dateie-Link",
-       "sig_tip": "Dyni Signatur mit Zytagab",
-       "hr_tip": "Horizontali Linie (sparsam verwende)",
        "summary": "Zämmefassig:",
        "subject": "Beträff:",
        "minoredit": "Numen es birebitzeli gänderet",
index a06f315..0b3f837 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|તમારી ધ્યાનસૂચિના પાનામાં ફેરફાર ]]ની વેબ ફીડ (Atom/RSS) નિશાની",
        "resettokens-done": "નિશાનીઓ ફરી ગોઠવવામાં આવી.",
        "resettokens-resetbutton": "પસંદ કરેલ નિશાનીઓ ફરી ગોઠવો",
-       "bold_sample": "ઘાટા અક્ષર",
-       "bold_tip": "ઘાટું લખાણ",
-       "italic_sample": "ત્રાંસા અક્ષર",
-       "italic_tip": "ઇટાલિક (ત્રાંસુ) લખાણ",
-       "link_sample": "કડીનું શીર્ષક",
-       "link_tip": "આંતરિક કડી",
-       "extlink_sample": "http://www.example.com કડીનું શીર્ષક",
-       "extlink_tip": "બાહ્ય કડી (શરૂઆતમાં http:// ઉમેરવાનું ભુલશો નહી)",
-       "headline_sample": "મથાળાનાં મોટા અક્ષર",
-       "headline_tip": "બીજા ક્રમનું મથાળું",
-       "nowiki_sample": "ફોર્મેટ કર્યા વગરનું લખાણ અહીં ઉમેરો",
-       "nowiki_tip": "વિકિ ફોર્મેટીંગને અવગણો",
-       "image_sample": "Example.jpg",
-       "image_tip": "અંદર વણાયેલી (Embedded) ફાઇલ",
-       "media_sample": "Example.ogg",
-       "media_tip": "ફાઇલની કડી",
-       "sig_tip": "સમયછાપ સાથે તમારા હસ્તાક્ષર",
-       "hr_tip": "આડી લીટી (શક્ય તેટલો ઓછો ઉપયોગ કરો)",
        "summary": "સારાંશ:",
        "subject": "વિષય:",
        "minoredit": "આ એક નાનો ફેરફાર છે",
index 3cb79ca..a1f5c31 100644 (file)
        "nstab-template": "Clowan",
        "nstab-help": "Duillag choonee",
        "nstab-category": "Ronney",
+       "mainpage-nstab": "Ard-ghuillag",
        "nosuchaction": "Cha nel lheid yn obbyr ayn",
        "nosuchspecialpage": "Cha nel y duillag er lheh shoh ayn",
        "error": "Marranys",
        "virus-scanfailed": "vrish y ronsaght (coad $1)",
        "virus-unknownscanner": "ronseyder noi-veerys gyn enney",
        "yourname": "Dt'ennym ymmydeyr:",
+       "userlogin-yourname": "Ennym ymmydeyr",
+       "userlogin-yourname-ph": "Screeu ennym ymmydeyr",
        "yourpassword": "Fockle yn arrey:",
+       "userlogin-yourpassword": "Fockle yn arrey",
        "yourpasswordagain": "Aascreeu dt'ockle arrey:",
        "login": "Log stiagh",
        "nav-login-createaccount": "Log stiagh / croo coontys",
        "notloggedin": "Cha nel ou loggit stiagh",
        "createaccount": "Croo coontys",
        "createaccountmail": "Croo fockle arrey shallidagh gyn tort as cur eh da'n post-l reiht ayd",
+       "createacct-benefit-body2": "{{PLURAL:$1|duillag|duillagyn}}",
        "loginerror": "Marranys loggal stiagh",
        "createaccounterror": "Cha nod shin croo coontys: $1",
        "noname": "Cha honree uss ennym ymmydeyr fondagh.",
        "passwordreset-emailelement": "Ennym ymmydeyr: \n$1\n\nFockle arrey shallidagh: \n$2",
        "passwordreset-emailsentemail": "Ta post-l cur gys cooinaghtyn er ny chur dhyt.",
        "changeemail-none": "(gyn)",
-       "bold_sample": "Clou trome",
-       "bold_tip": "Clou trome",
-       "italic_sample": "Clou iddaalagh",
-       "italic_tip": "Clou iddaalagh",
-       "link_sample": "Ennym y chianglee",
-       "link_tip": "Kiangley ynveanagh",
-       "extlink_sample": "http://www.example.com ennym chianglee",
-       "extlink_tip": "Kiangley mooie (cooiney roie-ockle http://)",
-       "headline_sample": "Teks y chione-linney",
-       "headline_tip": "Kione-linney corrym 2",
-       "nowiki_sample": "Cur stiagh teks gyn cummey ayns shoh",
-       "nowiki_tip": "Ny chur tastey da cummey wiki",
-       "image_tip": "Coadan jingit",
-       "media_tip": "Kiangley yn choadan",
-       "sig_tip": "Dt'ennym screeuit lesh clouag hraa",
-       "hr_tip": "Linney cochruinnagh (ymmyd dy spaarailagh)",
        "summary": "Giare-choontey:",
        "subject": "Cooish/kione-linney:",
        "minoredit": "She myn-reaghey eh shoh",
        "note": "'''Note:'''",
        "previewnote": "'''Cooinnee nagh vel agh roie-haishbynys eh shoh;\ncha nel dty chaghlaaghyn sauailt foast!'''",
        "editing": "Reaghey $1",
+       "creating": "Croo $1",
        "editingsection": "Reaghey $1 (rheynn)",
        "editingcomment": "Reaghey $1 (meer noa)",
        "yourtext": "Dty heks",
        "action-browsearchive": "duillagyn scrysst y ronsaghey",
        "action-undelete": "yn duillag shoh y yee-scryssey",
        "nchanges": "$1 {{PLURAL:$1|caghlaa|chaghlaa|chaghlaa|caghlaaghyn}}",
+       "enhancedrc-history": "skeeal",
        "recentchanges": "Caghlaaghyn s'noa",
        "recentchanges-legend": "Reihyssyn da ny caghlaaghyn s'noa",
        "recentchanges-summary": "Shirr ny caghlaaghyn s'noa da'n wiki er y duillag shoh.",
        "specialpages-group-other": "Duillagyn elley er lheh",
        "specialpages-group-login": "Log stiagh / croo coontys",
        "specialpages-group-users": "Ymmydeyryn as kiartyn",
+       "tags-active-yes": "Ta",
+       "tags-active-no": "Cha nel",
        "tags-edit": "reaghey",
        "rightsnone": "(veg)",
        "searchsuggest-search": "Ronsaghey",
index ab9c729..ca17ca4 100644 (file)
        "botpasswords-label-delete": "Share",
        "resetpass-submit-cancel": "Soke",
        "resetpass-temp-password": "Kalmar sirri na lokaci",
-       "bold_sample": "Rubutu mai gwaɓi",
-       "bold_tip": "Rubutu mai gwaɓi",
-       "italic_sample": "Rubutun tsutsa",
-       "italic_tip": "Rubutun tsutsa",
-       "link_sample": "Sunan mahaɗi",
-       "link_tip": "Mahaɗin ciki",
-       "extlink_sample": "http://www.example.com sunan mahaɗi",
-       "extlink_tip": "Mahaɗi mai zuwa waje (a tuna da zagin http://)",
-       "headline_sample": "Sunan kai",
-       "headline_tip": "Kan mataki na 2",
-       "nowiki_sample": "shigar da ɗanyen rubutu a nan",
-       "nowiki_tip": "Kawar da sufantawar Wiki",
-       "image_tip": "Ƙumsashen fayil",
-       "media_tip": "Mahaɗi zuwa fayil",
-       "sig_tip": "Sa-hannunku da dagin rana",
-       "hr_tip": "Layin kwance",
        "summary": "Taƙaici:",
        "subject": "Jigo/Kai:",
        "minoredit": "Ƙaramin gyara",
index 86a19ed..881b116 100644 (file)
        "changeemail-newemail": "新嘅電郵地址:",
        "changeemail-none": "(mò)",
        "changeemail-submit": "Kiên-kói thien-yù thi-chí",
-       "bold_sample": "Chhû-thí vùn-sṳ",
-       "bold_tip": "Chhû-thí vùn-sṳ",
-       "italic_sample": "Chhià-thí vùn-sṳ",
-       "italic_tip": "Chhià-thí vùn-sṳ",
-       "link_sample": "Lièn-chiap phiêu-thì",
-       "link_tip": "Nui-phu lièn-chiap",
-       "extlink_sample": "http://www.example.com lièn-chiap phiêu-thì",
-       "extlink_tip": "Ngoi-phu lièn-chiap (kâ chhièn-tot http://)",
-       "headline_sample": "Thai phiêu-thì vùn-sṳ",
-       "headline_tip": "2-kip phiêu-thì vùn-sṳ",
-       "nowiki_sample": "Chhai liá chhap-ngi̍p fî kak-sṳt vùn-sṳ",
-       "nowiki_tip": "Chhap-ngi̍p fî kak-sṳt vùn-sṳ",
-       "image_tip": "Chhap-ngi̍p vùn-khien",
-       "media_tip": "Vùn-khien lièn-chiap",
-       "sig_tip": "Tai yû sṳ̀-kiên ke chhiâm-miàng",
-       "hr_tip": "Súi-phìn sien  (séu-sîm sṳ́-yung)",
        "summary": "Chak-yeu:",
        "subject": "標題:",
        "minoredit": "Liá-he yit-chak se-mì siû-kói",
index 2d6a821..b75d6bb 100644 (file)
        "changeemail-password": "Kāu ʻōlelo hūnā {{SITENAME}}:",
        "changeemail-submit": "Loli i kāu lekauila",
        "resettokens-token-label": "$1 (helu okamanawa: $2)",
-       "bold_sample": "Ho‘okā‘ele",
-       "bold_tip": "Ho‘okā‘ele",
-       "italic_sample": "Ho‘ohiō",
-       "italic_tip": "Ho‘ohiō",
-       "link_sample": "Inoa loulou",
-       "link_tip": "Loulou kūloko",
-       "extlink_sample": "http://www.example.com inoa loulou",
-       "extlink_tip": "Loulou kūwaho (e ho‘omana‘o i ka poʻo pāʻālua http://)",
-       "headline_sample": "Po‘o‘ōlelo",
-       "headline_tip": "Poʻomanaʻo kau 2",
-       "nowiki_sample": "Hoʻokomo i nā kikokikona huluʻole ma ʻaneʻi",
-       "nowiki_tip": "Nānaʻole i ka hulu wiki",
-       "image_tip": "Waihona kauloko",
-       "media_tip": "Loulou waihona",
-       "sig_tip": "Kau pūlima me ka manawa",
-       "hr_tip": "Laina ‘ilikai (e hana pākiko)",
        "summary": "Hōʻuluʻulu manaʻo:",
        "subject": "Kumumanaʻo/poʻo laina:",
        "minoredit": "He hoʻololi iki kēia",
index 6480a93..714f258 100644 (file)
@@ -87,6 +87,7 @@
        "tog-useeditwarning": "הצגת אזהרה בעת עזיבת דף עריכה עם שינויים שטרם נשמרו",
        "tog-prefershttps": "תמיד להשתמש בתקשורת מאובטחת לאחר הכניסה לחשבון",
        "tog-showrollbackconfirmation": "הצגת הודעת אישור לאחר לחיצה על קישור \"שחזור\"",
+       "tog-requireemail": "דרישת דואר אלקטרוני כדי לאפס סיסמה",
        "underline-always": "תמיד",
        "underline-never": "לעולם לא",
        "underline-default": "ברירת המחדל של העיצוב או של הדפדפן",
        "createaccountmail": "שימוש בסיסמה זמנית אקראית ושליחתה לכתובת הדוא\"ל שצוינה",
        "createaccountmail-help": "יכול לשמש ליצירת חשבון עבור אדם אחר בלי ללמוד את הסיסמה.",
        "createacct-realname": "שם אמיתי (לא חובה)",
-       "createacct-reason": "סיבה",
+       "createacct-reason": "סיבה (נרשמת ביומן ציבורי)",
        "createacct-reason-ph": "סיבה ליצירת חשבון נוסף",
        "createacct-reason-help": "הודעה שמוצגת ביומן רישום המשתמשים",
        "createacct-submit": "יצירת החשבון שלך",
        "resettokens-watchlist-token": "אסימון להזנת הרשת (Atom/RSS) של [[Special:Watchlist|שינויים של דפים ברשימת המעקב]]",
        "resettokens-done": "האסימונים אופסו.",
        "resettokens-resetbutton": "איפוס האסימונים שנבחרו",
-       "bold_sample": "טקסט מודגש",
-       "bold_tip": "טקסט מודגש",
-       "italic_sample": "טקסט נטוי",
-       "italic_tip": "טקסט נטוי",
-       "link_sample": "קישור",
-       "link_tip": "קישור פנימי",
-       "extlink_sample": "http://www.example.com כותרת הקישור לתצוגה",
-       "extlink_tip": "קישור חיצוני (כולל קידומת <span dir=\"ltr\">http://</span> מלאה)",
-       "headline_sample": "כותרת",
-       "headline_tip": "כותרת – דרגה 2",
-       "nowiki_sample": "טקסט לא מעוצב",
-       "nowiki_tip": "התעלמות מעיצוב ויקי",
-       "image_tip": "קובץ מוטבע",
-       "media_tip": "קישור לקובץ מדיה",
-       "sig_tip": "חתימה + תאריך ושעה",
-       "hr_tip": "קו אופקי (רצוי להימנע משימוש בקו)",
        "summary": "תקציר:",
        "subject": "נושא:",
        "minoredit": "זוהי עריכה משנית",
        "content-model-css": "CSS",
        "content-json-empty-object": "אובייקט ריק",
        "content-json-empty-array": "מערך ריק",
-       "unsupported-content-model": "<strong>אזהרה:</strong> מודל התוכן $1 אינו נתמך בוויקי הזה.",
-       "unsupported-content-diff": "×\94ש×\95×\95×\90×\95ת ×\90×\99× ×\9f × ×ª×\9e×\9b×\95ת במודל התוכן $1.",
-       "unsupported-content-diff2": "×\94ש×\95×\95×\90×\95ת ×\91×\99×\9f ×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $1 ×\9c×\91×\99×\9f ×\9e×\95×\93×\9c $2 ×\90×\99× ×\9f × ×ª×\9e×\9b×\95ת ×\91וויקי הזה.",
+       "unsupported-content-model": "<strong>×\90×\96×\94ר×\94:</strong> ×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $1 ×\90×\99× ×\95 × ×ª×\9e×\9a ×\91×\90תר ×\94×\95×\95×\99ק×\99 ×\94×\96×\94.",
+       "unsupported-content-diff": "×\94ש×\95×\95×\90×\94 ×\91×\99×\9f ×\92רס×\90×\95ת ×\90×\99× ×\94 × ×ª×\9e×\9bת במודל התוכן $1.",
+       "unsupported-content-diff2": "×\94ש×\95×\95×\90×\94 ×\91×\99×\9f ×\92רס×\90×\95ת ×\9e×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $1 ×\9c×\92רס×\90×\95ת ×\9e×\9e×\95×\93×\9c ×\94ת×\95×\9b×\9f $2 ×\90×\99× ×\94 × ×ª×\9e×\9bת ×\91×\90תר ×\94וויקי הזה.",
        "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\". ייעשה שימוש רק בערך האחרון.",
        "undo-norev": "לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.",
        "undo-nochange": "נראה שהעריכה כבר בוטלה.",
        "undo-summary": "ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])",
+       "undo-summary-anon": "ביטול גרסה $1 של [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "ביטול גרסה $1 של משתמש מוסתר",
        "cantcreateaccount-text": "אפשרות יצירת החשבונות מכתובת ה־IP הזאת (<strong>$1</strong>) נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא: <em>$2</em>",
        "cantcreateaccount-range-text": "אפשרות יצירת החשבונות מכתובות IP בתוך הטווח <strong>$1</strong>, כולל כתובת ה־IP שלך (<strong>$4</strong>), נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא: <em>$2</em>",
        "prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
        "prefs-help-email-others": "באפשרותך גם לאפשר למשתמשים ליצור איתך קשר באמצעות דוא\"ל דרך קישור בדף המשתמש או בדף השיחה שלך.\nכתובת הדוא\"ל שלך לא תיחשף כשמשתמשים יצרו איתך קשר.",
        "prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.",
+       "prefs-help-requireemail": "אם אפשרות זו סומנה, האתר ישלח הודעת דוא\"ל המאפשרת את איפוס הסיסמה רק לאחר שמי שביקש אותה יספק גם את שם המשתמש וגם את כתובת הדוא\"ל של החשבון הזה.",
        "prefs-info": "מידע בסיסי",
        "prefs-i18n": "בינאום",
        "prefs-signature": "חתימה",
        "backend-fail-contenttype": "לא ניתן היה לקבוע את סוג התוכן של הקובץ לאחסון ב־\"$1\".",
        "backend-fail-batchsize": "למאגר אחסון הקבצים הפנימי הועבר אוסף של {{PLURAL:$1|פעולת קובץ אחת|$1 פעולות קובץ}}; המגבלה היא {{PLURAL:$2|פעולה אחת|$2 פעולות}}.",
        "backend-fail-usable": "קריאת או כתיבת הקובץ \"$1\" לא הצליחה כיוון שההרשאות אינן מספיקות או כיוון שהספריות/המכלים חסרים.",
-       "backend-fail-stat": "×\9c×\90 ×\94×\99×\94 ×\90פשר ×\9cקר×\95×\90 ×\90ת ×\94×\9eצ×\91 ×©×\9c ×\94ק×\95×\91×¥ \"$1\".",
-       "backend-fail-hash": "×\9c×\90 ×\94×\99×\94 ×\90פשר ×\9c×\94×\97×\9c×\99×\98 ×\9e×\94×\95 ×\92×\99×\91×\95×\91 ×\94×\94צפנ×\94 ×©×\9c ×\94ק×\95×\91×¥ \"$1\".",
+       "backend-fail-stat": "קר×\99×\90ת ×\9eצ×\91 ×\94ק×\95×\91×¥ \"$1\" ×\9c×\90 ×\94צ×\9c×\99×\97×\94.",
+       "backend-fail-hash": "×\9eצ×\99×\90ת ×¢×¨×\9a ×\94×\92×\99×\91×\95×\91 ×\94קר×\99פ×\98×\95×\92רפ×\99 ×©×\9c ×\94ק×\95×\91×¥ \"$1\" ×\9c×\90 ×\94צ×\9c×\99×\97×\94.",
        "filejournal-fail-dbconnect": "לא ניתן היה להתחבר לבסיס הנתונים של היומן עבור מאגר אחסון הקבצים הפנימי \"$1\".",
        "filejournal-fail-dbquery": "לא ניתן היה לעדכן את בסיס הנתונים של היומן עבור מאגר אחסון הקבצים הפנימי \"$1\".",
        "lockmanager-notlocked": "פתיחת הנעילה של \"$1\" לא הצליחה; הוא לא נעול.",
        "listfiles-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.",
        "imgfile": "קובץ",
        "listfiles": "רשימת קבצים",
+       "listfiles_subpage": "העלאות של $1",
        "listfiles_thumb": "תמונה ממוזערת",
        "listfiles_date": "תאריך",
        "listfiles_name": "שם",
        "alreadyrolled": "לא ניתן לשחזר את העריכה של [[User:$2|$2]] ([[User talk:$2|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) בדף [[:$1]];\nהדף כבר נערך או שוחזר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "תקציר העריכה היה: <em>$1</em>.",
        "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
+       "revertpage-anon": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] לעריכה האחרונה של [[User:$1|$1]]",
        "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "שוחזר מעריכות של {{GENDER:$3|$1}}\nלעריכה האחרונה של {{GENDER:$4|$2}}.",
        "sessionfailure-title": "בעיה בחיבור",
        "ipblocklist-legend": "מציאת משתמש חסום",
        "blocklist-userblocks": "הסתרת חסימות של משתמשים רשומים",
        "blocklist-tempblocks": "הסתרת חסימות זמניות",
+       "blocklist-indefblocks": "הסתרת חסימות בלתי מוגבלות בזמן",
        "blocklist-addressblocks": "הסתרת חסימות של כתובות IP בודדות",
        "blocklist-type": "סוג:",
        "blocklist-type-opt-all": "הכול",
index daf9cf9..8b55325 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|आपकी ध्यानसूची के पृष्ठों में बदलावों]] की वेब फ़ीड (Atom/RSS) हेतु टोकन",
        "resettokens-done": "टोकन रीसेट कर दिए गए।",
        "resettokens-resetbutton": "चुने हुए टोकन रीसेट करें",
-       "bold_sample": "मोटा पाठ",
-       "bold_tip": "गहरा पाठ",
-       "italic_sample": "तिरछा पाठ",
-       "italic_tip": "तिरछा पाठ",
-       "link_sample": "कड़ी शीर्षक",
-       "link_tip": "आंतरिक कड़ी",
-       "extlink_sample": "http://www.example.com कड़ी शीर्षक",
-       "extlink_tip": "बाहरी कड़ी (उपसर्ग http:// अवश्य लगाएँ)",
-       "headline_sample": "शीर्षक पाठ",
-       "headline_tip": "द्वितीय-स्तर शीर्षक",
-       "nowiki_sample": "अप्रारूपित पाठ यहाँ डालें",
-       "nowiki_tip": "विकि प्रारूपण नज़रंदाज़ करें",
-       "image_sample": "उदाहरण.jpg",
-       "image_tip": "एम्बेड की हुई फ़ाइल",
-       "media_sample": "उदाहरण.ogg",
-       "media_tip": "फ़ाइल की कड़ी",
-       "sig_tip": "आपका हस्ताक्षर व समय",
-       "hr_tip": "हॉरिज़ौंटल लाइन (कम इस्तेमाल करें)",
        "summary": "सारांश:",
        "subject": "विषय:",
        "minoredit": "यह एक छोटा बदलाव है",
index 9355e7c..7133a17 100644 (file)
        "resettokens-watchlist-token": "Dhyan suchi ke web feed token (Atom/RSS) of [[Special:Watchlist|changes to pages on your watchlist]]",
        "resettokens-done": "Token ke reset kar dewa gais hae.",
        "resettokens-resetbutton": "Chuna gais token ke reset karo",
-       "bold_sample": "Motaa text",
-       "bold_tip": "Motaa text",
-       "italic_sample": "Tirchha akchhar",
-       "italic_tip": "Tirchha akchhar",
-       "link_sample": "Jorr ke title",
-       "link_tip": "Bhitari jorr",
-       "extlink_sample": "http://www.example.com jorr ke padwi",
-       "extlink_tip": "Bahari jorr (yaad rakhna http:// prefix)",
-       "headline_sample": "Khaas samaachar ke akchhar",
-       "headline_tip": "Duusra level ke headline",
-       "nowiki_sample": "Non-formatted text ke hian par insert karo",
-       "nowiki_tip": "Wiki bhasa ke anusaar badlao nahi karo",
-       "image_tip": "Jamawa gais suchi",
-       "media_tip": "File ke jorre waala",
-       "sig_tip": "Aapke signature time ke saathe",
-       "hr_tip": "Samthar line (bahut jaada nai kaam me laana)",
        "summary": "Sanchhipt:",
        "subject": "Visay:",
        "minoredit": "Ii chhota badlao hai",
index 30320ed..b94023a 100644 (file)
        "changeemail-none": "(wala)",
        "changeemail-password": "Ang imong {{SITENAME}} nga password:",
        "changeemail-submit": "Ilisan and E-mail",
-       "bold_sample": "Dukot nga teksto",
-       "bold_tip": "Dukot nga teksto",
-       "italic_sample": "Gahilay nga teksto",
-       "italic_tip": "Gahilay nga teksto",
-       "link_sample": "Panig-ulo sang tabid",
-       "link_tip": "Sulodlon nga tabid",
-       "extlink_sample": "http://www.example.com panig-ulo sang tabid",
-       "extlink_tip": "Sa guha nga Tabid (tandaan http:// prefiks)",
-       "headline_sample": "Teksto sang pangunang-dinalang",
-       "headline_tip": "Lebel 2 pangunang-dinalan",
-       "nowiki_sample": "Ibutang ang di-sulundan nga teksto diri",
-       "nowiki_tip": "Pabay-an ang wiki sulundanon",
-       "image_tip": "Gintapik nga file",
-       "media_tip": "Pagtabid sa File",
-       "sig_tip": "Ang imo pirma upod sang timestamp",
-       "hr_tip": "Gapahigda nga linya (gamiton laka lang)",
        "summary": "Kabilogan:",
        "subject": "Ginatukoy/Pangulong-dinalang:",
        "minoredit": "Diutay lang ini nga pagliwat",
index 94945ff..866205c 100644 (file)
        "resettokens-watchlist-token": "Tajni ključ za uvoženje u mrežno sjedište (Atom/RSS) [[Special:Watchlist|promjena na stranicama s Vašega popisa praćenih stranica]]",
        "resettokens-done": "Ponovno postavljanje tajnih ključeva",
        "resettokens-resetbutton": "Ponovo postavi odabrane tajne ključeve",
-       "bold_sample": "Podebljani tekst",
-       "bold_tip": "Podebljani tekst",
-       "italic_sample": "Kurzivni tekst",
-       "italic_tip": "Kurzivni tekst",
-       "link_sample": "Tekst poveznice",
-       "link_tip": "Unutarnja poveznica",
-       "extlink_sample": "http://www.example.com Tekst poveznice",
-       "extlink_tip": "Vanjska poveznica (pazi, nužan je prefiks http://)",
-       "headline_sample": "Tekst naslova",
-       "headline_tip": "Podnaslov",
-       "nowiki_sample": "Ovdje unesite neoblikovani tekst",
-       "nowiki_tip": "Neoblikovani tekst",
-       "image_sample": "Primjer.jpg",
-       "image_tip": "Uložena slika",
-       "media_sample": "Primjer.ogg",
-       "media_tip": "Uloženi medij",
-       "sig_tip": "Vaš potpis s datumom",
-       "hr_tip": "Vodoravna crta (koristiti rijetko)",
        "summary": "Sažetak:",
        "subject": "Predmet:",
        "minoredit": "Ovo je manja promjena",
        "diff-multi-manyusers": "({{PLURAL:$1|Nije prikazana jedna međuinačica|Nisu prikazane $1 međuinačice|Nije prikazano $1 međuinačica}} više od {{PLURAL:$2|jednog|$2|$2}} suradnika)",
        "difference-missing-revision": "{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo je obično uzrokovano kada kliknete na zastarjelu poveznicu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "searchresults": "Rezultati pretrage",
+       "search-filter-title-prefix": "Pretraži samo stranice koje počinju prefiksom »$1«",
        "searchresults-title": "Rezultati pretrage za \"$1\"",
        "titlematches": "Pronađene stranice prema naslovu",
        "textmatches": "Pronađene stranice prema tekstu članka",
        "prefs-resetpass": "promijeni zaporku",
        "prefs-changeemail": "promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite adresu e-pošte",
-       "prefs-email": "Mogućnosti e-maila",
+       "prefs-email": "Mogućnosti e-pošte",
        "prefs-rendering": "Izgled",
        "saveprefs": "Spremi",
        "restoreprefs": "Vrati sve postavke na prvobitno zadane (u svim odjeljcima)",
        "prefs-custom-js": "Prilagođen JS",
        "prefs-common-config": "Dijeljeni CSS/JSON/JavaScript za sve izglede:",
        "prefs-reset-intro": "Možete koristiti ovu stranicu za povrat Vaših postavki na prvotne postavke. Ovo se ne može poništiti.",
-       "prefs-emailconfirm-label": "Potvrda e-mail adrese:",
+       "prefs-emailconfirm-label": "Potvrda adrese e-pošte:",
        "youremail": "Vaša adresa e-pošte:",
        "username": "Ime {{GENDER:$1|suradnika|suradnice}}:",
        "prefs-memberingroups": "{{GENDER:$2|Suradnik je član|Suradnica je članica}} {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
        "rcfilters-filter-showlinkedfrom-label": "Prikaži promjene na povezanim stranicama",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Stranice na koje se povezuje</strong> izabrana stranica",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Stranice koje povezuju</strong> na izabranu stranicu",
+       "rcfilters-allcontents-label": "Sav sadržaj",
+       "rcfilters-alldiscussions-label": "Svi razgovori",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (prikazano ih do <strong>$1</strong>).",
        "rclistfromreset": "Vrati na zadano izbor datuma",
        "rclistfrom": "Prikaži nove promjene počevši od $3 $2",
index 6aebc20..4f2dbff 100644 (file)
        "resettokens-watchlist-token": "Token für den Webfeed (Atom/RSS) von der [[Special:Watchlist|Ännrunge an Seite uff deiner Beobachtungslist]]",
        "resettokens-done": "Tokens zurückgesetzt.",
        "resettokens-resetbutton": "Ausgewählte Token ännre",
-       "bold_sample": "Fetter Text",
-       "bold_tip": "Fetter Text",
-       "italic_sample": "Kursiver Text",
-       "italic_tip": "Kursiver Text",
-       "link_sample": "Link-Text",
-       "link_tip": "Interner Link",
-       "extlink_sample": "http://www.example.com Link-Text",
-       "extlink_tip": "Externer Link (http:// beachte)",
-       "headline_sample": "Ebene-2-Üwerschrift",
-       "headline_tip": "Ebene-2-Üwerschrift",
-       "nowiki_sample": "Unformatierte Text hie renfüche",
-       "nowiki_tip": "Unformatierter Text",
-       "image_tip": "Dateilink",
-       "media_tip": "Mediedatei-Link",
-       "sig_tip": "Dein Signatur mit Zeitstempel",
-       "hr_tip": "Horizontoole Linie (spoorsam verwenne)",
        "summary": "Zusammerfassung:",
        "subject": "Betreff:",
        "minoredit": "Nuar Klenichkeite woore verännert",
index 60a4e6b..1a4f91c 100644 (file)
        "resettokens-watchlist-token": "Token za webkanal (Atom/RSS) [[Special:Watchlist|změnow na stronach w twojich wobkedźbowankach]]",
        "resettokens-done": "Tokeny wróćostajene.",
        "resettokens-resetbutton": "Wubrane tokeny wróćo stajić",
-       "bold_sample": "Tučny tekst",
-       "bold_tip": "Tučny tekst",
-       "italic_sample": "Kursiwny tekst",
-       "italic_tip": "Kursiwny tekst",
-       "link_sample": "Mjeno wotkaza",
-       "link_tip": "Znutřkowny wotkaz",
-       "extlink_sample": "http://www.example.com mjeno wotkaza",
-       "extlink_tip": "Zwonkowny wotkaz (pomysli sej na prefiks http://)",
-       "headline_sample": "Tekst nadpisma",
-       "headline_tip": "Nadpismo runiny 2",
-       "nowiki_sample": "Tu njeformatowany tekst zasunyć",
-       "nowiki_tip": "Wikiformatowanje ignorować",
-       "image_sample": "Přikład.jpg",
-       "image_tip": "Zasadźena dataja",
-       "media_sample": "Přikład.ogg",
-       "media_tip": "Datajowy wotkaz",
-       "sig_tip": "Twoja signatura z časowym kołkom",
-       "hr_tip": "Wodoruna linija (zrědka wužiwać!)",
        "summary": "Zjeće:",
        "subject": "Tema:",
        "minoredit": "Snadna změna",
index e4b7a1d..64a2862 100644 (file)
        "resetpass-wrong-oldpass": "Mopas sa pa bon ditou; li te mèt mopas ou an kounye a oubyen yon mopas tanporè.\nGendwa ou te deja modifye li oubyen ou te mande yon nouvo mopas tanporè.",
        "resetpass-temp-password": "Mopas tanporè yo ba ou an:",
        "passwordreset-username": "Non itilizatè&nbsp;:",
-       "bold_sample": "Tèks fonse",
-       "bold_tip": "Tèks fonse",
-       "italic_sample": "Tèks italik",
-       "italic_tip": "Tèks italik",
-       "link_sample": "Lyen pou tit an",
-       "link_tip": "Lyen anndan",
-       "extlink_sample": "http://www.example.com yon tit pou lyen an",
-       "extlink_tip": "Lyen andeyò (pa blye prefiks http:// an)",
-       "headline_sample": "Tèks pou tit",
-       "headline_tip": "Sou-tit nivo 2",
-       "nowiki_sample": "Antre tèks ki pa fòmate a",
-       "nowiki_tip": "Pa konte sentaks wiki an",
-       "image_tip": "Fichye anndan paj sa",
-       "media_tip": "Lyen pou fichye sa",
-       "sig_tip": "Siyati ou ak dat an",
-       "hr_tip": "Liy orizontal (pa abize)",
        "summary": "Somè:",
        "subject": "Sijè/tit:",
        "minoredit": "Modifikasyon sa a tou piti",
index 37106e5..0ecff4f 100644 (file)
@@ -99,6 +99,7 @@
        "tog-useeditwarning": "Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot",
        "tog-prefershttps": "Mindig biztonságos kapcsolatot használjon, amikor be vagyok jelentkezve",
        "tog-showrollbackconfirmation": "Megerősítés kérése, amikor a visszaállítás linkre kattintasz",
+       "tog-requireemail": "E-mail-cím megkövetelése jelszó-visszaállításkor",
        "underline-always": "mindig",
        "underline-never": "soha",
        "underline-default": "Felület és böngésző alapértelmezése szerint",
        "oct": "okt",
        "nov": "nov",
        "dec": "dec",
-       "january-date": "Január $1",
-       "february-date": "Február $1",
-       "march-date": "Március $1",
-       "april-date": "Ã\81prilis $1",
-       "may-date": "Május $1",
-       "june-date": "Június $1",
-       "july-date": "Július $1",
-       "august-date": "Augusztus $1",
-       "september-date": "Szeptember $1",
-       "october-date": "Október $1",
-       "november-date": "November $1",
-       "december-date": "December $1",
+       "january-date": "január $1",
+       "february-date": "február $1",
+       "march-date": "március $1",
+       "april-date": "április $1",
+       "may-date": "május $1",
+       "june-date": "június $1",
+       "july-date": "július $1",
+       "august-date": "augusztus $1",
+       "september-date": "szeptember $1",
+       "october-date": "október $1",
+       "november-date": "november $1",
+       "december-date": "december $1",
        "period-am": "de.",
        "period-pm": "du.",
        "pagecategories": "{{PLURAL:$1|Kategória|Kategória}}",
        "category_header": "A(z) „$1” kategóriába tartozó lapok",
        "subcategories": "Alkategóriák",
        "category-media-header": "A(z) „$1” kategóriába tartozó médiafájlok",
-       "category-empty": "''Ebben a kategóriában pillanatnyilag egyetlen lap vagy médiafájl sem szerepel.''",
+       "category-empty": "<em>Ebben a kategóriában pillanatnyilag egyetlen lap vagy médiafájl sem szerepel.</em>",
        "hidden-categories": "{{PLURAL:$1|Rejtett kategória|Rejtett kategóriák}}",
        "hidden-category-category": "Rejtett kategóriák",
        "category-subcat-count": "{{PLURAL:$2|Ennek a kategóriának csak egyetlen alkategóriája van.|Ez a kategória az alábbi {{PLURAL:$1|alkategóriával|$1 alkategóriával}} rendelkezik (összesen $2 alkategóriája van).}}",
        "createaccountmail": "Átmeneti, véletlenszerű jelszó beállítása és kiküldése a megadott e-mail-címre",
        "createaccountmail-help": "A jelszó megismerése nélkül készíthető valaki másnak fiók.",
        "createacct-realname": "Igazi neved (nem kötelező)",
-       "createacct-reason": "Indoklás",
+       "createacct-reason": "Indoklás (nyilvánosan naplózva)",
        "createacct-reason-ph": "Miért hozol létre egy másik fiókot",
        "createacct-reason-help": "A fióklétrehozási naplóban megjelenő üzenet",
        "createacct-submit": "Felhasználói fiók létrehozása",
        "resettokens-watchlist-token": "Kulcs egy hírcsatornához (Atom/RSS), ami a [[Special:Watchlist|figyelőlistádon lévő lapok változásaiból]] készül",
        "resettokens-done": "Tokenek újragenerálva.",
        "resettokens-resetbutton": "Kijelőlt tokenek újragenerálása",
-       "bold_sample": "Félkövér szöveg",
-       "bold_tip": "Félkövér szöveg",
-       "italic_sample": "Dőlt szöveg",
-       "italic_tip": "Dőlt szöveg",
-       "link_sample": "Hivatkozás megnevezése",
-       "link_tip": "Belső hivatkozás",
-       "extlink_sample": "http://www.példa-hivatkozás.hu hivatkozás megnevezése",
-       "extlink_tip": "Külső hivatkozás (ne felejtsd el a http:// előtagot)",
-       "headline_sample": "Alfejezet címe",
-       "headline_tip": "Alfejezetcím",
-       "nowiki_sample": "Ide írd a formázatlan szöveget",
-       "nowiki_tip": "Wikiformázás kikapcsolása",
-       "image_sample": "Pelda.jpg",
-       "image_tip": "Fájl (pl. kép) beszúrása",
-       "media_sample": "Peldaegyketto.ogg",
-       "media_tip": "Fájlhivatkozás",
-       "sig_tip": "Aláírás időponttal",
-       "hr_tip": "Vízszintes vonal (ritkán használd)",
        "summary": "Összefoglaló:",
        "subject": "Tárgy:",
        "minoredit": "Apró változtatás",
        "prefs-help-email": "Az e-mail-cím megadása nem kötelező, de szükséges új jelszó kéréséhez, ha elfelejtenéd a meglévőt.",
        "prefs-help-email-others": "Úgy is dönthetsz, hogy lehetővé teszed mások számára, hogy kapcsolatba lépjenek veled a felhasználói vagy vitalapodon keresztül, anélkül, hogy fel kellene fedned a személyazonosságodat.",
        "prefs-help-email-required": "Meg kell adnod az e-mail címedet.",
+       "prefs-help-requireemail": "Amennyiben bekapcsolod, csak akkor küldünk jelszó-visszaállító e-mailt, ha az ezt kérő személy helyesen megadja a fiók szerkesztői nevét és e-mail-címét.",
        "prefs-info": "Alapinformációk",
        "prefs-i18n": "Nyelvi beállítások",
        "prefs-signature": "Aláírás",
        "rcfilters-preference-help": "Friss változtatások betöltése szűrők közti keresés és kiemelések lehetősége nélkül.",
        "rcfilters-watchlist-preference-label": "JavaScript nélküli felület használata",
        "rcfilters-watchlist-preference-help": "Figyelőlista betöltése szűrők közti keresés és kiemelések lehetősége nélkül.",
-       "rcfilters-filter-showlinkedfrom-label": "A következő lapra hivatkozó lapok változtatásainak megjelenítése",
+       "rcfilters-filter-showlinkedfrom-label": "A következő lapról hivatkozott lapok változtatásainak megjelenítése",
        "rcfilters-filter-showlinkedfrom-option-label": "A kiválasztott <strong>lapról</strong> hivatkozott lapok",
        "rcfilters-filter-showlinkedto-label": "A következő lapról hivatkozott lapok változtatásainak megjelenítése",
        "rcfilters-filter-showlinkedto-option-label": "A kiválasztott <strong>lapra</strong> hivatkozó lapok",
        "uploadstash-zero-length": "A fájl nulla méretű.",
        "invalid-chunk-offset": "Érvénytelen darab eltolás",
        "img-auth-accessdenied": "Hozzáférés megtagadva",
-       "img-auth-nopathinfo": "Hiányzó PATH_INFO.\nA szerver nincs beállítva, hogy továbbítsa ezt az információt.\nLehet, hogy CGI-alapú, és nem támogatja az img_auth-ot.\nLásd https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization!",
+       "img-auth-nopathinfo": "Hiányzó elérési út információ.\nA szerveredet úgy kell beállítanod, hogy továbbítsa a REQUEST_URI és/vagy a PATH_INFO változókat.\nHa már be vannak, próbáld engedélyezni a $wgUsePathInfo-t.\nLásd https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization!",
        "img-auth-notindir": "A kért elérési út nincs a beállított feltöltési könyvtárban.",
        "img-auth-badtitle": "Nem sikerült érvényes címet készíteni a(z) „$1” szövegből.",
        "img-auth-nofile": "A fájl („$1”) nem létezik.",
        "listfiles-userdoesnotexist": "A(z) „$1” felhasználó nincs regisztrálva.",
        "imgfile": "fájl",
        "listfiles": "Fájllista",
+       "listfiles_subpage": "$1 feltöltései",
        "listfiles_thumb": "Bélyegkép",
        "listfiles_date": "Dátum",
        "listfiles_name": "Név",
        "ipblocklist-legend": "Blokkolt felhasználó keresése",
        "blocklist-userblocks": "Fiókblokkolások elrejtése",
        "blocklist-tempblocks": "Ideiglenes blokkolások elrejtése",
+       "blocklist-indefblocks": "Végtelen blokkolások elrejtése",
        "blocklist-addressblocks": "IP-címek blokkolásainak elrejtése",
        "blocklist-type": "Típus:",
        "blocklist-type-opt-all": "Összes",
index 6ec9c9e..255b874 100644 (file)
        "changeemail-submit": "Փոխել էլ․ հասցեն",
        "changeemail-nochange": "Խնդրում ենք մուտքագրեք այլ նոր էլեկտրոնային փոստի հասցեն։",
        "resettokens-tokens": "Կտրոններ՝",
-       "bold_sample": "Թավատառ տեքստ",
-       "bold_tip": "Թավատառ տեքստ",
-       "italic_sample": "Շեղատառ տեքստ",
-       "italic_tip": "Շեղատառ տեքստ",
-       "link_sample": "Հղման վերնագիր",
-       "link_tip": "Ներքին հղում",
-       "extlink_sample": "http://www.example.com հղման վերնագիրը",
-       "extlink_tip": "Արտաքին հղում (հիշեք http:// նախածանցը)",
-       "headline_sample": "Ենթագլուխ",
-       "headline_tip": "Ենթագլուխ",
-       "nowiki_sample": "Մուտքագրեք չձևավորված տեքստը այստեղ",
-       "nowiki_tip": "Անտեսել վիքի ձևավորումը",
-       "image_tip": "Ներդրված նիշք",
-       "media_tip": "Հղում նիշքին",
-       "sig_tip": "Ձեր ստորագրությունը ամսաթվով",
-       "hr_tip": "Հորիզոնական գիծ (միայն անհրաժեշտության դեպքում)",
        "summary": "Ամփոփում:",
        "subject": "Վերնագիր:",
        "minoredit": "Սա չնչին խմբագրում է",
index dd2d007..7585679 100644 (file)
        "changeemail-none": "(ոչ մէկ)",
        "changeemail-password": "Ձեր {{SITENAME}} անցաբառը՝",
        "changeemail-submit": "Փոխել ելեկտրոնային հասցէն",
-       "bold_sample": "Թաւատառ գրութիւն",
-       "bold_tip": "Թաւատառ գրութիւն",
-       "italic_sample": "Շեղատառ գրութիւն",
-       "italic_tip": "Շեղատառ գրութիւն",
-       "link_sample": "Յղման վերնագիր",
-       "link_tip": "Ներքին յղում",
-       "extlink_sample": "http://www.example.com յղման վերնագիրը",
-       "extlink_tip": "Արտաքին յղում (յիշել http:// նախածանց)",
-       "headline_sample": "Վերնագրի գրութիւն",
-       "headline_tip": "Երկրորդ մակարդակի վերնագիր",
-       "nowiki_sample": "Մուտքագրեցէ՛ք չձեւաւորուած գրութիւնը այստեղ",
-       "nowiki_tip": "Անտեսել ուիքի ձեւաւորումը",
-       "image_sample": "Օրինակ.jpg",
-       "image_tip": "Ներփակ նիշք",
-       "media_sample": "Օրինակ.jpg",
-       "media_tip": "Նիշքին յղումը",
-       "sig_tip": "Ձեր ստորագրութիւնը ժամակնիքով",
-       "hr_tip": "Հորիզոնական գիծ (գործածել խնայողաբար)",
        "summary": "Ամփոփում՝",
        "subject": "Նիւթ.",
        "minoredit": "Ասիկա մանր խմբագրում է",
index eb94cd0..6bee178 100644 (file)
@@ -64,6 +64,7 @@
        "tog-useeditwarning": "Advertir me quando io quita un pagina de modification sin publicar le cambiamentos",
        "tog-prefershttps": "Sempre usar un connexion secur durante session aperte",
        "tog-showrollbackconfirmation": "Monstrar un demanda de confirmation al cliccar sur un ligamine de revocation",
+       "tog-requireemail": "Requirer e-mail pro reinitialisar contrasigno",
        "underline-always": "Sempre",
        "underline-never": "Nunquam",
        "underline-default": "Como definite per tu navigator o apparentia",
        "createaccountmail": "Usar un contrasigno aleatori temporari e inviar lo al adresse de e-mail specificate",
        "createaccountmail-help": "Pro crear un conto pro un altere persona sin cognoscer le contrasigno.",
        "createacct-realname": "Nomine real (optional)",
-       "createacct-reason": "Motivo",
+       "createacct-reason": "Motivo (visibile publicamente)",
        "createacct-reason-ph": "Proque crea tu un altere conto?",
        "createacct-reason-help": "Message pro le registro de creation de contos",
        "createacct-submit": "Crear tu conto",
        "resettokens-watchlist-token": "Indicio pro syndication web (Atom/RSS) de [[Special:Watchlist|modificationes a paginas in tu observatorio]]",
        "resettokens-done": "Indicios reinitialisate.",
        "resettokens-resetbutton": "Reinitialisar le indicios seligite",
-       "bold_sample": "Texto grasse",
-       "bold_tip": "Texto grasse",
-       "italic_sample": "Texto italic",
-       "italic_tip": "Texto italic",
-       "link_sample": "Titulo del ligamine",
-       "link_tip": "Ligamine interne",
-       "extlink_sample": "http://www.example.com titulo del ligamine",
-       "extlink_tip": "Ligamine externe (non oblida le prefixo http://)",
-       "headline_sample": "Texto del titulo",
-       "headline_tip": "Titulo de nivello 2",
-       "nowiki_sample": "Inserer texto non formatate hic",
-       "nowiki_tip": "Ignorar formatation wiki",
-       "image_sample": "Exemplo.jpg",
-       "image_tip": "File incastrate",
-       "media_sample": "Exemplo.ogg",
-       "media_tip": "Ligamine a un file",
-       "sig_tip": "Tu signatura con data e hora",
-       "hr_tip": "Linea horizontal (usa con moderation)",
        "summary": "Summario:",
        "subject": "Subjecto:",
        "minoredit": "Isto es un modification minor",
        "prefs-help-email": "Le adresse de e-mail es optional, ma es necessari pro le reinitialisation de tu contrasigno, in caso que tu lo oblida.",
        "prefs-help-email-others": "Tu pote etiam optar pro permitter que altere personas te contacta via tu pagina de usator o de discussion, sin necessitate de revelar tu identitate.",
        "prefs-help-email-required": "Un adresse de e-mail es obligatori.",
+       "prefs-help-requireemail": "Si es marcate, inviar messages pro reinitialisar contrasigno solmente si le persona reinitialisante forni non solmente le nomine de usator ma etiam le adresse de e-mail pro iste conto.",
        "prefs-info": "Informationes de base",
        "prefs-i18n": "Internationalisation",
        "prefs-signature": "Signatura",
        "listfiles-userdoesnotexist": "Le conto de usator \"$1\" non es registrate.",
        "imgfile": "file",
        "listfiles": "Lista de files",
+       "listfiles_subpage": "Files incargate per $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nomine",
        "ipblocklist-legend": "Cercar un usator blocate",
        "blocklist-userblocks": "Celar blocadas de conto",
        "blocklist-tempblocks": "Celar blocadas temporari",
+       "blocklist-indefblocks": "Celar blocadas infinite",
        "blocklist-addressblocks": "Celar blocadas de singule adresse IP",
        "blocklist-type": "Typo:",
        "blocklist-type-opt-all": "Totes",
        "mycustomjsredirectprotected": "Tu non ha le permission de modificar iste pagina JavaScript perque illo es un redirection e non puncta a un pagina in tu spatio de usator.",
        "easydeflate-invaliddeflate": "Le contento fornite non es correctemente comprimite",
        "unprotected-js": "Pro motivos de securitate, non es possibile cargar codice JavaScript de paginas non protegite. Crea JavaScript solmente in le spatio de nomines \"MediaWiki:\" o como un subpagina de usator.",
-       "userlogout-continue": "Vole tu clauder le session?"
+       "userlogout-continue": "Vole tu clauder le session?",
+       "rest-prefix-mismatch": "Le cammino requestate ($1) non es intra le cammino radice del REST API ($2)",
+       "rest-wrong-method": "Le methodo del requesta ($1) non es {{PLURAL:$3|le methodo|inter le methodos}} permittite pro iste cammino ($2)",
+       "rest-no-match": "Le cammino relative requestate ($1) non corresponde a un gestor cognoscite"
 }
index 0ba4725..f4bc1c9 100644 (file)
        "resettokens-watchlist-token": "Token untuk sindikasi web (Atom/RSS) dari [[Special:Watchlist|perubahan di daftar pantauan Anda]]",
        "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Reset token yang dipilih",
-       "bold_sample": "Teks ini akan dicetak tebal",
-       "bold_tip": "Teks tebal",
-       "italic_sample": "Teks ini akan dicetak miring",
-       "italic_tip": "Teks miring",
-       "link_sample": "Judul pranala",
-       "link_tip": "Pranala internal",
-       "extlink_sample": "http://www.example.com judul pranala",
-       "extlink_tip": "Pranala luar (jangan lupa awalan http:// )",
-       "headline_sample": "Teks judul",
-       "headline_tip": "Subbagian tingkat 1",
-       "nowiki_sample": "Masukkan teks yang tidak akan diformat di sini",
-       "nowiki_tip": "Abaikan pemformatan wiki",
-       "image_sample": "Contoh.jpg",
-       "image_tip": "Cantumkan berkas",
-       "media_sample": "Contoh.ogg",
-       "media_tip": "Pranala berkas media",
-       "sig_tip": "Tanda tangan Anda dengan tanda waktu",
-       "hr_tip": "Garis horisontal",
        "summary": "Ringkasan:",
        "subject": "Subjek:",
        "minoredit": "Ini adalah suntingan kecil.",
index 321548b..5c7e052 100644 (file)
        "passwordreset-username": "Nómine de usator:",
        "changeemail-none": "(null)",
        "resettokens-token-label": "$1 (valor actual: $2)",
-       "bold_sample": "Nigri textu",
-       "bold_tip": "Nigri textu",
-       "italic_sample": "Cursiv textu",
-       "italic_tip": "Cursiv textu",
-       "link_sample": "Nómine de referentie",
-       "link_tip": "Intern referentie",
-       "extlink_sample": "http://www.example.com nómine del referentie",
-       "extlink_tip": "Extern referentie (ne oblivia prefixar http://)",
-       "headline_sample": "Titul de nivell 2",
-       "headline_tip": "Titul de nivell 2",
-       "nowiki_sample": "Intrar ínformatat textu ci.",
-       "nowiki_tip": "Ignorar formate wiki",
-       "image_tip": "Fixat file",
-       "media_tip": "Referentie a un multimedial file.",
-       "sig_tip": "Tui subscrit con hor e date",
-       "hr_tip": "Horizontal linea (ples usar sin excess)",
        "summary": "Resummation:",
        "subject": "Tema:",
        "minoredit": "To es un bagatellic change",
index 91311a9..f71a5a8 100644 (file)
        "passwordreset-username": "Ahàǹjìème:",
        "passwordreset-emailelement": "Áhà Ọ'banife: \n$1\n\nPasswod nke gi gbanwe: \n$2",
        "changeemail-none": "(efù)",
-       "bold_sample": "Mkpúrù èdè íke",
-       "bold_tip": "Mkpúrù èdè íke",
-       "italic_sample": "Mkpurụ okwu sélénsé",
-       "italic_tip": "Mkpurụ okwu sélénsé",
-       "link_sample": "Ishi edemede nke jikodo",
-       "link_tip": "Jikodo nke ímé",
-       "extlink_sample": "http://www.example.com ishi jikodo",
-       "extlink_tip": "Jikodo nọr na ẹzí (chètá íshí http://)",
-       "headline_sample": "Ahiri ishi mkpurụ edemede",
-       "headline_tip": "Larri 2 ishiahiri",
-       "nowiki_sample": "Tinyé mkụrụ edemede enweghị ihe ọbula na ya ti ya nga",
-       "nowiki_tip": "É gekwàlà otu wiki shi edé",
-       "image_tip": "Njikota édé a pọrọgwụla",
-       "media_tip": "Jikodo usòrò",
-       "sig_tip": "Nkábị gị nwéré nkábị nke ógè",
-       "hr_tip": "Áhìrì na ga nà àlà (jí ya nke ntàkírí)",
        "summary": "Mmẹkụwátá:",
        "subject": "Ihe gbasara/Ishi ahiri",
        "minoredit": "Ihe bu orü ntakírí",
index d9df469..89b202c 100644 (file)
        "resettokens-watchlist-token": "Tandaan para iti pakan ti web (Atom/RSS) kadagiti [[Special:Watchlist|panagbalbaliw ti pampanid iti listaan ti bambantayam]]",
        "resettokens-done": "Naisaad manen dagiti tandaan.",
        "resettokens-resetbutton": "Isaad manen  dagiti napili a tandaan",
-       "bold_sample": "Napuskol a teksto",
-       "bold_tip": "Napuskol a teksto",
-       "italic_sample": "Teksto nga italiko",
-       "italic_tip": "Teksto nga italiko",
-       "link_sample": "Titulo ti silpo",
-       "link_tip": "Akin-uneg a silpo",
-       "extlink_sample": "http://www.example.com titulo ti silpo",
-       "extlink_tip": "Akinruar a silpo (laglagipen ti http:// a pasakbay)",
-       "headline_sample": "Teksto ti paulo",
-       "headline_tip": "Maika-2 nga agasmang ti paulo",
-       "nowiki_sample": "Isengngat ti saan a naporma a teksto ditoy",
-       "nowiki_tip": "Saan nga ikaskaso ti pannakaporma ti wiki",
-       "image_tip": "Naisengngat a papeles",
-       "media_tip": "Silpo ti papeles",
-       "sig_tip": "Ti pirmam nga addaan iti oras ken petsa",
-       "hr_tip": "Horisontal a linia (manmano laeng nga aramaten)",
        "summary": "Pakabuklan:",
        "subject": "Suheto:",
        "minoredit": "Daytoy ket bassit a panagurnos",
index baee1f0..84e7195 100644 (file)
        "passwordreset-email": "Электронни почта адрес:",
        "changeemail": "дIахувца е дIаяккха электронни пошт",
        "resettokens-tokens": "Токенаш:",
-       "bold_sample": "Сома йоазон текст",
-       "bold_tip": "Сома йоазон текст",
-       "italic_sample": "Сиха йоазон текст",
-       "italic_tip": "Сиха йоазон текст",
-       "link_sample": "Тӏатовжама кепакерта цIи",
-       "link_tip": "Чура тӏатовжам",
-       "extlink_sample": "http://www.example.com тIахьожаярга дáкъа цIи",
-       "extlink_tip": "Арахьара тIахьожаярг (йиц ма ялийтта префикс http://)",
-       "headline_sample": "Дáкъа цIера текст",
-       "headline_tip": "2-гӀа лагӀара дáкъа цIи",
-       "nowiki_sample": "Укхаза хувца езаш йоаца текст хьачуоттае",
-       "nowiki_tip": "Теркал ма е вики-форматировани",
-       "image_tip": "Чухьнахьара файл",
-       "media_tip": "Файлá тIатовжам",
-       "sig_tip": "Хьа кулгаяздар а, хӀанзара ха а",
-       "hr_tip": "ПхьорагIен така (цох пайда эцар тIехдаьнна кастта ма де)",
        "summary": "Хувцамий сурт оттадар",
        "subject": "Тема/даькъа цIи:",
        "minoredit": "ЗӀамига хувцам",
index 28cbba6..de3255b 100644 (file)
        "resettokens-token-label": "$1 (nuna valoro: $2)",
        "resettokens-done": "Klefi rinovigita.",
        "resettokens-resetbutton": "Rinovigar selektita klefi",
-       "bold_sample": "Dika literi",
-       "bold_tip": "Dika literi",
-       "italic_sample": "Kursiva literi",
-       "italic_tip": "Kursiva literi",
-       "link_sample": "Titulo dil ligilo",
-       "link_tip": "Interna ligilo",
-       "extlink_sample": "http://www.example.com Titulo dil ligilo",
-       "extlink_tip": "Extera ligilo (memorez adjuntar la prefixo \"http://\")",
-       "headline_sample": "Texto dil titulo",
-       "headline_tip": "Titulo di duesma nivelo",
-       "nowiki_sample": "Insertar senformizita texto hike",
-       "nowiki_tip": "Ignorez formatigo wikial",
-       "image_sample": "Exemplo.jpg",
-       "image_tip": "Imajo enkorpigita",
-       "media_sample": "Exemplo.ogg",
-       "media_tip": "Ligilo di arkivo",
-       "sig_tip": "Vua signaturo kun 'timestamp'",
-       "hr_tip": "Horizontala lineo (ne trouzez ol)",
        "summary": "Rezumo:",
        "subject": "Temo:",
        "minoredit": "Ico esas mikra redaktajo",
        "block-expiry": "Expiro:",
        "block-options": "Plusa agadi:",
        "block-reason": "Motivo:",
+       "block-target": "Nomo od IP-adreso dil uzero:",
        "unblockip": "Desblokusar uzero",
        "unblockiptext": "Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.",
        "ipusubmit": "Desblokusar",
        "movepagetext": "Uzante ica formularo onu povas rinomizar pagino, movante olua omna versionaro ad la nova titulo.\nLa antea titulo konvertesos a ridirektilo a la nova titulo.\nLa ligili a la antea titulo dil pagino ne chanjesos.\nVoluntez certigar ke ne esas [[Special:DoubleRedirects|duopla]] o [[Special:BrokenRedirects|ruptota ridirektili]].\nVu responsas ke la ligili duros direktante a la pagino korespondanta.\n\nMemorez ke la pagino '''ne''' rinomizesos se ja existus pagino kun la nova titulo, eceptuante ke la pagino esas vakua o ridirektilo sen versionaro.\nIco signifikas ke vu povos rinomizar pagino a olua originala titulo se eroras skribante la nova titulo, ma ne povos riskribar existanta pagino.\n\n'''EGARDEZ!'''\nIca povas esar drastika chanjo e ne-esperinda por populara pagino;\nvoluntez certigar ke vu komprenas la konsequi qui eventos ante durar adavane.",
        "movepagetext-noredirectfixer": "Uzar la formulario infre rinomizos la pagino, e tota lua historio-listo a la nova nomo.\nL'anciena titulo ridirektesos a la nova titulo.\nVerifikez la [[Special:DoubleRedirects|duopla]] e/o la [[Special:BrokenRedirects|krevita ridirekti]].\n<strong>Esas vua responso verifikar se omna ligili esas korekta.</strong>\n\nVidez ke la pagino <strong>ne rinomizesos se existar pagino kun la sama titulo</strong>, ecepte se ol ridirektesas a la prezenta pagino e ne havas pasinta historio pri redaktado.\nTo signifikas ke vu povas retroe rinomizar pagino a lua antea nomo se ol rinomizesis erore, e ke vu ne povas supresar existanta pagino per ridirektado di altra pagino.\n\n<strong>Atencez:</strong>\nLa rinomizo povas esar drastika chanjo por pagini qui esas populara;\nhavez klara certezo pri la konsequi di la posibla rinomizo di la pagino, ante facar ol!",
        "movepagetalktext": "Se vu markizos ca buxo, la diskuto-pagino asociita anke modifikesos a la nova titulo, ecepte se diskuto-pagino nevakua ja existar ibe.\n\nCakaze, vu propra mustos movar la diskuto-pagino o mixar la du texti, se vu deziros.",
-       "movecategorypage-warning": "<strong>Atencez:</strong> Vu balde rinomizos pagino di \"KATEGORIO\". Nur la titulo di la kategorio chanjesos, ma <em>nula pagino kategoriizita segun l'anciena kategorio</em> modifikesos automatale por la nova kategorio.",
+       "movecategorypage-warning": "<strong>Atencez:</strong> Vu balde rinomizos pagino pri \"KATEGORIO\". Nur la titulo di la kategorio chanjesos, ma <em>nula pagino kategoriizita segun l'anciena kategorio</em> modifikesos automatale por la nova kategorio.",
        "movenologintext": "Vu mustas esar registragita uzero ed [[Special:UserLogin|enirir]] por rinomizar pagino.",
        "newtitle": "Nova titulo:",
        "move-watch": "Surveyar ca pagino",
        "newimages": "Galerio di nova arkivi",
        "imagelisttext": "Infre esas listo di '''$1''' {{PLURAL:$1|arkivo|arkivi}} rangizita $2.",
        "newimages-legend": "Filtrilo",
+       "newimages-user": "IP-adreso o nomo dil uzero",
        "ilsubmit": "Serchar",
        "bydate": "per dato",
        "minutes": "{{PLURAL:$1|$1 minuto|$1 minuti}}",
index 029e173..5cb2916 100644 (file)
        "resettokens-token-label": "$1 (núverandi gildi: $2)",
        "resettokens-done": "Lyklarnir hafa verið endurstilltir.",
        "resettokens-resetbutton": "Endurstilla valda lykla",
-       "bold_sample": "Feitletraður texti",
-       "bold_tip": "Feitletraður texti",
-       "italic_sample": "Skáletraður texti",
-       "italic_tip": "Skáletraður texti",
-       "link_sample": "Titill tengils",
-       "link_tip": "Innri tengill",
-       "extlink_sample": "http://www.dæmi.is titill tengils",
-       "extlink_tip": "Ytri tengill (muna að setja http:// á undan)",
-       "headline_sample": "Fyrirsagnartexti",
-       "headline_tip": "Annars stigs fyrirsögn",
-       "nowiki_sample": "Innsetjið ósniðinn texta hér",
-       "nowiki_tip": "Hunsa wiki-snið",
-       "image_sample": "Sýnishorn.jpg",
-       "image_tip": "Innfellt skjal",
-       "media_sample": "Sýnishorn.ogg",
-       "media_tip": "Tengill skjals",
-       "sig_tip": "Undirskrift þín auk tímasetningar",
-       "hr_tip": "Lárétt lína (notist sparlega)",
        "summary": "Breytingarágrip:",
        "subject": "Umræðuefni:",
        "minoredit": "Þetta er minniháttar breyting",
index ba8f515..50ef092 100644 (file)
        "tog-useeditwarning": "Avvisa quando si esce da una pagina di modifica con modifiche non salvate",
        "tog-prefershttps": "Usa sempre una connessione sicura quando si effettua l'accesso",
        "tog-showrollbackconfirmation": "Mostra una richiesta di conferma quando si clicca su un link di rollback",
+       "tog-requireemail": "Richiedi email per cambiare la password",
        "underline-always": "Sempre",
        "underline-never": "Mai",
        "underline-default": "Impostazioni predefinite del browser o del tema",
        "createaccountmail": "Usa una password casuale temporanea e inviala all'indirizzo di posta elettronica specificato",
        "createaccountmail-help": "Può essere utilizzato per creare un'utenza per un'altra persona senza doverne conoscere la password.",
        "createacct-realname": "Nome reale (opzionale)",
-       "createacct-reason": "Motivo",
+       "createacct-reason": "Motivo (registrato pubblicamente)",
        "createacct-reason-ph": "Perché stai creando un'altra utenza",
        "createacct-reason-help": "Messaggio visualizzato nel registro della creazione dell'utenza",
        "createacct-submit": "Crea la tua utenza",
        "resettokens-watchlist-token": "Token per il feed web (Atom/RSS) delle [[Special:Watchlist|modifiche alle pagine nei tuoi osservati speciali]]",
        "resettokens-done": "Token reimpostati.",
        "resettokens-resetbutton": "Reimposta token selezionati",
-       "bold_sample": "Grassetto",
-       "bold_tip": "Grassetto",
-       "italic_sample": "Corsivo",
-       "italic_tip": "Corsivo",
-       "link_sample": "Titolo del collegamento",
-       "link_tip": "Collegamento interno",
-       "extlink_sample": "http://www.example.com titolo del collegamento",
-       "extlink_tip": "Collegamento esterno (ricorda il prefisso http:// )",
-       "headline_sample": "Intestazione",
-       "headline_tip": "Intestazione di 2° livello",
-       "nowiki_sample": "Inserire qui il testo non formattato",
-       "nowiki_tip": "Ignora la formattazione wiki",
-       "image_sample": "Esempio.jpg",
-       "image_tip": "Incorpora file",
-       "media_sample": "Esempio.ogg",
-       "media_tip": "Collegamento a file multimediale",
-       "sig_tip": "Firma con data e ora",
-       "hr_tip": "Linea orizzontale (usare con giudizio)",
        "summary": "Oggetto:",
        "subject": "Oggetto:",
        "minoredit": "Questa è una modifica minore",
        "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]])",
+       "undo-summary-anon": "Annullata la modifica $1 di [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Annullata la modifica $1 di un utente nascosto",
        "cantcreateaccount-text": "La registrazione è stata bloccata da [[User:$3|$3]] per questo indirizzo IP ('''$1''').\n\nLa motivazione del blocco fornita da $3 è la seguente: ''$2''",
        "cantcreateaccount-range-text": "La registrazione da indirizzi IP nell'intervallo <strong>$1</strong>, che include il tuo (<strong>$4</strong>), è stata bloccata da [[User:$3|$3]].\n\nLa motivazione fornita da $3 è <em>$2</em>",
        "prefs-help-email": "L'inserimento del proprio indirizzo email è facoltativo, ma permette di ricevere la propria password qualora venisse dimenticata.",
        "prefs-help-email-others": "Puoi anche scegliere di lasciare che gli altri ti contattino via posta elettronica con un collegamento dalla tua pagina utente o di discussione.\nIl tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.",
        "prefs-help-email-required": "L'indirizzo email è obbligatorio.",
+       "prefs-help-requireemail": "Se selezionato, invieremo solo email per la reimpostazione della password se la persona che sta resettando la password ha fornito sia il nome utente che l'email per questa utenza.",
        "prefs-info": "Informazioni di base",
        "prefs-i18n": "Internazionalizzazione",
        "prefs-signature": "Firma",
        "listfiles-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
        "imgfile": "file",
        "listfiles": "Elenco dei file",
+       "listfiles_subpage": "Caricamenti di $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nome",
        "ipblocklist-legend": "Cerca un utente bloccato",
        "blocklist-userblocks": "Nascondi i blocchi degli utenti registrati",
        "blocklist-tempblocks": "Nascondi i blocchi temporanei",
+       "blocklist-indefblocks": "Nascondi blocchi infiniti",
        "blocklist-addressblocks": "Nascondi i blocchi di un solo IP",
        "blocklist-type": "Tipo:",
        "blocklist-type-opt-all": "Tutto",
        "move-page-legend": "Spostamento di pagina",
        "movepagetext": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Puoi aggiornare automaticamente i redirect che puntano al titolo originale. Puoi decidere di non farlo, ma ricordati di verificare che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina <strong>non</strong> sarà spostata se ne esiste già una con il nuovo nome, a meno che quest'ultima non sia costituita solo da un redirect e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n<strong>Nota:</strong>\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
        "movepagetext-noredirectfixer": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. La pagina attuale diverrà automaticamente un redirect al nuovo titolo. Controlla che lo spostamento non abbia creato [[Special:DoubleRedirects|doppi redirect]] o [[Special:BrokenRedirects|redirect errati]]. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina <strong>non</strong> sarà spostata se ne esiste già una con il nuovo nome, a meno che non sia costituita solo da un redirect e sia priva di versioni precedenti. In caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n<strong>Nota:</strong>\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
+       "movepagetext-noredirectsupport": "Questo modulo consente di rinominare una pagina, spostando tutta la sua cronologia al nuovo nome. L'onere di garantire che i collegamenti alla pagina restino corretti spetta a chi la sposta.\n\nSi noti che la pagina <strong>non</strong> sarà spostata se ne esiste già una con il nuovo nome.\nIn caso di spostamento errato si può quindi tornare subito al vecchio titolo, e non è possibile sovrascrivere per errore una pagina già esistente.\n\n<strong>Nota:</strong>\nUn cambiamento così drastico può creare contrattempi e problemi, soprattutto per le pagine più visitate. Accertarsi di aver valutato le conseguenze dello spostamento prima di procedere.",
        "movepagetalktext": "Se selezioni questa casella, la corrispondente pagina di discussione sarà spostata automaticamente al nuovo titolo, a meno che esista già una pagina di discussione non vuota.\n\nIn questi casi, se lo ritieni opportuno, dovrai spostare o unire manualmente la pagina.",
        "moveuserpage-warning": "'''Attenzione:''' Si sta per spostare una pagina utente. Nota che verrà spostata solamente la pagina. L'utente ''non'' sarà rinominato.",
        "movecategorypage-warning": "<strong>Attenzione:</strong> si sta per spostare una categoria. Solo questa pagina verrà spostata: tutte le pagine nella vecchia categoria <em>non</em> saranno inserite nella nuova.",
        "specialpages-group-developer": "Strumenti per gli sviluppatori",
        "blankpage": "Pagina vuota",
        "intentionallyblankpage": "Questa pagina è lasciata volutamente vuota.",
+       "disabledspecialpage-disabled": "Questa pagina è stata disabilitata da un amministratore di sistema.",
        "external_image_whitelist": " #Lasciare questa riga esattamente com'è<pre>\n#Inserire i frammenti delle espressioni regolari (solo la parte che va fra //) di seguito\n#Queste verranno messe a confronto con gli indirizzi URL delle immagini esterne (hotlinked)\n#Le corrispondenze saranno mostrate come immagini, altrimenti verrà mostrato solo un collegamento\n#Le righe che iniziano con # sono considerate dei commenti\n#La differenza tra maiuscole e minuscole non è significativa\n\n#Inserire sopra questa riga tutti i frammenti di regex. Lasciare questa riga esattamente com'è</pre>",
        "tags": "Etichette di modifiche valide",
        "tag-filter": "Filtra per [[Special:Tags|etichetta]]:",
index 8d7fdc1..ff33e2e 100644 (file)
@@ -98,7 +98,8 @@
                        "Puntti ja",
                        "マツムシ",
                        "神樂坂秀吉",
-                       "Yuukin0248"
+                       "Yuukin0248",
+                       "Reiwa period"
                ]
        },
        "tog-underline": "リンクの下線:",
        "tog-useeditwarning": "変更を保存せずに編集画面から離れようとしたら警告",
        "tog-prefershttps": "ログインする際、常に安全な接続を使用する",
        "tog-showrollbackconfirmation": "巻き戻しリンクをクリックした際に確認画面を表示する",
+       "tog-requireemail": "パスワードの変更にはメーフアドレスが必要です",
        "underline-always": "常に付ける",
        "underline-never": "常に付けない",
        "underline-default": "外装またはブラウザーの既定値を使用",
        "botpasswords-insert-failed": "ボット「$1」の追加に失敗しました。既に追加されていないか確認してください。",
        "botpasswords-update-failed": "ボット「$1」の更新に失敗しました。削除されていないか確認してください。",
        "botpasswords-created-title": "ボット用パスワードが作成されました",
-       "botpasswords-created-body": "利用者「$2」のボット名「$1」のためのパスワードが作成されました。",
+       "botpasswords-created-body": "{{GENDER:$2|利用者}}「$2」のボット「$1」のパスワードが作成されました。",
        "botpasswords-updated-title": "ボット用パスワードが更新されました",
-       "botpasswords-updated-body": "利用者「$2」のボット名「$1」のためのパスワードが更新されました。",
+       "botpasswords-updated-body": "{{GENDER:$2|利用者}}「$2」のボット「$1」のパスワードが更新されました。",
        "botpasswords-deleted-title": "ボット用パスワードが削除されました",
-       "botpasswords-deleted-body": "利用者「$2」のボット名「$1」のためのパスワードが削除されました。",
+       "botpasswords-deleted-body": "{{GENDER:$2|利用者}}「$2」のボット「$1」のパスワードが削除されました。",
        "botpasswords-newpassword": "<strong>$1</strong>用の新しいパスワードは<strong>$2</strong>です。<em>後で参照するために、この情報を控えておいてください。</em><br />(古いボットの制約などでログイン名と利用者名が同じでなければならない場合は、<strong>$3</strong>を利用者名とし、<strong>$4</strong>をパスワードとしてください。)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider が有効ではありません。",
        "botpasswords-restriction-failed": "ボットパスワード制限によりログインできません。",
        "resettokens-watchlist-token": "[[Special:Watchlist|あなたのウォッチリストに登録されているページの変更]]を列挙するフィード (Atom/RSS) のトークン",
        "resettokens-done": "トークンを再設定しました。",
        "resettokens-resetbutton": "選択したトークンを再設定",
-       "bold_sample": "太字",
-       "bold_tip": "太字",
-       "italic_sample": "斜体",
-       "italic_tip": "斜体",
-       "link_sample": "リンクの名前",
-       "link_tip": "内部リンク",
-       "extlink_sample": "http://www.example.com リンクの名前",
-       "extlink_tip": "外部リンク (http:// を忘れずに付けてください)",
-       "headline_sample": "見出し文",
-       "headline_tip": "2段目の見出し",
-       "nowiki_sample": "ここにマークアップを無効にするテキストを入力します",
-       "nowiki_tip": "ウィキ書式を無視",
-       "image_sample": "サンプル.jpg",
-       "image_tip": "ファイルの埋め込み",
-       "media_sample": "サンプル.ogg",
-       "media_tip": "ファイルへのリンク",
-       "sig_tip": "時刻印付きの署名",
-       "hr_tip": "水平線を挿入 (利用は控えめに)",
        "summary": "編集内容の要約:",
        "subject": "題名:",
        "minoredit": "細部の編集",
        "nocreate-loggedin": "新しいページを作成する権限がありません。",
        "sectioneditnotsupported-title": "節単位編集はサポートされていません",
        "sectioneditnotsupported-text": "このページでは節単位編集はサポートされません。",
+       "modeleditnotsupported-title": "編集はサポートしていません",
+       "modeleditnotsupported-text": "コンテンツモデル$1の編集はサポートしていません",
        "permissionserrors": "権限エラー",
        "permissionserrorstext": "あなたにはこの操作を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "permissionserrorstext-withaction": "あなたには「$2」を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "rcfilters-filter-showlinkedto-label": "指定されたページのリンク元の変更を表示",
        "rcfilters-filter-showlinkedto-option-label": "指定されたページに<strong>リンクしているページ(リンク元)</strong>",
        "rcfilters-target-page-placeholder": "ページ名(またはカテゴリ名)を入力",
+       "rcfilters-alldiscussions-label": "全ての議論",
        "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
        "rclistfromreset": "日時指定をリセット",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "backend-fail-contenttype": "「$1」に保存するコンテンツの種類が判断できませんでした。",
        "backend-fail-batchsize": "ストレージバックエンドは $1 件のファイル{{PLURAL:$1|操作}}のバッチを与えられました; 上限は $2 件の{{PLURAL:$2|操作}}です。",
        "backend-fail-usable": "権限が不足している、またはディレクトリ/コンテナーがないため、ファイル「$1」の読み取り/書き込みができません。",
+       "backend-fail-stat": "ファイル\"$1\"の状態を読み込めませんでした。",
        "filejournal-fail-dbconnect": "ストレージバックエンド「$1」のジャーナルデータベースに接続できません。",
        "filejournal-fail-dbquery": "ストレージバックエンド「$1」のジャーナルデータベースを更新できません。",
        "lockmanager-notlocked": "「$1」をロック解除できませんでした。ロックされていません。",
        "listfiles-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
        "imgfile": "ファイル",
        "listfiles": "ファイル一覧",
+       "listfiles_subpage": "$1 によるアップロード",
        "listfiles_thumb": "サムネイル",
        "listfiles_date": "日時",
        "listfiles_name": "名前",
        "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": "コンテンツ・モデルは変更されました",
        "tags-delete-not-allowed": "拡張機能によって定義されているタグは削除できません(ただし拡張機能が明示的に削除を許可している場合を除く)。",
        "tags-delete-not-found": "タグ「$1」は存在しません。",
        "tags-delete-too-many-uses": "タグ「$1」は少なくとも$2版に付与されており、削除できません。",
-       "tags-delete-warnings-after-delete": "ã\82¿ã\82°ã\80\8c$1ã\80\8dã\81®å\89\8aé\99¤ã\81\97ã\81¾ã\81\97ã\81\9fã\81\8c、以下の{{PLURAL:$2|警告}}が発生しました:",
+       "tags-delete-warnings-after-delete": "ã\82¿ã\82°ã\80\8c$1ã\80\8dã\82\92å\89\8aé\99¤ã\81\97ã\81\9fã\81¨ã\81\93ã\82\8d、以下の{{PLURAL:$2|警告}}が発生しました:",
        "tags-delete-no-permission": "変更タグを削除する権限がありません。",
        "tags-activate-title": "タグの有効化",
        "tags-activate-question": "タグ「$1」を有効化しようとしています。",
index 0981682..389f209 100644 (file)
        "passwordreset": "Riiset paaswod‎",
        "passwordreset-username": "Yuuzaniem:",
        "passwordreset-domain": "Domien:",
-       "bold_sample": "Buol tex",
-       "bold_tip": "Buol tex",
-       "italic_sample": "Aitalik tex",
-       "italic_tip": "Aitalik tex",
-       "link_sample": "Lingk taikl",
-       "link_tip": "Intoernal lingk",
-       "extlink_sample": "http://www.example.com lingk taikl",
-       "extlink_tip": "Extoernal lingk (memba http:// priifix)",
-       "headline_sample": "Edlain tex",
-       "headline_tip": "Lebl 2 edlain",
-       "nowiki_sample": "Insoert nan-faamatid tex yaso",
-       "nowiki_tip": "Ignuor wiki faamatin",
-       "image_tip": "Embedid fail",
-       "media_tip": "Fail lingk",
-       "sig_tip": "Yu signicha wid taimtamp",
-       "hr_tip": "Arizantal lain (yuuz spierinli)",
        "summary": "Somari:",
        "subject": "Sobjik/edlain",
        "minoredit": "Dis a maina edit",
index 317b5a7..994a178 100644 (file)
        "resetpass-submit-cancel": "Åbryd",
        "passwordreset": "Nullstell adgångskode",
        "passwordreset-username": "Brugenaun:",
-       "bold_sample": "Fied tekst",
-       "bold_tip": "Fied tekst",
-       "italic_sample": "Kursiw tekst",
-       "italic_tip": "Kursiw tekst",
-       "link_sample": "Henwisneng",
-       "link_tip": "Intern henwisneng",
-       "extlink_sample": "http://www.example.com titel på henwisneng",
-       "extlink_tip": "Ekstern henwisneng (husk http:// præfiks)",
-       "headline_sample": "Tekst te öweskrift",
-       "headline_tip": "Typ 2-øweskrift",
-       "nowiki_sample": "Insätt tekst her som ett skal wikiformatiirs",
-       "nowiki_tip": "Ignoriir wikiformatiireng",
-       "image_tip": "Inlejretj fil",
-       "media_tip": "Henwisneng te fil",
-       "sig_tip": "Din signatur mä tidsstempel",
-       "hr_tip": "Horisontal linje (brug den spårsom)",
        "summary": "Sammelfattneng:",
        "subject": "Emn/öweskrift:",
        "minoredit": "Detj ä en lie øndreng",
index 243c68c..bd286c9 100644 (file)
        "tog-numberheadings": "Wènèhi angkaning sesirah kanthi otomatis",
        "tog-editondblclick": "Besut kaca sarana ngeklik pindho",
        "tog-editsectiononrightclick": "Idinaké mbesut pérangan sarana klik tengen ing sesirahing pérangan",
-       "tog-watchcreations": "Wuwuh kaca gawéanku lan barkas unggahanku menyang pawawanganku",
-       "tog-watchdefault": "Wuwuh kaca lan barkas besutanku menyang pawawanganku",
-       "tog-watchmoves": "Wuwuh kaca lan barkas lih-lihanku menyang pawawanganku",
-       "tog-watchdeletion": "Wuwuh kaca lan barkas busakanku menyang pawawanganku",
-       "tog-watchuploads": "Wuwuh barkas anyar unggahanku menyang pawawanganku",
+       "tog-watchcreations": "Wuwuh kaca gawéanku lan berkas unggahanku menyang pawawanganku",
+       "tog-watchdefault": "Wuwuh kaca lan berkas besutanku menyang pawawanganku",
+       "tog-watchmoves": "Wuwuh kaca lan berkas lih-lihanku menyang pawawanganku",
+       "tog-watchdeletion": "Wuwuh kaca lan berkas busekanku menyang pawawanganku",
+       "tog-watchuploads": "Wuwuh berkas anyar unggahanku menyang pawawanganku",
        "tog-watchrollback": "Wuwuh kaca kang dakpulihaké menyang pawawanganku",
        "tog-minordefault": "Tengeri kabèh besutan minangka besutan cilik sacara baku",
        "tog-previewontop": "Deleng pratuduh sadurungé mbesut kothak",
        "tog-previewonfirst": "Delelng pratuduh nalika mbesut pisanan",
-       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa barkas ing pawawanganku kang diowahi",
+       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa berkas ing pawawanganku kang ingowahan",
        "tog-enotifusertalkpages": "Kirimi aku layang-èl yèn kaca parembuganku ana kang ngowahi",
-       "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan barkas",
+       "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan berkas",
        "tog-enotifrevealaddr": "Tuduhaké alamat layang-èlku ing layang wara-wara",
        "tog-shownumberswatching": "Tuduhaké cacah wong kang ngawasi",
        "tog-oldsig": "Tandha tanganmu kang wis cumawis:",
        "category-subcat-count-limited": "Kategori iki duwé {{PLURAL:$1|anak kategori|$1 anak kategori}} kaya ngisor iki.",
        "category-article-count": "{{PLURAL:$2|Kategori iki mung ngandhut kaca ngisor iki.|{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki ana ing kategori iki saka gunggung $2 kaca.}}",
        "category-article-count-limited": "Kategori iki ngemu {{PLURAL:$1|kaca|$1 kaca}} kang kapacak ing isor iki.",
-       "category-file-count": "{{PLURAL:$2|Kategori iki mung isi barkas iki.|{{PLURAL:$1|Barkas|$1 barkas}} iki ana sajeroning kategori iki saka $2 gunggungé.}}",
-       "category-file-count-limited": "Kategori iki duwé {{PLURAL:$1|barkas|$1 barkas}} kang kapacak ing isor iki.",
+       "category-file-count": "{{PLURAL:$2|Kategori iki mung isi berkas iki.|{{PLURAL:$1|Berkas|$1 berkas}} iki ana ing jero kategori iki saka $2 gunggungé.}}",
+       "category-file-count-limited": "Kategori iki duwé {{PLURAL:$1|berkas|$1 berkas}} kang kapacak ing sor iki.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Kaca kaindhèks",
        "noindex-category": "Kaca ora kaindhèks",
-       "broken-file-category": "Kaca mawa pranala barkas rusak",
+       "broken-file-category": "Kaca mawa pranala berkas rusak",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "category-header-numerals": "$1–$2",
        "about": "Bab",
        "history_short": "Sajarah",
        "history_small": "sajarah",
        "updatedmarker": "wis dianyari kawit tekaku mréné pungkasan",
-       "printableversion": "Vèrsi céthak",
+       "printableversion": "Vèrsi cithak",
        "permalink": "Pranala permanèn",
        "print": "Cithak",
        "view": "Deleng",
        "tool-link-userrights": "Owahi golongan {{GENDER:$1|panganggo}}",
        "tool-link-userrights-readonly": "Deleng golongan {{GENDER:$1|panganggo}}",
        "tool-link-emailuser": "Kirimi {{GENDER:$1|panganggo}} iki layang-é",
-       "imagepage": "Deleng kaca barkas",
+       "imagepage": "Deleng kaca berkas",
        "mediawikipage": "Deleng kaca layang",
        "templatepage": "Deleng kaca cithakan",
        "viewhelppage": "Deleng kaca pitulung",
        "portal-url": "Project:Garupa paguyuban",
        "privacy": "Niti privasi",
        "privacypage": "Project:Niti privasi",
-       "badaccess": "Aksès ora olèh",
+       "badaccess": "Masalah idin",
        "badaccess-group0": "Kowé ora kawogan ngayahi laku kang kojaluk.",
        "badaccess-groups": "Laku kang koarepi mung winates tumrap panganggo ing {{PLURAL:$2|golongan}}: $1.",
-       "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
+       "versionrequired": "Butuh MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
        "pagetitle": "$1 - {{SITENAME}}",
        "youhavenewmessages": "{{PLURAL:$3|Kowé duwé}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Kowé duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
        "youhavenewmessagesmanyusers": "Kowé duwé $1 saka manéka panganggo ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|layang anyar|999=layang anyar}}",
+       "newmessageslinkplural": "{{PLURAL:$1|siji layang anyar|999=layang anyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|owahan|999=owahan}} pungkasan",
        "youhavenewmessagesmulti": "Kowé éntuk layang anyar ing $1",
        "editsection": "besut",
        "nstab-media": "Kaca médhia",
        "nstab-special": "Kaca mirunggan",
        "nstab-project": "Kaca proyèk",
-       "nstab-image": "Barkas",
+       "nstab-image": "Berkas",
        "nstab-mediawiki": "Layang",
        "nstab-template": "Cithakan",
        "nstab-help": "Kaca pitulung",
        "readonly_lag": "Database wis dikunci mawa otomatis sawetara database sékundhèr lagi nglakoni sinkronisasi mawa database utama",
        "internalerror": "Masalah njero",
        "internalerror_info": "Masalah njero: $1",
-       "filecopyerror": "Ora bisa nurun barkas \"$1\" dadi \"$2\".",
+       "filecopyerror": "Ora bisa nurun berkas \"$1\" dadi \"$2\".",
        "filerenameerror": "Ora bisa ngowahi saka \"$1\" dadi \"$2\".",
-       "filedeleteerror": "Ora bisa mbusek barkas \"$1\".",
+       "filedeleteerror": "Ora bisa mbusek berkas \"$1\".",
        "directorycreateerror": "Ora bisa nggawé dirèktori \"$1\".",
        "directoryreadonlyerror": "Pérangan \"$1\" mung kena diwaca.",
        "directorynotreadableerror": "Pérangan \"$1\" ora kena diwaca.",
-       "filenotfound": "Ora bisa nemu barkas \"$1\".",
+       "filenotfound": "Ora bisa nemu berkas \"$1\".",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Masalah: Ora bisa ngirim formulir",
        "badarticleerror": "Laku iki ora bisa kalakokaké ing kaca iki.",
-       "cannotdelete": "Kaca utawa barkas \"$1\" ora bisa kobusek.\nBokmanawa kaca utawa barkasé wis dibusek wong liya.",
+       "cannotdelete": "Kaca utawa berkas \"$1\" ora bisa kobusek.\nBokmanawa kaca utawa berkasé wis dibusek wong liya.",
        "cannotdelete-title": "Ora bisa mbusek kaca \"$1\"",
        "delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
        "customcssprotected": "Kowé ora kawogan mbesut kaca CSS iki amarga ngemu setèlan pribadi panganggo liya.",
        "customjsprotected": "Kowé ora kawogan mbesut kaca JavaScript iki amarga ngemu setèlan pribadi panganggo liya.",
        "mycustomcssprotected": "Sampèyan ora duwé idin kanggo ngowah kaca CSS iki.",
+       "mycustomjsonprotected": "Kowé ora kawogan mbesut kaca JSON iki.",
        "mycustomjsprotected": "Sampèyan ora duwé idin kanggo ngowah kaca JavaScript iki.",
        "myprivateinfoprotected": "Sampèyan ora duwé idin kanggo ngowah informasi privat sampèyan.",
        "mypreferencesprotected": "Sampèyan ora duwé idin kanggo ngowah preferensi sampèyan.",
        "ns-specialprotected": "Kaca mirunggan ora bisa dibesut.",
        "titleprotected": "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].\nAlesané yaiku <em>$2</em>.",
-       "filereadonlyerror": "Ora bisa ndandani barkas \"$1\" amarga panyimpenan barkas \"$2\" mung bisa diwaca.\n\nPangurus sistem kang ngunci iku njlèntrèhaké: \"$3\".",
+       "filereadonlyerror": "Ora bisa ndandani berkas \"$1\" amarga panyimpenan berkas \"$2\" mung bisa kawaca.\n\nPangurus sistem kang nggembok iku wèwèh pawadan: \"$3\".",
        "invalidtitle": "Sesirah ora trep",
        "invalidtitle-knownnamespace": "Sesirah ora trep mawa mandhala aran \"$2\" lan tulisan \"$3\"",
        "invalidtitle-unknownnamespace": "Sesirah ora trep mawa angka $1 lan tulisan \"$2\" mandhala aran kang ora kaweruhan",
        "virus-scanfailed": "''Pemindaian'' utawa ''scan'' gagal (kode $1)",
        "virus-unknownscanner": "antivirus buhbuhan:",
        "logouttext": "<strong>Kowé wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn kowé isih mlebu log, kajaba kowé mbusek telihing panglurumu.",
+       "logging-out-notify": "Kowé metu log, entèni sadhéla.",
+       "logout-failed": "Saiki ora bisa metu log: $1",
        "cannotlogoutnow-title": "Ora bisa metu saiki",
        "cannotlogoutnow-text": "Mokal metu log nalika nganggo $1.",
        "welcomeuser": "Sugeng Rawuh, $1!",
        "nosuchuser": "Ora ana panganggo mawa jeneng \"$1\".\nJeneng panganggo iku sènsitif tumrap gedhé-ciliké huruf.\nJajan priksanen pangéjamu, utawa [[Special:CreateAccount|gawénen akun anyar]].",
        "nosuchusershort": "Ora ana panganggo mawa asma \"$1\". Coba dipriksa manèh pasang aksarané (éjaané).",
        "nouserspecified": "Kowé kudu ngisi jeneng panganggo.",
-       "login-userblocked": "Panganggo iki pinalangan. Ora kena mbelu.",
+       "login-userblocked": "Panganggo iki kapenggak. Ora kena mbelu.",
        "wrongpassword": "Jenang panganggo utawa tembung wadi kang koisèkaké salah.\nMangga jajal manèh.",
        "wrongpasswordempty": "Tembung wadi kosong.\nJajalen manèh.",
        "passwordtooshort": "Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "noemail": "Ora ana alamat layang-èl kang kacathet tumrap ing panganggo \"$1\".",
        "noemailcreate": "Kowé kudu mènèhi alamat layang-èl kang trep",
        "passwordsent": "Tembung wadi anyar wis kinirim menyang alamat layang-èl kang kadhaftar tumrap \"$1\". \nMangga mlebu log manèh sawisé kowé nampa iku.",
-       "blocked-mailpassword": "Alamat IP-mu kablokir saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
+       "blocked-mailpassword": "Alamat IP-mu kapenggak saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
        "eauthentsent": "Layang-èl konfirmasi wis kinirim menyang alamat layang-èl kang koisèkaké. Sadurungé ana layang-èl liyané kang kinirim menyang akun iku, kowé kudu nututi panuntun ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèmu.",
        "throttled-mailpassword": "Layang kanggo mbalèkaké tembung wadi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung wadi kang bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Masalah pangirim layang: $1",
-       "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-né panjenengan wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} sajeroné $2 pungkasan, kang cacahé nyandhak cacah maksimum kang diidinaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sauntara iki.",
-       "emailauthenticated": "Alamat layang-èlé panjenengan wis dikonfirmasi ing tanggal $2 pukul $3.",
-       "emailnotauthenticated": "Alamat layang-èlé panjenengan durung dikonfirmasi.\nLayang-èl ora bakal dikirim yèn gegayutan karo fitur-fitur iki.",
-       "noemailprefs": "Panjenengan kudu milih alamat e-mail supaya bisa nganggo fitur iki.",
-       "emailconfirmlink": "Ndhedhes (konfirmasi) alamat e-mail panjenengan",
+       "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-mu wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} ing dalem $2 pungkasan, kang cacahé nyandhak cacah maksimum kang kaolèhaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sawatara wektu iki.",
+       "emailauthenticated": "Alamat layang èlèktronikmu wis kakonfirmasi ing tanggal $2 pukul $3.",
+       "emailnotauthenticated": "Alamat layang-èlèktronikmu durung kakonfirmasi.\nLayang Ã¨lèktronik ora bakal kakirim amarga gegayutan fitur-fitur ing sor iki.",
+       "noemailprefs": "Isi alamat layang èlèktronikmu ing pilalanmu supaya fitur-fitur iki murub.",
+       "emailconfirmlink": "Konfirmasi alamat layang èlèktronikmu",
        "invalidemailaddress": "Alamat e-mail iki ora bisa ditampa amarga formaté ora bener. Tulung lebokna alamat mawa format kang bener utawa kosongaké waé isèn mau.",
        "cannotchangeemail": "Alamat layang-èl akun ora bisa diowah ing wiki iki.",
        "emaildisabled": "Situs iki ora bisa ngirim layang èlèktronik.",
        "accountcreated": "Akun wis kagawé",
        "accountcreatedtext": "Akun panganggo [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|rembug]]) wis digawé.",
        "createaccount-title": "Gawé akun kanggo {{SITENAME}}",
-       "createaccount-text": "Ana kang nggawé akun nganggo alamat layang-èlé panjenengan ing {{SITENAME}} ($4) kanthi aran \"$2\", mawa tembung wadi \"$3\".\nPanjenengan kudu mlebu log lan ngowahi tembung wadiné panjenengan saiki.\n\nPanjenengan kena nglirwakaké layang iki, manawa akun iki ginawé awit kaluputan.",
-       "login-throttled": "Panjenengan wis ping akèh njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
-       "login-abort-generic": "Panjenengan ora bisa mlebu log - Kawurungan",
-       "login-migrated-generic": "Akuné panjenengan wis dimigrasi, lan jeneng panganggoné wis ora ana manèh ing wiki iki.",
+       "createaccount-text": "Ana kang nggawé akun nganggo alamat layang èlèktronikmu ing {{SITENAME}} ($4) aran \"$2\", mawa tembung wadi \"$3\".\nKowé kudu mlebu log lan ngowahi tembung wadimu saiki.\n\nKowé kena nglirwakaké layang iki, manawa akun iki kagawé ora sengaja amarga luput.",
+       "login-throttled": "Kowé wis njajal mlebu log ping akèh.\nEntènana $1 sadurung njajal manèh.",
+       "login-abort-generic": "Kowé ora bisa mlebu log - Kawurungaké",
+       "login-migrated-generic": "Akunmu wis ingalihan, lan jeneng panganggomu wis ora ana manèh ing wiki iki.",
        "loginlanguagelabel": "Basa: $1",
-       "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
-       "createacct-another-realname-tip": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
+       "suspicious-userlogout": "Panjalukmu supaya metu log tinulak amarga panjaluké kakirim saka pangluru kang rusak utawa proksi telih.",
+       "createacct-another-realname-tip": "Jeneng asli ora kudu kaisi.\nYèn koisi, jeneng asliné bakal kaanggo ing atribusi tumrap karyané.",
        "pt-login": "Mlebu log",
        "pt-login-button": "Mlebu log",
        "pt-login-continue-button": "Banjuraké mlebu log",
        "user-mail-no-addy": "Njajal ngirim layang èlèktronik tanpa alamat layang èlèktronik.",
        "user-mail-no-body": "Nyoba ngirim layang e-mail, tapi isine kosong.",
        "changepassword": "Ganti tembung wadi",
-       "resetpass_announce": "Saperlu ngrampungaké olèhé mlebu log, panjenengan kudu nggawé tembung wadi anyar.",
+       "resetpass_announce": "Saperlu ngrampungaké olèhé mlebu log, kowé kudu nggawé tembung wadi anyar.",
        "resetpass_text": "<!-- Tambahaké teks ing kéné -->",
        "resetpass_header": "Ganti tembung wadining akun",
        "oldpassword": "Tembung wadi lawas:",
        "newpassword": "Tembung wadi anyar:",
        "retypenew": "Isi manèh tembung wadi anyaré:",
        "resetpass_submit": "Setèl tembung wadi lan mlebu log",
-       "changepassword-success": "Tembung wadiné panjenengan kasil diowah!",
-       "changepassword-throttled": "Panjenengan wis kakèhan njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
+       "changepassword-success": "Tembung wadimu bisa ingowahan!",
+       "changepassword-throttled": "Kowé wis njajal mlebu log ping akèh.\nEntènana $1 sadurung njajal manèh.",
        "botpasswords": "Tembung wadi bot",
        "botpasswords-disabled": "Tembung wadiné bot dipatèni.",
-       "botpasswords-no-central-id": "Saperlu nganggo tembung wadiné bot, panjenengan kudu mlebu log menyang akun séntral.",
+       "botpasswords-no-central-id": "Saperlu nganggo tembung wadiné bot, kowé kudu mlebu log akun séntral.",
        "botpasswords-existing": "Tembung wadiné bot kang cumepak",
        "botpasswords-createnew": "Gawé anyar tembung wadiné bot",
        "botpasswords-editexisting": "Besut tembung wadiné bot kang anyar",
-       "botpasswords-label-needsreset": "(tembung wadi kudu panjenengan ambali setèl)",
+       "botpasswords-label-needsreset": "(tembung wadi kudu kasetèl ulang)",
        "botpasswords-label-appid": "Jeneng bot:",
        "botpasswords-label-create": "Gawé",
        "botpasswords-label-update": "Anyari",
        "botpasswords-bad-appid": "Jeneng bot \"$1\" ora trep.",
        "botpasswords-insert-failed": "Wurung nambah jeneng bot \"$1\". Apa wis tinambahaké sadurungé?",
        "resetpass_forbidden": "Tembung wadi ora bisa diganti",
-       "resetpass-no-info": "Panjenengan kudu mlebu log saperlu langsung ngaksès kaca iki.",
+       "resetpass-no-info": "Kowé kudu mlebu log saperlu ngaksès kaca iki langsung.",
        "resetpass-submit-loggedin": "Ganti tembung wadi",
        "resetpass-submit-cancel": "Wurung",
-       "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sauntara ora trep.\nPanjengen bokmanawa wis ngganti tembung wadiné panjenengan utawa nyuwun tembung wadi sauntara kang anyar.",
+       "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sadhéla ora trep.\nKowé bokmanawa wis ngganti tembung wadimu utawa njaluk tembung wadi sadhéla kang anyar.",
        "resetpass-temp-password": "Tembung wadi sauntara:",
        "resetpass-abort-generic": "Ngowahi tembung wadi kawurungaké déning èkstènsi.",
+       "resetpass-expired": "Tembung wadimu wis kadaluwarsa. Setèl tembung wadi anyar saperlu mlebu log.",
        "passwordreset": "Balèni gawé tembung wadi",
        "passwordreset-text-one": "Isi formulir iki kanthi jangkep kanggo nampa tembung wadi sauntara lumantar layang-èl.",
        "passwordreset-text-many": "{{PLURAL:$1|Isi salah siji babagan ing ngisor iki supaya bisa nampa tembung wadi sauntara lumantar layang-èl.}}",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung wadi sauntara: \n$2",
        "passwordreset-emailsentemail": "Yèn layang èlèktronik iki nggayut akun panjenengan, layang kanggo salin tembung wadi bakal dikirim.",
        "passwordreset-emailsentusername": "Manawa ana alamat layang-èl kang ana gayutané karo jeneng panganggo iki, layang-èl kanggo nyetèl ulang tembung wadi bakal dikirim.",
+       "passwordreset-nocaller": "Panyeluk kudu kaisi",
+       "passwordreset-nosuchcaller": "Panyeluk ora ana: $1",
+       "passwordreset-invalidemail": "Alamat layang èlèktronik ora trep",
        "changeemail": "Owah utawa busak alamat layang-èl",
        "changeemail-header": "Isi formulir iki saperlu salin alamat layang-èl panjenengan. Manawa panjenengan péngin ngilangi gegayutané alamat layang-èl saka akuné panjenengan, kosongaké waé babagan layang-èl anyar nalika ngirim formuliré.",
        "changeemail-no-info": "Panjenengan kudu mlebu log kanggo ngaksès kaca iki langsung.",
        "resettokens-watchlist-token": "Token kangge sindikasi web (Atom/RSS) saking [[Special:Watchlist|pangowahan ing pawawangané panjenengan]]",
        "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Reset token kang dipilih",
-       "bold_sample": "Tulisan kandel",
-       "bold_tip": "Tulisan kandel",
-       "italic_sample": "Tulisan dhoyong",
-       "italic_tip": "Tulisan dhoyong",
-       "link_sample": "Sesirah pranala",
-       "link_tip": "Pranala njero",
-       "extlink_sample": "http://www.example.com sesirahing pranala",
-       "extlink_tip": "Pranala jaba (élinga ater-ater http://)",
-       "headline_sample": "Tulisan sesirah",
-       "headline_tip": "Sesirah tataran 2",
-       "nowiki_sample": "Isi nganggo tulisan tanpa format ing kéné",
-       "nowiki_tip": "Aja nganggo format wiki",
-       "image_sample": "Conto.jpg",
-       "image_tip": "Barkas sisipan",
-       "media_sample": "Conto.ogg",
-       "media_tip": "Pranala barkas",
-       "sig_tip": "Tapak asmané panjenengan mawa tandha wektu",
-       "hr_tip": "Garis horisontal",
        "summary": "Ringkesan:",
        "subject": "Jejer:",
        "minoredit": "Iki besutan cilik",
        "summary-preview": "Pratuduh ringkesan besutan:",
        "subject-preview": "Pratuduh jejer:",
        "previewerrortext": "Ana masalah nalika njajal mratuduhaké owahané panjenengan.",
-       "blockedtitle": "Panganggo kapalangan",
-       "blockedtext": "<b>Asma panganggo utawa alamat IP panjenengan diblokir.</b>\n\nBlokir iki kang nglakoni $1.\nAlesané <i>$2</i>.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Kang arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
+       "blockedtitle": "Panganggo kapenggak",
+       "blockedtext": "<strong>Aran panganggomu utawa alamat IP-mu kapenggak.</strong>\n\nKang menggak ya iku $1.\nDhedhasaré <i>$2</i>.\n\n* Kapenggak wiwit: $8\n* Kapenggak nganti: $6\n* Kang arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
        "autoblockedtext": "Alamat IP-né panjenangan wis otomatis diblokir amarga dienggo déning panganggo liyané, kang diblokir déning $1.\n\n:<em>$2</em>\n\n* Wiwit diblokir: $8\n* Rampung diblokir: $6\n* Kang diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus]] liyané kanggo ngrembug blokirané.\n\nPanjenengan ora bisa nganggo fitur \"kirim layang-èl panganggo iki\" kajaba panjenengan wis ndhaftaraké alamat layang-èl kang trep ing [[Special:Preferences|pilalan panganggoné]] panjenengan lan panjenengan durung tau diblokir nalika nganggo iku.\n\nAlamat IP-né panjenengan kang saiki ya iku $3, lan ID blokirané ya iku $5. \nMangga wuwuhen kabèh rerincèn ing ndhuwur sajeroné samubarang pitakoné panjenengan.",
        "blockednoreason": "ora ana alesan kang diwènèhaké",
        "whitelistedittext": "Mangga $1 dhisik yèn arep mbesut kaca.",
        "missing-revision": "Révisi #$1 saka kaca aran \"{{FULLPAGENAME}}\" ora ana.\n\nIki biyasané kasababaké awit nututi pranala sajarah kang wis lawas saka kaca kang wis binusek.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log besakan].",
        "userpage-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.\nMangga pesthèkaké dhisik yèn panjenengan péngin nggawé/mbesut kaca iki.",
        "userpage-userdoesnotexist-view": "Akun panganggo \"$1\" ora kadhaftar.",
-       "blocked-notice-logextract": "Panganggo iki saiki lagi diblokir.\nLog pamblokiran pungkasan dituduhaké ing ngisor iki minangka bahan rujukan:",
+       "blocked-notice-logextract": "Panganggo iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
        "clearyourcache": "<strong>Cathetan:</strong> Nalika rampung nyimpen, panjenengan kudu mbusek telihing pangluruné panjenengan supaya owahané katon.\n* <strong>Firefox / Safari:</strong> Pencèt <em>Shift</em> nalika ngeklik <em>Reload</em>, utawa pencèt <em>Ctrl-F5</em> utawa <em>Ctrl-R</em> (<em>⌘-R</em> ing Mac)\n* <strong>Google Chrome:</strong> Pencèt <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ing Mac)\n* <strong>Internet Explorer:</strong> Pencèt <em>Ctrl</em> nalika ngeklik <em>Refresh</em>, utawa pencèt <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Menyang <em>Menu → Settings</em> (<em>Opera → Preferences</em> ing Mac) nuli menyang <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès CSS anyar panjenengan sadurungé disimpen.",
        "userjsyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès JavaScript anyar panjenengan sadurungé disimpen.",
        "copyrightwarning": "Tulung dipun-gatèkaké manawa kabèh sumbangsih utawa kontribusi kanggo {{SITENAME}} iku dianggep wis diluncuraké miturut $2 GNU (mangga priksanen $1 kanggo ditèlé).\nManawa panjenengan ora karsa manawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />\nPanjenengan uga janji manawa apa-apa kang katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "copyrightwarning2": "Mangga digatèkaké yèn kabèh kontribusi marang {{SITENAME}} bisa disunting, diowahi, utawa dibusek penyumbang liyané. Yèn panjenengan ora karsa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "longpageerror": "'''Masalah: Tèks kang panjenengan lebokaké dawané {{PLURAL:$1|sak kilobita|$1 kilobita}}, luwih dawa saka maksimal {{PLURAL:$2|sak kilobita|$2 kilobita}}.'''\nKang mangkono ora bisa kasimpen.",
-       "readonlywarning": "<strong>Pepéling: Basis dhatah lagi ginembok amarga lagi karukti, mula panjenengan saiki ora bisa nyimpen besutané panjenengan.</strong>\nPanjenengan bokmanawa arep nurun tulisané panjenengan ing barkas tèks lan nyimpen iku kanggo mengko.\n\nPangurus kang nggembok basis dhatahé mènèhi panjlèntrèh mengkéné: $1",
+       "readonlywarning": "<strong>Pepéling: Sasana dhatah lagi ginembok amarga lagi karukti, mula kowé saiki ora bisa nyimpen besutanmu.</strong>\nKowé bokmanawa arep nurun tulisanmu menyang berkas tulisan lan nyimpen iku kanggo mengko.\n\nPangurus sistem kang nggembok iku wèwèh pawadan: $1",
        "protectedpagewarning": "<strong>Pélik: Kaca iki wis direksa, mula mung panganggo mawa hak mirunggan pangurus kang bisa mbesut.</strong>\nÈntri log kang pungkasan ana ing ngisor iki minangka rujukan:",
        "semiprotectedpagewarning": "<strong>Cathetan:</strong> Kaca iki pinuju direksa, mula mung panganggo kang kadhaftar kang bisa mbesut.\nÈntri log pungkasan cumepak ana ing ngisor kanggo rujukan:",
        "cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé kang bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} kang kareksa runut ngisor iki:",
        "edit-no-change": "Besutané panjenengan dilirwakaké amarga ora ana owahan apa-apa tumraping tèksé.",
        "postedit-confirmation-created": "Kaca wis kagawé.",
        "postedit-confirmation-restored": "Kacané wis kapulihaké.",
-       "postedit-confirmation-saved": "Besutané panjenengan wis kasimpen.",
-       "postedit-confirmation-published": "Besutané panjenengan wis kababar.",
+       "postedit-confirmation-saved": "Besutanmu wis kasimpen.",
+       "postedit-confirmation-published": "Besutanmu wis kababar.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nKacané wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis binusek.",
        "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
        "undo-summary-username-hidden": "Balèkaké owahan $1 déning panganggo kang didhelikaké",
-       "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa kang. Kang mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
+       "cantcreateaccount-text": "Panggawéning akun saka alamat IP iki (<strong>$1</strong>) wis dipenggak [[User:$3|$3]].\n\nDhedhasaré pamenggak miturut $3 iku ''$2''",
        "cantcreateaccount-range-text": "Nggawe akun saka alamat IP \"$1\", kang kalebu IP panjenengan (<strong>$4</strong>), wis diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
        "viewpagelogs": "Deleng cathetaning kaca iki",
        "nohistory": "Babading besutan kaca iki ora ana.",
        "revisiondelete": "Busak/wurung busak révisi",
        "revdelete-nooldid-title": "Révisi tujuan ora trep",
        "revdelete-nooldid-text": "Panjenengan durung mènèhi target revisi kanggo nglakoni fungsi iki.",
-       "revdelete-no-file": "Barkas kang panjenengan karsakaké ora ana.",
-       "revdelete-show-file-confirm": "Apa panjenengan yakin arep mriksa révisi kang kabusek saka barkas \"<nowiki>$1</nowiki>\" nalika $2 jam $3?",
+       "revdelete-no-file": "Berkas kang koarepi ora ana.",
+       "revdelete-show-file-confirm": "Apa kowé yakin arep mriksa révisi kang kabusek saka berkas \"<nowiki>$1</nowiki>\" nalika $2 pukul $3?",
        "revdelete-show-file-submit": "Iya",
        "logdelete-selected": "{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:",
        "revdelete-text-others": "Administrator liya isih bisa ngaksès isian ndhelik lan mulihaké iku saka pambusakan, kajaba rereksan tambahan disetèl.",
        "revdelete-suppress-text": "Pandhelikan révisi '''mung''' bisa dipigunakaké kanggo kasus ing ngisor:\n* Informasi kang kagolong pitnah\n* Informasi pribadi kang kurang pantes\n*: ''alamat omah lan nomer telepon, nomer kartu idhèntitas, lsp..''",
        "revdelete-legend": "Atur watesan:",
        "revdelete-hide-text": "Tulisan owahan",
-       "revdelete-hide-image": "Dhelikaké isi barkas",
+       "revdelete-hide-image": "Dhelikaké isining berkas",
        "revdelete-hide-name": "Dhelikaké tujuan lan paramèter",
        "revdelete-hide-comment": "Tingkesan besutan",
        "revdelete-hide-user": "Alamat IPné/jeneng panganggoné kang mbesut",
        "searchprofile-everything": "Kabèh",
        "searchprofile-advanced": "Lungidan",
        "searchprofile-articles-tooltip": "Golèkan ing $1",
-       "searchprofile-images-tooltip": "Golèk barkas",
+       "searchprofile-images-tooltip": "Golèk berkas",
        "searchprofile-everything-tooltip": "Golèk kabèh kontèn (kalebu ing kaca parembugan)",
        "searchprofile-advanced-tooltip": "Golèk ing mandhala aran tinamtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
-       "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 barkas|$3 barkas}})",
+       "search-result-category-size": "{{PLURAL:$1|1 warga|$1 warga}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
        "search-redirect": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
-       "search-file-match": "(cocog karo isi barkas)",
+       "search-file-match": "(cocog karo isi berkas)",
        "search-suggest": "Apa kang panjenengan karsakaké iki: $1",
        "search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
        "search-interwiki-caption": "Kasil saka proyèk-proyèk sababon",
        "prefs-searchoptions": "Golèk",
        "prefs-namespaces": "Mandhala aran",
        "default": "baku",
-       "prefs-files": "Barkas",
+       "prefs-files": "Berkas",
        "prefs-custom-css": "CSS priangga",
        "prefs-custom-js": "JavaScript priangga",
        "prefs-common-config": "CSS/JS barengan kabèh ules:",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Panjenengan ora ana hak kanggo ngowahi hak panganggo ing wiki liyané.",
        "userrights-nodatabase": "Basis dhatah $1 ora ana utawa ora enggonan.",
-       "userrights-changeable-col": "Grup kang bisa panjenengan owahi",
-       "userrights-unchangeable-col": "Grup kang ora bisa diowahi panjenengan",
+       "userrights-changeable-col": "Golongan kang bisa koowahi",
+       "userrights-unchangeable-col": "Golongan kang ora bisa koowahi",
        "userrights-irreversible-marker": "$1*",
        "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Kadaluwarsa $1",
        "userrights-expiry-options": "1 dina:1 dina,1 minggu:1 minggu,1 wulan:1 wulan,3 wulan:3 wulan,6 wulan:6 wulan,1 taun:1 taun",
        "userrights-invalid-expiry": "Wektu kadaluwarsa golongan \"$1\" ora trep.",
        "userrights-expiry-in-past": "Wektu kadaluwarsa golongan \"$1\" ana ing kala kawuri.",
-       "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi owah-owahané panjenengan.",
+       "userrights-conflict": "Cengkah owahan hak panganggo! Mangga priksa lan konfirmasi owahanmu.",
        "group": "Golongan:",
        "group-user": "Para panganggo",
        "group-autoconfirmed": "Panganggo kang otomatis kakonfirmasi",
        "right-move-subpages": "Pindhahaké kaca lan kabèh anak-kacané",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
        "right-move-categorypages": "Lih kaca kategori",
-       "right-movefile": "Lih barkas",
+       "right-movefile": "Lih berkas",
        "right-suppressredirect": "Aja nggawé pangalihan saka kaca kang lawas yèn mindhah kaca",
-       "right-upload": "Unggah barkas",
-       "right-reupload": "Tindhihana barkas kang ana",
-       "right-reupload-own": "Nimpa barkas kang ana lan diunggah panganggo kang padha",
-       "right-reupload-shared": "Timpanana barkas ing panyimpenan médhiya barengan lokal",
-       "right-upload_by_url": "Ngunggahaké barkas saka alamat URL",
+       "right-upload": "Unggah berkas",
+       "right-reupload": "Tindhihi berkas kang ana",
+       "right-reupload-own": "Tindhihi berkas kang ana kang diunggah siji wong",
+       "right-reupload-shared": "Tindhihi berkas ing panyimpenan médhiyah barengan lokal",
+       "right-upload_by_url": "Unggah berkas saka URL",
        "right-purge": "Kosongna ''cache'' situs iki kanggo kaca tanpa konfirmasi",
        "right-autoconfirmed": "Owah kaca-kaca sémi-reksa",
        "right-bot": "Anggepen minangka prosès otomatis",
        "right-editsemiprotected": "Owah kaca kang kareksa \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Besut modhèl kontèn kaca",
        "right-editinterface": "Besut antarmuka panganggo",
-       "right-editusercss": "Besut barkas-barkas CSS panganggo liya",
-       "right-edituserjson": "Besut barkas-barkas JSON panganggo liya",
-       "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
-       "right-editmyusercss": "Owahi barkas CSS panganggo panjenengan",
-       "right-editmyuserjson": "Owahi barkas JSON panganggo panjenengan",
-       "right-editmyuserjs": "Owahi barkas JavaScript panganggo panjenengan",
-       "right-viewmywatchlist": "Deleng pawawangané panjenengan",
+       "right-editusercss": "Besut berkas CSS panganggo liya",
+       "right-edituserjson": "Besut berkas JSON panganggo liya",
+       "right-edituserjs": "Besut berkas JavaScript panganggo liya",
+       "right-editmyusercss": "Besut berkas CSS panganggomu",
+       "right-editmyuserjson": "Besut berkas JSON panganggomu",
+       "right-editmyuserjs": "Besut berkas JavaScript panganggomu",
+       "right-viewmywatchlist": "Deleng pawawanganmu",
        "right-editmywatchlist": "Owahi pawawangané panjenengan. Cathetan: ana cara liyane kanggo nambahi kaca menyang pratélan, sanadyan ora duwe hak iki.",
        "right-viewmyprivateinfo": "Deleng dhata prianggané panjenengan dhéwé (kaya ta alamat layang-èl, jeneng asli)",
        "right-editmyprivateinfo": "Besut dhata prianggané panjenengan dhéwé (kaya ta alamat layang-èl, jeneng asli)",
-       "right-editmyoptions": "Owahi pilalané panjenengan",
+       "right-editmyoptions": "Besut pilalanmu dhéwé",
        "right-rollback": "Balèkaké kanthi gelis besutaning panganggo pungkasan kang mbesut kaca tinamtu",
        "right-markbotedits": "Tandhani besutan kang kawurungan yèn besutan bot",
        "right-noratelimit": "Ora kadayan watesing cacah besutan.",
        "right-import": "Impor kaca-kaca saka wiki liya",
-       "right-importupload": "Impor kaca saka unggahan barkas",
+       "right-importupload": "Impor kaca saka unggahan berkas",
        "right-patrol": "Tandhani besutané wong liya yèn wis kapriksa",
        "right-autopatrol": "Gawé supaya besutan otomatis tinengeran wis kapriksa",
        "right-patrolmarks": "Ndeleng tandha-tandha patroli owah-owahan anyar",
        "right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
        "grant-group-page-interaction": "Srawungan karo kaca",
        "grant-group-file-interaction": "Srawungan karo médhia",
-       "grant-group-watchlist-interaction": "Srawungan karo pawawangané panjenengan",
+       "grant-group-watchlist-interaction": "Srawung karo pawawanganmu",
        "grant-group-email": "Kirim layang-èl",
        "grant-group-high-volume": "Ngayahi kagiyatan kang akih",
        "grant-group-customization": "Panglarasan lan pilalan",
        "grant-group-administration": "Ngayahi laku administratif",
-       "grant-group-private-information": "Ngaksès dhata pribadhi ngenani panjenengan",
+       "grant-group-private-information": "Aksès dhatah pribadi bab kowé",
        "grant-group-other": "Kagiyatan rena-rena",
        "grant-blockusers": "Blokir lan uculaké blokirané panganggo",
        "grant-createaccount": "Gawé akun",
        "grant-editinterface": "Besut jagad aran MediaWiki lan CSS/JavaScript panganggo",
        "grant-editmycssjs": "Besut CSS/JavaScript panganggomu",
        "grant-editmyoptions": "Besut préferènsi panganggomu",
-       "grant-editmywatchlist": "Besut pawawangané panjenengan",
+       "grant-editmywatchlist": "Besut pawawangmu",
        "grant-editpage": "Besut kaca kang ana",
        "grant-editprotected": "Besut kaca kang kareksa",
        "grant-highvolume": "Besutan gedhi",
        "grant-protect": "Reksa lan uculi rereksané kaca",
        "grant-rollback": "Wurungaké owahané kaca",
        "grant-sendemail": "Kirim layang-èl menyang panganggo liyané",
-       "grant-uploadeditmovefile": "Unggah, ganti, lan lih barkas",
-       "grant-uploadfile": "Unggah barkas anyar",
+       "grant-uploadeditmovefile": "Unggah, ganti, lan lih berkas",
+       "grant-uploadfile": "Unggah berkas anyar",
        "grant-basic": "Hak pokok",
-       "grant-viewdeleted": "Deleng barkas lan kaca kang kabusek",
-       "grant-viewmywatchlist": "Deleng pawawangané panjenengan",
+       "grant-viewdeleted": "Deleng berkas lan kaca kang kabusek",
+       "grant-viewmywatchlist": "Deleng pawawanganmu",
        "grant-viewrestrictedlogs": "Deleng isian log kang winates",
        "newuserlogpage": "Log panganggo anyar",
        "newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
        "action-move-subpages": "lih kaca iki, lan anak-kacané",
        "action-move-rootuserpages": "ngalih kaca panganggo oyod",
        "action-move-categorypages": "alih kaca kategori",
-       "action-movefile": "alih barkas iki",
-       "action-upload": "ngunggah barkas iki",
-       "action-reupload": "nindhih barkas kang wis ana",
-       "action-reupload-shared": "nindhih barkas kang wis ana ing papan panyimpanan barkas kang dianggo bebarengan",
-       "action-upload_by_url": "unggahna barkas iki saka alamat URL",
+       "action-movefile": "ngalih berkas iki",
+       "action-upload": "ngunggah berkas iki",
+       "action-reupload": "nindhihi berkas kang ana iki",
+       "action-reupload-shared": "nindhihi berkas kang ana ing panyimpanan barengan iki",
+       "action-upload_by_url": "ngunggah berkas iki saka URL",
        "action-writeapi": "migunakaké API panulisan",
        "action-delete": "busak kaca iki",
        "action-deleterevision": "busak révisi",
        "action-protect": "owahi tataran rereksané kaca iki",
        "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan ing kaca tinamtu",
        "action-import": "impor kaca saka wiki liyané",
-       "action-importupload": "impor kaca iki saka pamunggahan barkas",
+       "action-importupload": "impor kaca saka unggahan berkas",
        "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
-       "action-autopatrol": "nandhani besutané panjenengan dhéwé yèn wis kapriksa",
+       "action-autopatrol": "nandhani besutanmu yèn wis kapriksa",
        "action-unwatchedpages": "deleng pratélan kaca kang ingawasan",
        "action-mergehistory": "nggabungaké sajarah kaca iki",
        "action-userrights": "besut kabèh hak panganggo",
        "action-userrights-interwiki": "besut hak aksès panganggo ing wiki liyané",
        "action-siteadmin": "nggembok utawa mbukak gembok basis dhatah",
        "action-sendemail": "kirim layang-èl",
-       "action-editmyoptions": "besut pilalané panjenengan",
-       "action-editmywatchlist": "owahi pawawangané panjenengan",
+       "action-editmyoptions": "besut pilalanmu",
+       "action-editmywatchlist": "besut pawawanganmu",
        "action-viewmywatchlist": "deleng pawawangané panjenengan",
        "action-viewmyprivateinfo": "deleng katerangan prianggané panjenengan",
        "action-editmyprivateinfo": "besut katerangan prianggané panjenengan",
        "rcfilters-filterlist-noresults": "Saringan ora katemu",
        "rcfilters-noresults-conflict": "Ora ana kasil amarga wewatoné kanggo nggolèk ana masalah",
        "rcfilters-filtergroup-authorship": "Pangripta besutan",
-       "rcfilters-filter-editsbyself-label": "Owah-owahané panjenengan",
+       "rcfilters-filter-editsbyself-label": "Owah-owahanmu",
        "rcfilters-filter-editsbyself-description": "Pasumbangmu dhéwé.",
        "rcfilters-filter-editsbyother-label": "Owah-owahané liyan",
-       "rcfilters-filter-editsbyother-description": "Kabèh owahan kajaba duwèké panjenengan.",
+       "rcfilters-filter-editsbyother-description": "Kabèh owahan kajaba duwému.",
        "rcfilters-filtergroup-user-experience-level": "Pandhaftaran lan pangalaman pangguna",
        "rcfilters-filter-user-experience-level-registered-label": "Kadhaftar",
        "rcfilters-filter-user-experience-level-registered-description": "Pambesut kang mlebu log.",
        "rcfilters-filter-major-description": "Besutan kang ora ditandhani minangka besutan cilik.",
        "rcfilters-filtergroup-watchlist": "Kaca ing pawawangan",
        "rcfilters-filter-watchlist-watched-label": "Ana ing Pawawangan",
-       "rcfilters-filter-watchlist-watched-description": "Owahané kaca-kaca ing Pawawangané panjenengan.",
+       "rcfilters-filter-watchlist-watched-description": "Owahaning kaca-kaca ing Pawawanganmu.",
        "rcfilters-filter-watchlist-watchednew-label": "Owah-owahané Pawawangan anyar",
        "rcfilters-filter-watchlist-watchednew-description": "Owah-owahan ngenani kaca-kaca ing Pawawangané panjenengan kang durung ditiliki.",
        "rcfilters-filter-watchlist-notwatched-label": "Ora ana ing Pawawangan",
        "recentchanges-page-removed-from-category": "[[:$1]] dibusak saka kategori",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] dibusak saka kategori, [[Special:WhatLinksHere/$1|kaca iki kalebu ing njeroné kaca liyané]]",
        "autochange-username": "Salin otomatis MediaWiki",
-       "upload": "Unggah barkas",
-       "uploadbtn": "Unggah barkas",
+       "upload": "Unggah berkas",
+       "uploadbtn": "Unggah berkas",
        "reuploaddesc": "Wurung ngunggah lan bali menyang formulir unggahan",
-       "upload-tryagain": "Kirim déskripsi barkas kang wis diowah",
+       "upload-tryagain": "Kirim wedharan barkas kang wis kadandani",
        "uploadnologin": "Durung mlebu log",
-       "uploadnologintext": "Sumangga $1 saperlu ngunggah barkas.",
+       "uploadnologintext": "Mangga $1 saperlu ngunggah berkas.",
        "upload_directory_missing": "Dhirèktori unggahan ($1) ora tinemu lan ora bisa digawé déning server wèb.",
        "upload_directory_read_only": "Dhirèktori pangunggahan ($1) ora bisa ditulis déning paladèn jaringan.",
        "uploaderror": "Masalah pangunggah",
-       "upload-recreate-warning": "'''Pèngetan: Barkas mawa jeneng iku wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya ing kéné:",
+       "upload-recreate-warning": "<strong>Pepéling: Siji berkas mawa aran mangkono wis binusek utawa ingalihan.</strong>\n\nLog busekan lan lih-lihan tumrap kaca iki cumawis ing kéné:",
        "uploadtext": "Anggonen formulir ngisor iki saperlu ngunggah barkas.\nKanggo ndeleng utawa nggolèki barkas kang wis diunggah sadurungé, panjenengan menyanga [[Special:FileList|pratélan barkas unggahan]]. Barkas unggahan ulang uga kacathet ing [[Special:Log/upload|log unggah]], déné barkas busakan ing [[Special:Log/delete|log busak]].\n\nKanggo muwuhi barkas ing kaca, anggonen pranala kanthi formulir ing ngisor iki, pilih salah siji:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> saperlu nganggo barkasé kanthi vèrsi kang wutuh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> saperlu nganggo barkasé kanthi amba 200 piksel déné ana ing njeron kothak lan kapacak ing sisih kiwané kaca mawa \"alt text\" minangka katerangané\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> saperlu nggayutaké langsung barkasé tanpa mitontonaké barkasé dhéwé",
-       "upload-permitted": "{{PLURAL:$2|Jinis}} barkas kang kaolèhaké: $1.",
-       "upload-preferred": "{{PLURAL:$2|Jinis}} barkas kang kaprayogakaké: $1.",
-       "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas kang kalarang: $1.",
+       "upload-permitted": "{{PLURAL:$2|Jinis}} berkas kang kaolèhaké: $1.",
+       "upload-preferred": "{{PLURAL:$2|Jinis}} berkas kang kaprayogakaké: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Jinis}} berkas kang kalarang: $1.",
        "uploadlogpage": "Log unggah",
-       "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan barkas kang anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri barkas anyar]] kanggo pratélan visual.",
-       "filename": "Jeneng barkas",
+       "uploadlogpagetext": "Ing sor iki kapacak log unggahan berkas kang anyar dhéwé.\nDeleng [[Special:NewFiles|gladri berkas anyar]] kapurih luwih cethané.",
+       "filename": "Aran berkas",
        "filedesc": "Ringkesan",
        "fileuploadsummary": "Ringkesan:",
-       "filereuploadsummary": "Owah-owahan barkas:",
+       "filereuploadsummary": "Owah-owahan berkas:",
        "filestatus": "Status hak cipta",
        "filesource": "Sumber",
-       "ignorewarning": "Lirwakaké pepéling lan simpen langsung barkasé.",
+       "ignorewarning": "Lirwakaké pepéling lan simpen langsung berkasé.",
        "ignorewarnings": "Lirwakaké samubarang pepéling",
-       "minlength1": "Jeneng barkas saorané ngemu sakurup.",
-       "illegalfilename": "Jeneng barkas \"$1\" ngandhut aksara kang ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng barkas iku lan cobanen  diunggahaké manèh.",
-       "filename-toolong": "Jeneng barkas ora kena munjuli 240 bèt.",
-       "badfilename": "Jeneng barkas wis diowah dadi \"$1\".",
-       "filetype-mime-mismatch": "Èkstènsi barkas \".$1\" ora cocog karo jinis MIME kang kadètèk saka barkas ($2).",
-       "filetype-badmime": "Barkas jinis MIME \"$1\" ora kena kaunggah.",
+       "minlength1": "Jeneng berkas saorané ngemu sakurup.",
+       "illegalfilename": "Aran barkas \"$1\" ngemu karakter kang ora kaolèhaké ing sesirah kaca.\nMangga ganti araning berkasé lan jajal manèh ngunggah berkasé.",
+       "filename-toolong": "Aran barkas ora kena munjuli 240 bèt.",
+       "badfilename": "Aran berkas wis ingowahan dadi \"$1\".",
+       "filetype-mime-mismatch": "Èstènsi berkas \".$1\" ora cocog karo jinis MIME kang tinemu ing berkas ($2).",
+       "filetype-badmime": "Berkas mawa jinis MIME \"$1\" ora kena kaunggah.",
        "filetype-bad-ie-mime": "Ora bisa ngunggahaké barkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", kang ora diidinaké lan minangka tipe barkas kang nduwèni potènsi mbebayani.",
        "filetype-unwanted-type": "<strong>\".$1\"</strong> iku jinis barkas kang ora kapéngini.\nAluwung {{PLURAL:$3|jinis barkasé}} $2.",
        "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|dudu jinis barkas kang diidinaké}}.\n{{PLURAL:$3|Jinis barkas}} kang diidinaké $2.",
        "filetype-missing": "Barkas ini ora duwé ekstènsi (contoné \".jpg\").",
-       "empty-file": "Barkas kang panjenengan lebokaké kosong.",
-       "file-too-large": "Barkas kang panjenengan lebokaké kagedhèn.",
+       "empty-file": "Berkas kang kolebokaké kosong.",
+       "file-too-large": "Berkas kang kolebokaké kegedhèn.",
        "filename-tooshort": "Jeneng barkas kecendhèken.",
        "filetype-banned": "Barkas jinis iki dilarang.",
        "verification-error": "Barkas iki ora lulus vèrifikasi.",
-       "hookaborted": "Owahan kang panjenengan ayahi diwurungaké déning èkstènsi.",
+       "hookaborted": "Olèhmu ndandani diwurungaké èstènsi.",
        "illegal-filename": "Jeneng barkas ora diidinaké.",
        "overwrite": "Nibani barkas kang wis ana ora dililakaké.",
        "unknown-error": "Ana masalah kang ora dingertèni.",
        "tmp-write-error": "Ora bisa nulis barkas sauntara.",
        "large-file": "Ukuran barkas disaranaké supaya ora ngluwihi $1 bita; barkas iki ukurané $2 bita.",
        "largefileserver": "Barkas iki luwih gedhé tinimbang kang diidinaké ing paladèn.",
-       "emptyfile": "Barkas kang panjenengan unggahaké katoné kosong. Bokmanawa iki amarga anané salah ketik ing jeneng barkas. Mangga dipastèkaké apa panjenengan pancèn kersa ngunggahaké barkas iki.",
+       "emptyfile": "Berkas kang kounggah katon kosong.\nBokmanawa ana salah tik ing aran berkasé.\nMangga pesthèkaké yèn kowé pancèn péngin ngunggah berkas iki.",
        "windows-nonascii-filename": "Wiki iki ora nyengkuyung jeneng berkas mawa karakter kusus.",
        "fileexists": "Barkas mawa jeneng iku wis ana, mangga dipriksa <strong>[[:$1]]</strong> yèn panjenengan ora yakin sumedya ngowahiné.\n[[$1|thumb]]",
        "filepageexists": "Kaca dhèskripsi kanggo berkas iki wis digawé ing <strong>[[:$1]]</strong>, nanging saiki iki ora tinemu berkas mawa jeneng iku. Ringkesan kang panjenengan lebokaké ora bakal metu ing kaca dhèskripsi. Kanggo ngetokaké dhèskripsi iki, panjenengan kudu mbesut kanthi manual. [[$1|thumb]]",
        "zip-bad": "Barkas rusak utawa barkas ZIP kang ora bisa diwaca.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
        "zip-unsupported": "Barkasé iku barkas ZIP kang nganggo piranti ZIP kang ora disengkuyung MediaWiki.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
        "uploadstash": "Unggah pandhelikan",
-       "uploadstash-summary": "Kaca iki nyadhiyakaké dalan ing barkas-barkas kang wis diunggah (utawa lagi diunggah) naning durung kababar ing wiki. Barkas-barkas iki ora katon kanggo sapa baé nanging namung kanggo panganggo kang ngunggah baé.",
+       "uploadstash-summary": "Kaca iki nyawisaké aksès marang berkas-berkas kang wis kaunggah utawa kang lagi kaunggah. Berkas-berkas iki ora katon tumrap sesapaa kajaba panganggo kang ngunggah baé.",
        "uploadstash-clear": "Busek barkas kadhelikaké",
        "uploadstash-nofiles": "Panjenengan ora duwé barkas simpenan.",
        "uploadstash-badtoken": "Nglakoni iki ora dadi, bokamanawa amarga hak besut panjenengan wis kadaluwarsa. Sumangga jajal manèh.",
        "listusersfrom": "Tuduhna panganggo kang diawali karo:",
        "listusers-submit": "Tuduhna",
        "listusers-noresult": "Panganggo ora ana.",
-       "listusers-blocked": "(diblokir)",
+       "listusers-blocked": "(kapenggak)",
        "activeusers": "Pratélan panganggo aktif",
        "activeusers-intro": "Iki pratélan panganggo kang katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
        "activeusers-count": "$1 {{PLURAL:$1|laku|laku}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "protect_expiry_old": "Wektu kadaluwarsané ana ing kala kawuri.",
        "protect-unchain-permissions": "Urubaké opsi rereksan lanjutan",
        "protect-text": "Ing kéné, panjenengan bisa ndeleng lan ngganti tataran kareksan tumrap kaca <strong>$1</strong>.",
-       "protect-locked-blocked": "Panjenengan ora bisa ngowahi tataran rereksan nalika diblokir.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
+       "protect-locked-blocked": "Kowé ora bisa ngowahi tataran rereksan nalika kapenggak.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-dblock": "Tataran rereksan ora bisa diowahi amarga sasana dhatané digembok.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-access": "Akuné panjenengan ora kawogan ngowahi tataran rereksan kaca.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-cascadeon": "Kaca iki lagi direksa amarga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} kang wis direksa mawa pilihan pangreksan runtun diaktifaké. Panjenengan bisa ngganti tingkat pangreksan kanggo kaca iki, nanging perkara iku ora awèh pengaruh pangreksan runtun.",
        "uctop": "saiki",
        "month": "Saka wulan (lan sadurungé):",
        "year": "Saka taun (lan sadurungé):",
-       "sp-contributions-blocklog": "log blokir",
+       "sp-contributions-blocklog": "log penggakan",
        "sp-contributions-deleted": "pasumbangé {{GENDER:$1|panganggo}} kang kabusek",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "rembug",
        "sp-contributions-userrights": "panataning hak {{GENDER:$1|panganggo}}",
-       "sp-contributions-blocked-notice": "Panganggo iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
-       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
+       "sp-contributions-blocked-notice": "Panganggo iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
+       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
        "sp-contributions-search": "Golèk pasumbang",
        "sp-contributions-username": "Alamat IP utawa jeneng panganggo:",
        "sp-contributions-toponly": "Tuduhaké besutan mligi révisi anyaran",
        "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
-       "tooltip-t-print": "Vèrsi céthak kaca iki",
+       "tooltip-t-print": "Vèrsi cithak kaca iki",
        "tooltip-t-permalink": "Pranala permanèn saka owahan iki",
        "tooltip-ca-nstab-main": "Deleng kaca kontèn",
        "tooltip-ca-nstab-user": "Deleng kaca panganggo",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
        "tooltip-minoredit": "Tandhani iki yèn besutan cilik",
        "tooltip-save": "Simpen owah-owahaning panjenengan",
-       "tooltip-publish": "Babar owahané panjenengan",
+       "tooltip-publish": "Babar owahanmu",
        "tooltip-preview": "Pratuduhana owah-owahaning panjenengan. Tulung ayahana iku sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owahan endi kang panjenengan gawé tumrap tulisané",
        "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki kang dipilih.",
        "feedback-cancel": "Wurung",
        "feedback-close": "Rampung",
        "feedback-external-bug-report-button": "Kirim ayahan tèhnis",
-       "feedback-dialog-title": "Awèh saran",
+       "feedback-dialog-title": "Kirimi pamrayoga",
        "feedback-error1": "Masalah: Kasil ora dingertèni saka API",
        "feedback-error2": "Masalah: Besutané wurung",
        "feedback-error3": "Masalah: Ora ana tanggepan saka API",
        "searchsuggest-containing": "ngemu...",
        "api-error-badtoken": "Masalah njero: Token ala.",
        "api-error-emptypage": "Nggawé kaca kosong anyar ora dilikaké.",
-       "api-error-publishfailed": "Masalah njero: Paladèn wurung mbabar barkas sawetara.",
+       "api-error-publishfailed": "Masalah njero: Paladèn wurung mbabar berkas sawetara.",
        "api-error-stashfailed": "Masalah njero: Paladèn wurung ndèkèk barkas sawetara.",
        "api-error-unknown-warning": "Pélik ora dingertèni: \"$1\".",
        "api-error-unknownerror": "Masalah ora dingertèni: \"$1\".",
-       "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
+       "duration-seconds": "$1 {{PLURAL:$1|sekon|sekon}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "duration-days": "$1 {{PLURAL:$1|dina|dina}}",
        "duration-weeks": "$1 {{PLURAL:$1|minggu|minggu}}",
        "duration-years": "$1 {{PLURAL:$1|taun|taun}}",
-       "duration-decades": "$1 {{PLURAL:$1|dékade|dékade}}",
+       "duration-decades": "$1 {{PLURAL:$1|dasawarsa|dasawarsa}}",
        "duration-centuries": "$1 {{PLURAL:$1|abad|abad}}",
-       "duration-millennia": "$1 {{PLURAL:$1|milénium|milénium}}",
+       "duration-millennia": "$1 {{PLURAL:$1|miléniyum|miléniyum}}",
        "rotate-comment": "Gambar diubengaké $1 {{PLURAL:$1|drajat|drajat}} sak arah domé jam",
        "limitreport-title": "Parser profiling data:",
        "limitreport-cputime": "CPU time usage",
        "date-range-from": "Kawit tanggal:",
        "date-range-to": "Tumeka tanggal:",
        "randomrootpage": "Kaca wod sembarang",
-       "log-action-filter-block": "Jinis blokiran:",
+       "log-action-filter-block": "Jinis penggakan:",
        "log-action-filter-contentmodel": "Jinis owahan modhèl isi:",
        "log-action-filter-delete": "Jinis busakan:",
        "log-action-filter-import": "Jinis imporan:",
        "log-action-filter-rights": "Jinis owahan hak:",
        "log-action-filter-upload": "Jinis unggahan:",
        "log-action-filter-all": "Kabèh",
-       "log-action-filter-block-block": "Blokir",
+       "log-action-filter-block-block": "Penggak",
        "log-action-filter-block-reblock": "Modhifikasi blokiran",
        "log-action-filter-block-unblock": "Copot blokiran",
        "log-action-filter-contentmodel-change": "Owahan modhèl isi",
index ffdeba8..7cfb2f8 100644 (file)
        "resettokens-watchlist-token": "ტოკენი ვებ-არხისთვის (Atom/RSS) [[Special:Watchlist|გვერდების ცვლილებები თქვენი კონტროლის სიაში]]",
        "resettokens-done": "ტოკენების ჩამოყრა",
        "resettokens-resetbutton": "არჩეული ტოკენების ჩამოყრა",
-       "bold_sample": "მუქი ტექსტი",
-       "bold_tip": "მუქი ტექსტი",
-       "italic_sample": "კურსივი",
-       "italic_tip": "კურსივი",
-       "link_sample": "ბმულის სათაური",
-       "link_tip": "შიდა ბმული",
-       "extlink_sample": "http://www.example.com ბმულის სათაური",
-       "extlink_tip": "გარე ბმული (გახსოვდეთ http:// პრეფიქსი)",
-       "headline_sample": "სათაურის ტექსტი",
-       "headline_tip": "ქვესათაური",
-       "nowiki_sample": "ჩასვით დაუფორმატებელი ტექსტი აქ",
-       "nowiki_tip": "ვიკის ფორმატირების იგნორირება",
-       "image_sample": "მაგალითი.jpg",
-       "image_tip": "ჩასმული ფაილი",
-       "media_sample": "მაგალითი.ogg",
-       "media_tip": "ბმული ფაილზე",
-       "sig_tip": "თქვენი ხელმოწერა და დრო",
-       "hr_tip": "ჰორიზონტალური ხაზი (ნუ გამოიყენებთ ხშირად)",
        "summary": "რეზიუმე:",
        "subject": "თემა:",
        "minoredit": "მცირე რედაქტირება",
        "page_first": "პირველი",
        "page_last": "ბოლო",
        "histlegend": "ვერსიების შედარება: აირჩიეთ სასურველი ვერსიები რადიო-რგოლების მონიშვნით და დააწკაპუნეთ შედარების ღილაკზე.<br />\nლეგენდა: '''({{int:cur}})''' = სხვაობა მიმდინარე ვერსიასთან, '''({{int:last}})''' = სხვაობა წინა ვერსიასთან, '''{{int:minoreditletter}}''' = მცირე შესწორება.",
-       "history-fieldset-title": "á\83\95á\83\94á\83 á\83¡á\83\98á\83\94á\83\91á\83\98á\83¡ á\83«á\83\98á\83\94á\83\91ა",
+       "history-fieldset-title": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83¤á\83\98á\83\9aá\83¢á\83\95á\83 ა",
        "history-show-deleted": "მხოლოდ წაშლილი ვერსიები",
        "histfirst": "უძველესი",
        "histlast": "უახლესი",
        "prefs-watchlist-edits": "კონტროლის სიაში საჩვენებელი ცვლილებების მაქსიმალური რაოდენობა:",
        "prefs-watchlist-edits-max": "მაქსიმალური რაოდენობა: 1000",
        "prefs-watchlist-token": "კონტროლის სიის ტოკენი:",
+       "prefs-watchlist-managetokens": "ტოკენების მართვა",
        "prefs-misc": "სხვადასხვა",
        "prefs-resetpass": "შეცვალეთ პაროლი",
        "prefs-changeemail": "ელ-ფოსტის მისამართის შეცვლა ან წაშლა",
        "rcfilters-watchlist-preference-help": "აუქმებს 2017 წლის ინტერფეისისა და ყველა ხელსაწყოს რედიზაინს დამატებულს მაშინ და შემდგომ.",
        "rcfilters-filter-showlinkedfrom-label": "ცვლილებების ჩვენება დაკავშირებულ გვერდებზე",
        "rcfilters-filter-showlinkedto-option-label": "<strong>არჩეულზე, დაკავშირებული</strong> გვერდები",
+       "rcfilters-allcontents-label": "მთელი სახელთა სივრცე",
+       "rcfilters-alldiscussions-label": "ყველა განხილვა",
        "rcnotefrom": "ქვემოთ {{PLURAL:$5|ნაჩვენებია ცვლილება|ნაჩვენებია ცვლილებები}} <strong>$3, $4</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfromreset": "თარიღის საწყის კონფიგურაციაზე დაბრუნება",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "filehist-filesize": "ფაილის ზომა",
        "filehist-comment": "კომენტარი",
        "imagelinks": "ფაილის გამოყენება",
-       "linkstoimage": "მომდევნო {{PLURAL:$1|გვერდი|გვერდები}} ებმის ამ ფაილს:",
+       "linkstoimage": "მომდევნო {{PLURAL:$1|გვერდი იყენებს|გვერდები იყენებენ}} ამ ფაილს:",
        "linkstoimage-more": "$1-ზე მეტი {{PLURAL:$1|გვერდები|გვერდების|გვერდები}} რომლებსაც აქვთ ბმულები ამ ფაილზე.\nმოცემულ სიაში {{PLURAL:$1|წარმოდგენილია მხოლოდ $1 ბმული|წარმოდგენილია მხოლოდ $1 ბმულები|წარმოდგენილია მხოლოდ $1 ბმულების}} ამ ფაილზე.\nშეგიძლიათ ნახოთ ასევე [[Special:WhatLinksHere/$2|სრული სია]].",
-       "nolinkstoimage": "á\83\90á\83  á\83\90á\83 á\83¡á\83\94á\83\91á\83\9dá\83\91á\83¡ á\83\90á\83\9b á\83¤á\83\90á\83\98á\83\9aá\83\97á\83\90á\83\9c á\83\93á\83\90á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98.",
+       "nolinkstoimage": "á\83\94á\83¡ á\83¤á\83\90á\83\98á\83\9aá\83\98 á\83\90á\83 á\83ªá\83\94á\83 á\83\97 á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83\90á\83  á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90.",
        "morelinkstoimage": "იხილეთ [[Special:WhatLinksHere/$1|სხვა ბმულები]] ამ ფაილზე.",
        "linkstoimage-redirect": "$1 (ფაილის გადამისამართება) $2",
        "duplicatesoffile": "{{PLURAL:$1|შემდეგი $1 ფაილი არის დუბლიკატი|შემდეგი $1 ფაილები არიან დუბლიკატები|შემდეგი $1 ფაილები არიან დუბლიკატები}} ამ ფაილისა ([[Special:FileDuplicateSearch/$2|დამატებითი ინფორმაცია]]):",
index 306806b..ca8c721 100644 (file)
        "resetpass_forbidden": "Paroller o'zgertile almaydi",
        "resetpass-submit-loggedin": "Paroldi o'zgertiw",
        "resetpass-temp-password": "Waqtınshalıq parol:",
-       "bold_sample": "Yarım juwan tekst",
-       "bold_tip": "Yarım juwan tekst",
-       "italic_sample": "Kursiv tekst",
-       "italic_tip": "Kursiv tekst",
-       "link_sample": "Siltew ataması",
-       "link_tip": "İshki siltew",
-       "extlink_sample": "http://www.example.com siltew ataması",
-       "extlink_tip": "Sırtqı siltew (http:// prefiksin kiritin')",
-       "headline_sample": "Atama teksti",
-       "headline_tip": "2-shi da'rejeli atama",
-       "nowiki_sample": "Formatlanbag'an tekstti usı jerge qoyın'",
-       "nowiki_tip": "Wiki formatlawın esapqa almaw",
-       "image_tip": "Jaylastırılg'an fayl",
-       "media_tip": "Fayl siltewi",
-       "sig_tip": "Sizin' imzan'iz ha'mde waqıt belgisi",
-       "hr_tip": "Gorizont bag'ıtındag'ı sızıq (dım ko'p paydalanban')",
        "summary": "Juwmaq:",
        "subject": "Ataması:",
        "minoredit": "Bul kishi o'zgeris",
index 667f659..4ec93d5 100644 (file)
        "resettokens-watchlist-token": "Tiddest i usuddem (Atom/RSS) web n [[Special:Watchlist|ibeddilen n isebtar n umuɣ inek/inem n uḍfar]]",
        "resettokens-done": "Tiddas i wennezen.",
        "resettokens-resetbutton": "Wennez tiddas i fernen",
-       "bold_sample": "Aḍris aberbuz",
-       "bold_tip": "Aḍris aberbuz",
-       "italic_sample": "Aḍris aṭalyani",
-       "italic_tip": "Aḍris aṭalyani",
-       "link_sample": "Azwel n uzday",
-       "link_tip": "Azday zdaxel",
-       "extlink_sample": "http://www.example.com azwel n uzday",
-       "extlink_tip": "Azday aberrani (cfu belli yessefk at tebduḍ s http://)",
-       "headline_sample": "Aḍris n uzwel azellum",
-       "headline_tip": "Aswir 2 n uzwel azellum",
-       "nowiki_sample": "Sideff da tirra bla taseddast(formatting) n wiki",
-       "nowiki_tip": "Ttu taseddast n wiki",
-       "image_sample": "Amedya.jpg",
-       "image_tip": "Tugna yettussekcmen",
-       "media_sample": "Amedya.ogg",
-       "media_tip": "Azday n ufaylu media",
-       "sig_tip": "Azmul inek s uzemz",
-       "hr_tip": "Ajerriḍ aglawan (ur teččerɛiḍ ara)",
        "summary": "Agzul:",
        "subject": "Asentel:",
        "minoredit": "Wagi d abeddel afessas",
index a291572..d1123a8 100644 (file)
        "resetpass-submit-cancel": "ЩӀегъуэжын",
        "resetpass-wrong-oldpass": "Парол щӀэхыр иэ щыӀэр тэрэзкъым.\nУи паролыр узыншу зэпхъуэкӀагъэн иэ щӀэуэ щӀэх парол узщӀэлъэӀуар узыншу зэфӀэкӀа.",
        "resetpass-temp-password": "ЩӀэх паролыр:",
-       "bold_sample": "Ӏуву щӀын хьэрыфхэр",
-       "bold_tip": "Ӏуву щӀын хьэрыфхэр",
-       "italic_sample": "Текстыр укъуэншауэ",
-       "italic_tip": "Хьэрыфхэр укъэншауэ щӀын",
-       "link_sample": "ТехьэпӀэм и цIэр",
-       "link_tip": "КІуэцІ техьэпІэ",
-       "extlink_sample": "http://www.example.com техьэпӀэхэм я псэлъащхьэ",
-       "extlink_tip": "ТехьэпӀэ зэIухар (зыщывмыгъэгъупщэ http:// префиксыр)",
-       "headline_sample": "Псалъащхьэм и тхылъ",
-       "headline_tip": "ТІуанэ щхьэгъэ псалъащхьэ",
-       "nowiki_sample": "Формациэ мыщӀа тхыгъэр мыбдеж игъэувэ",
-       "nowiki_tip": "Вики-форматыр Iухын",
-       "image_tip": "Теплъэ кӀуэцӀылъу",
-       "media_tip": "Теплъэм и техьэпӀэ",
-       "sig_tip": "Уи ӀэпэщӀэдзымрэ зэман щытехуэмрэ",
-       "hr_tip": "ЩӀэтхъэгъуэ щӀыхь (куэдрэ къэвмыгъэмэбэп)",
        "summary": "Хъуэжахэм тепсэлъыхь:",
        "subject": "Темэ/псалъащхьэ:",
        "minoredit": "МащIэу хъуэжа",
index 7310bd3..56175e9 100644 (file)
@@ -7,7 +7,8 @@
                        "Macofe",
                        "Saraiki",
                        "BukhariSaeed",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Amire80"
                ]
        },
        "tog-underline": "ربطو خط کشیدگی",
        "passwordreset-domain": "ڈومین:",
        "passwordreset-email": "ای میل پتہ:",
        "changeemail-none": "(نو)",
-       "bold_sample": "بوسک متن",
-       "bold_tip": "بولڈ ٹیکسٹ",
-       "italic_sample": "کولی/اٹالک نیویشیرو",
-       "italic_tip": "کولی نیویشیرو",
-       "link_sample": "ربطو عنوان",
-       "link_tip": "اندرینو لنک",
-       "extlink_sample": "http://groups.yahoo.com/group/khowaracademy ربطو عنوان",
-       "extlink_tip": "بیریو ربطو (یاد لکھے  http:// prefix)",
-       "headline_sample": "شہ سرخی",
-       "headline_tip": "شہ سرخی درجہ دوم",
-       "nowiki_sample": "غیرشکلبندشدہ متنو ھیارا درج کورور",
-       "nowiki_tip": "ویکی شکلبندیو نظرانداز کورے",
-       "image_tip": "ݯوکیرو فائل",
-       "media_tip": "مسلو لنک",
-       "sig_tip": "تہ دستخط بمع مہرِ وخت",
-       "hr_tip": "تھروسکی لکیر (زیادہ استعمال مو کورے)",
        "summary": "خلاصہ:",
        "subject": "مضمون/شہ سرخی:",
        "minoredit": "معمولی ترمیم",
index 32ed1c2..8ed1011 100644 (file)
@@ -9,7 +9,8 @@
                        "Macofe",
                        "Kumkumuk",
                        "Asmen",
-                       "Gırd"
+                       "Gırd",
+                       "1917 Ekim Devrimi"
                ]
        },
        "tog-underline": "Bınê gırey de xete bonce:",
        "resetpass-submit-cancel": "Bıtexelne",
        "resetpass-temp-password": "Parola vêrdiye:",
        "passwordreset-username": "Namê karberi:",
-       "bold_sample": "Nusto qolınd",
-       "bold_tip": "Nusto qolınd",
-       "italic_sample": "Meqalo italik",
-       "italic_tip": "Meqalo italik",
-       "link_sample": "Serrêza girêy",
-       "link_tip": "Girê zerri",
-       "extlink_sample": "http://www.example.com arezekerdena adrese",
-       "extlink_tip": "Girê teberi (verbendê http:// ho vira mekerê)",
-       "headline_sample": "Nustê serrêze",
-       "headline_tip": "Serrêza sewiya 2ine",
-       "nowiki_sample": "Formatê nustê huyo serbeti ita bınuse",
-       "nowiki_tip": "Ehemêt formatê wikiy mede",
-       "image_tip": "Dosya arêkerdiye",
-       "media_tip": "Girê dosya",
-       "sig_tip": "İmza to be tarix",
-       "hr_tip": "Xeta ufqiye (zaf megurene)",
        "summary": "Xulasa:",
        "subject": "Mewzu/serrêze:",
        "minoredit": "No jü vurnaiso qızkeko",
        "group-all": "(pêro)",
        "group-user-member": "Karber",
        "group-bot-member": "Bot",
-       "group-sysop-member": "İdareker",
+       "group-sysop-member": "{{GENDER:$1|idareker}}",
        "group-bureaucrat-member": "Burokrat",
        "grouppage-user": "{{ns:project}}:Karberi",
        "grouppage-bot": "{{ns:project}}:Boti",
        "thumbnail_error": "Vıraştena resımê qıckeki de xeta: $1",
        "import-upload-filename": "Namê dosya:",
        "tooltip-pt-userpage": "Pela sımawa karberi",
-       "tooltip-pt-mytalk": "Pela sımawa hurênaişi",
+       "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
        "tooltip-pt-preferences": "Tercihê mı",
        "tooltip-pt-watchlist": "Lista pelunê ke to guretê şêrkerdene",
        "tooltip-pt-mycontris": "Lista iştıraqunê sıma",
index 452d028..3b25d6d 100644 (file)
        "passwordreset": "ၜီးၜါ်သင့် မ်ုအင်းတင်",
        "passwordreset-username": "ဆ်ုသုံႋဆာႋမိင်:",
        "changeemail-none": "(ပၠဝ်ပြေ)",
-       "bold_sample": "လိက်ဖၠုံးသိုင့်",
-       "bold_tip": "လိက်ဖၠုံးသိုင့်",
-       "italic_sample": "လိက်ဖၠုံးပ်ု",
-       "italic_tip": "လိက်ဖၠုံးပ်ု",
-       "link_sample": "လင့်ခ် အ်ုခေါဟ်တင်",
-       "link_tip": "အ်ုဒှဲႋဖိုင် လင့်ခ်",
-       "extlink_sample": "http://www.example.com လင့်ခ် ခေါဟ်ဍံင်",
-       "extlink_tip": "အ်ုၰံင်လင့်သယ် (http:// ၮှ် သာ့ၮင့်ဆူ့ဍုဂ် လ်ုအ်ုမေံယာ့ခဝ့်ၯေဝ်)",
-       "headline_sample": "အ်ုခေါဟ်တင်ဍောဟ်လိက်ဖၠုံး",
-       "headline_tip": "အ်ုဆင့် ၂ ခေါဟ်ဍောဟ်",
-       "nowiki_sample": "ဖောမတ်လ်ုမာထဝး လိက်သယ်အိုဝ် ထါင်ႋယိုဝ် မ်ုဆူ့လင်",
-       "nowiki_tip": "ဝီကီလာၯင် ဖော်မတ်သယ်လ်ုဖး လ်ုအှ်ကှ်ေဆ်ုပ်ုယောဝ်ႋ",
-       "image_tip": "Embedded ဍုဂ်ထး ဖိုင်",
-       "media_tip": "File လင့်",
-       "sig_tip": "မူႋသင့်ခိင်ႋခါ့ၮဲဖှ်ေ ၮ်ုစူးဍံင်",
-       "hr_tip": "ပၞံင့်ထီ့ဖါ (အင်းကုံဆၟိုဝ်လာႋ)",
        "summary": "အ်ုအိင်း",
        "subject": "လိက်ဘာႋသါ့:",
        "minoredit": "အ်ုယိုဝ် မွာဲဝေ့ဆ်ုအင်းတါင်ဖေါဟ်လှ်",
index 70219d9..80d7452 100644 (file)
        "resetpass_submit": "قۇپىييا ٴسوزدى قويىڭىز دا كىرىڭىز",
        "changepassword-success": "قۇپىييا ٴسوزىڭىز ٴساتتى وزگەرتىلدى! ەندى كىرىڭىز…",
        "resetpass_forbidden": "{{SITENAME}} جوباسىندا قۇپىييا سوزدەر وزگەرتىلمەيدى",
-       "bold_sample": "جۋان ٴماتىن",
-       "bold_tip": "جۋان ٴماتىن",
-       "italic_sample": "قىيعاش ٴماتىن",
-       "italic_tip": "قىيعاش ٴماتىن",
-       "link_sample": "سىلتەمە تاقىرىبىن اتى",
-       "link_tip": "ىشكى سىلتەمە",
-       "extlink_sample": "http://www.example.com سىلتەمە تاقىرىبىن اتى",
-       "extlink_tip": "شەتتىك سىلتەمە (الدىنان http:// ەنگىزۋىن ۇمىتپاڭىز)",
-       "headline_sample": "باس جول ٴماتىنى",
-       "headline_tip": "2-ٴشى دەڭگەيلى باس جول",
-       "nowiki_sample": "پىشىمدەلىنبەگەن ٴماتىندى مىندا ەنگىزىڭىز",
-       "nowiki_tip": "ۋىيكىي ٴپىشىمىن ەلەمەۋ",
-       "image_tip": "ەندىرىلگەن فايل",
-       "media_tip": "فايل سىلتەمەسى",
-       "sig_tip": "قولتاڭباڭىز جانە ۋاقىت بەلگىسى",
-       "hr_tip": "دەرەلەي سىزىق (ۇنەمدى قولدانىڭىز)",
        "summary": "قىسقاشا مازمۇنداماسى:",
        "subject": "تاقىرىبى/باس جولى:",
        "minoredit": "بۇل شاعىن وڭدەمە",
index 8c3da99..81bf09d 100644 (file)
        "resettokens-watchlist-token": "(Atom/RSS) [[Special:Watchlist|сіздің бақылау тізіміңіздегі беттердегі өзгерістер]]дегі уеб тізбегі (Atom/RSS) үшін токен",
        "resettokens-done": "Байрақшаларды ысыру",
        "resettokens-resetbutton": "Таңдалған байрақшаларды ысыру",
-       "bold_sample": "Жуан мәтін",
-       "bold_tip": "Жуан мәтін",
-       "italic_sample": "Қиғаш мәтін",
-       "italic_tip": "Қиғаш мәтін",
-       "link_sample": "Сілтеме тақырыбының аты",
-       "link_tip": "Ішкі сілтеме",
-       "extlink_sample": "http://www.example.com сілтеме тақырыбының аты",
-       "extlink_tip": "Сыртқы сілтеме (алдынан http:// енгізуін ұмытпаңыз)",
-       "headline_sample": "Бас жол мәтіні",
-       "headline_tip": "2-ші деңгейлі бас жол",
-       "nowiki_sample": "Форматталмаған мәтінді мында кірістіріңіз",
-       "nowiki_tip": "Уики форматтауын елемеу",
-       "image_sample": "Мысал.jpg",
-       "image_tip": "Ендірілген файл",
-       "media_tip": "Файл сілтемесі",
-       "sig_tip": "Қолтаңбаңыз және уақыт белгісі",
-       "hr_tip": "Көлденең сызық (үнемді қолданыңыз)",
        "summary": "Түйіндемесі:",
        "subject": "Тақырыбы:",
        "minoredit": "Бұл шағын өңдеме",
index 0eb2352..ee6939e 100644 (file)
        "resetpass_submit": "Qupïya sözdi qoýıñız da kiriñiz",
        "changepassword-success": "Qupïya söziñiz sätti özgertildi! Endi kiriñiz…",
        "resetpass_forbidden": "{{SITENAME}} jobasında qupïya sözder özgertilmeýdi",
-       "bold_sample": "Jwan mätin",
-       "bold_tip": "Jwan mätin",
-       "italic_sample": "Qïğaş mätin",
-       "italic_tip": "Qïğaş mätin",
-       "link_sample": "Silteme taqırıbın atı",
-       "link_tip": "İşki silteme",
-       "extlink_sample": "http://www.example.com silteme taqırıbın atı",
-       "extlink_tip": "Şettik silteme (aldınan http:// engizwin umıtpañız)",
-       "headline_sample": "Bas jol mätini",
-       "headline_tip": "2-şi deñgeýli bas jol",
-       "nowiki_sample": "Pişimdelinbegen mätindi mında engiziñiz",
-       "nowiki_tip": "Wïkï pişimin elemew",
-       "image_tip": "Endirilgen faýl",
-       "media_tip": "Faýl siltemesi",
-       "sig_tip": "Qoltañbañız jäne waqıt belgisi",
-       "hr_tip": "Dereleý sızıq (ünemdi qoldanıñız)",
        "summary": "Tüýindemesi:",
        "subject": "Taqırıbı/bas jolı:",
        "minoredit": "Bul şağın öñdeme",
index eae59c7..ada3245 100644 (file)
        "resettokens-token-label": "$1 (តម្លៃបច្ចុប្បន្ន $2)",
        "resettokens-done": "កូនសោរកំណត់ឡើងវិញហើយ។",
        "resettokens-resetbutton": "កំណត់ឡើងវិញនូវកូនសោរដែលបានរើស។",
-       "bold_sample": "អក្សរដិត",
-       "bold_tip": "អក្សរដិត",
-       "italic_sample": "អក្សរទ្រេត",
-       "italic_tip": "អក្សរទ្រេត",
-       "link_sample": "ចំណងជើង​តំណភ្ជាប់",
-       "link_tip": "តំណភ្ជាប់​ខាងក្នុង",
-       "extlink_sample": "http://www.example.com ចំណងជើង​តំណភ្ជាប់",
-       "extlink_tip": "តំណភ្ជាប់​ខាងក្រៅ (កុំភ្លេច​ដាក់ http:// នៅពីមុខ)",
-       "headline_sample": "ចំណងជើងរងនៃអត្ថបទ",
-       "headline_tip": "ចំណងជើងរង​កម្រិត​២",
-       "nowiki_sample": "បញ្ចូល​អត្ថបទគ្មានទម្រង់​នៅទីនេះ",
-       "nowiki_tip": "មិនគិត​ទម្រង់​នៃ​វិគី",
-       "image_sample": "ឧទាហរណ៍.jpg",
-       "image_tip": "រូបភាពបង្កប់",
-       "media_sample": "ឧទាហរណ៍.ogg",
-       "media_tip": "តំណភ្ជាប់ឯកសារ",
-       "sig_tip": "ហត្ថលេខា​របស់អ្នកជាមួយនឹងកាលបរិច្ឆេទ",
-       "hr_tip": "បន្ទាត់ដេក (មិនសូវប្រើទេ)",
        "summary": "ចំណារពន្យល់៖",
        "subject": "ប្រធានបទ៖",
        "minoredit": "នេះជា​កំណែប្រែតិចតួចប៉ុណ្ណោះ",
index fbdb05a..1a7b78f 100644 (file)
        "changeemail-submit": "ಇಮೇಲ್ ಬದಲಾಯಿಸಿ",
        "resettokens-tokens": "ಸಂಕೇತಗಳು:",
        "resettokens-token-label": "$1(ಪ್ರಸ್ತುತ ಮೌಲ್ಯ:$2)",
-       "bold_sample": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
-       "bold_tip": "ದಪ್ಪಗಿನ ಅಚ್ಚು",
-       "italic_sample": "ಓರೆ ಅಕ್ಷರಗಳು",
-       "italic_tip": "ಓರೆ ಅಕ್ಷರಗಳು",
-       "link_sample": "ಲಿಂಕ್ ಶೀರ್ಷಿಕೆ",
-       "link_tip": "ಆಂತರಿಕ ಸಂಪರ್ಕ",
-       "extlink_sample": "http://www.example.com ಸಂಪರ್ಕ ಶೀರ್ಷಿಕೆ",
-       "extlink_tip": "ಬಾಹ್ಯ ಸಂಪರ್ಕ (http:// ಇಂದ ಶುರು ಮಾಡಿ)",
-       "headline_sample": "ಶಿರೋಲೇಖ",
-       "headline_tip": "೨ನೇ ಮಟ್ಟದ ತಲೆಬರಹ",
-       "nowiki_sample": "ಇಲ್ಲಿ ವಿಕೀ ಫಾರ್ಮಾಟ್ ಮಾಡದ ಪಠ್ಯವನ್ನು ಸೇರಿಸಿ",
-       "nowiki_tip": "ವಿಕಿ ರಚನಕ್ರಮವನ್ನು ಅಲಕ್ಷಿಸು",
-       "image_tip": "ಅಳವಡಿಸಲ್ಪಟ್ಟ ಕಡತ",
-       "media_tip": "ಕಡತದ ಕೊಂಡಿ",
-       "sig_tip": "ಸಮಯಮುದ್ರೆಯೊಂದಿಗೆ ನಿಮ್ಮ ಸಹಿ",
-       "hr_tip": "ಅಡ್ಡ ಗೆರೆ (ಆದಷ್ಟು ಕಡಿಮೆ ಉಪಯೋಗಿಸಿ)",
        "summary": "ಸಾರಾಂಶ:",
        "subject": "ವಿಷಯ:",
        "minoredit": "ಇದು ಚುಟುಕಾದ ಬದಲಾವಣೆ",
index 769891d..f293d56 100644 (file)
        "tog-useeditwarning": "바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 내게 알리기",
        "tog-prefershttps": "로그인하는 동안 항상 보안 연결 사용",
        "tog-showrollbackconfirmation": "되돌리기 링크를 클릭할 때 확인창을 표시",
+       "tog-requireemail": "비밀번호 재설정을 위한 이메일 필요",
        "underline-always": "항상",
        "underline-never": "항상 긋지 않기",
        "underline-default": "스킨 또는 브라우저 기본값",
        "createaccountmail": "임의의 임시 비밀번호를 이메일로 보내기",
        "createaccountmail-help": "비밀번호를 기억하지 않고도 다른 사용자를 위한 계정을 만들 수 있습니다.",
        "createacct-realname": "실명 (선택 사항)",
-       "createacct-reason": "이유",
+       "createacct-reason": "이유 (기록은 공개됨)",
        "createacct-reason-ph": "다른 계정을 만들어야 하는 이유가 있나요",
        "createacct-reason-help": "계정 생성 로그에 표시되는 메시지",
        "createacct-submit": "계정 만들기",
        "resettokens-watchlist-token": "[[Special:Watchlist|주시문서 목록에 있는 문서의 바뀜]]의 웹 피드(Atom/RSS)에 대한 토큰",
        "resettokens-done": "토큰을 재설정했습니다.",
        "resettokens-resetbutton": "선택한 토큰 재설정",
-       "bold_sample": "굵은 글씨",
-       "bold_tip": "굵은 글씨",
-       "italic_sample": "기울인 글씨",
-       "italic_tip": "기울인 글씨",
-       "link_sample": "링크 제목",
-       "link_tip": "내부 링크",
-       "extlink_sample": "http://www.example.com 사이트 이름",
-       "extlink_tip": "외부 링크 (http://를 앞에 붙여야 합니다)",
-       "headline_sample": "제목",
-       "headline_tip": "2단계 문단 제목",
-       "nowiki_sample": "여기에 위키 문법을 사용하지 않을 글을 적어 주세요",
-       "nowiki_tip": "위키 문법 사용하지 않기",
-       "image_tip": "파일 넣기",
-       "media_tip": "파일 링크하기",
-       "sig_tip": "내 서명과 현재 시각",
-       "hr_tip": "가로 줄 (사용을 되도록 삼가주세요)",
        "summary": "요약:",
        "subject": "주제:",
        "minoredit": "사소한 편집입니다",
        "listfiles-userdoesnotexist": "계정 \"$1\"은 등록되지 않았습니다.",
        "imgfile": "파일",
        "listfiles": "파일 목록",
+       "listfiles_subpage": "$1님이 올림",
        "listfiles_thumb": "섬네일",
        "listfiles_date": "날짜",
        "listfiles_name": "이름",
        "ipblocklist-legend": "차단된 사용자 찾기",
        "blocklist-userblocks": "계정에 대한 차단 숨기기",
        "blocklist-tempblocks": "기한이 정해진 차단을 숨기기",
+       "blocklist-indefblocks": "무기한 차단 숨기기",
        "blocklist-addressblocks": "단일 IP 차단을 숨기기",
        "blocklist-type": "유형:",
        "blocklist-type-opt-all": "모두",
        "empty-username": "(사용 가능한 사용자 이름 없음)",
        "contribslink": "기여",
        "emaillink": "이메일 보내기",
-       "autoblocker": "당신의 IP 주소는 최근에 \"[[User:$1|$1]]\"님이 사용하였기 때문에 자동으로 차단되었습니다.\n$1님이 차단된 이유는 다음과 같습니다: \"$2\"",
+       "autoblocker": "당신의 IP 주소는 최근에 \"[[User:$1|$1]]\" 님이 사용하였기 때문에 자동으로 차단되었습니다.\n$1 님이 차단된 이유는 다음과 같습니다: \"$2\"",
        "blocklogpage": "차단 기록",
        "blocklog-showlog": "이 사용자는 과거에 차단된 기록이 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
        "blocklog-showsuppresslog": "이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
-       "blocklogentry": "님이 [[$1]]님을 $2 차단했습니다 $3",
+       "blocklogentry": "님이 [[$1]] 님을 $2 차단했습니다 $3",
        "reblock-logentry": " 님이 [[$1]] 님의 차단 기간을 $2(으)로 바꾸었습니다 $3",
        "blocklogtext": "이 목록은 사용자 차단/차단 해제 기록입니다.\n자동으로 차단된 IP 주소는 여기에 나오지 않습니다.\n[[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.",
        "unblocklogentry": "님이 $1님을 차단 해제했습니다",
        "mycustomjsredirectprotected": "넘겨주기이면서 사용자 공간 안에 참조하고 있지 않으므로 이 자바스크립트 페이지를 편집할 권한이 없습니다.",
        "easydeflate-invaliddeflate": "주어진 컨텐츠가 적절히 압축되지 않았습니다",
        "unprotected-js": "보안 상의 이유로 자바스크립트는 보호되지 않은 문서로부터 불러올 수 없습니다. 미디어위키: 이름공간이나 사용자의 하위 문서에서만 자바스크립트를 만들어 주십시오.",
-       "userlogout-continue": "로그아웃하시겠습니까?"
+       "userlogout-continue": "로그아웃하시겠습니까?",
+       "rest-no-match": "요청된 상대 경로($1)는 알려진 핸들러와 일치하지 않습니다"
 }
index 8bcc1d0..4a81ccf 100644 (file)
        "resettokens": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
        "resettokens-token-label": "$1 (бусагъатдагъы: $2)",
-       "bold_sample": "Къалын джазыу",
-       "bold_tip": "Къалын джазыу",
-       "italic_sample": "Сёдегей джазыу",
-       "italic_tip": "Сёдегей джазыу",
-       "link_sample": "Джибериуню башлыгъы",
-       "link_tip": "Ич джибериу",
-       "extlink_sample": "http://www.example.com линкни ачыкълауу",
-       "extlink_tip": "Тыш джибериу (http:// префиксни унутмагъыз)",
-       "headline_sample": "Башлыкъны тексти",
-       "headline_tip": "2-чи дараджалы башлыкъ",
-       "nowiki_sample": "Формат этилинмеген текстни бери салыгъыз",
-       "nowiki_tip": "Вики-формат этиуню игнор эт",
-       "image_sample": "Юлгю.jpg",
-       "image_tip": "Эндирилген файл",
-       "media_sample": "Юлгю.ogg",
-       "media_tip": "Медиа-файлгъа джибериу",
-       "sig_tip": "Къол салыуугъуз эмда заман",
-       "hr_tip": "Горизонтал сыз (кёб хайырландырмагъыз)",
        "summary": "Тюрлениулени къысха ачыкълау:",
        "subject": "Тема/башлыкъ:",
        "minoredit": "Бу гитче тюрлениудю",
index a49150d..38ee466 100644 (file)
        "passwordreset": "Kirjuta šalašana uuvveštah",
        "passwordreset-username": "Käyttäjänimi:",
        "passwordreset-domain": "Domain:",
-       "bold_sample": "Lihavointa",
-       "bold_tip": "Lihavointa",
-       "italic_sample": "Kuršivoitu teksti",
-       "italic_tip": "Kuršivointa",
-       "link_sample": "Linkki",
-       "link_tip": "Šiämilinkki",
-       "extlink_sample": "http://www.example.com linkin nimi",
-       "extlink_tip": "Ulkopuolini linkki (muissa laittua http:// alkuh)",
-       "headline_sample": "Očikkoteksti",
-       "headline_tip": "Tašon 2 očikko",
-       "nowiki_sample": "Lisyä täh teksti, kumpaista ei pijä korjata",
-       "nowiki_tip": "Penkuo wiki-korjaušta",
-       "image_tip": "Tallennettu faili",
-       "media_tip": "Linkki failih",
-       "sig_tip": "Teijän allakirjutuš ta aika",
-       "hr_tip": "Vuakašuora viiva (elä käytä liijakši)",
        "summary": "Yhtehveto",
        "minoredit": "Tämä on pieni kohennuš",
        "watchthis": "Tarkkaile tätä šivuo",
index d44431b..7a59463 100644 (file)
        "resettokens-watchlist-token": "ä schlößel för dä <i lang=\"en\" xml:lang=\"en\">Atom</i>- udder <i lang=\"en\" xml:lang=\"en\">RSS</i>-Kanaal met de [[Special:Watchlist|Änderonge aan Sigge en Dinger Oppaßleß]]",
        "resettokens-done": "Schlößel neu jemaat.",
        "resettokens-resetbutton": "Lohß Jonn!",
-       "bold_sample": "Fätte Schreff",
-       "bold_tip": "Fätte Schreff",
-       "italic_sample": "Scheive Schreff",
-       "italic_tip": "Scheive Schreff",
-       "link_sample": "Anker Tex",
-       "link_tip": "Ene Link en {{GRAMMAR:Akkusativ|{{SITENAME}}}}",
-       "extlink_sample": "http://www.example.com/dat_he_oohne_Zwescheräum Donoh dä Anker Tex",
-       "extlink_tip": "Ene Link noh drusse (denk dran, http:// aan dr Aanfang!)",
-       "headline_sample": "Üvverschreff",
-       "headline_tip": "Övverschreff om bövverschte Nivvo",
-       "nowiki_sample": "Heh kütt dä Tex hen, dä vun de Wiki-Soffwär nit bearbeid, un en Rauh jelooße wääde soll",
-       "nowiki_tip": "Der Wikki_Kohd för et Fommattehre övverjonn",
-       "image_sample": "Beispill.jpg",
-       "image_tip": "E Beldche enbaue",
-       "media_sample": "Beispill.ogg",
-       "media_tip": "Ene Link op en Tondatei, e Filmche, oder esu jet",
-       "sig_tip": "Dinge Nahme, med de Uhrzigk unn_em Dattum",
-       "hr_tip": "En Querlinnich",
        "summary": "Koot zosammejefaß, Quäll:",
        "subject": "Övverschreff - wodröm jeiht et?",
        "minoredit": "Dat es en klein Änderong (mini)",
index b6fcb4d..30e327d 100644 (file)
        "changeemail-password": "Şîfreya te ya {{SITENAME}}ê:",
        "changeemail-submit": "Enameyê biguherîne",
        "resettokens": "Mifteya jê bibe",
-       "bold_sample": "Nivîsa stûr",
-       "bold_tip": "Nivîsa stûr",
-       "italic_sample": "Nivîsa xwehr (îtalîk)",
-       "italic_tip": "Nivîsa xwehr (îtalîk)",
-       "link_sample": "Sernavê girêdanê",
-       "link_tip": "Girêdana navxweyî",
-       "extlink_sample": "http://www.example.com navê lînkê",
-       "extlink_tip": "Girêdana derve (http:// di destpêkê de ji bîr neke)",
-       "headline_sample": "Nivîsara sernameyê",
-       "headline_tip": "Sername asta 2",
-       "nowiki_sample": "Nivîs ku nebe formatkirin",
-       "nowiki_tip": "Guh nede formatkirina wiki",
-       "image_sample": "Mînak.jpg",
-       "image_tip": "Wêne li hundirê gotarê",
-       "media_sample": "Mînak.ogg",
-       "media_tip": "Girêdana pelê",
-       "sig_tip": "Îmze û demxeya wext ya te",
-       "hr_tip": "Rastexêza berwarî (kêm bi kar bîne)",
        "summary": "Kurte (Te çi kir?):",
        "subject": "Mijar:",
        "minoredit": "Ev guhertineke biçûk e",
index 8ab6117..7afa390 100644 (file)
        "passwordreset": "Чечилни янгыдан бегетмек",
        "passwordreset-username": "Къоллавчу аты",
        "changeemail-none": "(ёкъ)",
-       "bold_sample": "Къалын матын",
-       "bold_tip": "Къалын матын",
-       "italic_sample": "Авункъу матын",
-       "italic_tip": "Авункъу матын",
-       "link_sample": "Байланывну аты",
-       "link_tip": "Ич байланыв",
-       "extlink_sample": "http://www.example.com байланывну аты",
-       "extlink_tip": "Тыш байланыв (бу префиксни http:// эсде сакъла)",
-       "headline_sample": "Язывбашны матыны",
-       "headline_tip": "2 даражаны язывбашы",
-       "nowiki_sample": "Форматланмагъа гере тюгюл матынны бери сал",
-       "nowiki_tip": "Вики форматлавну сан этме",
-       "image_tip": "Гийирилген саплам",
-       "media_tip": "Сапламгъа байланыв",
-       "sig_tip": "Къол басымынг ва заман мюгьюрю",
-       "hr_tip": "Гёнделен гьыз (къоралап къолла)",
        "summary": "Алышывну къысгъартылымы:",
        "minoredit": "Увакъ тюзлев",
        "watchthis": "Бу сагьифаны гьызарламакъ",
index e18937f..cc32812 100644 (file)
        "changeemail-none": "(nagonan)",
        "changeemail-password": "Agas ger tremena war {{SITENAME}}:",
        "changeemail-submit": "Chanjya an trigva ebost",
-       "bold_sample": "Tekst tew",
-       "bold_tip": "Tekst tew",
-       "italic_sample": "Tekst italek",
-       "italic_tip": "Tekst italek",
-       "link_sample": "Titel an gevren",
-       "link_tip": "Kevren bervedhel",
-       "extlink_sample": "http://www.example.com titel an gevren",
-       "extlink_tip": "Kevren a-ves (na ankevewgh an rager http://)",
-       "headline_sample": "Tekst an bennlinen",
-       "headline_tip": "Pennlinen nivel 2",
-       "nowiki_sample": "Keworrewgh tekst heb furvyans omma",
-       "nowiki_tip": "Skonya aswon furvyans wiki",
-       "image_tip": "Restren neythys",
-       "media_tip": "Kevren restren",
-       "sig_tip": "Agas sinans ha stampa-termyn",
-       "hr_tip": "Linen worwelyek (na usyowgh re)",
        "summary": "Berrskrif:",
        "subject": "Testen:",
        "minoredit": "Chanj byghan yw hemma",
index de4b5e7..89237f8 100644 (file)
        "changeemail-none": "(жок)",
        "changeemail-password": "«{{SITENAME}}» долбоору үчүн сиздин сырсөзүңүз:",
        "changeemail-submit": "E-mail'ди өзгөртүү",
-       "bold_sample": "Калың текст",
-       "bold_tip": "Калың текст",
-       "italic_sample": "жантык текст",
-       "italic_tip": "жантык текст",
-       "link_sample": "Шилтеменин аты",
-       "link_tip": "Ички шилтеме",
-       "extlink_sample": "http://www.example.com шилтеме аталышы",
-       "extlink_tip": "Сырткы шилтемелерге (http:// префиксин койгонду унутпаңыз)",
-       "headline_sample": "Башсөз тексти",
-       "headline_tip": "2-деңгээлдеги башсөз",
-       "nowiki_sample": "Форматталбаган текстти бул жерге киргизиңиз",
-       "nowiki_tip": "Уики-форматтоого көңүл бурбоо",
-       "image_tip": "Кыстарылган файл",
-       "media_tip": "Файл шилтемеси",
-       "sig_tip": "Кол тамгаңыз жана убакыт мөөрү",
-       "hr_tip": "Туура сызык (жыш колдонбоңуз)",
        "summary": "Жыйынтыгы:",
        "subject": "Тема/баш аты:",
        "minoredit": "Майда оңдоо",
index 9f7a062..b128eaf 100644 (file)
        "passwordreset-emailelement": "Nomen usoris: \n$1\n\nMomentarius Tessera: \n$2",
        "changeemail-none": "(nulla)",
        "changeemail-submit": "Inscriptionem electronicam mutare",
-       "bold_sample": "Litterae pingues",
-       "bold_tip": "Litterae pingues",
-       "italic_sample": "Textus litteris Italicis scriptus",
-       "italic_tip": "Textus litteris Italicis scriptus",
-       "link_sample": "Titulum nexere",
-       "link_tip": "Nexus internus",
-       "extlink_sample": "http://www.example.com titulus nexus externi",
-       "extlink_tip": "Nexus externus (memento praefixi http://)",
-       "headline_sample": "Textus capituli",
-       "headline_tip": "Linea capitalis scalae 2",
-       "nowiki_sample": "Adde textum (sine indiciis)",
-       "nowiki_tip": "Indicia neglige",
-       "image_sample": "Exemplum.jpg",
-       "image_tip": "Fasciculus in pagina impositus",
-       "media_sample": "Exemplum.ogg",
-       "media_tip": "Nexus ad fasciculum",
-       "sig_tip": "Subscriptio tua cum indicatione temporis",
-       "hr_tip": "Linea horizontalis (noli saepe uti)",
        "summary": "Summarium:",
        "subject": "Res/titulus:",
        "minoredit": "Haec est recensio minor",
index df56a40..e04bda1 100644 (file)
@@ -11,7 +11,8 @@
                        "Universal Life",
                        "לערי ריינהארט",
                        "아라",
-                       "StevenJ81"
+                       "StevenJ81",
+                       "Chabi1"
                ]
        },
        "tog-underline": "Suliñar los atamientos:",
        "mypage": "Hoja",
        "mytalk": "Diskusyón",
        "anontalk": "Diskusyón para este adresso de IP",
-       "navigation": "Navigación",
-       "and": "&#32;y",
+       "navigation": "Navigasyon",
+       "and": "&#32;i",
        "faq": "DDS",
        "actions": "Aksiones",
        "namespaces": "Espacios de nombres",
        "tagline": "De {{SITENAME}}",
        "help": "Ayudo",
        "search": "Buxcar",
-       "searchbutton": "Buxcar",
+       "searchbutton": "Bushkar",
        "go": "Ir",
        "searcharticle": "Yir",
        "history": "La istoria de la hoja",
        "changeemail-password": "Tu kontrasenya en {{SITENAME}}:",
        "changeemail-submit": "Trocar letral",
        "resettokens-token-label": "$1(valor aktual: $2)",
-       "bold_sample": "Teksto reforçado",
-       "bold_tip": "Teksto reforçado",
-       "italic_sample": "Teksto aladado",
-       "italic_tip": "Teksto aladado",
-       "link_sample": "Títolo del atamiento",
-       "link_tip": "Atamiento (link) interno",
-       "extlink_sample": "http://www.example.com Títolo del atamiento",
-       "extlink_tip": "Atamiento esterno (link de afuera: acόdrate de ajustar el prefikso http://)",
-       "headline_sample": "Teksto del títolo",
-       "headline_tip": "Títolo de nivel 2",
-       "nowiki_sample": "El teksto sin formato, escrívelo aquí",
-       "nowiki_tip": "Iñora el formato viki",
-       "image_tip": "Dosya encaxada",
-       "media_tip": "Atamiento de la dosya",
-       "sig_tip": "Tu firma con la data y la ora",
-       "hr_tip": "Liña orizontal (kulanea poco)",
        "summary": "Rezümé:",
        "subject": "Tema/título:",
        "minoredit": "Esto es un trocamiento chiquitico",
        "tooltip-pt-logout": "Sal de tu cuento",
        "tooltip-pt-createaccount": "Te consejamos de avrir un cuento y hazer entrada allá, portanto no sos obligado",
        "tooltip-ca-talk": "Diskusyón encima del contènido desta hoja",
-       "tooltip-ca-edit": "Troca esta hoja",
+       "tooltip-ca-edit": "Troka esta oja",
        "tooltip-ca-addsection": "Ajusta un kapítolo muevo",
        "tooltip-ca-viewsource": "Esta hoja está guadrada.\nPuedes ver su manadero",
        "tooltip-ca-history": "Enderechamientos passados desta hoja",
        "feedback-cancel": "Anular",
        "feedback-message": "Messaje",
        "feedback-subject": "Sujeto",
-       "searchsuggest-search": "Buxca en {{SITENAME}}",
+       "searchsuggest-search": "Bushka en {{SITENAME}}",
        "duration-seconds": "$1{{PLURAL:$1|segundo|segundos}}",
        "duration-minutes": "$1{{PLURAL:$1|minuto|minutos}}",
        "duration-hours": "$1{{PLURAL:$1|ora|oras}}",
index 643e52f..fd1cab2 100644 (file)
        "createaccountmail": "En temporäert zoufällegt Passwuert benotzen an et per E-Mail un déi spezifizéiert E-Mailadress schécken",
        "createaccountmail-help": "Ka benotzt gi fir e Benotzerkont fir eng aner Persoun unzeleeën ouni d'Passwuert gewuer ze ginn.",
        "createacct-realname": "Richtegen Numm (fakultativ)",
-       "createacct-reason": "Grond",
+       "createacct-reason": "Grond (ëffentlech geloggt)",
        "createacct-reason-ph": "Fir wat Dir een anere Benotzerkonnt uleet",
        "createacct-reason-help": "Message deen am Logbuch vun den ugeluechte Benotzerkonte gewise gëtt",
        "createacct-submit": "Äre Benotzerkont uleeën",
        "resettokens-watchlist-token": "Token fir de Webfeed (Atom/RSS) vun den [[Special:Watchlist|Ännerungen op Säite vun Ärer Iwwerwaachungslëscht]]",
        "resettokens-done": "Token zréckgesat.",
        "resettokens-resetbutton": "Selectionéiert Tokens zrécksetzen",
-       "bold_sample": "Fettgedréckten Text",
-       "bold_tip": "Fettgedréckten Text",
-       "italic_sample": "Kursiven Text",
-       "italic_tip": "Kursiven Text",
-       "link_sample": "Link-Text",
-       "link_tip": "Interne Link",
-       "extlink_sample": "http://www.example.com Link Titel",
-       "extlink_tip": "Externe Link (Vergiesst net den http:// Prefix)",
-       "headline_sample": "Titel Text",
-       "headline_tip": "Iwwerschrëft vum Niveau 2",
-       "nowiki_sample": "Net-formatéierten Text hei androen",
-       "nowiki_tip": "Wiki-Format ignoréieren",
-       "image_sample": "Beispill.jpg",
-       "image_tip": "Bildlink",
-       "media_sample": "Beispill.ogg",
-       "media_tip": "Link op e Medieichier",
-       "sig_tip": "Är Ënnerschrëft mat Zäitstempel",
-       "hr_tip": "Horizontal Linn (mat Mooss gebrauchen)",
        "summary": "Resumé:",
        "subject": "Sujet:",
        "minoredit": "Dëst ass eng kleng Ännerung",
index 1aa45fa..82e3f89 100644 (file)
        "changeemail": "Э-почта дегишарун",
        "changeemail-none": "(садни)",
        "changeemail-submit": "E-адрес дегишун",
-       "bold_sample": "ЯцIу текст",
-       "bold_tip": "Къалин текст",
-       "italic_sample": "Курсивдин текст",
-       "italic_tip": "Курсивдин текст",
-       "link_sample": "Элячlунин кьилин цlар",
-       "link_tip": "Къенепатан элячlун",
-       "extlink_sample": "http://www.example.com элячlунин кьилин цlар",
-       "extlink_tip": "Къецепатан элячlун ( http:// префикс рикlел хуьх)",
-       "headline_sample": "Кьилинцlарцlин текст",
-       "headline_tip": "2-й дережадин кьилин цlар",
-       "nowiki_sample": "Формат тавунвай текст иниз тур",
-       "nowiki_tip": "Викидин форматун гьисаба кьамир",
-       "image_tip": "Ттунвай файл",
-       "media_tip": "Файлдин элячlун",
-       "sig_tip": "Куь къулни вахт",
-       "hr_tip": "Къаткай цlар (фад-фад кардик кутумир )",
        "summary": "Нетижа:",
        "subject": "Тема/кьилинцIар",
        "minoredit": "ГъвечIи дуьзар хъувун",
index 65ade14..daeb72f 100644 (file)
        "resettokens-watchlist-token": "Marca per la flue ueb (Atom/RSS) de [[Special:Watchlist|cambias a tua pajes monitorida]]",
        "resettokens-done": "Marcas reinisiada.",
        "resettokens-resetbutton": "Reinisia marcas elejeda",
-       "bold_sample": "Testo spesa",
-       "bold_tip": "Testo spesa",
-       "italic_sample": "Testo apoiada",
-       "italic_tip": "Testo apoiada",
-       "link_sample": "Titulo de lia",
-       "link_tip": "Lia interna",
-       "extlink_sample": "http://www.example.com titulo de lia",
-       "extlink_tip": "Lia esterna (no oblida la prefisa http://)",
-       "headline_sample": "Testo de titulo",
-       "headline_tip": "Titulo de nivel 2",
-       "nowiki_sample": "Ajunta asi testo nonformatida",
-       "nowiki_tip": "Iniora sintatica de vici",
-       "image_tip": "Fix interna",
-       "media_tip": "Lia de fix",
-       "sig_tip": "Tua suscrive con indica de ora",
-       "hr_tip": "Linia orizonal (per usas rara)",
        "summary": "Resoma:",
        "subject": "Tema:",
        "minoredit": "Esta es un cambia minor",
index 8ac21e3..c697544 100644 (file)
        "passwordreset-email": "Endagiriro eya 'email':",
        "passwordreset-emailtitle": "Ebya akawunti ey'oku {{SITENAME}}",
        "passwordreset-emailelement": "Ery'obwa memba: \n$1\n <br />\nEkyama kyo eky'ekiseerabuseera: \n$2",
-       "bold_sample": "Ennukuta z'owandika wano zonna ziba nziggumivu",
-       "bold_tip": "Bw'onyiga kano, ofuna w'oyinza okuwandikira ennukuta ezo ne zivaamu nga nziggumivu",
-       "italic_sample": "Ennukuta z'owandika wano zonna ziba za italiki",
-       "italic_tip": "Bw'onyiga ku kano, ennukuta z'oddako okuwandika ziba za italiki (ez'esurise). Okuddamu okufuna ennukuta eza bulijjo, ddamu okukanyiga ko.",
-       "link_sample": "Enyunzi yo eno egguke wa?",
-       "link_tip": "Nyiga wano ob'oyagala okukolawo enyunzi egguka ku kifo ekiri ku wiki eno",
-       "extlink_sample": "http://www.example.com linnya lya nyunzi",
-       "extlink_tip": "Nyiga ku kano ob'oyagala okuteekawo enyunzi egguka ku kifo ekitali ku wiki eno. (genderera ne kutabulako ennukuta ezikulembedde, http:// )",
-       "headline_sample": "Mutwe omukulu",
-       "headline_tip": "Nyiga ku kano okuwandika omutwe ogw'eddaala ery'okubiri",
-       "nowiki_sample": "Byowandika wano tebijjakufuulafuulibwa enkola ya wiki",
-       "nowiki_tip": "Nyiga ku kano ob'oyagala okufuna w'owandikira ebintu ebitafuulibwafuulibwa enkola ya wiki",
-       "image_tip": "Bw'onyiga ku kano, we wakomye okuwandika wajjawo enyunzi eteekawo ekifaananyi",
-       "media_tip": "Bw'onyiga ku kano, w'okomye okuwandika wajjawo enyunzi gy'okozesa okugguka ku fayiro eya mediya (eya vidiyo oba maloboozi)",
-       "sig_tip": "Nyiga ku kano ob'oyagala okuteekawo n'erinnya lyo ko n'obudde kw'omalidde bino by'okoze.",
-       "hr_tip": "Bw'onyiga ku kano ofuna olusaze olwawula mu by'owandika. (Gezaako butakozesa nyingi)",
        "summary": "Wandika wano ebinyonyola enkyukakyuka z'okoze:",
        "subject": "Ekyogerwako/Mutwe:",
        "minoredit": "Eno nkyukakyuka ntono",
index 70cd91e..2698845 100644 (file)
        "resettokens-watchlist-token": "Teike veur webfeed van [[Special:Watchlist|dien volglies]] (Atom/RSS)",
        "resettokens-done": "Teikes oppernuuj ingestèldj.",
        "resettokens-resetbutton": "Stèl gesillekteerde teikes oppernuuj in",
-       "bold_sample": "Vètten teks",
-       "bold_tip": "Vetten teks",
-       "italic_sample": "Sjuunsen tèks",
-       "italic_tip": "Sjuunsen tèks",
-       "link_sample": "Link titel",
-       "link_tip": "Interne link",
-       "extlink_sample": "http://www.example.com link titel",
-       "extlink_tip": "Extern link (mit de http:// prefix)",
-       "headline_sample": "Deilongerwerp",
-       "headline_tip": "Tusseköpske (hoogste niveau)",
-       "nowiki_sample": "Veur hiej de neet op te make teks in",
-       "nowiki_tip": "Verloup wiki-opmaak",
-       "image_tip": "Mediabesjtandj",
-       "media_tip": "Link nao bestandj",
-       "sig_tip": "Dien handjteikening mit datum en tied",
-       "hr_tip": "Horizontaal lien (gebroek spaarzaam)",
        "summary": "Samevatting:",
        "subject": "Óngerwirp:",
        "minoredit": "Dit is 'n klein verangering",
index 6115d5a..474ede4 100644 (file)
        "resettokens-watchlist-token": "Token pe-o feed web (Atom/RSS) de [[Special:Watchlist|modiffiche a-e paggine inti teu sott'oservaçion]]",
        "resettokens-done": "Token reimpostæ.",
        "resettokens-resetbutton": "Reimposta token selessionæ",
-       "bold_sample": "Grascetto",
-       "bold_tip": "Grascetto",
-       "italic_sample": "Corscîvo",
-       "italic_tip": "Corscîvo",
-       "link_sample": "Tìtolo do colegaménto",
-       "link_tip": "Colegaménto intèrno",
-       "extlink_sample": "http://www.example.com tittolo de l'ingancio",
-       "extlink_tip": "Colegaménto esterno (inclûdde o prefisso http:// )",
-       "headline_sample": "Tìtolo",
-       "headline_tip": "Tìtolo de 2° livello",
-       "nowiki_sample": "Inserî chì o testo sensa formattaçion",
-       "nowiki_tip": "Ignorâ a formattassion wiki",
-       "image_sample": "Exempio.jpg",
-       "image_tip": "Incorpora file",
-       "media_sample": "Exempio.ogg",
-       "media_tip": "Ingancio a file moltimediâ",
-       "sig_tip": "Firma con dæta e ôa",
-       "hr_tip": "Linnia orizontâ",
        "summary": "Ògetto:",
        "subject": "Sogetto:",
        "minoredit": "Quésta a l'é 'na modìfica minô",
index d0b7d94..af7eb73 100644 (file)
        "resettokens-watchlist-token": "شناسانندهٔ خوراک وبِی [[Special:Watchlist|تغییرات صفحه‌هایی که پی‌گیری می‌کنید]] (اتم/آراس‌اس)",
        "resettokens-done": "بازنشانی شناساننده‌ها.",
        "resettokens-resetbutton": "بازشناسی شناساننده‌های گزیده‌شده.",
-       "bold_sample": "متن پررنگ",
-       "bold_tip": "متن پررنگ",
-       "italic_sample": "متن کۀچ/هؤۀل",
-       "italic_tip": "متن کۀچ/هؤۀل",
-       "link_sample": "عنوان پیوند",
-       "link_tip": "پیوند درونی",
-       "extlink_sample": "http://www.example.com عنوان پیوند",
-       "extlink_tip": ") را فراموش نکنید http:// پیوند به بیرون (پیشوند",
-       "headline_sample": "متن عنوان",
-       "headline_tip": "عنوان سطح ۲",
-       "nowiki_sample": "متن قالب‌بندی‌نشده اینجا وارد شود",
-       "nowiki_tip": "نادیده‌گرفتن قالب‌بندی ویکی",
-       "image_sample": "نموونە.jpg",
-       "image_tip": "تصویر داخل متن",
-       "media_sample": "نموونە.ogg",
-       "media_tip": "پیوند پرونده",
-       "sig_tip": "امضای هومۀ و برچسب زۀمان",
-       "hr_tip": " )خط افقی(از آن کم استفاده کنید",
        "summary": "خلاصه:",
        "subject": "عنوان:",
        "minoredit": "یۀ دۀسکاری جزئیکۀ",
index 42e8957..744e5bf 100644 (file)
        "resettokens-token-label": "$1 (valùr de adès: $2)",
        "resettokens-done": "Tokens redefinìcc.",
        "resettokens-resetbutton": "Redefenés i tokens selesiunàcc",
-       "bold_sample": "Test in grasset",
-       "bold_tip": "Test in grasset",
-       "italic_sample": "Test in cursiv",
-       "italic_tip": "Test in cursiv",
-       "link_sample": "Titul del ligam",
-       "link_tip": "Ligam de dent",
-       "extlink_sample": "http://www.example.com titul del ligam",
-       "extlink_tip": "Ligam de föra (regordess el prefiss http:// )",
-       "headline_sample": "Intestazión de l'articul",
-       "headline_tip": "Intestazión de 2° nivel",
-       "nowiki_sample": "Met dent chì el test minga furmataa",
-       "nowiki_tip": "Ignora la furmatazión wiki",
-       "image_tip": "File inglubaa in del test",
-       "media_tip": "Ligam a un file multimedial",
-       "sig_tip": "Firma cun data e ura",
-       "hr_tip": "Riga urizuntala (duprala cun giüdizi)",
        "summary": "Mutiv per la mudifega:",
        "subject": "Suget (intestazión)",
        "minoredit": "Questa chì l'è una mudifega piscinina",
index bb300a7..98c5a30 100644 (file)
        "resetpass_submit": "ຕັ້ງລະຫັດຜ່ານ ແລະ ເຊັນເຂົ້າ",
        "changepassword-success": "ລະຫັດຜ່ານຂອງທ່ານຖືກປ່ຽນແລ້ວ!",
        "passwordreset-invalidemail": "ທີ່ຢູ່ອີເມລບໍ່ຖືກຕ້ອງ",
-       "bold_sample": "ໂຕໜັງສືເຂັ້ມ",
-       "bold_tip": "ໂຕໜັງສືເຂັ້ມ",
-       "italic_sample": "ໂຕເນີ້ງ",
-       "italic_tip": "ໂຕເນີ້ງ",
-       "link_sample": "ຫົວຂໍ້ລິ້ງຄ໌",
-       "link_tip": "ລິ້ງຄ໌ພາຍໃນ",
-       "extlink_sample": "http://www.example.com ຫົວຂໍ້ລິ້ງຄ໌",
-       "headline_sample": "ສຳຄັນ",
-       "headline_tip": "ຫົວຂໍ້ລະດັບ 2",
-       "image_tip": "ໄຟລ໌ຕິດຄັດ",
-       "media_tip": "ລິ້ງຄ໌ຫາໄຟລ໌",
        "summary": "ຄຳອະທິບາຍໂດຍຫຍໍ້:",
        "subject": "ຫົວຂໍ້:",
        "minoredit": "ນີ້ແມ່ນການດັດແກ້ເລັກນ້ອຍ",
index 9bfc84d..ff47e86 100644 (file)
        "resetpass_header": "Lisetize sebu dafi",
        "retypenew": "Sebu dafi:",
        "resetpass_submit": "Setize sebu dafi e menuhile",
-       "bold_sample": "Selt ombelu",
-       "bold_tip": "Selt ombelu",
-       "italic_sample": "Selt itali",
-       "italic_tip": "Selt itali",
-       "link_sample": "Sebu di ling'ko",
-       "link_tip": "Ling'ko bulili in",
-       "extlink_sample": "http://www.example.com sebu di ling'ko",
-       "extlink_tip": "Ling'ko bulili out (¡con http://!)",
-       "headline_sample": "Selt di pagafi",
-       "headline_tip": "Pagafi (2)",
-       "nowiki_sample": "Sebu di 'ni-Wikicode' apukisize",
-       "nowiki_tip": "'Ni Wiki-code' apukisize",
-       "image_sample": "Kamukile.jpg",
-       "image_tip": "Kamukile imegi",
-       "media_sample": "Kamukile.ogg",
-       "media_tip": "Kamukile media",
-       "sig_tip": "Sebu di sebelu con xete data (4× ~)",
-       "hr_tip": "Lani - (sepalati)",
        "summary": "Lyangutukezi:",
        "subject": "Lyangutukezi selt:",
        "minoredit": "A sa pili kenki",
index 3aa19f4..e23bf5b 100644 (file)
        "resettokens-watchlist-token": "دیارگأر سی حوڤال حوٙن تورگە(أتوم/آر ئس ئس) سی [[Special:سئیل بأرگ|آلئشت دأئن بألگە یا د سئیل بأرگئتوٙ]]",
        "resettokens-done": "نشونٱیا تازٱ بینٱ",
        "resettokens-resetbutton": "نشونٱ گلٛٱ ڤرچیٱ د نۊ زنٱ بیٱ",
-       "bold_sample": "نیسسٱ مؽن پور",
-       "bold_tip": "نیسسٱ مؽن پور",
-       "italic_sample": "نیسسٱیا هٱلٛ ۉ هار",
-       "italic_tip": "نیسسٱیا هٱلٛ ۉ هار",
-       "link_sample": "داسون هوم پاٛڤٱن",
-       "link_tip": "هوم پاٛڤٱن مؽنجایی",
-       "extlink_sample": "http://www.example.com داسون هوم پاٛڤٱن",
-       "extlink_tip": "هوم پاٛڤٱن خارجی(د ڤیر داشتۊیؽت)",
-       "headline_sample": "سٱرخٱت نیسسٱ",
-       "headline_tip": "ریتراز 2 خٱت سٱرڤٱن",
-       "nowiki_sample": "د ایچاْ یاٛ نیسسٱ ڤارد بٱکؽت",
-       "nowiki_tip": "د شکل ڤیکی تیٱپۊشی بٱک",
-       "image_sample": "Example.jpg",
-       "image_tip": "جانؽا چار قر گرتٱ",
-       "media_sample": "Example.ogg",
-       "media_tip": "جانؽا هوم پاٛڤٱن",
-       "sig_tip": "اْمزا شما ڤا گاتدیس",
-       "hr_tip": "خٱت آسو ڤٱنٱ(جگا جگا ڤ کار گرتن)",
        "summary": "چکسٱ",
        "subject": "ذاسوٙن/سأرتال:",
        "minoredit": "یٱ یاٛ ڤیرایش کوچکٱ",
index d5dd594..5286b97 100644 (file)
        "resettokens-watchlist-token": "Žetonas skirtas interneto pateikčiai (Atom/RSS) [[Special:Watchlist|pakeitimai puslapiuose, kuriuose jūs stebite]]",
        "resettokens-done": "Žetonų atnaujinimas.",
        "resettokens-resetbutton": "Atnaujinti pasirinktus žetonus",
-       "bold_sample": "Paryškintas tekstas",
-       "bold_tip": "Paryškinti tekstą",
-       "italic_sample": "Tekstas kursyvu",
-       "italic_tip": "Tekstas kursyvu",
-       "link_sample": "Nuorodos pavadinimas",
-       "link_tip": "Vidinė nuoroda",
-       "extlink_sample": "http://www.pavyzdys.lt nuorodos pavadinimas",
-       "extlink_tip": "Išorinė nuoroda (nepamirškite http:// priedėlio)",
-       "headline_sample": "Skyriaus pavadinimas",
-       "headline_tip": "Antro lygio skyriaus pavadinimas",
-       "nowiki_sample": "Čia įterpkite neformuotą tekstą",
-       "nowiki_tip": "Ignoruoti wiki formatą",
-       "image_sample": "Pavyzdys.jpg",
-       "image_tip": "Įterpta rinkmena",
-       "media_sample": "Pavyzdys.ogg",
-       "media_tip": "Nuoroda į rinkmeną",
-       "sig_tip": "Jūsų parašas bei laikas",
-       "hr_tip": "Horizontali linija (naudokite saikingai)",
        "summary": "Paaiškinimas:",
        "subject": "Tema:",
        "minoredit": "Tai smulkus pataisymas",
        "emailuser-title-target": "Siųsti el. pašto žinutę {{GENDER:$1|naudotojui|naudotojai}}",
        "emailuser-title-notarget": "El. pašto vartotojas",
        "emailpagetext": "Jūs galite pasinaudoti šiuo pavyzdžiu, norėdami nusiųsti elektroninį laišką {{GENDER:$1|šiam naudotojui|šiai naudotojai}}.\nElektroninio pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas tam, kad gavėjas galėtų tiesiogiai jums atsakyti.",
-       "defemailsubject": "{{SITENAME}} el. pašto iš vartotojo \" $1 \"",
+       "defemailsubject": "{{SITENAME}} laiškas iš naudotojo „$1“",
        "usermaildisabled": "Naudotojo elektroninis paštas išjungtas",
        "usermaildisabledtext": "Jūs negalite siūlsti el. laiško kitiems šio wiki projekto naudotojams.",
        "noemailtitle": "Nėra el. pašto adreso",
index 3d492d5..6d0a7d8 100644 (file)
        "resetpass-submit-cancel": "Atsaukt",
        "passwordreset-username": "Slāgvuords:",
        "passwordreset-email": "E-posta adress:",
-       "bold_sample": "Pamalnais roksts",
-       "bold_tip": "Pamalnais roksts",
-       "italic_sample": "Sleipais roksts",
-       "italic_tip": "Sleipais roksts",
-       "link_sample": "Saitys pasauka",
-       "link_tip": "Vydyskuo saita",
-       "extlink_sample": "http://www.example.com saitys pasauka",
-       "extlink_tip": "Uorejuo saite (naaizmierst suokumā dalikt \"http://\")",
-       "headline_sample": "Viersroksta teksts",
-       "headline_tip": "2 leidzīņa viersroksts",
-       "nowiki_sample": "Ite rokst naformatietu tekstu",
-       "nowiki_tip": "Najimt vārā wiki formatiejumu",
-       "image_sample": "Paraugs.jpg",
-       "image_tip": "Paguļdeits fails",
-       "media_sample": "Paraugs.ogg",
-       "media_tip": "Saite iz multimediju failu",
-       "sig_tip": "Tovs paroksts ar laika atzeimi",
-       "hr_tip": "Horizontaluo lineja (nalīc bez vajadzeibys)",
        "summary": "Kūpsavylkums",
        "subject": "Tema/viersroksts:",
        "minoredit": "nanūzeimeigs lobuojums",
index ca6a195..d11bc2e 100644 (file)
        "changeemail-none": "(pakhat mah)",
        "changeemail-password": "I {{SITENAME}} thurûk:",
        "changeemail-submit": "E-chenhmun thlâk rawh",
-       "bold_sample": "Hawrawp thau",
-       "bold_tip": "Hawrawp thau",
-       "italic_sample": "Hawrawp äwn",
-       "italic_tip": "Hawrawp äwn",
-       "link_sample": "Zawmna hming",
-       "link_tip": "Inzawm chhawnna",
-       "extlink_sample": "http://www.example.com zawmna hming",
-       "extlink_tip": "Pawnlam zawmna (http:// tih hmabet kha theihnghilh suh la)",
-       "headline_sample": "Thupui",
-       "headline_tip": "Chhawng 2-na thupui",
-       "nowiki_sample": "Hetah hian thu siamrem sa ni lo dahlut rawh",
-       "nowiki_tip": "Wiki siamrem ngaihthah rawh",
-       "image_tip": "Taksa telh",
-       "media_tip": "Taksa zawmna",
-       "sig_tip": "I hmingnem leh hun",
-       "hr_tip": "Rin khamphei (ren deuh la)",
        "summary": "A thu tlangpui (laktawi):",
        "subject": "Thupui:",
        "minoredit": "Hei hi siamţhatna tenau a ni",
index 70f259b..f8503f3 100644 (file)
        "resetpass-temp-password": "رمز جایگزین",
        "resetpass-expired": "رمز ایشانه اعتبار ناره.لطفا یه رمز نو سیخوتون بونیت.",
        "passwordreset": "تعویض رمز",
-       "bold_sample": "مأتن ھ گأپ نیما",
-       "bold_tip": "مأتن ھ گأپ نیما",
-       "italic_sample": "مأتن ھ شیکأستە",
-       "italic_tip": "مأتن ھ شیکأستە",
-       "link_sample": "عۉنڤان ھ لینک",
-       "link_tip": "لینک ھ داخلی",
-       "extlink_sample": "http://www.example.com عۉنڤان ھ لینک",
-       "extlink_tip": "(ڤە خاطیر بیسپار http:// prefix)\nلینک ھ خاریجی",
-       "headline_sample": "سأرخأط مأتن",
-       "headline_tip": "2سأرخأط یکسان",
-       "nowiki_sample": "مأتن شیکل نأدائە یا فۉرمأت نأڤابیدھ رنە ئبچۉ بنین",
-       "nowiki_tip": "زھ فۉرمأت کیردأن یا شیکل دائن ڤیکی دس ڤیردار",
-       "image_tip": "فایل مۉحاط ڤابید",
-       "media_tip": "لینک ھ فایل",
-       "sig_tip": "ئیمضا ئیشا ڤ بأرچأسب زیموٙن",
-       "hr_tip": "خأط ئوفۉقی (کأم ئیستیفادھ کۉنین)",
        "summary": "خۉلاصە:",
        "minoredit": "ئی یە ئیصلاح کوٙچیر ڤابی",
        "watchthis": "پیگیری ئی بألگە",
index b50b012..8d79167 100644 (file)
        "history": "hronoloģija",
        "history_short": "Vēsture",
        "history_small": "vēsture",
-       "updatedmarker": "atjaunināts kopš mana pēdējā apmeklējuma",
+       "updatedmarker": "atjaunināts kopš tava pēdējā apmeklējuma",
        "printableversion": "Drukājama versija",
        "permalink": "Pastāvīgā saite",
        "print": "Drukāt",
        "createacct-another-email-ph": "Ievadiet e-pasta adresi",
        "createaccountmail": "Izmantot nejauši ģenerētu pagaidu paroli un nosūtīt to uz norādīto e-pasta adresi",
        "createacct-realname": "Īstais vārds (nav obligāts)",
-       "createacct-reason": "Iemesls",
+       "createacct-reason": "Iemesls (publiski redzams)",
        "createacct-reason-ph": "Kāpēc jūs veidojat citu kontu",
        "createacct-submit": "Izveidot savu kontu",
        "createacct-another-submit": "Izveidot citu dalībnieka kontu",
        "password-login-forbidden": "Šī lietotājvārda un paroles izmantošana ir aizliegta.",
        "mailmypassword": "Atiestatīt paroli",
        "passwordremindertitle": "Jauna pagaidu parole no {{SITENAME}}s",
-       "passwordremindertext": "Kāds (iespējams, Tu pats, no IP adreses $1)\nlūdza, lai nosūtām Tev jaunu {{SITENAME}} ($4) paroli.\nLietotajam $2 pagaidu parole tagad ir $3.\nLudzu, nomaini paroli, kad esi veiksmīgi iekļuvis iekšš.\nTavas pagaidu paroles derīguma termiņš beigsies pēc {{PLURAL:$5|$5 dienām|$5 dienas|$5 dienām}}.\n\nJa paroles pieprasījumu bija nosūtījis kāds cits, vai arī tu atcerējies savu veco paroli, šo var ignorēt. Vecā parole joprojām darbojas.",
+       "passwordremindertext": "Kāds (no IP adreses $1)\nlūdza, lai nosūtām tev jaunu {{SITENAME}} ($4) paroli.\nLietotajam $2 izveidota pagaidu parole $3. Ja tāds bija tavs mērķis, tagad tev jāpieslēdzas un jānomaina parole. Tavas pagaidu paroles derīguma termiņš beigsies pēc {{PLURAL:$5|$5 dienām|$5 dienas|$5 dienām}}.\n\nJa paroles pieprasījumu bija nosūtījis kāds cits, vai arī tu atcerējies savu veco paroli, šo var ignorēt. Vecā parole joprojām darbojas.",
        "noemail": "Lietotājs \"$1\" nav reģistrējis e-pasta adresi.",
        "noemailcreate": "Tev jānorāda derīgu e-pasta adresi",
        "passwordsent": "Esam nosūtījuši jaunu paroli uz e-pasta adresi, kuru ir norādījis lietotājs $1. Lūdzu, nāc iekšā ar jauno paroli, kad būsi to saņēmis.",
        "changeemail-nochange": "Lūdzu, ievadi atšķirīgu jauno e-pasta adresi.",
        "resettokens-tokens": "Marķieri:",
        "resettokens-token-label": "$1 (šībrīža vērtība: $2)",
-       "bold_sample": "Teksts treknrakstā",
-       "bold_tip": "Teksts treknrakstā",
-       "italic_sample": "Teksts kursīvā",
-       "italic_tip": "Teksts kursīvā",
-       "link_sample": "Lapas nosaukums",
-       "link_tip": "Iekšējā saite",
-       "extlink_sample": "http://www.example.com saites apraksts",
-       "extlink_tip": "Ārējā saite (neaizmirsti sākumā pierakstīt \"http://\")",
-       "headline_sample": "Virsraksta teksts",
-       "headline_tip": "2. līmeņa virsraksts",
-       "nowiki_sample": "Šeit raksti neformatētu tekstu",
-       "nowiki_tip": "Ignorēt wiki formatējumu",
-       "image_sample": "Piemers.jpg",
-       "image_tip": "Ievietots attēls",
-       "media_sample": "Piemers.ogg",
-       "media_tip": "Faila saite",
-       "sig_tip": "Tavs paraksts ar laika atzīmi",
-       "hr_tip": "Horizontāla līnija (neizmanto lieki)",
        "summary": "Kopsavilkums:",
        "subject": "Temats:",
        "minoredit": "Maznozīmīgs labojums",
        "anonpreviewwarning": "''Tu neesi ienācis. Saglabājot lapu, Tava IP adrese tiks ierakstīta šīs lapas hronoloģijā.''",
        "missingsummary": "'''Atgādinājums''': Tu neesi norādījis izmaiņu kopsavilkumu. Vēlreiz klikšķinot uz \"Saglabāt lapu\", Tavas izmaiņas tiks saglabātas bez kopsavilkuma.",
        "missingcommenttext": "Lūdzu, ievadi komentāru.",
-       "missingcommentheader": "'''Atgādinājums:''' Tu šim komentāram neesi norādījis virsrakstu/tematu.\nJa tu vēlreiz spiedīsi uz \"$1\", tavas izmaiņas tiks saglabātas bez virsraksta.",
+       "missingcommentheader": "<strong>Atgādinājums:</strong> Šim komentāram nav norādīts temats.\nVēlreiz spiežot uz \"$1\", tavs labojums tiks saglabāts bez tā.",
        "summary-preview": "Labojuma kopsavilkuma priekšskatījums:",
        "subject-preview": "Temata pirmskats:",
        "blockedtitle": "Dalībnieks ir bloķēts.",
        "nocreate-loggedin": "Tev nav atļaujas veidot jaunas lapas.",
        "sectioneditnotsupported-title": "Sadaļa rediģēšana nav atbalstīta",
        "sectioneditnotsupported-text": "Sadaļu rediģēsana šajā lapā nav atļauta.",
+       "modeleditnotsupported-title": "Labošana nav atbalstīta",
+       "modeleditnotsupported-text": "Satura modelim \"$1\" labošana nav atbalstīta.",
        "permissionserrors": "Atļauju kļūda",
        "permissionserrorstext": "Tev nav atļauts veikt šo darbību {{PLURAL:$1|šādu iemeslu|šāda iemesla|šādu iemeslu}} dēļ:",
        "permissionserrorstext-withaction": "Tev nav atļauts $2 {{PLURAL:$1|šādu iemeslu|šāda iemesla|šādu iemeslu}} dēļ:",
        "editpage-invalidcontentmodel-text": "Satura modelis \"$1\" nav atbalstīts.",
        "editpage-notsupportedcontentformat-title": "Satura formāts nav atbalstīts",
        "editpage-notsupportedcontentformat-text": "Satura formātu $1 neatbalsta satura modelis $2.",
+       "slot-name-main": "Galvenais",
        "content-model-wikitext": "vikiteksts",
        "content-model-text": "vienkāršs teksts",
        "content-model-javascript": "JavaScript kods",
        "prefixindex": "Meklēt pēc virsraksta pirmajiem burtiem",
        "prefixindex-namespace": "Visas lapas ar prefiksu ($1 vārdtelpa)",
        "prefixindex-submit": "Rādīt",
+       "prefixindex-strip": "Rezultātos paslēpt prefiksu",
        "shortpages": "Īsākās lapas",
        "longpages": "Garākās lapas",
        "deadendpages": "Lapas bez izejošām saitēm",
        "dellogpagetext": "Šajā lapā ir pēdējo dzēsto lapu saraksts.",
        "deletionlog": "dzēšanas reģistrs",
        "log-name-create": "Lapu izveides žurnāls",
+       "logentry-create-create": "$1 {{GENDER:$2|izveidoja}} lapu $3",
        "reverted": "Atjaunots uz iepriekšējo versiju",
        "deletecomment": "Iemesls:",
        "deleteotherreason": "Cits/papildu iemesls:",
        "sessionfailure": "Ir radusies problēma ar sesijas autentifikāciju;\nšī darbība ir atcelta, lai novērstu lietotājvārda iespējami ļaunprātīgu izmantošanu.\nLūdzu, spied \"''back''\" un atjaunini iepriekšējo lapu. Tad mēģini vēlreiz.",
        "changecontentmodel": "Mainīt lapas satura modeli",
        "changecontentmodel-legend": "Mainīt satura modeli",
-       "changecontentmodel-title-label": "Lapas nosaukums",
-       "changecontentmodel-model-label": "Jauns satura modelis",
+       "changecontentmodel-title-label": "Lapas nosaukums:",
+       "changecontentmodel-model-label": "Jaunais satura modelis:",
        "changecontentmodel-reason-label": "Iemesls:",
        "changecontentmodel-submit": "Mainīt",
        "changecontentmodel-success-title": "Satura modelis tika izmainīts",
        "fix-double-redirects": "Automātiski izmainīt visas pāradresācijas, kas ved uz sākotnējo nosaukumu",
        "move-leave-redirect": "Atstāt pāradresāciju",
        "protectedpagemovewarning": "'''Brīdinājums:''' Šī lapa ir aizsargāta, tikai lietotāji ar administratora privilēģijām var to pārvietot.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
-       "semiprotectedpagemovewarning": "'''Piezīme:''' Šī lapa ir aizsargāta, tikai reģistrētie lietotāji var to pārvietot.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
+       "semiprotectedpagemovewarning": "<strong>Piezīme:</strong> Šī lapa ir aizsargāta tā, lai tikai pašpārbaudītie lietotāji varētu to pārvietot.\nPēdējais reģistra ieraksts ir apskatāms zemāk:",
        "move-over-sharedrepo": "[[:$1]] jau pastāv koplietotā repozitorijā. Pārvietošana uz šo nosaukumu aizstās koplietoto failu.",
        "file-exists-sharedrepo": "Šis faila nosaukums jau tiek izmantots kopīgajā failu krātuvē.\nLūdzu, izvēlies citu nosaukumu.",
        "export": "Eksportēt lapas",
        "importcantopen": "Nevarēja atvērt importējamo failu",
        "importbadinterwiki": "Slikta starpviki saite",
        "importsuccess": "Importēšana pabeigta!",
-       "importnosources": "Tiešā hronoloģijas augšuplāde ir atslēgta. Nav definēts neviens ''Transwiki'' importa avots (''source'').",
+       "importnosources": "Nav definēta neviena vikivietne, no kuras importēt un tiešā hronoloģijas augšupielāde ir atslēgta.",
        "importnofile": "Neviens importējamais fails netika augšupielādēts.",
        "importuploaderrorsize": "Augšupielādēt importējamo failu neizdevās. \nŠis fails ir lielāks par atļauto augšupielādes lielumu.",
        "importuploaderrorpartial": "Importējamā faila augšupielāde neizdevās.\nFails tika tikai daļēji importēts.",
        "tooltip-feed-atom": "Šīs lapas Atom barotne",
        "tooltip-t-contributions": "{{GENDER:$1|Šī dalībnieka|Šīs dalībnieces}} ieguldījumu uzskaitījums",
        "tooltip-t-emailuser": "Sūtīt e-pastu {{GENDER:$1|šim dalībniekam|šai dalībniecei}}",
+       "tooltip-t-info": "Vairāk informācijas par šo lapu",
        "tooltip-t-upload": "Augšupielādēt failus",
        "tooltip-t-specialpages": "Visu īpašo lapu uzskaitījums",
        "tooltip-t-print": "Drukājama lapas versija",
        "diff-form-submit": "Parādīt atšķirības",
        "permanentlink": "Pastāvīgā saite",
        "permanentlink-revid": "Versijas ID",
+       "permanentlink-submit": "Doties uz versiju",
        "newsection": "Jauna sadaļa",
        "newsection-page": "Mērķa lapa",
+       "newsection-submit": "Doties uz lapu",
        "dberr-problems": "Atvainojiet!\nŠai vietnei ir radušās tehniskas problēmas.",
        "dberr-again": "Uzgaidiet dažas minūtes un pārlādējiet šo lapu.",
        "dberr-info": "(Nevar piekļūt datubāzei: $1)",
        "htmlform-chosen-placeholder": "Izvēlieties iespēju",
        "htmlform-cloner-create": "Pievienot vairāk",
        "htmlform-cloner-delete": "Noņemt",
+       "htmlform-cloner-required": "Vismaz viena vērtība ir obligāta.",
        "htmlform-date-placeholder": "GGGG-MM-DD",
        "htmlform-title-not-creatable": "\"$1\" nav izveidojams lapas nosaukums",
        "htmlform-title-not-exists": "$1 nepastāv.",
        "randomrootpage": "Nejauša saknes lapa",
        "log-action-filter-block": "Bloķēšanas veids:",
        "log-action-filter-protect": "Aizsardzības veids:",
+       "log-action-filter-rights": "Tiesību izmaiņas veids:",
        "log-action-filter-suppress": "Cenzēšanas veids:",
        "log-action-filter-upload": "Augšupielādes veids:",
        "log-action-filter-block-unblock": "Atbloķēšana",
index 5924ed2..bf2ca77 100644 (file)
        "cannotchangeemail": "郵址不可更於此wiki",
        "emaildisabled": "是站不可遣函也。",
        "accountcreated": "簿增矣",
-       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|書]])簿增矣。",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|書]])簿增矣。",
        "createaccount-title": "於{{SITENAME}}增簿",
        "createaccount-text": "有人以汝電郵於{{SITENAME}}增簿。簿名為 \"$2\" ($4)。符節為 \"$3\" 。汝應登而更符節。\n\n如簿誤增,汝可略之。",
        "login-throttled": "汝嘗登簿甚矣。\n請候 $1 而試之。",
        "changeemail-password": "汝 {{SITENAME}} 之符節",
        "changeemail-submit": "更郵址",
        "changeemail-throttled": "汝嘗登簿甚矣。\n請候 $1 而試之。",
-       "bold_sample": "粗體",
-       "bold_tip": "粗體",
-       "italic_sample": "斜體",
-       "italic_tip": "斜體",
-       "link_sample": "鏈",
-       "link_tip": "鏈內",
-       "extlink_sample": "http://www.example.com 鍵 題",
-       "extlink_tip": "冠 http:// 以外鏈",
-       "headline_sample": "題",
-       "headline_tip": "二題",
-       "nowiki_sample": "此不排版",
-       "nowiki_tip": "不排維基之版",
-       "image_tip": "嵌檔",
-       "media_tip": "鏈檔",
-       "sig_tip": "署名刻時",
-       "hr_tip": "縱線,慎用之",
        "summary": "概:",
        "subject": "題:",
        "minoredit": "細謹",
        "showpreview": "示覽",
        "showdiff": "示異",
        "anoneditwarning": "'''警示:'''子未登簿,若確纂,IP將誌。茍[$1 登]或[$2 開戶口],是纂欲存以子名,及他效。",
-       "anonpreviewwarning": "''子未登簿,IP將誌。''",
+       "anonpreviewwarning": "子未登簿,IP將誌。",
        "missingsummary": "'''醒示:'''子未概之,復「$1」則文倍焉。",
        "missingcommenttext": "請贊之",
        "missingcommentheader": "'''醒示:'''子未概標之,復「$1」則文倍焉。",
index 5326de6..8c4406c 100644 (file)
        "newpassword": "Ağani P'arola:",
        "passwordreset": "Ağne pʼarola-çkimi moncğoni",
        "passwordreset-username": "Skani maxmare-coxo:",
-       "bold_sample": "Mçxu nçʼara",
-       "bold_tip": "Mçxu nçʼara",
-       "italic_sample": "Elakteri nçʼara",
-       "italic_tip": "Elakteri nçʼara",
-       "link_sample": "Kʼontʼaktʼiş dudicoxo",
-       "link_tip": "Doloxeni linkʼi",
-       "extlink_sample": "http://www.example.com adresiş oxo3ʼonapa",
-       "extlink_tip": "Galeni kʼontʼaktʼi (Adresiş dudis http:// ukʼatit)",
-       "headline_sample": "Dudicoxoşi nçʼara",
-       "headline_tip": "2. derece dudicoxo",
-       "nowiki_sample": "Oxoşkveri formatʼi nçʼara-tkvani ak doçʼarit.",
-       "nowiki_tip": "vikʼiş formatʼi ipʼtʼali qʼvi.",
-       "image_tip": "Doxveri dosya",
-       "media_tip": "Media dosyasişa kʼontʼaktʼi",
-       "sig_tip": "Xeşçʼara-tkvani do tarixi",
-       "hr_tip": "Horizontʼali ğara (m3ika ixmarit)",
        "summary": "Mkʼule nçʼarate:",
        "subject": "Tema/dudi-coxo:",
        "minoredit": "Çʼitʼa oktiroba",
index 6670969..d887aff 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|अहाँके साकांक्षसूची के पृष्ठसभ में परिवर्तन सभ]] के वेब फिट (Atom/RSS) लेल स्तोक",
        "resettokens-done": "टोकन रीसेट भेल अछि।",
        "resettokens-resetbutton": "चुनल टोकन रीसेट करी",
-       "bold_sample": "मोट पाठ",
-       "bold_tip": "मोट पाठ",
-       "italic_sample": "कटि लेखन",
-       "italic_tip": "कटि लेखन",
-       "link_sample": "लिङ्क शीर्षक",
-       "link_tip": "आन्तरिक लिङ्क",
-       "extlink_sample": "http://www.example.com लिङ्क शीर्षक",
-       "extlink_tip": "बाह्य लिङ्क (यादि राखी http:// उपसर्ग)",
-       "headline_sample": "शीर्षक पाठ",
-       "headline_tip": "द्वितीय-स्तर शीर्षक",
-       "nowiki_sample": "अप्रारूपित पाठ एतय राखी",
-       "nowiki_tip": "विकी प्रारूपण नजरअन्दाज करी",
-       "image_sample": "उदाहरण.jpg",
-       "image_tip": "समाहित चित्र",
-       "media_sample": "उदाहरण.ogg",
-       "media_tip": "मिडिया फाइल लिङ्क",
-       "sig_tip": "अहाँक हस्ताक्षर समयक मोहरकसंग",
-       "hr_tip": "अक्षांशीय पंक्ति (अल्प उपयोग)",
        "summary": "सारांश:",
        "subject": "विषय:",
        "minoredit": "अल्प सम्पादन",
index e91de7e..49295c1 100644 (file)
        "resettokens-token-label": "$1 (siki bijiné:$2)",
        "resettokens-done": "Token wis disetel maning.",
        "resettokens-resetbutton": "Nyetel maning token sing dipilih",
-       "bold_sample": "Tèks kiye bakal dicithak kandel",
-       "bold_tip": "Cithak kandel",
-       "italic_sample": "Teks kiye bakal dicithak miring",
-       "italic_tip": "Teks kiye bakal dicithak miring",
-       "link_sample": "Judhul pranala",
-       "link_tip": "Pranala internal",
-       "extlink_sample": "http://www.example.com judhul pranala",
-       "extlink_tip": "Pranala njaba (aja kelalen wiwitan http:// )",
-       "headline_sample": "Tèks judhul",
-       "headline_tip": "Subbagian tingkat 1",
-       "nowiki_sample": "Lebokna teks sing ora bakal diformat nang kene",
-       "nowiki_tip": "Aja nganggo format wiki",
-       "image_sample": "Conto.jpg",
-       "image_tip": "Ngaweh berkas",
-       "media_sample": "Conto.ogg",
-       "media_tip": "Pranala berkas media",
-       "sig_tip": "Tapak astane Rika nganggo tandha wektu",
-       "hr_tip": "Garis horisontal",
        "summary": "Ringkesan:",
        "subject": "Subyèk:",
        "minoredit": "Kiye suntingan cilik",
index bf50721..6e44051 100644 (file)
        "passwordreset-username": "Тиить лемоц",
        "passwordreset-domain": "Домен:",
        "passwordreset-emailtitle": "Серматфтомать колга {{SITENAME}}са",
-       "bold_sample": "Эчке сёрмадома",
-       "bold_tip": "Эчке сёрмадома",
-       "italic_sample": "Комафтф сёрмадома",
-       "italic_tip": "Комафтф сёрмадома",
-       "link_sample": "Сюлмафксонь конякс",
-       "link_tip": "Потмоширень сюлмафкс",
-       "extlink_sample": "http://www.example.com кепотькс",
-       "extlink_tip": "Ушеширень сюлмафкс (киртть мяльса http:// инголькс)",
-       "headline_sample": "Конякссонь валхне",
-       "headline_tip": "2-це аськолксонь конякс",
-       "nowiki_sample": "Сувафтомс тязк форматфтома текст",
-       "nowiki_tip": "Нулгодемс Викить текст латцемась",
-       "image_tip": "Путф медиа файлсь",
-       "media_tip": "Файлть сюлмафкссь",
-       "sig_tip": "Тонь кядьтяшксоце пинге мархта",
-       "hr_tip": "Туркс китькс (тевс нолдамс ванфтозь)",
        "summary": "Нюрьхкяня лихтема:",
        "subject": "Тема/конякс:",
        "minoredit": "Тя ёмланя видептема",
index a29d435..43938bb 100644 (file)
        "resettokens-watchlist-token": "Token ho an'ny fahna web (Atom/RSS) ho an'ny  [[Special:Watchlist|fanovana ny pejy ao amin'ny lisitry ny pejy arahanao]]",
        "resettokens-done": "Natao reset ny token",
        "resettokens-resetbutton": "Hanao reset ny token voafidy",
-       "bold_sample": "Soratra matavy",
-       "bold_tip": "Soratra matavy",
-       "italic_sample": "Sora-mandry",
-       "italic_tip": "Sora-mandry",
-       "link_sample": "Soratra eo amin'ny rohy",
-       "link_tip": "Rohy anatiny",
-       "extlink_sample": "http://www.example.com rohy lohateny",
-       "extlink_tip": "Rohy ivelany (tadidio ny tovana http://)",
-       "headline_sample": "Lohateny anankiray",
-       "headline_tip": "Lohatena ambaratonga faha 2",
-       "nowiki_sample": "Apetraho eto ny lahatsoratra tsy manaraka format",
-       "nowiki_tip": "Aza ampiasaina ny formatage wiki",
-       "image_sample": "ohatra.jpg",
-       "image_tip": "sary",
-       "media_sample": "Ohatra.ogg",
-       "media_tip": "Rohy rakitra sary sy/na feo",
-       "sig_tip": "Ny sonianao miaraka amin'ny daty",
-       "hr_tip": "Tsipika mitsivalana (aza anaranam-po loatra)",
        "summary": "Ambangovangony:",
        "subject": "Lohateny:",
        "minoredit": "Fanovàna kely",
index 24e70de..3cde613 100644 (file)
        "retypenew": "Пеҥгыдемдыза у шолыпмутым:",
        "resetpass-submit-loggedin": "Шолыпмутым вашталташ",
        "passwordreset-username": "Пайдаланышын лӱмжӧ",
-       "bold_sample": "Кӱжгӧ текст",
-       "bold_tip": "Кӱжгӧ текст",
-       "italic_sample": "Шӧрын текст",
-       "italic_tip": "Шӧрын текст",
-       "link_sample": "Кылверын лӱмжӧ",
-       "link_tip": "Кӧргысӧ кылвер",
-       "extlink_sample": "http://www.example.com кылверын лӱмжӧ",
-       "extlink_tip": "Ӧрдыж кылвер (http:// префиксым ит мондо)",
-       "headline_sample": "Вуймут",
-       "headline_tip": "2-шо кӱкшытан вуймут",
-       "nowiki_sample": "Форматироватлыдыме текстым тышке шынде",
-       "nowiki_tip": "Вики-форматированийым шотыш налаш огыл",
-       "image_tip": "Пуртымо сӱрет",
-       "media_tip": "Пуртымо медиа-файл",
-       "sig_tip": "Тыйын кидпалет, шындыме жап да кече",
-       "hr_tip": "Тореш (чӱчкыдын ит кучылт)",
        "summary": "Тӧрлатымаш нерген:",
        "subject": "Теме/вуймут:",
        "minoredit": "Тиде изи вашталтыш",
index b56f065..b78c96c 100644 (file)
                        "Zakiy",
                        "Vlad5250",
                        "S Kartika",
-                       "NoiX180"
+                       "NoiX180",
+                       "Pitnia Ayu Saputri"
                ]
        },
-       "tog-underline": "Garih bawah pautan:",
+       "tog-underline": "Garih bawahi 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-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 jikok maninggakan laman suntiang sabalun manyimpan parubahan",
+       "tog-useeditwarning": "Ingekan ambo kok maninggakan laman suntiang sabalun manyimpan parubahan",
        "tog-prefershttps": "Selalu gunokan koneksi aman katiko masuak log",
        "tog-showrollbackconfirmation": "Tampilkan konfirmasi katiko mangklik pautan pangambalian",
+       "tog-requireemail": "Paralu email untuak maatua ulang kato sandi",
        "underline-always": "Taruih",
-       "underline-never": "Indak pernah",
+       "underline-never": "Indak panah",
        "underline-default": "Kulik atau pangaturan paramban web",
        "editfont-style": "Gaya tulisan komputer pado kotak panyuntiangan:",
        "editfont-monospace": "Tulisan Monospace",
        "virus-scanfailed": "Pamindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus indak dikenal:",
        "logouttext": "<strong>Sanak alah kalua log</strong>\n\nMohon diingek kalau babarapo laman mungkin masih tampil cando Sanak alun kalua log. Silakan untuak mambarasiahan singgahan panjalajah web Sanak.",
+       "logging-out-notify": "Sanak sadang kalua log, mohon manunggu sabanta",
+       "logout-failed": "Indak bisa kalua kini:$1",
        "cannotlogoutnow-title": "Indak bisa kalua kini",
        "cannotlogoutnow-text": "Indak bisa kalua katiko manggunoan $1.",
        "welcomeuser": "Salamaik datang, $1!",
        "createaccountmail": "Mohon pakai kato sandi samantaro dan kirim ka alamaik surek elektronik nan alah disabuikkan.",
        "createaccountmail-help": "Indak dapek digunoan untuak mambuek akun urang lain tanpa tau kato sandinyo.",
        "createacct-realname": "Namo asli (opsional)",
-       "createacct-reason": "Alasan",
+       "createacct-reason": "Alasan (log publik)",
        "createacct-reason-ph": "Manga Sanak mambuek akun lain",
+       "createacct-reason-help": "Pasan yang ditunjuakan dalam log pambuatan akun",
        "createacct-submit": "Buek akun Sanak",
        "createacct-another-submit": "ګڼون جوړول",
        "createacct-continue-submit": "Lanjuikan mambuek akun",
        "createacct-benefit-body2": "{{PLURAL:$1|laman}}",
        "createacct-benefit-body3": "{{PLURAL:$1|panyuntiang}} tarakhia",
        "badretype": "Kato sandi nan Sanak masuakan salah.",
+       "usernameinprogress": "Pambuatan akun untuak namo pangguno ko sadang dalam proses. Mohon manunggu",
        "userexists": "Namo pangguno nan dipiliah alah tapakai.\nPiliah namo nan lain.",
        "createacct-normalization": "Namo pangguno sanak akan disasuaian manjadi \"$2\" karano batasan teknis.",
        "loginerror": "Kasalahan masuak log",
        "login-migrated-generic": "Akun sanak alah dipindahan, namo pangguno Sanak alah indak tadaftar ini wiki ko.",
        "loginlanguagelabel": "Baso: $1",
        "suspicious-userlogout": "Pamintaan Sanak untuak kalua log ditulak karano tampaknyo dikirim oleh paramban nan rusak atau proksi panyinggah.",
+       "createacct-another-realname-tip": "Namo usali basifaik opsional. Kok Sanak mamakainyo, namo tu digunoan untuak manandoan jariah pangguno Sanak.",
        "pt-login": "Masuak log",
        "pt-login-button": "Masuak log",
        "pt-login-continue-button": "Lanjuikan masuak log",
        "changepassword-success": "Kato sandi Sanak alah berhasil dituka!",
        "changepassword-throttled": "Sanak alah acok bana mancubo masuak log. Mohon tunggu $1 sabalun mancubo baliak.",
        "botpasswords": "Kato sandi bot",
+       "botpasswords-summary": "<em>Kato sandi bot</em> mamungkinkan akses ka akun pangguno manggunokan API jo indak manggunokan kredensial masuak log utamo akun tasabuik. Hak pangguno nan tasadio katiko masuak log jo kato sandi bot mungkin ka dibatasi.\n\nKok Sanak indak tau dek a Sanak ka malakukan hal ko, sarancaknyo jan lakukan. Samustinyo indak ado urang lain nan buliah mamintak Sanak untuak mambuek jo manyarahan kato sandi bot ko kapadonyo.",
        "botpasswords-disabled": "Kato sandi bot indak diaktifan.",
        "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-label-cancel": "Batalan",
        "botpasswords-label-delete": "Hapuih",
        "botpasswords-label-resetpassword": "Setel ulang kato sandi",
+       "botpasswords-label-grants": "Akses nan dapek diagiah:",
+       "botpasswords-help-grants": "Izin ka akses tatantu alah dipunyoi akun pangguno Sanak. Maaktifkan sabuah hak di siko indak maagiah akses ka akses lain nan indak dimiliki dek akun pangguno Sanak. Caliak [[Special:ListGrants|daftar hak akses]] untuak informasi salangkoknyo.",
        "botpasswords-label-grants-column": "Izin diagiah",
        "botpasswords-bad-appid": "Namo bot \"$1\" indak sah.",
        "botpasswords-insert-failed": "Gagal manambah namo bot \"$1\". Alah ditambahan sabalun iko?",
        "resettokens-watchlist-token": "Token untuak sindikasi web (Atom/RSS) dari [[Special:Watchlist|parubahan di daftar pantauan Sanak]]",
        "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Reset token nan dipiliah",
-       "bold_sample": "Teks taba",
-       "bold_tip": "Teks taba",
-       "italic_sample": "Teks miriang",
-       "italic_tip": "Teks miriang",
-       "link_sample": "Judul pautan",
-       "link_tip": "Pautan dalam",
-       "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",
-       "nowiki_sample": "Masuakkan disiko teks nan indak baformat",
-       "nowiki_tip": "Abaikan format wiki",
-       "image_tip": "Cantumkan berkas",
-       "media_tip": "Pautan berkas",
-       "sig_tip": "Tandotangan sanak jo wakatu",
-       "hr_tip": "Garih mandata",
        "summary": "Ikhtisar:",
        "subject": "Perihal:",
        "minoredit": "Suntiangan ketek",
        "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.",
        "systemblockedtext": "Namo pangguno atau alamaik IP Sanak alah disakek sacaro otomatis dek MediaWiki.\nAlasan nan diagiah adolah:\n\n:<em>$2</em>\n\n* Disakek sajak: $8\n* Sakek kadaluwarsa pado: $6\n* Sasaran panyakekan: $7\n\nAlamaik IP Sanak kini adolah $3\nMohon saratokan sadoalah parincian di ateh dalam satiok patanyoan nan Sanak ajukan.",
        "blockednoreason": "indak ado alasan nan diagiah.",
+       "blockedtext-composite": "Namo pangguno atau alamaik IP Sanak alah disakek sacaro otomatis dek MediaWiki.\nAlasan nan diagiah adolah:\n\n:<em>$2</em>\n\n* Disakek sajak: $8\n* Sakek kadaluwarsa pado: $6\n* Sasaran panyakekan: $7\n\nAlamaik IP Sanak kini adolah $3\nMohon saratokan sadoalah parincian di ateh dalam satiok patanyoan nan Sanak ajukan.",
        "blockedtext-composite-ids": "Panyakekan ID relevan: $1 (alamaik IP Sanak juo dapek dicekal)",
        "blockedtext-composite-no-ids": "Alamaik IP Sanak muncua dalam daftar itam gando",
        "blockedtext-composite-reason": "Ado panyakekan bagando ka bakeh akun Sanak dan/atau alamaik IP Sanak.",
        "unsupported-content-diff2": "Pabedaan antaro model konten $1 jo $2 indak didukuang di wiki ko.",
        "deprecated-self-close-category": "Laman nan menggunoan tag HTML tatutuik-surang indak sah",
        "deprecated-self-close-category-desc": "Laman ko manganduang tag HTML tatutuik-surang nan indak sah, sarupo <code>&lt;b/></code> atau <code>&lt;span/></code>.  Parilaku tag sarupo ko ka sagiro barubah supayo konsisten jo spesifikasi HTML5, jadi panggunoannyo dalam teks wiki indak lai disarankan.",
+       "duplicate-args-warning": "<strong>Paringatan:</strong> [[:$1]] maimbau [[:$2]] jo nilai labiah dari ciek untuak parameter \"$3\". Anyo nilai tarakhia nan tasadio nan ka digunokan.",
+       "duplicate-args-category": "Laman jo argumen gando di pamanggilan templat",
+       "duplicate-args-category-desc": "Laman ko barisi pamanggilan templat nan manggunokan argumen gando, sarupo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "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-category": "Laman nan barisi uraian templat nan diabaikan",
        "parser-template-loop-warning": "Hubungan barulang templat tadeteksi: [[$1]]",
        "template-loop-category": "Laman jo templat barulang",
+       "template-loop-category-desc": "Laman ko manganduang templat malingka, yaitu templat nan maimbau dirinyo surang sacaro bolak-balik.",
+       "template-loop-warning": "<strong>Paringatan:</strong> Laman ko maimbau [[:$1]] nan manyababkan <i>template loop</i> (panggilan rekursif tak inggo).",
        "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-category-desc": "Laman ko malampaui jumlah node maksimum.",
        "node-count-exceeded-warning": "Laman nan labiah jumlah node",
        "expansion-depth-exceeded-category": "Laman dima kadalaman ekspansi lah talampau",
+       "expansion-depth-exceeded-category-desc": "Laman nan malabiahi kadalaman laweh maksimum.",
        "expansion-depth-exceeded-warning": "Laman kadalaman ekspansi lah talampau",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "unstrip-depth-warning": "Unstrip recursion limit exceeded ($1)",
+       "unstrip-depth-category": "Laman-laman di mano bateh kadalaman unstrip alah malabiahi bateh",
+       "unstrip-size-warning": "Bateh ukuran unstrip alah malabiahi bateh ($1)",
+       "unstrip-size-category": "Laman-laman di mano bateh ukuran unstrip alah malabiahi bateh",
        "converter-manual-rule-error": "Kasalahan tadeteksi di aturan manual konversi bahaso",
        "undo-success": "Suntiangan ko dapek dibatalan. \nTolong cek pabedoan di bawah untuak mayakinkan bahwa bana nan tu Sanak nio buek, lalu simpan parubahan tasabuik untuak manyalasaikan pambatalan suntiangan.",
        "undo-failure": "Suntiangan ko indak dapek dibatalan dek konflik panyuntiangan antaro.",
+       "undo-main-slot-only": "Suntiangan ko indak dapek dibatalkan dek tindakan ko malibaikkan konten di lua slot utamo.",
        "undo-norev": "Suntiangan ko indak dapek dibatalan dek laman indak ditamukan atau lah dihapuih.",
+       "undo-nochange": "Suntiangan ko nampaknyo alah dibatalkan.",
        "undo-summary": "Mambatalan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|maota]])",
        "undo-summary-anon": "Baliakan revisi $1 dek [[Special:Contributions/$2|$2]]",
+       "undo-summary-username-hidden": "Batalkan revisi $1 dek surang pangguno tasuruak",
        "cantcreateaccount-text": "Mambuek akun dari alamat IP ko ('''$1''') alah diblok jo [[User:$3|$3]].\n\nAlasan nan diagiah jo $3 adolah ''$2''",
+       "cantcreateaccount-range-text": "Pambuatan akun dari alamaik IP dalam rantang <strong>$1</strong>, nan mancakuik alamaik IP Sanak (<strong>$4</strong>), alah disakek dek [[User:$3|$3]].\n\nAlasan nan diagiah dek  $3  adolah <em>$2</em>",
        "viewpagelogs": "Caliak log untuak laman ko",
        "nohistory": "Indak ado sajarah panyuntiangan untuak laman ko",
        "currentrev": "Revisi tabaru",
        "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.",
+       "history-edit-tags": "Suntiang tag dari revisi nan tapiliah",
        "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]",
        "rev-deleted-text-permission": "Revisi laman ko alah '''dihapuih'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan]",
+       "rev-suppressed-text-permission": "Laman revisi ko alah '''dihapuih'''.\nSanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
        "rev-deleted-text-unhide": "Revisi laman ko alah '''dihapuih'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].\nSanak masih dapek [$1 mancaliak revisi ko] ko' amuah.",
        "rev-suppressed-text-unhide": "Revisi laman ko alah '''tabanam'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log pambanaman].\nAngku masih dapek [$1 maliek revisi ko] ko' amuah.",
        "rev-deleted-text-view": "Laman revisi ko alah '''dihapuih'''.\nSanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
        "revdelete-no-file": "Berkas nan dituju indak basobok.",
        "revdelete-show-file-confirm": "Apokah Sanak yakin nio mancaliak revisi nan alah dihapuih dari berkas \"<nowiki>$1</nowiki>\" per $3, $2?",
        "revdelete-show-file-submit": "Yo",
+       "revdelete-selected-text": "{{PLURAL:$1|Revisi tapiliah|Revisi tapiliah}} dari [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versi berkas tapilih|Versi berkas tapiliah}} dari [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Log piliahan}}:",
+       "revdelete-text-text": "Revisi nan diapuik ka tatap muncua di laman riwayaik, tapi bagian dari kontennyo ka manjadi indak dapek diakses untuak umum.",
+       "revdelete-text-file": "Versi berkas nan diapuih ka tatap muncua di riwayaik berkas, tapi bagian dari kontennyo ka manjadi indak dapek diakses untuak umum.",
+       "logdelete-text": "Acara log nan diapuih ka tatap muncua di log, tapi bagian dari kontennyo manjadi indak dapek diakses untuak umum.",
+       "revdelete-text-others": "Panguruih lain masih dapek maakses konten tasuruak dan dapek mambatalkan pangapuihannyo, salain kok ado panarapan batasan tambahan.",
        "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 <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",
        "suppressionlog": "Log pambanaman",
        "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-header": "Laman ko mambuliahan Sanak untuak manggabuangkan revisi-revisi dari ciek laman sumber ka laman nan labiah baru.\nPastikan baso parubahan ko tatap mampatahankan kontinuitas versi laman tadahulu.",
        "mergehistory-box": "Gabuang parubahan-parubahan dari duo laman:",
        "mergehistory-from": "Laman sumber:",
        "mergehistory-into": "Laman tujuan:",
+       "mergehistory-list": "Mergeable edit history",
+       "mergehistory-merge": "Revisi-revisi barikuik dari [[:$1]] dapek digabuangkan ka [[:$2]]. Gunokan tombol radio untuak manggabuangkan revisi-revisi nan dibuek sabalun wakatu tatantu. Paratikan, manggunokan pautan navigasi ka mangeset ulang kolom.",
        "mergehistory-go": "Tampilan suntiangan nan dapek digabuang",
        "mergehistory-submit": "Gabuang revisi",
        "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 laman jo parameter wakatu.",
+       "mergehistory-fail-bad-timestamp": "Stempel wakatu indak valid.",
        "mergehistory-fail-invalid-source": "Laman asal indak sah.",
        "mergehistory-fail-invalid-dest": "Laman tujuan indak sah.",
+       "mergehistory-fail-no-change": "Panggabuangan sijarah indak barhasil manggabuangkan revisi apo pun. Mohon pareso baliak parameter laman jo waktu.",
+       "mergehistory-fail-permission": "Izin panggabuangan sijarah laman indak mancukupi.",
        "mergehistory-fail-self-merge": "Laman sumber jo tujuannyo samo.",
+       "mergehistory-fail-timestamps-overlap": "Revisi asa tumpang tindih atau labiah baru dari revisi tujuan.",
+       "mergehistory-fail-toobig": "Indak dapek malakukan panggabuangan sabagai labiah dari bateh dari $1 {{PLURAL:$1|revisi|revisi}} ka dipindahkan.",
+       "mergehistory-no-source": "Laman sumber $1 indak ado.",
+       "mergehistory-no-destination": "Halaman tujuan $1 indak ado.",
+       "mergehistory-invalid-source": "Judul laman sumber harus judul nan balaku.",
+       "mergehistory-invalid-destination": "Judul halaman tujuan harus judul yang valid.",
+       "mergehistory-autocomment": "[[:$1]] alah digabuangkan ka [[:$2]]",
+       "mergehistory-comment": "[[:$1]] alah digabuangkan ka [[:$2]]: $3",
+       "mergehistory-same-destination": "Laman sumber jo tujuannyo indak samo.",
        "mergehistory-reason": "Alasan:",
        "mergelog": "Log panggabuangan",
        "revertmerge": "Batal gabuang",
        "diff-empty": "(Indak ado pabedaan)",
        "diff-multi-sameuser": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek pangguno nan samo indak ditampilkan)",
        "diff-multi-otherusers": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek {{PLURAL:$2|ciek pangguno lain|$2 pangguno}} indak ditampilkan)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek {{PLURAL:$2|ciek pangguno lain|$2 pangguno}} indak ditampakan)",
+       "diff-paragraph-moved-tonew": "Paragraf alah dipindahan. Klik untuak mamindahan ka lokasi baru.",
+       "diff-paragraph-moved-toold": "Paragraf dipindahkan. Klik untuak malumpek ka lokasi lamo.",
+       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} indak basuo.\n\nIko biasonyo dek karano pautan sijarah alah kadaluarsa. Rinciannyo dapek dicaliak di  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "searchresults": "Hasil pancarian",
+       "search-filter-title-prefix": "Anyo mancari laman nan judulnyo diawali dek \"$1\"",
        "search-filter-title-prefix-reset": "Cari kasado laman",
        "searchresults-title": "Hasil pancarian untuak \"$1\"",
        "titlematches": "Judul laman pas",
        "search-category": "(kategori $1)",
        "search-file-match": "(isi berkas nan sasuai)",
        "search-suggest": "Mungkin makasuiknyo: $1",
+       "search-rewritten": "Manampilan hasil untuak $1. Cari selain $2.",
        "search-interwiki-caption": "Hasil dari proyek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(salanjuiknyo)",
        "search-interwiki-more-results": "hasil lainnyo",
        "search-relatedarticle": "Bakaitan",
+       "search-invalid-sort-order": "Parintah manyortir $1 indak dikenali, panyortiran standar ka ditarapan. Parintah-parintah manyortir nan sah iolah: $2",
+       "search-unknown-profile": "Profil pancarian $1 tidak dikenali, profil pancarian standar ka diterapan.",
        "searchrelated": "bakaitan",
        "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",
+       "search-nonefound-thiswiki": "Indak ado hasil nan sasuai jo pamintaan",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mancari di ruangnamo:",
        "powersearch-togglelabel": "Piliah:",
        "powersearch-toggleall": "Sadonyo",
        "powersearch-togglenone": "Dak ado",
+       "powersearch-remember": "Ingek piliahan untuak pancarian salanjuiknyo",
        "search-external": "Pancarian lua",
        "searchdisabled": "Pancarian {{SITENAME}} dimatian.\nSanak samantaro dapek mancari lewaik Google.\nIngek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.",
+       "search-error": "Kasalahan tajadi wakatu mancari: $1",
+       "search-warning": "Paringatan tajadi katiko mancari:$1",
        "preferences": "Pangaturan",
        "mypreferences": "Pangaturan",
        "prefs-edits": "Jumlah suntiangan:",
+       "prefsnologintext2": "Silakan masuak log untuak mangubah preferensi Sanak.",
        "prefs-skin": "Kulik",
        "skin-preview": "Caliak",
        "datedefault": "Indak usah diatua",
        "prefs-watchlist": "Daftar pantau",
        "prefs-editwatchlist": "Suntiang daftar pantauan",
        "prefs-editwatchlist-label": "Suntiang entri daftar pantauan Sanak:",
+       "prefs-editwatchlist-edit": "Caliak jo apuih judul di daftar pantauan Sanak",
+       "prefs-editwatchlist-raw": "Suntiang pantauan mantah",
+       "prefs-editwatchlist-clear": "Apuih daftar pantauan",
        "prefs-watchlist-days": "Jumlah hari dalam daftar pantau:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari}}",
        "prefs-watchlist-edits": "Jumlah parubahan tabanyak nan ditunjuakan pado daftar pantau:",
        "prefs-watchlist-edits-max": "Nilai maksimum: 1000",
        "prefs-watchlist-token": "Token pantauan:",
+       "prefs-watchlist-managetokens": "Kalola token",
        "prefs-misc": "Lain-lain",
        "prefs-resetpass": "Tuka kato sandi",
        "prefs-changeemail": "Tuka atau hapuih alamaik surel",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|hari}}",
        "recentchangescount": "Jumlah suntiangan nan ditunjuakan dalam parubahan baru, riwayaik laman, dan dalam log, sacaro baku:",
        "prefs-help-recentchangescount": "Nilai maksimum: 1000",
+       "prefs-help-watchlist-token2": "Iko adolah kunci rasio (token) ka umpan web dari daftar pantauan sanak.\nSia se nan tau dapek mancaliak daftar pantauan Sanak, jadi jan dibagian.\nKok diparaluan [[Special:ResetTokens|you can reset it]].",
+       "prefs-help-tokenmanagement": "Sanak dapek mancaliak jo maatua ulang kunci rahasio akun Sanak nan dapek maakses umpan Web dari daftar pantauan Sanak. Sia se nan tau bisa sajo mancaliak daftar pantauan Sanak, jadi jan dibagian.",
        "savedprefs": "Pangaturan lah tasimpan",
+       "savedrights": "Kalompok hak pangguno {{GENDER:$1|$1}} alah disimpan.",
        "timezonelegend": "Zona wakatu:",
        "localtime": "Wakatu satampaik:",
        "timezoneuseserverdefault": "Gunokan nan dari wiki ($1)",
        "timezoneuseoffset": "Lainnyo (tantuan pabedoannyo)",
+       "timezone-useoffset-placeholder": "Contoh nilai: \"-07:00\" atau \"01:00\"",
        "servertime": "Wakatu server:",
        "guesstimezone": "Isian dari paramban web",
        "timezoneregion-africa": "Afrika",
        "default": "baku",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS surang",
+       "prefs-custom-json": "JSON kustom",
        "prefs-custom-js": "JS surang",
        "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-displayrc": "Piliahan tampilan",
        "prefs-displaywatchlist": "Piliahan tampilan",
        "prefs-changesrc": "Parubahan ditampilkan",
+       "prefs-changeswatchlist": "Parubahan ditampilan",
+       "prefs-pageswatchlist": "Halaman nan dipantau",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Pabedoan",
+       "prefs-help-prefershttps": "Preferensi ko akan diaktifkan salunjuiknyo katiko Sanak masuak log.",
+       "prefswarning-warning": "Parubahan preferensi Sanak alun tasimpan. Kok Sanak maninggaan halaman ko tanpa ma klik $1 preferensi Sanak indak akan dipabarui.",
+       "prefs-tabs-navigation-hint": "Tip: Sanak dapek manggunoan tombol panah kida jo suok untuak banavigasi antartab di dalam daftar tab.",
        "userrights": "Hak pangguno",
        "userrights-lookup-user": "Piliah pangguno",
        "userrights-user-editname": "Masuakan namo pangguno:",
        "editusergroup": "Muek kalompok pangguno",
        "editinguser": "Mangganti hak pangguno untuak {{GENDER:$1|pangguno}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Mancaliak hak pengguna dari {{GENDER:$1|pengguno}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Suntiang kalompok {{GENDER:$1|pangguno}}",
        "userrights-viewusergroup": "Caliak kalompok {{GENDER:$1|pangguno}}",
        "saveusergroups": "Simpan kalompok {{GENDER:$1|pangguno}}",
        "userrights-expiry-options": "1 hari:1 hari,1 minggu:1 minggu,1 bulan:1 bulan,3 bulan:3 bulan,6 bulan:6bulan,1 taun:1 taun",
        "userrights-invalid-expiry": "Wakatu usang untuak kalompok \"$1\" indak sah.",
        "userrights-expiry-in-past": "Wakatu usang untuak kalompok \"$1\" alah balalu.",
+       "userrights-cannot-shorten-expiry": "Sanak indak dapek mamajuan wakatu kadaluarsa dari kaanggotaan dalam kalompok $1. Hanyo pangguno yang punyo hak akses manambahan jo mancabuik kalompok ko yang dapek mamajuan wakatu kadaluarsa.",
+       "userrights-conflict": "Konflik parubahan hak pangguno! Sila tinjau ulang jo konfirmasi parubahan Sanak.",
        "group": "Kalompok:",
        "group-user": "Pangguno",
        "group-autoconfirmed": "Pangguno takonfirmasi otomatih",
        "right-createpage": "Mambuek laman baru (nan bukan laman diskusi)",
        "right-createtalk": "Mambuek laman diskusi",
        "right-createaccount": "Mambuek akun baru",
+       "right-autocreateaccount": "Masuak log otomatis jo akun pangguno lua",
        "right-minoredit": "Manandoi suntiangan ketek",
        "right-move": "Mamindahan laman",
        "right-move-subpages": "Mamindahan laman jo kasado sublaman",
        "right-move-rootuserpages": "Mamindahan laman pangguno",
+       "right-move-categorypages": "Pindahan halaman kategori",
        "right-movefile": "Mamindahan berkas",
        "right-suppressredirect": "Indak mambuek pangaliahan wakatu mamindahan laman",
        "right-upload": "Mamuek berkas",
        "right-reupload": "Manimpo berkas lamo",
        "right-reupload-own": "Manimpo berkas nan dimuek surang",
+       "right-reupload-shared": "Manolak berkas-berkas pado panyimpanan media lokal basamo",
+       "right-upload_by_url": "Masuakan berkas dari alamat URL",
        "right-purge": "Mangapuih singgahan laman untuak laman",
        "right-autoconfirmed": "Indak dipangaruahi bateh limik babasis IP",
        "right-bot": "Dipalakuan sabagai proses otomatih",
        "right-apihighlimits": "Manggunoan bateh labiah tinggi dalam kueri API",
        "right-writeapi": "Manggunoan panulisan API",
        "right-delete": "Mangapuih laman",
+       "right-bigdelete": "Apuih halaman yang banyak versi terdahulunyo",
+       "right-deletelogentry": "Maapuih jo mambatalan pangapuihan entri log tatantu",
+       "right-deleterevision": "Maapuih jo mambatalan pangapuihan parubahan tatantu suatu halaman",
+       "right-deletedhistory": "Caliak revisi entri-entri yang diapuih, tanpa teks yang bahubuangan",
+       "right-deletedtext": "Caliak teks yang diapuih jo parubahan antaro revisi yang diapuih",
+       "right-browsearchive": "Cari laman nan dihapuih",
+       "right-undelete": "Mambaliakan halaman nan diapuih",
+       "right-suppressrevision": "Manampilan, manyambunyian jo mambatalan panyambunyian revisi tatantu suatu halaman dari pangguno",
+       "right-viewsuppressed": "Caliak parubahan yang disambunyian dari sadolah pangguno",
        "right-suppressionlog": "Mancaliak log privat",
+       "right-block": "Blokir pangguno lain dari panyuntingan",
+       "right-blockemail": "Mamblokir pangiriman surel dek pangguno",
+       "right-hideuser": "Mamblokir namo pangguno jo manyambunyiannyo dari publik",
+       "right-ipblock-exempt": "Mangabaikan pamblokiran IP, pamblokiran otomatis, jo jarak pamblokiran",
        "right-unblockself": "Malapehan sakek surang",
+       "right-protect": "Ubah tingkek palinduangan jo suntiang halaman yang dilinduangi baruntun",
+       "right-editprotected": "Manyuntiang halaman yang dilinduangi sabagai \"{{int:protect-level-sysop}}\"",
+       "right-editcontentmodel": "manyuntiang model konten sabuah laman",
        "right-editinterface": "Manyuntiang antarmuko pangguno",
        "right-editusercss": "Manyuntiang berkas CSS pangguno lain",
        "right-edituserjson": "Manyuntiang berkas JSON pangguno lain",
        "right-edituserjs": "Manyuntiang berkas JS pangguno lain",
+       "right-editsitecss": "manyuntiang CSS untuak sadoalah situs",
+       "right-editsitejson": "suntiang JSON untuak sadoalah situs",
+       "right-editsitejs": "suntiang JavaScript untuak sadoalah situs",
+       "right-editmyusercss": "suntiang berkas CSS pangguno Sanak",
+       "right-editmyuserjson": "suntiang berkas JSON pangguno Sanak",
+       "right-editmyuserjs": "suntiang berkas JavaScript pangguno Sanak",
+       "right-editmyuserjsredirect": "suntiang berkas JavaScript Sanak nan marupokan aliahan",
+       "right-viewmywatchlist": "Caliak daftar pantauan Sanak",
+       "right-editmywatchlist": "Manyuntiang daftar Sanak surang. Beberapo kegiatan akan tetap akan manambahan halaman tanpa hak iko.",
+       "right-viewmyprivateinfo": "Maliek data pribadi Sanak surang (misalnyo: alamaik email, namo asli Sanak)",
+       "right-editmyprivateinfo": "Manyuntiang data pribadi Sanak surang (misalnyo: alamaik surel, namo asli)",
+       "right-editmyoptions": "manyuntiang preferensi Sanak",
+       "right-rollback": "mambaliakan sacaro capek suntiangan-suntiangan pangguno tarakhia nan manyuntiang laman tatantu",
+       "right-markbotedits": "tandoi pambaliakan revisi sabagai suntiangan bot",
        "right-noratelimit": "Indak dipangaruahi jo pambatehan jumlah suntiangan",
        "right-import": "Mangimpor laman dari wiki lain",
        "right-importupload": "Mangimpor laman dari berkas nan dimuek",
+       "right-patrol": "manandoi suntiangan pangguno lain sabagai terpatroli",
        "right-autopatrol": "Suntiangan surang sacaro otomatih ditandoi tapantau",
+       "right-patrolmarks": "caliak panandoan patroli parubahan tabaru",
+       "right-unwatchedpages": "mancaliak daftar laman nan indak tapantau",
+       "right-mergehistory": "manggabuangan revisi-revisi tadahulu dari laman ko",
+       "right-userrights": "Manyuntiang sadoalah hak pangguno",
+       "right-userrights-interwiki": "Manyuntiang hak pangguno-pangguno di wiki lain",
+       "right-siteadmin": "Mangunci jo mambukak kunci basis data",
+       "right-override-export-depth": "Ekspor laman tamasuak laman-laman takaik inggo kadalaman 5",
+       "right-sendemail": "Mangirim surel ka pangguno lain",
+       "right-managechangetags": "Buek jo matikan [[Special:Tags|tag]]",
+       "right-applychangetags": "Terapkan [[Special:Tags|tags]] basamoan jo parubahan pangguno",
+       "right-changetags": "Tambah jo apuih [[Special:Tags|tag]] arbitrari pado tiok-tiok  revisi jo entri log",
+       "right-deletechangetags": "ApuIh [[Special:Tags|tag]] dari basisdata",
+       "grant-generic": "\"$1\" bundel hak akses",
+       "grant-group-page-interaction": "Barinteraksi jo laman",
+       "grant-group-file-interaction": "Barinteraksi jo media",
+       "grant-group-watchlist-interaction": "Barinteraksi jo daftar pantauan Sanak",
        "grant-group-email": "Kirim surel",
+       "grant-group-high-volume": "Malakukan aktivitas nan amaik banyak",
+       "grant-group-customization": "Kustomisasi jo preferensi",
+       "grant-group-administration": "Malakukan tindakan administratif",
+       "grant-group-private-information": "Akses data pribadi tantang Sanak",
+       "grant-group-other": "Aktivitas lain-lain",
+       "grant-blockusers": "Sakek jo bukak panyakekan pangguno",
        "grant-createaccount": "Buek akun",
        "grant-createeditmovepage": "Buek, suntiang, dan pindahkan laman",
        "grant-delete": "Hapuih laman, revisi, dan log entri",
+       "grant-editinterface": "Suntiang ruang namo MediaWiki jo JSON pangguno untuak kasadoalahan situs",
+       "grant-editmycssjs": "Manyuntiang laman CSS/JSON/JavaScript Sanak",
+       "grant-editmyoptions": "Manyuntiang preferensi pangguno Sanak jo konfigurasi JSON",
+       "grant-editmywatchlist": "Suntiang daftar pantauan Sanak",
+       "grant-editsiteconfig": "Suntiang CSS/JS pangguno untuak kasadoalahan situs",
+       "grant-editpage": "Manyuntiang laman nan ado",
+       "grant-editprotected": "Manyuntiang laman nan dilinduangi",
+       "grant-highvolume": "Panyuntiangan jo volume tinggi",
+       "grant-oversight": "Suruakan pangguno jo revisinyo",
+       "grant-patrol": "Tandoi laman tapatroli",
+       "grant-privateinfo": "Akses informasi pribadi",
+       "grant-protect": "Malinduangi jo mambukak palinduangan laman",
+       "grant-rollback": "Mambaliakan parubahan pado laman",
+       "grant-sendemail": "Mangirim surel ka pangguno lain",
+       "grant-uploadeditmovefile": "Maunggah, mangganti, jo mamindahan berkas",
+       "grant-uploadfile": "Muek berkas baru",
        "grant-basic": "Akses dasar",
+       "grant-viewdeleted": "Mancaliak laman jo berkas nan diapuih",
+       "grant-viewmywatchlist": "Caliak daftar pantauan Sanak",
+       "grant-viewrestrictedlogs": "Caliak entri log tabateh",
        "newuserlogpage": "Log pangguno baru",
        "newuserlogpagetext": "Di bawah ko log pandaftaran pangguno baru",
        "rightslog": "Log parubahan hak akses",
        "action-createpage": "buek laman ko",
        "action-createtalk": "buek laman rundiang ko",
        "action-createaccount": "buek akun pangguno ko",
+       "action-autocreateaccount": "buek otommatis akun pangguno lua",
+       "action-history": "Caliak riwayaik suntiangan laman ko",
        "action-minoredit": "tandoi sabagai suntiangan ketek",
        "action-move": "pindahan laman ko",
        "action-move-subpages": "pindahkan laman ko, jo sublamannyo",
        "action-move-rootuserpages": "pindahan laman pangguno",
+       "action-move-categorypages": "Pindahan halaman kategori",
        "action-movefile": "pindahkan berkas ko",
        "action-upload": "muek berkas ko",
        "action-reupload": "timpo berkas lamo",
+       "action-reupload-shared": "manimpo berkas nan alah ado di tampek panyimpanan berkas basamo",
+       "action-upload_by_url": "mamuek berkas ko dari sabuah alamaik URL",
        "action-writeapi": "manggunoan panulisan API",
+       "action-delete": "Hapuih laman ko",
+       "action-deleterevision": "Apuih revisi",
+       "action-deletelogentry": "apuih entri log",
+       "action-deletedhistory": "mancaliak versi tadaulu laman nan alah diapuih",
+       "action-deletedtext": "caliak teks revisi nan diapuih",
+       "action-browsearchive": "Cari laman nan dihapuih",
+       "action-undelete": "batalkan pangapuihan laman",
+       "action-suppressrevision": "tinjau jo baliakan revisi nan disuruakan",
+       "action-suppressionlog": "mancaliak log privat ko",
+       "action-block": "Sakek pangguno lain dari panyuntiangan",
+       "action-protect": "mangganti tingkek palinduangan laman ko",
+       "action-rollback": "mambaliakan sacaro capek suntiangan-suntiangan pangguno tarakhia nan manyuntiang laman tatantu",
        "action-import": "impor laman dari wiki lain",
+       "action-importupload": "maimpor laman ko dari berkas nan dimuek",
+       "action-patrol": "manandoi suntiangan pangguno lain sabagai tapatroli",
+       "action-autopatrol": "manandoi suntiangan Sanak surang sabagai tapatroli",
+       "action-unwatchedpages": "mancaliak daftar laman nan indak tapantau",
+       "action-mergehistory": "manggabuangkan revisi-revisi tadaulu dari laman ko",
+       "action-userrights": "manyuntiang sadoalah hak pangguno",
+       "action-userrights-interwiki": "manyuntiang hak pangguno-pangguno dari wiki lain",
+       "action-siteadmin": "mangunci jo mambukak basisdata",
+       "action-sendemail": "kirim surel",
+       "action-editmyoptions": "manyuntiang preferensi Sanak",
+       "action-editmywatchlist": "suntiang daftar pantauan Sanak",
+       "action-viewmywatchlist": "caliak daftar pantauan Sanak",
+       "action-viewmyprivateinfo": "caliak informasi pribadi Sanak",
+       "action-editmyprivateinfo": "manyuntiang informasi pribadi Sanak",
+       "action-editcontentmodel": "manyuntiang model konten sabuah laman",
+       "action-managechangetags": "buek jo matikan tag",
+       "action-applychangetags": "terapkan tag basamoan jo parubahan Sanak",
+       "action-changetags": "Tambah jo apuih arbitrari pado tiok-tiok  revisi jo entri log",
+       "action-deletechangetags": "apuih tag dari basisdata",
+       "action-purge": "apuih singgahan laman ko",
+       "action-apihighlimits": "manggunoan bateh labiah tinggi dalam kueri API",
+       "action-autoconfirmed": "indak dipangaruahi bateh laju babasis IP",
+       "action-bigdelete": "Apuih halaman nan banyak versi tadahulunyo",
+       "action-blockemail": "manyakek pangiriman surel dek pangguno",
+       "action-bot": "dipalakukan sabagai proses otomatis",
+       "action-editprotected": "manyuntiang laman talinduangi sabagai \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "manyuntiang laman nan talinduangi sabagai \"{{int:protect-level-sysop}}\"",
+       "action-editinterface": "manyuntiang antarmuko pangguno",
+       "action-editusercss": "manyuntiang berkas CSS pangguno lain",
+       "action-edituserjson": "manyuntiang berkas JSON pangguno lain",
+       "action-edituserjs": "manyuntiang berkas JS pangguno lain",
+       "action-editsitecss": "manyunting CSS untuak kasadoalahan situs",
+       "action-editsitejson": "suntiang JSON untuak kasadoalahan situs",
+       "action-editsitejs": "suntiang JavaScript untuak kasadoalahan situs",
+       "action-editmyusercss": "suntiang berkas CSS pangguno Sanak",
+       "action-editmyuserjson": "suntiang berkas JSON pangguno Sanak",
+       "action-editmyuserjs": "suntiang berkas JavaScript pangguno Sanak",
+       "action-editmyuserjsredirect": "suntiang berkas JavaScript Sanak nan marupokan aliahan.",
+       "action-viewsuppressed": "caliak parubahan nan tasuruak dari sadoalah pangguno",
+       "action-hideuser": "sakek namo pangguno jo suruakan dari publik",
+       "action-ipblock-exempt": "abaikan panyakekan IP, panyakekan otomatis, jo rantang panyakekan",
+       "action-unblockself": "malapehan sakek surang",
+       "action-noratelimit": "indak dipangaruahi jo pambatehan jumlah suntiangan",
+       "action-reupload-own": "manimpo berkas nan dimuek surang",
+       "action-nominornewtalk": "indak ado tando suntiangan ketek di laman rundiang mamicu pasan baru",
+       "action-markbotedits": "tandoi pambaliakan revisi sabagai suntiangan bot",
+       "action-patrolmarks": "caliak panandoan patroli parubahan tabaru",
+       "action-override-export-depth": "ekspor laman tamasuak laman-laman takaik inggo kadalaman 5",
+       "action-suppressredirect": "indak mambuek pangaliahan wakatu mamindahan laman",
        "nchanges": "$1 {{PLURAL:$1|parubahan}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sajak kunjuangan tarakhia}}",
        "enhancedrc-history": "versi",
        "recentchanges": "Parubahan baru",
        "recentchanges-legend": "Piliahan parubahan baru",
        "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-timeout": "wakatu mancari alah habih. Sanak mungkin ka mancubo parameter pancarian nan lain.",
+       "recentchanges-network": "Salamo tajadi kasalahan teknis, indak ado hasil nan biso dimuek. Silahkan cubo untuak manyagarkan halaman liak.",
+       "recentchanges-notargetpage": "Masuakan namo halaman nan di ateh untuak maliek parubahan nan terkait jo halaman itu.",
        "recentchanges-feed-description": "Tamuan parubahan baru dalam umpan wiki ko",
        "recentchanges-label-newpage": "Suntiangan ko mambuek laman baru",
        "recentchanges-label-minor": "Iko suntiangan ketek",
        "recentchanges-label-plusminus": "Parubahan ukuran laman dalam bita",
        "recentchanges-legend-heading": "<strong>Katarangan:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (caliak pulo [[Special:NewPages|daftar laman nan baru]])",
+       "recentchanges-submit": "Tunjuakan",
+       "rcfilters-tag-remove": "Hapuih '$1'",
+       "rcfilters-legend-heading": "<strong> daftar singkekan:</strong>",
        "rcfilters-other-review-tools": "Pakakeh paninjauan lainnyo",
        "rcfilters-group-results-by-page": "Kalompokan hasil manuruik laman",
        "rcfilters-activefilters": "Panyariang aktip",
        "rcfilters-activefilters-hide": "Suruakan",
        "rcfilters-activefilters-show": "Tunjuakan",
+       "rcfilters-activefilters-hide-tooltip": "Sambunyian wilayah filter aktif",
+       "rcfilters-activefilters-show-tooltip": "Tunjukan wilayah filter aktif",
        "rcfilters-advancedfilters": "Panyariang lanjutan",
        "rcfilters-limit-title": "Hasil untuak ditampilkan",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|parubahan}}, $2",
        "rcfilters-savedqueries-unsetdefault": "Hapuih dari baku",
        "rcfilters-savedqueries-remove": "Hapuih",
        "rcfilters-savedqueries-new-name-label": "Namo",
+       "rcfilters-savedqueries-new-name-placeholder": "Jalehan tujuan panyaringan iko",
        "rcfilters-savedqueries-apply-label": "Buek panyariang",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Buek panyariang baku",
        "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-restore-default-filters": "Kambalian filter awal",
+       "rcfilters-clear-all-filters": "Hapuih sado panyaringan",
        "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-invalid-filter": "Panyaringan indak sah",
+       "rcfilters-empty-filter": "Indak ado filter aktif. Sado alah kontribusi ditampilan.",
        "rcfilters-filterlist-title": "Panyariang",
+       "rcfilters-filterlist-whatsthis": "Baa caro karajonyo?",
+       "rcfilters-filterlist-feedbacklink": "Agiah tau kami apo nan Sanak pikian tantang alaik-alaik filter ko",
+       "rcfilters-highlightbutton-title": "Caliak hasilnyo",
+       "rcfilters-highlightmenu-title": "Piliah warno",
+       "rcfilters-highlightmenu-help": "Piliah warno untuak manyorot atribut iko",
        "rcfilters-filterlist-noresults": "Indak ado panyariang ditamukan",
+       "rcfilters-noresults-conflict": "Hasil indak ditamuan karano kriteria pancariannyo batantangan",
+       "rcfilters-state-message-subset": "Filter iko indak akan bapangaruh karano hasilnyo disaratoan jo {{PLURAL:$2|}} (cubo caliak untuak mambedaannyo):$1",
+       "rcfilters-state-message-fullcoverage": "Mamiliah sado panyaringan dalam kalompok iko samo jo indak mamiliah apopun, sahinggo panyaringan ko indak mambarikan hasil. Kalompok itu: $1",
+       "rcfilters-filtergroup-authorship": "Kontribusi panulih",
        "rcfilters-filter-editsbyself-label": "Suntiangan Sanak",
+       "rcfilters-filter-editsbyself-description": "Kontribusi Sanak",
        "rcfilters-filter-editsbyother-label": "Suntiangan urang lain",
+       "rcfilters-filter-editsbyother-description": "Sadoalah parubahan kacuali parubahan miliak surang.",
+       "rcfilters-filtergroup-user-experience-level": "Pandaftaran jo pangalaman pangguno",
        "rcfilters-filter-user-experience-level-registered-label": "Tadaftar",
+       "rcfilters-filter-user-experience-level-registered-description": "Panyuntiang masuak log",
        "rcfilters-filter-user-experience-level-unregistered-label": "Indak tadaftar",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Panyuntiang nan indak masuak log",
        "rcfilters-filter-user-experience-level-newcomer-label": "Pandatang baru",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Panyuntiang tadaftar nan mampunyoi suntiangan kurang dari 10 suntiangan jo aktivitas salamo 4 ari.",
+       "rcfilters-filter-user-experience-level-learner-label": "Urang baru",
+       "rcfilters-filter-user-experience-level-learner-description": "Panyuntiang tadaftar nan pangalamannyo barado antaro \"pangguno baru\" jo \"pangguno bapangalaman\".",
+       "rcfilters-filter-user-experience-level-experienced-label": "Pangguno bapangalaman",
+       "rcfilters-filter-user-experience-level-experienced-description": "Panyuntiang tadaftar jo labiah dari 500 suntiangan sarato aktivitas salamo 30 ari.",
+       "rcfilters-filtergroup-automated": "Kontribusi otomatis",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Suntiangan nan dibuek jo pakakeh taotomatisasi.",
        "rcfilters-filter-humans-label": "Manusio (bukan bot)",
+       "rcfilters-filter-humans-description": "Suntiangan nan dibuek dek panyuntiang manusia.",
+       "rcfilters-filtergroup-reviewstatus": "Status paninjauan",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Suntiangan nan indak ditandoi tapatroli, baiak sacaro manual atau otomatis.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Alun dipatroli",
+       "rcfilters-filter-reviewstatus-manual-description": "Suntiangan nan sacaro manual ditandoi tapatroli",
+       "rcfilters-filter-reviewstatus-manual-label": "Tapatroli manual",
+       "rcfilters-filter-reviewstatus-auto-description": "Suntiangan dek pangguno bapangalaman nan kontribusinyo sacaro otomatis ditandoi sabagai tapatroli",
+       "rcfilters-filter-reviewstatus-auto-label": "Otomatis tapatroli",
+       "rcfilters-filtergroup-significance": "Signifikan",
        "rcfilters-filter-minor-label": "Suntiangan ketek",
+       "rcfilters-filter-minor-description": "Suntiangan nan ditandoi panyuntiang sabagai suntiangan ketek",
        "rcfilters-filter-major-label": "Nan indak suntiangan ketek",
+       "rcfilters-filter-major-description": "Suntiangan nan ditandoi sabagai suntiangan ketek",
+       "rcfilters-filtergroup-watchlist": "Halaman nan dipantau",
+       "rcfilters-filter-watchlist-watched-label": "Daftar pantau",
+       "rcfilters-filter-watchlist-watched-description": "Parubahan pado laman dalam pantauan Sanak.",
+       "rcfilters-filter-watchlist-watchednew-label": "Parubahan Daftar Pantauan baru.",
+       "rcfilters-filter-watchlist-watchednew-description": "Parubahan laman-laman nan dipantau nan alun disinggahi dek Sanak sajak parubahan tajadi.",
+       "rcfilters-filter-watchlist-notwatched-label": "Indak dalam daftar pantauan",
+       "rcfilters-filter-watchlist-notwatched-description": "Sadonyo salain parubahan pado laman nan dipantau.",
+       "rcfilters-filtergroup-watchlistactivity": "Aktivitas daftar pantauan",
+       "rcfilters-filter-watchlistactivity-unseen-label": "Parubahan nan alun dicaliak",
+       "rcfilters-filter-watchlistactivity-unseen-description": "Parubahan laman-laman nan dipantau nan alun disinggahi dek Sanak sajak parubahan tajadi.",
+       "rcfilters-filter-watchlistactivity-seen-label": "Parubahan nan alah tacaliak",
+       "rcfilters-filter-watchlistactivity-seen-description": "Parubahan laman-laman nan disinggahi Sanak sajak parubahan tajadi.",
+       "rcfilters-filtergroup-changetype": "Jinih parubahan",
        "rcfilters-filter-pageedits-label": "Suntiangan laman",
+       "rcfilters-filter-pageedits-description": "Parubahan pado konten wiki, rundiang, deskripsi kategori...",
        "rcfilters-filter-newpages-label": "Laman baru",
+       "rcfilters-filter-newpages-description": "Suntiangan nan mambuek laman baru",
        "rcfilters-filter-categorization-label": "Parubahan kategori",
+       "rcfilters-filter-categorization-description": "Rakam jajak laman nan alah ditambahkan atau diapuih dari kategori.",
        "rcfilters-filter-logactions-label": "Tindakan tacataik",
+       "rcfilters-filter-logactions-description": "Tindakan administratif, pambuatan akun, pangapusan halaman, pangunggahan...",
+       "rcfilters-hideminor-conflicts-typeofchange": "Jinih parubahan tatantu indak dapek ditandoi sabagai \"ketek\", jadi panyariang ko bakonflik jo panyariang Jinih Parubahan iko: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "Jenih parubahann ko berkonflik jo \"Suntiangan ketek\". Jenih parubahan tatantu indak dapek ditandoi sabagai \"ketek\".",
+       "rcfilters-filtergroup-lastrevision": "Revisi tabaru",
+       "rcfilters-filter-lastrevision-label": "Revisi tabaru",
+       "rcfilters-filter-lastrevision-description": "Anyo parubahan tabaru pado laman ko.",
+       "rcfilters-filter-previousrevision-label": "Bukan revisi tabaru",
+       "rcfilters-filter-previousrevision-description": "Sadoalah parubahan nan bukan marupokan \"revisi tabaru\".",
+       "rcfilters-filter-excluded": "Indak tamasuak",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:bukan</strong> $1",
+       "rcfilters-exclude-button-off": "Salain nan tapiliah",
+       "rcfilters-exclude-button-on": "Salain nan tapiliah",
        "rcfilters-view-tags": "Suntiangan ditandoi",
+       "rcfilters-view-namespaces-tooltip": "Sariang hasil manuruik ruangnamo",
+       "rcfilters-view-tags-tooltip": "Pisahan hasil manggonoan panyuntingan",
+       "rcfilters-view-return-to-default-tooltip": "Kembali ka manu panyaringan utamo",
+       "rcfilters-view-tags-help-icon-tooltip": "Palajari labiah lanjuik tantangan suntiangan jo TAG",
        "rcfilters-liveupdates-button": "Parubahan langsuang",
        "rcfilters-liveupdates-button-title-on": "Matian parubahan langsuang",
+       "rcfilters-liveupdates-button-title-off": "Tampilan parubahan baru katiko parubahan tu alah tajadi",
+       "rcfilters-watchlist-markseen-button": "Tandoi sadonyo parubahan sabagai taliek",
        "rcnotefrom": "Di bawah iko adolah {{PLURAL:$5|parubahan|babagai parubahan}} sajak <strong>$3, $4</strong> (ditampilkan sampai <strong>$1</strong> parubahan).",
        "rclistfrom": "Tunjuakan parubahan baru mulai dari tanggal $3 $2",
        "rcshowhideminor": "$1 suntiangan ketek",
index e63cd39..f33e981 100644 (file)
@@ -71,6 +71,7 @@
        "tog-useeditwarning": "Предупреди ме кога сакам да напуштам страница за уредување без да ги имам зачувано промените",
        "tog-prefershttps": "Секогаш најавувај ме преку безбедна врска",
        "tog-showrollbackconfirmation": "Прикажи потврдница при стискање на врската за отповикување",
+       "tog-requireemail": "Барај е-пошта за ставање нова лозинка",
        "underline-always": "Секогаш",
        "underline-never": "Никогаш",
        "underline-default": "Според рувото или прелистувачот",
        "createaccountmail": "Дај привремена произволна лозинка и испрати ја на укажаната адреса",
        "createaccountmail-help": "Може да се користи за создавање на сметка во туѓо име без да ја знаете лозинката.",
        "createacct-realname": "Вистинско име (незадолжително)",
-       "createacct-reason": "Причина",
+       "createacct-reason": "Причина (јавно заведена)",
        "createacct-reason-ph": "Зошто правите друга сметка",
        "createacct-reason-help": "Порака што се прикажува во дневникот на создадени сметки",
        "createacct-submit": "Направи ја сметката",
        "resettokens-watchlist-token": "Шифра за тековникот (Атом/RSS) на [[Special:Watchlist|измени во набљудуваните]]",
        "resettokens-done": "Шифрата е вратена одново.",
        "resettokens-resetbutton": "Врати избрани шифри",
-       "bold_sample": "Задебелен текст",
-       "bold_tip": "Задебелен текст",
-       "italic_sample": "Закосен текст",
-       "italic_tip": "Закосен текст",
-       "link_sample": "Наслов на врска",
-       "link_tip": "Внатрешна врска",
-       "extlink_sample": "http://www.example.com наслов на врска",
-       "extlink_tip": "Надворешна врска (со претставката http://)",
-       "headline_sample": "Наслов",
-       "headline_tip": "Поднаслов",
-       "nowiki_sample": "Овде внесете неформатиран текст",
-       "nowiki_tip": "Занемари викиформатирање",
-       "image_sample": "Пример.jpg",
-       "image_tip": "Вметната слика",
-       "media_sample": "Пример.ogg",
-       "media_tip": "Врска до податотека",
-       "sig_tip": "Вашиот потпис со време",
-       "hr_tip": "Хоризонтална линија",
        "summary": "Опис:",
        "subject": "Наслов:",
        "minoredit": "Ова е ситна промена",
        "undo-norev": "Измената не можеше да биде вратена бидејќи не постои или била избришана.",
        "undo-nochange": "Се чини дека измената (уредувањето) е веќе вратена.",
        "undo-summary": "Откажано уредувањето $1 на уредникот [[Special:Contribs/$2|$2]] ([[User talk:$2|разговор]])",
+       "undo-summary-anon": "Отповикај ја преработката $1 на [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Поништи ја преработката $1 на скриен корисник",
        "cantcreateaccount-text": "Создавањето на корисничка сметка од оваа IP-адреса (<strong>$1</strong>) е блокирано од страна на [[User:$3|$3]].\n\nОбразложението дадено од страна на $3 е <em>$2</em>",
        "cantcreateaccount-range-text": "Создавањето на сметки од IP-адреси во опсегот <strong>$1</strong> каде спаѓа вашата IP-адреса (<strong>$4</strong>) е блокирано од корисникот [[User:$3|$3]].\n\n$3 ја наведе следнава причина: <em>$2</em>",
        "prefs-help-email": "Е-поштата е незадолжителна, но ќе ви треба за добивање на нова лозинка ако си ја заборавите постоечката.",
        "prefs-help-email-others": "Можете да изберете другите да ве контактираат преку вашата корисничка страница без да го откриете вашиот идентитет.",
        "prefs-help-email-required": "Е-поштенска адреса е задолжително да се наведе.",
+       "prefs-help-requireemail": "Ако е штиклирано, можноста за нова лозинка ќе ја имаат само корисниците што навеле корисничко име и е-пошта.",
        "prefs-info": "Основни информации",
        "prefs-i18n": "Јазик",
        "prefs-signature": "Потпис",
        "listfiles-userdoesnotexist": "Корисничката сметка „$1“ не е регистрирана.",
        "imgfile": "податотека",
        "listfiles": "Список на податотеки",
+       "listfiles_subpage": "Подигања на $1",
        "listfiles_thumb": "Минијатура",
        "listfiles_date": "Датум",
        "listfiles_name": "Име",
        "cantrollback": "Уредувањето не може да се отповика.\nПоследниот уредник е воедно и единствениот автор на страницата.",
        "alreadyrolled": "Не може да се отповика последното уредување на страницата „[[:$1]]“ извршено од  [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nнекој друг веќе ја изменил или отповикал страницата.\n\nПоследното уредување го изврши [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Коментарот на уредувањето беше: <em>$1</em>.",
-       "revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
+       "revertpage": "Отповикани уредувањата на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), враќајќи на последната преработка на [[User:$1|$1]]",
+       "revertpage-anon": "Отповикани уредувања на [[Special:Contributions/$2|$2]], враќајќи на последната преработка на [[User:$1|$1]]",
        "revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откажани уредувањата на {{GENDER:$3|$1}};\nвратено на последната верзија на {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Седницата не успеа",
        "ipblocklist-legend": "Најди блокиран корисник",
        "blocklist-userblocks": "Скриј блокирања на корис. сметки",
        "blocklist-tempblocks": "Скриј привремени блокирања",
+       "blocklist-indefblocks": "Скриј бесконечни блокови",
        "blocklist-addressblocks": "Скри блокирања на поединечни IP-адреси",
        "blocklist-type": "Вид:",
        "blocklist-type-opt-all": "Сите",
        "mycustomjsredirectprotected": "Немате дозвола да ја уредувате оваа страница со JavaScript бидејќи претставува пренасочување и не води кон вашиот именски простор.",
        "easydeflate-invaliddeflate": "Содржината не е соодветно прочистена",
        "unprotected-js": "JavaScript не може да се вчита од незаштитени страници од безбедносни причини. Создавајте JavaScript само во именскиот простор МедијаВики: или како корисничка потстраница",
-       "userlogout-continue": "Дали сакате да се одјавите?"
+       "userlogout-continue": "Дали сакате да се одјавите?",
+       "rest-prefix-mismatch": "Побараната патека ($1) не беше во основната приложничка патека REST ($2)",
+       "rest-wrong-method": "Наинот на барање ($1) {{PLURAL:$3|не е допуштениот за оваа патека|не е меѓу допуштените за оваа патека}} ($2)",
+       "rest-no-match": "Побараната односна патека ($1) не одговара на познат обработувач"
 }
index 30edb01..55a05eb 100644 (file)
        "resettokens-watchlist-token": " [[Special:Watchlist|താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളിലുണ്ടാകുന്ന മാറ്റങ്ങളുടെ]] വെബ് ഫീഡ് (ആറ്റം/ആർ.എസ്.എസ്.) ചീട്ട്",
        "resettokens-done": "ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കപ്പെട്ടു.",
        "resettokens-resetbutton": "തിരഞ്ഞെടുത്ത ചീട്ടുകൾ പുനഃസജ്ജീകരിക്കുക",
-       "bold_sample": "കടുപ്പിച്ച എഴുത്ത്",
-       "bold_tip": "കടുപ്പിച്ചെഴുതുവാൻ",
-       "italic_sample": "ചെരിച്ചുള്ള എഴുത്ത്",
-       "italic_tip": "ചെരിച്ചുള്ള എഴുത്ത്",
-       "link_sample": "വിക്കികണ്ണി",
-       "link_tip": "വിക്കികണ്ണി ചേർക്കുവാൻ",
-       "extlink_sample": "http://www.example.com കണ്ണി തലക്കെട്ട്",
-       "extlink_tip": "പുറത്തേക്കുള്ള കണ്ണി (http:// എന്ന ഉപസർഗ്ഗം ചേർക്കാൻ ഓർമ്മിക്കുക)",
-       "headline_sample": "തലക്കെട്ടിനുള്ള വാചകം ഇവിടെ ചേർക്കുക",
-       "headline_tip": "രണ്ടാംഘട്ട തലക്കെട്ട്",
-       "nowiki_sample": "വിക്കിഫോർമാറ്റിങ്ങ് ഉപയോഗിക്കേണ്ടാത്ത എഴുത്ത് ഇവിടെ ചേർക്കുക",
-       "nowiki_tip": "വിക്കിരീതി അവഗണിക്കുക",
-       "image_tip": "ചിത്രം ചേർക്കുവാൻ",
-       "media_tip": "മീഡിയയിലേക്ക് വിക്കി-കണ്ണി ചേർക്കുവാൻ",
-       "sig_tip": "തിരുത്തൽ സമയമടക്കമുള്ള താങ്കളുടെ ഒപ്പ്",
-       "hr_tip": "തിരശ്ചീനരേഖ (മിതമായി മാത്രം ഉപയോഗിക്കുക)",
        "summary": "ചുരുക്കം:",
        "subject": "വിഷയം:",
        "minoredit": "ഇതൊരു ചെറിയ തിരുത്താണ്",
        "listfiles-userdoesnotexist": "ഉപയോക്തൃ അംഗത്വം \"$1\" എടുക്കപ്പെട്ടിട്ടില്ല.",
        "imgfile": "പ്രമാണം",
        "listfiles": "പ്രമാണങ്ങളുടെ പട്ടിക",
+       "listfiles_subpage": "$1 ചെയ്ത അപ്‌ലോഡുകൾ",
        "listfiles_thumb": "ലഘുചിത്രം",
        "listfiles_date": "തീയതി",
        "listfiles_name": "പേര്",
index e9b8a08..ff9297a 100644 (file)
        "resettokens-token-label": "$1 (одоогийн утга: $2)",
        "resettokens-done": "Токен ресет хийлээ.",
        "resettokens-resetbutton": "Сонгосон токеныг ресет хийх",
-       "bold_sample": "Тодруулсан бичиг",
-       "bold_tip": "Тодруулсан бичиг",
-       "italic_sample": "Налуу бичиг",
-       "italic_tip": "Налуу бичиг",
-       "link_sample": "Холбоосны нэр",
-       "link_tip": "Дотоод холбоос",
-       "extlink_sample": "http://www.example.com холбоосны нэр",
-       "extlink_tip": "Гадны холбоос (эхэнд нь http:// бичихээ мартуузай)",
-       "headline_sample": "Гарчгийн текст",
-       "headline_tip": "2-р түвшний гарчиг",
-       "nowiki_sample": "Энд хэлбэршүүлээгүй текстээ оруулна уу",
-       "nowiki_tip": "Вики форматыг хэрэглэхгүй байх",
-       "image_sample": "жишээ.jpg",
-       "image_tip": "Оруулсан файл",
-       "media_sample": "Жишээ.ogg",
-       "media_tip": "Файлын холбоос",
-       "sig_tip": "Таны бичлэг үйлдсэн цагтай гарын үсэг",
-       "hr_tip": "Хөндлөн шугам (бага хэрэглээрэй)",
        "summary": "Товч агуулга:",
        "subject": "Сэдэв/гарчиг:",
        "minoredit": "Энэ бол бага зэргийн засвар",
index 17a46a4..e3ca807 100644 (file)
        "changeemail-none": "(ꯑꯃꯥꯇꯥ ꯅꯠꯇꯦ)",
        "changeemail-password": "ꯅꯪꯒꯤ {{SITENAME}} ꯄꯥꯁꯋ꯭ꯔꯠ:",
        "changeemail-submit": "ꯏ-ꯃꯦꯜ ꯍꯣꯡꯕꯥ",
-       "bold_sample": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ",
-       "bold_tip": "ꯆꯥꯎꯅꯥ ꯏꯕꯥ",
-       "italic_sample": "ꯋꯥꯔꯦꯡ ꯐꯩꯅꯥ ꯏꯕꯥ",
-       "italic_tip": "ꯋꯥꯔꯦꯡ ꯐꯩꯅꯥ ꯏꯕꯥ",
-       "link_sample": "ꯑꯄꯤꯕ ꯃꯃꯤꯡ ꯁꯝꯅꯐꯝ",
-       "link_tip": "ꯃꯅꯨꯡꯒꯥ ꯁꯝꯅꯐꯝ",
-       "extlink_sample": "http://www.example.com ꯁꯝꯅꯐꯝꯒꯤꯃꯃꯤꯡ",
-       "extlink_tip": "ꯑꯇꯣꯞꯄꯥꯒꯥ ꯁꯝꯅꯐꯝ (ꯀꯥꯎꯒꯅꯨ http:// prefix)",
-       "headline_sample": "ꯃꯀꯣꯛꯀꯤ ꯋꯥꯔꯦꯡ ꯄꯥꯔꯦꯡ",
-       "headline_tip": "꯲ ꯁꯨꯕꯥ ꯃꯀꯣꯛꯀꯤ ꯄꯔꯦꯡ",
-       "nowiki_sample": "ꯍꯥꯞꯆꯤꯟꯂꯨ non formating ꯋꯥꯔꯦꯡꯗꯨ ꯁꯤꯗꯥ",
-       "nowiki_tip": "ꯋꯤꯀꯤꯒꯤ ꯃꯥꯑꯣꯡ ꯁꯦꯝꯕꯗꯨ ꯊꯧꯑꯣꯏꯗꯕꯥ",
-       "image_tip": "ꯅꯝꯁꯤꯟꯂꯕꯥ ꯐꯥꯏꯜ",
-       "media_tip": "ꯐꯥꯏꯜꯒꯤ ꯁꯝꯅꯐꯝ",
-       "sig_tip": "ꯃꯇꯝꯒꯤ ꯏꯁꯇꯥꯝꯒꯥ ꯂꯣꯏꯟꯅꯥ ꯅꯪꯒꯤ ꯈꯨꯇꯌꯦꯛ",
-       "hr_tip": "ꯐꯩꯅꯥ ꯆꯤꯡꯕꯥ ꯂꯥ ꯏ (ꯃꯔꯤꯛ ꯃꯔꯤꯛ ꯑꯣꯏꯅꯥ ꯁꯤꯖꯤꯟꯅꯧ)",
        "summary": "ꯑꯇꯦꯟꯕꯥ ꯁꯟꯗꯣꯛꯅꯥ ꯇꯥꯛꯄꯥ:",
        "subject": "ꯍꯤꯔꯝ:",
        "minoredit": "ꯃꯁꯤ ꯑꯄꯤꯛꯄꯥ ꯁꯦꯝꯒꯠꯄꯅꯤ",
index 35b1be2..fd31873 100644 (file)
        "resettokens-token-label": "$1 (ၚုဟ်မးလၟုဟ်: $2)",
        "resettokens-done": "ကလေၚ်ချိၚ်ဟီုတုဲတအ်.",
        "resettokens-resetbutton": "ကလေၚ်ချိၚ် မဟီုတုဲမရုဲစှ်လဝ်တအ်",
-       "bold_sample": "မလိက် တီု",
-       "bold_tip": "မလိက် တီု",
-       "italic_sample": "မလိက်ဓစေင်",
-       "italic_tip": "မလိက်ဓစေင်",
-       "link_sample": "လေန် က္ဍိုပ်လိက်",
-       "link_tip": "လေန် ဗွဲအပ္ဍဲ",
-       "extlink_sample": "http://www.example.com လေန် က္ဍိုပ်လိက်",
-       "extlink_tip": "လေန် ဗွဲမ္ၚး (remember http:// prefix)",
-       "headline_sample": "မလိက် က္ဍိုပ်လိက်",
-       "headline_tip": "က္ဍိုပ်လိက် ကဆံင် ၂",
-       "nowiki_sample": "စုတ် မလိက် ဟွံ-ဖျေဟ်ဗီုပြင်ဏီ ပ္ဍဲဒၞာဲဏအ်",
-       "nowiki_tip": "Ignore wiki formatting",
-       "image_tip": "ဝှာင် မစုတ်လဝ် Embedded",
-       "media_tip": "လေန် ဝှာင်",
-       "sig_tip": "စၟတ်တဲ မၞး နကဵု တဆိပ်အခိင်",
-       "hr_tip": "လာင် ဗွဲလနေင်",
        "summary": "သကေမ်",
        "subject": "ပရူပရာ\nဒါန်ပေၚ်အာ ၁၀၀၀ တုဲညးပလံၚ်နၚ် အခေါၚ်ခၞံမုက်လိက်ဏအ်။\nတၚ်ဂုဏ်ရ။",
        "minoredit": "ဣဏအ်ဂှ် ဒှ်အရာ မပလေဝ်ဒါန် ညိည",
index 8c20f92..6937405 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|आपल्या निरीक्षणसूचीतील पानांमधील बदलाचा]] वेब रसद बिल्ला (अॅटम/आरएसएस)",
        "resettokens-done": "ओळखचिन्हे पुनर्स्थापन.",
        "resettokens-resetbutton": "निवडलेली ओळखचिन्हे पुनर्स्थापित करा",
-       "bold_sample": "ठळक मजकूर",
-       "bold_tip": "ठळक मजकूर",
-       "italic_sample": "तिरकी अक्षरे",
-       "italic_tip": "तिरकी अक्षरे",
-       "link_sample": "दुव्याचे शीर्षक",
-       "link_tip": "अंतर्गत दुवा",
-       "extlink_sample": "http://www.example.com दुव्याचे शीर्षक",
-       "extlink_tip": "बाह्य दुव्यात (http:// हा उपसर्ग विसरू नका)",
-       "headline_sample": "मथळा मजकुर",
-       "headline_tip": "द्वितीय-स्तर अग्रशीर्ष",
-       "nowiki_sample": "अस्वरूपित मजकूर येथे भरा",
-       "nowiki_tip": "विकिभाषेप्रमाणे बदल करू नका",
-       "image_tip": "संलग्न संचिका",
-       "media_tip": "संचिकेचा दुवा",
-       "sig_tip": "वेळेबरोबर तुमची सही",
-       "hr_tip": "आडवी रेषा (अपवादानेच वापरा)",
        "summary": "बदलांचा आढावा :",
        "subject": "विषय:",
        "minoredit": "हा एक छोटा बदल आहे",
index 6874d1c..a193b3e 100644 (file)
        "resettokens-watchlist-token": "Token untuk suapan sesawang (Atom/RSS) bagi [[Special:Watchlist|perubahan pada halaman dalam senarai pantau anda]]",
        "resettokens-done": "Token diset semula.",
        "resettokens-resetbutton": "Set semula token terpilih",
-       "bold_sample": "Teks tebal",
-       "bold_tip": "Teks tebal",
-       "italic_sample": "Teks condong",
-       "italic_tip": "Teks condong",
-       "link_sample": "Tajuk pautan",
-       "link_tip": "Pautan dalaman",
-       "extlink_sample": "http://www.example.com tajuk pautan",
-       "extlink_tip": "Pautan luar (ingat awalan http://)",
-       "headline_sample": "Teks tajuk",
-       "headline_tip": "Tajuk peringkat 2",
-       "nowiki_sample": "Masukkan teks tak berformat di sini",
-       "nowiki_tip": "Abaikan pemformatan wiki",
-       "image_sample": "Contoh.jpg",
-       "image_tip": "Imej terbenam",
-       "media_sample": "Contoh.ogg",
-       "media_tip": "Pautan fail media",
-       "sig_tip": "Tandatangan dengan cap waktu",
-       "hr_tip": "Garis melintang (gunakan dengan hemat)",
        "summary": "Ringkasan:",
        "subject": "Perkara:",
        "minoredit": "Ini ialah suntingan kecil",
index c8ec925..71135aa 100644 (file)
        "resettokens-no-tokens": "M'hemm l-ebda ''token'' biex jerġa' jiġi ssettjat.",
        "resettokens-tokens": "''Tokens'':",
        "resettokens-token-label": "$1 (valur attwali: $2)",
-       "bold_sample": "Tipa ħoxna",
-       "bold_tip": "Tipa ħoxna",
-       "italic_sample": "Tipa korsiva",
-       "italic_tip": "Tipa korsiva",
-       "link_sample": "Titlu tal-link",
-       "link_tip": "Link intern",
-       "extlink_sample": "http://www.example.com titlu tal-link",
-       "extlink_tip": "Link estern (ftakar il-prefiss http://)",
-       "headline_sample": "Kliem ta' l-ewwel vers",
-       "headline_tip": "L-ewwel vers ta' livell 2",
-       "nowiki_sample": "Daħħal test mhux formatjat hawnhekk",
-       "nowiki_tip": "Tagħtix każ il-formatjar tal-wiki",
-       "image_sample": "Eżempju.jpg",
-       "image_tip": "Fajl ingastat",
-       "media_sample": "Eżempju.ogg",
-       "media_tip": "Link tal-fajl",
-       "sig_tip": "Il-Firma tiegħek u it-timbru tal-ħin",
-       "hr_tip": "Linja mimduda (uża bil-qies)",
        "summary": "Taqsira:",
        "subject": "Suġġett/Titlu:",
        "minoredit": "Din hija modifika minuri",
index 861e85b..05416cc 100644 (file)
        "changeemail": "Altarar ó zarredar l andereço de correio eiletrónico",
        "changeemail-none": "(nanhun)",
        "resettokens": "Redefenir chabes",
-       "bold_sample": "Testo a negrito",
-       "bold_tip": "Testo a negrito",
-       "italic_sample": "Testo an eitálico",
-       "italic_tip": "Testo an eitálico",
-       "link_sample": "Títalo de la lhigaçon",
-       "link_tip": "Lhigaçon anterna",
-       "extlink_sample": "http://www.example.com títalo de la lhigaçon",
-       "extlink_tip": "Lhigaçon sterna (lembra-te de l perfixo http://)",
-       "headline_sample": "Testo de l cabeçailho",
-       "headline_tip": "Cacho de nible 2",
-       "nowiki_sample": "Poner testo nun-formatado eiqui",
-       "nowiki_tip": "Nun fazer causo de la formataçon biqui",
-       "image_tip": "Fexeiro ambutido",
-       "media_tip": "Lhigaçon pa fexeiro",
-       "sig_tip": "La tue assinatura, cun hora i data",
-       "hr_tip": "Lhinha hourizontal (outeliza cun regra)",
        "summary": "Resumo:",
        "subject": "Assunto/cabeçailho:",
        "minoredit": "Marcar cumo eidiçon pequerrixa",
index cd64fb3..ecf4a40 100644 (file)
        "resettokens-tokens": "တိုကင်များ-",
        "resettokens-token-label": "$1 (လက်ရှိတန်ဖိုး: $2)",
        "resettokens-resetbutton": "ရွေးချယ်ထားသော တိုကင်များကို ပြန်ချိန်ရန်",
-       "bold_sample": "စာလုံးမည်း",
-       "bold_tip": "စာလုံးမည်း",
-       "italic_sample": "စာလုံး အစောင်း",
-       "italic_tip": "စာလုံး အစောင်း",
-       "link_sample": "လင့်ခ် ခေါင်းစဉ်",
-       "link_tip": "အတွင်းပိုင်း လင့်ခ်",
-       "extlink_sample": "http://www.example.com လင့်ခ် ခေါင်းစဉ်",
-       "extlink_tip": "ပြင်ပလင့်များ (http:// ကို ရှေ့ဆုံးမှ ထည့်ရေးရန် မမေ့ပါနှင့်)",
-       "headline_sample": "ခေါင်းကြီးစာသား",
-       "headline_tip": "အဆင့် ၂ ခေါင်းစီး",
-       "nowiki_sample": "ဖောမတ်မလုပ်ထားသော စာများကို ဤနေရာတွင် ထည့်ရန်",
-       "nowiki_tip": "ဝီကီပုံစံ ဖော်မတ်များကို လျစ်လျူရှုရန်",
-       "image_sample": "ဥပမာ.jpg",
-       "image_tip": "Embedded ထည့်ထားသော ဖိုင်",
-       "media_sample": "ဥပမာ.ogg",
-       "media_tip": "ဖိုင်လင့်",
-       "sig_tip": "အချိန်ပါပြသော သင့်လက်မှတ်",
-       "hr_tip": "မျဉ်းလဲ (စိစစ်သုံးရန်)",
        "summary": "အ​ကျဉ်း​ချုပ်​ -",
        "subject": "အကြောင်းအရာ:",
        "minoredit": "အရေးမကြီးသော ​ပြင်​ဆင်​မှု ​ဖြစ်​သည်​",
        "rollbacklinkcount": "{{PLURAL:$1|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}} $1 ကို နောက်ပြန်ပြင်ရန်",
        "rollbacklinkcount-morethan": "$1 ထက်ပိုသော {{PLURAL:$1|တည်းဖြတ်မှု|တည်းဖြတ်မှုများ}}ကို နောက်ပြန်ပြင်ရန်",
        "rollbackfailed": "နောက်ပြန်ပြင်ခြင်း မအောင်မြင်ခဲ့ပါ။",
+       "cantrollback": "နောက်ပြန်မပြင်နိုင်ပါ၊ နောက်ဆုံးပံ့ပိုးသူမှာ ဤစာမျက်နှာ၏ တစ်ဦးတည်းသော စာရေးသူဖြစ်ပါသည်။",
        "editcomment": "တည်းဖြတ်မှု အကျဉ်းချုပ်မှာ: <em>$1</em>။",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ ပြင်ဆင်မှုများကို [[User:$1|$1]] ၏ နောက်ဆုံးတည်းဖြတ်မူသို့ နောက်ပြန် ပြန်ပြင်ခဲ့သည်",
+       "rollback-success": "{{GENDER:$3|$1}} မှ နောက်ပြန်ပြင်ခဲ့သည်၊  {{GENDER:$4|$2}} ၏ နောက်ဆုံးမူသို့ ပြန်ပြောင်းခဲ့သည်။",
        "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": "မာတိကာမော်ဒယ် ပြောင်းလဲခဲ့သည်",
        "tag-mw-undo": "နောက်ပြန် ပြန်ပြင်ခြင်း",
        "tags-title": "အမည်တွဲများ",
        "tags-tag": "အမည်တွဲ အမည်",
+       "tags-display-header": "ပြောင်းလဲချက် စာရင်းများပေါ်တွင် ပေါ်ထင်မှု",
        "tags-description-header": "ဆိုလိုရင်းအဓိပ္ပာယ် အပြည့်အစုံ",
        "tags-source-header": "ရင်းမြစ်",
+       "tags-active-header": "သက်ဝင်?",
+       "tags-hitcount-header": "အမည်တွဲထားသော ပြောင်းလဲမှုများ",
        "tags-actions-header": "ဆောင်ရွက်ချက်များ",
        "tags-active-yes": "မှန်",
        "tags-active-no": "မလုပ်ပါ",
        "userjsispublic": "ကျေးဇူးပြု၍ မှတ်သားပါ- JavaScript စာမျက်နှာခွဲများတွင် အခြားအသုံးပြုသူများ ကြည့်ရှုနိုင်သော လျို့ဝှက်အပ်သည့်အချက်အလက် မပါဝင်သင့်ပါ။",
        "edit-error-short": "အမှား - $1",
        "edit-error-long": "အမှားများ:\n\n$1",
+       "specialmute-submit": "အတည်ပြုရန်",
        "pageid": "စာမျက်နှာအိုင်ဒီ $1",
        "gotointerwiki": "{{SITENAME}} မှ ထွက်ခွာနေသည်",
        "pagedata-title": "စာမျက်နှာ ဒေတာ",
index 03397b1..fda38b4 100644 (file)
        "changeemail-none": "(арась мезе невтемс)",
        "changeemail-password": "«{{SITENAME}}» проектэнь салававалот:",
        "changeemail-submit": "Полавтомс е-сёрмапаргот",
-       "bold_sample": "Эчке текст",
-       "bold_tip": "Эчке текст",
-       "italic_sample": "Комавтонь текст",
-       "italic_tip": "Комавтонь текст",
-       "link_sample": "Сюлмавомапень конякс",
-       "link_tip": "Потмоёндонь сюлмавомапе",
-       "extlink_sample": "http://www.example.com налткенть лемезе",
-       "extlink_tip": "Ушо ёнксонь сюлмавкс / налтке (мельсэ кирдить http:// путовксонть)",
-       "headline_sample": "Конякссонть текстэсь",
-       "headline_tip": "Омбоце эскельксэнь конякс",
-       "nowiki_sample": "Совавтомс хворматтомо текст тезэнь",
-       "nowiki_tip": "Wiki -нь поладомантень-витнемантень мель апак яво",
-       "image_sample": "Саемга.jpg",
-       "image_tip": "Путонь медия файла",
-       "media_sample": "Саемга.ogg",
-       "media_tip": "Медия файлантень сюлмавома пе (налтке)",
-       "sig_tip": "Шка марто кедь путовксот",
-       "hr_tip": "Менель кирьксэнь кикс (тевс нолдыть ванстозь)",
        "summary": "Вейсэндязь:",
        "subject": "Сёрмадовксонть лемезэ:",
        "minoredit": "Те апокшке витнема-петнема",
index 211031b..1840532 100644 (file)
        "changeemail-newemail": "ترنه ایمیل آدرس:",
        "changeemail-none": "(هچّی)",
        "changeemail-submit": "ایمیل ره عوض هاکردن",
-       "bold_sample": "ضخیم",
-       "bold_tip": "ضخیم",
-       "italic_sample": "کژ",
-       "italic_tip": "کژ",
-       "link_sample": "لینک ِسرنوم",
-       "link_tip": "درونی لینک",
-       "extlink_sample": "http://www.example.com مثال",
-       "extlink_tip": "بیرون بگردستن (پیشوند http://‎ ره یادنکانین)",
-       "headline_sample": "متن عنوان",
-       "headline_tip": "عنوان بند ۲",
-       "nowiki_sample": "شه بی فورمت بنویشته ره اینجه دکانین",
-       "nowiki_tip": "فورمت سر چش ره کوریک بَیره",
-       "image_tip": "بنویشته‌ی دله‌ی عکس",
-       "media_tip": "فایل ِلینک",
-       "sig_tip": "شمه امضا و ونه په‌ی ِتاریخ",
-       "hr_tip": "افقی خط (ونه کمته کار بکشین)",
        "summary": "کار ِگزارش:",
        "subject": "موضوع یا عنوان:",
        "minoredit": "اینتا دچی‌یه خله جزئی بی‌یه",
index 64627e7..3e10f78 100644 (file)
        "resetpass-submit-loggedin": "Ticpatlāz motlahtōlichtacāyo",
        "resetpass-submit-cancel": "Moxitiniz",
        "passwordreset-username": "Tequihuihcātōcāitl:",
-       "bold_sample": "Tliltic tlahcuiloliztli",
-       "bold_tip": "Tliltic tlahcuiloliztli",
-       "italic_sample": "Nacacic tlahcuiloliztli",
-       "italic_tip": "Nacacic tlahcuiloliztli",
-       "link_sample": "Tzonhuiliztli ītōcā",
-       "link_tip": "Tlahtic tzonhuiliztli",
-       "extlink_sample": "http://www.machiyōtl.com Tzonhuiliztōcāitl",
-       "extlink_tip": "Calān tzonhuiliztli (xiquilnamiqui ticaquiāz in http://)",
-       "headline_sample": "Cuātlahcuilōlli",
-       "headline_tip": "Iuhcāyōtl 2 tōcāyōtl",
-       "image_sample": "Machiyotl.jpg",
-       "media_sample": "Machiyotl.ogg",
-       "media_tip": "Mēdiahuīc tzonhuiliztli",
-       "sig_tip": "Motōcā īca cāhuitl",
-       "hr_tip": "Pāntli",
        "summary": "Mopatlaliz:",
        "subject": "Itechpa:",
        "minoredit": "Ca tepiton inin tlapatlaliztli",
index 05bc973..6f45db8 100644 (file)
        "changeemail-submit": "Kái-piàn tiān-chu-phoe",
        "changeemail-throttled": "Lí chi̍t-ê-á teng-ji̍p liáu siuⁿ chē kái.\nChiáⁿ tan-thāi $1 kòe-āu chài chhì chi̍t pái.",
        "changeemail-nochange": "Chhiáⁿ su-ji̍p chi̍t-ê bô-kâng ê sin tiān-chú-phoe chū-chí.",
-       "bold_sample": "Chho·-thé bûn-jī",
-       "bold_tip": "Chho·-thé jī",
-       "italic_sample": "Chhú-thé ê bûn-jī",
-       "italic_tip": "Chhú-thé jī",
-       "link_sample": "Liân-kiat piau-tê",
-       "link_tip": "Lōe-pō· ê liân-kiat",
-       "extlink_sample": "http://www.example.com liân-kiat piau-tê",
-       "extlink_tip": "Gōa-pō· ê liân-kiat (ē-kì-tit thâu-chêng ài ke http://)",
-       "headline_sample": "Thâu-tiâu bûn-jī",
-       "headline_tip": "Tē-2-chân (level 2) ê phiau-tê",
-       "nowiki_sample": "Chia siá bô keh-sek ê bûn-jī",
-       "nowiki_tip": "Mài chhap wiki keh-sek",
-       "image_sample": "Iann-siong-e-le.jpg",
-       "image_tip": "Giap tī lāi-bīn ê iáⁿ-siōng",
-       "media_tip": "Tóng-àn liân-kiat",
-       "sig_tip": "Lí ê chhiam-miâ kap sî-kan ìn-á",
-       "hr_tip": "Thán-pîⁿ-chōa (hàn leh ēng)",
        "summary": "Khài-iàu:",
        "subject": "Tê-bo̍k:",
        "minoredit": "Che sī sió siu-kái",
index 3365b11..105f3d3 100644 (file)
        "errorpagetitle": "Sbaglio",
        "returnto": "Torna a $1.",
        "tagline": "'A {{SITENAME}}.",
-       "help": "Ajùto",
+       "help": "Ajuto",
        "help-mediawiki": "Ajuto ncopp' 'a MediaWiki",
-       "search": "Truova",
+       "search": "Cerca",
        "search-ignored-headings": " #<!-- lassa sta linea comme sta --> <pre>\n# Testate ca se sarranno gnurate int' 'a ricerca.\n# Cagnamiente a chesto addeventarranno affettive quanno 'a paggena sarrà innecizzata.\n# Vuje putite forzà 'a reinnecezzazzione d' 'a paggena facenno nu cagnamiento abbacante.\n# 'A sintasse è 'a seguente:\n#   * Ogneccosa 'a 'o carattere \"#\" 'nzegna 'a fine d' 'a linea è 'nu cummanno\n#   * Ogne linea chiena è 'o titolo esatto 'a gnurà, case e tutteccose\nRiferimente\nJonte 'e fore\nVide pure\n #</pre> <!-- lassa sta linea comme sta  -->",
-       "searchbutton": "Truova",
+       "searchbutton": "Cerca",
        "go": "Vàje",
-       "searcharticle": "Vàje",
+       "searcharticle": "Vaje",
        "history": "Verziune 'e primma",
        "history_short": "Cronologgia",
        "history_small": "cronologgia",
        "updatedmarker": "cagnamiénte 'e ll'urdema visita d' 'a mia",
-       "printableversion": "Verzione pe' stampa",
+       "printableversion": "Verzione p''a stampa",
        "permalink": "Jonta permanente",
        "print": "Stampà",
        "view": "Vire",
        "view-foreign": "Vide ncopp'a $1",
-       "edit": "Càgna",
+       "edit": "Cagna",
        "edit-local": "Càgna descrizione lucale",
        "create": "Crèa",
        "create-local": "Azzecca descrizione lucale",
        "protect": "Prutegge",
        "protect_change": "càgna",
        "unprotect": "Càgna prutezzione",
-       "newpage": "Paggena nòva",
-       "talkpagelinktext": "Chiàcchiera",
+       "newpage": "Paggena nova",
+       "talkpagelinktext": "chiacchiera",
        "specialpage": "Paggena speciàle",
-       "personaltools": "Strumiente perzonale",
-       "talk": "Chiàcchiera",
+       "personaltools": "Strumente perzonale",
+       "talk": "Chiacchiera",
        "views": "Visite",
-       "toolbox": "Strumiente",
+       "toolbox": "Strumente",
        "tool-link-userrights": "Càgna gruppe {{GENDER:$1|utente}}",
        "tool-link-userrights-readonly": "Vire gruppe {{GENDER:$1|utente}}",
        "tool-link-emailuser": "Manna na masciata email a st'{{GENDER:$1|utente}}",
-       "imagepage": "Vere a paggena d' 'o file",
-       "mediawikipage": "Vere 'a mmasciata",
-       "templatepage": "Vere 'o template",
-       "viewhelppage": "Vere 'a paggena 'e ajùto",
-       "categorypage": "Vere 'a categurìa",
+       "imagepage": "Vire 'a paggena d' 'o file",
+       "mediawikipage": "Vire 'a mmasciata",
+       "templatepage": "Vire 'o template",
+       "viewhelppage": "Vire 'a paggena 'e ajùto",
+       "categorypage": "Vire 'a categurìa",
        "viewtalkpage": "Vere 'a paggena 'e chiàcchierate",
        "otherlanguages": "Ate lengue",
        "redirectedfrom": "(Redirect 'a $1)",
        "viewcount": "Chesta paggena è stata liggiùta {{PLURAL:$1|una vòta|$1 vòte}}.",
        "protectedpage": "Paggena prutetta",
        "jumpto": "Vaje a:",
-       "jumptonavigation": "navigazione",
-       "jumptosearch": "truova",
+       "jumptonavigation": "navigazzione",
+       "jumptosearch": "cerca",
        "view-pool-error": "Ve cercammo scusa, 'e servers hanno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta paggena.\nPe' piacere, aspettate nu poco primma 'e turnà a carrecà sta paggena.\n\n$1",
        "generic-pool-error": "Ve cercammo scusa, 'e servers hanno troppo carico mo'.\nTroppe utente stanno cercanno 'e veré sta risorsa.\nPe' piacere, aspettate nu poco primma 'e turnà a carrecà sta risorsa.",
        "pool-timeout": "Tiempo pe' s'aspettà ô blocco",
        "pool-errorunknown": "Errore scanusciuto",
        "pool-servererror": "'O servizio contatore d''e fatiche nun è a disposizióne ($1).",
        "poolcounter-usage-error": "Errore d'uso: $1",
-       "aboutsite": "'Nfrummazione ncòpp'a {{SITENAME}}",
-       "aboutpage": "Project:'Nfrummazione",
+       "aboutsite": "'Nfurmazzione ncòpp''a {{SITENAME}}",
+       "aboutpage": "Project:'Nfurmazzione",
        "copyright": "Cuntenute suggiette a licienza 'e auso $1 se nun fuje ritto atro.",
        "copyrightpage": "{{ns:project}}:Copyrights",
        "currentevents": "Nuvità",
        "currentevents-url": "Project:Novità",
-       "disclaimers": "Avvertimiènte",
-       "disclaimerpage": "Project:Avvertimiènte generale",
+       "disclaimers": "Avvertimiente",
+       "disclaimerpage": "Project:Avvertimiente generale",
        "edithelp": "Guida",
        "helppage-top-gethelp": "Ajùto",
        "mainpage": "Paggena prencepale",
        "mainpage-description": "Paggena prencepale",
        "policy-url": "Project:Policy",
-       "portal": "Porta d’'a commonetà",
-       "portal-url": "Project:Porta d''a commonetà",
-       "privacy": "'Nformazzione ppe a privacy",
-       "privacypage": "Project:'Nfrummazione ncopp'â privacy",
+       "portal": "Porta d''a communetà",
+       "portal-url": "Project:Porta d''a communetà",
+       "privacy": "'Nfurmazzione p''a privacy",
+       "privacypage": "Project:'Nfurmazzione p''a privacy",
        "badaccess": "Nun aie bastante licenzia",
        "badaccess-group0": "Nun tiene 'a licenzia pe ffà l'azione richiesta.",
        "badaccess-groups": "L'azione ch'ê addemmannato 'a pô ffà sulamente ll'utente ca stanno dint'a {{PLURAL:$2|'o gruppo|uno d' 'e gruppe}}: $1.",
        "newmessageslinkplural": "{{PLURAL:$1|na mmasciata nova|999=mmasciate nnove}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|urdemo cagnamiento|999=urdeme cagnamiente}}",
        "youhavenewmessagesmulti": "Tiene nuove mmasciate $1",
-       "editsection": "càgna",
+       "editsection": "cagna",
        "editold": "càgna",
-       "viewsourceold": "vere sorgente",
+       "viewsourceold": "vire sorgente",
        "editlink": "càgna",
        "viewsourcelink": "Vire sorgente",
        "editsectionhint": "Modifica a sezzione $1",
        "site-atom-feed": "Feed Atom 'e $1",
        "page-rss-feed": "Feed RSS pe' \"$1\"",
        "page-atom-feed": "Feed Atom ppe \"$1\"",
-       "red-link-title": "$1 ('a paggena nun esiste)",
+       "red-link-title": "$1 (sta paggena nun esiste)",
        "sort-descending": "Urdinamento dicriscente",
        "sort-ascending": "Urdinamento criscente",
        "nstab-main": "Articulo",
        "perfcachedts": "'E ddate ca stanno ccà songhe asciute 'a na copia \"cache\" d' 'o database, 'o cuale tene l'úrdemo agghiurnamento 'o $1. Nu massimo 'e {{PLURAL:$4|unu risultato è|$4 risultate songhe}} a disposizione dint'a \"cache\".",
        "querypage-no-updates": "Ll'agghiurnamente pe' sta paggena songo sospese mmo'. 'E ddate cuntenute ccà nun s'agghiurnarranno.",
        "viewsource": "Vere sorgente",
-       "viewsource-title": "Vere surgente 'e $1",
+       "viewsource-title": "Vire 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 ntuppà 'o càgno o quacche ata azione.",
        "loginlanguagelabel": "Lengua: $1",
        "suspicious-userlogout": "'A richiesta 'e disconnessione d' 'a toja è stata negate pecché pare ca fosse mannata 'a nu navigatóre rutto o nu proxy 'e \"caching\".",
        "createacct-another-realname-tip": "'O nomme overo vuosto è ozzionale.\nSi sciglite 'e nzertà 'o nomme overo, chesto s'ausarrà pe' dà l'utente l'attribuzione d' 'a fatica fatta.",
-       "pt-login": "Tràse",
+       "pt-login": "Trase",
        "pt-login-button": "Tràse",
        "pt-login-continue-button": "Và annanze e tràse",
-       "pt-createaccount": "Crèa nu cunto nuovo",
+       "pt-createaccount": "Crea 'nu cunto nuovo",
        "pt-userlogout": "Jèsce",
        "php-mail-error-unknown": "Errore scanusciuto dint'a funzione PHP mail()",
        "user-mail-no-addy": "Avite cercato 'e mannà na mmasciata e-mail senza indirizzo.",
        "resettokens-watchlist-token": "Token p' 'o feed web (Atom/RSS) d' 'e [[Special:Watchlist|cagnamiente a 'e paggene dint'a l'osservate spiciale tuoje]]",
        "resettokens-done": "Token riabbiate.",
        "resettokens-resetbutton": "Riabbìa 'e token scigliute",
-       "bold_sample": "Grassetto",
-       "bold_tip": "Grassetto",
-       "italic_sample": "Corsivo",
-       "italic_tip": "Corsivo",
-       "link_sample": "Titulo d' 'o cullegamento",
-       "link_tip": "Jonte nterne",
-       "extlink_sample": "http://www.example.com titulo d' 'o cullegamento",
-       "extlink_tip": "Link esterno (arricuordate 'o prefisso http:// )",
-       "headline_sample": "Testate",
-       "headline_tip": "Testate 'e 2° livello",
-       "nowiki_sample": "Azzeccà 'o testo nun-furmattato ccà",
-       "nowiki_tip": "Lassa perde' 'a furmattazione wiki",
-       "image_sample": "Essempio.jpg",
-       "image_tip": "Fiùra ncuorporata",
-       "media_tip": "Cullegamente a file multimediale",
-       "sig_tip": "Firma cu data e ora",
-       "hr_tip": "Linea orizzontale (ausà cu gedizzio)",
        "summary": "Riepilego:",
        "subject": "Suggietto:",
        "minoredit": "Chisto è nu cagnamiénto piccerillo",
        "next-page": "paggena aroppo",
        "prevn-title": "{{PLURAL:$1|Risultato precediente|$1 risultate precedenti}}",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultate successive}}",
-       "shown-title": "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
-       "viewprevnext": "Vere($1 {{int:pipe-separator}} $2) ($3).",
+       "shown-title": "Fa verè {{PLURAL:$1|nu risultato|$1 risultate}} pe paggena",
+       "viewprevnext": "Vire ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Ncopp' 'o sito esiste na paggena c' 'o nomme \"[[:$1]]\"'''\n{{PLURAL:$2|0=|Vedite pure dint'a l'ati risultate 'e cerca.}}",
-       "searchmenu-new": "<strong>'''Crèa 'a paggena \"[[:$1]]\" ncopp'a stu wiki!'''</strong> {{PLURAL:$2|0=|Vedite pure 'a paggena truvata c' 'a recerca vuosta|Vedite pure 'e risultate d\"a recerca}}",
+       "searchmenu-new": "<strong>'''Crèa 'a paggena \"[[:$1]]\" ncopp'a sta wiki!'''</strong> {{PLURAL:$2|0=|Vedite pure 'a paggena truvata c' 'a recerca vuosta|Vedite pure 'e risultate d' 'a recerca}}",
        "searchprofile-articles": "Paggene 'e contenute",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tutto",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Nomme utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|d' 'o gruppo|d' 'e gruppe}}:",
-       "group-membership-link-with-expiry": "$1 (nzin' 'a $2)",
+       "group-membership-link-with-expiry": "$1 (nzin' 'e $4 d' 'o $3)",
        "prefs-registration": "Data 'e riggistrazione:",
        "yourrealname": "Nomme vero",
        "yourlanguage": "Lengua:",
        "right-suppressionlog": "Vide 'e riggistre private",
        "right-block": "Nun fa fa' cagnamienti a ll'at'utente",
        "right-blockemail": "Nun fa mannà e-mail a n'utente",
-       "right-hideuser": "Blocca n'utente e fallo sparì 'a 'o pubbreco",
+       "right-hideuser": "Fremma n'utente e annascunnillo r'o pubbreco",
        "right-ipblock-exempt": "Ignora 'e blocche 'e l'IP, 'e blocche automatece e li blocche 'e range 'e l'IP",
        "right-unblockself": "Sblocca se stesso",
        "right-protect": "Cagna 'e livelle 'e prutezione 'e cagna paggene prutette ricurzivamente",
        "right-mergehistory": "Aunisce 'a cronologgia d' 'e paggene",
        "right-userrights": "Cagna 'e deritte 'e ll'utente",
        "right-userrights-interwiki": "Cagna 'e deritte 'e ll'utente int'a l'ati wiki",
-       "right-siteadmin": "Blocca e sblocca 'o database",
+       "right-siteadmin": "Chiure e arape 'o database",
        "right-override-export-depth": "Esporta 'e paggene azzeccanno 'e paggene cullegate nfin'a na profondità 'e 5",
        "right-sendemail": "Manna na mail a ll'at'utente",
        "right-managechangetags": "Crìa e appiccia/stuta 'e [[Special:Tags|tag]]",
        "nchanges": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|'a ll'urdema visita}}",
        "enhancedrc-history": "cronologgia",
-       "recentchanges": "Urdeme nove",
+       "recentchanges": "Urdeme cagnamiente",
        "recentchanges-legend": "Opzione urdeme cagnamiénte",
        "recentchanges-summary": "Ncopp'a chesta paggena song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
        "recentchanges-noresult": "Nisciuno cagnamiento dint'o periodo dato ca soddisfà sti criterie.",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
-       "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} aropp'ô cagnamiento",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte}} aropp''o cagnamiento",
        "newsectionsummary": "/* $1 */ sezziona nnova",
        "rc-enhanced-expand": "Fa vede dettaglie",
        "rc-enhanced-hide": "Annascunne dettaglie",
        "recentchanges-page-removed-from-category": "[[:$1]] luvato d' 'a categurìa",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]]  luvate 'e categurìa, [[Special:WhatLinksHere/$1|sta paggena è azzeccata dint'a n'ati paggene]]",
        "autochange-username": "Cagnamiento automateco MediaWiki",
-       "upload": "Carreca file",
+       "upload": "Careca 'na fiùra",
        "uploadbtn": "Carreca file",
        "reuploaddesc": "Torna a 'o modulo pe ffà 'a carreca",
        "upload-tryagain": "Manna 'a descrizione d' 'o file cagnato",
        "uploadlogpage": "Riggistro 'e carreche",
        "uploadlogpagetext": "Ccà abbascio song'alencate l'urdeme file carrecate.\nCuntrullate 'a [[Special:NewFiles|gallaria d' 'e file nuove]] pe' ve ffà na guardata cchiù visuale 'e tutto.",
        "filename": "Nomme d' 'o file",
-       "filedesc": "Énnece",
+       "filedesc": "Riepilego",
        "fileuploadsummary": "Dettaglie:",
        "filereuploadsummary": "Cagnamiente a 'o file:",
        "filestatus": "Stato d' 'o copyright:",
        "apisandbox-sending-request": "Mannanno na richiesta 'API..",
        "apisandbox-loading-results": "Ricezione d' 'e risultate 'e ll'API 'ncurzo...",
        "apisandbox-results-error": "N'errore cumparette pe' tramente ca se steva carrecanno na risposta 'e query API: $1.",
+       "apisandbox-request-selectformat-label": "Fa verè 'e ddati comme:",
        "apisandbox-request-url-label": "URL addimannata:",
        "apisandbox-request-json-label": "Spiata JSON:",
        "apisandbox-request-time": "Tiempo addimannato: {{PLURAL:$1|$1 ms}}",
        "sp-contributions-newonly": "Sulamente 'e contribbute ca songo criazione 'e paggene",
        "sp-contributions-hideminor": "Annascunne cagnamiénte piccerille",
        "sp-contributions-submit": "Truova",
-       "whatlinkshere": "Paggene ca cullegano a chesta",
+       "whatlinkshere": "Paggene ca se cullegano a chesta",
        "whatlinkshere-title": "Paggene ca cullegano a $1",
        "whatlinkshere-page": "Paggena:",
        "linkshere": "'E ppaggene ccà abbascio teneno jonte a <strong>$2</strong>.",
        "tooltip-pt-watchlist": "'A lista d' 'e paggene ca state a cuntrullà",
        "tooltip-pt-mycontris": "N'elenco 'e cuntribbute {{GENDER:|vòste}}",
        "tooltip-pt-anoncontribs": "N'elenco 'e cagnamiente fatte 'a st'indirizzo IP",
-       "tooltip-pt-login": "A reggistrazione è cunsigliata",
+       "tooltip-pt-login": "Ve cunsigliamme 'e trasì dint'o cunto vostro, ma nun l'avite a ffà pe' fforza",
        "tooltip-pt-logout": "Jésce (logout)",
-       "tooltip-pt-createaccount": "Pigliateve curaggio e criate n'utente e trasìte; eziamme ca chisto nun s'avesse 'a ffà pe' fforza",
-       "tooltip-ca-talk": "Vide 'e chiacchere rilative a chesta paggena",
+       "tooltip-pt-createaccount": "Ve cunsigliamme 'e ve reggistrà 'nu cunte e trasì, ma nun l'avite a ffà pe' fforza",
+       "tooltip-ca-talk": "Vide 'e chiacchere 'e chesta paggena",
        "tooltip-ca-edit": "Cagna sta paggena",
        "tooltip-ca-addsection": "Cummincia 'na nova sezzione",
-       "tooltip-ca-viewsource": "Chista paggena è prutetta, ma puo vere 'o codice sorgente",
-       "tooltip-ca-history": "Vversione 'e primma 'e chesta paggena",
+       "tooltip-ca-viewsource": "Chista paggena è prutetta, ma può verè 'o codice sorgente",
+       "tooltip-ca-history": "Verzione 'e primma 'e chesta paggena",
        "tooltip-ca-protect": "Prutegge chesta paggena",
        "tooltip-ca-unprotect": "Càgna 'a prutezzione 'e chesta paggena",
        "tooltip-ca-delete": "Scancèlla chesta paggena",
        "tooltip-ca-move": "Mòve sta paggena",
        "tooltip-ca-watch": "Azzecca sta paggena int' 'a lista 'e paggene cuntrullate vuosta",
        "tooltip-ca-unwatch": "Lèva sta paggena d' 'a lista 'e paggene cuntrullate vuosta",
-       "tooltip-search": "Truova dint'a {{SITENAME}}",
-       "tooltip-search-go": "Vaje â paggena cu stu nomme si esiste",
-       "tooltip-search-fulltext": "Ascià 'o testo indicato dint'e paggene",
+       "tooltip-search": "Cerca dint''a {{SITENAME}}",
+       "tooltip-search-go": "Vaje a 'na paggena cu stu nomme, si ce sta",
+       "tooltip-search-fulltext": "Cerca chistu testo dint''e paggene",
        "tooltip-p-logo": "Visita a paggena prencepale",
        "tooltip-n-mainpage": "Visita a paggena prencepale",
        "tooltip-n-mainpage-description": "Visita a paggena prencepale",
-       "tooltip-n-portal": "Descrizione d' 'o prugietto, che po' ffa, addò truvà 'e ccose",
+       "tooltip-n-portal": "Descrizione d''o prugietto, che putite fà e addò putite truvà 'e ccose",
        "tooltip-n-currentevents": "Ascìa 'e nfurmaziune ncopp' 'e fatte succiesse mo mmo",
-       "tooltip-n-recentchanges": "Ennece dde urdeme cagnamiénte d' 'o sito",
-       "tooltip-n-randompage": "Na paggena qualsiase",
-       "tooltip-n-help": "Paggena 'e ajùto",
-       "tooltip-t-whatlinkshere": "'Na lista 'e tutte e paggene ca song cullegate a chista",
+       "tooltip-n-recentchanges": "Ennece 'e ll'urdeme cagnamiente d''o sito",
+       "tooltip-n-randompage": "Careca 'na paggena qualonca",
+       "tooltip-n-help": "Paggena 'e ajuto",
+       "tooltip-t-whatlinkshere": "Ennece 'e tutte e paggene ca so' cullegate a chesta",
        "tooltip-t-recentchangeslinked": "Urdeme cagnamiénte dde paggene ca cullegano a chesta",
        "tooltip-feed-rss": "RSS feed pe sta pàggena",
        "tooltip-feed-atom": "Atom feed pe sta pàggena",
        "tooltip-t-contributions": "Lista dde contributte fatte 'a {{GENDER:$1|chist'utente}}",
        "tooltip-t-emailuser": "Manna 'nu email a {{GENDER:$1|chist'utente}}",
        "tooltip-t-info": "Cchiù nfurmaziune ncopp'a sta paggena",
-       "tooltip-t-upload": "Carreca file",
-       "tooltip-t-specialpages": "Lista 'e tutte e paggene speciale",
-       "tooltip-t-print": "Vversione pe stampà 'a chesta paggena",
+       "tooltip-t-upload": "Careca cchiù fiùre",
+       "tooltip-t-specialpages": "Lista 'e tutte 'e paggene speciale",
+       "tooltip-t-print": "Verzione p''a stampa 'e chesta paggena",
        "tooltip-t-permalink": "Jonta permanente a chesta vversione dda paggena",
-       "tooltip-ca-nstab-main": "Vere a paggena e contenuto",
-       "tooltip-ca-nstab-user": "Vere a paggena utente",
+       "tooltip-ca-nstab-main": "Vire 'a paggena 'e contenuto",
+       "tooltip-ca-nstab-user": "Vire 'a paggena utente",
        "tooltip-ca-nstab-media": "Vide 'a pàggena d' 'e media",
        "tooltip-ca-nstab-special": "Chesta è 'na paggena speciale e nun può essere càgnata",
-       "tooltip-ca-nstab-project": "Vere a paggena 'e servizio",
+       "tooltip-ca-nstab-project": "Vire 'a paggena 'e servizio",
        "tooltip-ca-nstab-image": "Vere a paggena ddo file",
        "tooltip-ca-nstab-mediawiki": "Vide 'a mmasciata d' 'o sistema",
-       "tooltip-ca-nstab-template": "Vere 'o modello",
+       "tooltip-ca-nstab-template": "Vire 'o modello",
        "tooltip-ca-nstab-help": "Vide 'a paggena d'aiuto",
-       "tooltip-ca-nstab-category": "Vere a paggena d\"a categurìa",
+       "tooltip-ca-nstab-category": "Vire 'a paggena d' 'a categurìa",
        "tooltip-minoredit": "Rénne chìsto cagnamiénto cchiù ppiccirìllo.",
        "tooltip-save": "Sàrva 'e cagnamiénte.",
        "tooltip-publish": "Pubbreca 'e cagnamiente vuoste",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categurìa annascunnuta|Categurìe annascunnute}} ($1)",
        "pageinfo-templates": "Template {{PLURAL:$1|appennuto|appennute}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Paggena appennuta|Paggene appennute}} ncopp'a ($1)",
-       "pageinfo-toolboxlink": "Nfurmaziune d' 'a paggena",
+       "pageinfo-toolboxlink": "'Nfurmazzione d''a paggena",
        "pageinfo-redirectsto": "Reindirizza a",
        "pageinfo-redirectsto-info": "nfurmaziune",
        "pageinfo-contentpage": "Cuntata comme na paggena 'e cuntenute",
        "feedback-thanks": "Grazie! 'O feedback vuosto s'è mpizzato dint' 'a paggena \"[$2 $1]\".",
        "feedback-thanks-title": "Ve ringraziammo!",
        "feedback-useragent": "Aggente utente:",
-       "searchsuggest-search": "Truova dint'a {{SITENAME}}",
+       "searchsuggest-search": "Cerca dint''a {{SITENAME}}",
        "searchsuggest-containing": "tène...",
        "api-error-badtoken": "Errore interno: 'O token nun è buono.",
        "api-error-emptypage": "'A criazione 'e paggene nuove abbacante nun è permessa.",
index 7ccdd86..e2ff083 100644 (file)
        "tog-useeditwarning": "Si ifra dersom jeg forlater en side uten å lagre den.",
        "tog-prefershttps": "Bruk alltid en trygg forbindelse når du er innlogget",
        "tog-showrollbackconfirmation": "Be om bekreftelse når man klikker på en tilbakestillingslenke",
+       "tog-requireemail": "Krev epost for tilbakestilling av passord",
        "underline-always": "Alltid",
        "underline-never": "Aldri",
        "underline-default": "Drakta eller nettleserens standardinnstillinger",
        "createaccountmail": "Bruk et midlertidig, tilfeldig passord, og send det til angitt e-postadresse",
        "createaccountmail-help": "Kan brukes til å opprette en konto for en annen person uten at du får vite passordet.",
        "createacct-realname": "Virkelig navn (valgfritt)",
-       "createacct-reason": "Årsak",
+       "createacct-reason": "Årsak (logges offentlig)",
        "createacct-reason-ph": "Hvorfor lager du en annen bruker",
        "createacct-reason-help": "Beskjed vist i kontoopprettelsesloggen",
        "createacct-submit": "Opprett konto",
        "resettokens-watchlist-token": "Webmatenøkkel (Atom/RSS) for [[Special:Watchlist|endringer av sider på din overvåkningsliste]]",
        "resettokens-done": "Nullstilling av merker.",
        "resettokens-resetbutton": "Nullstill valgte merker",
-       "bold_sample": "Fet tekst",
-       "bold_tip": "Fet tekst",
-       "italic_sample": "Kursiv tekst",
-       "italic_tip": "Kursiv tekst",
-       "link_sample": "Lenketittel",
-       "link_tip": "Intern lenke",
-       "extlink_sample": "http://www.example.com lenketittel",
-       "extlink_tip": "Ekstern lenke (husk prefikset http://)",
-       "headline_sample": "Overskriftstekst",
-       "headline_tip": "Overskrift, nivå 2",
-       "nowiki_sample": "Sett inn uformatert tekst her",
-       "nowiki_tip": "Ignorer wikiformatering",
-       "image_sample": "Eksempel.jpg",
-       "image_tip": "Innbygd fil",
-       "media_sample": "Eksempel.ogg",
-       "media_tip": "Fillenke",
-       "sig_tip": "Din signatur med dato",
-       "hr_tip": "Horisontal linje (bruk sparsomt)",
        "summary": "Redigeringsforklaring:",
        "subject": "Emne:",
        "minoredit": "Dette er en mindre endring",
        "undo-norev": "Redigeringen kunne ikke fjernes fordi den ikke eksisterer eller ble slettet",
        "undo-nochange": "Det ser ut til at redigeringen allerede er tilbakestilt.",
        "undo-summary": "Fjerner revisjon $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]])",
+       "undo-summary-anon": "Fjerner revisjon $1 av [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Fjern revisjon $1 av en skjult bruker",
        "cantcreateaccount-text": "Kontooppretting fra denne IP-adressen ('''$1''') har blitt blokkert av [[User:$3|$3]].\n\nGrunnen som ble oppgitt av $3 er ''$2''",
        "cantcreateaccount-range-text": "Opprettelsen av en brukerkonto fra IP-adresser i intervallet <strong>$1</strong>, som inneholder din IP-adresse (<strong>$4</strong>), er blitt blokkert av [[User:$3|$3]].\n\nÅrsaken angitt av $3 er <em>$2</em>",
        "prefs-help-email": "Å angi e-postadresse er valgfritt, men er nødvendig for å få tilsendt nytt passord om du skulle glemme det gamle.",
        "prefs-help-email-others": "Du kan også velge å la andre brukere kontakte deg via brukersiden din uten å røpe identiteten din.",
        "prefs-help-email-required": "E-postadresse er påkrevd.",
+       "prefs-help-requireemail": "Hvis denne er valgt vil vi kunne sende eposter om tilbakestilling av passord dersom den som ber om det oppgir både brukernavn og epostadresse for kontoen.",
        "prefs-info": "Grunnleggende informasjon",
        "prefs-i18n": "Internasjonalisering",
        "prefs-signature": "Signatur",
        "listfiles-userdoesnotexist": "Brukerkontoen «$1» er ikke registrert.",
        "imgfile": "fil",
        "listfiles": "Filliste",
+       "listfiles_subpage": "Opplastinger av $1",
        "listfiles_thumb": "Miniatyrbilde",
        "listfiles_date": "Dato",
        "listfiles_name": "Navn",
        "alreadyrolled": "Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); en annen har allerede redigert siden eller fjernet redigeringen.\n\nDen siste redigeringen ble foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>",
        "revertpage": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] ([[User talk:$2|brukerdiskusjon]]) til siste versjon av [[User:$1|$1]]",
+       "revertpage-anon": "Tilbakestilte endringer av [[Special:Contributions/$2|$2]] til siste versjon av [[User:$1|$1]]",
        "revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Tilbakestilte endringer av {{GENDER:$3|$1}}; endret til siste versjon av {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Sesjonsfeil",
        "ipblocklist-legend": "Finn en blokkert bruker",
        "blocklist-userblocks": "Skjul kontoblokkeringer",
        "blocklist-tempblocks": "Skjul midlertidige blokkeringer",
+       "blocklist-indefblocks": "Skjul blokkeringer på ubestemt tid",
        "blocklist-addressblocks": "Skjul individuelle IP-blokkeringer",
        "blocklist-type": "Type:",
        "blocklist-type-opt-all": "Alle",
        "mycustomjsredirectprotected": "Du har ikke tillatelse til å redigere denne JavaScript-siden fordi den er en omdirigering og ikke peker til en annen side i ditt brukernavnerom.",
        "easydeflate-invaliddeflate": "Det gitte innholdet er ikke riktig komprimert",
        "unprotected-js": "Av sikkerhetsårsaker kan ikke JavaScript lastes fra ubeskyttede sider. Bare skap JavaScript i MediaWiki-navnerommet eller som en brukerunderside",
-       "userlogout-continue": "Ønsker du å logge ut?"
+       "userlogout-continue": "Ønsker du å logge ut?",
+       "rest-prefix-mismatch": "Den forespurte stien ($1) var ikke i REST-API-ets rotsti ($2)",
+       "rest-wrong-method": "Den forespurte metoden ($1) var ikke {{PLURAL:$3|den tillatte metoden|blant de tillatte metodene}} for denne stien ($2)",
+       "rest-no-match": "Den forespurte relative stien ($1) passet ikke med noen kjent behandler"
 }
index 4bf2965..91f6f1e 100644 (file)
                        "PiefPafPier"
                ]
        },
-       "tog-underline": "Verwiezingen onderstrepen",
-       "tog-hideminor": "Kleine wiezigingen verbargen in \"Leste wiezigingen\"",
-       "tog-hidepatrolled": "Wiezigingen die emarkeerd bin verbargen in \"Leste wiezigingen\"",
-       "tog-newpageshidepatrolled": "Ziejen die emarkeerd bin, verbargen in de lieste mit nieje artikels",
-       "tog-extendwatchlist": "Volglieste uutbreien, zodat alle wiezigingen zichtbaor bin, en niet allinnig de leste wieziging",
-       "tog-usenewrc": "Groepeer wiezigingen per zied in \"Leste wiezigingen\" en \"Mien volglieste\"",
-       "tog-numberheadings": "Koppen vanzelf nummeren",
-       "tog-editondblclick": "Mit dubbelklik bewarken",
-       "tog-editsectiononrightclick": "Bewarken van deelziejen meugelik maken mit n rechtermuusklik op n tussenkop",
-       "tog-watchcreations": "Spul wa'k anmake op mien volglieste zetten",
-       "tog-watchdefault": "Spul wa'k bewarke op mien volglieste zetten",
-       "tog-watchmoves": "Spul wa'k herneume op mien volglieste zetten",
-       "tog-watchdeletion": "Spul wa'k vortdo op mien volglieste zetten",
-       "tog-watchrollback": "Ziejen waorvan ik bewarkingen weerummedreid hebbe automaties volgen",
-       "tog-minordefault": "Markeer alle veraanderingen as 'kleine wieziging'",
-       "tog-previewontop": "De naokiekzied boven t bewarkingsveld zetten",
-       "tog-previewonfirst": "Naokieken bie eerste wieziging",
-       "tog-enotifwatchlistpages": "Stuur mien n berichjen over zied- of bestaandswiezigingen uut mien volglieste.",
-       "tog-enotifusertalkpages": "Stuur mien n berichjen as mien overlegzied ewiezigd is.",
-       "tog-enotifminoredits": "Stuur mien oek n berichjen bie kleine bewarkingen van ziejen en bestaanden",
-       "tog-enotifrevealaddr": "Mien netpostadres laoten zien in netposttiejigen",
-       "tog-shownumberswatching": "t Antal gebrukers bekieken die disse zied volgt",
-       "tog-oldsig": "Bestaonde haandtekening:",
-       "tog-fancysig": "Ondertekening zien as wikitekste (zonder automatiese verwiezing)",
-       "tog-uselivepreview": "Gebruuk \"rechtstreeks naokieken\"",
-       "tog-forceeditsummary": "Geef n melding bie n lege samenvatting",
-       "tog-watchlisthideown": "Verbarg mien eigen bewarkingen",
-       "tog-watchlisthidebots": "Verbarg botgebrukers",
-       "tog-watchlisthideminor": "Verbarg kleine wiezigingen in mien volglieste",
-       "tog-watchlisthideliu": "Bewarkingen van an-emelde gebrukers op mien volglieste verbargen",
-       "tog-watchlisthideanons": "Bewarkingen van anonieme gebrukers op mien volglieste verbargen",
-       "tog-watchlisthidepatrolled": "Wiezigingen die emarkeerd bin op volglieste verbargen",
-       "tog-ccmeonemails": "Stuur mien kopieën van berichten an aandere gebrukers",
-       "tog-diffonly": "Laot de inhoud van ziejen niet onder de an-egeven wiezigingen zien.",
-       "tog-showhiddencats": "Laot verbörgen kategorieën zien",
-       "tog-norollbackdiff": "Wiezigingen vortlaoten nao t weerummedreien",
-       "tog-useeditwarning": "Waorschuw mien a'k n bewörken zied aof wil sluten die nog niet op-esleugen is",
-       "tog-prefershttps": "Altied n beveiligde verbiending gebruken a'j an-emeld bin",
-       "underline-always": "Altied",
+       "tog-underline": "Verwysingen understreapen",
+       "tog-hideminor": "Kleine wysigingen verbargen in \"Lätste wysigingen\"",
+       "tog-hidepatrolled": "Wysigingen dee markeerd binnet verbargen in \"Lätste wysigingen\"",
+       "tog-newpageshidepatrolled": "Syden dee markeerd binnet, verbargen in de lyste mid nye artikels",
+       "tog-extendwatchlist": "Volglyste uutbreiden, sodat alle wysigingen sichtbår binnet, en neet allinnig de lätste wysigingen",
+       "tog-usenewrc": "Gruppeer wysigingen per syde in \"Lätste wysigingen\" en \"Myn volglyste\"",
+       "tog-numberheadings": "Upskrivten vanselv nummeren",
+       "tog-editondblclick": "Mid dubbelklik bewarken",
+       "tog-editsectiononrightclick": "Bewarken van deylsyden möägelik maken mid een rechtermuusklik up een tüskenupskrivt",
+       "tog-watchcreations": "Spül wat ik anmake up myn volglyste setten",
+       "tog-watchdefault": "Spül wat ik bewarke up myn volglyste setten",
+       "tog-watchmoves": "Spül wat ik hernöme up myn volglyste setten",
+       "tog-watchdeletion": "Spül wat ik vordsmyte up myn volglyste setten",
+       "tog-watchrollback": "Syden wårvan ik bewarkingen weaderümmedraid hebbe automatisk volgen",
+       "tog-minordefault": "Markeer alle veranderingen as 'kleine wysiging'",
+       "tog-previewontop": "De nåkyksyde boaven et bewarkingsveld setten",
+       "tog-previewonfirst": "Nåkyken by eyrste wysiging",
+       "tog-enotifwatchlistpages": "Stüür my een bericht oaver syd- of bestandswysigingen uut myn volglyste.",
+       "tog-enotifusertalkpages": "Stüür my een bericht as myn oaverlegsyde wysigd is.",
+       "tog-enotifminoredits": "Stüür my ouk een bericht by kleine bewarkingen van syden en bestanden",
+       "tog-enotifrevealaddr": "Myn e-postadres låten seen in e-postberichten",
+       "tog-shownumberswatching": "Et antal gebrukers bekyken dee disse syde volgt",
+       "tog-oldsig": "Bestånde handteykening:",
+       "tog-fancysig": "Underteykening seen as wikitekst (sunder automatiske verwysing)",
+       "tog-uselivepreview": "Nåkyksyde låten seen sunder eyrst te herladen",
+       "tog-forceeditsummary": "Geav een melding by een leadige samenvatting",
+       "tog-watchlisthideown": "Verbarg myn eigen bewarkingen",
+       "tog-watchlisthidebots": "Verbarg botbrukers",
+       "tog-watchlisthideminor": "Verbarg kleine wysigingen in myn volglyste",
+       "tog-watchlisthideliu": "Bewarkingen van anmeldede gebrukers up myn volglyste verbargen",
+       "tog-watchlisthideanons": "Bewarkingen van anonyme gebrukers up myn volglyste verbargen",
+       "tog-watchlisthidepatrolled": "Wysigingen dee markeerd binnet up volglyste verbargen",
+       "tog-ccmeonemails": "Stüür my kopyen van berichten an andere gebrukers",
+       "tog-diffonly": "Under wysigingen neet de syde-inhold låten seen.",
+       "tog-showhiddencats": "Låt verbörgen kategoryen seen",
+       "tog-norollbackdiff": "Wysigingen vordlåten nå et weaderümmedraien",
+       "tog-useeditwarning": "Wårschüw my as ik een bewarkede syde afsluten wil dee noch neet seakerd is",
+       "tog-prefershttps": "Altyd een beveiligde verbinding gebruken as jy anmelded binnet",
+       "underline-always": "Altyd",
        "underline-never": "Nooit",
-       "underline-default": "Standard in joew vormgeving of webkieker",
-       "editfont-style": "Lettertype veur de tekste t bewarkingsveld:",
-       "editfont-monospace": "Lettertype waorvan t tekenbreedte vaste steet",
+       "underline-default": "Standard in juw formgeaving of webkyker",
+       "editfont-style": "Lettertype vöär de tekst in et bewarkingsveld:",
+       "editfont-monospace": "Lettertype wårvan de teykenbreydte vast steyt",
        "editfont-sansserif": "Sans-seriflettertype",
        "editfont-serif": "Seriflettertype",
        "sunday": "sündag",
@@ -96,7 +96,7 @@
        "december": "december",
        "january-gen": "januåri",
        "february-gen": "februåri",
-       "march-gen": "meert",
+       "march-gen": "määrt",
        "april-gen": "april",
        "may-gen": "mei",
        "june-gen": "juni",
        "september-gen": "september",
        "october-gen": "oktober",
        "november-gen": "november",
-       "december-gen": "desember",
+       "december-gen": "december",
        "jan": "jan",
        "feb": "feb",
        "mar": "mrt",
        "oct": "okt",
        "nov": "nov",
        "dec": "dec",
-       "january-date": "$1 jannewaori",
-       "february-date": "$1 febrewaori",
-       "march-date": "$1 meert",
+       "january-date": "$1 janri",
+       "february-date": "$1 febrri",
+       "march-date": "$1 määrt",
        "april-date": "$1 april",
        "may-date": "$1 mei",
        "june-date": "$1 juni",
        "september-date": "$1 september",
        "october-date": "$1 oktober",
        "november-date": "$1 november",
-       "december-date": "$1 desember",
+       "december-date": "$1 december",
        "pagecategories": "{{PLURAL:$1|Kategory|Kategoryen}}",
        "category_header": "Artikels in kategory $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.''",
+       "subcategories": "Subkategoryen",
+       "category-media-header": "Media in kategory \"$1\"",
+       "category-empty": "<em>In disse kategory stån up et moment noch geen syden of media.</em>",
        "hidden-categories": "Verbörgen {{PLURAL:$1|kategory|kategoryen}}",
-       "hidden-category-category": "Verbörgen kategorieën",
+       "hidden-category-category": "Verbörgen kategoryen",
        "category-subcat-count": "{{PLURAL:$2|Disse kategory hevt de volgende subkategory.|Disse kategory hevt de volgende {{PLURAL:$1|subkategory|$1 subkategoryen}}, van in totaal $2.}}",
-       "category-subcat-count-limited": "Disse kategorie hef de volgende {{PLURAL:$1|subkategorie|$1 subkategorieën}}.",
+       "category-subcat-count-limited": "Disse kategory hevt de volgende {{PLURAL:$1|subkategory|$1 subkategoryen}}.",
        "category-article-count": "{{PLURAL:$2|In disse kategory steyt allinnig de volgende syde.|De volgende {{PLURAL:$1|syde steyt|$1 syden stån}} in disse kategory, van in totaal $2.}}",
-       "category-article-count-limited": "In disse kategorie {{PLURAL:$1|steet de volgende zied|staon de volgende $1 ziejen}}.",
-       "category-file-count": "In disse kategorie {{PLURAL:$2|steet t volgende bestaand|staon de volgende $1 bestaanden, van in totaal $2}}.",
-       "category-file-count-limited": "In disse kategorie {{PLURAL:$1|steet t volgende bestaand|staon de volgende $1 bestaanden}}.",
+       "category-article-count-limited": "In disse kategory {{PLURAL:$1|steyt de volgende syde|stån de volgende $1 syden}}.",
+       "category-file-count": "In disse kategory {{PLURAL:$2|steyt et volgende bestand|stån de volgende $1 bestanden, van in totaal $2}}.",
+       "category-file-count-limited": "In disse kategory {{PLURAL:$1|steyt et volgende bestand|stån de volgende $1 bestanden}}.",
        "listingcontinuesabbrev": "(vervolg)",
-       "index-category": "Te indexeren ziejen",
+       "index-category": "Te indekseren syden",
        "noindex-category": "Syden dee neet indexeerd binnen",
-       "broken-file-category": "Ziejen mit verkeerde bestaandsverwiezingen",
-       "about": "Informasie",
+       "broken-file-category": "Syden mid verkeyrde bestandsverwysingen",
+       "about": "Informaty",
        "article": "Artikel",
-       "newwindow": "(niej vienster)",
+       "newwindow": "(ny vinster)",
        "cancel": "Afbreaken",
-       "moredotdotdot": "Meer...",
-       "morenotlisted": "Disse lieste is niet kompleet...",
-       "mypage": "Gebrukerszied",
-       "mytalk": "Myn oaverleg",
+       "moredotdotdot": "Meyr...",
+       "morenotlisted": "Disse lyste is möägelik neet kompleet.",
+       "mypage": "Gebrukerssyde",
+       "mytalk": "Oaverleg",
        "anontalk": "Oaverleg",
        "navigation": "Navigaty",
        "and": "&#32;en",
-       "faq": "Vragen die vake esteld wörden",
-       "actions": "Haandeling",
+       "faq": "Vake stelde vrågen",
+       "actions": "Handelingen",
        "namespaces": "Naamruumdes",
        "variants": "Varianten",
        "navigation-heading": "Navigatymenü",
        "errorpagetitle": "Foutmelding",
-       "returnto": "Weerumme naor $1.",
+       "returnto": "Weaderümme nå $1.",
        "tagline": "Van {{SITENAME}}",
        "help": "Hülpe",
        "search": "Söken",
        "updatedmarker": "bie-ewörken sinds mien leste bezeuk",
        "printableversion": "Afdrükbåre versy",
        "permalink": "Vaste verwysing",
-       "print": "Aofdrokken",
+       "print": "Afdrükken",
        "view": "Leasen",
        "view-foreign": "Bekyken up $1",
        "edit": "Bewarken",
        "edit-local": "Lokale beschrieving bewarken",
        "create": "Anmaken",
-       "create-local": "Lokale beschrieving derbie doon",
-       "delete": "Vortdoon",
-       "undelete_short": "$1 {{PLURAL:$1|versie|versies}} weerummeplaotsen",
-       "viewdeleted_short": "{{PLURAL:$1|Eén versie die vortedaon is|$1 versies die vortedaon bin}} bekieken",
+       "create-local": "Lokale beskryving tovogen",
+       "delete": "Vordsmyten",
+       "undelete_short": "$1 {{PLURAL:$1|versy|versys}} weaderümmeplaatsen",
+       "viewdeleted_short": "{{PLURAL:$1|Eyn versy dee vordsmeaten is|$1 versys dee vortsmeaten binnet}} bekyken",
        "protect": "Beveiligen",
-       "protect_change": "wiezigen",
+       "protect_change": "wysigen",
        "unprotect": "Beveiliging wysigen",
-       "newpage": "Nieje zied",
+       "newpage": "Nye syde",
        "talkpagelinktext": "Oaverleg",
        "specialpage": "Speciale syde",
        "personaltools": "Persoonlike instellingen",
        "talk": "Oaverleg",
        "views": "Weadergåven",
-       "toolbox": "Hülpmiddels",
-       "tool-link-userrights": "{{GENDER:$1|Gebrukersgruppen}} wysigen",
+       "toolbox": "Warktügen",
+       "tool-link-userrights": "{{GENDER:$1|Brukersgruppen}} wysigen",
        "tool-link-emailuser": "Disse {{GENDER:$1|gebruker}} een bericht stüren",
-       "imagepage": "Bestaandszied bekieken",
-       "mediawikipage": "Tiejige bekieken",
-       "templatepage": "Mal bekieken",
-       "viewhelppage": "Hulpzied bekieken",
-       "categorypage": "Kategoriezied bekieken",
-       "viewtalkpage": "Bekiek overlegzied",
+       "imagepage": "Bestandssyde bekyken",
+       "mediawikipage": "Berichtsyde bekyken",
+       "templatepage": "Mal bekyken",
+       "viewhelppage": "Hülpsyde bekyken",
+       "categorypage": "Kategorysyde bekyken",
+       "viewtalkpage": "Bekyk oaverlegsyde",
        "otherlanguages": "Andere språken",
        "redirectedfrom": "(döärstüürd vanaf \"$1\")",
-       "redirectpagesub": "Deurverwieszied",
-       "redirectto": "Deurverwiezen naor:",
+       "redirectpagesub": "Döärverwyssyde",
+       "redirectto": "Döärverwysen nå:",
        "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",
+       "viewcount": "Disse syde is $1 {{PLURAL:$1|keyr}} bekeaken.",
+       "protectedpage": "Beveiligde syde",
        "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).",
+       "view-pool-error": "De servers binnet momenteel oaverbelasted.\nTe vöäle lüde proberet disse syde te bekyken.\nWacht evven vöärdat jy upny togang proberet te krygen tot disse syde.\n\n$1",
+       "generic-pool-error": "De servers binnet momenteel oaverbelasted.\nTe vöäle lüde proberet disse syde te bekyken.\nWacht evven vöärdat jy upny togang proberet te krygen tot disse syde.",
+       "pool-timeout": "De maksimumwachttyd vöär databankvergrendeling is verlöypen.",
+       "pool-queuefull": "De wachtryge van de pool is vul",
+       "pool-errorunknown": "Unbekende faut",
+       "pool-servererror": "De deenst \"pool counter\" is neet beskikbår ($1).",
        "aboutsite": "Oaver {{SITENAME}}",
        "aboutpage": "Project:Info",
        "copyright": "De inhoud is beschikbaor onder de $1 as der niks aanders an-egeven is.",
        "currentevents-url": "Project:In et nys",
        "disclaimers": "Vöärbehold",
        "disclaimerpage": "Project:Vöärbehold",
-       "edithelp": "Hulpe mit bewarken",
-       "helppage-top-gethelp": "Hulpe",
+       "edithelp": "Hülpe mid bewarken",
+       "helppage-top-gethelp": "Hülpe",
        "mainpage": "Vöärblad",
        "mainpage-description": "Vöärblad",
        "policy-url": "Project:Beleid",
        "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.",
-       "versionrequired": "Versie $1 van MediaWiki is neudig",
-       "versionrequiredtext": "Versie $1 van MediaWiki is neudig um disse zied te gebruken. Zie [[Special:Version|Versie]].",
-       "ok": "Best",
+       "badaccess": "Geen tostemming",
+       "badaccess-group0": "Jy hebbet geen tostemming üm disse akty uut te voren.",
+       "badaccess-groups": "Disse akty kan allinnig uutvoord wörden döär gebrukers uut {{PLURAL:$2|de grup|eyn van de gruppen}}: $1.",
+       "versionrequired": "Versy $1 van MediaWiki is nöydig",
+       "versionrequiredtext": "Versy $1 van MediaWiki is nöydig üm disse syde te gebruken. See [[Special:Version|Versy]].",
+       "ok": "Okee",
        "retrievedfrom": "Van \"$1\"",
-       "youhavenewmessages": "Je hebben $1 ($2).",
-       "youhavenewmessagesfromusers": "Je hebben $1 van {{PLURAL:$3|n aandere gebruker|$3 gebrukers}} ($2).",
-       "youhavenewmessagesmanyusers": "Je hebben $1 van n bulte gebrukers ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|n niej bericht|999=nieje berichten}}",
-       "newmessagesdifflinkplural": "leste {{PLURAL:$1|wieziging|999=wiezigingen}}",
+       "youhavenewmessages": "{{PLURAL:$3|Jy hebbet}} $1 ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Jy hebbet}} $1 van {{PLURAL:$3|een andere gebruker|$3 gebrukers}} ($2).",
+       "youhavenewmessagesmanyusers": "Jy hebbet $1 van een bült gebrukers ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|een ny bericht|999=nye berichten}}",
+       "newmessagesdifflinkplural": "läste {{PLURAL:$1|wysiging|999=wysigingen}}",
        "youhavenewmessagesmulti": "Jy hebbet nye berichten up $1",
        "editsection": "bewark",
        "editold": "bewark",
-       "viewsourceold": "brontekste bekyken",
+       "viewsourceold": "brontekst bekyken",
        "editlink": "bewark",
        "viewsourcelink": "brontekst bekyken",
        "editsectionhint": "Bewarkingsveld: $1",
        "toc": "Inhold",
-       "showtoc": "Bekieken",
-       "hidetoc": "Verbarg",
+       "showtoc": "bekyken",
+       "hidetoc": "verbargen",
        "collapsible-collapse": "Inklappen",
        "collapsible-expand": "Uutklappen",
-       "confirmable-confirm": "{{GENDER:$1|Bi'j}} daor wisse van?",
+       "confirmable-confirm": "{{GENDER:$1|Bin jy}} dår wisse van?",
        "confirmable-yes": "Ja",
-       "confirmable-no": "Nee",
-       "thisisdeleted": "Bekieken of herstellen van $1?",
-       "viewdeleted": "Bekiek $1?",
-       "restorelink": "{{PLURAL:$1|versie die vortedaon is|versies die vortedaon bin}}",
-       "feedlinks": "Voer:",
-       "feed-invalid": "Voertype wörden niet ondersteunt.",
-       "feed-unavailable": "Syndicakievoer is niet beschikbaor",
-       "site-rss-feed": "$1 RSS-voer",
-       "site-atom-feed": "$1 Atom-voer",
-       "page-rss-feed": "\"$1\" RSS-voer",
-       "page-atom-feed": "\"$1\" Atom-voer",
+       "confirmable-no": "Ney",
+       "thisisdeleted": "Bekyken of herstellen van $1?",
+       "viewdeleted": "Bekyk $1?",
+       "restorelink": "{{PLURAL:$1|versy dee vordsmeaten is|versys dee vordsmeaten binnet}}",
+       "feedlinks": "Voder:",
+       "feed-invalid": "Vodertype wördt neet understöänt.",
+       "feed-unavailable": "Syndikatyvoder is neet beskikbår",
+       "site-rss-feed": "$1 RSS-voder",
+       "site-atom-feed": "$1 Atom-voder",
+       "page-rss-feed": "\"$1\" RSS-voder",
+       "page-atom-feed": "\"$1\" Atom-voder",
        "red-link-title": "$1 (syde besteyt noch neet)",
-       "sort-descending": "Aoflopend sorteren",
-       "sort-ascending": "Oplopend sorteren",
-       "nstab-main": "Artikel",
-       "nstab-user": "Gebruker",
-       "nstab-media": "Media",
+       "sort-descending": "Afloupend sorteren",
+       "sort-ascending": "Uploupend sorteren",
+       "nstab-main": "Syde",
+       "nstab-user": "Gebrukerssyde",
+       "nstab-media": "Mediasyde",
        "nstab-special": "Speciale syde",
        "nstab-project": "Projektsyde",
        "nstab-image": "Bestand",
-       "nstab-mediawiki": "Bericht",
+       "nstab-mediawiki": "Systeembericht",
        "nstab-template": "Mal",
        "nstab-help": "Hülpe",
        "nstab-category": "Kategory",
        "mainpage-nstab": "Vöärblad",
-       "nosuchaction": "De op-egeven haandeling besteet niet",
-       "nosuchactiontext": "De opdrachte in t webadres in ongeldig.\nJe hebben t webadres misschien verkeerd in-etikt of de verkeerde verwiezing evolgd.\nDit kan oek dujen op n fout in de programmatuur van {{SITENAME}}.",
-       "nosuchspecialpage": "Der besteet gien spesiale zied mit disse naam",
-       "nospecialpagetext": "<strong>Disse spesiale zied wörden niet herkend deur de programmatuur.</strong>\n\nn Lieste mit bestaonde spesiale ziejen ku'j vienen op [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "Foutmelding",
-       "databaseerror": "Fout in de databanke",
-       "databaseerror-text": "Der is wat mis egaon bie n databankzeukopdrachte.\nDit kan betekenen dat der n fout in de programmtuur zit.",
-       "databaseerror-textcl": "Der is wat mis egaon bie n databankzeukopdrachte.",
-       "databaseerror-query": "Zeukopdrachte: $1",
-       "databaseerror-function": "Funksie: $1",
-       "databaseerror-error": "Fout: $1",
-       "laggedslavemode": "<strong>Waorschuwing:</strong> t is meugelik dat leste wiezigingen in de tekste van dit artikel nog niet verwarkt bin.",
+       "nosuchaction": "De upgeaven handeling besteyt neet",
+       "nosuchactiontext": "De updracht in et webadres in ungeldig.\nJy hebbet et webadres meskeen verkeyrd intyped of de verkeyrde verwysing volgd.\nDit kan ouk düden up een faut in de programmatuur van {{SITENAME}}.",
+       "nosuchspecialpage": "Der besteyt geen speciale syde mid disse name",
+       "nospecialpagetext": "<strong>Disse speciale syde wördt neet herkend döär de programmatuur.</strong>\n\nEen lyste mid bestånde speciale syden kün jy vinden up [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "Faut",
+       "databaseerror": "Databankfaut",
+       "databaseerror-text": "Der is wat mis gån by een databanksöökupdracht.\nDit kan beteykenen dat der een faut in de programmtuur sit.",
+       "databaseerror-textcl": "Der is wat mis gån by een databanksöökupdracht.",
+       "databaseerror-query": "Söökupdracht: $1",
+       "databaseerror-function": "Funkty: $1",
+       "databaseerror-error": "Faut: $1",
+       "laggedslavemode": "<strong>Wårschüwing:</strong> et kan weasen dat de lätste wysigingen up disse syde noch neet upnöämen binnet.",
        "readonly": "De databanke is beveiligd",
-       "enterlockreason": "Waorumme en veur hoe lange is t eblokkeerd?",
-       "readonlytext": "De databanke van {{SITENAME}} is noen esleuten veur nieje bewarkingen en wiezigingen, warschienlik veur bestaandsonderhoud. De verantwoordelike systeembeheerder gaf hierveur de volgende reden op: '''$1'''",
-       "missing-article": "In de databanke steet gien tekste veur de zied \"$1\" die der wel in zol mutten staon ($2).\n\nDit kan koemen deurda'j n ouwe verwiezing naor t verschil tussen twee versies van n zied volgen of n versie opvragen die vortedaon is.\n\nAs dat niet zo is, dan he'j misschien n fout in de programmatuur evunnen.\nMeld t dan effen bie n [[Special:ListUsers/sysop|systeembeheerder]] van {{SITENAME}} en vermeld derbie de internetverwiezing van disse zied.",
-       "missingarticle-rev": "(versienummer: $1)",
-       "missingarticle-diff": "(Wieziging: $1, $2)",
-       "readonly_lag": "De databanke is automaties beveilig, zodat de ondergeschikten servers zich kunnen synchroniseren mit de sentrale server.",
-       "internalerror": "Interne fout",
-       "internalerror_info": "Interne fout: $1",
-       "filecopyerror": "Kon bestaand \"$1\" niet naor \"$2\" kopiëren.",
-       "filerenameerror": "Bestaandsnaamwieziging \"$1\" naor \"$2\" niet meugelik.",
-       "filedeleteerror": "Kon bestaand \"$1\" niet vortdoon.",
-       "directorycreateerror": "Map \"$1\" kon niet an-emaakt wörden.",
-       "directoryreadonlyerror": "De map \"$1\" is allinnig-lezen.",
-       "directorynotreadableerror": "De map \"$1\" kan niet elezen wörden.",
-       "filenotfound": "Kon bestaand \"$1\" niet vienen.",
-       "unexpected": "Onverwachten weerde: \"$1\"=\"$2\".",
-       "formerror": "Fout: kon formulier niet versturen",
-       "badarticleerror": "Disse haandeling kan op disse zied niet uutevoerd wörden.",
-       "cannotdelete": "De zied of t bestaand \"$1\" kon niet vortedaon wörden.\nt Kan ween dat n aander t al vortedaon hef.",
-       "cannotdelete-title": "Zied \"$1\" kan niet vortedaon wörden",
-       "delete-hook-aborted": "t Vortdoon wördt in t wiere eschopt deur n toepassige van MediaWiki.\nDer is gien veerdere informasie beschikbaor.",
-       "no-null-revision": "Kon gien lege nieje versie maken veur de zied \"$1\"",
-       "badtitle": "Ongeldige naam",
-       "badtitletext": "De naam van de op-evreugen zied is niet geldig, leeg, of n interwiki-verwiezing naor n onbekende of ongeldige wiki.",
-       "perfcached": "Disse gegevens koemen uut t tussengeheugen en bin misschien niet aktueel. Der {{PLURAL:$1|is hooguut een resultaot|bin hooguut $1 resultaoten}} beschikbaor in t tussengeheugen.",
-       "perfcachedts": "Disse gegevens koemen uut t tussengeheugen die veur t lest bie-ewörken is op $2 um $3. Der {{PLURAL:$4|is hooguut een resultaot|bin hooguut $4 resultaoten}} beschikbaor in t tussengeheugen.",
-       "querypage-no-updates": "'''Disse zied wördt niet meer bie-ewörken.'''",
+       "enterlockreason": "Voor een readen in vöär de vergrendeling, en geav up wanneyr et ungeaver vrygeaven wördt.",
+       "readonlytext": "De databanke is up et moment slöäten vöär nye inbreng en andere wysigingen, wårskynlik vöär rutinemåtig underhold, wårnå et weader lös geyt. \n\nDe systeembeheyrder gav hyrvöär de volgende readen up: $1",
+       "missing-article": "In de databanke steyt geen tekst vöär de syde \"$1\" dee der wel in sol mütten stån ($2).\n\nDit geböärt meystentyds as jy een olde verwysing nå et verskil tüsken twey versys van een syde volgen of as jy een versy upvrågen dee vordsmeaten is.\n\nAs dat neet so is, dan heb jy meskeen een faut in de programmatuur evünden.\nMeld et dan by een [[Special:ListUsers/sysop|systeembeheyrder]], en vermeld et webadres derby.",
+       "missingarticle-rev": "(versynummer: $1)",
+       "missingarticle-diff": "(Wysiging: $1, $2)",
+       "readonly_lag": "De databanke is automatisk vergrendeld terwyl de undergeskikede servers sik synchroniseren künnet mid de centrale server.",
+       "internalerror": "Interne faut",
+       "internalerror_info": "Interne faut: $1",
+       "filecopyerror": "Kun bestand \"$1\" neet nå \"$2\" kopieren.",
+       "filerenameerror": "\"$1\" kun neet hernöömd wörden nå \"$2\".",
+       "filedeleteerror": "Bestand \"$1\" kun neet vordsmeaten wörden.",
+       "directorycreateerror": "De map \"$1\" kun neet anmaked wörden.",
+       "directoryreadonlyerror": "De map \"$1\" is allinnig-leasen.",
+       "directorynotreadableerror": "De map \"$1\" kan neet leasen wörden.",
+       "filenotfound": "Bestand \"$1\" kun neet vünden wörden.",
+       "unexpected": "Unverwachtede waerde: \"$1\"=\"$2\".",
+       "formerror": "Faut: kun formulier neet verstüren",
+       "badarticleerror": "Disse handeling kan up disse syde neet uutvoord wörden.",
+       "cannotdelete": "De syde of et bestand \"$1\" kun neet vordsmeaten wörden.\nEt kan weasen dat een ander et al vordsmeaten hevt.",
+       "cannotdelete-title": "Syde \"$1\" kan neet vordsmeaten wörden",
+       "delete-hook-aborted": "Et vordsmyten wördt in et wyre skopped döär een topassing van MediaWiki.\nDer is wyder geen informaty beskikbår.",
+       "no-null-revision": "Kun geen leadige nye versy maken vöär de syde \"$1\"",
+       "badtitle": "Ungeldige name",
+       "badtitletext": "De name van de upvrågde syde is neet geldig, leadig, of der stünd een verkeyrde interspråk- of interwikiverwysing in.\nMöägelik binnet der eyn of meyr teykens gebruked dee neet in titels tostån binnet.",
+       "perfcached": "Disse gegeavens kummen uut et tüskengehöägen en binnet meskeen neet aktueel. Der {{PLURAL:$1|is houguut eyn resultaat|binnet houguut $1 resultaten}} beskikbår in et tüskengehöägen.",
+       "perfcachedts": "Disse gegeavens kummen uut et tüskengehöägen dee vöär et lätst bywarked is up $2 üm $3. Der {{PLURAL:$4|is houguut eyn resultaat|binnet houguut $4 resultaten}} beskikbår in et tüskengehöägen.",
+       "querypage-no-updates": "Disse syde wördt neet bywarked.\nGegeavens up disse syde wördet neet vervarsd.",
        "viewsource": "Brontekst bekyken",
-       "viewsource-title": "Bron bekieken van $1",
-       "actionthrottled": "Haandeling tegenehöllen",
-       "actionthrottledtext": "As maotregel tegen t plaotsen van alderhaande moek, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
-       "protectedpagetext": "Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.",
-       "viewsourcetext": "Je kunnen de brontekste van disse zied bewarken en bekieken.",
-       "viewyourtext": "Je kunnen <strong>joew bewarkingen</strong> an de brontekste van disse zied bekieken en kopiëren.",
-       "protectedinterface": "Op disse zied steet tekste die gebruukt wördt veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.\nUm vertalingen veur alle wiki's derbie te zetten of te wiezigen, gebruuk [https://translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
-       "editinginterface": "<strong>Waorschuwing:</strong> je bewarken n zied die gebruukt wördt deur de programmatuur. \nWa'j disse zied wiezigen is van invleud op t gebrukersuterlik veur aander gebrukers van disse wiki.",
-       "translateinterface": "Um vertalingen veur alle wiki's te doon of te wiezigen ku'j gebruukmaken van [https://translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
-       "cascadeprotected": "Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de \"kaskade\"-opsie:\n$2",
-       "namespaceprotected": "Je maggen gien ziejen in de '''$1'''-naamruumte bewarken.",
-       "customcssprotected": "Je kunnen disse CSS-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.",
-       "customjsprotected": "Je kunnen disse JavaScript-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.",
-       "mycustomcssprotected": "Je hebben gien toestemming um disse CSS-zied te bewarken.",
-       "mycustomjsprotected": "Je hebben gien rechten um disse JavaScript-zied te bewarken.",
-       "myprivateinfoprotected": "Je hebben gien rechten um joew priveegegevens an te passen.",
-       "mypreferencesprotected": "Je hebben gien rechten um joew veurkeuren an te passen.",
-       "ns-specialprotected": "Spesiale ziejen kunnen niet bewarkt wörden.",
-       "titleprotected": "t Anmaken van disse zied is beveiligd deur [[User:$1|$1]].\nDe op-egeven reden is <em>$2</em>.",
-       "filereadonlyerror": "Kon t bestaand \"$1\" niet anpassen umdat de bestaandsmap \"$2\" op dit moment op allinnig-lezen steet.\n\nDe op-egeven reden is: \"$3\".",
+       "viewsource-title": "Bron bekyken van $1",
+       "actionthrottled": "Handeling teagenholden",
+       "actionthrottledtext": "As måtregel teagen misbruuk, is et antal keyren dat jy disse handeling in een korte tyd uutvoren künnet betöänd. Jy hebbet de limit oaverskreaden. Probeer et oaver een antal minuten weader.",
+       "protectedpagetext": "Disse syde is beveiligd. Bewarken of andere handelingen binnet neet möägelik.",
+       "viewsourcetext": "Jy künnet de brontekst van disse syde bewarken en bekyken.",
+       "viewyourtext": "Jy künnet <strong>juw bewarkingen</strong> an de brontekst van disse syde bekyken en kopieren.",
+       "protectedinterface": "Up disse syde steyt tekst dee gebruked wördt vöär systeemteksten van disse wiki, en is beveiligd üm misbruuk te vöärkommen. Bruuk [https://translatewiki.net/ translatewiki.net], et lokaliseringsprojekt vöär MediaWiki, üm oaversetingen vöär alle wikis to te vogen of te wysigen.",
+       "editinginterface": "<strong>Wårsküwing:</strong> jy bewarket een syde dee teksten gebruukt vöär de gebrukersümgeaving van de programmatuur. \nWat jy up disse syde wysigen is van invlööd up de gebrukersümgeaving van andere gebrukers van disse wiki.",
+       "translateinterface": "Üm oaversettingen vöär alle wikis to te vogen of te wysigen, kün jy [https://translatewiki.net/ translatewiki.net] gebruken, et lokaliseringsprojekt vöär MediaWiki.",
+       "cascadeprotected": "Disse syde is beveiligd ümdat et vöärkümt in de volgende {{PLURAL:$1|syde|syden}}, dee beveiligd {{PLURAL:$1|is|binnet}} mid de \"kaskade\"-opty:\n$2",
+       "namespaceprotected": "Jy möäget geen syden in de <strong>$1</strong>-naamruumde bewarken.",
+       "customcssprotected": "Jy möäget disse CSS-syde neet bewarken, ümdat der persoonlike instellingen van een andere gebruker in stån.",
+       "customjsprotected": "Jy möäget disse JavaScript-syde neet bewarken, ümdat der persoonlike instellingen van een andere gebruker in stån.",
+       "mycustomcssprotected": "Jy hebbet geen rechten üm disse CSS-syde te bewarken.",
+       "mycustomjsprotected": "Jy hebbet geen rechten üm disse JavaScript-syde te bewarken.",
+       "myprivateinfoprotected": "Jy hebbet geen rechten üm juw priveegegeavens te bewarken.",
+       "mypreferencesprotected": "Jy hebbet geen rechten üm juw instellingen an te passen.",
+       "ns-specialprotected": "Speciale syden künnet neet bewarked wörden.",
+       "titleprotected": "Et anmaken van disse syde is beveiligd döär [[User:$1|$1]].\nDe upgeaven readen is <em>$2</em>.",
+       "filereadonlyerror": "Kun et bestand \"$1\" neet anpassen ümdat de bestandsmap \"$2\" up dit moment up allinnig-leasen steyt.\n\nDe upgeaven readen is: \"$3\".",
        "invalidtitle-knownnamespace": "Ongeldige titel mit naamruumte \"$2\" en tekste \"$3\"",
        "invalidtitle-unknownnamespace": "Ongeldige titel mit onbekend naamruumtenummer $1 en tekste \"$2\"",
-       "exception-nologin": "Neet an-emelded",
+       "exception-nologin": "Neet anmelded",
        "exception-nologin-text": "Um disse zied te bekieken of disse haandeling uut te kunnen voeren mu'j [[Special:Userlogin|an-emeld]] ween bie disse wiki.",
        "virus-badscanner": "Slichte konfigurasie: onbekend antivirusprogramma: ''$1''",
        "virus-scanfailed": "inlezen is mislokt (kode $1)",
        "virus-unknownscanner": "onbekend antivirusprogramma:",
        "logouttext": "'''Je bin noen aofemeld.'''\n\nt Kan ween dat der wat ziejen bin die weeregeven wörden as of je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
        "welcomeuser": "Welkom, $1!",
-       "welcomecreation-msg": "Joew gebruker is an-emaakt.\nVergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te passen.",
+       "welcomecreation-msg": "Juw gebrukerskonto is anmaked.\nVergeat neet juw [[Special:Preferences|vöärköären vöär {{SITENAME}}]] in te stellen.",
        "yourname": "Gebrukersname",
        "userlogin-yourname": "Gebrukersname",
-       "userlogin-yourname-ph": "Geef joew gebrukersnaam op",
-       "createacct-another-username-ph": "Vul de gebrukersnaam in",
+       "userlogin-yourname-ph": "Geav juw gebrukersname up",
+       "createacct-another-username-ph": "Geav de gebrukersname up",
        "yourpassword": "Wachtwoord",
        "userlogin-yourpassword": "Wachtwoord",
-       "userlogin-yourpassword-ph": "Geef joew wachtwoord op",
-       "createacct-yourpassword-ph": "Geef n wachtwoord op",
-       "yourpasswordagain": "Opniej invoeren",
-       "createacct-yourpasswordagain": "Wachtwoord bevestigen",
-       "createacct-yourpasswordagain-ph": "Geef t wachtwoord opniej op",
+       "userlogin-yourpassword-ph": "Geav juw wachtwoord up",
+       "createacct-yourpassword-ph": "Geav een wachtwoord up",
+       "yourpasswordagain": "Wachtwoord upny invoren",
+       "createacct-yourpasswordagain": "Bevästig wachtwoord",
+       "createacct-yourpasswordagain-ph": "Geav et wachtwoord upny up",
        "userlogin-remembermypassword": "Vanselv anmelden",
-       "userlogin-signwithsecure": "Beveiligde verbiending gebruken",
-       "yourdomainname": "Joew domein",
+       "userlogin-signwithsecure": "Beveiligde verbinding gebruken",
+       "yourdomainname": "Juw domein",
        "password-change-forbidden": "Je kunnen joew wachtwoord niet wiezigen op disse wiki.",
        "externaldberror": "Der gung iets fout bie de externe authentisering, of je maggen je gebrukersprofiel niet bewarken.",
        "login": "Anmelden",
        "logout": "Afmelden",
        "userlogout": "Aofmelden",
        "notloggedin": "Neet an-emelded",
-       "userlogin-noaccount": "Heb jy noch geen brukersname?",
+       "userlogin-noaccount": "Heb jy noch geen gebrukersname?",
        "userlogin-joinproject": "Wörd lid van {{SITENAME}}",
        "createaccount": "Inskryven",
-       "userlogin-resetpassword-link": "Juuw wachtwoord vergeaten?",
+       "userlogin-resetpassword-link": "Wachtwoord vergeaten?",
        "userlogin-helplink2": "Hülpe by et anmelden",
        "userlogin-loggedin": "Je binnen al an-emeld as {{GENDER:$1|$1}}.\nGebruuk et formulyr hyrunder üm an te melden as een andere gebruker.",
        "userlogin-createanother": "Een andere gebrukerskonto anmaken",
        "createacct-emailrequired": "Netpostadres",
        "createacct-emailoptional": "Netpostadres (niet verplicht)",
-       "createacct-email-ph": "Geef joew netpostadres op",
+       "createacct-email-ph": "Geav juw netpostadresse up",
        "createacct-another-email-ph": "Vul joew netpostadres in",
        "createaccountmail": "Gebruuk n tiejelik wachtwoord dat joe netzelde is en stuur t naor t op-egeven netpostadres",
        "createacct-realname": "Echte naam (niet verplicht)",
        "createacct-reason-ph": "Waorumme je n aandere gebrukerskonto anmaken",
        "createacct-submit": "Gebrukerskonto anmaken",
        "createacct-another-submit": "Gebrukerskonto anmaken",
-       "createacct-benefit-heading": "{{SITENAME}} wörden emaakt deur meensen zo as jie.",
-       "createacct-benefit-body1": "bewarking{{PLURAL:$1||en}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|zied|ziejen}}",
-       "createacct-benefit-body3": "aktieve {{PLURAL:$1|biedrager|biedragers}}",
+       "createacct-benefit-heading": "{{SITENAME}} is maked döär mensken so as ju.",
+       "createacct-benefit-body1": "{{PLURAL:$1|bewarking|bewarkingen}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|syde|syden}}",
+       "createacct-benefit-body3": "aktive {{PLURAL:$1|bydrager|bydragers}}",
        "badretype": "De wachtwoorden die'j in-etikt hebben bin niet liek alleens.",
        "userexists": "Disse gebrukersnaam is al gebruuk.\nKies n aandere naam.",
        "loginerror": "Anmeldingsfout",
        "php-mail-error-unknown": "Der was n onbekende fout mit de mail()-funksie van PHP",
        "user-mail-no-addy": "Eprobeerd n berichjen te versturen zonder n netpostadres",
        "user-mail-no-body": "Der is eprobeerd n netbreef zonder tekste of mit n biester korte tekste te versturen.",
-       "changepassword": "Wachtwoord wiezigen",
+       "changepassword": "Wachtwoord wysigen",
        "resetpass_announce": "Um t anmelden te voltooien, mu'j n niej wachtwoord invoeren.",
        "resetpass_text": "<!-- Tekste hier invoegen -->",
        "resetpass_header": "Wachtwoord wiezigen",
        "resetpass-wrong-oldpass": "t Veurlopige wachtwoord of t wachtwoord da'j noen hebben is ongeldig.\nMisschien he'j t wachtwoord al ewiezigd of n niej veurlopig wachtwoord an-evreugen.",
        "resetpass-temp-password": "Veurlopig wachtwoord:",
        "resetpass-abort-generic": "De wachtwoordwieziging is aofebreuken deur n uutbreiding.",
-       "passwordreset": "Wachtwoord opniej instellen",
+       "passwordreset": "Wachtwoord upny instellen",
        "passwordreset-text-one": "Vul dit formulier in um joew wachtwoord opniej in te stellen.",
        "passwordreset-text-many": "{{PLURAL:$1|Vul een van de gegevensvelden in um per netpost n tiejelik wachtwoord te ontvangen.}}",
        "passwordreset-disabled": "Je kunnen op disse wiki joew wachtwoord niet opniej instellen.",
        "resettokens-watchlist-token": "Token veur webvoer (Atom/RSS) van [[Special:Watchlist|wiezigingen van ziejen die joew volglieste staon]]",
        "resettokens-done": "Tokens ongedaonmaken.",
        "resettokens-resetbutton": "Ekeuzen tokens ongedaonmaken",
-       "bold_sample": "Vet-edrokten tekste",
-       "bold_tip": "Vet-edrokten tekste",
-       "italic_sample": "Schunedrokken tekste",
-       "italic_tip": "Schunedrok",
-       "link_sample": "Onderwarp",
-       "link_tip": "Interne verwiezing",
-       "extlink_sample": "http://www.example.com verwiezingstekste",
-       "extlink_tip": "Uutgaonde verwiezing",
-       "headline_sample": "Deelonderwarp",
-       "headline_tip": "Deelonderwarp",
-       "nowiki_sample": "Tekste zonder wiki-opmaak.",
-       "nowiki_tip": "Gien wiki-opmaak toepassen",
-       "image_sample": "Veurbeeld.jpg",
-       "image_tip": "Mediabestaand",
-       "media_sample": "Veurbeeld.ogg",
-       "media_tip": "Verwiezing naor bestaand",
-       "sig_tip": "Joew ondertekening (mit daotum en tied)",
-       "hr_tip": "Horizontale liende",
        "summary": "Samenvatting:",
        "subject": "Onderwarp:",
        "minoredit": "kleine wysiging",
-       "watchthis": "volg disse syde",
+       "watchthis": "Volg disse syde",
        "savearticle": "Syde uutgeaven",
        "savechanges": "Wysigingen uutgeaven",
        "publishpage": "Zied uutbrengen",
        "showpreview": "Bewarking nåkyken",
        "showdiff": "Verskil bekyken",
        "blankarticle": "<strong>Waorschuwing:</strong> de zied die'j anmaken willen is leeg.\nA'j noen weer op \"$1\" klikken, dan wördt de zied an-emaakt zonder enige inhoud.",
-       "anoneditwarning": "<strong>Waorschuwing:</strong> je bin niet an-emeld.\nJoew IP-adres zal op-esleugen wörden a'j wiezigingen op disse zied anbrengen. A'j je eigen <strong>[$1 anmelden]</strong> of <strong>[$2 inschrieven]</strong> dan koemen joew bewarkingen onder joew gebrukersnaam te staon, samen mit aandere veurdelen.",
+       "anoneditwarning": "<strong>Wårsküwing:</strong> jy binnet neet anmelded. Juw IP-adresse sal vöär ydereyne sichtbår weasen as jy wysigingen up disse syde anbrenget. As jy juw eigen <strong>[$1 anmeldet]</strong> of <strong>[$2 inskryvet]</strong> dan kommen juw bewarkingen under juw gebrukersname te stån, samen mid andere vöärdeylen.",
        "anonpreviewwarning": "''Je bin niet an-emeld.''\n''Deur de bewarking op te slaon wörden joew IP-adres op-esleugen in de ziedgeschiedenisse.''",
        "missingsummary": "'''Herinnering:''' je hebben gien samenvatting op-egeven veur de bewarking. A'j noen weer op ''Opslaon'' klikken wörden de bewarking zonder samenvatting op-esleugen.",
-       "missingcommenttext": "Plaots joew opmarking hieronder.",
+       "missingcommenttext": "Skryv een upmarking.",
        "missingcommentheader": "<strong>Waorschuwing:</strong> je hebben der gien onderwarptitel bie ezet. A'j noen weer op \"$1\" klikken, dan wörden de bewarking op-esleugen zonder onderwarptitel.",
-       "summary-preview": "Samenvatting naokieken:",
-       "subject-preview": "Onderwarp naokieken:",
+       "summary-preview": "Samenvatting nåkyken:",
+       "subject-preview": "Underwarp nåkyken:",
        "blockedtitle": "Gebruker is eblokkeerd",
-       "blockedtext": "<strong>Juw brukersname of IP-adres is blokkeerd.</strong>\n\nJy binnet blokkeerd döär $1.\nDe upgeaven readen is <em>$2</em>.\n\n* Blokkeerd vanaf: $8\n* Blokkeerd tot: $6\n* Bedoold üm te blokkeren: $7\n\nJy künnet kontakt upneamen mid $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheyrder]] üm de blokkering te bepråten.\nJy künnet de funkty \"{{int:emailuser}}\" neet bruken, behalven as jy een geldig e-postadres in juw [[Special:Preferences|instellingen]] upgeaven hebbet en et gebruuk van disse funkty neet blokkeerd is.\nEt IP-adres wat jy nu bruket is $3, en et blokkeringsnummer is #$5.\nVermeld de gegeavens dee hyrboaven stån as jy argens up disse blokkering reageren.",
+       "blockedtext": "<strong>Juw gebrukersname of IP-adres is blokkeerd.</strong>\n\nJy binnet blokkeerd döär $1.\nDe upgeaven readen is <em>$2</em>.\n\n* Blokkeerd vanaf: $8\n* Blokkeerd tot: $6\n* Bedoold üm te blokkeren: $7\n\nJy künnet kontakt upneamen mid $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beheyrder]] üm de blokkering te bepråten.\nJy künnet de funkty \"{{int:emailuser}}\" neet gebruken, behalven as jy een geldig e-postadres in juw [[Special:Preferences|instellingen]] upgeaven hebbet en et gebruuk van disse funkty neet blokkeerd is.\nEt IP-adres wat jy nu gebruket is $3, en et blokkeringsnummer is #$5.\nVermeld de gegeavens dee hyrboaven stån as jy argens up disse blokkering reageren.",
        "autoblockedtext": "Joew IP-adres is automaties eblokkeerd umdat t gebruukt wördt deur n aandere gebruker, die eblokkeerd wördt deur $1.\nDe reden hierveur was:\n\n:''$2''\n\n* Begint: $8\n* Löp of nao: $6\n* Wee eblokkeerd wördt: $7\n\nJe kunnen kontakt opnemen mit $1 of n van de aandere\n[[{{MediaWiki:Grouppage-sysop}}|beheerders]] um de blokkering te bepraoten.\n\nNB: je kunnen de opsie \"n bericht sturen\" niet gebruken, behalven a'j n geldig netpostadres op-egeven hebben in de [[Special:Preferences|gebrukersveurkeuren]] en je niet eblokkeerd bin.\n\nJoew IP-adres is $3 en joew blokkeernummer is $5.\nGeef disse nummers deur a'j kontakt mit ene opnemen over de blokkering.",
        "blockednoreason": "gien reden op-egeven",
        "whitelistedittext": "Um ziejen te kunnen wiezigen, mu'j $1 ween",
        "accmailtitle": "Wachtwoord is verstuurd.",
        "accmailtext": "Der is n willekeurig wachtwoord veur [[User talk:$1|$1]] verstuurd naor $2. t Kan ewiezigd wörden op de zied ''[[Special:ChangePassword|wachtwoord wiezigen]]'' naoda'j an-emeld bin.",
        "newarticle": "(Niej)",
-       "newarticletext": "Disse zied besteet nog niet.\nIn t veld hieronder ku'j wat schrieven um disse zied an te maken (meer informasie vie'j op de [$1 hulpzied]).\nA'j hier per ongelok terechtekeumen bin gebruuk dan de knoppe '''veurige''' um weerumme te gaon.",
-       "anontalkpagetext": "----\n<em>Disse oaverlegsyde höyrt by een anonyme bruker dee noch geen brukersname hevt, of et neet bruukt.</em>\nDårümme bruken wy et IP-adresse ter identifikaty. Een IP-adresse kan döär meyrere lüde bruked wörden. As jy een anonyme bruker binnet, en et gevööl hebbet dat jy berichten kryget dee neet vöär ju bedoold binnet [[Special:CreateAccount|skryv ju eigen dan in]] of [[Special:UserLogin|meld ju eigen an]] üm verwarring mid andere anonyme brukers in de tokumst te vöärkommen.''",
+       "newarticletext": "Disse syde besteyt noch neet.\nIn et veld hyrunder kün jy wat skryven üm disse syde an te maken (meyr informaty vind jy up de [$1 hülpsyde]).\nAs jy hyr per ungelük terechtekommen binnet bruuk dan de knoppe '''vöärige''' üm terügge te gån.",
+       "anontalkpagetext": "----\n<em>Disse oaverlegsyde höyrt by een anonyme gebruker dee noch geen gebrukersname hevt, of et neet bruukt.</em>\nDårümme gebruken wy et IP-adresse ter identifikaty. Een IP-adresse kan döär meyrere lüde gebruked wörden. As jy een anonyme gebruker binnet, en et gevööl hebbet dat jy berichten kryget dee neet vöär ju bedoold binnet [[Special:CreateAccount|skryv ju eigen dan in]] of [[Special:UserLogin|meld ju eigen an]] üm verwarring mid andere anonyme gebrukers in de tokumst te vöärkommen.''",
        "noarticletext": "Der steyt nun geen tekst up disse syde.\nJy künnet [[Special:Search/{{PAGENAME}}|de titel upsöken]] in andere syden,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söken in de logboken],\nof [{{fullurl:{{FULLPAGENAME}}|action=edit}} disse syde anmaken]</span>.",
-       "noarticletext-nopermission": "Op disse zied steet gien tekste.\nJe kunnen [[Special:Search/{{PAGENAME}}|zeuken naor disse term]] in aandere ziejen of\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken deurzeuken]</span>, mer je hebben gien rechten um disse zied an te maken.",
+       "noarticletext-nopermission": "Up disse syde steyt geen tekst.\nJy künnet [[Special:Search/{{PAGENAME}}|söken nå disse term]] in andere syden of\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboken döärsöken]</span>, mär jy hebbet geen rechten üm disse syde an te maken.",
        "missing-revision": "De versie #$1 van de zied \"{{FULLPAGENAME}} besteet niet.\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].",
        "userpage-userdoesnotexist": "Je bewarken n gebrukerszied van n gebruker die niet besteet (gebruker \"<nowiki>$1</nowiki>\"). Kiek effen nao o'j disse zied wel anmaken/bewarken willen.",
        "userpage-userdoesnotexist-view": "Gebruker \"$1\" steet hier niet in-eschreven",
        "userinvalidconfigtitle": "'''Waorschuwing:''' der is gien uutvoering mit de naam \"$1\". Vergeet niet dat joew eigen .css- en .js-ziejen beginnen mit n kleine letter, bv. \"{{ns:user}}:Naam/'''v'''ector\" in plaotse van \"{{ns:user}}:Naam/'''V'''ector.css\".",
        "updated": "(Bewark)",
        "note": "'''Opmarking:'''",
-       "previewnote": "'''Waort je: dit is n naokiekzied.'''\nJoew tekste is niet op-esleugen!",
-       "continue-editing": "Gao naor t bewarkingsvienster",
+       "previewnote": "<strong>Denk derüm dat dit allinnig een nåkyksyde is.</strong>\nJuw wysigingen binnet noch neet seakerd!",
+       "continue-editing": "Gå nå et bewarkingsveld",
        "previewconflict": "Disse versie löt zien hoe de tekste in t bovenste veld deruut kömp te zien a'j de tekste opslaon.",
        "session_fail_preview": "'''De bewarking kan niet verwarkt wörden wegens n verlies an data.'''\nProbeer t laoter weer.\nAs t probleem dan nog steeds veurkömp, probeer dan [[Special:UserLogout|opniej an te melden]].",
        "session_fail_preview_html": "'''De bewarking kan niet verwarkt wörden wegens n verlies an data.'''\n\n''Umdat in {{SITENAME}} roewe HTML in-eschakeld is, is de weergave dervan verbörgen um te veurkoemen dat t JavaScript an-evöllen wörden.''\n\n'''As dit n legitieme wieziging is, probeer t dan opniej.'''\nAs t dan nog problemen gif, probeer dan um [[Special:UserLogout|opniej an te melden]].",
        "edit_form_incomplete": "'''Partie delen van t bewarkingsformulier hebben de server niet bereikt. Kiek eers nao of de bewarkingen kloppen en probeer t opniej.'''",
        "editing": "Bewarken: $1",
        "creating": "Anmaken: $1",
-       "editingsection": "Bewarken: $1 (deelzied)",
+       "editingsection": "Bewarken: $1 (deylsyde)",
        "editingcomment": "Bewarken: $1 (niej onderwarp)",
        "editconflict": "Tegelieke bewörken: $1",
        "explainconflict": "'''NB:''' n aander hef disse zied ewiezigd naoda'j an disse bewarking begunnen bin.\nt Bovenste bewarkingsveld löt de zied zien zo as t noen is.\nDaoronder (bie \"Wiezigingen\") staon de verschillen tussen joew versie en de op-esleugen zied.\nHelemaole onderan (bie \"Joew tekste\") steet nog n bewarkingsveld mit joew versie.\nJe zullen je eigen wiezigingen in de nieje tekste in mutten passen.\n'''Allinnig''' de tekste in t bovenste veld wörden beweerd a'j noen kiezen veur \"$1\".",
        "semiprotectedpagewarning": "'''Let op:''' disse zied is beveiligd en ku'j allinnig bewarken a'j n eregistreerden gebruker bin.\nDe leste logboekregel steet hieronder:",
        "cascadeprotectedwarning": "'''Waorschuwing:''' disse zied is beveiligd, zodat allinnig beheerders disse zied bewarken kunnen, dit wörden edaon umdat disse zied veurkömp in de volgende {{PLURAL:$1|kaskade-beveiligden zied|kaskade-beveiligden ziejen}}:",
        "titleprotectedwarning": "'''Waorschuwing: disse zied is beveiligd. Je hebben [[Special:ListGroupRights|bepaolde rechten]] neudig um t an te kunnen maken.'''\nDe leste logboekregel steet hieronder:",
-       "templatesused": "{{PLURAL:$1|Mal|Mallen}} die op disse zied gebruukt wörden:",
+       "templatesused": "{{PLURAL:$1|Mal|Mallen}} dee up disse syde gebruked wörden:",
        "templatesusedpreview": "{{PLURAL:$1|Mal|Mallen}} die in disse bewarking gebruukt wörden:",
        "templatesusedsection": "{{PLURAL:$1|Mal|Mallen}} die in dit subkopjen gebruukt wörden:",
        "template-protected": "(beveiligd)",
        "template-semiprotected": "(halv-beveiligd)",
-       "hiddencategories": "Disse zied völt in de volgende verbörgen {{PLURAL:$1|kategorie|kategorieën}}:",
+       "hiddencategories": "Disse syde valt in de volgende verbörgen {{PLURAL:$1|kategory|kategoryen}}:",
        "edittools": "<!-- Disse tekste steet onder de bewarkings- en bestaandinlaodformulieren. -->",
        "nocreatetext": "Disse webstee hef de meugelikheid um nieje ziejen an te maken beteund. Je kunnen ziejen die al bestaon wiezigen of je kunnen je [[Special:UserLogin|anmelden of n gebrukerszied anmaken]].",
        "nocreate-loggedin": "Je hebben gien toestemming um nieje ziejen an te maken.",
        "sectioneditnotsupported-text": "Je kunnen op disse zied gien seksies bewarken.",
        "permissionserrors": "Gien toestemming",
        "permissionserrorstext": "Je maggen of kunnen dit niet doon. De {{PLURAL:$1|reden|redens}} daorveur {{PLURAL:$1|is|bin}}:",
-       "permissionserrorstext-withaction": "Je hebben gien recht um $2, mit de volgende {{PLURAL:$1|reden|redens}}:",
+       "permissionserrorstext-withaction": "Jy hebbet geen rechten üm $2, mid de volgende {{PLURAL:$1|readen|readenen}}:",
        "recreate-moveddeleted-warn": "'''Waorschuwing: je maken n zied an die eerder al vortedaon is.'''\n\nBedenk eerst of t neudig is um disse zied veerder te bewarken.\nVeur de dudelikheid steet hieronder  t vortdologboek en t herneumlogboek veur disse zied:",
-       "moveddeleted-notice": "Disse zied is vortedaon.\nHieronder steet de informasie uut t vortdologboek, t beveiligingslogboek, en t herneumlogboek.",
+       "moveddeleted-notice": "Disse syde is vorddån.\nHyrunder steyt de informaty uut et vortsmytlogbook, et beveiligingslogbook, en et hernöömlogbook.",
        "log-fulllog": "t Hele logboek bekieken",
        "edit-hook-aborted": "De bewarking is aofebreuken deur n hook.\nDer is gien reden op-egeven.",
        "edit-gone-missing": "De zied kon niet bie-ewörken wörden.\nt Lik derop as of t vortedaon is.",
        "undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) weerummedreid",
        "undo-summary-username-hidden": "Versie $1 deur n verbörgen gebruker weerummedreid",
        "cantcreateaccount-text": "t Anmaken van gebrukers van dit IP-adres (<b>$1</b>) is eblokkeerd deur [[User:$3|$3]].\n\nDe deur $3 op-egeven reden is ''$2''",
-       "viewpagelogs": "Bekiek logboeken veur disse zied",
+       "viewpagelogs": "Bekyk logboken vöär disse syde",
        "nohistory": "Der bin gien eerdere versies van disse zied.",
        "currentrev": "Leste versie",
-       "currentrev-asof": "Leste versie van $1",
+       "currentrev-asof": "Lätste versy van $1",
        "revisionasof": "Versy up $1",
-       "revision-info": "Versie op $1 van {{GENDER:$6|$2}}$7",
+       "revision-info": "Versy up $1 van {{GENDER:$6|$2}}$7",
        "previousrevision": "&larr; eyrere versy",
-       "nextrevision": "niejere versie &rarr;",
-       "currentrevisionlink": "versie zo as t noen is",
+       "nextrevision": "nyere versy &rarr;",
+       "currentrevisionlink": "Aktuele versy",
        "cur": "aktueel",
        "next": "Volgende",
        "last": "lätste",
        "histfirst": "Eerste",
        "histlast": "Leste",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-       "historyempty": "(leeg)",
+       "historyempty": "leadig",
        "history-feed-title": "Wiezigingsoverzichte",
        "history-feed-description": "Wiezigingsoverzichte veur disse zied op de wiki",
        "history-feed-item-nocomment": "$1 op $2",
        "rev-suppressed-unhide-diff": "Eén van de bewarkingen in disse vergeliekingen is '''vortedaon'''.\nAs der meer informasie is, ku'j t vienen in t [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} logboek mit onderdrokten informasie].\nJe kunnen [$1 de verschillen bekieken] a'j willen.",
        "rev-deleted-diff-view": "Eén van de bewarkingen veur de verschillen die'j op-evreugen hebben, is '''vortedaon'''.\nJe kunnen disse verschillen bekieken. Misschien steet der meer over in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].",
        "rev-suppressed-diff-view": "Eén van de bewarkingen veur de verschillen die'j op-evreugen hebben, is '''onderdrokt'''.\nJe kunnen disse verschillen bekieken. Misschien steet der over in t [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek mit onderdrokten versies].",
-       "rev-delundel": "bekiek/verbarg",
+       "rev-delundel": "bekyken/verbargen",
        "rev-showdeleted": "bekiek",
        "revisiondelete": "Wiezigingen vortdoon/herstellen",
        "revdelete-nooldid-title": "Gien doelversie",
        "mergelog": "Samenvoegingslogboek",
        "revertmerge": "Samenvoeging weerummedreien",
        "mergelogpagetext": "Hieronder zie'j n lieste van de leste samenvoegingen van n ziedgeschiedenisse naor n aandere.",
-       "history-title": "Versiegeschiedenisse van \"$1\"",
-       "difference-title": "Verschil tussen versies van \"$1\"",
+       "history-title": "Versygeskydenisse van \"$1\"",
+       "difference-title": "Verskil tüsken versys van \"$1\"",
        "difference-title-multipage": "Verschil tussen ziejen \"$1\" en \"$2\"",
        "difference-multipage": "(Verschil tussen ziejen)",
        "lineno": "Regel $1:",
        "showhideselectedversions": "Ekeuzen versies bekieken/verbargen",
        "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-otherusers": "({{PLURAL:$1|Eyn tüskenliggende versy|$1 tüskenliggende versys}} döär {{PLURAL:$2|eyn andere bruker|$2 brukers}} neet weadergeaven)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Eyn tüskenliggende versy|$1 tüskenliggende versys}} döär deselvde gebruker is verbörgen)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Eyn tüskenliggende versy|$1 tüskenliggende versys}} döär {{PLURAL:$2|eyn andere gebruker|$2 gebrukers}} neet weadergeaven)",
        "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": "Söökresultaten",
        "prevn": "vöärige {{PLURAL:$1|$1}}",
        "nextn": "volgende {{PLURAL:$1|$1}}",
        "prevn-title": "{{PLURAL:$1|Veurig resultaot|Veurige $1 resultaoten}}",
-       "nextn-title": "{{PLURAL:$1|Volgend resultaot|Volgende $1 resultaoten}}",
+       "nextn-title": "{{PLURAL:$1|Volgend resultaat|Volgende $1 resultaten}}",
        "shown-title": "Låt $1 {{PLURAL:$1|resultaat|resultaten}} per syde seen",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bekyken.",
        "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.}}",
+       "searchmenu-new": "<strong>De syde \"[[:$1]]\" up disse wiki anmaken!</strong> \n{{PLURAL:$2|0=|See ouk de syde mid juw söökresultaten.|See ouk de lyste mid vünden söökresultaten.}}",
        "searchprofile-articles": "Artikels",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "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": "(döärverwysing vanaf $1)",
-       "search-section": "(onderwarp $1)",
+       "search-section": "(underwarp $1)",
        "search-file-match": "(kümt oavereyne mid de inhold van et bestand)",
-       "search-suggest": "Bedoelden je: $1",
-       "search-interwiki-caption": "Zusterprojekten",
+       "search-suggest": "Bedoolde jy: $1",
+       "search-interwiki-caption": "Resultaten van süsterprojekten",
        "search-interwiki-default": "Resultaoten van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwaant",
        "searchrelated": "verwaant",
        "searchall": "alles",
        "showingresults": "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
-       "search-showingresults": "{{PLURAL:$4|Resultaot <strong>$1</strong> van <strong>$2</strong>|Resultaoten <strong>$1 - $2</strong> van <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Resultaat <strong>$1</strong> van <strong>$3</strong>|Resultaten <strong>$1 – $2</strong> van <strong>$3</strong>}}",
        "search-nonefound": "Der binnet geen resultaten vöär de söökupdrachte.",
        "powersearch-legend": "Uutgebreid zeuken",
        "powersearch-ns": "Zeuken in naamruumten:",
        "search-external": "Extern zeuken",
        "searchdisabled": "Zeuken in {{SITENAME}} is niet meugelik. Je kunnen gebruukmaken van Google. De gegevens over {{SITENAME}} bin misschien niet bie-ewörken.",
        "search-error": "Der is wat mis-egaon bie t zeuken: $1",
-       "preferences": "Veurkeuren",
-       "mypreferences": "Myn vöärköären",
+       "preferences": "Instellingen",
+       "mypreferences": "Instellingen",
        "prefs-edits": "Antal bewarkingen:",
        "prefs-skin": "{{SITENAME}}-uterlik",
        "skin-preview": "bekieken",
        "datedefault": "Gien veurkeur",
        "prefs-labs": "Alphafunksies",
        "prefs-user-pages": "Gebrukersziejen",
-       "prefs-personal": "Gebrukersgegevens",
-       "prefs-rc": "Leste wiezigingen",
-       "prefs-watchlist": "Volglieste",
+       "prefs-personal": "Brukersgegeavens",
+       "prefs-rc": "Lätste wysigingen",
+       "prefs-watchlist": "Volglyste",
        "prefs-editwatchlist-label": "Onderwarpen op joew volglieste bewarken:",
        "prefs-editwatchlist-edit": "Onderwarpen op mien volgliesten bekieken en vortdoon",
        "prefs-watchlist-days": "Antal dagen in de volglieste bekieken:",
        "prefs-changeemail": "Netpostadres wiezigen of vorthaolen",
        "prefs-setemail": "Stel n netpostadres in",
        "prefs-email": "Instellingen veur netpost",
-       "prefs-rendering": "Ziedweergave",
-       "saveprefs": "Veurkeuren opslaon",
+       "prefs-rendering": "Uterlik",
+       "saveprefs": "Instellingen seakeren",
        "restoreprefs": "Alle standardinstellingen weerummezetten (veur alle seksies)",
        "prefs-editing": "Bewarkingsveld",
        "searchresultshead": "Zeukresultaoten",
        "recentchangescount": "Standard antal bewarkingen um te laoten zien:",
        "prefs-help-recentchangescount": "Dit geldt veur leste wiezigingen, ziedgeschiedenisse en logboekziejen",
        "prefs-help-watchlist-token2": "Dit is de geheime sleutel veur de webvoer van joew volglieste.\nIederene die t token kent, kan joew volglieste bekieken, dus deel dit token niet.\nJe kunnen de [[Special:ResetTokens|tokens opniej instellen]] a'j dat willen.",
-       "savedprefs": "Veurkeuren bin op-esleugen.",
+       "savedprefs": "Instellingen binnet seakerd.",
        "timezonelegend": "Tiedzone:",
        "localtime": "Plaotselike tied:",
        "timezoneuseserverdefault": "Wikistandard gebruken ($1)",
        "timezoneregion-indian": "Indiese Oseaan",
        "timezoneregion-pacific": "Stille Oseaan",
        "allowemail": "Berichten van aandere gebrukers toestaon",
-       "prefs-searchoptions": "Zeukinstellingen",
+       "prefs-searchoptions": "Söken",
        "prefs-namespaces": "Naamruumtes",
        "default": "standard",
        "prefs-files": "Bestaanden",
        "prefs-emailconfirm-label": "Netpostbevestiging:",
        "youremail": "Netpostadres (niet verplicht) *",
        "username": "{{GENDER:$1|Gebrukersnaam}}:",
-       "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|groep|groepen}}:",
-       "prefs-registration": "Registrasiedaotum:",
+       "prefs-memberingroups": "{{GENDER:$2|Lid}} van {{PLURAL:$1|grup|gruppen}}:",
+       "prefs-registration": "Registratydåtum:",
        "yourrealname": "Echte naam (niet verplicht)",
-       "yourlanguage": "Taal veur systeemteksten",
+       "yourlanguage": "Taal / språke:",
        "yourvariant": "Taalvariaant veur inhoud:",
        "prefs-help-variant": "Joew veurkeursvariaant of -spelling um de inhoudsziejen van disse wiki in weer te geven.",
        "yournick": "Alias veur ondertekeningen",
        "prefs-help-signature": "Reaksies op de overlegziejen mutten ondertekend wörden mit \"<nowiki>~~~~</nowiki>\", dit wörden dan ummezet in joew ondertekening mit daorbie de daotum en tied van de bewarking.",
        "badsig": "Ongeldige haandtekening; HTML naokieken.",
        "badsiglength": "Joew haandtekening is te lang.\nt Mut minder as {{PLURAL:$1|letter|letters}} hebben.",
-       "yourgender": "Geslacht:",
-       "gender-unknown": "De programmatuur gebruukt zoveul meugelik geslachtsneutrale woorden as t over joe geet.",
-       "gender-male": "Keerl",
-       "gender-female": "Deerne",
-       "prefs-help-gender": "Disse instelling is opsioneel.\n\nDe programmatuur gebruukt disse weerde um joe op de juuste maniere an te spreken en veur aandere gebrukers um joew geslacht an te geven.\nDisse informasie is zichtbaor veur aandere gebrukers.",
+       "yourgender": "Ho wil jy beskreaven wörden?",
+       "gender-unknown": "Geslachtsneutrale anspreaksform",
+       "gender-male": "Hee bewarkt syden",
+       "gender-female": "See bewarkt syden",
+       "prefs-help-gender": "Disse instelling is optioneel.\nDe programmatuur gebruukt disse waerde um ju up de jüüste manere an te spreaken en vöär andere gebrukers üm juw geslacht an te geaven.\nDisse informaty is sichtbår vöär andere gebrukers.",
        "email": "Privéberichten",
        "prefs-help-realname": "Echte naam is keuzevrie.\nA'j disse opsie invullen zu'w joew echte naam gebruken um erkenning te geven veur joew wark.",
        "prefs-help-email": "n Netpostadres is niet verplicht, mer zo ku'w wel joew wachtwoord toesturen veur a'j t vergeten bin.",
        "prefs-help-email-others": "Je kunnen oek aandere meensen de meugelikheid geven um kontakt mit joe op te nemen mit n verwiezing op joew gebrukers- en overlegzied zonder da'j de identiteit pries hoeven te geven.",
        "prefs-help-email-required": "Hier he'w n netpostadres veur neudig.",
-       "prefs-info": "Baosisinformasie",
-       "prefs-i18n": "Taalinstellingen",
+       "prefs-info": "Basisinformaty",
+       "prefs-i18n": "Språkinstellingen",
        "prefs-signature": "Ondertekening",
        "prefs-dateformat": "Daotumopmaak:",
        "prefs-timeoffset": "Tiedsverschil",
        "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": "Logbook van nye brukers",
+       "newuserlogpage": "Logbook van nye gebrukers",
        "newuserlogpagetext": "Hieronder staon de niej in-eschreven gebrukers",
        "rightslog": "Gebrukersrechtenlogboek",
        "rightslogtext": "Dit is n logboek mit veraanderingen van gebrukersrechten",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}<br />(see ouk de [[Special:NewPages|lyste mid nye syden]])",
        "recentchanges-submit": "Bekiek",
        "rcfilters-legend-heading": "<strong>Lyste mid afkortingen:</strong>",
-       "rcfilters-group-results-by-page": "Resultaoten per zied groeperen",
+       "rcfilters-group-results-by-page": "Resultaten per syde grupperen",
        "rcfilters-activefilters": "Aktive filters",
        "rcfilters-activefilters-hide": "Verbarg",
        "rcfilters-activefilters-show": "Bekiek",
        "rcfilters-activefilters-hide-tooltip": "Verbarg aktive filters",
        "rcfilters-activefilters-show-tooltip": "Laot aktive filters seen",
-       "rcfilters-limit-title": "Resultåten üm te låten seen",
+       "rcfilters-limit-title": "Resultaten üm te låten seen",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|wysiging|wysigingen}}, $2",
        "rcfilters-date-popup-title": "Tydsperiode üm te döärsöken",
        "rcfilters-days-title": "De vöärbye dagen",
        "rcfilters-hours-title": "De lätste uren",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|dag|dagen}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|uur|uren}}",
-       "rcfilters-quickfilters": "Upeslöägen filters",
+       "rcfilters-quickfilters": "Seakerde filters",
        "rcfilters-quickfilters-placeholder-title": "Noch geen filters up-eslöägen",
-       "rcfilters-quickfilters-placeholder-description": "Üm juuw filterinstellingen up te slån en et låter te gebruken, klik up et bladwyserikoon underan by \"Aktive filters\".",
+       "rcfilters-quickfilters-placeholder-description": "Üm juw filterinstellingen te seakeren en et later te herbruken, klik up et bladwyserpiktogram underan by \"Aktive filters\".",
        "rcfilters-savedqueries-apply-label": "Instellingen opslaon",
        "rcfilters-savedqueries-cancel-label": "Aofbreken",
        "rcfilters-savedqueries-add-new-title": "Filterinstellingen seakeren",
        "rcfilters-show-new-changes": "Låt nyste wysigingen seen",
        "rcfilters-search-placeholder": "Filter wysigingen (bruuk et menü of söök up filtername)",
        "rcfilters-filterlist-feedbacklink": "Låt uns weaten wat jy van disse (nye) filterhülpmiddels vinden",
-       "rcfilters-highlightbutton-title": "Resultåten markeren",
+       "rcfilters-highlightbutton-title": "Resultaten markeren",
        "rcfilters-highlightmenu-title": "Kies n kleur",
        "rcfilters-filtergroup-user-experience-level": "Gebrukersanmelding en ervåring",
        "rcfilters-filter-user-experience-level-registered-label": "An-emeld",
        "rcfilters-filter-user-experience-level-newcomer-label": "Anwas",
        "rcfilters-filter-user-experience-level-newcomer-description": "An-emelden bewarkers dee minder as 10 bewarkingen edån hebben of 4 dagen aktiv ewesd hebben.",
        "rcfilters-filter-user-experience-level-learner-label": "Leyrlingen",
-       "rcfilters-filter-user-experience-level-learner-description": "Anmeldede bewarkers mid meyr ervaring as \"anwas\", mär minder as \"ervaren brukers\".",
+       "rcfilters-filter-user-experience-level-learner-description": "Anmeldede bewarkers mid meyr ervaring as \"anwas\", mär minder as \"ervaren gebrukers\".",
        "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-newpages-description": "Bewarkingen wårmead jy een nye syde anmaket.",
        "rcfilters-filter-categorization-label": "Kategorywysigingen",
        "rcfilters-filter-categorization-description": "Upgave van syden dee to-evoogd of vordedån wörden uut kategoryen.",
-       "rcfilters-filter-logactions-label": "Eregistreerde aktys",
+       "rcfilters-filter-logactions-label": "Registreerde aktys",
        "rcfilters-filter-logactions-description": "Administrative handelingen, nye kontos, vordedåne syden, upladingen…",
        "rcfilters-filtergroup-lastrevision": "Lätste versys",
        "rcfilters-filter-lastrevision-label": "Lätste versy",
        "rcfilters-filter-previousrevision-label": "Neet de lätste versy",
        "rcfilters-filter-previousrevision-description": "Alle wysigingen dee neet de \"lätste versy\" binnen.",
        "rcfilters-view-tags": "Emarkeerde wysigingen",
-       "rcfilters-view-namespaces-tooltip": "Filter resultåten up naamruumte",
-       "rcfilters-view-tags-tooltip": "Filter resultåten döär gebrüük te maken van bewarkingsetiketten",
+       "rcfilters-view-namespaces-tooltip": "Filter resultaten up naamruumde",
+       "rcfilters-view-tags-tooltip": "Filter resultaten döär bewarkingsetiketten te gebruken",
        "rcfilters-liveupdates-button": "Rechtstreakse aktualisering",
        "rcfilters-liveupdates-button-title-off": "Nye wysigingen voorddalik låten seen",
        "rcnotefrom": "Wysigingen sinds <strong>$3, $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wysiging|wysigingen}}).",
        "rclistfrom": "Bekyk wysigingen vanaf $3 $2",
        "rcshowhideminor": "$1 kleine wysigingen",
-       "rcshowhideminor-show": "Bekiek",
+       "rcshowhideminor-show": "bekyken",
        "rcshowhideminor-hide": "verbargen",
        "rcshowhidebots": "$1 botbrukers",
        "rcshowhidebots-show": "bekyken",
-       "rcshowhidebots-hide": "Verbarg",
-       "rcshowhideliu": "$1 registreerde brukers",
+       "rcshowhidebots-hide": "verbargen",
+       "rcshowhideliu": "$1 registreerde gebrukers",
        "rcshowhideliu-show": "Bekiek",
        "rcshowhideliu-hide": "verbargen",
-       "rcshowhideanons": "$1 anonyme brukers",
-       "rcshowhideanons-show": "Bekiek",
+       "rcshowhideanons": "$1 anonyme gebrukers",
+       "rcshowhideanons-show": "bekyken",
        "rcshowhideanons-hide": "verbargen",
        "rcshowhidepatr": "$1 nao-ekeken bewarkingen",
        "rcshowhidepatr-show": "Bekiek",
        "rcshowhidepatr-hide": "Verbarg",
        "rcshowhidemine": "$1 myn bewarkingen",
-       "rcshowhidemine-show": "Bekiek",
+       "rcshowhidemine-show": "bekyken",
        "rcshowhidemine-hide": "verbargen",
        "rcshowhidecategorization": "$1 kategorisering van ziejen",
        "rcshowhidecategorization-show": "Bekiek",
        "rclinks": "Bekyk de lätste $1 wysigingen van de vöärbye $2 dagen",
        "diff": "verskil",
        "hist": "geskydenisse",
-       "hide": "verbarg",
-       "show": "bekiek",
+       "hide": "verbargen",
+       "show": "bekyken",
        "minoreditletter": "K",
        "newpageletter": "N",
        "boteditletter": "B",
        "recentchangeslinked": "Soortgelyke wysigingen",
        "recentchangeslinked-feed": "Volg verwysingen",
        "recentchangeslinked-toolbox": "Volg verwysingen",
-       "recentchangeslinked-title": "Wiezigingen verwaant an $1",
+       "recentchangeslinked-title": "Wysigingen verwand an $1",
        "recentchangeslinked-summary": "Voor een sydname in üm bewarkingen te seen up syden wårnå verweasen wördt of dårnå verwysen. (Voor {{ns:category}}:kategoryname in üm leaden van een kategory te seen). Bewarkingen van syden up [[Special:Watchlist|juw volglyste]] binnet <strong>vetdrükked</strong>.",
-       "recentchangeslinked-page": "Ziednaam:",
-       "recentchangeslinked-to": "Bekiek wiezigingen op ziejen mit verwiezingen naor disse zied",
+       "recentchangeslinked-page": "Sydname:",
+       "recentchangeslinked-to": "Bekyk wysigingen up syden dee hyrhinne verwysen",
        "recentchanges-page-added-to-category": "[[:$1]] bie kategorie ezet",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] bie kategorie ezet, [[Special:WhatLinksHere/$1|disse zied zit in aandere ziejen in-esleuten]]",
        "recentchanges-page-removed-from-category": "[[:$1]] is vortedaon uut kategorie",
        "uploadlogpage": "Logboek mit nieje bestaanden",
        "uploadlogpagetext": "Hieronder steet n lieste mit bestaanden die net niej bin.\nZie de [[Special:NewFiles|uutstalling mit media]] veur n overzicht.",
        "filename": "Bestaandsnaam",
-       "filedesc": "Beschrieving",
+       "filedesc": "Beskryving",
        "fileuploadsummary": "Beschrieving:",
        "filereuploadsummary": "Bestaandswiezigingen:",
        "filestatus": "Auteursrechtstaotus",
        "upload-curl-error6-text": "t Webadres kon niet bereikt wörden. Kiek effen nao o'j t goeie adres in-evoerd hebben en of de webstee bereikbaor is.",
        "upload-curl-error28": "Tiedsoverschriejing veur t versturen van t bestaand",
        "upload-curl-error28-text": "t Duren te lange veurdat de webstee reageren. Kiek effen nao of de webstee bereikbaor is, wacht effen en probeer t daornao weer. Probeer t aanders as t wat rustiger is.",
-       "license": "Lisensie",
-       "license-header": "Lisensie",
-       "nolicense": "Gien lisensie ekeuzen",
+       "license": "Licensy",
+       "license-header": "Licensy",
+       "nolicense": "Geen licensy köäsen",
        "license-nopreview": "(Naokieken is niet meugelik)",
        "upload_source_url": " (een geldig, publiek toegankelik webadres)",
        "upload_source_file": " (n bestaand op de hardeschieve)",
        "listfiles-summary": "Op disse spesiale zied ku'j alle bestaanden bekieken die lestens op-estuurd bin.",
        "listfiles_search_for": "Zeuk naor bestaand:",
-       "imgfile": "bestaand",
+       "imgfile": "bestand",
        "listfiles": "Bestaandslieste",
        "listfiles_thumb": "Miniatuuraofbeelding",
        "listfiles_date": "Daotum",
        "filehist-thumb": "Miniatuurafbealding",
        "filehist-thumbtext": "Miniatuurafbealding vöär versy van $1",
        "filehist-nothumb": "Gien miniatuuraofbeelding",
-       "filehist-user": "Bruker",
+       "filehist-user": "Gebruker",
        "filehist-dimensions": "Groutde",
        "filehist-filesize": "Bestaandsgrootte",
        "filehist-comment": "Kommentaar",
        "imagelinks": "Bestandsbruuk",
-       "linkstoimage": "Dit bestand wördt up de volgende {{PLURAL:$1|syde|$1 syden}} bruked:",
-       "linkstoimage-more": "Meyr as $1 {{PLURAL:$1|syde bruukt|syden bruken}} dit bestand.\nDe volgende lyste givt allinnig de {{PLURAL:$1|eyrste syde|eyrste $1 syden}} weader dee dit bestand bruukt.\nDe [[Special:WhatLinksHere/$2|heyle lyste]] is ouk beskikbår.",
-       "nolinkstoimage": "Geen enkelde syde gebrüükt disse holder.",
+       "linkstoimage": "Dit bestand wördt up de volgende {{PLURAL:$1|syde|$1 syden}} gebruked:",
+       "linkstoimage-more": "Meyr as $1 {{PLURAL:$1|syde gebruukt|syden gebruken}} dit bestand.\nDe volgende lyste givt allinnig de {{PLURAL:$1|eyrste syde|eyrste $1 syden}} weader dee dit bestand gebruukt.\nDe [[Special:WhatLinksHere/$2|heyle lyste]] is ouk beskikbår.",
+       "nolinkstoimage": "Geen enkele syde gebruukt dit bestand.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|Meer verwiezingen]] naor dit bestaand bekieken.",
        "linkstoimage-redirect": "$1 (bestaandsdeurverwiezing) $2",
        "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 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-here": "Dit bestand kümt van $1 en kan ouk in andere projekten gebruked 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.",
        "uploadnewversion-linktext": "n Niejere versie van dit bestaand opsturen.",
        "shared-repo-from": "uut $1",
        "shared-repo": "n edeelden mediadatabanke",
-       "upload-disallowed-here": "Je kunnen dit bestaand niet overschrieven.",
+       "upload-disallowed-here": "Jy künnet dit bestand neet oaverskryven.",
        "filerevert": "$1 weerummedreien",
        "filerevert-legend": "Bestaand weerummezetten",
        "filerevert-intro": "Je bin '''[[Media:$1|$1]]''' an t weerummedreien tot de [$4 versie van $2, $3]",
        "ncategories": "$1 {{PLURAL:$1|kategorie|kategorieën}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwikiverwiezing|interwikiverwiezingen}}",
        "nlinks": "$1 {{PLURAL:$1|verwiezing|verwiezingen}}",
-       "nmembers": "$1 {{PLURAL:$1|onderwarp|onderwarpen}}",
+       "nmembers": "$1 {{PLURAL:$1|lid|leaden}}",
        "nrevisions": "$1 {{PLURAL:$1|versie|versies}}",
        "nimagelinks": "Wörden op {{PLURAL:$1|één zied|$1 ziejen}} gebruukt",
        "ntransclusions": "wörden op {{PLURAL:$1|één zied|$1 ziejen}} gebruukt",
        "nopagetitle": "Doelzied besteet niet",
        "nopagetext": "De zied die'j herneumen willen besteet niet.",
        "pager-newer-n": "{{PLURAL:$1|1 niejere|$1 niejere}}",
-       "pager-older-n": "{{PLURAL:$1|1 ouwere|$1 ouwere}}",
+       "pager-older-n": "{{PLURAL:$1|1 oldere|$1 oldere}}",
        "suppress": "Toezicht",
        "querypage-disabled": "Disse spesiale zied is uutezet um prestasieredens.",
        "apisandbox": "API-zaandkule",
-       "booksources": "Boekinformasie",
-       "booksources-search-legend": "Zeuk informasie over n boek",
-       "booksources-search": "Zeuken",
+       "booksources": "Bookinformaty",
+       "booksources-search-legend": "Söök bronnen van een book",
+       "booksources-search": "ken",
        "booksources-text": "Hieronder steet n lieste mit verwiezingen naor aandere websteeën die nieje of wat ouwere boeken verkopen, en daor hebben ze warschienlik meer informasie over t boek da'j zeuken:",
        "booksources-invalid-isbn": "De op-egeven ISBN klop niet; kiek effen nao o'j gien fout emaakt hebben bie de invoer.",
        "magiclink-tracking-isbn": "Ziejen die magiese ISBN-verwiezingen gebruken",
        "cachedspecial-viewing-cached-ttl": "Je bekieken noen n versie uut t tussengeheugen van disse zied, die hooguut $1 oud is.",
        "cachedspecial-viewing-cached-ts": "Je bekieken noen n versie uut t tussengeheugen van disse zied, t kan ween dat t niet helemaole bie de tied is.",
        "cachedspecial-refresh-now": "Leste bekieken.",
-       "categories": "Kategorieën",
+       "categories": "Kategoryen",
        "categoriespagetext": "De de volgende {{PLURAL:$1|kategorie steet|kategorieën staon}} ziejen of mediabestaanden.\n[[Special:UnusedCategories|ongebruukten kategorieën]] zie'j hier niet.\nZie oek [[Special:WantedCategories|gewunste kategorieën]].",
        "categoriesfrom": "Laot kategorieën zien vanaof:",
        "deletedcontributions": "Vortedaone gebrukersbiedragen",
        "usermessage-summary": "Systeemteksten achter-eleuten",
        "usermessage-editor": "Systeemtekste",
        "watchlist": "Volglieste",
-       "mywatchlist": "Myn volglyste",
+       "mywatchlist": "Volglyste",
        "watchlistfor2": "Veur $1 ($2)",
        "nowatchlist": "Gien artikels in volglieste.",
        "watchlistanontext": "$1 is verplicht um joew volglieste te bekieken of te wiezigen.",
        "actioncomplete": "Uutevoerd",
        "actionfailed": "De haandeling is mislokt.",
        "deletedtext": "t Artikel \"$1\" is vortedaon. Zie de \"$2\" veur n lieste van ziejen die as lest vortedaon bin.",
-       "dellogpage": "Vortdologboek",
+       "dellogpage": "Vordsmytlogbook",
        "dellogpagetext": "Hieronder steet n lieste van ziejen en bestaanden die as lest vortedaon bin.",
        "deletionlog": "Vortdologboek",
        "reverted": "Eerdere versie hersteld",
        "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": "weaderümmedraien",
-       "rollbacklinkcount": "{{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
+       "rollbacklinkcount": "{{PLURAL:$1|eyn bewarking|$1 bewarkingen}} weaderümmedraien",
        "rollbacklinkcount-morethan": "Meer as {{PLURAL:$1|één bewarking|$1 bewarkingen}} weerummedreien",
        "rollbackfailed": "Wieziging herstellen is mislokt",
        "cantrollback": "De wiezigingen konnen niet hersteld wörden; der is mer 1 auteur.",
        "rollback-success": "Wiezigingen van $1; weerummedreid naor de leste versie van $2.",
        "sessionfailure-title": "Sessiefout",
        "sessionfailure": "Der is n probleem mit joew anmeldsessie. De aksie is stop-ezet uut veurzörg tegen n beveiligingsrisico (dat besteet uut t meugelike \"kraken\" van disse sessie). Gao weerumme naor de veurige zied, laoj disse zied opniej en probeer t nog es.",
-       "protectlogpage": "Beveiligingslogboek",
+       "protectlogpage": "Beveiligingslogbook",
        "protectlogtext": "Hieronder staon de leste wiezigingen veur t blokkeren en vriegeven van artikels en ziejen.\nZie de [[Special:ProtectedPages|lieste mit ziejen die beveiligd bin]] veur t hele overzicht.",
        "protectedarticle": "[[$1]] is beveiligd",
        "modifiedarticleprotection": "beveiligingsnivo van \"[[$1]]\"  ewiezigd",
        "blanknamespace": "(Höyvdnaamruumde)",
        "contributions": "{{GENDER:$1|Brukersbydragen}}",
        "contributions-title": "Biedragen van $1",
-       "mycontris": "Myn bydragen",
+       "mycontris": "Bydragen",
        "anoncontribs": "Bydragen",
        "contribsub2": "Veur {{GENDER:$3|$1}} ($2)",
        "nocontribs": "Gien wiezigingen evunnen die an de estelde criteria voldoon.",
        "uctop": "leste wieziging",
-       "month": "Maond:",
-       "year": "Jaor:",
+       "month": "Månd:",
+       "year": "Vanaf jår (en eyrer):",
        "sp-contributions-blocklog": "blokkeerlogboek",
        "sp-contributions-deleted": "vortedaone gebrukersbiedragen",
        "sp-contributions-uploads": "nieje bestaanden",
        "sp-contributions-newonly": "Allinnig nieje ziejen laoten zien",
        "sp-contributions-submit": "Zeuk",
        "whatlinkshere": "Verwysingen hyrhinne",
-       "whatlinkshere-title": "Ziejen die verwiezen naor \"$1\"",
-       "whatlinkshere-page": "Zied:",
-       "linkshere": "Disse ziejen verwiezen naor '''$2''':",
+       "whatlinkshere-title": "Syden dee nå \"$1\" verwyset",
+       "whatlinkshere-page": "Syde:",
+       "linkshere": "De volgende syden verwysen nå <strong>$2</strong>:",
        "nolinkshere": "Gien enkele zied verwis naor '''$2'''.",
        "nolinkshere-ns": "Gien enkele zied verwis naor '''$2''' in de ekeuzen naamruumte.",
-       "isredirect": "deurverwiezing",
-       "istemplate": "in-evoegd as mal",
-       "isimage": "bestaandsverwiezing",
-       "whatlinkshere-prev": "{{PLURAL:$1|veurige|veurige $1}}",
+       "isredirect": "döärverwysing",
+       "istemplate": "invoogd as mal",
+       "isimage": "bestandsverwysing",
+       "whatlinkshere-prev": "{{PLURAL:$1|vöärige|vöärige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|volgende|volgende $1}}",
-       "whatlinkshere-links": "← verwiezingen",
-       "whatlinkshere-hideredirs": "$1 deurverwiezingen",
-       "whatlinkshere-hidetrans": "Vörlageninbinnungen $1",
-       "whatlinkshere-hidelinks": "Lenken $1",
+       "whatlinkshere-links": "← verwysingen",
+       "whatlinkshere-hideredirs": "$1 döärverwysingen",
+       "whatlinkshere-hidetrans": "$1 invoogde mallen",
+       "whatlinkshere-hidelinks": "$1 verwysingen",
        "whatlinkshere-hideimages": "$1 holderverwysingen",
        "whatlinkshere-filters": "Filters",
        "autoblockid": "Automatiese blokkering #$1",
        "semiprotectedpagemovewarning": "'''Waorschuwing:''' disse zied kan allinnig deur eregistreerden gebrukers herneumd wörden.\nDe leste logboekregel steet hieronder:",
        "move-over-sharedrepo": "== t Bestaand besteet al ==\n[[:$1]] besteet al in de edeelden mediadatabanke. A'j n bestaand naor disse titel herneumen, dan ku'j  t edeelden bestaand niet gebruken.",
        "file-exists-sharedrepo": "Disse bestaandsnaam besteet al in de edeelden mediadatabanke.\nKies n aandere bestaandsnaam.",
-       "export": "Ziejen exporteren",
+       "export": "Syden eksporteren",
        "exporttext": "De tekste en geschiedenisse van n zied of n koppel ziejen kunnen in XML-formaot uutevoerd wörden. Dit bestaand ku'j daornao exporteren naor n aandere MediaWiki deur de [[Special:Import|invoerzied]] te gebruken.\n\nZet in t onderstaonde veld de namen van de ziejen die'j exporteren willen, één zied per regel, en geef an o'j alle versies mit de bewarkingssamenvatting exporteren willen of allinnig de leste versies mit de bewarkingssamenvatting.\n\nA'j dat leste doon willen dan ku'j oek n verwiezing gebruken, bieveurbeeld [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] veur de zied \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Alle ziejen exporteren",
        "exportcuronly": "Allinnig de actuele versie, niet de veurgeschiedenisse",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versie|versies}} van $2",
        "javascripttest": "JavaScript testen",
        "javascripttest-qunit-intro": "Zie de [$1 testdokumentasie] op mediawiki.org.",
-       "tooltip-pt-userpage": "{{GENDER:|Oew}} gebroekersziede",
+       "tooltip-pt-userpage": "{{GENDER:|Juw}} gebrukerssyde",
        "tooltip-pt-anonuserpage": "Gebroekersbladziede vuur t IP-adres da'j broekt",
-       "tooltip-pt-mytalk": "{{GENDER:|Oew}} oaverlegziede",
+       "tooltip-pt-mytalk": "{{GENDER:|Juw}} oaverlegsyde",
        "tooltip-pt-anontalk": "Oaverlegbladziede van n naamlozen gebroeker van dit IP-adres",
-       "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": "Jy wördet van harte uutnöygd üm ju an te melden as bruker, mär et is neet verplicht",
-       "tooltip-pt-logout": "Ofmaelden",
+       "tooltip-pt-preferences": "{{GENDER:|Juw}} instellingen",
+       "tooltip-pt-watchlist": "Lyste van syden dee up myn volglyste stån",
+       "tooltip-pt-mycontris": "Oaversicht van {{GENDER:|juw}} bydragen",
+       "tooltip-pt-login": "Jy wördet van harte nöygd üm ju an te melden as gebruker, mär et is neet verplichted",
+       "tooltip-pt-logout": "Afmelden",
        "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": "Ny underwarp tovogen",
-       "tooltip-ca-viewsource": "Disse ziede is beveiligd taegen veraanderen. Iej könt wal kieken noar de ziede",
+       "tooltip-ca-viewsource": "Disse syde is beveiligd. \nJy künnet wel de bronkode wel bekyken.",
        "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-move": "Disse syde hernömen",
        "tooltip-ca-watch": "Voog disse syde to an juw volglyste",
        "tooltip-ca-unwatch": "Smiet disse ziede van oewe voalglieste",
        "tooltip-search": "{{SITENAME}} döärsöken",
        "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-contributions": "Een lyste mid bydragen van {{GENDER:$1|disse gebruker}}",
        "tooltip-t-emailuser": "Stüür disse {{GENDER:$1|gebruker}} een netpostbericht",
        "tooltip-t-info": "Meer informasie over disse zied",
        "tooltip-t-upload": "Laad afbealdingen en/of gelüüdsmateriaal",
        "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-user": "Gebrukerssyde bekyken",
        "tooltip-ca-nstab-media": "Loat n mediatekst zeen",
        "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-project": "Projektsyde bekyken",
        "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-template": "Mal bekyken",
        "tooltip-ca-nstab-help": "Loat de hölpbladziede zeen",
        "tooltip-ca-nstab-category": "Låt de kategorysyde seen",
        "tooltip-minoredit": "Markeer as n klaene wieziging",
-       "tooltip-save": "Wiezigingen opsloan",
-       "tooltip-preview": "Bekiek oew versie vuurda'j t opsloan (anbeveulen)!",
-       "tooltip-diff": "Bekiek oew aegen wiezigingen",
+       "tooltip-save": "Wysigingen seakeren",
+       "tooltip-preview": "Bekyk juw wysigingen. Bruuk dit vöärdat jy seakeret.",
+       "tooltip-diff": "Låt seen welke wysigingen jy in de tekst maked hebbet.",
        "tooltip-compareselectedversions": "Bekiek de verschillen tussen de ekeuzen versies.",
        "tooltip-watch": "Voog disse ziede to an oew volglieste",
        "tooltip-watchlistedit-normal-submit": "Ziejen vortdoon",
        "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": "\"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-rollback": "\"Weaderümmedraien\" drait mid eyn klik de bewarking(en) van de lätste gebruker up disse syde terügge.",
+       "tooltip-undo": "As jy up \"weaderümmedraien\" klikket geyt et bewarkingsveld lös en kün jy een vöärige versy weaderümmesetten. Jy künnet in de bewarkingssamenvatting een readen upgeaven.",
        "tooltip-preferences-save": "Vuurkeuren opsloan",
-       "tooltip-summary": "Voer ne korte samenvatting in",
+       "tooltip-summary": "Voor een korte samenvatting in",
        "interlanguage-link-title": "$1 – $2",
        "anonymous": "Anonieme {{PLURAL:$1|gebruker|gebrukers}} van {{SITENAME}}",
        "siteuser": "{{SITENAME}}-gebruker $1",
        "spam_reverting": "Bezig mit t weerummezetten naor de leste versie die gien verwiezing hef naor $1",
        "spam_blanking": "Alle wiezigingen mit n verwiezing naor $1 wörden vortehaold",
        "spam_deleting": "In alle versies staon verwiezingen naor $1. Zied vortedaon",
-       "simpleantispam-label": "Antispamkontraole.\nHier <strong>niks</strong> invullen!",
+       "simpleantispam-label": "Antispamkontrole.\nHyr <strong>niks</strong> invüllen!",
        "pageinfo-title": "Informasie over \"$1\"",
        "pageinfo-not-current": "Disse gegevens bin allinnig beschikbaor veur disse versie.",
-       "pageinfo-header-basic": "Baosisinformasie",
+       "pageinfo-header-basic": "Basisinformaty",
        "pageinfo-header-edits": "Bewarkingsgeschiedenisse",
        "pageinfo-header-restrictions": "Ziedbeveiliging",
        "pageinfo-header-properties": "Ziedeigenschappen",
        "filedelete-old-unregistered": "De an-egeven bestaandsversie \"$1\" steet niet in de databanke.",
        "filedelete-current-unregistered": "t An-egeven bestaand \"$1\" steet niet in de databanke.",
        "filedelete-archive-read-only": "De webserver kan niet in de archiefmap \"$1\" schrieven.",
-       "previousdiff": "← veurige wieziging",
-       "nextdiff": "volgende wieziging →",
+       "previousdiff": "← vöärige wysiging",
+       "nextdiff": "volgende wysiging →",
        "mediawarning": "'''Waorschuwing:''' in dit bestaand zit misschien kodering die slicht is veur t systeem.",
        "imagemaxsize": "Maximale aofmetingen van aofbeeldingen:<br />\n''(veur op de beschrievingszied)''",
        "thumbsize": "Grootte van de miniatuuraofbeelding:",
        "file-info": "Bestaandsgrootte: $1, MIME-type: $2",
        "file-info-size": "$1 × $2 bealdpunten, bestandsgroutde: $3, MIME-type: $4",
        "file-info-size-pages": "$1 × $2 beeldpunten, bestaandsgrootte: $3, MIME-type: $4, $5 {{PLURAL:$5|zied|ziejen}}",
-       "file-nohires": "Gien hogere resolusie beschikbaor.",
-       "svg-long-desc": "SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3",
+       "file-nohires": "Geen hougere resoluty beskikbår.",
+       "svg-long-desc": "SVG-bestand, uutgangsgroutde $1 × $2 bealdpunten, bestandsgroutde: $3",
        "svg-long-desc-animated": "Bewegend SVG-bestaand, uutgangsgrootte $1 × $2 beeldpunten, bestaandsgrootte: $3",
        "svg-long-error": "Ongeldig SVG-bestaand: $1",
        "show-big-image": "Oorsprungelik bestand",
        "version-hook-name": "Hooknaam",
        "version-hook-subscribedby": "In-eschreven deur",
        "version-version": "($1)",
-       "version-license": "MediaWiki-lisensie",
+       "version-license": "MediaWiki-licensy",
        "version-ext-colheader-version": "Versie",
        "version-ext-colheader-license": "Lisensie",
        "version-ext-colheader-description": "Beschrieving",
        "version-entrypoints-header-entrypoint": "Ingang",
        "version-entrypoints-header-url": "Webadres",
        "redirect": "Deurverwiezen op bestaandsnaam, gebrukers-, zied-, versie- of logboekregelnummer",
-       "redirect-summary": "Disse speciale syde verwist döär nå een bestand (as de bestandsname upgeaven wördt), een syde (as een syd- of versynummer upgeaven wördt), een brukerssyde (as et brukersnummer upgeaven wördt) of een logbookinskryving (as een logbooknummer upgeaven wördt). Gebruuk: [[{{#Special:Redirect}}/file/Vöärbeald.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] of [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-summary": "Disse speciale syde verwist döär nå een bestand (as de bestandsname upgeaven wördt), een syde (as een syd- of versynummer upgeaven wördt), een gebrukerssyde (as et gebrukersnummer upgeaven wördt) of een logbookinskryving (as een logbooknummer upgeaven wördt). Gebruuk: [[{{#Special:Redirect}}/file/Vöärbeald.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] of [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Zeuk",
        "redirect-lookup": "Opzeuken:",
        "redirect-value": "Weerde:",
        "compare-invalid-title": "De titel die'j op-egeven hebben, is ongeldig.",
        "compare-title-not-exists": "De titel die'j op-egeven hebben, besteet niet.",
        "compare-revision-not-exists": "De versie die'j op-egeven hebben, besteet niet.",
-       "diff-form": "een '''formelier'''",
+       "diff-form": "Wysigingen",
        "dberr-problems": "t Spiet ons, mer disse webstee hef op t moment wat techniese problemen.",
        "dberr-again": "Wach n paor minuten en probeer t daornao opniej.",
        "dberr-info": "(Kan gien verbiending maken mit de databankeserver: $1)",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Kies n opsie",
-       "logentry-delete-delete": "$1 hevt de syde $3 {{GENDER:$2|vordedån}}",
+       "logentry-delete-delete": "$1 hevt de syde $3 {{GENDER:$2|vorddån}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|hevt}} de syde $3 ($4) weaderümmesetted",
        "logentry-delete-event": "$1 hef de zichtbaorheid van {{PLURAL:$5|n logboekregel|$5 logboekregels}} van $3 {{GENDER:$2|ewiezigd}}: $4",
        "logentry-delete-revision": "$1 hef de zichtbaorheid van {{PLURAL:$5|een versie|$5 versies}} van de zied $3 {{GENDER:$2|ewiezigd}}: $4",
        "revdelete-unrestricted": "hef beparkingen veur beheerders deraof ehaold",
        "logentry-block-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
-       "logentry-move-move": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4",
-       "logentry-move-move-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 sunder een döärverwysing achter te låten",
-       "logentry-move-move_redir": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 oaver een döärverwysing hear",
-       "logentry-move-move_redir-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 oaver een döärverwysing hear sunder een döärverwysing achter te låten",
+       "logentry-move-move": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4",
+       "logentry-move-move-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4 sunder een döärverwysing achter te låten",
+       "logentry-move-move_redir": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4 oaver een döärverwysing hinne",
+       "logentry-move-move_redir-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4 oaver een döärverwysing hinne sunder een döärverwysing achter te låten",
        "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-rights-rights": "$1 {{GENDER:$2|hef}} groepslidmaotschap veur $3 ewiezigd van $4 naor $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|hef}} t groepslidmaotschap ewiezigd veur $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automaties bevorderd van $4 tot $5",
-       "logentry-upload-upload": "$1 hef $3 {{GENDER:$2|op-estuurd}}",
+       "logentry-upload-upload": "$1 hevt $3 {{GENDER:$2|upladen}}",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|hef}} n nieje versie van $3 op-elaojen",
        "rightsnone": "(gien)",
        "feedback-adding": "Joew kommentaar wörden op de zied ezet...",
        "expandtemplates": "Mallen substitueren",
        "expand_templates_intro": "Disse spesiale zied leest de op-egeven tekste en substitueert rekursief alle mallen in de tekste. Oek ondersteunde parserfunksies zo as <code><nowiki>{{</nowiki>#language:…}}</code> en variabels zo as <nowiki>{{</nowiki>CURRENTDAY}}&mdash. Zwat alle teksten tussen dubbelde krulhaken wörden esubstitueerd.",
        "expand_templates_title": "Titel, veur {{FULLPAGENAME}}, enz.:",
-       "expand_templates_input": "Invoertekste:",
+       "expand_templates_input": "Wikitekst invoren:",
        "expand_templates_output": "Resultaot",
        "expand_templates_xml_output": "XML-uutvoer",
        "expand_templates_ok": "Oké",
        "special-characters-title-minus": "minteken",
        "mw-widgets-abandonedit": "Bi'j der wisse van da'j de naokiekmodus verlaoten willen zonder eerst op te slaon?",
        "mw-widgets-abandonedit-discard": "Wiezigingen vortsmieten",
-       "mw-widgets-abandonedit-keep": "Verdan gaon mit bewarken",
-       "mw-widgets-abandonedit-title": "Wee'j t zeker?",
+       "mw-widgets-abandonedit-keep": "Vöärdan gån mid bewarken",
+       "mw-widgets-abandonedit-title": "Bin jy dår wisse van?",
        "randomrootpage": "Willeköärige stamsyde"
 }
index 19a7c48..997db7b 100644 (file)
        "passwordreset-email": "E-Mail-Adress:",
        "changeemail": "E-Mail-Adress ännern",
        "changeemail-newemail": "Nee E-Mail-Adress:",
-       "bold_sample": "Fetten Text",
-       "bold_tip": "Fetten Text",
-       "italic_sample": "Kursiven Text",
-       "italic_tip": "Kursiven Text",
-       "link_sample": "Link-Text",
-       "link_tip": "Internen Link",
-       "extlink_sample": "http://www.example.com Link-Text",
-       "extlink_tip": "Externen Link (http:// is wichtig)",
-       "headline_sample": "Evene 2 Överschrift",
-       "headline_tip": "Evene 2 Överschrift",
-       "nowiki_sample": "Unformateerten Text hier infögen",
-       "nowiki_tip": "Unformateerten Text",
-       "image_sample": "Bispeel.jpg",
-       "image_tip": "Bild-Verwies",
-       "media_sample": "Bispeel.ogg",
-       "media_tip": "Mediendatei-Verwies",
-       "sig_tip": "Diene Signatur mit Tietstempel",
-       "hr_tip": "Waagrechte Lien (sporsam bruken)",
        "summary": "Grund för’t Ännern:",
        "subject": "Bedrap:",
        "minoredit": "Blots lütte Ännern",
        "whatlinkshere-next": "{{PLURAL:$1|nächste|nächste $1}}",
        "whatlinkshere-links": "← Lenken",
        "whatlinkshere-hideredirs": "$1 Redirects",
-       "whatlinkshere-hidetrans": "$1 in-evoegden mallen",
-       "whatlinkshere-hidelinks": "$1 verwiezingen",
+       "whatlinkshere-hidetrans": "Vörlageninbinnungen $1",
+       "whatlinkshere-hidelinks": "Lenken $1",
        "whatlinkshere-hideimages": "$1 bestaandsverwiezingen",
        "whatlinkshere-filters": "Filters",
        "autoblockid": "Autoblock #$1",
index a2e6203..2f1492d 100644 (file)
        "category-empty": "''यो श्रेणीमा हाल कुनै पृष्ठ या मिडियाहरु रहेका छैनन् ।''",
        "hidden-categories": "{{PLURAL:$1|लुकाइएको श्रेणी|लुकाइएका श्रेणीहरू}}",
        "hidden-category-category": "लुकाइएका श्रेणीहरू",
-       "category-subcat-count": "{{PLURAL:$2|यो श्रेणीमा निम्न उपश्रेणीहरू मात्र छन्।|यो श्रेणीको निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}},  $2 कुल मध्ये श्रेणीहरू छन् ।}}",
+       "category-subcat-count": "{{PLURAL:$2|यो श्रेणीमा निम्न उपश्रेणीहरू मात्र छन्।|यो श्रेणीको निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}}, $2 कुल मध्ये श्रेणीहरू छन्।}}",
        "category-subcat-count-limited": "यो श्रेणीमा निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}} छन् ।",
-       "category-article-count": "{{PLURAL:$2|यो श्रेणीमा एक मात्र पृष्ठरहेको छ।|कुल $2 मध्ये यो श्रेणीमा {{PLURAL:$1|पृष्ठ|$1 पृष्ठहरू}} रहेका छन् । }}",
+       "category-article-count": "{{PLURAL:$2|यो श्रेणीमा एक मात्र पृष्ठरहेको छ।|कुल $2 मध्ये यो श्रेणीमा {{PLURAL:$1|पृष्ठ|$1 पृष्ठहरू}} रहेका छन्}}",
        "category-article-count-limited": "निम्न {{PLURAL:$1|पृष्ठ|$1 पृष्ठहरू}} यस श्रेणीमा रहेको ।",
        "category-file-count": "{{PLURAL:$2|यो श्रेणीमा निम्न फाइल मात्र छ ।|निम्न श्रेणीमा {{PLURAL:$1|फाइल|$1 फाइलहरू}} , कुल  $2 मध्ये रहेको ।}}",
        "category-file-count-limited": "निम्न  {{PLURAL:$1|फाइल|$1 फाइलहरू}} यस श्रेणीमा रहेको ।",
        "history": "पृष्ठको इतिहास",
        "history_short": "पृष्ठको इतिहास",
        "history_small": "इतिहास",
-       "updatedmarker": "मà¥\87रो अन्तिम भ्रमण पछि अद्यतन गरिएको",
+       "updatedmarker": "तपाà¤\88à¤\81à¤\95ो अन्तिम भ्रमण पछि अद्यतन गरिएको",
        "printableversion": "छाप्नयोग्य संस्करण",
        "permalink": "स्थायी लिङ्क",
        "print": "छाप्नुहोस्",
        "resettokens-watchlist-token": "[[Special:Watchlist|तपाईंको ध्यानसूचीमा रहेका पृष्ठहरूमा भएको परिवर्तनहरू]]को वेब फिड (एटम/आरयसयस) निमित्त टोकन",
        "resettokens-done": "टोकन पूर्वरुपमा फर्काइयो ।",
        "resettokens-resetbutton": "चयन गरिएको टोकनहरूलाई पुनमिलाउनुहोस्",
-       "bold_sample": "गाढा अक्षर",
-       "bold_tip": "गाढा अक्षर",
-       "italic_sample": "इटालिक पाठ",
-       "italic_tip": "इटालिक पाठ",
-       "link_sample": "शीर्षक लिंङ्क",
-       "link_tip": "आन्तरिक लिङ्क",
-       "extlink_sample": "http://www.उदाहरण.com लिङ्क शीर्षक",
-       "extlink_tip": "बाह्य लिङ्क (सम्झनुहोस् http:// prefix)",
-       "headline_sample": "शीर्षक अक्षर",
-       "headline_tip": "दोस्रो स्तर शीर्षपंक्ति",
-       "nowiki_sample": "प्रारुप नभएको पाठ यहाँ दिनुहोस्",
-       "nowiki_tip": "विकि फरम्याटिङ्लाई वास्ता नगर्ने",
-       "image_sample": "उदाहरण.jpg",
-       "image_tip": "इम्बेडेड(जडान गरिएको) फाइल",
-       "media_sample": "उदाहरण.ogg",
-       "media_tip": "फाइल लिङ्क",
-       "sig_tip": "तपाईंको समयछाप सहितको दस्तखत",
-       "hr_tip": "क्षितिजिय रेखा (कम प्रयोग गर्नुहोस्)",
        "summary": "सारांश:",
        "subject": "विषय:",
        "minoredit": "यो सानो सम्पादन हो",
        "newarticle": "(नयाँ)",
        "newarticletext": "तपाईंले अहिले सम्म नभएको पृष्ठको लिङ्क पहिल्याउनु भएको छ।\nयो पृष्ठ निर्माण गर्न तलको कोष्ठमा टाइप गर्नुहोस्  ।(थप जानकारीको लागि [$1 help page] हेर्नुहोस् )।\nयहाँ त्यत्तिकै आइपुग्नु भएको हो भने , ब्राउजरको  '''back''' बटन थिच्नुहोस् ।",
        "anontalkpagetext": "----''यो वार्तालाप पृष्ठ अज्ञात प्रयोगकर्ताको हो जसले अहिलेसम्म खाता बनाएकै छैन, अथवा जसले यस पृष्ठको उपयोग गर्दैन।\nयस कारण हामीले उसलाई उसको आइपी ठेगानाले चिन्न सक्छौं। \nयस्तो आइपी ठेगाना धेरै प्रयोगकर्ताहरूको साझा हुनसक्छ।\nयदि तपाईं अज्ञात प्रयोगकर्ता हुनुहुन्छ र तपाईंमाथि नचाहिँदो टिप्पणी भएको अनुभव गर्नुहुन्छ भने भविष्यमा अन्य अज्ञात प्रयोगकर्तासित अलमलिनबाट बच्न कृपया [[Special:CreateAccount|खाता खोल्नुहोस्]] अथवा [[Special:UserLogin|प्रवेश गर्नुहोस्]] ''",
-       "noarticletext": "यस लेखमा अहिले केहि पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पृष्ठ सम्बन्धित ढड्डामा खोज],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}}  यसै पृष्ठलाई सम्पादन गर्ने]</span>.",
+       "noarticletext": "यस लेखमा अहिले केहि पनि पाठ छैन।\nतपाईँले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ।\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} पृष्ठ सम्बन्धित ढड्डामा खोज्ने],\nवा [{{fullurl:{{FULLPAGENAME}}|action=edit}} यसै पृष्ठलाई सम्पादन गर्ने]</span>।",
        "noarticletext-nopermission": "यस लेखमा अहिले कुनै पनि पाठ छैन ।\nतपाईंले अन्य पृष्ठमा [[Special:Search/{{PAGENAME}}|यस पृष्ठको शीर्षकको लागि खोज]] गर्न सक्नुहुन्छ,\nअथवा <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|पृष्ठ={{FULLPAGENAMEE}}}} सम्बन्धित लगहरू खोज्न सक्नुहुनेछ ]</span> तर तपाईंलाई नयाँ पृष्ठ बनाउने अधिकार छैन।",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठको अवतरण #$1 रहेको छैन।\n\nसामान्य रूपमा यसो एउटा हटाइएको पृष्ठको पुरानो लिङ्कमा क्लिक गर्दा हुन्छ।\nअधिक जानकारीको लागि तपाईं [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाएको लग] हेर्न सक्नुहुन्छ।",
        "userpage-userdoesnotexist": "प्रयोगकर्ताको खाता  \"<nowiki>$1</nowiki>\" दर्ता गरिएको छैन ।\nतपाईंले पृष्ठ निर्माण/सम्पादन गर्न चाहनु भएको भए जाँच गर्नुहोस् ।",
        "rev-deleted-text-view": "यस पृष्ठको संशोधन '''मेटिएकोछ'''।\nतपाईंले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} मेटिएको लगमा विवरण पाउन सकिन्छ]।",
        "rev-suppressed-text-view": "यस पृष्ठको पुनरावलोकन <strong>थिचिएको छ</strong>।\nप्रबन्धकको हैसियतले हेर्न सक्नुहुन्छ; [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा विवरण पाउन सकिन्छ]",
        "rev-deleted-no-diff": "तपाईंले यसको भिन्नता पाउन सक्नुहुन्न किनभने यस पृष्ठको पुनरावलोकन <strong>मेटाइएको छ</strong>'।\nयसको विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सक्नुहुन्छ]।",
-       "rev-suppressed-no-diff": "तपाà¤\88à¤\82 यसको भिन्नता हेर्न सक्नुहुन्न किनभने यसको एउटा संशोधन <strong>मेटाइएको</strong>छ।",
+       "rev-suppressed-no-diff": "तपाà¤\88à¤\81 यसको भिन्नता हेर्न सक्नुहुन्न किनभने यसको एउटा संशोधन <strong>मेटाइएको</strong>छ।",
        "rev-deleted-unhide-diff": "यस पृष्ठका पुनरावलोकनहरू मध्ये एउटा भिन्नता <strong>मेटाइएकोछ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटाइएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रवन्धकको हैसियतले [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-suppressed-unhide-diff": "यस पृष्ठको पुनरावलोकनहरू मध्ये एउटा भिन्नता <strong>थिचिएको छ</strong>।\nयसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/suppress|पृष्ठ={{FULLPAGENAMEE}}}}को थिचिएको लगमा पाउन सकिन्छ]।\nयदि चाहनु भयो भने प्रबन्धकको हैसियतमा [यो भिन्नता $1] हेर्न सक्नुहुन्छ।",
        "rev-deleted-diff-view": "यस भिन्नताका संशोधनहरू मध्येको एउटा चाहिं <strong>मेटियो।<strong> \nतपाईंले यस भिन्नतालाई हेर्न सक्नुहुन्छ; सबै विवरण  [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} मेटाइएको लग]मा पाउन सकिनेछ।",
        "difference-title": "\"$1\" को बिचमा भिन्नता",
        "difference-title-multipage": "\"$1\" तथा \"$2\" को बिचमा भिन्नता",
        "difference-multipage": "(पृष्ठहरूमा भिन्नता)",
-       "lineno": "पà¤\82क्ति $1:",
+       "lineno": "पà¤\99à¥\8dक्ति $1:",
        "compareselectedversions": "छानिएका संस्करणहरू दाँज्नुहोस्",
        "showhideselectedversions": "छानिएका पुनरावलोकनहरू देखाउने/लुकाउने",
        "editundo": "रद्द गर्ने",
        "recentchanges-label-minor": "यो साधारण सम्पादन हो",
        "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म गस्ती गरिएको छैन",
-       "recentchanges-label-plusminus": "यति बाइटहरू संख्याले पृष्ठको आकार परिवर्तन भएको छ",
+       "recentchanges-label-plusminus": "यति बाइट सङ्ख्याले यस पृष्ठको आकार परिवर्तन भएको छ",
        "recentchanges-legend-heading": "<strong>आदर्श वाक्य:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नयाँ पृष्ठहरूको सूची]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcfilters-filter-categorization-label": "परिवर्तित श्रेणी",
        "rcfilters-filter-lastrevision-label": "हालको संस्करण",
        "rcnotefrom": "तल <strong>$2</strong> देखि (<strong>$1</strong> सम्म) {{PLURAL:$5|भएका परिवर्तनहरू देखाइएको छ|भएका परिवर्तनहरू देखाइन्छ}}।",
-       "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनु",
+       "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनुहोस्",
        "rcshowhideminor": "$1 सामान्य सम्पादन",
        "rcshowhideminor-show": "देखाउनुहोस्",
        "rcshowhideminor-hide": "लुकाउनुहोस्",
        "recentchangeslinked-feed": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-toolbox": "सम्बन्धित परिवर्तनहरू",
        "recentchangeslinked-title": "\"$1\" सँग सम्बन्धित परिवर्तन",
-       "recentchangeslinked-summary": "कुनै पृष्ठको वा  यससँग सम्बन्धित परिवर्तन हेर्नको लागि उक्त पृष्ठको नाम हाल्नुहोस। (कुनै श्रेणीको सामाग्रीहरुको लागि {{ns:category}}: श्रेणीको नाम हल्नुहोस ।  [[Special:Watchlist|तपाईंको अवलोकन सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन् ।",
+       "recentchangeslinked-summary": "कुनै पृष्ठको वा यससँग सम्बन्धित परिवर्तन हेर्नको लागि उक्त पृष्ठको नाम हाल्नुहोस्। (कुनै श्रेणीको सामाग्रीहरूको लागि {{ns:category}}:श्रेणीको नाम) हाल्नुहोस्।  [[Special:Watchlist|तपाईँको अवलोकन सूची]]का पृष्ठहरू <strong>गाढा अक्षरमा</strong> छन्।",
        "recentchangeslinked-page": "पृष्ठ नाम:",
        "recentchangeslinked-to": "यसको सट्टा यो पृष्ठसँग जोडिएका पृष्ठहरूको परिवर्तन देखाउने",
        "upload": "फाइल उर्ध्वभरण",
        "filehist-filesize": "फाइल आकार",
        "filehist-comment": "टिप्पणी",
        "imagelinks": "फाइलको प्रयोगहरू",
-       "linkstoimage": "यस फाइलमा निम्न{{PLURAL:$1|पृष्ठ जोडिन्छ|$1 पृष्ठहरू जोडिन्छन्}}:",
+       "linkstoimage": "यस फाइलमा निम्न {{PLURAL:$1|पृष्ठ जोडिन्छ|$1 पृष्ठहरू जोडिन्छन्}}:",
        "linkstoimage-more": "$1 भन्दा अधिक {{PLURAL:$1|पृष्ठ लिङ्क|पृष्ठ लिङ्कहरू}} यस फाइलसँग जोडिएको छ। \nनिम्नलिखित सूची फाइलसँग {{PLURAL:$1|पहिलो पृष्ठ लिङ्क|पहिलो $1 पृष्ठ लिङ्कहरू}} जोडिने देखाउँछ।\n[[Special:WhatLinksHere/$2|पूर्ण सूची]] पनि उपलब्ध छ।",
-       "nolinkstoimage": "यà¥\8b à¤«à¤¾à¤\88लसà¤\82à¤\97 à¤²à¤¿à¤\82à¤\95भà¤\8fà¤\95à¥\8b à¤\95à¥\81नà¥\88 à¤ªà¥\83षà¥\8dठ à¤\9bà¥\88न.",
+       "nolinkstoimage": "यà¥\8b à¤«à¤¾à¤\87लसà¤\81à¤\97 à¤\95à¥\81नà¥\88 à¤ªà¤¨à¤¿ à¤ªà¥\83षà¥\8dठ à¤\9cà¥\8bडिà¤\8fà¤\95à¥\8b à¤\9bà¥\88न।",
        "morelinkstoimage": "यस फाइलको [[Special:WhatLinksHere/$1|थप लिंकहरू]] हेर्नुहोस् ।",
        "linkstoimage-redirect": "$1 (फाइल अनुप्रेषण) $2",
        "duplicatesoffile": "निम्नलिखित {{PLURAL:$1|फाइलको प्रतिलिपि हो|$1 फाइलहरूको प्रतिलिपि हो}} ([[Special:FileDuplicateSearch/$2|अधिक जानकारीहरू]]):",
        "rollback-success": "$1द्वारा उल्टाइएका सम्पादनहरू;\nपछिल्लो संशोधनमा $2द्वारा परिवर्तन गरि पुनः फर्काइएको।",
        "sessionfailure-title": "सत्र त्रुटी",
        "sessionfailure": "यस्तो लाग्दैछ कि तपाईंको लगइन सत्रसँग कुनै समस्या छ। सत्र अपहरणबाट बचाउन को लागि सावधानीको रूपमा तपाईंको यो क्रियाकलाप रद्द गरिएको छ। कृपया पछाडी जानुहोस र पृष्ठलाई पुनः लोड गर्नुहोस्, अनि फेरी प्रयास गर्नुहोला।",
-       "changecontentmodel-title-label": "पाना à¤¶à¥\80रà¥\8dषà¤\95",
+       "changecontentmodel-title-label": "पà¥\83षà¥\8dठ à¤¶à¥\80रà¥\8dषà¤\95:",
        "changecontentmodel-reason-label": "कारण:",
        "changecontentmodel-submit": "परिवर्तन गर्नुहोस्",
        "logentry-contentmodel-change-revertlink": "पहिलेको रुपमा फर्काउने",
        "undeletepagetext": "निम्नलिखित {{PLURAL:$1|पृष्ठ मेटिएकोछ तर पूरालेखभित्रै छ|$1 पृष्ठ मेटिएकाछन् तर पूरालेखभित्रै छन्}} र पुनर्स्थापित गर्न सकिन्छ।\nपूरालेखको समय-समयमा सफाई गर्न सकिन्छ।",
        "undelete-fieldset-title": "पुनरावलोकनहरू  पूर्वावस्थामा ल्याउनुहोस्",
        "undeleteextrahelp": "यस पृष्ठको पुरै इतिहास पूर्वरुपमा फर्काउनको लागि  छनोट सन्दुकहरूलाई नछानी '''''{{int:undeletebtn}}''''' मा क्लिक गर्नुहोस।\nअनुकुल पूर्वरुपमा फर्काउने कार्य गर्न छनौट चाहिएका संस्करणका सन्दुकहरूलाई छानेर '''''{{int:undeletebtn}}'''''मा क्लिक गर्नुहोस।",
-       "undeleterevisions": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\82}} à¤¸à¤\82à¤\97à¥\8dरहित",
+       "undeleterevisions": "$1 {{PLURAL:$1|सà¤\82शà¥\8bधन|सà¤\82शà¥\8bधनहरà¥\82}} à¤®à¥\87à¤\9fाà¤\87यà¥\8b",
        "undeletehistory": "यदि कुनै पृष्टलाई पुन: स्थापन गराउनु भयो भने सम्पूर्ण संस्करणहरू इतिहासमा पुन:स्थापन हुनेछन् ।\nयदि यसै नामबाट  नयाँ पृष्ठ निर्माण भैसकेको छ भने पुन: स्थापित संस्करणहरू पूर्व इतिहासको रुपमा स्थापित हुनेछन् ।",
        "undeleterevdel": "यदि यो माथिल्लो पृष्ठ बन्छ  या फाइल संस्करणहरू आंशिक मेटिएका छन् भने मेट्ने काम रद्द गरिने छैन।\nत्यस अवस्थामा तपाईंले छनौटमा अन्तिम मेटिएको नयाँ संस्करण नलुकाउनेमा चिनो लगाउनु पर्छ ।",
        "undeletehistorynoadmin": "यस पृष्ठ मेटिएको छ।\nमेटिनाको कारण निम्न जानकारीहरुमा खुलाइएको छ र मेटिनु अगिका योगदानकर्ताहरुको नाम पनि \nमेटिएका पृष्ठको पूरा पाठ प्रवन्धकहरुलाई मात्र उपलब्ध हुन्छ ।",
        "undelete-show-file-submit": "हो",
        "namespace": "नामस्थान:",
        "invert": "रोजाइ उल्टाउने",
-       "tooltip-invert": "à¤\9bानिà¤\8fà¤\95ा à¤¨à¥\87मसà¥\8dपà¥\87सहरà¥\82मा à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82मा à¤\97रिà¤\8fà¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82 à¤²à¥\81à¤\95ाà¤\89न à¤¯à¤¸à¤®à¤¾ à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bसà¥\8d  (र à¤¸à¤®à¥\8dबनà¥\8dधित à¤¨à¥\87मसà¥\8dपà¥\87स à¤¯à¤¦à¤¿ à¤\9bानिà¤\8fà¤\95ा à¤­à¤\8f)",
+       "tooltip-invert": "à¤\9bानिà¤\8fà¤\95ा à¤¨à¤¾à¤®à¤ªà¤¦à¤¹à¤°à¥\82मा à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठहरà¥\82मा à¤\97रिà¤\8fà¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82 à¤²à¥\81à¤\95ाà¤\89न à¤¯à¤¸à¤®à¤¾ à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bसà¥\8d  (र à¤\9bानिà¤\8fà¤\95ा à¤­à¤\8f à¤¸à¤®à¥\8dबनà¥\8dधित à¤¨à¤¾à¤®à¤ªà¤¦)",
        "tooltip-whatlinkshere-invert": "छानिएको नामस्थानको पृष्ठहरूसँग लिङ्कहरूलाई लुकाउनका लागि यस बाकसलाई चिन्हित गर्नुहोस",
-       "namespace_association": "समà¥\8dबनà¥\8dधित à¤¨à¥\87मसà¥\8dपà¥\87स",
-       "tooltip-namespace_association": "वारà¥\8dतालाप à¤¯à¤¾ à¤µà¤¿à¤·à¤¯ à¤¨à¥\87मसà¥\8dपà¥\87सहरà¥\81लाà¤\88 à¤¸à¤®à¥\8dवनà¥\8dधित à¤¨à¥\87मसà¥\8dपà¥\87सà¤\95à¥\8b à¤°à¥\81पमा à¤²à¤¿à¤¨à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¤¨à¥\8dदà¥\81à¤\95मा à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bस।",
+       "namespace_association": "समà¥\8dबनà¥\8dधित à¤¨à¤¾à¤®à¤ªà¤¦",
+       "tooltip-namespace_association": "वारà¥\8dतालाप à¤¯à¤¾ à¤µà¤¿à¤·à¤¯ à¤¨à¤¾à¤®à¤ªà¤¦à¤¹à¤°à¥\82लाà¤\88 à¤¸à¤®à¥\8dबनà¥\8dधित à¤¨à¤¾à¤®à¤ªà¤¦à¤\95à¥\8b à¤°à¥\81पमा à¤²à¤¿à¤¨à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¤¨à¥\8dदà¥\81à¤\95मा à¤\9aिनà¥\8b à¤²à¤\97ाà¤\89नà¥\81हà¥\8bसà¥\8d।",
        "blanknamespace": "(मुख्य)",
        "contributions": "{{GENDER:$1|प्रयोगकर्ता}}का योगदानहरू",
        "contributions-title": "$1को प्रयोगकर्ता योगदानहरू",
        "year": "वर्ष देखि( र पहिले):",
        "sp-contributions-blocklog": "रोकावट लग",
        "sp-contributions-suppresslog": "प्रयोगकर्ताको योगदानहरू दबाइएको छ ।",
-       "sp-contributions-deleted": "प्रयोगकर्ताका योगदानहरू मेटाइयो",
+       "sp-contributions-deleted": " {{GENDER:$1|प्रयोगकर्ता}}का योगदानहरू मेटाइयो",
        "sp-contributions-uploads": "उर्ध्वभरणहरू",
        "sp-contributions-logs": "लगहरू",
        "sp-contributions-talk": "वार्ता",
-       "sp-contributions-userrights": "प्रयोगकर्ता अधिकार व्यवस्थापन",
+       "sp-contributions-userrights": "{{GENDER:$1|प्रयोगकर्ता}} अधिकार व्यवस्थापन",
        "sp-contributions-blocked-notice": "यो प्रयोगकर्तालाई अहिले रोक लगाइएको छ।\nनवीनतम रोकाइ गरेको लग प्रविष्टि सन्दर्भको निम्ति तल दिएकोछ:",
        "sp-contributions-blocked-notice-anon": "यो IP ठेगानालाई अहिले रोक लगाइएको छ।\nनवीनतम रोकाइ गरेको लग प्रविष्टि सन्दर्भको निम्ति तल दिएकोछ:",
        "sp-contributions-search": "योगदानहरू खोज्नुहोस्",
        "cant-move-to-user-page": "तपाईंलाई पृष्ठहरू प्रयोगकर्ता पृष्ठमा सार्न अनुमती छैन (प्रयोगकर्ता सहपृष्ठहरूमा बाहेक)",
        "cant-move-category-page": "तपाईंलाई श्रेणीको पृष्ठहरू सार्ने अनुमति छैन ।",
        "cant-move-to-category-page": "कुनै श्रेणी पृष्ठमा सार्नको लागी तपाईँलाई अनुमति छैन ।",
-       "newtitle": "नयाँ शीर्षकमा :",
+       "newtitle": "नयाँ शीर्षक:",
        "move-watch": "यो पृष्ठ निगरानीमा राख्नुहोस्",
        "movepagebtn": "पृष्ठ सार्नुहोस्",
        "pagemovedsub": "सार्ने काम सफल भयो",
        "movenosubpage": "यस पृष्ठका उप पृष्ठहरू छैनन्।",
        "movereason": "कारण :",
        "revertmove": "पूर्ववत्",
-       "delete_and_move_text": "== मेटाउनु आवश्यक ==\nलक्ष्य गरिएको पृष्ठ  \"[[:$1]]\" पहिलादेखि छ\nके तपाईं यो त्यहाँ सार्न त्यसलाई मेट्न चाहनुहुन्छ?",
+       "delete_and_move_text": "लक्ष्य गरिएको पृष्ठ \"[[:$1]]\" पहिल्यै छ।\nके तपाईं यसलाई मेटाएर यस कदमको लागि बाटो खुला गर्न चाहनुहुन्छ?",
        "delete_and_move_confirm": "हो, पृष्ठ मेट्नुहोस्",
        "delete_and_move_reason": " \"[[$1]]\"बाट सार्नलाई बाटो खुलाउन मेटियो",
        "selfmove": "स्रोत तथा लक्ष्य गरिएको पृष्ठको शीर्षक एउटै भएकाले;\nयसैमाथि पृष्ठ सार्न मिल्दैन",
        "tooltip-pt-mycontris": "{{GENDER:|तपाईंका}} योगदानहरूको सूची",
        "tooltip-pt-login": "तपाईंलाई प्रवेस गर्न सुझाव दिइन्छ ; तर यो जरुरी भने छैन",
        "tooltip-pt-logout": "निर्गमन",
-       "tooltip-pt-createaccount": "तपाà¤\88à¤\82लाà¤\88 à¤\96ाता à¤¬à¤¨à¤¾à¤\89न à¤° à¤²à¤\97 à¤\87न à¤\97रà¥\8dन à¤¹à¤¾à¤®à¤¿ à¤ªà¥\8dरà¥\8bतà¥\8dसाहित à¤\97रà¥\8dà¤\9bà¥\8c; à¤¤à¤¥à¤¾à¤ªà¤¿, à¤¯à¥\8b à¤\85निवारà¥\8dय à¤­à¤¨à¥\87 à¤\9bà¥\88न ।",
+       "tooltip-pt-createaccount": "तपाà¤\88à¤\81लाà¤\88 à¤\96ाता à¤¬à¤¨à¤¾à¤\89न à¤° à¤ªà¥\8dरवà¥\87श à¤\97रà¥\8dन à¤¹à¤¾à¤®à¥\80 à¤ªà¥\8dरà¥\8bतà¥\8dसाहित à¤\97रà¥\8dà¤\9bà¥\8cà¤\82; à¤¤à¤¥à¤¾à¤ªà¤¿, à¤¯à¥\8b à¤\85निवारà¥\8dय à¤­à¤¨à¥\87 à¤\9bà¥\88न।",
        "tooltip-ca-talk": "सामग्री पृष्ठबारेमा छलफल",
        "tooltip-ca-edit": "यो पृष्ठ सम्पादन गर्ने",
        "tooltip-ca-addsection": "नयाँ खण्ड सुरु गर्नुहोस्",
        "tooltip-t-upload": "फाइल अपलोड गर्ने",
        "tooltip-t-specialpages": "सबै विशेष पृष्ठहरूको सूची",
        "tooltip-t-print": "यो पृष्ठको मुद्रण योग्य संस्करण",
-       "tooltip-t-permalink": "पà¥\83षà¥\8dठà¤\95à¥\8b à¤¯à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¥\8dथाà¤\88 लिङ्क",
-       "tooltip-ca-nstab-main": "सामग्री पृष्ठ हेर्नुहोस",
+       "tooltip-t-permalink": "पà¥\83षà¥\8dठà¤\95à¥\8b à¤¯à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नà¤\95à¥\8b à¤²à¤¾à¤\97ि à¤¸à¥\8dथायà¥\80 लिङ्क",
+       "tooltip-ca-nstab-main": "सामग्री पृष्ठ हेर्नुहोस",
        "tooltip-ca-nstab-user": "प्रयोगकर्ता पृष्ठ हेर्नुहोस्",
        "tooltip-ca-nstab-media": "मिडिया पृष्ठ हेर्नुहोस्",
        "tooltip-ca-nstab-special": "यो विशेष पृष्ठ हो, यो सम्पादन गर्न सकिदैन",
        "autoredircomment": "पृष्ठ[[$1]]मा पठाइएको",
        "autosumm-new": " $1 को साथमा पृष्ठ शृजना भयो",
        "autosumm-newblank": "खाली पृष्ठ तयार गर्ने",
-       "size-bytes": "$1 बाइटहरू",
+       "size-bytes": "$1 {{PLURAL:$1|बाइट|बाइटहरू}}",
        "size-kilobytes": "$1 किलोबाइटहरू",
        "size-megabytes": "$1 मेगाबाइटहरू",
        "size-gigabytes": "$1 गिगाबाइटहरू",
        "watchlistedit-raw-done": "तपाईंको निगरानी सूची अद्यावधिक गरिएको छ।",
        "watchlistedit-raw-added": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} थपियो:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|१ शिर्षक|$1 शिर्षकरु}} हटाइयो:",
-       "watchlistedit-clear-title": "अवलोकन सूची खाली गरियो",
+       "watchlistedit-clear-title": "अवलोकनसूची खाली गर्नुहोस्",
        "watchlistedit-clear-legend": "अवलोकन सूची खाली गर्ने",
        "watchlistedit-clear-explain": "तपाईंको अवलोकन सूचीबाट सम्पूर्ण शिर्षकहरू मेटाइदै",
        "watchlistedit-clear-titles": "शीर्षकहरू :",
        "fileduplicatesearch-result-1": "फाइल\"$1\" को दुरुस्त नक्कलहरु छैनन् ।",
        "fileduplicatesearch-result-n": "फाइल\"$1\" को {{PLURAL:$2|1 दुरुस्त नक्कल|$2 दुरुस्त नक्कलहरु}} छन् ।",
        "fileduplicatesearch-noresults": "\"$1\" नामको फाइल पाइएन।",
-       "specialpages": "विशेष पृष्ठ",
+       "specialpages": "विशेष पृष्ठहरू",
        "specialpages-note-top": "आदर्श वाक्य",
        "specialpages-note-restricted": "* साधारण विशेष पृष्ठहरू।\n* <span class=\"mw-specialpagerestricted\">निषेधित विशेष पृष्ठहरू।</span>",
        "specialpages-group-maintenance": "मर्मत प्रतिवेदनहरू",
        "tags-actions-header": "कार्यहरु",
        "tags-active-yes": "हो",
        "tags-active-no": "हैन",
-       "tags-source-extension": "à¤\8fà¤\95à¥\8dसà¤\9fà¥\87नà¥\8dसनदà¥\8dवारा à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤ à¤\97रà¥\8dनà¥\87",
+       "tags-source-extension": "सफà¥\8dà¤\9fवà¥\87यरदà¥\8dवारा à¤ªà¤°à¤¿à¤­à¤¾à¤·à¤¿à¤¤",
        "tags-source-manual": "प्रयोगकर्ताहरू तथा बोटहरूबाट म्यानुअल्ली लागु गरिएको",
        "tags-source-none": "प्रयोगमा नरहेको",
        "tags-edit": "सम्पादन गर्नुहोस्",
        "tags-edit-revision-legend": "ट्यागहरू {{PLURAL:$1|यस संशोधन|सबै $1 संशोधनहरू}}सँग जोड्ने वा हटाउने।",
        "tags-edit-logentry-legend": "ट्यागहरू {{PLURAL:$1|यस लग प्रविष्टि|सबै $1 लग प्रविष्टिहरू}}सँग जोड्ने वा हटाउने।",
        "tags-edit-existing-tags": "हाल भएको ट्यागहरूः",
-       "tags-edit-existing-tags-none": "''कुनै पनि होइन''",
+       "tags-edit-existing-tags-none": "<em>कुनै पनि होइन</em>",
        "tags-edit-new-tags": "नयाँ ट्यागहरूः",
        "tags-edit-add": "यी ट्यागहरू थप्नेः",
        "tags-edit-remove": "यी ट्यागहरू हटाउनेः",
        "tags-edit-reason": "कारण:",
        "tags-edit-revision-submit": "{{PLURAL:$1|यस संस्करण|$1 संस्करणहरू}} मा परिवर्तनहरूलाई लागु गर्ने",
        "tags-edit-logentry-submit": "{{PLURAL:$1|यस लग प्रविष्टी|$1 लग प्रविष्टीहरू}} मा परिवर्तनहरूलाई लागु गर्ने",
-       "tags-edit-success": "परिवरà¥\8dतनहरà¥\82 à¤¸à¤«à¤²à¤¤à¤¾ à¤ªà¥\82रà¥\8dवà¤\95 à¤²à¤¾à¤\97à¥\81 à¤­à¥\88सà¤\95à¥\8dयो",
+       "tags-edit-success": "परिवरà¥\8dतनहरà¥\82 à¤²à¤¾à¤\97à¥\81 à¤\97रियो",
        "tags-edit-failure": "यी परिवर्तनहरू लागु गर्न सकिएनः\n$1",
        "tags-edit-nooldid-title": "अवैध संशोधन लक्ष्य",
        "tags-edit-nooldid-text": "या त तपाईंले कुनै लक्षित संशोधनको विवरण दिनुभएको छैन जहाँ यस कार्यलाई सम्पन्न गर्नु पर्नेछ, या विवरण गरिएको संशोधन छंदै छैन।",
        "logentry-rights-autopromote": "$1 को प्रयोगकर्ता समूह स्वतः $4 बाट परिवर्तन गरेर $5 {{GENDER:$2|गरिएको}} थियो",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड गरेका छन्}}",
        "logentry-upload-overwrite": "$1 ले $3 को नयाँ संस्करण {{GENDER:$2|अपलोड गरेका छन्}}",
-       "logentry-upload-revert": "$1 ले $3 {{GENDER:$2|अपलोड गरेका छन्}}",
+       "logentry-upload-revert": "$1ले $3लाई पुरानो संस्करणमा {{GENDER:$2|उल्टाउनुभयो}}",
        "log-name-managetags": "ट्याग व्यवस्थापन लग",
        "log-description-managetags": "यस पृष्ठमा ती प्रवन्धन कार्यहरूको सूची छ जुन [[Special:Tags|ट्यागहरू]]सँग सम्बन्धित छ। लगमा मात्रै ती क्रियाहरूको बयान गरिएको छ जुन मानवीय रूपले कुनै प्रवन्धकद्वारा पुरा गरिएको छ। ट्यागहरूलाई विकि सफ्टवेयरद्वारा बनउनु वा हटाउन सकिनेछ जसको प्रविष्टि लगमा हुनु आवश्यक छैन।",
        "logentry-managetags-create": "$1 ले ट्याग $4 {{GENDER:$2|तयार गरेको छ}}",
        "api-error-emptypage": "नयाँ तयार गर्दै, खाली पृष्ठ तयार गर्न अनुमति छैन ।",
        "api-error-publishfailed": "आन्तरिक समस्याः अस्थायी फाइल प्रकाशन गर्न सर्भर असफर भयो ।",
        "api-error-stashfailed": "आन्तरिक त्रुटि: अस्थाई फाइल राख्न सर्वर असफल भयो।",
-       "api-error-unknown-warning": "अज्ञात चेतावनी: \"$1\"",
+       "api-error-unknown-warning": "अज्ञात चेतावनी:\"$1\"।",
        "api-error-unknownerror": "अज्ञात त्रुटि: \"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|सेकेण्ड|सेकेण्डहरू}}",
        "duration-minutes": "$1 {{PLURAL:$1|मिनेट|मिनेटहरू}}",
        "special-characters-title-emdash": "इएम ड्यास",
        "special-characters-title-minus": "घटाउने चिन्ह",
        "mw-widgets-abandonedit": "के तपाई सम्पादन सङ्ग्रह नगरीकन सम्पादनबाट बाहिरिनेमा निश्चित हुनुहुन्छ?",
-       "mw-widgets-abandonedit-discard": "सम्पादन रद्द गर्नु",
-       "mw-widgets-abandonedit-keep": "समà¥\8dपादन à¤\9cारà¥\80 à¤°à¤¾à¤\96à¥\8dनà¥\87",
-       "mw-widgets-abandonedit-title": "निशà¥\8dà¤\9aित à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b ?",
+       "mw-widgets-abandonedit-discard": "सम्पादनहरू रद्द गर्नुहोस्",
+       "mw-widgets-abandonedit-keep": "समà¥\8dपादन à¤\9cारà¥\80 à¤°à¤¾à¤\96à¥\8dनà¥\81हà¥\8bसà¥\8d",
+       "mw-widgets-abandonedit-title": "à¤\95à¥\87 à¤¤à¤ªà¤¾à¤\88à¤\81 à¤ªà¤\95à¥\8dà¤\95ा à¤¹à¥\81नà¥\81हà¥\81नà¥\8dà¤\9b?",
        "mw-widgets-titleinput-description-new-page": "हालसम्म पृष्ठ उपलब्ध छैन्",
-       "mw-widgets-titleinput-description-redirect": "$1 à¤®à¤¾ à¤\9cानà¥\87",
+       "mw-widgets-titleinput-description-redirect": "$1 à¤®à¤¾ à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87श",
        "randomrootpage": "यादृच्छिक शीर्ष पृष्ठ",
        "log-action-filter-all": "सबै",
        "log-action-filter-block-block": "रोक्ने",
index e3a8817..d52e8f4 100644 (file)
@@ -71,7 +71,6 @@
        "changeemail-header": "Vul dit formulier in om je e-mailadres te wijzigen. Je moet je wachtwoord invoeren om deze wijziging te bevestigen.",
        "changeemail-no-info": "Je moet aangemeld zijn om rechtstreeks toegang te hebben tot deze pagina.",
        "changeemail-password": "Jouw wachtwoord voor {{SITENAME}}:",
-       "sig_tip": "Je handtekening met datum en tijd",
        "anoneditwarning": "'''Waarschuwing:''' je bent niet aangemeld.\nJe IP-adres wordt opgeslagen als je wijzigingen op deze pagina maakt.",
        "anonpreviewwarning": "''Je bent niet aangemeld.''\n''Door je bewerking op te slaan wordt je IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' je hebt geen samenvatting opgegeven voor je bewerking.\nAls je nogmaals op ''Pagina opslaan'' klikt wordt de bewerking zonder samenvatting opgeslagen.",
index 2ea7cdc..c67bab3 100644 (file)
                        "RadioAzureus"
                ]
        },
-       "tog-underline": "Verwijzingen onderstrepen:",
+       "tog-underline": "Links onderstrepen:",
        "tog-hideminor": "Kleine bewerkingen in recente wijzigingen verbergen",
        "tog-hidepatrolled": "Gemarkeerde bewerkingen in recente wijzigingen verbergen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's in de lijst met nieuwe pagina's verbergen",
        "createaccountmail": "Gebruik een tijdelijk willekeurig wachtwoord en stuur het naar het opgegeven e-mailadres",
        "createaccountmail-help": "Kan worden gebruikt voor het aanmaken van een account voor een andere persoon zonder het wachtwoord te vernemen.",
        "createacct-realname": "Echte naam (optioneel)",
-       "createacct-reason": "Reden",
+       "createacct-reason": "Reden (door iedereen te zien)",
        "createacct-reason-ph": "Waarom u een ander account aanmaakt",
        "createacct-reason-help": "Weergegeven bericht in het logbestand van aangemaakte gebruikers",
        "createacct-submit": "Uw account aanmaken",
        "resettokens-watchlist-token": "Token voor webfeed van [[Special:Watchlist|uw volglijst]] (Atom/RSS)",
        "resettokens-done": "De tokens zijn opnieuw ingesteld.",
        "resettokens-resetbutton": "Geselecteerde tokens opnieuw instellen",
-       "bold_sample": "Vetgedrukte tekst",
-       "bold_tip": "Vet",
-       "italic_sample": "Schuingedrukte tekst",
-       "italic_tip": "Schuin",
-       "link_sample": "Onderwerp",
-       "link_tip": "Interne koppeling",
-       "extlink_sample": "http://www.example.com koppelingstekst",
-       "extlink_tip": "Externe koppeling (vergeet http:// niet)",
-       "headline_sample": "Deelonderwerp",
-       "headline_tip": "Tussenkopje (hoogste niveau)",
-       "nowiki_sample": "Voer hier de niet op te maken tekst in",
-       "nowiki_tip": "Wiki-opmaak negeren",
-       "image_sample": "Voorbeeld.png",
-       "image_tip": "Mediabestand",
-       "media_sample": "Voorbeeld.ogg",
-       "media_tip": "Koppeling naar bestand",
-       "sig_tip": "Uw handtekening met datum en tijd",
-       "hr_tip": "Horizontale lijn (gebruik spaarzaam)",
        "summary": "Samenvatting:",
        "subject": "Onderwerp:",
        "minoredit": "Dit is een kleine bewerking",
        "diff-multi-sameuser": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door dezelfde gebruiker niet weergegeven)",
        "diff-multi-otherusers": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|een andere gebruiker|$2 gebruikers}} niet weergegeven)",
        "diff-multi-manyusers": "($1 tussenliggende {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}}  worden niet weergegeven)",
-       "diff-paragraph-moved-tonew": "Deze paragraaf is verplaatst. Klik om naar de nieuwe locatie te springen.",
-       "diff-paragraph-moved-toold": "Deze paragraaf is verplaatst. Klik om naar de oude locatie te springen.",
+       "diff-paragraph-moved-tonew": "Deze alinea is verplaatst. Klik om naar de nieuwe locatie te springen.",
+       "diff-paragraph-moved-toold": "Deze alinea is verplaatst. Klik om naar de oude locatie te springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
        "search-filter-title-prefix": "Alleen pagina's doorzoeken waarvan de titel begint met \"$1\"",
        "listfiles-userdoesnotexist": "Gebruikersaccount \"$1\" bestaat niet.",
        "imgfile": "bestand",
        "listfiles": "Bestandslijst",
+       "listfiles_subpage": "Geplaatst door $1",
        "listfiles_thumb": "Miniatuur",
        "listfiles_date": "Datum",
        "listfiles_name": "Naam",
        "ipblocklist-legend": "Een geblokkeerde gebruiker zoeken",
        "blocklist-userblocks": "Geblokkeerde accounts verbergen",
        "blocklist-tempblocks": "Tijdelijke blokkades verbergen",
+       "blocklist-indefblocks": "Verberg blokkades met een oneindige loopduur",
        "blocklist-addressblocks": "Blokkades van één IP-adres verbergen",
        "blocklist-type": "Soort:",
        "blocklist-type-opt-all": "Alle",
        "mycustomjsredirectprotected": "U hebt geen rechten om deze JavaScriptpagina te bewerken omdat het een doorverwijzing is en deze niet verwijst naar een pagina in uw gebruikersruimte.",
        "easydeflate-invaliddeflate": "De opgegeven inhoud is onjuist gecomprimeerd",
        "unprotected-js": "Vanwege veiligheidsredenen kan er geen JavaScript geladen worden vanaf onbeveiligde pagina's. Gelieve alleen JavaScript pagina's aan te maken in de MediaWiki: naamruimte of als een subpagina van een gebruikerspagina.",
-       "userlogout-continue": "Wilt u zich afmelden?"
+       "userlogout-continue": "Wilt u zich afmelden?",
+       "rest-wrong-method": "De requestmethode ($1) is {{PLURAL:$3|niet de toegestane methode voor dit pad|een van de toegestane methoden voor dit pad}} ($2)"
 }
index 0e33ed5..8dfffc4 100644 (file)
        "changeemail-throttled": "Du har freista for mange gonger å logga inn. Du lyt venta $1 før du kan freista på nytt.",
        "changeemail-nochange": "Ver god å oppgje ei ny e-postadresse.",
        "resettokens-token-label": "$1 (noverande verdi: $2)",
-       "bold_sample": "Halvfeit skrift",
-       "bold_tip": "Halvfeit skrift",
-       "italic_sample": "Kursivskrift",
-       "italic_tip": "Kursivskrift",
-       "link_sample": "Lenkjetittel",
-       "link_tip": "Intern lenkje",
-       "extlink_sample": "http://www.example.com lenkjetittel",
-       "extlink_tip": "Ekstern lenkje (hugs http:// prefiks)",
-       "headline_sample": "Overskriftstekst",
-       "headline_tip": "2. nivå-overskrift",
-       "nowiki_sample": "Skriv uformatert tekst her",
-       "nowiki_tip": "Sjå bort frå wikiformatering",
-       "image_sample": "Døme.jpg",
-       "image_tip": "Bilete eller lenkje til filomtale",
-       "media_sample": "Døme.ogg",
-       "media_tip": "Filpeikar",
-       "sig_tip": "Signaturen din med tidsstempel",
-       "hr_tip": "Vassrett line",
        "summary": "Samandrag:",
        "subject": "Emne:",
        "minoredit": "Småplukk",
index e55b753..41bccb3 100644 (file)
        "createaccountmail": "ߓߍ߲߬ߛߋ߲߬ߡߊ߬ ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ ߟߊߓߊ߯ߙߊ߫ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ ߗߋ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߡߊ߬.",
        "createaccountmail-help": "ߊ߬ ߕߍ߫ ߛߐ߲߬ ߠߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߊ߬ ߡߐ߰ ߜߘߍ߫ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߌ߫߸ ߣߴߌ ߡߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߞߊ߬ߙߊ߲߬.",
        "createacct-realname": "ߕߐ߮ ߓߘߍ (ߛߎߥߊ߲ߘߟߌ)",
-       "createacct-reason": "ß\8a߬ ß\9bß\8aß\93ß\8eß«",
+       "createacct-reason": "ß\8a߬ ß\9eß\8e߲߭",
        "createacct-reason-ph": "ߡߎ߲߬ߠߊ߫ ߌ ߦߋ߫ ߖߊ߬ߕߋ߬ߘߊ߰ ߜߘߍ߫ ߛߌ߲ߘߌ߫ ߟߊ߫",
        "createacct-reason-help": "ߗߋߛߓߍ ߦߌ߬ߘߊ߬ ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߘߊ߲ߖߐ ߘߐ߫",
        "createacct-submit": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߘߊߦߟߍ߬",
        "botpasswords-updated-body": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߏߕ ߕߐ߮ ߦߋ߫ \"$1\" {{GENDER:$2|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߦߋ߫ \"$2\" ߕߎ߲߬ ߓߘߊ߫ ߟߏ߲ߘߐߦߊ߫.",
        "botpasswords-deleted-title": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߖߏ߬ߛߌ߬",
        "botpasswords-deleted-body": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߏߕ ߕߐ߮ ߦߋ߫ \"$1\" {{GENDER:$2|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߦߋ߫ \"$2\" ߕߎ߲߬ ߓߘߊ߫ ߖߏ߬ߛߌ߬.",
+       "botpasswords-no-provider": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߥߎ߬ߛߎ ߡߊߛߐߟߊ ߕߍ߫ ߊ߬ ߟߊ߫.",
+       "botpasswords-restriction-failed": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߓߘߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߣߌ߲߬ ߢߍߓߍ߲߬.",
+       "botpasswords-invalid-name": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߍߝߘߊߟߌ (\"$1\") ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߕߐ߰ ߞߙߍߞߙߍߣߍ߲ ߠߊ߫.",
        "botpasswords-not-exist": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߐ߯ߟߊߣߍ߲߫ \"$2\" ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ  \"$1\" ߓߟߏ߫",
        "botpasswords-needs-reset": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲  \"$1\" ߓߏߕ ߕߐ߯ \"$2\" ߦߋ߫ {{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}}  \"$1\" ߦߋ߫ ߡߊߦߟߍ߬ߡߊ߲߫.",
        "botpasswords-locked": "ߌ ߕߍߣߊ߬ ߛߋߟߴߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫ ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߘߌ߫ ߓߊ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߛߐ߰ߣߍ߲߫ ߠߋ߫.",
        "resetpass-no-info": "ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߡߎߣߎ߲߬ ߞߣߊ߬ ߕߏ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫.",
        "resetpass-submit-loggedin": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬",
        "resetpass-submit-cancel": "ߊ߬ ߘߐߛߊ߬",
+       "resetpass-wrong-oldpass": "ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲ ߥߟߊ߫ ߕߋ߲߭ߕߋ߲߭ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߍ߲߬ߓߊߟߌ.\nߕߎ߬ߡߊ߬ߘߐ߫ ߌ ߣߐ߬ ߘߌ߫ ߞߍ߫ ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߥߟߊ߫ ߌ ߓߘߊ߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲߫ ߞߎߘߊ߫ ߡߊߞߟߌ߫.",
+       "resetpass-recycled": "ߖߊ߰ߣߌ߲߬ ߌ ߦߴߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߘߏ߫ ߜߘߍ߫ ߟߊ߫ ߡߍ߲ ߣߌ߫ ߘߐ ߣߌ߲߬ ߕߍ߫ ߞߋߟߋ߲߫ ߘߌ߫.",
+       "resetpass-temp-emailed": "ߌ ߓߘߴߌ ߜߊ߲߬ߞߎ߲߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߗߋߛߓߍ ߘߏߝߙߍߕߍ ߟߊ߫.\nߖߐ߲߬ߛߊ߫ ߌ ߘߌ߫ ߓߊ߲߫ ߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫߸ ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬:",
        "resetpass-temp-password": "ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ",
+       "resetpass-abort-generic": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ߠߌ߲ ߓߘߊ߫ ߘߐߛߊ߬ ߞߐߕߊ߲ߠߌ߲ ߘߏ߫ ߓߟߏ߫.",
+       "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}}\" ߞߵߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߞߐߝߍ߬.",
        "passwordreset": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "passwordreset-text-one": "ߖߙߎߡߎ߲ ߣߌ߲߬ ߘߝߊ߫ ߛߴߌ ߘߌ߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲ ߘߏ߫ ߡߊߛߐ߬ߘߐ߲߬ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫.",
        "passwordreset-disabled": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߓߘߊ߫ ߛߋ߲߬ߓߐ߫ ߥߞߌ ߣߌ߲߬ ߘߐ߫.",
        "passwordreset-username": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߐ߮:",
        "passwordreset-domain": "ߡߊ߬ߘߎ߮:",
        "resettokens-watchlist-token": "ߓߟߐߟߐ ߓߊߟߏ߫ ߖߐߟߐ߲ߞߐ (Atom/RSS) ߞߊ߬ ߓߍ߲߬ [[Special:Watchlist|changes to pages on your watchlist]] ߡߊ߬.",
        "resettokens-done": "ߖߐߟߐ߲ߞߐ ߡߊߝߊ߬ߟߋ߲߬",
        "resettokens-resetbutton": "ߖߐߟߐ߲ߞߐ߫ ߓߊߓߌ߬ߟߊ߬ߣߍ߲ ߡߊߝߊ߬ߟߋ߲߬",
-       "bold_sample": "ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ",
-       "bold_tip": "ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ",
-       "italic_sample": "ߛߓߍߟߌ߫ ߡߊߖߍ߲߬ߞߍ߬ߣߍ߲",
-       "italic_tip": "ߛߓߍߟߌ߫ ߡߊߖߍ߲߬ߞߍ߬ߣߍ߲",
-       "link_sample": "ߛߘߌ߬ߜߋ߲ ߞߎ߲߬ߕߐ߮",
-       "link_tip": "ߞߣߐߘߐ߫ ߛߘߌߜߋ߲",
-       "extlink_sample": "ߛߘߌ߬ߜߋ߲ ߞߎ߲߬ߕߐ߮ http://www.example.com",
-       "extlink_tip": "ߞߐߞߊ߲ߠߊ ߛߘߌ߬ߜߋ߲ (ߣߌ߲߬ ߠߊߓߊ߬ߕߏ߬ http:// prefix)",
-       "headline_sample": "ߞߎ߲߬ߕߐ߮ ߛߓߍߟߌ",
-       "headline_tip": "ߞߊߓߋ ߂߲ ߞߎ߲߬ߕߐ߮",
-       "nowiki_sample": "ߛߓߍߟߌ߫ ߖߙߎߡߎ߲ߕߊ߲ ߠߊߘߏ߲߬ ߦߊ߲߬",
-       "nowiki_tip": "ߥߞߌ߫ ߛߏ߯ߙߏߟߌ ߡߊߓߌ߬ߟߊ߬",
-       "image_tip": "ߞߐߕߐ߮ ߘߐߘߏ߲߬ߣߍ߲",
-       "media_tip": "ߞߐߕߐ߮ ߛߘߌ߬ߜߋ߲",
-       "sig_tip": "ߌ ߟߊ߫ ߞߟߊ߬ߣߐ ߕߎ߬ߡߊ߬ߘߊ ߓߊ߬ߘߌ߬ߟߊ߲߬ߡߊ",
-       "hr_tip": "ߛߌ߬ߕߊ߬ߙߌ߬ ߢߊߡߌߟߏߡߊ (ߊ߬ ߕߐ߬ߝߍ߬ߦߊ߬ ߟߊߓߊ߯ߙߊ߫)",
        "summary": "ߟߊ߬ߘߛߏ߬ߟߌ:",
        "subject": "ߝߐߡߊ",
        "minoredit": "ߣߌ߲߬ ߦߋ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲ ߘߏ߫ ߟߋ߬ ߘߌ߫",
        "newarticle": "(ߞߎߘߊ)",
        "newarticletext": "ߌ ߓߘߊ߫ ߛߘߌ߬ߜߋ߲ ߘߏ߫ ߟߊߓߊ߬ߕߏ߬ ߞߐߜߍ ߘߏ߫ ߘߐ߫߸ ߡߍ߲ ߕߴߦߋ߲߬ ߡߎߣߎ߲߬.\nߣߵߌ ߦߴߊ߬ ߝߍ߫ ߞߊ߬ ߞߐߜߍ ߘߏ߫ ߟߊߘߊ߲߫߸ ߛߓߍߟߌ ߘߊߡߌ߬ߣߊ߬ ߘߎ߰ߟߊ߬ߘߐ߫ ߞߏ߲ߘߏ ߘߐ߫ (ߞߊ߬ [$1 ߘߍ߬ߡߍ߲߬ߠߌ߲ ߞߐߜߍ] ߦߋ߫߸ ߖߐ߲߬ߛߊ߬ ߌ ߘߌ߫ ߞߌ߬ߓߊ߬ߙߏ߬ ߖߐ߲ߖߐ߲ ߛߐ߬ߘߐ߲߬). ߣߵߌ ߘߏ߲߬ ߞߍ߫ ߘߊ߫ ߦߊ߲߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߓߟߏߡߊ߬߸ ߌ ߟߊ߫ ߛߏ߲߯ߓߊߟߊ߲ <strong>back</strong> ߛߐ߲߬ߞߌ߲߫.",
        "anontalkpagetext": "----\n<em>ߓߊ߬ߘߏ߬ ߞߐߜߍ ߣߌ߲߬ ߦߋ߫ ߟߊߓߊ߯ߙߟߊ߫ ߟߐ߲ߓߊߟߌ ߟߋ߬ ߓߟߏ߫ ߡߍ߲ ߡߊ߫ ߖߊ߬ߕߋ߬ߘߊ߬ ߛߌ߲ߘߌ߫ ߡߎߣߎ߲߬ ߥߟߴߊ߬ ߕߍ߫ ߖߊ߬ߕߋ߬ߘߊ ߏ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫;</em>\nߏ߬ ߞߏߛߐ߲߬ ߊ߲ ߞߊ߫ ߞߊ߲߫ ߞߵߊ߬ ߟߊ߫ ߓߡ (ߓߟߐߟߐ ߡߛߍ߬ߞߍ߬ߡߛߍߞߍ) ߛߊ߲߬ߓߊ߬ߕߐ߮ ߟߊߓߊ߯ߙߴߊ߬ ߡߊߟߐ߲߫ ߞߊߡߊ߬߸ ߟߊߓߊ߯ߙߟߊ߫ ߛߌߦߊߡߊ߲߫ ߓߴߛߋ߫ ߞߊ߬ ߘߍ߬ ߓߡ ߛߊ߲߬ߓߊ߬ߕߐ߮ ߣߌ߲߬ ߢߐ߲߰ ߠߊ߫.\nߣߴߌ ߞߍ߫ ߘߊ߫ ߟߊߓߊ߯ߙߟߊ߫ ߡߊߝߟߌ߬ߣߍ߲߫ ߘߌ߫ ߞߵߊ߬ ߛߏ߬ߓߌ߬ ߞߏ߫ ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߴߌ ߕߊ߫ ߘߌ߫ ߊ߬ ߘߌ߫ ߟߐ߬ ߌ ߡߊ߬ ߌߞߘߐ߫߸ ߌ ߖߏ߫ ߞߊ߬ [[Special:CreateAccount|ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߘߊߦߟߍ߬]] ߥߟߊ߫ [[Special:UserLogin|ߞߊ߬ ߘߏ߲߬ߕߐ߰ߟߊ߬ߘߏ߲ ߞߍ߫]] ߖߐ߲߬ߛߊ߫ ߟߏ߲ߘߐ߬ ߓߊߛߌ߯ߓߊߟߌߦߊ ߘߌ߫ ߡߟߊ߫ ߟߊߓߊ߯ߙߟߊ߫ ߡߊߟߐ߲ߓߊߟߌ߫ ߜߘߍ ߟߎ߬ ߓߟߏ߫.",
-       "noarticletext": "ß\9bß\93ß\8dß\9fß\8cß« ß\9bß\8cß« ß\95ß\8dß« ß\9eß\90ß\9cß\8d ß£ß\8c߲߭ ß\9eß\8a߲߬ ß\95ß\8b߲߫. ß\8c ß\98ß\8cß« ß\9bß\8bß« ß\9eß\90ß\9cß\8d ß£ß\8c߲߬ \n [[Special:Search/{{PAGENAME}}|search for this page title]] ß\95ß\90ß® ß¢ß\8cߣß\8c߲߫ ß ß\8aß« ß\9eß\90ß\9cß\8d ß\95ß\90ß­ ß\9fß\8e߬ ß\98ß\90ß«߸  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
+       "noarticletext": "ß\9bß\93ß\8dß\9fß\8cß« ß\9bß\8cß« ß\95ß\8dß« ß\9eß\90ß\9cß\8d ß£ß\8c߲߭ ß\9eß\8a߲߬ ß\95ß\8b߲߬. ß\8c ß\98ß\8cß« ß\9bß\8bß« ß\9eß\90ß\9cß\8d ß£ß\8c߲߬.\n[[Special:Search/{{PAGENAME}}|search for this page title]] ß\95ß\90ß® ß¢ß\8cߣß\8c߲߫ ß ß\8aß« ß\9eß\90ß\9cß\8d ß\95ß\90ß­ ß\9fß\8e߬ ß¢ß\8aß\9dß\8d߬߸  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
        "noarticletext-nopermission": "ߛߓߍߟߌ߫ ߛߌ߫ ߕߍ߫ ߞߐߜߍ ߣߌ߲߭ ߞߊ߲߬ ߕߋ߲߫.\nߌ ߘߌ߫ ߛߋ߫ [[Special:Search/{{PAGENAME}}|search for this page title]] ߢߌߣߌ߲߫ ߠߊ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߘߐ߫߸ ߥߟߊ߫ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span> ߞߏ߬ߣߌ߲߬ ߘߌ߬ߢߍ߬ ߞߍߣߍ߲߫ ߕߴߌ ߡߊ߬ ߞߐߜߍ߫ ߣߌ߲߬ ߠߊߞߊ߭ ߘߐ߫.",
        "userpage-userdoesnotexist": "ߖߊ߬ߕߋ߬ߘߊ߬ ߟߊߓߊ߯ߙߕߊ \"$1\" ߛߌ߲ߘߌߣߍ߲߫ ߕߍ߫. \nߝߛߍ߬ߝߛߍ߬ߟߌ ߞߍ߫߸ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߞߐߜߍ ߣߌ߲߬ ߛߌ߲ߘߌ߫/ߡߊߦߟߍ߬ߡߊ߲߫.",
        "userpage-userdoesnotexist-view": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\" ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
        "grant-editpage": "ߞߐߜߍ߫ ߓߍߓߊ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-editprotected": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߡߊߦߟߍ߬ߡߊ߲߫",
        "grant-highvolume": "ߢߊ߲ߞߊ߲-ߛߊ߲ߘߐߕߊ ߡߊߦߟߍߡߊ߲ ߦߴߌ ߘߐ߫",
+       "grant-oversight": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߢߡߊߘߏ߲߰ ߊ߬ ߣߌ߫ ߞߊ߬ ߟߢߊ߬ߟߌ ߟߎ߬ ߖߏ߬ߛߌ߬.",
        "grant-patrol": "ߞߐߜߍ ߟߎ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߠߌ߲ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲",
        "grant-privateinfo": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߌߓߊߙߏߦߊ ߟߊߛߐ߬ߘߐ߲߬",
        "grant-protect": "ߞߐߜߍ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߊ߬ ߣߌ߫ ߞߵߊ߬ߟߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲ ߓߐ߫",
        "action-writeapi": "ߛߓߍߟߌ API ߟߊߓߊ߯ߙߊ߫",
        "action-delete": "ߞߐߜߍ ߣߌ߲߬ ߖߏ߰ߛߌ߬",
        "action-deleterevision": "ߟߢߊ߬ߟߌ ߟߎ߬ ߖߏ߬ߛߌ߬",
+       "action-deletelogentry": "ߘߊ߲ߖߐ ߡߎ߰ߡߍ ߖߏ߬ߛߌ߬",
        "action-deletedhistory": "ߞߐߜߍ ߟߎ߬ ߖߏ߰ߛߌ߬ߟߌ ߘߐ߬ߝߐ ߦߋ߫",
        "action-deletedtext": "ߟߢߊ߬ߟߌ ߖߏ߰ߛߌ߬ߣߍ߲ ߠߎ߬ ߛߓߍߟߌ ߦߋ߫.",
        "action-browsearchive": "ߞߐߜߍ߬ ߖߏ߰ߛߌ߬ߣߍ߲ ߠߎ߬ ߢߌߣߌ߲߫",
        "action-undelete": "ߞߐߜߍ ߖߏ߰ߛߌ߬ߓߊߟߌ ߟߎ߬",
+       "action-suppressrevision": "ߟߢߊ߬ߟߌ߬ ߢߡߊߘߏ߲߰ߣߍ߲ ߠߎ߬ ߦߋ߫ ߊ߬ ߣߌ߫ ߞߵߊ߬ߟߎ߬ ߟߊߞߎߣߎ߲߫.",
        "action-suppressionlog": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߘߎ߲ߛߓߍ ߣߌ߲߬ ߦߋ߫",
        "action-block": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߲߬ ߓߊ߬ߟߌ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊ߬",
        "action-protect": "ߞߐߜߍ ߣߌ߲߬ ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ߬ ߞߛߊߞߊ ߡߊߝߊ߬ߟߋ߲߬",
+       "action-rollback": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߞߐߟߕߊ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߟߊߞߐߛߊ߬ߦߌ߬ ߖߏߣߊߖߏߣߊ߫߹ ߡߍ߲ ߞߊ߬ ߞߐߜߍ߫ ߞߙߍߞߙߍߣߍ߲ ߡߊߦߟߍ߬ߡߊ߲߫.",
        "action-import": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ ߓߐ߫ ߥߞߌ ߕߐ߭ ߟߎ߬ ߘߐ߫",
        "action-importupload": "ߞߐߜߍ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ ߓߐ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߘߐ߫",
        "action-patrol": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߣߐ߬ߣߐ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߣߍ߲ ߘߌ߫",
        "action-managechangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߛߌ߲ߘߟߌ ߣߴߊ߬ߟߎ߬ ߓߐߒߠߊߟߌ",
        "action-applychangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫ ߌ ߟߊ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬ ߞߊ߲߬",
        "action-deletechangetags": "ߘߎ߲ߛߓߍ ߟߎ߬ ߖߏ߬ߛߌ߬ ߞߊ߬ ߓߐ߫ ߓߟߏߡߟߊ ߝߊ߲ ߞߊ߲߬",
+       "action-purge": "ߞߐߜߍ ߣߌ߲߬ ߛߊߣߌ߲ߧߊ߫",
+       "action-apihighlimits": "API ߡߊߢߌߣߌ߲ߣߍ߲ ߛߊ߲ߘߐߕߊ ߟߊߓߊ߯ߙߊ߫",
+       "action-bigdelete": "ߞߐߜߍ߫ ߘߝߐ߬ ߓߟߋ߬ߓߟߋ߬ߡߊ ߟߎ߬ ߖߏ߰ߛߌ߬",
+       "action-blockemail": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߓߊ߬ߟߌ߬ ߢߎߡߍߙߋ߲ ߗߋߟߌ ߡߊ߬",
+       "action-editprotected": "ߞߐߜߍ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫ \"{{int:protect-level-sysop}}\" ߓߟߏ߫.",
+       "action-editsemiprotected": "ߞߐߜߍ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫  \"{{int:protect-level-autoconfirmed}}\"",
+       "action-editinterface": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߢߐ߲߯ߕߍߞߣߍ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editusercss": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ CSS ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߞߐߕߐ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-edituserjson": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ JSON ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-edituserjs": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ JavaScript ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editmyusercss": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ CSS ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬ ߞߐߕߐ߮ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editmyuserjson": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ JSON ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "action-editmyuserjs": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ JavaScript ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "action-editmyuserjsredirect": "ߌ ߖߘߍ߬ߞߊ߬ߣߌ߲߬ JavaScript ߞߐߕߐ߮ ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫ ߡߍ߲ ߠߎ߬ ߓߘߊ߫ ߟߊߞߎ߲߬ߛߌ߲߫.",
        "action-viewsuppressed": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߘߏ ߟߎ߬ ߟߊ߫ ߟߢߊ߬ߟߌ߬ ߢߡߊߘߏ߲߰ߣߍ߲ ߠߎ߬ ߦߋ߫",
+       "action-hideuser": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߫ ߟߎ߫ ߓߊ߬ߟߌ߬߸ ߡߍ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ߣߍ߲߬ ߦߋ߫ ߖߊ߬ߡߊ ߟߊ߫ ߦߋߟߌ ߡߊ߬.",
        "action-unblockself": "ߌ ߖߍ߬ߘߍ ߓߊ߬ߟߌ߬ߣߍ߲ ߓߐ߫",
+       "action-reupload-own": "ߌ ߖߘߍ߬ߞߊߣߌ߲ ߠߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߖߏ߰ߛߌ߬",
+       "action-nominornewtalk": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲߬ ߞߏ ߕߍ߫ ߘߊߘߐߖߊߥߏ ߞߐߜߍ ߟߎ߬ ߘߐ߫߸ ߗߋߛߓߍ߫ ߞߎߘߊ߫ ߘߊߡߌ߬ߣߊ߬ ߞߊߟߌߦߊ߫ ߘߐ߫.",
+       "action-markbotedits": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߟߊߞߐߛߊ߬ߦߌ߬ߣߍ߲ ߠߎ߬ ߣߐ߬ߣߐ߬ ߓߏߕ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ߣߐ ߘߌ߫.",
+       "action-patrolmarks": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߎߘߊ ߟߎ߬ ߦߌ߬ߘߊ߬ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߠߌ߲߫ ߣߐ߬ߣߐ߬ߣߍ߲ ߘߌ߫",
+       "action-override-export-depth": "ߞߐߜߍ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬߸ ߤߊߟߌ߬ ߞߐߜߍ߫ ߜߋ߲߭ߞߘߎ߬ߣߍ߲ߢߐ߲߰ߠߊ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߅ ߘߎ߲߰ߧߊ ߛߊ߲ߘߐ߫.",
+       "action-suppressredirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߞߊߣߊ߬ ߟߊߘߊ߲߫ ߓߐߛߎ߲ ߞߐߜߍ ߟߎ߬ ߟߊ߫ ߞߐߜߍ ߟߎ߬ ߓߐ߫ ߕߎߡߊ ߟߴߊ߬ߟߎ߫ ߣߐ߭ ߘߐ߫.",
        "nchanges": "$1 {{PLURAL:$1|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲|ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ߞߊ߬ߦߌ߯ ߓߐߒߡߊߟߌ ߟߊߓߊ߲}}",
        "enhancedrc-history": "ߘߐ߬ߝߐ",
        "recentchanges-timeout": "ߢߌߣߌ߲ߣߌ߲ ߣߌ߲߬ ߕߎ߬ߡߊ ߓߘߊ߫ ߕߊ߬ߡߌ߲߬. ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߢߊߢߌߣߌ߲߫ ߜߘߍ߫ ߟߊ߬ߓߍ߲߬ߢߐ߲߰ߡߊ ߞߍ߫.",
        "recentchanges-network": "ߞߊ߬ ߓߍ߲߬ ߛߋߒߞߏߟߦߊ ߝߎ߬ߕߎ߲߬ߕߌ ߡߊ߬߸ ߞߐߝߟߌ߫ ߛߌ߫ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߢߎ߲߫ ߠߊ߫. ߌ ߞߊߘߊ߲߫ ߞߊ߬ ߞߐߜߍ ߣߌ߲߬ ߠߊߛߎߡߦߊ߫ ߖߊ߰ߣߌ߲߫.",
        "recentchanges-notargetpage": "ߞߐߜߍ ߕߐ߮ ߟߊߘߏ߲߬ ߛߊ߲ߝߍ߬߸ ߦߟߍ߬ߡߊ߲ ߡߍ߲ ߦߋ߫ ߞߐߜߍ ߘߐ߫߸ ߞߵߏ߬ ߦߋ߫.",
+       "recentchanges-feed-description": "ߥߞߌ ߣߌ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߐ߯ߟߕߊ ߟߎ߬ ߣߐ߬ߣߐ߬ ߓߊߟߏ ߣߌ߲߬ ߘߐ߫.",
        "recentchanges-label-newpage": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߣߌ߲߬ ߓߘߊ߫ ߘߐߜߍ߫ ߞߎߘߊ ߟߊߘߊ߲߫",
        "recentchanges-label-minor": "ߢߟߊߞߎߘߦߊ߫ ߝߕߌߣߍ߲ ߠߋ߬",
        "recentchanges-label-bot": "ߡߐ߰ߡߐ߮ ߟߋ߫ ߣߐ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ ߣߌ߲߬ ߞߍ߫ ߟߊ߫",
        "recentchanges-label-unpatrolled": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߣߌ߲߬ ߡߊ߫ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ ߡߎߣߎ߲߬",
        "recentchanges-label-plusminus": "ߞߐߜߍ ߢߊ߲ߞߊ߲ ߓߘߊ߫ ߡߊߦߟߍ߬ߡߊ߲߫ ߞߵߊ߬ ߝߌ߬ߘߊ߲ ߦߙߌߞߊ ߣߌ߲߬ ߘߌ߫",
        "recentchanges-legend-heading": "<strong>ߡߊ߬ߛߙߋ:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ߣß\8c߲߬ ß\9dߣß\8aß« ß¦ß\8bß« \n[[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ߣß\8c߲߬ ß\9dߣß\8aß« ß\93ߴߦß\8b߲߬ [[Special:NewPages|list of new pages]])",
        "recentchanges-submit": "ߊ߬ ߦߌ߬ߘߊ߬",
        "rcfilters-tag-remove": "$1 ߛߋ߲߬ߓߐ߫",
        "rcfilters-legend-heading": "<strong>ߟߊ߬ߘߛߏ߬ߟߌ ߛߙߍߘߍ</strong>",
        "illegalfilename": "ߞߟߏ ߘߏ߫ ߦߋ߫ ߞߐߕߐ߮ ߕߐ߮  \"$1\" ߘߐ߫ ߡߍ߲ ߠߊߘߤߊ߬ߣߍ߲߬ ߕߍ߫ ߞߐߜߍ ߞߎ߲߬ߕߐ߰ ߞߏ ߘߐ߫. \nߕߐ߯ ߜߘߍ߫ ߟߊ߫ ߞߐߕߐ߮ ߟߊ߫ ߖߊ߰ߣߌ߲߬ ߞߣߊ߬ ߕߴߊ߬ ߟߊߦߟߍ߬ߟߌ ߡߊߝߍߣߍ߲߫ ߠߊ߫ ߕߎ߲߯.",
        "filename-toolong": "ߞߐߕߐ߮ ߕߐ߮ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ ߝߙߐ߬ߢߐ ߂߀߀ ߞߊ߲߬.",
        "badfilename": "ߞߐߕߐ߮ ߕߐ߮ ߓߘߊ߫ ߦߟߍ߬ߡߊ߲߫ ߞߵߊ߬ ߞߍ߫ \"$1\" ߘߌ߫",
+       "filetype-missing": "ߘߐ߬ߝߎ߬ߟߋ߲߬ߠߌ߲߬ߢ ߛߌ߫ߢ ߕߍ߫ ߞߐߜߍ ߣߌ߲߬ ߠߊ߫ (ߦߏ߫ \".jpg\")",
        "empty-file": "ߌ ߣߊ߬ ߞߐߕߐ߮ ߡߍ߲ ߞߙߊߓߊ߫ ߟߊ߫߸ ߊ߬ ߘߐߞߏߟߏ߲ ߠߋ߬ ߕߘߍ߬.",
        "file-too-large": "ߌ ߟߊ߫ ߞߐߕߐ߮ ߞߙߊߓߊߣߍ߲ ߓߏ߲߬ߓߊ߫ ߕߘߍ߬ ߞߏߖߎ߰߹",
        "filename-tooshort": "ߞߐߕߐ߮ ߕߐ߮ ߛߘߎ߬ߡߊ߲߬ ߞߏߖߎ߰.",
        "verification-error": "ߞߐߕߐ߮ ߣߌ߲߬ ߡߊ߫ ߕߊ߬ߡߌ߲߬ ߞߐߕߐ߮ ߝߛߍ߬ߝߛߍ߬ ߦߌߟߊ.",
        "hookaborted": "ߌ ߕߘߍ߬ ߦߋ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߞߍ߫ ߞߏ ߘߐ߫߸ ߊ߬ ߘߐߛߊ߬ߣߍ߲߬ ߦߋ߫ ߘߐ߬ߥߙߊ߬ߟߌ ߟߋ߬ ߓߟߏ߫.",
        "illegal-filename": "ߞߐߕߐ߮ ߕߐ߮ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫.",
+       "overwrite": "ߕߋ߲߭ߕߋ߲߭ ߞߐߕߐ߮ ߖߏ߬ߛߌ߬ߟߌ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫.",
        "unknown-error": "ߝߎ߬ߕߎ߲߬ߕߌ߬ ߡߊߟߐ߲ߓߊߟߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫.",
        "tmp-create-error": "ߊ߬ ߕߍ߫ ߣߊ߬ ߥߊ߯ߕߌ߫ ߟߊߕߊߡߌ߲߫ ߞߐߕߐ߮ ߛߌ߲ߘߌ߫ ߟߊ߫.",
+       "tmp-write-error": "ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߞߐߕߐ߮ ߛߓߍߟߌ ߝߎ߬ߕߎ߲߬ߕߌ.",
+       "large-file": "ߊ߬ ߞߊ߬ߣߌ߲߬ߣߍ߲߬ ߦߋ߫ ߟߋ߬ ߞߏ߫ ߞߐߕߐ߮ ߞߊߣߊ߬ ߥߙߊ߬ $1 ߘߌ: ߞߐߕߐ߮ ߣߌ߲߬ ߘߏ߲߬ ߦߋ߫ $2.",
+       "largefileserver": "ߞߐߕߐ߮ ߓߏ߲߬ߓߊ߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ ߡߊ߬ߛߐ߬ߟߊ ߘߊߘߐߓߍ߲߬ߣߍ߲߫ ߡߍ߲ ߠߊߘߌ߬ߢߍ߬ ߞߊ߲ߡߊ߬.",
+       "windows-nonascii-filename": "ߥߞߌ ߣߌ߲߬ ߡߊ߫ ߛߕߍߘߋ߲߫ ߞߙߍߞߙߍߣߍ߲ ߞߐߡߊߓߌ߲ߓߌ߲߫ ߞߐߕߐ߮ ߕߐ߮ ߞߏ ߘߐ߫.",
+       "fileexists": "ߞߐߕߐ߮ ߡߍ߲ ߟߕߐ߬ ߦߋ߫ ߕߐ߮ ߣߌ߲߬ ߡߊ߬߸ ߏ߬ ߦߋ߫ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߫߸ ߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ <strong>[[:$1]]</strong> ߝߛߍ߬ߝߛߍ߬ ߣߌ߫ {{GENDER:|ߌ}} ߘߏ߲߬ ߟߊߣߍ߲߫ ߡߊ߫ ߞߴߊ߬ ߟߊ߫߸ ߣߴߌ ߦߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ߞߏ ߘߐ߫ [[$1|ߞߝߊ߬ߟߋ߲ߛߋ߲]]",
        "uploadwarning": "ߟߊ߬ߦߟߍ߬ߟߌ ߖߊ߬ߛߙߋ߬ߡߊ߬ߟߊ",
        "uploadwarning-text": "ߞߐߕߐ߮ ߘߎ߰ߟߊ߬ߘߐ߫ ߞߊ߲ߛߓߍߟߌ ߡߊ߬ߦߟߍ߬ߡߊ߲߫ ߖߊ߰ߣߌ߲߬߸ ߞߵߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯.",
        "savefile": "ߞߐߕߐ߮ ߟߊߞߎ߲߬ߘߎ߬",
        "lockmanager-notlocked": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ \"$1\" ߟߊߞߊ߬ ߟߊ߫߸ ߊ߬ ߛߐ߰ߣߍ߲߬ ߕߍ߫.",
        "lockmanager-fail-closelock": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ \"$1\" ߞߐߕߐ߮ ߛߐ߰ߣߍ߲ ߘߊߕߎ߲߯ ߠߊ߫.",
        "lockmanager-fail-deletelock": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ \"$1\" ߞߐߕߐ߯ ߛߐ߰ߣߍ߲ ߖߏ߰ߛߌ߬ ߟߊ߫.",
+       "lockmanager-fail-acquirelock": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߛߐ߬ߘߐ߲߬ ߠߊ߫  \"$1\" ߞߊ߲߬.",
        "lockmanager-fail-releaselock": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫  \"$1\" ߞߊ߲߬.",
        "lockmanager-fail-db-release": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫ ߓߟߏߡߟߊߝߊ߲ $1 ߞߊ߲߬.",
        "lockmanager-fail-svr-release": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫ ߡߊ߬ߛߐ߬ߟߊ $1 ߞߊ߲߬.",
        "license-header": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫",
        "nolicense": "ߊ߬ ߡߊ߫ ߓߊߕߐ߬ߡߐ߲߬",
        "licenses-edit": "ߕߌ߰ߦߊ ߢߣߊߕߊߟߌ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "license-nopreview": "(ߟߊ߬ߕߎ߲߰ߠߊ߫ ߕߴߦߋ߲߬)",
        "upload_source_file": "(ߌ ߟߊ߫ ߞߐߕߐ߯ ߛߎߥߊ߲ߘߌߣߍ߲ ߠߎ߬ ߞߊ߬ ߝߘߊ߫ ߌ ߟߊ߫ ߕߟߋ߬ߓߊ߮ ߟߊ߫)",
        "listfiles-delete": "ߊ߬ ߖߏ߬ߛߌ߬",
        "listfiles-summary": "ߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߣߌ߲߬ ߦߴߌ ߟߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߓߍ߯ ߟߋ߬ ߦߌ߬ߘߊ߬ ߟߊ߫",
        "listfiles-userdoesnotexist": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\" ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
        "imgfile": "ߞߐߕߐ߮",
        "listfiles": "ߞߐߕߐ߮ ߛߙߍߘߍ",
+       "listfiles_subpage": "ߊ߬ ߟߊߦߟߍ߬ߣߍ߲߬ ߦߋ߫ $1 ߟߋ߬ ߓߟߏ߫",
        "listfiles_thumb": "ߞߝߊ߬ߟߋ߲ߛߋ߲",
        "listfiles_date": "ߕߎ߬ߡߊ߬ߘߊ",
        "listfiles_name": "ߕߐ߮",
        "sharedupload": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫.",
        "sharedupload-desc-there": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߟߋ߬ ߟߊ߫߸ ߊ߬ ߣߴߊ߬ ߟߊߓߊ߯ߙߊߣߍ߲߫ ߘߌ߫ ߞߍ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫. ߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍߟߌ ߞߐߜߍ ߘߐߜߍ߫|ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ߬ ߡߞߊ߬ߝߏ߬ߟߌ߬ ߞߏ ߘߐ߫]",
        "sharedupload-desc-here": "ߘߐ߬ߛߙߋ ߣߌ߲߬ ߦߋ߫ ߦߊ߲߬ ߠߋ߫ $1 ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߮ ߕߐ߭ ߟߎ߬ ߞߏ߬ߣߌ߲ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫. ߊ߬ ߕߐ߯ ߛߓߍߟߌ ߦߙߐ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍߟߌ ߞߐߜߍ] ߟߋ߬ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫ ߣߌ߲߬.",
+       "sharedupload-desc-edit": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߟߋ߬ ߟߊ߫߸ ߊ߬ ߘߏ߲߬ ߠߊߓߊ߯ߙߊߣߍ߲߫ ߘߌ߫ ߞߍ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫.\nߕߎ߬ߡߊ߬ߘߐ߫ ߌ ߘߌ߫ ߞߴߊ߬ ߝߍ߬ ߞߴߊ߬ ߞߊ߲߬ߛߓߍߟߌ ߡߊߦߟߍ߬ߡߊ߲߫ ߊ߬ [$2 ߞߐߜߍ ߞߊ߲߬ߛߓߍ߬ߟߌ߬ ߞߐߜߍ] ߘߐ߫.",
+       "sharedupload-desc-create": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߟߋ߬ ߟߊ߫߸ ߊ߬ ߘߏ߲߬ ߠߊߓߊ߯ߙߊߣߍ߲߫ ߘߌ߫ ߞߍ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫.\nߕߎ߬ߡߊ߬ߘߐ߫ ߌ ߘߌ߫ ߞߴߊ߬ ߝߍ߫ ߞߴߊ߬ ߞߊ߲߬ߛߓߍߟߌ ߡߊߦߟߍ߬ߡߊ߲߫ ߊ߬ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍ߬ߟߌ߬ ߞߐߜߍ] ߘߐ߫",
        "filepage-nofile": "ߕߐ߮ ߣߌ߲߬ ߞߐߕߐ߯ ߛߎ߯ ߕߍ߫ ߦߋ߲߬",
+       "filepage-nofile-link": "ߞߐߕߐ߯ ߛߌ߫ ߕߍ߫ ߕߐ߮ ߣߌ߲߬ ߠߊ߫߸ ߞߏ߬ߣߌ߲߬ ߌ ߘߌ߫ ߛߋ߫ [ߊ߬ $1 ߟߊߦߟߍ߬ ߟߊ߫]",
        "uploadnewversion-linktext": "ߞߐߕߐ߮ ߣߌ߲߬ ߛߎ߯ߦߊ߫ ߞߎߘߊ߫ ߟߊߦߟߍ߬",
        "shared-repo-from": "ߞߊ߬ ߝߘߊ߫: $1",
+       "shared-repo": "ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߣߍ߲ ߠߎ߬ ߝߊ߲",
        "upload-disallowed-here": "ߌ ߕߍߣߊ߬ ߞߐߜߍ ߣߌ߲߬ ߞߊ߲߬ߛߓߍ߫ ߟߊ߫.",
        "filerevert": "ߌ ߞߐߛߊ߬ߦߌ߬ $1",
        "filerevert-legend": "ߞߐߕߐ߯ ߟߊߛߊ߬ߦߌ߲߬ߣߍ߲",
        "wantedpages": "ߞߐߜߍ߫ ߜߋ߬ߟߎ߲߬ߣߍ߲ ߠߎ߬",
        "wantedpages-badtitle": "ߞߎ߲߬ߕߐ߮ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫ ߞߐߝߟߌ߫ ߦߌ߬ߘߊ߬ߣߍ߲: $1 ߘߐ߫",
        "wantedfiles": "ߞߐߜߍ߫ ߜߋ߬ߟߎ߲߬ߣߍ߲ ߠߎ߬",
+       "wantedfiletext-nocat-noforeign": "ߞߐߕߐ߮ ߢߌ߲߬ ߠߎ߬ ߓߘߊ߫ ߟߊߓߊ߯ߙߊ߫ ߞߏ߬ߣߵߊ߬ߟߎ߬ ߕߴߦߋ߲߬.",
        "wantedtemplates": "ߞߙߊߞߏ ߞߊ߬ߣߌ߲߬ߣߍ߲ ߠߎ߬",
        "mostlinked": "ߛߘߌ߬ߜߋ߲߬ ߦߙߌߞߊ߫ ߦߋ߫ ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߘߐ߫",
        "mostlinkedcategories": "ߛߘߌ߬ߜߋ߲߬ ߦߙߌߞߊ߫ ߦߋ߫ ߦߌߟߡߊ ߡߍ߲ ߠߎ߬ ߘߐ߫",
        "protectedpages": "ߞߐߜߍ߫ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߎ߬",
        "protectedpages-filters": "ߛߍ߲ߛߍ߲ߟߊ߲ ߠߎ߬:",
        "protectedpages-indef": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߘߊ߲߬ߠߊߕߍ߰ߓߊߟߌ ߘߐߙߐ߲߫",
+       "protectedpages-summary": "ߞߐߜߍ ߛߙߍߘߍ ߢߌ߲߬ ߠߎ߬ ߦߋ߫ ߦߋ߫ ߞߐߜߍ߫ ߟߎ߫ ߟߋ߬ ߘߐ߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫ ߕߊ߲߫. ߣߵߌ ߦߋ߫ ߞߎ߲߬ߕߐ߮ ߛߙߍߘߍ߫ ߟߎ߫ ߟߋ߬ ߞߐ߫ ߡߍ߲ ߠߎ߬ ߟߊߞߊ߲ߘߊߣߍ߲߫ ߦߋ߫ ߛߌ߲ߘߟߌ ߡߊ߬߸ ߣߌ߲߬ ߘߐߜߍ߫ [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-noredirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߢߡߊߘߏ߲߰",
        "protectedpages-timestamp": "ߕߎ߬ߡߊ ߓߊ߬ߘߌ߬ߟߊ߲",
        "protectedpages-page": "ߞߐߜߍ",
        "protect-title": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߞߊߓߋ ߡߊߦߟߍ߬ߡߊ߲߬ \"$1\" ߞߊ߲߬",
        "protect-title-notallowed": "\"$1\" ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߞߊߓߋ ߦߋ߫",
        "prot_1movedto2": "\"[[$1]]\" ߓߘߊ߫ ߟߥߊ߫ ߦߊ߲߬ [[$2]]",
+       "protect-badnamespace-title": "ߕߐ߯ߛߓߍ ߞߣߍ ߟߊߞߊ߲ߘߊߓߊߟߌ",
+       "protect-badnamespace-text": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߕߐ߯ߛߓߍ ߞߣߍ ߘߐ߫ ߏ߬ ߕߍ߫ ߛߋ߫ ߟߊߞߊ߲ߘߊ߫ ߟߊ߫",
        "protect-legend": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߟߊߛߙߋߦߊ߫",
        "protectcomment": "ߊ߬ ߛߊߓߎ:",
        "protectexpiry": "ߊ߬ ߛߕߊ ߓߘߊ߫ ߝߊ߫:",
        "version-hook-name": "ߛߏ߲߭ߓߊ߬ߟߌ ߕߐ߮",
        "version-hook-subscribedby": "ߕߐ߮ ߛߓߍߣߍ߲߫ ߦߋ߫",
        "version-no-ext-name": "[ߕߐ߯ ߕߴߊ߬ ߟߊ߫]",
+       "version-ext-license": "ߕߌ߰ߦߊ",
+       "version-ext-colheader-name": "ߞߐߕߊ߲ߠߌ߲",
        "version-skin-colheader-name": "ߝߊ߬ߘߌ",
        "version-ext-colheader-version": "ߦߌߟߡߊ",
        "version-ext-colheader-license": "ߕߌ߰ߦߊ",
        "specialpages-group-developer": "ߟߊ߬ߥߙߌ߬ߞߌ߬ߟߌ ߖߐ߯ߙߊ߲ ߠߎ߬",
        "blankpage": "ߞߐߜߍ߫ ߘߐߞߏߟߏ߲",
        "tag-filter": "[[Special:Tags|ߞߊ߲ߠߊߛߓߍ]] ߢߡߊߘߏ߲߰ߣߍ߲",
+       "tag-filter-submit": "ߥߊ߬ߣߊߙߌ",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|ߡߊ߬ߛߙߋ |ߡߊ߬ߛߙߋ ߟߎ߬ }}]]: $2",
+       "tag-mw-contentmodelchange": "ߞߣߐߘߐ ߛߎ߯ߦߊ ߡߊߝߊ߬ߟߋ߲߬ߠߌ߲",
+       "tag-mw-contentmodelchange-description": "ߣߌ߲߬ ߡߊߦߟߍ߬ߡߊ߲߫\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ߞߣߐߘߐߛߎ߯ߦߊߡߊߝߊ߬ߟߋ߲߬ ߞߣߐߘߐ ߛߎ߯ߦߊ ߡߊߝߊ߬ߟߋ߲߬] ߞߐߜߍ ߘߐ߫",
+       "tag-mw-new-redirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲߬ ߞߎߘߊ",
+       "tag-mw-new-redirect-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߠߊߘߊ߲߫ ߥߟߊ߫ ߞߊ߬ ߞߐߜߍ ߦߟߍ߬ߡߊ߲߫ ߞߊ߬ ߞߍ߫ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߘߌ߫",
+       "tag-mw-removed-redirect": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߛߋ߲߬ߓߐ߫",
+       "tag-mw-removed-redirect-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߕߋ߲߭ߕߋ߲߭ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߡߊߦߟߍ߬ߡߊ߲߫ ߞߵߊ߬ ߞߍ߫ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߓߊߟߌ ߘߌ߫",
+       "tag-mw-changed-redirect-target": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߞߏ߲߭ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬",
+       "tag-mw-changed-redirect-target-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߞߏ߲߭ ߡߊߝߊ߬ߟߋ߲߬",
+       "tag-mw-blank": "ߖߏ߰ߛߌ߬ߟߌ ߦߵߌ ߘߐ߫",
+       "tag-mw-blank-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߞߐߜߍ ߖߏ߰ߛߌ߬",
+       "tag-mw-replace": "ߊ߬ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߣߐ߭ ߘߐ߫",
+       "tag-mw-replace-description": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߞߣߐߘߐ %߉߀ ߛߋ߲߬ߓߐ߫ ߞߐߜߍ ߘߐ߫",
+       "tag-mw-rollback": "ߟߊߞߐߛߊ߬ߦߌ߬",
+       "tag-mw-undo": "ߊ߬ ߘߐߛߊ߬",
+       "tag-mw-undo-description": "ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߠߎ߬ ߞߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߟߐ߯ߟߊߣߍ߲ ߠߎ߬ ߘߐߛߊ߬ ߞߊ߬ ߘߐ߬ߛߊ߬ߟߌ ߛߘߌ߬ߜߋ߲ ߠߊߓߊ߯ߙߊ߫.",
+       "tags-title": "ߘߎ߲ߛߓߍ ߟߎ߬",
+       "tags-tag": "ߘߎ߲ߛߓߍ ߕߐ߮",
+       "tags-display-header": "ߟߊ߲ߞߣߍߡߊߟߌ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫",
+       "tags-description-header": "ߞߘߐߝߐߟߌ ߞߊ߲߬ߛߓߍ߬ߟߌ߬ ߘߝߊߣߍ߲",
+       "tags-source-header": "ߛߎ߲",
+       "tags-active-header": "ߊ߬ ߟߊߞߎߣߎ߲߫ ߣߍ߲߫؟",
+       "tags-hitcount-header": "ߞߏ߲߭ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬",
+       "tags-actions-header": "ߞߍߟߌ ߟߎ߬",
        "tags-active-yes": "ߐ߲߬ߐ߲߬ߐ߲߫",
        "tags-active-no": "ߍ߲߬ߍ߲ߍ߲߬",
+       "tags-source-extension": "ߡߊ߬ߕߍ߰ߣߍ߲ ߠߎ߬ ߛߎ߲ߝߘߍ ߓߟߏ߫",
+       "tags-source-manual": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߫ ߓߏߕ ߟߎ߬ ߟߊ߫ ߓߟߏߟߊ߫ ߞߍߟߌ",
+       "tags-source-none": "ߊ߬ ߕߍߣߊ߬ ߥߊ߯ߕߌߖߊ߲߫ ߞߍ߫ ߟߊ߫ ߓߊ߯ߙߊ ߘߐ߫ ߡߎ߬ߕߎ߲߬",
+       "tags-edit": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "tags-delete": "ߊ߬ ߖߏ߰ߛߌ߬",
+       "tags-activate": "ߊ߬ ߟߊߞߎߣߎ߲߫",
+       "tags-deactivate": "ߊ߬ ߟߊߛߎ߬ߣߐ߬",
        "tags-hitcount": "{{PLURAL:$1|ߦߟߍ߬ߡߊ߲߬ߠߌ|$1 ߦߟߍ߬ߡߊ߲߬ߠߌ ߠߎ߬}}",
+       "tags-manage-no-permission": "ߌ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫ ߞߊ߬ ߘߎ߲ߛߓߍ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊߞߍ߲߰.",
+       "tags-manage-blocked": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߘߎ߲ߛߓߍ ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊߞߍ߲߰ ߠߊ߫ ߞߊ߬ {{GENDER:$1|ߌ}} ߓߊ߬ߟߌ߬ߣߍ߲ ߕߏ߫.",
+       "tags-create-heading": "ߘߎ߲ߛߓߍ߫ ߞߎߘߊ߫ ߛߌ߲ߘߌ",
+       "tags-create-explanation": "ߘߊ߲ߛߎ߲ ߞߏߛߐ߲߬߸ ߘߎ߲ߛߓߍ ߟߊߘߊ߲ߣߍ߲߫ ߞߎߘߊ ߟߎ߬ ߘߌ߫ ߣߊ߬ ߛߌ߲ߘߌ߫߸ ߊ߬ ߣߌ߫ ߞߊ߬ ߞߍ߫ ߦߋ߲߬ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߣߌ߫ ߓߏߕ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ ߞߊ߲ߡߊ߬.",
+       "tags-create-tag-name": "ߘߎ߲ߛߓߍ ߕߐ߮:",
+       "tags-create-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-create-submit": "ߟߊ߬ߘߊ߲߬ߠߌ߲",
+       "tags-create-no-name": "ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߘߎ߲ߛߓߍ ߕߐ߮ ߘߏ߫ ߞߙߍߞߙߍ߫.",
+       "tags-delete-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-activate-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-deactivate-reason": "ߊ߬ ߛߊߓߎ:",
+       "compare-page1": "ߞߐߜߍ ߁߭",
+       "compare-page2": "ߞߐߜߍ ߂߲",
+       "compare-rev1": "ߟߢߊ߬ߟߌ ߁߭",
+       "compare-rev2": "ߟߢߊ߬ߟߌ ߂߲",
+       "compare-submit": "ߊ߬ ߟߊߢߐ߲߮ߡߊ߬",
+       "compare-invalid-title": "ߌ ߣߊ߬ ߞߎ߲߬ߕߐ߮ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫.",
+       "compare-title-not-exists": "ߌ ߣߊ߬ ߞߎ߲߬ߕߐ߮ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߕߴߦߋ߲߬.",
+       "compare-revision-not-exists": "ߌ ߣߊ߬ ߟߢߊ߬ߟߌ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߕߴߦߋ߲߬.",
+       "diff-form": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬",
+       "diff-form-oldid": "ߟߢߊ߬ߟߌ߬ ߞߘߐ ID (ߢߣߊߕߊߟߌ)",
+       "diff-form-revid": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬ ߟߢߊ߬ߟߌ ID",
+       "diff-form-submit": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬",
+       "permanentlink": "ߛߘߌ߬ߜߋ߲߬ ߓߟߏߕߍ߰ߓߊߟߌ",
+       "permanentlink-revid": "ߟߢߊ߬ߟߌ ID",
+       "permanentlink-submit": "ߕߊ߯ ߟߢߊ߬ߟߌ ߘߐ߫",
+       "newsection": "ߕߍߕߍ߯ ߞߎߘߊ",
+       "newsection-page": "ߞߏ߲߭ ߞߐߜߍ",
+       "newsection-submit": "ߕߊ߯ ߞߐߜߍ ߞߊ߲߬",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} ߞߐߜߍ $3",
        "logentry-delete-restore": "$1 $3($4) ߞߐߜߍ {{GENDER:$2|ߓߘߊ߫ ߟߊߛߊ߬ߦߌ߬ ߞߐ߫}}",
        "logentry-delete-revision": "$1  {{GENDER:$2|ߓߘߊ߫ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߍ߫}} ߣߌ߲߬ ߦߋߗߏ߮ ߟߊ߫ {{PLURAL:$5|a revision|$5 revisions}} ߞߐߜߍ ߣߌ߲߬ $3: $4 ߘߐ߫",
index b218a40..0b3d7ab 100644 (file)
        "resetpass_submit": "Lokela ditlhaka-tša-siphiri o tsene",
        "changepassword-success": "Ditlhaka tša siphiri di fetotšwe!",
        "passwordreset-username": "Leina la mošomiši:",
-       "bold_sample": "Mongwalo wa '''Bold'''",
-       "bold_tip": "Ditlhaka tše Bold",
-       "italic_sample": "Ditlhaka tše Italic",
-       "italic_tip": "Mongwala wa Italic",
-       "link_sample": "Thaetlele ya hlomaganyo",
-       "link_tip": "Hlomaganyo ya kagare",
-       "extlink_sample": "http://www.example.com hlomaganyo thaetlele",
-       "extlink_tip": "Hlomaganyo ya ka ntle (gopola go thoma ka http://)",
-       "headline_sample": "Tlhaka ya hlogotaba",
-       "headline_tip": "Hlogotaba ya boemo ba 2",
-       "nowiki_sample": "Tsenya ditlhaka tša go sebe le ''format'' mo",
-       "nowiki_tip": "Hlokomologa tselangwalo (''formatting'') ya  wiki",
-       "image_sample": "Mohlala.jpg",
-       "image_tip": "Seswantšho/Faele yago dikanelwa (''embedded'')",
-       "media_sample": "Mohlala.ogg",
-       "media_tip": "Hlomaganyo ya Faele",
-       "sig_tip": "Tshaeno ya gago le nako ya phetogo",
-       "hr_tip": "Mothalo wago ya faase/papamela (šomiša ka hloko)",
        "summary": "Kakaretšo:",
        "subject": "Tabataba/Hlogo ya taba:",
        "minoredit": "Ye ke phetogo ye nnyenyane",
index 9475ca4..d2e589b 100644 (file)
        "pt-userlogout": "woort koorl",
        "passwordreset": "Wallakiny ban-a-warryn",
        "passwordreset-username": "Niall kwel-le",
-       "bold_sample": "Moorn text",
-       "bold_tip": "Moorn text",
-       "italic_sample": "Italic text",
-       "italic_tip": "Italic text",
-       "link_sample": "Beda katta wir-iny",
-       "link_tip": "Bura beda",
-       "extlink_sample": "http://www.example.com beda kat-ta-biddi",
-       "extlink_tip": "Ban-dak beda (katta-rah http:// prefix)",
-       "headline_sample": "Kat-ta-biddi text",
-       "headline_tip": "Katta-wiring 2",
-       "nowiki_sample": "Ijow boko non-formatted text nidjak",
-       "nowiki_tip": "Meeyal-boort wiki formatting",
-       "image_tip": "Bal-ya-ta file",
-       "media_tip": "File beda",
-       "sig_tip": "Noonook ban-a with timestamp",
-       "hr_tip": "Yambor (use sparingly)",
        "summary": "Koorada waangkininy:",
        "minoredit": "neyp-nopb wallak",
        "watchthis": "djinang nidja bibol",
index e7ad902..ee53dfe 100644 (file)
        "resettokens-watchlist-token": "Geton pel flux (Atom/RSS) web de [[Special:Watchlist|modificacions de paginas de vòstra lista de seguiment]]",
        "resettokens-done": "Getons reïnicializats.",
        "resettokens-resetbutton": "Reïnicializar los getons seleccionats",
-       "bold_sample": "Tèxte en gras",
-       "bold_tip": "Tèxte en gras",
-       "italic_sample": "Tèxte en italica",
-       "italic_tip": "Tèxte en italica",
-       "link_sample": "Títol del ligam",
-       "link_tip": "Ligam intèrne",
-       "extlink_sample": "http://www.example.com títol del ligam",
-       "extlink_tip": "Ligam extèrne (doblidetz pas lo prefixe http://)",
-       "headline_sample": "Tèxte de sostítol",
-       "headline_tip": "Sostítol nivèl 2",
-       "nowiki_sample": "Picatz lo tèxte pas formatat aicí",
-       "nowiki_tip": "Ignorar la sintaxi wiki",
-       "image_sample": "Exemple.jpg",
-       "image_tip": "Imatge inserit",
-       "media_sample": "Exemple.ogg",
-       "media_tip": "Ligam cap a un fichièr mèdia",
-       "sig_tip": "Vòstra signatura amb la data",
-       "hr_tip": "Linha orizontala (n'abusetz pas)",
        "summary": "Resumit :",
        "subject": "Subjècte :",
        "minoredit": "Aquò es un cambiament menor",
index 6dd890c..25a8e47 100644 (file)
        "changeemail-submit": "Vaihta sähköpoštu",
        "changeemail-throttled": "Olet oppinuh kirjuttuakseh liijan moni kerdua. Ole hyvä, vuota $1 enne ku opit uvvessah.",
        "resettokens-tokens": "Avaimet:",
-       "bold_sample": "Lihavoitu tekstu",
-       "bold_tip": "Lihavoitu tekstu",
-       "italic_sample": "Kursivoitu tekstu",
-       "italic_tip": "Kursivoitu tekstu",
-       "link_sample": "Linkan nimi",
-       "link_tip": "Sižähine linku",
-       "extlink_sample": "http://www.example.com linkan nimi",
-       "extlink_tip": "Ulgohine linku (musta http:// alguh)",
-       "headline_sample": "Rubriekkutekstu",
-       "headline_tip": "Tazon 2 rubriekku",
-       "nowiki_sample": "Ližiä täh tekstu, kudamua ei pie korjata",
-       "nowiki_tip": "Älä puutu wiki-korjavuksih",
-       "image_tip": "Upotettu failu",
-       "media_tip": "Linki failah",
-       "sig_tip": "Teijän allekirjutus da aigu",
-       "hr_tip": "Horizontualine viivu (älä käytä liijakse)",
        "summary": "Yhtehvedo:",
        "subject": "Tiemu/rubriekku:",
        "minoredit": "Tämä on pieni kohendus",
index 2e58b33..6c7ac83 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|ନିଜର ଦେଖଣାତାଲିକରେ ହେଉଥିବା ବଦଳ]]ର ୱେବ ଫିଡ଼ ପାଇଁ ଟୋକନ (ଆଟମ/RSS)",
        "resettokens-done": "ଟୋକନ ରିସେଟ ହେଲା ।",
        "resettokens-resetbutton": "ବଛାଯାଇଥିବା ଟୋକନ ରିସେଟ କରନ୍ତୁ",
-       "bold_sample": "ମୋଟା ଲେଖା",
-       "bold_tip": "ମୋଟା ଲେଖା",
-       "italic_sample": "ତେରେଛା ଲେଖା",
-       "italic_tip": "ତେରେଛା ଲେଖା",
-       "link_sample": "ଲିଙ୍କ ଶିରୋନାମା",
-       "link_tip": "ଭିତର ଲିଙ୍କ",
-       "extlink_sample": "http://www.example.com ଲିଙ୍କ ଶିରୋନାମା",
-       "extlink_tip": "ବାହାର ଲିଙ୍କ (ଆରମ୍ଭରେ http:// ଲେଖିବାକୁ ମନେରଖିଥିବେ)",
-       "headline_sample": "ଶିରୋନାମା ଲେଖା",
-       "headline_tip": "୨କ ଆକାରର ମୂଳଧାଡ଼ି",
-       "nowiki_sample": "ଅସଜଡ଼ା ଲେଖା ଏଠାରେ ଭରିବେ",
-       "nowiki_tip": "ଉଇକି ସଜାଣି ବିନା",
-       "image_tip": "ଏମ୍ବେଡ଼ ହୋଇ ଥିବା ଫାଇଲ",
-       "media_tip": "ଫାଇଲର ଲିଙ୍କ",
-       "sig_tip": "ସମୟ ସହ ଆପଣଙ୍କ ସନ୍ତକ",
-       "hr_tip": "ସମାନ୍ତରାଳ ରେଖା (ବେଳେବେଳେ ବ୍ୟବହାର କରିବେ)",
        "summary": "ସାରକଥା:",
        "subject": "ବିଷୟ:",
        "minoredit": "ଏହା ଏକ ସାମାନ୍ୟ ସମ୍ପାଦନା",
index 5a89dc7..188dec6 100644 (file)
        "resettokens-token-label": "$1 (ныры мидис: $2)",
        "resettokens-done": "Токентæ æппæрст æрцыдысты.",
        "resettokens-resetbutton": "Амынд токентæ æппар",
-       "bold_sample": "Бæзджын текст",
-       "bold_tip": "Бæзджын текст",
-       "italic_sample": "Курсив",
-       "italic_tip": "Курсив",
-       "link_sample": "Æрвитæны текст",
-       "link_tip": "Мидæггаг æрвитæн",
-       "extlink_sample": "http://www.example.com æрвитæны текст",
-       "extlink_tip": "Æддаг æрвитæн (префикс http:// ма рох кæн)",
-       "headline_sample": "Сæргонд текст",
-       "headline_tip": "Бæрц 2 сæргонд",
-       "nowiki_sample": "Батысс нæформатгонд текст ардæм",
-       "nowiki_tip": "Ницæмæ дарын вики формат",
-       "image_tip": "Æфтыд файл",
-       "media_tip": "Файлмæ æрвитæн",
-       "sig_tip": "Дæ къухæрфыст, рæстæгимæ",
-       "hr_tip": "Горизонталон хахх (арæх дзы ма пайда кæн)",
        "summary": "Бындур:",
        "subject": "Темæ/сæр:",
        "minoredit": "Ай чысыл ивд у.",
index 3a4961b..e5c10c4 100644 (file)
        "resettokens-token-label": "$1 (ਚਾਲੂ ਮੁੱਲ: $2)",
        "resettokens-done": "ਨਿਸ਼ਾਨੀਆਂ ਮੁੜ ਬਣਾਈਆਂ ਗਈਆਂ।",
        "resettokens-resetbutton": "ਚੁਣੇ ਹੋਏ ਟੋਕਨ ਮੁੜ ਸੈੱਟ ਕਰੋ",
-       "bold_sample": "ਗੂੜੀ ਲਿਖਤ",
-       "bold_tip": "ਗੂੜੇ ਅੱਖਰ",
-       "italic_sample": "ਟੇਢੇ ਅੱਖਰ",
-       "italic_tip": "ਟੇਢੇ ਅੱਖਰ",
-       "link_sample": "ਲਿੰਕ ਸਿਰਲੇਖ",
-       "link_tip": "ਅੰਦਰੂਨੀ ਲਿੰਕ",
-       "extlink_sample": "http://www.example.com ਲਿੰਕ ਸਿਰਲੇਖ",
-       "extlink_tip": "ਬਾਹਰੀ ਲਿੰਕ (http:// ਅਗੇਤਰ ਯਾਦ ਰੱਖੋ)",
-       "headline_sample": "ਸੁਰਖੀ ਅੱਖਰ",
-       "headline_tip": "ਪੱਧਰ 2 ਸੁਰਖੀ",
-       "nowiki_sample": "ਅਸੰਗਠਿਤ ਪਾਠ (NON -FORMATTED) ਇੱਥੇ ਰਖੋ।",
-       "nowiki_tip": "ਵਿਕੀ ਫਾਰਮੈਟਿੰਗ ਨਜ਼ਰਅੰਦਾਜ਼ ਕਰੋ",
-       "image_tip": "ਇੰਬੈੱਡ ਫ਼ਾਈਲ",
-       "media_tip": "ਫਾਇਲ ਲਿੰਕ",
-       "sig_tip": "ਤੁਹਾਡੇ ਦਸਤਖ਼ਤ, ਸਮੇਂ ਸਮੇਤ",
-       "hr_tip": "ਲੇਟਵੀਂ ਰੇਖਾ (ਟਾਵੀਂ-ਟਾਵੀਂ ਵਰਤੋਂ ਕਰੋ)",
        "summary": "ਸਾਰ:",
        "subject": "ਵਿਸ਼ਾ/ਹੈੱਡਲਾਈਨ:",
        "minoredit": "ਇਹ ਇੱਕ ਛੋਟੀ ਸੋਧ ਹੈ",
index f0abee9..3607128 100644 (file)
        "botpasswords-label-delete": "Buralen",
        "resetpass-submit-cancel": "I-tonda",
        "changeemail-none": "(anggapo)",
-       "link_tip": "Gawing ed loob",
        "summary": "Sumaryo:",
        "subject": "Suheto:",
        "minoredit": "Melag yan dinuma",
index 9e1da98..7d11470 100644 (file)
        "changepassword-success": "Melaus ing pamanalili mung password! Ngeni mila-login naka...",
        "resetpass_forbidden": "E la malyaring alilan deng password keng wiking ini",
        "passwordreset": "Alilan udyat (reset password)",
-       "bold_sample": "Makapasalang kulitan",
-       "bold_tip": "Makapal pangasulat",
-       "italic_sample": "Makakiling pangasulat",
-       "italic_tip": "Makakiling a kulitan (italic)",
-       "link_sample": "Bansag ning suglung",
-       "link_tip": "Suglung a pangkilub",
-       "extlink_sample": "http://www.example.com bansag ning suglung",
-       "extlink_tip": "Suglung a palwal (tandanan me ing http:// prefix)",
-       "headline_sample": "Letra ning pamagat (headline text)",
-       "headline_tip": "Pamagat a level 2",
-       "nowiki_sample": "Keti mu isingit ing sulat a e makaayus (non-formatted text)",
-       "nowiki_tip": "E papansinan ing pamanayus a pang-wiki (wiki formatting)",
-       "image_tip": "Simpan a makalangkap (Embedded file)",
-       "media_tip": "Suglung king simpan (File link)",
-       "sig_tip": "Ing kekang pirmang maki tatak ning oras (timestamp)",
-       "hr_tip": "Gulis a pakera (e dapat paneng gagamitan)",
        "summary": "Sampulung (Summary):",
        "subject": "Paksa/pamagat (headline):",
        "minoredit": "Malati yang edit ini",
index a17c7d3..38cdca5 100644 (file)
        "resetpass-submit-loggedin": "Canger ch'mot d'passe",
        "passwordreset": "Ortreuver ch'mot d'passe",
        "changeemail": "Canger l'adrèche du imèle",
-       "bold_sample": "Cros teske",
-       "bold_tip": "Cros teske",
-       "italic_sample": "Teske italique",
-       "italic_tip": "Teske italique",
-       "link_sample": "Tite dech loïen",
-       "link_tip": "Loïen intérne",
-       "extlink_sample": "http://www.example.com tite dech loïen",
-       "extlink_tip": "Éstérne loïen ( n'obliez mie ech préfix http:// )",
-       "headline_sample": "Teske dechl in-téte",
-       "headline_tip": "In-téte nivieu 2",
-       "nowiki_sample": "Placher ch'teske non-formaté ichi",
-       "nowiki_tip": "Poin d'format wiki",
-       "image_tip": "fichié incorporé",
-       "media_tip": "Loïen dech fichié",
-       "sig_tip": "Vo pataraf aveuc l'date",
-       "hr_tip": "line orizontale (imploéïer aveuc modérachon)",
        "summary": "Résumè:",
        "subject": "Sujet/in-téte:",
        "minoredit": "Ch'est eune tiote édition",
index 0221ab8..7817d90 100644 (file)
        "passwordreset-emailelement": "Yuusernaame: \n$1\n\nPaesswatt fer nau: \n$2",
        "changeemail-none": "(ken)",
        "changeemail-submit": "E-Poschd ennere",
-       "bold_sample": "Wadde fett gmarrickt",
-       "bold_tip": "Wadde fett gmarrickt",
-       "link_sample": "Gleecher-Titel",
-       "link_tip": "Gleecher",
-       "extlink_sample": "http://www.example.com Gleecher-Text",
-       "extlink_tip": "Gewebbgleecher (acht uff http://)",
-       "headline_sample": "Iwwerschrift",
-       "headline_tip": "Iwwerschrift Level 2",
-       "image_sample": "Beeschpiel.jpg",
-       "media_sample": "Beeschpiel.ogg",
-       "media_tip": "Gleecher fer Feil",
        "minoredit": "Nur gleene Enneringe gemacht",
        "watchthis": "Watsch des Blatt",
        "savearticle": "Blatt beilege",
index 921cf9d..3ae1ab2 100644 (file)
        "changeemail-none": "(käni)",
        "changeemail-submit": "E-Mail-Adress ännare",
        "resettokens-token-label": "$1 (jedzischa Wead: $2)",
-       "bold_sample": "Feddi Schrifd",
-       "bold_tip": "Feddi Schrifd",
-       "italic_sample": "Schebbi Schrifd",
-       "italic_tip": "Schebbi Schrifd",
-       "link_sample": "Schdischwoad",
-       "link_tip": "Inderna Ling'g",
-       "extlink_sample": "http://www.example.com Ling'gtegschd",
-       "extlink_tip": "Exderna Ling'g (uff http:// uffbasse)",
-       "headline_sample": "Schlaachzail",
-       "headline_tip": "Iwwaschrifd Ewene 2",
-       "nowiki_sample": "Gebb do'n Tegschd oi, wu nedd uffb'raid wead",
-       "nowiki_tip": "Wiki-Formatierunge nedd beachde",
-       "image_tip": "Bildvawais",
-       "media_tip": "Dadailing'g",
-       "sig_tip": "Doi Unnaschrifd midd ena Zaidoagawb",
-       "hr_tip": "Waagreschdi Linje (schbaasoam vawende)",
        "summary": "Iwwabligg:",
        "subject": "Bedreff:",
        "minoredit": "Des ischä glänni Beawaidung",
index 25d7bf1..d235fec 100644 (file)
                        "Railfail536",
                        "Vlad5250",
                        "CiaPan",
-                       "BadDog"
+                       "BadDog",
+                       "Rail",
+                       "Maro21"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "tog-useeditwarning": "Ostrzegaj mnie, gdy opuszczam stronę edycji bez zapisania zmian",
        "tog-prefershttps": "Zawsze używaj bezpiecznego połączenia po zalogowaniu",
        "tog-showrollbackconfirmation": "Wyświetl komunikat potwierdzający kliknięcie linku wycofującego edycje",
+       "tog-requireemail": "Wymagaj adresu e-mail przy resetowaniu hasła",
        "underline-always": "Zawsze",
        "underline-never": "Nigdy",
        "underline-default": "według ustawień skórki lub przeglądarki",
        "userlogin-resetpassword-link": "Nie pamiętasz hasła?",
        "userlogin-helplink2": "Pomoc przy logowaniu",
        "userlogin-loggedin": "Zalogowano jako {{GENDER:$1|$1}}.\nUżyj poniższego formularza, aby zalogować się jako inny użytkownik.",
-       "userlogin-reauth": "Musisz się ponownie zalogować, aby potwierdzić, że jesteś {{GENDER:$1|$1}}.",
+       "userlogin-reauth": "Musisz się ponownie zalogować, aby potwierdzić, że {{GENDER:$1|użytkownik|użytkowniczka}} $1 to Ty.",
        "userlogin-createanother": "Załóż nowe konto",
        "createacct-emailrequired": "Adres e‐mail",
        "createacct-emailoptional": "Adres e-mail (opcjonalnie)",
        "createaccountmail": "Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany adres e-mail",
        "createaccountmail-help": "Pozwala utworzyć konto dla innej osoby, nie znając jej hasła.",
        "createacct-realname": "Prawdziwe imię i nazwisko (opcjonalnie)",
-       "createacct-reason": "Powód",
+       "createacct-reason": "Powód (podawany publicznie)",
        "createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
        "createacct-reason-help": "Komunikat wyświetlany w rejestrze tworzenia kont",
        "createacct-submit": "Utwórz konto",
        "resettokens-watchlist-token": "Token kanału internetowego (Atom/RSS) zmian w [[Special:Watchlist|obserwowanych stronach]]",
        "resettokens-done": "Tokeny zresetowane.",
        "resettokens-resetbutton": "Zresetuj wybrane tokeny",
-       "bold_sample": "Tekst tłustą czcionką",
-       "bold_tip": "Tekst tłustą czcionką",
-       "italic_sample": "Tekst pochyłą czcionką",
-       "italic_tip": "Tekst pochyłą czcionką",
-       "link_sample": "Tytuł linku",
-       "link_tip": "Link wewnętrzny",
-       "extlink_sample": "http://www.example.com nazwa linku",
-       "extlink_tip": "Link zewnętrzny (pamiętaj o przedrostku http:// )",
-       "headline_sample": "Tekst nagłówka",
-       "headline_tip": "Nagłówek 2. poziomu",
-       "nowiki_sample": "Tutaj wstaw niesformatowany tekst",
-       "nowiki_tip": "Zignoruj formatowanie wiki",
-       "image_sample": "Przykład.jpg",
-       "image_tip": "Obraz lub inny plik osadzony na stronie",
-       "media_sample": "Przykład.ogg",
-       "media_tip": "Link do pliku",
-       "sig_tip": "Twój podpis wraz z datą i czasem",
-       "hr_tip": "Linia pozioma (nie nadużywaj)",
        "summary": "Opis zmian:",
        "subject": "Temat:",
        "minoredit": "To jest drobna zmiana",
        "searchall": "wszystkie",
        "showingresults": "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
        "showingresultsinrange": "Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1  $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "search-nonefound-thiswiki": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
        "prefs-help-email": "Podanie adresu e‐mail nie jest obowiązkowe, lecz jest konieczne do zresetowania zapomnianego hasła.",
        "prefs-help-email-others": "Możesz również umożliwić innym użytkownikom wysłanie do Ciebie e‐maila poprzez Twoją stronę użytkownika lub stronę dyskusji (bez ujawniania Twojego adresu).",
        "prefs-help-email-required": "Wymagany jest adres e‐mail.",
+       "prefs-help-requireemail": "Po zaznaczeniu wiadomości e-mail z linkiem do resetu hasła będą wysyłane dopiero gdy resetujący użytkownik wprowadzi zarówno nazwę użytkownika jak i adres e-mail przypisane do tego konta.",
        "prefs-info": "Podstawowe informacje",
        "prefs-i18n": "Ustawienia językowe",
        "prefs-signature": "Podpis",
        "listfiles-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
        "imgfile": "plik",
        "listfiles": "Lista plików",
+       "listfiles_subpage": "Przesłane przez $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nazwa",
        "ipblocklist-legend": "Znajdź zablokowanego użytkownika",
        "blocklist-userblocks": "Ukryj blokady konta",
        "blocklist-tempblocks": "Ukryj tymczasowe blokady",
+       "blocklist-indefblocks": "Ukryj blokady nałołożone na zawsze",
        "blocklist-addressblocks": "Ukryj blokady pojedynczych adresów IP",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Wszystkie",
        "tooltip-p-logo": "Strona główna",
        "tooltip-n-mainpage": "Zobacz stronę główną",
        "tooltip-n-mainpage-description": "Przejdź na stronę główną",
-       "tooltip-n-portal": "O projekcie - co możesz zrobić, gdzie możesz znaleźć informacje",
+       "tooltip-n-portal": "O projekcie  co możesz zrobić, gdzie możesz znaleźć informacje",
        "tooltip-n-currentevents": "Informacje o aktualnych wydarzeniach",
        "tooltip-n-recentchanges": "Lista ostatnich zmian w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "tooltip-n-randompage": "Załaduj losową stronę",
index ecc86bb..fd463e8 100644 (file)
        "resettokens-watchlist-token": "Geton për ël fluss an sl'aragnà (Atom/RSS) ëd [[Special:Watchlist|modìfiche a le pàgine che as ten sot-euj]]",
        "resettokens-done": "Geton riampostà.",
        "resettokens-resetbutton": "Riamposté ij geton selessionà",
-       "bold_sample": "Test an grassèt",
-       "bold_tip": "Test an grassèt",
-       "italic_sample": "Test an corsiv",
-       "italic_tip": "Test an corsiv",
-       "link_sample": "Tìtol dl'anliura",
-       "link_tip": "Anliura interna",
-       "extlink_sample": "http://www.example.com tìtol dl'anliura",
-       "extlink_tip": "Anliura esterna (che as visa dë buté ël prefiss http://)",
-       "headline_sample": "Test dël tìtol",
-       "headline_tip": "Antestassion dë scond livel",
-       "nowiki_sample": "Che a buta ël test brut ambelessì",
-       "nowiki_tip": "Lassé un tòch ëd test fòra dla sintassi dla wiki",
-       "image_sample": "Esempi.jpg",
-       "image_tip": "Archivi anglobà",
-       "media_sample": "Esempi.ogg",
-       "media_tip": "Anliura a n'archivi multimedial",
-       "sig_tip": "Soa signadura con la data e l'ora",
-       "hr_tip": "Riga orisontal (da dovresse nen tròp soèns)",
        "summary": "Resumé:",
        "subject": "Sogèt:",
        "minoredit": "Costa a l'é na modìfica cita",
index d4aaf9e..e9cee8a 100644 (file)
        "changeemail-newemail": "نواں ای-میل پتہ:",
        "changeemail-none": "(کوئی نئیں)",
        "changeemail-submit": "ای-میل بدلو",
-       "bold_sample": "موٹی لکھائی",
-       "bold_tip": "موٹی لکھائی",
-       "italic_sample": "ٹیڈی لکھائی",
-       "italic_tip": "ٹیڈی لکھائی",
-       "link_sample": "جوڑ",
-       "link_tip": "اندرونی جوڑ",
-       "extlink_sample": "http://www.example.com جوڑ دا ناں",
-       "extlink_tip": "بارلے جوڑ (remember http:// prefix)",
-       "headline_sample": "شہ سرخی",
-       "headline_tip": "دوسرے درجے دی سرخی",
-       "nowiki_sample": "فارمیٹ نہ ہوئی لکھائی ایتھے پاؤ",
-       "nowiki_tip": "وکی فارمیٹ رہن دیؤ۔",
-       "image_sample": "Example.jpg",
-       "image_tip": "وچ مورت لگاؤ",
-       "media_sample": "Example.ogg",
-       "media_tip": "فائل دا جوڑ",
-       "sig_tip": "تواڈے دستخط ویلے دے نال",
-       "hr_tip": "سدھی لکیر",
        "summary": "ویروا:",
        "subject": "موضوع:",
        "minoredit": "اے نکا جیا کم اے",
index 85652ec..3d9fec4 100644 (file)
        "resetpass-submit-cancel": "Χάσονα",
        "resetpass-wrong-oldpass": "'Κ εγράφτεν τογρία το προσωρνόν ή κανονικόν σημάδιν.\nΓιαμ' εποίκατε καινούρεον σημάδιν ή εποίκατε ψαλαφίον για καινούρεον προσωρνόν σημάδιν;",
        "resetpass-temp-password": "Προσωρινόν σημάδ':",
-       "bold_sample": "Χοντρόν κείμενον",
-       "bold_tip": "Χοντρόν κείμενον",
-       "italic_sample": "Ψιλόν κείμενον",
-       "italic_tip": "Ψιλόν κείμενον",
-       "link_sample": "Τίτλον σύνδεσμονος",
-       "link_tip": "Εσωτερικόν σύνδεσμον",
-       "extlink_sample": "http://www.example.com τίτλον σύνδεσμονος",
-       "extlink_tip": "Εξωτερικόν σύνδεσμον (να μην ανασπάλλετε το πρόθεμαν http:// )",
-       "headline_sample": "Κείμενον τίτλονος",
-       "headline_tip": "Δεύτερον τίτλος (επίπεδον 2)",
-       "nowiki_sample": "Αδακά πα να εισάγετε το μη μορφοποιημένον κείμενον.",
-       "nowiki_tip": "Ξάι 'κ να τερείται η μορφοποίηση Wiki.",
-       "image_tip": "Ενσωματωμένον εικόνα",
-       "media_tip": "Σύνδεσμον αρχείατι πολυμεσίων",
-       "sig_tip": "Η υπογραφήν εσούν με ώραν κι ημερομηνίαν",
-       "hr_tip": "Οριζόντιον γραμμή (μη θέκ'ς ατέν πολλά)",
        "summary": "Σύνοψη:",
        "subject": "Θέμα/επικεφαλίδα:",
        "minoredit": "Μικρόν αλλαγήν",
index 7f74154..237a61d 100644 (file)
        "resetpass-submit-loggedin": "Kitawīdinais kliptaswīrdan",
        "resetpass-wrong-oldpass": "Nitikrōmiskas kīsmingiskas anga aktuāls kliptaswīrds.\nMazzingi tū assei ka tēr kitawīdinuns swajjan kliptaswīrdan anga assei madlīwuns per nāunan kīsmingiskan kliptaswīrdan.",
        "resetpass-temp-password": "Kīsmingiskas kliptaswīrds:",
-       "bold_sample": "Pastarīnts teksts",
-       "bold_tip": "Pastarīnts teksts",
-       "italic_sample": "Itālikis",
-       "italic_tip": "Itālikis",
-       "link_sample": "Autengīnsenes tītels",
-       "link_tip": "Ēntrewingis autengīnsenis",
-       "extlink_sample": "http://www.example.com autengīnsenes tītels",
-       "extlink_tip": "Izwinaīnas autengīnsenis (pamēnais ezze prefiksan http:// )",
-       "headline_sample": "Galwasrīndas teksts",
-       "headline_tip": "Āntras līgmenes galwasrīnda",
-       "nowiki_sample": "Stwi enpeisāis nifōrmatitan tekstan",
-       "nowiki_tip": "Ignōris wiki fōrmatisnan",
-       "image_tip": "Grāfiki anga kits endīts en pāusu zūrbrukis",
-       "media_tip": "Autengīnsenis prei zūrbrukin",
-       "sig_tip": "Twājs papeisāsenis sen dātan be kērdan",
-       "hr_tip": "Uricōntali (tērpaus taupīngi)",
        "summary": "Kitawīdinsnan ebpeisāsenis:",
        "subject": "Tītels:",
        "minoredit": "Sta ast malkā tikrinsnā.",
index d0f097c..7b7467d 100644 (file)
        "resettokens-watchlist-token": "د ویب فیډ (د اتوم / آر ایس ایس) لپاره ډک کړئ [[Special:Watchlist| د خپل د کتار لیست په پاڼو کې بدلونونه]]",
        "resettokens-done": "د رایو بیا راګرځول.",
        "resettokens-resetbutton": "د ټاکل شوي ټوکنونو بیا راګرځول",
-       "bold_sample": "زغرد متن",
-       "bold_tip": "زغرد متن",
-       "italic_sample": "رېوند متن",
-       "italic_tip": "رېوند متن",
-       "link_sample": "د تړن سرليک",
-       "link_tip": "کورنۍ تړنه",
-       "extlink_sample": "http://www.example.com د تړنې سرليک",
-       "extlink_tip": "باندنۍ تړنې (د http:// مختاړی مه هېروی)",
-       "headline_sample": "د سرليک متن",
-       "headline_tip": "د ۲ کچې سرليک",
-       "nowiki_sample": "دلته دې بې بڼې متن ځای پر ځای شي",
-       "nowiki_tip": "د ويکي بڼه نيونه بابېزه گڼل",
-       "image_sample": "Example.jpg",
-       "image_tip": "خښه شوې دوتنه",
-       "media_sample": "Example.ogg",
-       "media_tip": "د دوتنې تړنه",
-       "sig_tip": "ستاسې لاسليک د وخت د ټاپې سره",
-       "hr_tip": "څنډيزه ليکه (ددې په کارولو کې سپما وکړۍ)",
        "summary": "لنډيز:",
        "subject": "سکالو:",
        "minoredit": "دا يو وړوکی سمون دی",
index 1106f5f..55ab67b 100644 (file)
        "tog-useeditwarning": "Avisar-me quando eu deixar uma janela de edição sem ter salvo as alterações",
        "tog-prefershttps": "Usar sempre uma conexão segura enquanto estiver conectado",
        "tog-showrollbackconfirmation": "Mostrar um aviso de confirmação ao clicar em um link de reversão",
+       "tog-requireemail": "Exigir e-mail para redefinições de senha",
        "underline-always": "Sempre",
        "underline-never": "Nunca",
        "underline-default": "Padrão do navegador/tema",
        "createaccountmail": "Usar uma senha aleatória e temporária que será enviada ao endereço de e-mail especificado a seguir",
        "createaccountmail-help": "Pode ser utilizado para criar uma conta para outra pessoa sem saber a senha.",
        "createacct-realname": "Nome real (opcional)",
-       "createacct-reason": "Motivo",
+       "createacct-reason": "Motivo (entrado publicamente)",
        "createacct-reason-ph": "Por que você está criando outra conta",
        "createacct-reason-help": "Mensagem mostrada no registro de criação de conta",
        "createacct-submit": "Crie sua conta",
        "resettokens-watchlist-token": "Tokens para o feed da web (Atom/RSS) das [[Special:Watchlist|mudanças de páginas em sua lista de páginas vigiadas]]",
        "resettokens-done": "Tokens reiniciados.",
        "resettokens-resetbutton": "Reiniciar tokens selecionados",
-       "bold_sample": "Texto em negrito",
-       "bold_tip": "Texto em negrito",
-       "italic_sample": "Texto em itálico",
-       "italic_tip": "Texto em itálico",
-       "link_sample": "Título do link",
-       "link_tip": "Link interno",
-       "extlink_sample": "http://www.example.com título do link",
-       "extlink_tip": "Link externo (lembre-se do prefixo http://)",
-       "headline_sample": "Conteúdo do cabeçalho",
-       "headline_tip": "Seção de nível 2",
-       "nowiki_sample": "Inserir texto não formatado aqui",
-       "nowiki_tip": "Ignorar a formatação wiki",
-       "image_sample": "Exemplo.jpg",
-       "image_tip": "Arquivo embutido",
-       "media_sample": "Exemplo.ogg",
-       "media_tip": "Link para o arquivo",
-       "sig_tip": "Sua assinatura, com hora e data",
-       "hr_tip": "Linha horizontal (use de forma moderada)",
        "summary": "Resumo da edição:",
        "subject": "Assunto:",
        "minoredit": "Marcar como edição menor",
        "prefs-help-email": "O endereço de e-mail é opcional, mas será necessário para recriar sua senha caso esqueça a antiga.",
        "prefs-help-email-others": "Você também pode optar por permitir que outros entrem em contato com você através de sua página de usuário ou de discussão sem ter de revelar seus dados pessoais.",
        "prefs-help-email-required": "O endereço de e-mail é requerido.",
+       "prefs-help-requireemail": "Se marcado, só enviará emails de redefinição de senha se a pessoa que redefiniu tiver fornecido o nome de usuário e o e-mail para esta conta.",
        "prefs-info": "Informações básicas",
        "prefs-i18n": "Internacionalização",
        "prefs-signature": "Assinatura",
        "listfiles-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
        "imgfile": "arquivo",
        "listfiles": "Lista de arquivos",
+       "listfiles_subpage": "Enviado por $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nome",
        "ipblocklist-legend": "Procurar por um usuário bloqueado",
        "blocklist-userblocks": "Esconder bloqueios de contas",
        "blocklist-tempblocks": "Esconder bloqueios temporários",
+       "blocklist-indefblocks": "Ocultar bloqueios indefinidos",
        "blocklist-addressblocks": "Esconder bloqueios de IP único",
        "blocklist-type": "Tipo:",
        "blocklist-type-opt-all": "Todos",
        "mycustomjsredirectprotected": "Você não tem permissão para editar esta página JavaScript porque é um redirecionamento e não aponta dentro do seu espaço do usuário.",
        "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
        "unprotected-js": "Por razões de segurança o JavaScript não pode ser carregado de páginas desprotegidas. Por favor, crie apenas javascript no MediaWiki: namespace ou como uma subpágina do usuário",
-       "userlogout-continue": "Você quer sair?"
+       "userlogout-continue": "Você quer sair?",
+       "rest-prefix-mismatch": "O caminho pedido ($1) não estava no interior do caminho raiz da API REST ($2)",
+       "rest-wrong-method": "O método pedido ($1) não era {{PLURAL:$3|o método permitido para este caminho|um dos métodos permitidos para este caminho}} ($2)",
+       "rest-no-match": "O caminho relativo pedido ($1) não corresponde a nenhuma rotina de tratamento conhecida"
 }
index c728421..5f844fd 100644 (file)
@@ -80,7 +80,8 @@
                        "Fitoschido",
                        "Ldacosta",
                        "CaiusSPQR",
-                       "Waldyrious"
+                       "Waldyrious",
+                       "Mansil alfalb"
                ]
        },
        "tog-underline": "Sublinhar hiperligações:",
        "tog-useeditwarning": "Avisar-me ao abandonar uma página editada sem gravar as alterações",
        "tog-prefershttps": "Usar sempre uma ligação segura enquanto tiver sessão iniciada",
        "tog-showrollbackconfirmation": "Mostrar um pedido de confirmação ao clicar numa hiperligação de reversão",
+       "tog-requireemail": "Exigir correio eletrónico para reinícios da palavra-passe",
        "underline-always": "Sempre",
        "underline-never": "Nunca",
        "underline-default": "Usar opção padrão do tema ou do navegador",
        "createaccountmail": "Usar uma palavra-passe aleatória e temporária e enviá-la para o endereço de correio eletrónico especificado",
        "createaccountmail-help": "Pode ser utilizado para criar uma conta para outra pessoa sem saber a palavra-passe.",
        "createacct-realname": "Nome verdadeiro (opcional)",
-       "createacct-reason": "Motivo",
+       "createacct-reason": "Motivo (registado publicamente)",
        "createacct-reason-ph": "Porque está a criar outra conta",
        "createacct-reason-help": "Mensagem mostrada no registo de criação de contas",
        "createacct-submit": "Crie a sua conta",
        "resettokens-watchlist-token": "Chave para o ''feed'' Atom/RSS de [[Special:Watchlist|mudanças às páginas vigiadas]]",
        "resettokens-done": "As chaves foram redefinidas.",
        "resettokens-resetbutton": "Redefinir chaves selecionadas",
-       "bold_sample": "Texto a negrito",
-       "bold_tip": "Texto a negrito",
-       "italic_sample": "Texto em itálico",
-       "italic_tip": "Texto em itálico",
-       "link_sample": "Título da hiperligação",
-       "link_tip": "Hiperligação interna",
-       "extlink_sample": "http://www.example.com título da hiperligação",
-       "extlink_tip": "Hiperligação externa (lembre-se do prefixo http://)",
-       "headline_sample": "Texto do cabeçalho",
-       "headline_tip": "Secção de nível 2",
-       "nowiki_sample": "Inserir texto não-formatado aqui",
-       "nowiki_tip": "Ignorar formatação wiki",
-       "image_sample": "Exemplo.jpg",
-       "image_tip": "Ficheiro incorporado",
-       "media_sample": "Exemplo.ogg",
-       "media_tip": "Hiperligação para ficheiro",
-       "sig_tip": "A sua assinatura, com hora e data",
-       "hr_tip": "Linha horizontal (utilize moderadamente)",
        "summary": "Resumo:",
        "subject": "Assunto:",
        "minoredit": "Marcar como edição menor",
        "undo-norev": "Não foi possível desfazer a edição porque não existe ou foi apagada.",
        "undo-nochange": "A edição parece já ter sido desfeita.",
        "undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussão]])",
+       "undo-summary-anon": "Desfazer a revisão $1 de [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Desfez a edição $1 de um utilizador oculto",
        "cantcreateaccount-text": "A criação de contas a partir deste endereço IP (<strong>$1</strong>) foi bloqueada por [[User:$3|$3]].\n\nO motivo apresentado por $3 foi <em>$2</em>",
        "cantcreateaccount-range-text": "A criação de conta a partir dos endereços IP no intervalo <strong>$1</strong>, que inclui o seu endereço IP (<strong>$4</strong>), foi bloqueada por [[User:$3|$3]].\n\nO motivo apresentado por $3 foi <em>$2</em>",
        "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-passe caso esqueça a antiga.",
        "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de uma hiperligação nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
        "prefs-help-email-required": "É necessário o endereço de correio eletrónico.",
+       "prefs-help-requireemail": "Se marcado, só serão enviados correios de reinício da palavra-passe se a pessoa que está a reiniciar tiver fornecido o nome de utilizador e o correio eletrónico desta conta.",
        "prefs-info": "Informações básicas",
        "prefs-i18n": "Internacionalização",
        "prefs-signature": "Assinatura",
        "listfiles-userdoesnotexist": "A conta de utilizador \"$1\" não está registada.",
        "imgfile": "ficheiro",
        "listfiles": "Ficheiros",
+       "listfiles_subpage": "Carregamentos de $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nome",
        "alreadyrolled": "Não foi possível reverter as edições de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguém editou ou já reverteu a página.\n\nA última edição foi de [[User:$3|$3]] ([[User talk:$3|discussão]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O resumo da edição era: <em$1</em>.",
        "revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
+       "revertpage-anon": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] para a última revisão de [[User:$1|$1]]",
        "revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Foram revertidas as edições de {{GENDER:$3|$1}}; reposta a última edição de {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Erro de sessão",
        "ipblocklist-legend": "Procurar um utilizador bloqueado",
        "blocklist-userblocks": "Ocultar bloqueios de contas",
        "blocklist-tempblocks": "Ocultar bloqueios temporários",
+       "blocklist-indefblocks": "Ocultar bloqueios sem fim definido",
        "blocklist-addressblocks": "Ocultar bloqueios de um IP individual",
        "blocklist-type": "Tipo:",
        "blocklist-type-opt-all": "Todos",
        "mycustomjsredirectprotected": "Não tem autorização para editar esta página de JavaScript porque ela é um redirecionamento e não aponta para o interior do seu espaço do utilizador.",
        "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
        "unprotected-js": "Por motivos de segurança o JavaScript de páginas desprotegidas não pode ser carregado. Crie javascript só no espaço nominal/domínio MediaWiki: ou numa subpágina do utilizador",
-       "userlogout-continue": "Quer sair?"
+       "userlogout-continue": "Quer sair?",
+       "rest-prefix-mismatch": "O caminho pedido ($1) não estava no interior do caminho raiz da API REST ($2)",
+       "rest-wrong-method": "O método pedido ($1) não era {{PLURAL:$3|o método permitido para este caminho|um dos métodos permitidos para este caminho}} ($2)",
+       "rest-no-match": "O caminho relativo pedido ($1) não corresponde a nenhuma rotina de tratamento conhecida"
 }
index 478a52e..6b141f9 100644 (file)
        "tog-useeditwarning": "Used as label for the checkbox in [[Special:Preferences#mw-prefsection-editing|Special:Preferences]].",
        "tog-prefershttps": "Toggle option used in [[Special:Preferences]] that indicates if the user wants to use a secure connection when logged in",
        "tog-showrollbackconfirmation": "Toggle option used in [[Special:Preferences]] to enable/disable rollback confirmation prompt. Should be visible only to users with rollback rights.",
+       "tog-requireemail": "Toggle option used in [[Special:Preferences]].  Should be only visible to users who have confirmed their email address.\n\nSee also: {{msg-mw|prefs-help-requireemail}}",
        "underline-always": "Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].\n\nThis option means \"always underline links\", there are also options {{msg-mw|Underline-never}} and {{msg-mw|Underline-default}}.\n\n{{Gender}}\n{{Identical|Always}}",
        "underline-never": "Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].\n\nThis option means \"never underline links\", there are also options {{msg-mw|Underline-always}} and {{msg-mw|Underline-default}}.\n\n{{Gender}}\n{{Identical|Never}}",
        "underline-default": "Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].\n\nThis option means \"underline links as in your user skin or your browser\", there are also options {{msg-mw|Underline-never}} and {{msg-mw|Underline-always}}.\n\n{{Gender}}\n{{Identical|Browser default}}",
        "perfcached": "Like {{msg-mw|perfcachedts}} but used when we do not know how long ago page was cached (unlikely to happen).\n\nParameters:\n* $1 - the max result cut off ($wgQueryCacheLimit)",
        "perfcachedts": "Used on pages that list page lists for which the displayed data is cached. Parameters:\n* $1 - a time stamp (date and time combined)\n* $2 - a date (optional)\n* $3 - a time (optional)\n* $4 - the cut off limit for cached results ($wgQueryCacheLimit). If there are more then this many results for the query, only the first $4 of those will be listed on the page. Usually $4 is about 1000.",
        "querypage-no-updates": "Text on some special pages, e.g. [[Special:FewestRevisions]].",
+       "querypage-updates-periodical": "Text on some special pages which are configurated with a periodical run of a maintenance script.\n\nSee also {{msg-mw|querypage-no-updates}}.",
        "viewsource": "The text displayed in place of the {{msg-mw|Edit}} tab when the user has no permission to edit the page.\n\nSee also:\n* {{msg-mw|Viewsource}}\n* {{msg-mw|Accesskey-ca-viewsource}}\n* {{msg-mw|Tooltip-ca-viewsource}}\n{{Identical|View source}}",
        "viewsource-title": "Page title shown when trying to edit a protected page. Parameters:\n* $1 - the name of the page",
        "actionthrottled": "This is the title of an error page. Read it in combination with {{msg-mw|actionthrottledtext}}.",
        "resettokens-watchlist-token": "Label for watchlist token checkbox on [[Special:ResetTokens]] (see {{msg-mw|prefs-watchlist-token}} at [[Special:Preferences#mw-prefsection-watchlist]]).",
        "resettokens-done": "Message shown on [[Special:ResetTokens]] after the tokens have been reset successfully.",
        "resettokens-resetbutton": "Form submit button on [[Special:ResetTokens]].",
-       "bold_sample": "This is the sample text that you get when you press the first button on the left on the edit toolbar.\n\n{{Identical|Bold text}}",
-       "bold_tip": "This is the text that appears when you hover the mouse over the first button on the left of the edit toolbar.\n\n{{Identical|Bold text}}",
-       "italic_sample": "The sample text that you get when you press the second button from the left on the edit toolbar.\n\n{{Identical|Italic text}}",
-       "italic_tip": "This is the tooltip that appears when the user points to the \"Italic\" button in the edit toolbar.\n\n{{Identical|Italic text}}",
-       "link_sample": "This is the default text in the internal link that is created when you press the third button from the left on the edit toolbar (the \"Ab\" icon).",
-       "link_tip": "Tip for internal links.\n{{Identical|Internal link}}",
-       "extlink_sample": "This message appears when clicking on the fourth button of the edit toolbar. You can translate \"link title\". Because many of the localisations had urls that went to domains reserved for advertising, it is recommended that the link is left as-is. All customised links were replaced with the standard one, that is reserved in the standard and will never have ads or something.",
-       "extlink_tip": "This is the tip that appears when you hover the mouse over the fourth button from the left on the edit toolbar.\n\n{{Identical|External link (remember http:// prefix)}}",
-       "headline_sample": "Sample of headline text.",
-       "headline_tip": "This is the text that appears when you hover the mouse over the fifth button from the left on the edit toolbar.",
-       "nowiki_sample": "Text inserted between nowiki tags",
-       "nowiki_tip": "This is the text that appears when you hover the mouse over the third button from the right on the edit toolbar.",
-       "image_sample": "{{optional}}\nUsed in text generated by Picture button in toolbar.\n{{Identical|Example}}",
-       "image_tip": "This is the text that appears when you hover the mouse over the sixth (middle) button on the edit toolbar.\n\n{{Identical|Embedded file}}",
-       "media_sample": "{{optional}}\n{{Identical|Example}}",
-       "media_tip": "This is the text that appears when you hover the mouse over the fifth button from the right in the edit toolbar.\n{{Identical|File link}}",
        "sig-text": "{{notranslate}} This is the text that appears when you click on the signature button (second button from the right) on the edit toolbar. $1 will be replaced with four tildes (which cannot be included directly in the message for technical reasons).",
-       "sig_tip": "This is the text that appears when you hover the mouse over the second key from the right on the edit toolbar.\n{{Identical|Signature with timestamp}}",
-       "hr_tip": "This is the text that appears when you hover the mouse over the first button on the right on the edit toolbar.",
        "summary": "The Summary text beside the edit summary field\n\nSee also:\n* {{msg-mw|Subject}}\nSee also:\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}\n{{Identical|Summary}}",
        "subject": "Used as label for the section title input box when adding a new section on a talk page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
        "minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
        "prefs-help-email": "Shown as explanation text on [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.\n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-changeemail|link title}}\n* {{msg-mw|prefs-setemail|link title}}",
        "prefs-help-email-others": "This text is shown on account creation, below the description of the e-mail address field (which is optional).\n\nSee also:\n* {{msg-mw|prefs-help-email-required|help}}\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-changeemail|link title}}\n* {{msg-mw|prefs-setemail|link title}}",
        "prefs-help-email-required": "Shown as explanation text on [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.\n\nSee also:\n* {{msg-mw|prefs-help-email|help}}\n* {{msg-mw|prefs-help-email-others|help}}\n* {{msg-mw|prefs-changeemail|link title}}\n* {{msg-mw|prefs-setemail|link title}}",
+       "prefs-help-requireemail": "Shown as explanation text on [[Special:Preferences]] > {{int:prefs-personal}} > {{int:email}}.\n\nSee also: {{msg-mw|tog-requireemail}}",
        "prefs-info": "Header for the box giving basic information on the user account, displayed on the 'user profile' tab of the [[Special:Preferences|user preferences]] special page.\n{{Identical|Basic information}}",
        "prefs-i18n": "Field set legend for user preferences regarding the interface language",
        "prefs-signature": "{{Identical|Signature}}",
        "listfiles-userdoesnotexist": "This message is displayed on [[Special:ListFiles]] when a invalid username is entered.",
        "imgfile": "{{Identical|File}}",
        "listfiles": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n{{Identical|List}}",
+       "listfiles_subpage": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n\nParameters:\n* $1 - username\n\n{{Identical|List}} when a username is selected.",
        "listfiles_thumb": "{{Identical|Thumbnail}}",
        "listfiles_date": "Column header for the result table displayed on [[Special:ListFiles]].\n{{Identical|Date}}",
        "listfiles_name": "Column header for the result table displayed on [[Special:ListFiles]].\n{{Identical|Name}}",
        "ipblocklist-legend": "Used as legend of the form in [[Special:BlockList]].\n\nSee also:\n* {{msg-mw|Ipblocklist-legend}}\n* {{msg-mw|Ipblocklist-submit}}",
        "blocklist-userblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
        "blocklist-tempblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
+       "blocklist-indefblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
        "blocklist-addressblocks": "Used as the label for the multi-select checkbox in the form on [[Special:BlockList]].\n{{Related|Blocklist-blocks}}",
        "blocklist-type": "Used as label for dropdown box in [[Special:BlockList]].",
        "blocklist-type-opt-all": "Used as option for dropdown box in [[Special:BlockList]]. This is the default option and indicates that \"all\" blocks will be listed\n{{Identical|All}}",
        "mycustomjsredirectprotected": "Error message shown when user tries to edit their own JS page that is a foreign redirect without the 'mycustomjsredirectprotected' right. See also {{msg-mw|mycustomjsprotected}}.",
        "easydeflate-invaliddeflate": "Error message if the content passed to easydeflate was not deflated (compressed) properly",
        "unprotected-js": "Error message shown when trying to load javascript via action=raw that is not protected",
-       "userlogout-continue": "Shown if user attempted to log out without a token specified. Probably the user clicked on an old link that hasn't been updated to use the new system. $1 - url that user should click on in order to log out."
+       "userlogout-continue": "Shown if user attempted to log out without a token specified. Probably the user clicked on an old link that hasn't been updated to use the new system. $1 - url that user should click on in order to log out.",
+       "rest-prefix-mismatch": "Error message for REST API debugging, shown if $wgRestPath is incorrect or otherwise not matched. Parameters:\n* $1: The requested path.\n* $2: The configured root path ($wgRestPath).",
+       "rest-wrong-method": "Error message for REST API debugging, shown if the HTTP method is incorrect. Parameters:\n* $1: The received request method.\n* $2: A comma-separated list of allowed methods for this path.\n* $3: The number of items in the list $2",
+       "rest-no-match": "Error message for REST API debugging, shown if the path has the correct prefix but did not match any registered handler. Parameters:\n* $1: The received request path, relative to $wgRestPath."
 }
index fd9c55b..087c28a 100644 (file)
        "resettokens-token-label": "$1 (kunan chani: $2)",
        "resettokens-done": "Llawikunaqa kutichimusqañam.",
        "resettokens-resetbutton": "Akllasqa llawikunata kutichimuy",
-       "bold_sample": "Yanasapa qillqa",
-       "bold_tip": "Yanasapa qillqa",
-       "italic_sample": "Wiksu qillqa",
-       "italic_tip": "Wiksu qillqa",
-       "link_sample": "T'inkip sutin",
-       "link_tip": "Ukhu t'inki",
-       "extlink_sample": "http://www.example.com t'inkip umallin",
-       "extlink_tip": "Hawa t'inki (ñawpaqta http:// nisqata yapariy)",
-       "headline_sample": "Uma siq'i qillqa",
-       "headline_tip": "Iskay ñiqi hanaq siq'i qillqa",
-       "nowiki_sample": "Kayman mana wiki rikch'akuyniyuq qillqata yapamuy",
-       "nowiki_tip": "Wiki rikch'akuy ama kachunchu",
-       "image_sample": "Qhawarichiy.jpg",
-       "image_tip": "Ch'aqtasqa rikcha",
-       "media_tip": "Multimidya willañiqiman t'inki",
-       "sig_tip": "Sutiykita, p'unchawta, pachatapas silq'umuy",
-       "hr_tip": "Siriq siq'i (ama nisyutachu llamk'apuy)",
        "summary": "Pisichay:",
        "subject": "Yachaywa/umalli:",
        "minoredit": "Kayqa uchuylla hukchaymi",
index c66fb49..d1306cc 100644 (file)
        "createaccount": "Shuk rurak shutita akllana",
        "mailmypassword": "Musuq yaykunkapak rimayta e-chaskiwan kachawapay",
        "loginlanguagelabel": "Shimi: $1",
-       "bold_sample": "Yanayashka killka",
-       "bold_tip": "Yanayashka killka",
-       "italic_sample": "Wiksu killka",
-       "italic_tip": "Wiksu qillqa",
-       "link_sample": "Tinkipak uma rimay",
-       "link_tip": "Ukuman tinki",
-       "extlink_sample": "http://www.example.com tinkipa uma rimay",
-       "extlink_tip": "Hawaman tinki (http:// llikakunawan kallarinami kan)",
-       "headline_sample": "Uma rimaypa killka",
-       "headline_tip": "Ishkay-niki hatun uma rimay",
-       "nowiki_sample": "Kaypi wiki-shimi illak (''sin formato'') killkaykunata churapay",
-       "nowiki_tip": "wiki-shimi ama hapinchu",
-       "image_tip": "Ukupi tiyak rikcha",
-       "media_tip": "Archivuman tinkikuna",
-       "sig_tip": "Kikinpa aspiyta, punchawan pachawanpash killkan",
-       "hr_tip": "sirik aspi (paykunata ama ashtawan churapay)",
        "summary": "Uchilla rimay",
        "subject": "Imamanta/Uma rimay",
        "minoredit": "Kay killkayka uchillami kan",
index 5d8a729..d86faec 100644 (file)
        "pt-userlogout": "ⴼⴼⵖ",
        "retypenew": "Ɛawd arri Taguri n wadaf tamaynut:",
        "botpasswords-label-delete": "ⴽⴽⵙ",
-       "bold_sample": "ⵜⵉⵔⵔⴰ ⵜⵉⵣⵓⵔⴰⵔⵉⵏ",
-       "bold_tip": "ⵜⵉⵔⵔⴰ ⵜⵉⵣⵓⵔⴰⵔⵉⵏ",
-       "italic_sample": "Tirra titalyanin",
-       "italic_tip": "Tira ifrghn.",
-       "link_sample": "isem n tzedayt",
-       "link_tip": "Tazdayt n dixl",
-       "extlink_sample": "http://www.example.com isem n tezdayt",
-       "extlink_tip": "Tazdayt n baṛṛa (qa tettud http:// prefix)",
-       "headline_sample": "Aḍris n ixf-isem",
-       "headline_tip": "Aswir 2 n ixf-isem",
-       "nowiki_sample": "Sideff da tirra bla taseddast(formatting) n wiki",
-       "nowiki_tip": "Ur tawi x taseddast(formatting) n wiki",
-       "image_tip": "Afaylu war-itmesebḍi",
-       "media_tip": "Tazdayt ufaylu",
-       "sig_tip": "Azewl(signature) inec ag ukud(time) .",
-       "hr_tip": "Acariḍ aglawan",
        "summary": "ⵜⵓⴳⵣⵉⵍⵜ:",
        "subject": "ⴰⵙⵏⵜⵍ:",
        "minoredit": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
index 3f846d0..930de34 100644 (file)
        "changeemail-none": "(nagina)",
        "changeemail-password": "Tes pled-clav da {{SITENAME}}:",
        "changeemail-submit": "Midar l'adressa dad e-mail",
-       "bold_sample": "Text grass",
-       "bold_tip": "Text grass",
-       "italic_sample": "Text cursiv",
-       "italic_tip": "Text cursiv",
-       "link_sample": "Titel da la colliaziun",
-       "link_tip": "Colliaziun interna",
-       "extlink_sample": "http://www.example.com link title",
-       "extlink_tip": "Link extern (betg emblidar il prefix http:// )",
-       "headline_sample": "Titel",
-       "headline_tip": "Titel da segund livel",
-       "nowiki_sample": "Scriva qua text che na duai betg vegnir formatà",
-       "nowiki_tip": "Ignorar las formataziuns vichi",
-       "image_sample": "Exempel.jpg",
-       "image_tip": "Integrar ina datoteca",
-       "media_tip": "Colliaziun ad ina datoteca",
-       "sig_tip": "Tia suttascripziun cun data e temp",
-       "hr_tip": "Lingia orizontala (betg utilisar savens!)",
        "summary": "Resumaziun:",
        "subject": "Object:",
        "minoredit": "Midà be bagatellas",
index d08a6bc..6cc866d 100644 (file)
@@ -39,7 +39,8 @@
                        "WebSourceContentRO",
                        "MSClaudiu",
                        "Lucdrei",
-                       "Moyogo"
+                       "Moyogo",
+                       "GabiBil"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "resettokens-watchlist-token": "Jeton pentru fluxul web (Atom/RSS) al [[Special:Watchlist|modificărilor aduse paginilor pe care le urmăriți]]",
        "resettokens-done": "Jetoane resetate.",
        "resettokens-resetbutton": "Resetează jetoanele selectate",
-       "bold_sample": "Text aldin",
-       "bold_tip": "Text aldin",
-       "italic_sample": "Text cursiv",
-       "italic_tip": "Text cursiv",
-       "link_sample": "Titlul legăturii",
-       "link_tip": "Legătură internă",
-       "extlink_sample": "http://www.example.com titlul legăturii",
-       "extlink_tip": "Legătură externă (nu uitați prefixul http://)",
-       "headline_sample": "Text de titlu",
-       "headline_tip": "Titlu de nivel 2",
-       "nowiki_sample": "Introduceți text neformatat aici",
-       "nowiki_tip": "Ignoră formatarea wiki",
-       "image_sample": "Exemplu.jpg",
-       "image_tip": "Fișier inserat",
-       "media_sample": "Exemplu.ogg",
-       "media_tip": "Legătură la fișier",
-       "sig_tip": "Semnătura dumneavoastră datată",
-       "hr_tip": "Linie orizontală (folosiți-o cumpătat)",
        "summary": "Rezumat:",
        "subject": "Subiect / titlu:",
        "minoredit": "Aceasta este o modificare minoră",
        "userinvalidconfigtitle": "<strong>Avertizare:</strong> Nu există skinul „$1”.\nPaginile .css, .json și .js specifice utilizatorilor au titluri care încep cu literă mică; de exemplu {{ns:user}}:Foo/vector.css în loc de {{ns:user}}:Foo/Vector.css.",
        "updated": "(Actualizat)",
        "note": "'''Notă:'''",
-       "previewnote": "'''Țineți cont că aceasta este doar o previzualizare.'''\nModificările dumneavoastră nu au fost încă salvate!",
+       "previewnote": "<strong>Țineți cont că aceasta este doar o previzualizare.</strong>\nModificările dumneavoastră nu au fost încă salvate!",
        "continue-editing": "Mergi la zona de editare",
        "previewconflict": "Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.",
        "session_fail_preview": "Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.\n\nEste posibil să vă fi deconectat. <strong>Vă rugăm să verificați dacă sunteți încă conectat și să încercați din nou</strong>.\nDacă tot nu funcționează, încercați să [[Special:UserLogout|închideți sesiunea]] și să vă autentificați din nou. Verificați și dacă navigatorul dumneavoastră permite module cookie de la acest site.",
        "rcfilters-filter-showlinkedto-label": "Arată schimbările din paginile ce trimit la",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Pages ce trimit la</strong> pagina selectată",
        "rcfilters-target-page-placeholder": "Introduceți numele unei pagini (sau categorii)",
+       "rcfilters-allcontents-label": "Tot conținutul",
+       "rcfilters-alldiscussions-label": "Toate discuțiile",
        "rcnotefrom": "Dedesubt {{PLURAL:$5|se află o modificare|sunt modificările}} începând cu <b>$3, $4</b> (maximum <b>$1</b> afișate).",
        "rclistfromreset": "Resetați selectarea datei",
        "rclistfrom": "Afișează modificările începând cu $3, ora $2",
        "sessionfailure": "Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva furtului sesiunii. Vă rugăm să trimiteți formularul din nou.",
        "changecontentmodel": "Modificare model de conținut al unei pagini",
        "changecontentmodel-legend": "Modifică modelul de conținut",
-       "changecontentmodel-title-label": "Titlul paginii",
+       "changecontentmodel-title-label": "Titul paginii:",
        "changecontentmodel-current-label": "Modelul de conținut curent:",
-       "changecontentmodel-model-label": "Model de conținut nou",
+       "changecontentmodel-model-label": "Model de conținut nou:",
        "changecontentmodel-reason-label": "Motiv:",
        "changecontentmodel-submit": "Schimbă",
        "changecontentmodel-success-title": "Modelul de conținut a fost modificat",
index a55c17d..59c63b7 100644 (file)
@@ -34,7 +34,7 @@
        "tog-watchrollback": "Aggiunge le pàggene addò agghie fatte 'n'annullamende jndr'à l'elenghe de le pàggene condrollate",
        "tog-minordefault": "Pe convenzione signe tutte le cangiaminde cumme stuédeche",
        "tog-previewontop": "Fa vedè l'andeprime apprime d'a caselle de le cangiaminde",
-       "tog-previewonfirst": "Fà vedè l'andeprime sus a 'u prime cangiamende",
+       "tog-previewonfirst": "Fà 'ndrucà l'andeprime sus a 'u prime cangiamende",
        "tog-enotifwatchlistpages": "Manneme 'na mail quanne 'a pàgene ca stoche a condrolle ha cangiate",
        "tog-enotifusertalkpages": "Manneme 'na mail quanne 'a pàgene de le 'ngazzaminde ha cangiate",
        "tog-enotifminoredits": "Manneme 'na mail quanne onne state fatte cangiaminde stuèdeche sus a le pàggene",
        "tog-watchlisthidepatrolled": "Scunne le cangiaminde condrollate jndr'à l'elenghe de le pàggene condrollate",
        "tog-watchlisthidecategorization": "Scunne 'a categorizzazzione d'a vôsce",
        "tog-ccmeonemails": "Manneme 'na copie de le mail ca je manne a l'ôtre utinde",
-       "tog-diffonly": "No fà vedè le pàggene cu le condenute sotte a le differenze",
+       "tog-diffonly": "No fà 'ndrucà le pàggene cu le condenute sotte a le differenze",
        "tog-showhiddencats": "Fa vedè le categorije scunnute",
        "tog-norollbackdiff": "Non sce penzanne a le differenze apprisse l'esecuzione de 'nu rollback",
        "tog-useeditwarning": "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
        "tog-prefershttps": "Ause sembre 'na connessione secure quanne trase",
        "tog-showrollbackconfirmation": "Fà 'ndrucà 'na richieste de conferme quanne ste cazze sus a 'nu collegamende de annullamende",
+       "tog-requireemail": "Richeiste email pe l'azzeramende d'a passuord",
        "underline-always": "Sembre",
        "underline-never": "Maje",
        "underline-default": "Valore de default d'u browser o scheme",
        "printableversion": "Versione ca se stambe",
        "permalink": "Collegamende ca remane pe sembre",
        "print": "Stambe",
-       "view": "Vide",
+       "view": "'Ndruche",
        "view-foreign": "'Ndruche sus a $1",
        "edit": "Cange",
        "edit-local": "Cange 'a descrizione locale",
        "create-local": "Aggiunge 'a descrizione locale",
        "delete": "Scangìlle",
        "undelete_short": "Annulle {{PLURAL:$1|'nu camgiamende|$1 cangiaminde}}",
-       "viewdeleted_short": "Vide {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
+       "viewdeleted_short": "'Ndruche {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
        "protect": "Prutette",
        "protect_change": "cange",
        "unprotect": "Cange 'a protezione",
        "tool-link-userrights": "Cange le gruppe {{GENDER:$1|utinde}}",
        "tool-link-userrights-readonly": "'Ndruche le gruppe {{GENDER:$1|utinde}}",
        "tool-link-emailuser": "Manne 'na mail a stu {{GENDER:$1|utende}}",
-       "imagepage": "Vide a pàgene de le file",
-       "mediawikipage": "Vide a pàgene de le messàgge",
-       "templatepage": "Vide a pàgene de le template",
-       "viewhelppage": "Vide a pàgene de l'ajute",
-       "categorypage": "Vide a pàgene de le categorije",
-       "viewtalkpage": "Vide le 'ngazzaminde",
+       "imagepage": "'Ndruche 'a pàgene de le file",
+       "mediawikipage": "'Ndruche 'a pàgene de le messàgge",
+       "templatepage": "'Ndruche 'a pàgene de le template",
+       "viewhelppage": "'Ndruche 'a pàgene de l'ajute",
+       "categorypage": "'Ndruche 'a pàgene de le categorije",
+       "viewtalkpage": "'Ndruche le 'ngazzaminde",
        "otherlanguages": "Jndr'à l'otre lènghe",
        "redirectedfrom": "(Riderette da $1)",
        "redirectpagesub": "Pàgene de redirezione",
        "viewsourcelink": "vide 'u sorgende",
        "editsectionhint": "Cange 'a sezione: $1",
        "toc": "Condenute",
-       "showtoc": "fà vedè",
+       "showtoc": "fà 'ndrucà",
        "hidetoc": "scunne",
        "collapsible-collapse": "Scunne",
        "collapsible-expand": "Spanne",
        "createaccountmail": "Ause 'na passuord temboranèe a uecchije e mannale a l'indirizze email specificate",
        "createaccountmail-help": "Pò essere ausate pe ccrejà 'n'utende pe 'n'otre crestiane senze ca adda canoscere 'a passuord.",
        "createacct-realname": "Nome vere (opzionale)",
-       "createacct-reason": "Mutive",
+       "createacct-reason": "Mutive (archiviate pubblecamende)",
        "createacct-reason-ph": "Purcé tu ste ccreje 'n'otre cunde utende?",
        "createacct-reason-help": "Messàgge 'ndrucate jndr'à l'archivije d'a ccrejazzione de le utinde",
        "createacct-submit": "Ccreje 'u cunde utende tune",
        "resettokens-watchlist-token": "Gettone pu feed web (Atom/RSS) de [[Special:Watchlist|le cangiaminde de le pàggene condrollate]]",
        "resettokens-done": "Gettone azzerate.",
        "resettokens-resetbutton": "Azzere le gettone scacchiate",
-       "bold_sample": "Teste grascette",
-       "bold_tip": "Teste grascette",
-       "italic_sample": "Teste corsive",
-       "italic_tip": "Scritte in corsivo",
-       "link_sample": "Titele d'u collegamende",
-       "link_tip": "Collegamende 'nderne",
-       "extlink_sample": "http://www.example.com Nome d'u collegamende",
-       "extlink_tip": "Collegamende de fore a Uicchipedie (arrecuerdete 'u prefisse http://)",
-       "headline_sample": "Teste d'a Testete",
-       "headline_tip": "Levèlle 2 tèstete",
-       "nowiki_sample": "Mitte 'u teste non formattate aqquà",
-       "nowiki_tip": "No scè penzanne 'a formattazione de Uicchi",
-       "image_sample": "Esembie.jpg",
-       "image_tip": "File ingapsulete",
-       "media_sample": "Esembie.ogg",
-       "media_tip": "File de collegamende",
-       "sig_tip": "'A firma toje cu l'orarie e 'a sciurnete",
-       "hr_tip": "Linee orizzondele (ausele picche)",
        "summary": "Riepileghe:",
        "subject": "Oggette:",
        "minoredit": "Cangiaminde stuèdeche",
        "nocreate-loggedin": "Non ge tine le permesse pe ccreja pàggene nuève.",
        "sectioneditnotsupported-title": "Sezione de le cangiaminde none supportate",
        "sectioneditnotsupported-text": "Sezione de le cangiaminde non g'è supportate sus a sta pàgene de cangiaminde.",
+       "modeleditnotsupported-title": "'U cangiamende non g'è supportate",
+       "modeleditnotsupported-text": "'U cangiamende non g'è supportate pu modelle de condenute $1.",
        "permissionserrors": "Errore de permesse",
        "permissionserrorstext": "Tu non ge tine 'u permesse pe fà ste cose, pe {{PLURAL:$1|stu mutive|ste mutive}}:",
        "permissionserrorstext-withaction": "Tu non ge tine 'u permesse pe $2, pe {{PLURAL:$1|stu mutive|ste mutive}}:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggette vacande",
        "content-json-empty-array": "Matrice vacande",
+       "unsupported-content-model": "<strong>Attenziò:</strong> 'u modelle de condenute $1 non g'è supportate jndr'à sta uicchi.",
+       "unsupported-content-diff": "Le differenze non ge sò supportate pu modelle de condenute $1.",
+       "unsupported-content-diff2": "Le differenze 'mbrà le modelle de condenute $1 e $2 non ge sò supportate sus a sta uicchi.",
        "deprecated-self-close-category": "Lè pàggene ca ausane le tag HTML auto-achiuse invalide",
        "duplicate-args-warning": "<strong>Attenziò:</strong> [[:$1]] ste chiame [[:$2]] cu cchiù de 'nu valore pu parametre \"$3\". Sulamende l'urteme valore date avène ausate.",
        "duplicate-args-category": "Pàggene ca ausane le argumende a doppie jndr'à le chiamate d'u template",
        "rev-deleted-diff-view": "Une de le revisiune de sta differenze ha state '''scangellate'''.\nTu puè vedè ste differenze; pò essere ca stonne cchiù 'mbormaziune jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivie de le scangellaminde].",
        "rev-suppressed-diff-view": "Une de le revisiune de sta differenze ha state '''soppresse'''.\nTu puè vedè ste differenze; pò essere ca stonne cchiù 'mbormaziune jndr'à l'[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} archivie de le soppressiune].",
        "rev-delundel": "fa vedè/scunne",
-       "rev-showdeleted": "fà vedè",
+       "rev-showdeleted": "fà 'ndrucà",
        "revisiondelete": "Scangille/Repristine revisiune",
        "revdelete-nooldid-title": "Revisione de destinazione invalida",
        "revdelete-nooldid-text": "Tu non g'è specificate 'na revisione de arrive pe abbilità sta funzione, o a specifica revisione non g'esiste oppure tu stè pruève a scunnè 'a revisiona corrende.",
        "mergehistory-into": "Pàgene de destinazione:",
        "mergehistory-list": "cangiamende d'a storie scuagghiabbele",
        "mergehistory-merge": "Le seguende revisiune de [[:$1]] ponne essere scuagghiate jndr'à [[:$2]].\nAuse 'a coulonne cu le radio buttone pe scacchià de scuagghià le revisiune ccrejate apprime de n'nu certe mumende.\nVide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzerate.",
-       "mergehistory-go": "Fà vedè le cangiaminde ca se ponne squagghià 'nzieme",
+       "mergehistory-go": "Fà 'ndrucà le cangiaminde ca se ponne squagghià 'nzieme",
        "mergehistory-submit": "Scuagghije 'nzieme le revisiune",
        "mergehistory-empty": "Nisciuna revisione pò essere scuagghiate.",
        "mergehistory-done": "$3 {{PLURAL:$3|revisione|revisiune}} de $1 {{PLURAL:$3|ha|onne}} state scuagghiate jndr'à [[:$2]].",
        "difference-multipage": "(Differenze 'mbrà le pàggene)",
        "lineno": "Linea $1:",
        "compareselectedversions": "Combronde le versiune selezionete",
-       "showhideselectedversions": "Fà vedè/scunne le revisiune selezionate",
+       "showhideselectedversions": "Fà 'ndrucà/scunne le revisiune scacchiate",
        "editundo": "annulle",
        "diff-empty": "(Nisciuna differenze)",
        "diff-multi-sameuser": "({{PLURAL:$1|'Na revisione de mmienze|$1 revisiune de mmienze}} da 'u stesse utende non g'avènene fatte vedè)",
        "next-page": "pàgena successive",
        "prevn-title": "Precedende $1 {{PLURAL:$1|resultete|resultete}}",
        "nextn-title": "Successive $1 {{PLURAL:$1|resultete|resultete}}",
-       "shown-title": "Fà vedè le $1 {{PLURAL:$1|resultete|resultete}} pe pàgene",
+       "shown-title": "Fà 'ndrucà le $1 {{PLURAL:$1|resultate}} pe pàgene",
        "viewprevnext": "Vide ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Stè 'na pàgene nnumenete \"[[$1]]\" sus 'a sta Uicchipèdie'''",
        "searchmenu-new": "<strong>[[:$1|Ccreje]] 'a pàgene \"[[:$1|$1]]\" sus 'a sta Uicchipèdie!</strong> 'Ndruche pure {{PLURAL:$2|0=|'a pàgene acchiate cu 'a ricerca toje.|le resultate acchiate da 'a ricerche.}}",
        "prefs-editwatchlist-edit": "'Ndruche e live le titole da l'elenghe de le pàggene condrollate",
        "prefs-editwatchlist-raw": "Cange 'a liste de le pàggene condrollate grezze",
        "prefs-editwatchlist-clear": "Sdevache l'elenghe de le pàggene condrollate tune",
-       "prefs-watchlist-days": "Giurne da fà vedè jndr'à liste de le pàggene condrollete:",
+       "prefs-watchlist-days": "Sciurne da fà 'ndrucà jndr'à l'elenghe de le pàggene condrollate:",
        "prefs-watchlist-days-max": "Massime $1 {{PLURAL:$1|sciurne|sciurne}}",
        "prefs-watchlist-edits": "Numere massime de cangiaminde ca se ponne fa 'ndrucà jndr'à l'lenghe de le pàggene condrollate:",
        "prefs-watchlist-edits-max": "Numere massime: 1000",
        "stub-threshold": "Soglie pe collegamende stub de formattazione ($1):",
        "stub-threshold-sample-link": "esembie",
        "stub-threshold-disabled": "Disabbilitate",
-       "recentchangesdays": "Sciurne da fà vedè jndr'à le cangiaminde recende:",
+       "recentchangesdays": "Sciurne da fà 'ndrucà jndr'à le cangiaminde recende:",
        "recentchangesdays-max": "(massime $1 {{PLURAL:$1|sciurne|sciurne}})",
-       "recentchangescount": "Numere de cangiaminde da fà vedè pe default:",
+       "recentchangescount": "Numere de cangiaminde da fà 'ndrucà pe default:",
        "prefs-help-recentchangescount": "Numere massime: 1000",
        "prefs-help-watchlist-token2": "Queste jè 'a chiave segrete a le feed d'u web de l'elenghe de le pàggene condrollate tune.\nCengate vò ccu canosce ce pò leggere l'elenghe de le pàggene condrollate tune, accussì non g'ù pò condividere.\nCe è abbesogne, [[Special:ResetTokens|'u puè azzerà]].",
        "savedprefs": "Le preferenze tue onne state aggiornete.",
        "yourrealname": "Nome vere:",
        "yourlanguage": "Lènga:",
        "yourvariant": "Variande d'u condenute d'a lènghe:",
-       "prefs-help-variant": "Tu preferisce variande o ortografije da fà vedè le vôsce de sta uicchi.",
+       "prefs-help-variant": "Tu preferisce variande o ortografije da fà 'ndrucà le vôsce de sta uicchi.",
        "yournick": "Firma toje:",
        "prefs-help-signature": "Le commende sus a le pàggene de le 'ngazzaminde avessere a essere sgnate cu \"<nowiki>~~~~</nowiki>\" ca pò avène convertite cu 'a firma toje e l'orarie.",
        "badsig": "'A firme grezze jè sbagliete.\nCondrolle le tag HTML.",
        "prefs-advancedrendering": "Opzione avanzate",
        "prefs-advancedsearchoptions": "Opzione avanzate",
        "prefs-advancedwatchlist": "Opzione avanzate",
-       "prefs-displayrc": "Fà vedè l'opzione",
-       "prefs-displaywatchlist": "Fà vedè l'opzione",
+       "prefs-displayrc": "Fà 'ndrucà l'opzione",
+       "prefs-displaywatchlist": "Fà 'ndrucà l'opzione",
        "prefs-changesrc": "Cangiaminde fatte 'ndrucà",
        "prefs-changeswatchlist": "Cangiaminde fatte 'ndrucà",
        "prefs-pageswatchlist": "Pàggene ca ste condrolle",
        "rcfilters-exclude-button-off": "Scitte le scacchiate",
        "rcfilters-exclude-button-on": "Scettanne le scacchiate",
        "rcfilters-view-tags": "Cangiaminde taggate",
+       "rcfilters-view-namespaces-tooltip": "Filtre le resultate pe namespace",
+       "rcfilters-view-tags-tooltip": "Filtre le resultate ausanne le tag de cangiamende",
+       "rcfilters-view-return-to-default-tooltip": "Tuèrne a 'u menu de le filtre prengepàle",
        "rcfilters-liveupdates-button": "Aggiornaminde in tiembe reale",
        "rcfilters-liveupdates-button-title-on": "Stute le aggiornaminde automatece",
        "rcfilters-watchlist-markseen-button": "Signe tutte le cangiaminde cumme 'ndrucate",
        "rcfilters-allcontents-label": "Tutte le condenute",
        "rcfilters-alldiscussions-label": "Tutte le 'ngazzaminde",
        "rcnotefrom": "Sotte {{PLURAL:$5|ste 'u cangiamende|stonne le cangiaminde}} da <strong>$3, $4</strong> ('nzigne a <strong>$1</strong> fatte vedè).",
-       "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $3 $2",
+       "rclistfrom": "Fà 'ndrucà le urteme cangiaminde partenne da $2, $3",
        "rcshowhideminor": "$1 cangiaminde stuèdeche",
-       "rcshowhideminor-show": "Fà vedè",
+       "rcshowhideminor-show": "Fà 'ndrucà",
        "rcshowhideminor-hide": "Scunne",
        "rcshowhidebots": "$1 bot",
-       "rcshowhidebots-show": "Fà vedè",
+       "rcshowhidebots-show": "Fà 'ndrucà",
        "rcshowhidebots-hide": "Scunne",
        "rcshowhideliu": "$1 utinde reggistrate",
-       "rcshowhideliu-show": "Fà vedè",
+       "rcshowhideliu-show": "Fà 'ndrucà",
        "rcshowhideliu-hide": "Scunne",
        "rcshowhideanons": "$1 utende scanusciute",
-       "rcshowhideanons-show": "Fà vedè",
+       "rcshowhideanons-show": "Fà 'ndrucà",
        "rcshowhideanons-hide": "Scunne",
        "rcshowhidepatr": "$1 cangiaminde condrollete",
-       "rcshowhidepatr-show": "Fà vedè",
+       "rcshowhidepatr-show": "Fà 'ndrucà",
        "rcshowhidepatr-hide": "Scunne",
        "rcshowhidemine": "$1 cangiaminde mie",
-       "rcshowhidemine-show": "Fà vedè",
+       "rcshowhidemine-show": "Fà 'ndrucà",
        "rcshowhidemine-hide": "Scunne",
        "rcshowhidecategorization": "$1 categorizzazzione d'a pàgene",
        "rcshowhidecategorization-show": "Fà 'ndrucà",
        "diff": "diff",
        "hist": "cunde",
        "hide": "Scunne",
-       "show": "Fà vedè",
+       "show": "Fà 'ndrucà",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|byte}} apprisse 'u cangiamende",
        "newsectionsummary": "/* $1 */ seziona nove",
-       "rc-enhanced-expand": "Fà vedè le dettaglie",
+       "rc-enhanced-expand": "Fà 'ndrucà le dettaglie",
        "rc-enhanced-hide": "Scunne le dettaglie",
        "rc-old-title": "origgenariamende ccreajate cumme \"$1\"",
        "recentchangeslinked": "Cangiaminde culleghete",
        "listfiles-userdoesnotexist": "Nome utende \"$1\" non g'è reggistrate.",
        "imgfile": "file",
        "listfiles": "Liste de le fail",
+       "listfiles_subpage": "Carecaminde da $1",
        "listfiles_thumb": "Miniature",
        "listfiles_date": "Sciurne",
        "listfiles_name": "Nome",
        "pageswithprop-prophidden-long": "valore d'a probbietà d'u teste lunghe scunnute ($1)",
        "pageswithprop-prophidden-binary": "valore probbietà binarie scunnute ($1)",
        "doubleredirects": "Ridirezionaminde a doppie",
-       "doubleredirectstext": "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.\nOgne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà vedè addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.\nLe situaziune de <del>ingrocie</del> onne state resolte.",
+       "doubleredirectstext": "Sta pàgene elenghe le pàggene ca se ridirezionane sus a otre pàggene de ridirezionaminde.\nOgne righe condene 'nu collegamende a 'u prime e a 'u seconde ridirezionamende pe fà 'ndrucà addò arrive 'u seconde ridirezionamende, 'u quale jè normalmende 'a pàgena de destinaziona \"rèale\", addò 'u prime ridirezionamende avesse appondà.\nLe situaziune de <del>ingrocie</del> onne state resolte.",
        "double-redirect-fixed-move": "[[$1]] ha state spustate.\nAvène aggiornate automaticamende e mò s'avène redirette a [[$2]].",
        "double-redirect-fixed-maintenance": "Aggiuste le doppie redirezionaminde da [[$1]] a [[$2]] jndr'à 'na fatije de manutenzione",
        "double-redirect-fixer": "Correttore de redirezionaminde",
        "withoutinterwiki": "Pàggene senza collegaminde a otre Uicchi",
        "withoutinterwiki-summary": "Le pàggene seguende non ge sonde collegate a nisciuna otra versione de lènghe diverse.",
        "withoutinterwiki-legend": "Prefisse",
-       "withoutinterwiki-submit": "Fà vedè",
+       "withoutinterwiki-submit": "Fà 'ndrucà",
        "fewestrevisions": "Pàggene cu mene cangiaminde",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|categorije|categorije}}",
        "protectedtitlesempty": "Nisciune titele jè pe mò prutette cu ste parametre.",
        "protectedtitles-submit": "Fà 'ndrucà le titole",
        "listusers": "Liste de l'utende",
-       "listusers-editsonly": "Fà vedè sulamende l'utinde cu cangiaminde fatte",
+       "listusers-editsonly": "Fà 'ndrucà sulamende l'utinde cu cangiaminde fatte",
        "listusers-temporarygroupsonly": "Fà 'ndrucà sulamende le utinde jndr'à le gruppe de utinde temboranèe",
        "listusers-creationsort": "Arrenghete pe date de ccreazione",
        "listusers-desc": "Arranghe jndr'à 'n'ordine ca scenne",
        "alllogstext": "Visualizzazione combinate de tutte le archivije disponibbele sus a {{SITENAME}}.\nTu puè restringere 'a viste selezionanne 'u tipe de archivije, 'u nome utende (senzibbile a le maiuscole), o le pàggene coinvolte (pure chiste senzibbile a le maiuscole).",
        "logempty": "Non ge stè 'n'anema de priatorie jndr'à l'archivije.",
        "log-title-wildcard": "Cirche le titele ca accumenzene cu stu teste",
-       "showhideselectedlogentries": "Fà vedè/scunne le righe scacchiate de l'archivije",
+       "showhideselectedlogentries": "Fà 'ndrucà/scunne le righe scacchiate de l'archivije",
        "log-edit-tags": "Cange le tag de 'na vôsce de l'archivije scacchiate",
        "checkbox-select": "Scacchie: $1",
        "checkbox-all": "Tutte",
        "allpages": "Tutte le pàggene",
        "nextpage": "Pàgene apprisse ($1)",
        "prevpage": "Pàgene apprime ($1)",
-       "allpagesfrom": "Fà vedè le pàggene partenne da:",
-       "allpagesto": "Fà vedè pàggene ca spiccene 'u:",
+       "allpagesfrom": "Fà 'ndrucà le pàggene partenne da:",
+       "allpagesto": "Fà 'ndrucà pàggene ca spiccene 'u:",
        "allarticles": "Tutte le pàggene",
        "allinnamespace": "Tutte le pàggene (neimspeise $1)",
        "allpagessubmit": "Veje",
        "categories": "Le Categorije",
        "categories-submit": "Fà 'ndrucà",
        "categoriespagetext": "{{PLURAL:$1|'A seguende categorije tène|Le seguende categorije tènene}} pàggene o media.\n'Ndruche pure [[Special:WantedCategories|Categorije cercate]].",
-       "categoriesfrom": "Fà vedè le categorije partenne da:",
+       "categoriesfrom": "Fà 'ndrucà le categorije partenne da:",
        "deletedcontributions": "Condrebbute de l'utende scangellete",
        "deletedcontributions-title": "Condrebbute de l'utende scangellate",
        "sp-deletedcontributions-contribs": "condrebbute",
        "linksearch-text": "Le wildcard cumme a \"*.wikipedia.org\" ponne essere ausate.<br />\nOnne abbesogne almene de 'nu dominie de levèlle ierte, pe esembie \"*.org\". <br />\n{{PLURAL:$2|Protocolle}} supportate: $1 ('u valore de base jè http:// ce 'u protocolle non g'è specificate).",
        "linksearch-line": "$1 jè pundete da $2",
        "linksearch-error": "Le wildcard ponne essere ausate sulamende a l'inzie de l'hostname.",
-       "listusersfrom": "Fà vedè l'utinde partenne da:",
+       "listusersfrom": "Fà 'ndrucà l'utinde partenne da:",
        "listusers-submit": "Fa vedè",
        "listusers-noresult": "Nisciune utende acchiete.",
        "listusers-blocked": "(bloccate)",
        "activeusers": "Liste de l'utinde attive",
        "activeusers-intro": "Queste jè 'n'elenghe de utinde ca avene fatte certe tipe de attività fine a l'urteme $1 {{PLURAL:$1|sciurne|sciurne}}.",
        "activeusers-count": "$1 {{PLURAL:$1|cangiamende|cangiaminde}} jndr'à l'urteme {{PLURAL:$3|sciurne}}",
-       "activeusers-from": "Fà vedè l'utinde partenne da:",
+       "activeusers-from": "Fà 'ndrucà l'utinde partenne da:",
        "activeusers-noresult": "Nisciune utende acchiate.",
        "listgrouprights": "Deritte de le gruppe utinde",
        "listgrouprights-summary": "'A liste ca ste vide ète 'na liste de le gruppe utinde ccreiate sus a sta Uicchi, cu le lore deritte d'accesse associate.\nPonne stà [[{{MediaWiki:Listgrouprights-helppage}}|'mbormaziune de cchiù]] sus a le deritte individuale.",
        "wlshowhidemine": "cangiaminde mie",
        "wlshowhidecategorization": "categorizzazzione d'a pàgene",
        "watchlist-options": "Opzione d'a liste de le pàggene condrollete",
-       "watching": "Fà vedè...",
-       "unwatching": "No fà vedè...",
+       "watching": "Fà 'ndrucà...",
+       "unwatching": "No fà 'ndrucà...",
        "watcherrortext": "'N'errore s'a verificate quanne ste cangiave le 'mbostaziune de le pàggene condrollate pe \"$1\".",
        "enotif_reset": "Signe tutte le pàggene cumme visitete",
        "enotif_impersonal_salutation": "Utende de {{SITENAME}}",
        "undelete-header": "Vide [[Special:Log/delete|l'archivije de le scangellaminde]] pe l'urteme pàggene scangellete.",
        "undelete-search-title": "Cirche le pàggene scangellate",
        "undelete-search-box": "Cirche le pàggene scangellete",
-       "undelete-search-prefix": "Fà vedè le pàggene ca accumenzene cu:",
+       "undelete-search-prefix": "Fà 'ndrucà le pàggene ca accumenzene cu:",
        "undelete-search-submit": "Cirche",
        "undelete-no-results": "Non ge stonne pàggene acchiate jndr'à l'archivije de le scangellaminde.",
        "undelete-filename-mismatch": "Non ge pozze repristinà 'a revisione d'u file cu orarie $1: nome d'u file errate",
        "sp-contributions-search": "Ricerche pe condrebbute",
        "sp-contributions-username": "Indirizze IP o nome de l'utende:",
        "sp-contributions-toponly": "Sulamende facenne vedè le cangiaminde de l'urteme revisiune",
-       "sp-contributions-newonly": "Fà vedè sulamende le cangiaminde ca onne ccrejate 'a pàgene",
+       "sp-contributions-newonly": "Fà 'ndrucà sulamende le cangiaminde ca onne ccrejate 'a pàgene",
        "sp-contributions-hideminor": "Scunne le cangiaminde stuèdeche",
        "sp-contributions-submit": "Cirche",
        "whatlinkshere": "Appondene aqquà",
        "ipblocklist-legend": "Iacchije 'n'utende blocchete",
        "blocklist-userblocks": "Scunne le blocche sus a le cunde de l'utinde",
        "blocklist-tempblocks": "Scunne le blocche temboranèe",
+       "blocklist-indefblocks": "Scunne le blocche indefinite",
        "blocklist-addressblocks": "Scunne le blocche de le IP singole",
        "blocklist-type": "Tipe:",
        "blocklist-type-opt-all": "Tutte",
        "thumbnail_image-type": "Tipe de immaggine non supportate",
        "thumbnail_gd-library": "Configurazione d'a libbrerie GD ingomblete: funziona perse $1",
        "thumbnail_image-missing": "'U file pare ca non ge se iacchie: $1",
-       "thumbnail_image-failure-limit": "Onne state fatte 'nu sacche de tendative ($1 o de cchiù) pe fà vedè sta miniature. Pe piacere pruéve cchiù tarde.",
+       "thumbnail_image-failure-limit": "Onne state fatte 'nu sacche de tendative ($1 o de cchiù) pe fà 'ndrucà sta miniature. Pe piacere pruéve cchiù tarde.",
        "import": "Pàggene 'mbortete",
        "importinterwiki": "'Mborte da 'n'otra uicchi",
        "import-interwiki-text": "Schacchie 'na Uicchi e 'nu titole de pàgene da 'mbortà.\nLe date d'a revisione e 'u nome de le cangiature avènene preservate.\nTutte le aziune de 'mbortaziune 'mbrà le Uicchi sonde reggistrate jndr'à l'[[Special:Log/import|archivije de le 'mbortaziune]].",
        "tooltip-ca-nstab-project": "Vide 'a pàgene d'u proggette",
        "tooltip-ca-nstab-image": "Vide 'a pàgene d'u fail",
        "tooltip-ca-nstab-mediawiki": "Vide le messàgge d'u sisteme",
-       "tooltip-ca-nstab-template": "Fà vedè 'u template",
+       "tooltip-ca-nstab-template": "Fà 'ndrucà 'u template",
        "tooltip-ca-nstab-help": "Vide 'a pàgene d'ajute",
        "tooltip-ca-nstab-category": "Vide a pàgene de le categorije",
        "tooltip-minoredit": "Signe cumme a 'nu cangiaminde stuèdeche",
        "tooltip-save": "Reggistre le cangiaminde ca è fatte",
        "tooltip-publish": "Pubbleche le cangiaminde tune",
        "tooltip-preview": "Fà l'andeprime de le cangiaminde ca ste face. Pe piacere falle prima cu reggistre 'a vôsce!",
-       "tooltip-diff": "Fà vedè ce cangiaminde e fatte a 'u teste.",
+       "tooltip-diff": "Fà 'ndrucà ce cangiaminde e fatte a 'u teste.",
        "tooltip-compareselectedversions": "Vide le differenze 'mbrà le doje versiune selezionete de sta pàgene.",
        "tooltip-watch": "Mitte sta pàgene jndr'à liste de le pàggene condrollete",
        "tooltip-watchlistedit-normal-submit": "Live le titele",
        "pageinfo-header-edits": "Cunde de le cangiaminde",
        "pageinfo-header-restrictions": "Protezione d'a pàgene",
        "pageinfo-header-properties": "Probbietà d'a pàgene",
-       "pageinfo-display-title": "Fà vedè 'u titole",
+       "pageinfo-display-title": "Fà 'ndrucà 'u titole",
        "pageinfo-default-sort": "Chiave de ordenamende de base",
        "pageinfo-length": "Lunghezze d'a pàgene (in byte)",
        "pageinfo-namespace": "Namespace",
        "newimages-legend": "Filtre",
        "newimages-label": "Nome d'u fail (o 'nu stuezze de jidde):",
        "newimages-user": "Indirizze IP o nome de l'utende",
-       "newimages-showbots": "Fà vedè le scarecaminde da bot",
+       "newimages-showbots": "Fà 'ndrucà le scarecaminde da bot",
        "newimages-hidepatrolled": "Scunne le carecaminde condrollate",
        "newimages-mediatype": "Tipe de media:",
        "noimages": "Non ge stè ninde da vedè.",
        "watchlistedit-clear-submit": "Sdevache l'elenghe de le pàggene condrollate (Quiste jè permanende)",
        "watchlistedit-clear-done": "L'elenghe de le pàggene condrollate ha state sdevacate.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 titole ha state|$1 titole onne state}} luate:",
-       "watchlistedit-too-many": "Stonne troppe pàggene da fà vedè aqquà.",
+       "watchlistedit-too-many": "Stonne troppe pàggene da fà 'ndrucà aqquà.",
        "watchlisttools-clear": "Sdevache l'elenghe de le pàggene condrollate",
        "watchlisttools-view": "Vide le cangiaminde 'mbortande",
        "watchlisttools-edit": "Vide e cange le pàggene condrollete",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Live le commende",
        "expand_templates_remove_nowiki": "No fà vede le tag <nowiki> jndr'à 'u resultate",
-       "expand_templates_generate_xml": "Fà vedè l'arvule de l'analisi XML",
-       "expand_templates_generate_rawhtml": "Fà vedè l'HTML grezze",
+       "expand_templates_generate_xml": "Fà 'ndrucà l'arvule de l'analisi XML",
+       "expand_templates_generate_rawhtml": "Fà 'ndrucà  l'HTML grezze",
        "expand_templates_preview": "Andeprime",
        "expand_templates_preview_fail_html": "<em>Purcé {{SITENAME}} téne abbilitate l'HTML grezze e stavane 'nu sbuénne de date de sessione perdute, l'andeprime avène scunnute pe precauzione condre a attacche JavaScript.</em>\n\n<strong>Ce quiste jè 'nu tendative de andeprime leggittime, pe piacere pruéve arrete.</strong>\nCe angore non ge funzione, pruéve a [[Special:UserLogout|assè]] e trasè arrete e verifiche ca 'u browser tune face ausà le cookie da stu site.",
        "expand_templates_preview_fail_html_anon": "<em>Purcé {{SITENAME}} téne abbilitate l'HTML grezze e tu non g'è trasute, l'andeprime avène scunnute pe precauzione condre a attacche JavaScript.</em>\n\n<strong>Ce quiste jè 'nu tendative de andeprime leggittime, [[Special:UserLogin|tràse]] e pruéve arrete.</strong>",
index d6094cd..d3475a5 100644 (file)
                        "ЛингвоЧел",
                        "OlegVeliky",
                        "Saimongoltinio",
-                       "Wikisaurus"
+                       "Wikisaurus",
+                       "Katunchik"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "tog-useeditwarning": "Предупреждать, когда я покидаю страницу с несохранёнными изменениями",
        "tog-prefershttps": "Всегда использовать защищённое соединение после представления системе",
        "tog-showrollbackconfirmation": "Запрашивать подтверждение при нажатии ссылки для отката",
+       "tog-requireemail": "Требовать адрес электронной почты для сброса пароля",
        "underline-always": "Всегда",
        "underline-never": "Никогда",
        "underline-default": "Использовать настройки браузера",
        "createaccountmail": "Использовать сгенерированный случайным образом временный пароль и выслать его на указанный адрес электронной почты",
        "createaccountmail-help": "Может использоваться, чтобы создать учётную запись для другого лица, не узнавая пароль.",
        "createacct-realname": "Настоящее имя (необязательно)",
-       "createacct-reason": "Причина",
+       "createacct-reason": "Причина (публично видимая)",
        "createacct-reason-ph": "Зачем вы создаёте другую учётную запись",
        "createacct-reason-help": "Сообщение, отображаемое в журнале создания учётных записей",
        "createacct-submit": "Создать учётную запись",
        "resettokens-watchlist-token": "Токен для веб-канала (Atom/RSS)  [[Special:Watchlist|изменений страниц в вашем списке наблюдения]]",
        "resettokens-done": "Токены сброшены.",
        "resettokens-resetbutton": "Сбросить выбранные токены",
-       "bold_sample": "Полужирное начертание",
-       "bold_tip": "Полужирное начертание",
-       "italic_sample": "Курсивное начертание",
-       "italic_tip": "Курсивное начертание",
-       "link_sample": "Заголовок ссылки",
-       "link_tip": "Внутренняя ссылка",
-       "extlink_sample": "http://www.example.com заголовок ссылки",
-       "extlink_tip": "Внешняя ссылка (помните о префиксе http:// )",
-       "headline_sample": "Текст заголовка",
-       "headline_tip": "Заголовок 2-го уровня",
-       "nowiki_sample": "Вставьте сюда текст, который не нужно форматировать",
-       "nowiki_tip": "Игнорировать вики-форматирование",
-       "image_sample": "Пример.jpg",
-       "image_tip": "Встроенный файл",
-       "media_sample": "Пример.ogg",
-       "media_tip": "Ссылка на файл",
-       "sig_tip": "Ваша подпись и момент времени",
-       "hr_tip": "Горизонтальная линия (не используйте слишком часто)",
        "summary": "Описание изменений:",
        "subject": "Тема/заголовок:",
        "minoredit": "Малое изменение",
        "undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.",
        "undo-nochange": "Правка, похоже, уже была отменена.",
        "undo-summary": "Отмена правки $1, сделанной [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]])",
+       "undo-summary-anon": "Отмена версии $1 от [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто",
        "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса (<strong>$1</strong>) было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: <em>$2</em>.",
        "cantcreateaccount-range-text": "{{GENDER:$3|Участник|Участница}} [[User:$3|$3]] {{GENDER:$3|установил|установила}} запрет на создание учётных записей для диапазона IP-адресов <strong>$1</strong>, включающего ваш IP-адрес (<strong>$4</strong>). \n\nБыла указана следующая причина: <em>$2</em>.",
        "prefs-help-email": "Адрес почты не обязателен, но это единственный способ восстановить забытый пароль.",
        "prefs-help-email-others": "Он также позволит другим участникам связаться с вами по электронной почте с помощью ссылки на вашей персональной странице или на вашей странице обсуждения. При этом ваш адрес электронной почты не будет никому раскрыт.",
        "prefs-help-email-required": "Необходимо указать адрес электронной почты.",
+       "prefs-help-requireemail": "Если этот флажок установлен, электронные письма для сброса пароля будут отправляться только в том случае, если лицо, осуществляющее сброс, указало для этой учётной записи и имя пользователя, и адрес электронной почты.",
        "prefs-info": "Основные сведения",
        "prefs-i18n": "Интернационализация",
        "prefs-signature": "Подпись",
        "listfiles-userdoesnotexist": "Учётная запись «$1» не зарегистрирована.",
        "imgfile": "файл",
        "listfiles": "Список файлов",
+       "listfiles_subpage": "Загрузки $1",
        "listfiles_thumb": "Миниатюра",
        "listfiles_date": "Дата",
        "listfiles_name": "Имя файла",
        "alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[User:$3|$3]] ([[User talk:$3|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Было дано описание изменения: <em>$1</em>.",
        "revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
+       "revertpage-anon": "Откат правок [[Special:Contributions/$2|$2]] к последней версии от [[User:$1|$1]]",
        "revertpage-nouser": "Откат правок (имя участника скрыто) к версии {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Откачены правки {{GENDER:$3|$1}}; возвращена последняя версия {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Ошибка сеанса",
        "ipblocklist-legend": "Поиск заблокированного участника",
        "blocklist-userblocks": "Скрыть блокировки учётных записей",
        "blocklist-tempblocks": "Скрыть временные блокировки",
+       "blocklist-indefblocks": "Скрыть бессрочные блокировки",
        "blocklist-addressblocks": "Скрыть блокировки отдельных IP",
        "blocklist-type": "Тип:",
        "blocklist-type-opt-all": "Все",
        "mycustomjsredirectprotected": "У вас нет прав на редактирование этой JavaScript-страницы, так как она является перенаправлением и не указывает внутрь вашего пространства участника.",
        "easydeflate-invaliddeflate": "Предоставленное содержимое не спущено надлежащим образом",
        "unprotected-js": "По соображениям безопасности JavaScript нельзя загружать с незащищённых страниц. Пожалуйста, создавайте скрипты только в пространстве имён MediaWiki: или как подстраницы участника.",
-       "userlogout-continue": "Вы хотите выйти?"
+       "userlogout-continue": "Вы хотите выйти?",
+       "rest-prefix-mismatch": "Запрашиваемый путь ($1) не найден внутри корневого пути REST API ($2)",
+       "rest-wrong-method": "Метод запроса ($1) не был {{{{PLURAL:$3|}}|разрешенным методом для этого пути|одним из разрешенных методов для этого пути}} ($2)",
+       "rest-no-match": "Запрошенный относительный путь ($1) не соответствует ни одному известному обработчику"
 }
index 443cbff..a1a1d84 100644 (file)
        "resettokens-watchlist-token": "Кліч до вебового канала (Atom/RSS) [[Special:Watchlist|змін слїдованых сторінок]]",
        "resettokens-done": "Клічі были реініціалізованы.",
        "resettokens-resetbutton": "Реініціалізовати зволены клічі",
-       "bold_sample": "Товстый текст",
-       "bold_tip": "Шырокый текст",
-       "italic_sample": "Курсива",
-       "italic_tip": "Курсива",
-       "link_sample": "Назва одказу",
-       "link_tip": "Інтерный одказ",
-       "extlink_sample": "http://www.example.com назва одказу",
-       "extlink_tip": "Екстерный одказ (не забудьте http:// prefix)",
-       "headline_sample": "Текст надпису",
-       "headline_tip": "Надпис 2-го рівня",
-       "nowiki_sample": "Вложте ту неформатованый текст",
-       "nowiki_tip": "Іґноровати вікі-форматованя",
-       "image_tip": "Файл",
-       "media_tip": "Одказ на медіа-файл",
-       "sig_tip": "Ваш підпис з датумом і часом",
-       "hr_tip": "Горізонтална лінія (хоснуйте єй скупо)",
        "summary": "Куртый опис змін:",
        "subject": "Тема:",
        "minoredit": "Незначна зміна",
index 893d23d..a5f6c7c 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|भवतः/भवत्याः ध्यानसूच्याः परिवर्तनस्य]] जालपूर्तेः (Atom/RSS) चिह्नं",
        "resettokens-done": "चिह्नं परिवर्त्यताम्",
        "resettokens-resetbutton": "अङ्कितं चिह्नं परिवर्त्यताम्",
-       "bold_sample": "स्थूलाक्षराणि",
-       "bold_tip": "स्थूलाक्षराणि",
-       "italic_sample": "तिर्यक् अक्षरम्",
-       "italic_tip": "तिर्यक् अक्षरम्",
-       "link_sample": "परिसन्धेः शीर्षकम्",
-       "link_tip": "आन्तरिकसम्पर्कतन्तुः",
-       "extlink_sample": "http://www.example.com परिसन्धेः शीर्षकम्",
-       "extlink_tip": "बाह्यानुबन्धः (http:// पूर्वन्यासस्य अग्रे योजनीयम् इति स्मरतु)",
-       "headline_sample": "शीर्षकम्",
-       "headline_tip": "द्वितीयस्तरीयं शीर्षकम्",
-       "nowiki_sample": "अप्रारूपितं पाठम् अत्र निवेश्यताम्",
-       "nowiki_tip": "विकि-प्रारूपम् उपेक्ष्यताम्",
-       "image_sample": "उदाहरणम्.jpg",
-       "image_tip": "अन्तर्निहिता सञ्चिका",
-       "media_sample": "उदाहरणम्.ogg",
-       "media_tip": "सञ्चिकासम्बन्धः",
-       "sig_tip": "समयोल्लेखेन सह भवतः/भवत्याः हस्ताक्षरम्",
-       "hr_tip": "तिर्यक्-रेखा (भिन्नतया प्रयोक्तव्या)",
        "summary": "सारांशः :",
        "subject": "विषयः/शीर्षकम् :",
        "minoredit": "इदं लघु सम्पादनम्",
index 011a9e3..c52e670 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|Кэтиир сирэйдэриҥ уларыйыыларын]] ситим-ханаалын (Atom/RSS) токена",
        "resettokens-done": "Токен сотулунна.",
        "resettokens-resetbutton": "Талыллыбыты сот",
-       "bold_sample": "Модьу бичик",
-       "bold_tip": "Модьу бичик",
-       "italic_sample": "Иҥнэри бичик",
-       "italic_tip": "Иҥнэри бичик",
-       "link_sample": "Ыйынньык баһа",
-       "link_tip": "Ис ыйынньык",
-       "extlink_sample": "http://www.example.com ыйынньык баһа",
-       "extlink_tip": "Тас ыйынньык (http:// префиксы умнума)",
-       "headline_sample": "Бас тыл",
-       "headline_tip": "2-с таһым бас тыла",
-       "nowiki_sample": "Манна форматтамматах суругу киллэриҥ",
-       "nowiki_tip": "Биики формаатын билинимэ",
-       "image_sample": "Холобур.jpg",
-       "image_tip": "Ойууну олордуу",
-       "media_sample": "Холобур.ogg",
-       "media_tip": "Медиа билэҕэ сигэнии",
-       "sig_tip": "Илии баттааһыныҥ уонна хаһан илии баттаабытыҥ",
-       "hr_tip": "Туора сурааһын (наһаа элбэхтик туттума)",
        "summary": "Уларытыыҥ ис хоһооно:",
        "subject": "Тиэмэтэ:",
        "minoredit": "Бу суолтата суох уларытыы",
index d48829e..61af209 100644 (file)
        "changeemail-none": "(ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱱᱩᱜ-ᱟ)",
        "changeemail-password": "ᱟᱢᱟᱜ {{SITENAME}} ᱫᱟᱱᱟᱝ ᱥᱟᱵᱟᱽ:",
        "changeemail-submit": "ᱤ-ᱢᱮᱞ ᱵᱚᱫᱚᱞᱢᱮ",
-       "bold_sample": "ᱢᱚᱴᱟ ᱚᱞ",
-       "bold_tip": "ᱢᱚᱴᱟ ᱚᱞ",
-       "italic_sample": "ᱜᱷᱟᱸᱡᱮᱲ ᱚᱞ",
-       "italic_tip": "ᱜᱷᱟᱸᱡᱮᱲ ᱚᱞ",
-       "link_sample": "ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ",
-       "link_tip": "ᱵᱷᱤᱛᱨᱤ ᱡᱚᱱᱚᱲ",
-       "extlink_sample": "http://www.example.com ᱡᱚᱱᱚᱲ ᱴᱟᱭᱴᱮᱞ",
-       "extlink_tip": "ᱵᱟᱨᱦᱮ ᱡᱚᱱᱚᱲ (ᱫᱤᱥᱟᱹᱭᱢᱮ http:// prefix)",
-       "headline_sample": "ᱵᱚᱦᱚᱜ ᱨᱮᱱᱟᱜ ᱚᱞ",
-       "headline_tip": "ᱞᱮᱵᱷᱮᱞ ᱒ ᱦᱮᱰᱞᱟᱭᱤᱱ",
-       "nowiki_sample": "ᱵᱮᱜᱚᱨ ᱯᱷᱚᱨᱢᱮᱴ ᱚᱞᱠᱩ ᱵᱷᱚᱨᱟᱣᱢᱮ",
-       "nowiki_tip": "ᱣᱤᱠᱤ ᱯᱷᱚᱨᱢᱟᱴᱤᱝ ᱵᱟᱹᱜᱤᱭᱢᱮ",
-       "image_tip": "ᱛᱚᱞᱟᱠᱟᱱ ᱨᱮᱫ",
-       "media_tip": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ",
-       "sig_tip": "ᱟᱢᱟᱜ ᱥᱩᱦᱤ ᱥᱟᱶᱛᱮ ᱚᱠᱛᱚ ᱪᱷᱟᱯ",
-       "hr_tip": "ᱵᱟᱨᱟᱵᱟᱹᱨᱤ ᱫᱟᱜᱽ",
        "summary": "ᱢᱩᱬᱩᱛ ᱠᱟᱛᱦᱟ:",
        "subject": "ᱥᱟᱛᱟᱢ:",
        "minoredit": "ᱱᱚᱣᱟ ᱫᱚ ᱦᱩᱰᱤᱧ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱱᱟ",
        "noarticletext": "ᱱᱮᱛᱚᱜ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱪᱮᱫᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱨᱮᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱧᱩᱛᱩᱢ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ᱡᱚᱲᱟᱣᱟᱱ ᱞᱚᱜᱽ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱢᱮ]</span>.",
        "noarticletext-nopermission": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱱᱤᱛᱚᱜ ᱪᱮᱫᱜᱮ ᱚᱞ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\n\nᱟᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱨᱮᱱᱟᱜ ᱧᱤᱛᱩᱢᱮᱢ ᱥᱮᱸᱫᱽᱨᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ]] ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮᱦᱚᱸ,\nᱟᱨᱵᱟᱝ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮ ᱵᱤᱰᱟᱹᱣ ᱠᱟᱛᱮᱛ ᱧᱮᱞᱢᱮ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱮᱱᱟᱣ/ᱥᱟᱯᱲᱟᱣ ᱢᱮᱱᱮᱫ ᱠᱟᱱᱟ ᱥᱮ ᱵᱟᱝ᱾",
-       "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c \"$1\" á±®á± á±\9fᱣᱱᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾",
+       "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±¹ \"$1\" á±®á± á±\9fᱶᱩᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾",
        "blocked-notice-logextract": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱡ ᱫᱚ ᱱᱮᱛᱚᱜ ᱮ ᱥᱮᱥᱫᱜᱮᱭᱟ᱾\nᱨᱮᱯᱷᱟᱨᱮᱱᱥ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱱᱟᱣᱟᱱᱟᱜ ᱵᱚᱞᱚᱜ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱞᱟᱛᱟᱨᱨᱮ ᱮᱢ ᱦᱩᱭᱱᱟ:",
        "clearyourcache": "<strong>ᱧᱮᱛᱮᱞ:</strong> ᱨᱩᱠᱷᱤᱭᱟᱹ ᱦᱩᱭ ᱠᱟᱛᱮ, ᱟᱢᱟᱜ ᱵᱨᱟᱣᱡᱚᱨ ᱠᱮᱪ ᱵᱟᱭᱯᱟᱥ ᱦᱩᱭᱩᱜ ᱛᱟᱢᱟ ᱚᱫᱚᱞ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱾\n* <strong>ᱯᱷᱟᱭᱟᱨᱯᱷᱚᱠᱥ / ᱥᱟᱯᱷᱟᱨᱤ:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "updated": "(ᱩᱛᱷᱱᱟᱣ ᱜᱮᱭᱟ)",
        "prefs-skin": "ᱦᱟᱨᱛᱟ",
        "skin-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
        "datedefault": "ᱠᱩᱥᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ",
-       "prefs-user-pages": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c ᱥᱟᱦᱴᱟᱠᱚ",
+       "prefs-user-pages": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±¹ ᱥᱟᱦᱴᱟᱠᱚ",
        "prefs-rc": "ᱨᱚᱠᱟ ᱵᱚᱫᱚᱞᱠᱚ",
        "prefs-watchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ",
        "prefs-editwatchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ ᱥᱟᱯᱲᱟᱣ",
        "prefs-editor": "ᱥᱟᱯᱲᱮᱛ",
        "prefs-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
        "prefs-diffs": "ᱵᱷᱮᱯᱮᱫ",
-       "userrights": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱩ",
+       "userrights": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱩ",
        "userrights-lookup-user": "ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱦᱟᱨᱤ ᱴᱷᱤᱠᱤ ᱢᱮ",
-       "userrights-user-editname": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c á±§á±¤á±\9bᱩᱢ á±µá±\9aá±\9eá±\9aá±­ ᱢᱮ:",
+       "userrights-user-editname": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±\9c á±§á±¤á±\9bᱩᱢ á±\9fᱫᱮᱨ ᱢᱮ:",
        "editusergroup": "ᱵᱮᱵᱦᱟᱨᱤ ᱜᱟᱶᱛᱟᱠᱩ ᱩᱰᱩᱜᱽ ᱢᱮ",
        "userrights-editusergroup": "ᱥᱟᱯᱲᱟᱣ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ",
        "saveusergroups": "ᱨᱩᱠᱷᱤᱭᱟᱹ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ",
        "tooltip-namespace_association": "ᱱᱚᱶᱟ ᱵᱟᱠᱥᱟ ᱴᱤᱠ ᱢᱮ ᱨᱚᱯᱚᱲ ᱵᱟᱝᱠᱷᱟᱱ ᱥᱟᱛᱟᱢ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱵᱟᱪᱷᱚᱱ ᱟᱠᱟᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱡᱚᱯᱚᱲᱟᱣ ᱟᱠᱟᱱᱟᱜ",
        "blanknamespace": "(ᱢᱩᱬᱩᱛ)",
        "contributions": "{{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱮᱱᱮᱢᱠᱩ",
-       "contributions-title": "$1 á±µá±®á±µá±¦ᱟᱨᱤᱭᱟᱜ ᱮᱱᱮᱢᱠᱩ",
+       "contributions-title": "$1 á±µá±®á±µá±·ᱟᱨᱤᱭᱟᱜ ᱮᱱᱮᱢᱠᱩ",
        "mycontris": "ᱮᱱᱮᱢᱠᱩ",
        "anoncontribs": "ᱮᱱᱮᱢᱠᱩ",
        "contribsub2": "{{GENDER:$3|$1}} ($2) ᱞᱟᱹᱜᱤᱫ ᱛᱮ",
        "sp-contributions-logs": "ᱛᱟᱞᱟᱠᱩ",
        "sp-contributions-talk": "ᱨᱚᱲ",
        "sp-contributions-search": "ᱮᱱᱮᱢᱠᱩ ᱞᱟᱹᱜᱤᱛ ᱥᱮᱸᱫᱨᱟ",
-       "sp-contributions-username": "IP á±´á±·á±¤á± á±\9fᱹᱱá±\9f á±¥á±® á±µá±®á±µá±¦á±\9fᱨᱤᱭá±\9fá±\9c ᱧᱩᱛᱩᱢ",
+       "sp-contributions-username": "IP á±´á±·á±¤á± á±\9fᱹᱱá±\9f á±¥á±® á±µá±®á±µá±·á±\9fᱨᱤᱭá±\9fá±¹ ᱧᱩᱛᱩᱢ",
        "sp-contributions-toponly": "ᱱᱮᱛᱟᱨ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱠᱚᱨᱮᱭᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "sp-contributions-newonly": "ᱥᱩᱢᱩᱝ ᱟᱹᱨᱩᱠᱚ ᱥᱚᱫᱚᱨᱢᱮ ᱡᱟᱦᱟᱸ ᱥᱟᱦᱟᱴᱟ ᱫᱚ ᱥᱤᱨᱡᱟᱹᱣᱟᱜ ᱠᱟᱱᱟ",
        "sp-contributions-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "reblock-logentry": "ᱵᱚᱫᱚᱞᱮᱱᱟ ᱵᱚᱸᱫ ᱥᱟᱡᱟᱣᱠᱚ [[$1]] ᱞᱟᱹᱜᱤᱫ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ $2 $3 ᱥᱟᱶ",
        "block-log-flags-nocreate": "ᱮᱠᱟᱶᱩᱴ ᱵᱮᱱᱟᱣ ᱵᱚᱸᱫᱽ ᱜᱮᱭᱟ",
        "block-log-flags-noemail": "ᱤᱢᱮᱞ ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ",
-       "block-log-flags-hiddenname": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c ᱧᱩᱛᱩᱢ ᱩᱠᱩ ᱜᱮᱭᱟ",
+       "block-log-flags-hiddenname": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±¹ ᱧᱩᱛᱩᱢ ᱩᱠᱩ ᱜᱮᱭᱟ",
        "proxyblocker": "ᱯᱨᱚᱠᱥᱤ ᱮᱥᱮᱫᱤᱡ",
        "movepagebtn": "ᱥᱟᱦᱴᱟ ᱩᱪᱟᱹᱲᱢᱮ",
        "pagemovedsub": "ᱚᱪᱟᱜ ᱫᱚ ᱦᱩᱭᱱᱟ",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ᱩᱪᱟᱹᱲᱠᱮᱜ-ᱟᱭ}} ᱥᱟᱦᱴᱟ $3 to $4 ᱢᱚᱦᱰᱟ ᱵᱤᱱ ᱵᱟᱹᱜᱤ ᱠᱟᱛᱮ",
        "logentry-move-move_redir": "ᱥᱟᱦᱴᱟ $3 ᱠᱷᱚᱱ $4 ᱛᱮ $1 {{GENDER:$2|ᱩᱪᱟᱹᱲ ᱠᱮᱫᱼᱟᱭ}} ᱢᱚᱸᱦᱰᱟ ᱥᱟᱶᱛᱮ",
        "logentry-patrol-patrol-auto": "$1 ᱟᱡᱛᱮᱜᱮ {{GENDER:$2|ᱪᱤᱱᱦᱟᱹᱭᱮᱱᱟ}} $4 ᱧᱮᱞᱟᱹᱨᱩ $3 ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱾",
-       "logentry-newusers-create": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c á±¦á±¤á±¥á±\9fᱹᱵ $1 á±«á±\9a {{GENDER:$2|á±\9bᱮᱭá±\9fᱨᱱᱟ}}",
+       "logentry-newusers-create": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±¹ á±®á± á±\9fᱶᱩᱴ $1 á±«á±\9a {{GENDER:$2|á±\9bᱮᱭá±\9fᱨᱮᱱᱟ}}",
        "logentry-newusers-autocreate": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ $1 ᱫᱚ {{GENDER:$2|ᱛᱮᱭᱟᱨᱮᱱᱟ}} ᱟᱡᱛᱮᱜᱮ",
        "logentry-upload-upload": "$1 {{GENDER:$2|ᱞᱟᱫᱮᱭᱮᱱᱟ}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ᱞᱟᱫᱮᱭᱮᱱᱟ}} ᱢᱤᱫ ᱱᱟᱶᱟ ᱵᱷᱟᱨᱥᱚᱱ $3 ᱨᱮᱱᱟᱜ",
index 94acced..1b97f70 100644 (file)
        "changeemail-submit": "Càmbia email",
        "resettokens": "Reseta tokens",
        "resettokens-token-label": "$1 (valore atuale: $2)",
-       "bold_sample": "Testu grassu",
-       "bold_tip": "Testu grassu",
-       "italic_sample": "Testu cursivu",
-       "italic_tip": "Testu cursivu",
-       "link_sample": "Tìtulu ligòngiu",
-       "link_tip": "Ligòngiu internu",
-       "extlink_sample": "http://www.example.com tìtulu de su ligòngiu",
-       "extlink_tip": "Ligòngiu a foras (regorda su prefissu http://)",
-       "headline_sample": "Testu de su tìtulu",
-       "headline_tip": "Tìtulu de su de duos livellu",
-       "nowiki_sample": "Inserta su testu non-formatadu inoghe",
-       "nowiki_tip": "Ignora sa formatatzione wiki",
-       "image_sample": "Esèmpiu.jpg",
-       "image_tip": "Incòrpora una pintura",
-       "media_sample": "Esèmpiu.ogg",
-       "media_tip": "Ligòngiu a unu file multimediale",
-       "sig_tip": "Firma·ti cun data e ora",
-       "hr_tip": "Lìnia orizontale (de impreare cun critèriu)",
        "summary": "Ogetu:",
        "subject": "Sugetu:",
        "minoredit": "Custu est unu càmbiu minore",
index 2f9216e..f0a007e 100644 (file)
        "resettokens-watchlist-token": "Token pû feed web (Atom/RSS) dî [[Special:Watchlist|canciamenti ê pàggini ntâ tò lista taliata]]",
        "resettokens-done": "Li token foru azzirati.",
        "resettokens-resetbutton": "Azzera li token scigghiuti",
-       "bold_sample": "Grassettu",
-       "bold_tip": "Grassettu",
-       "italic_sample": "Cursivu",
-       "italic_tip": "Cursivu",
-       "link_sample": "Tìtulu dû lijami",
-       "link_tip": "Lijami di dintra",
-       "extlink_sample": "http://www.example.com tìtulu dâ lijami",
-       "extlink_tip": "Lijami di fora (arricurdàrisi lu prifissu http://)",
-       "headline_sample": "Ntistazzioni",
-       "headline_tip": "Suttantistazzioni",
-       "nowiki_sample": "Nzirisci ccà lu testu nun furmattatu",
-       "nowiki_tip": "Gnora la furmattazzioni wiki",
-       "image_sample": "Asempiu.jpg",
-       "image_tip": "File ncurpuratu",
-       "media_sample": "Asempiu.ogg",
-       "media_tip": "Lijami a file",
-       "sig_tip": "La tò firma cu data e ura",
-       "hr_tip": "Lìnia urizzuntali (usari cu giudizziu)",
        "summary": "Riassuntu:",
        "subject": "Oggettu:",
        "minoredit": "Chistu è nu canciamentu nicu",
index ea5a078..8e949a8 100644 (file)
        "resettokens-watchlist-token": "Token fer the wab feed (Atom/RSS) o [[Special:Watchlist|chynges til pages oan yer watchleet]]",
        "resettokens-done": "Tokens' reset.",
        "resettokens-resetbutton": "Reset selected tokens.",
-       "bold_sample": "Baud tex",
-       "bold_tip": "Baud tex",
-       "italic_sample": "Italic tex",
-       "italic_tip": "Italic tex",
-       "link_sample": "Airtin teetle",
-       "link_tip": "Internal airtin",
-       "extlink_sample": "http://www.example.com airtin teetle",
-       "extlink_tip": "External link (mynd the http:// prefix)",
-       "headline_sample": "Heidline tex",
-       "headline_tip": "Level 2 heidline",
-       "nowiki_sample": "Insert non-formattit tex here",
-       "nowiki_tip": "Ignore wiki formattin",
-       "image_sample": "Exemplar.jpg",
-       "image_tip": "Embeddit eemage",
-       "media_sample": "Exemplar.ogg",
-       "media_tip": "File airtin",
-       "sig_tip": "Yer seignatur wi timestamp",
-       "hr_tip": "Horizontal line (dinna ower uise)",
        "summary": "Ootline:",
        "subject": "Subject:",
        "minoredit": "This is ae smaa eedit",
index 332a02e..2a0cb8b 100644 (file)
        "createacct-another-email-ph": "برقٽپال پتو ڄاڻايو",
        "createaccountmail": "ڪو بہ عارضي ڳجھولفظ استعمال ڪريو ۽ ڄاڻايل برقٽپال پتي تي اماڻيو",
        "createacct-realname": "اصل نالو (مرضيءَ موجب)",
-       "createacct-reason": "سبب",
+       "createacct-reason": "سبب (عوامي-طور داخل-ٿيل)",
        "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
        "createacct-reason-help": "کاتو سرجڻ لاگ ۾ ڏيکاريل پيغام",
        "createacct-submit": "پنھنجو کاتو کوليو",
        "resettokens-tokens": "ٽوڪنس:",
        "resettokens-token-label": "$1 (حاليہ قدر: $2)",
        "resettokens-resetbutton": "چونڊيل ٽوڪن ٻيھر ترتيب ڪريو",
-       "bold_sample": "گھري لکت",
-       "bold_tip": "گھري لکت",
-       "italic_sample": "ترڇي لکت",
-       "italic_tip": "ٽيڏي لکت",
-       "link_sample": "ڳنڍڻي جو عنوان",
-       "link_tip": "داخلي ڳنڍڻو",
-       "extlink_sample": "http://www.example.com ڳنڍڻي جو عنوان",
-       "extlink_tip": "خارجي ڳنڍڻو (اڳياڙي http://  نہ وساريندا)",
-       "headline_sample": "سرخي جي لکت",
-       "headline_tip": "سطح 2 جي سرخي",
-       "nowiki_sample": "غير-فارميٽڊ لکت شامل ڪريو",
-       "nowiki_tip": "وڪي فارميٽڱ کي نظرانداز ڪريو",
-       "image_sample": "مثال.jpg",
-       "image_tip": "جَڙيل فائيل",
-       "media_sample": "مثال.ogg",
-       "media_tip": "فائيل جو ڳنڍڻو",
-       "sig_tip": "توھان جي صحيح بمع اوقاتي مھر",
-       "hr_tip": "افقي لڪير (ڪفايت سان استعمال ڪريو)",
        "summary": "تَتُ:",
        "subject": "موضوع:",
        "minoredit": "ھيءَ ھڪ معمولي سنوار آھي",
index 515274a..5ccb707 100644 (file)
        "changeemail-newemail": "Nobu indirizzu di postha erettrònica:",
        "changeemail-none": "(nisciunu)",
        "resettokens-tokens": "Token:",
-       "bold_sample": "Grassetu",
-       "bold_tip": "Grassetu",
-       "italic_sample": "Cursibu",
-       "italic_tip": "Cursibu",
-       "link_sample": "Tìturu di lu cullegamentu",
-       "link_tip": "Cullegamentu internu",
-       "extlink_sample": "http://www.example.com tìturu di lu cullegamentu",
-       "extlink_tip": "Cullegamentu esthernu (nota lu prefissu http:// )",
-       "headline_sample": "Intisthazioni",
-       "headline_tip": "Sottu-intisthazioni",
-       "nowiki_sample": "Insirì lu testhu nò fuimmaddaddu inogghi",
-       "nowiki_tip": "Ignora la fuimmaddazioni wiki",
-       "image_sample": "Esempiu.jpg",
-       "image_tip": "File incoipuraddu",
-       "media_sample": "Esempiu.ogg",
-       "media_tip": "Cullegamentu a file mùrthimediari",
-       "sig_tip": "Fimma cun data e ora",
-       "hr_tip": "Lìnia orizontari (usà cun moderazioni)",
        "summary": "Oggettu:",
        "subject": "Oggettu:",
        "minoredit": "Chistha è una mudìfigga minori",
index 8aa237b..e898074 100644 (file)
        "retypenew": "تێپەڕوشەێ نوو دوبارە بنۊسەو:",
        "passwordreset-username": "ناو ئەوکاربەری:",
        "changeemail-none": "(هۊچ)",
-       "bold_sample": "دەق پڕرەنگ",
-       "bold_tip": "دەق پڕرەنگ",
-       "italic_sample": "دەق کەژ",
-       "italic_tip": "دەق کەژ",
-       "link_sample": "سەردێڕ بەسیار",
-       "link_tip": "بەسیار ناوخوەێ",
-       "extlink_sample": "http://www.example.com سەردێڕ بەسیار",
-       "extlink_tip": "بەسیار دەرەکی (لەھۊرت بوود نۊسین پێشگر http:// )",
-       "headline_sample": "دەق سەردێڕ",
-       "headline_tip": "سەردێڕ ئاست ۲",
-       "nowiki_sample": "لە ئیرە دەق نەڕازانیاێ تێ‌بخە",
-       "nowiki_tip": "لەوەرچاو نەگرتن داڕشانەگان ویکی",
-       "image_tip": "وێنەێ ناو دەق",
-       "media_tip": "بەسیار پەڕگە",
-       "sig_tip": "ئیمزاگەت وەرد مۆر ڕێکەفت",
-       "hr_tip": "هێڵ ئاسوویی (کەم ئەوکاری بوەین)",
        "summary": "کورتەێ وێراشتە:",
        "minoredit": "ئیە وێراشتەێگ بۊچگە",
        "watchthis": "ئەی پەڕە بخە ژێر چاودێری",
index 4cb1966..b1befb6 100644 (file)
        "resetpass_forbidden": "Suollemassániid rievdan ii lihkosmuva dán wikis.",
        "resetpass-submit-loggedin": "Molsso suollemassáni",
        "passwordreset-email": "Šleađgaboastačujuhus:",
-       "bold_sample": "Buoiddes teaksta",
-       "bold_tip": "Buoiddes teaksta",
-       "italic_sample": "Vitnju teaksta",
-       "italic_tip": "Vitnju teaksta",
-       "link_sample": "liŋka",
-       "link_tip": "Siskkaldas liŋka",
-       "extlink_sample": "http://www.example.com liŋkka bájilčála",
-       "extlink_tip": "Wiki olggobeal liŋka (muite http:// ovddas)",
-       "headline_sample": "Bájilčálateaksta",
-       "headline_tip": "Bajilčála",
-       "nowiki_sample": "Lasit rievdatkeahtes teavstta dasa",
-       "nowiki_tip": "Teaksta, man wiki ii rievdda",
-       "image_sample": "Ovdamearka.jpg",
-       "image_tip": "Vurkejuvvon govva",
-       "media_sample": "Ovdamearka.ogg",
-       "media_tip": "Mediafiilaliŋka",
-       "sig_tip": "Vuolláičálus áiggiin",
-       "hr_tip": "Láskkosárggis",
        "summary": "Čoahkkáigeassu:",
        "subject": "Fáddá:",
        "minoredit": "Dát lea unna rievdadus",
index 562ce6d..3afbeaf 100644 (file)
        "resetpass_submit": "Vanquimx canj ö caápo",
        "changepassword-success": "Me quimx canj coccebj quiixde success! Caápo cmaa...",
        "resetpass_forbidden": "Quimx cánj nereset jan wiki iti",
-       "bold_sample": "Text ccomca",
-       "bold_tip": "Text ccomca",
-       "italic_sample": "Text canj",
-       "italic_tip": "Text canj",
-       "link_sample": "Titelde link",
-       "link_tip": "Link intern",
-       "extlink_sample": "http://www.example.com Titelde link",
-       "extlink_tip": "Link extern (¡hajbazxo http:// ö!)",
-       "headline_sample": "Text corridor",
-       "headline_tip": "Text corridor 2",
-       "nowiki_sample": "Neformattám cuerte damir",
-       "nowiki_tip": "Neformatöxde wiki",
-       "image_sample": "Cuáxiit.jpg",
-       "image_tip": "Plusöx ciúchan zo",
-       "media_sample": "Cuáxiit.ogg",
-       "media_tip": "Link MediaCiúchan",
-       "sig_tip": "Hesignura xeperat epa",
-       "hr_tip": "I horizont (seperatman)",
        "summary": "Abvuatl:",
        "subject": "Subject/ccanzam:",
        "minoredit": "Jan coccebj editám z bajlöxám",
index 72d6e66..acc654f 100644 (file)
        "resettokens-watchlist-token": "Tammaasa interneti toonandiyanoo se (Atom/RSS) [[Special:Hawgayhayey|barmawey war hawgayhayey maašeedaa ga]]",
        "resettokens-done": "Tammaasawey yeeti:",
        "resettokens-resetbutton": "Tammaasa suubantey yeeti",
-       "bold_sample": "Hantum warga",
-       "bold_tip": "Hantum warga",
-       "italic_sample": "Hantum šiirante",
-       "italic_tip": "Hantum šiirante",
-       "link_sample": "Dobu maa",
-       "link_tip": "Kunahere dobu",
-       "extlink_sample": "http://www.example.com dobu maa",
-       "extlink_tip": "Tarayhere dobu (honga http:// jinekanji)",
-       "headline_sample": "Boŋžeeri hantum",
-       "headline_tip": "Adadu 2 boŋžeeri",
-       "nowiki_sample": "Hantum bila nda fasal-takari dam ne",
-       "nowiki_tip": "Wiki fasal-takaroo muray",
-       "image_sample": "Example.jpg",
-       "image_tip": "Tuku damgamante",
-       "media_sample": "Example.ogg",
-       "media_tip": "Tuku dobu",
-       "sig_tip": "War kanbežeeroo nda waati šilbay",
-       "hr_tip": "Žeeri kanante (w'a tee cee fooyaŋ de)",
        "summary": "Duurandi:",
        "subject": "Furari:",
        "minoredit": "Barmay kayna ti woo:",
index 0edb66d..7861a60 100644 (file)
        "changeemail-submit": "Keistė el. pašta",
        "changeemail-throttled": "Tamsta nuognē daug sīkiu miegėnat prėsėjongtė.\nPalaukat $1 prīš miegėnont apent.",
        "changeemail-nochange": "Irašīkat kėtuoki nauja al. pašta adresa.",
-       "bold_sample": "Pastuorints raštos",
-       "bold_tip": "Pastuorints raštos",
-       "italic_sample": "Pasviris raštos",
-       "italic_tip": "Pasviris raštos",
-       "link_sample": "Nūruodas pavadėnėms",
-       "link_tip": "Vėduojė nūruoda",
-       "extlink_sample": "http://www.example.com nūruodas pavadėnėms",
-       "extlink_tip": "Laukėnė nūruoda (neožmėrškat http:// prīraša)",
-       "headline_sample": "Skėrsnė pavadėnėms",
-       "headline_tip": "Ontra līgė skėrsnė pavadėnėms",
-       "nowiki_sample": "Diekat čiuonās teksta, katruo nerēk formatoutė",
-       "nowiki_tip": "Neprėveizietė wiki teksta skvarma",
-       "image_sample": "Pavīzdīs.jpg",
-       "image_tip": "Oždietė abruozdieli",
-       "media_sample": "Pavīzdīs.ogg",
-       "media_tip": "Nūruoda abruozdielin",
-       "sig_tip": "Tamstas parašos ė čiesos",
-       "hr_tip": "Golos briežis (nenauduokat ba rēkala)",
        "summary": "Keitėma paāškėnėms:",
        "subject": "Tema/ontraštė:",
        "minoredit": "Mažos pakeitėms",
index a4c30f8..756ee8a 100644 (file)
@@ -67,6 +67,7 @@
        "tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena",
        "tog-prefershttps": "Uvijek koristi sigurnu vezu dok sam prijavljen",
        "tog-showrollbackconfirmation": "Prikaži potvrdnicu kada kliknete vezu za opoziv",
+       "tog-requireemail": "Zahtijevaj e-poštu za stavljanje novu lozinku",
        "underline-always": "Uvijek",
        "underline-never": "Nikad",
        "underline-default": "prema skinu ili postavkama preglednika",
        "createaccountmail": "Daj privremenu nasumičnu lozinku i pošalji na navedenu adresu",
        "createaccountmail-help": "Može se koristiti za stvaranje računa u tuđem imenu bez da se sazna lozinka.",
        "createacct-realname": "Stvarno ime (opcionalno)",
-       "createacct-reason": "Razlog",
+       "createacct-reason": "Razlog (javno zaveden)",
        "createacct-reason-ph": "Zašto stvarate novi račun",
        "createacct-reason-help": "Poruka koja se prikazuje u zapisniku stvaranja korisničkih računa",
        "createacct-submit": "Stvorite svoj račun",
        "resettokens-watchlist-token": "Token za web feed (Atom/RSS) [[Special:Watchlist|promjena za vašem spisku praćenja]]",
        "resettokens-done": "Tokeni resetirani.",
        "resettokens-resetbutton": "Resetiraj odabrane tokene",
-       "bold_sample": "Podebljan tekst",
-       "bold_tip": "Podebljan tekst",
-       "italic_sample": "Kurzivan tekst",
-       "italic_tip": "Kurzivan tekst",
-       "link_sample": "Naslov linka",
-       "link_tip": "Interni link",
-       "extlink_sample": "http://www.example.com naslov linka",
-       "extlink_tip": "Eksterni link (zapamti prefiks http:// )",
-       "headline_sample": "Tekst naslova",
-       "headline_tip": "Podnaslov",
-       "nowiki_sample": "Dodaj neformatirani tekst ovdje",
-       "nowiki_tip": "Ignoriraj wiki formatiranje",
-       "image_tip": "Uklopljena datoteka/fajl",
-       "media_tip": "Veza do datoteke/fajla",
-       "sig_tip": "Vaš potpis sa trenutnim vremenom",
-       "hr_tip": "Horizontalna linija (koristite rijetko)",
        "summary": "Sažetak:",
        "subject": "Tema:",
        "minoredit": "Ovo je manje uređenje",
        "undo-norev": "Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.",
        "undo-nochange": "Ovo je uređivanje izgleda već bilo poništeno.",
        "undo-summary": "Poništena izmjena $1 [[Special:Contribs/$2|korisnika $2]] ([[User talk:$2|razgovor]])",
+       "undo-summary-anon": "Poništi izmjenu $1 {{GENDER:$2|korisnika|korisnice}} [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika",
        "cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''",
        "cantcreateaccount-range-text": "Stvaranje računa od IP adresa iz pojasa<strong>$1</strong>, koji uključuje vašu IP adresu (<strong>$4</strong>), je blokirao/la [[User:$3|$3]].\n\nRazlog koji je dao/la $3 je <em>$2</em>",
        "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
+       "prefs-help-requireemail": "Ako je štiklirano, mogućnost za novu lozinku će imaju samo korisnici koji naveli su korisničko ime i e-poštu.",
        "prefs-info": "Osnovne informacije",
        "prefs-i18n": "Internacionalizacija",
        "prefs-signature": "Potpis",
        "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
+       "listfiles_subpage": "Postavljene datoteke $1",
        "listfiles_thumb": "Smanjeni pregled",
        "listfiles_date": "Datum",
        "listfiles_name": "Naziv",
        "alreadyrolled": "Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmjenio ili vratio članak.\n\nPosljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak izmjene je bio: <em>$1</em>.",
        "revertpage": "Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]",
+       "revertpage-anon": "Vraćene izmjene [[Special:Contributions/$2|$2]] na posljednju izmjenu korisnika [[User:$1|$1]]",
        "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
        "rollback-success": "Vraćene su izmjene korisnika {{GENDER:$3|$1}};\nvraćeno na posljednju verziju koju je snimio {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Greška u sesiji",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "blocklist-userblocks": "Sakrij blokade računa",
        "blocklist-tempblocks": "Sakrij privremene blokade",
+       "blocklist-indefblocks": "Sakrij beskonačne blokade",
        "blocklist-addressblocks": "Sakrij pojedinačne IP blokade",
        "blocklist-type": "Vrsta:",
        "blocklist-type-opt-all": "Sve",
index 35d47fd..ffe3b33 100644 (file)
        "resetpass-submit-cancel": "ⵙⵎⵎⵜ",
        "resetpass-wrong-oldpass": "Awal n uzri yad niɣt walli yak ittkfan i yatwalt ur gis iffuɣ umya.\nHan irwas is yad tsbadlt awal n uzri niɣd is ḍalbt yan yaḍn n yat tklit.",
        "resetpass-temp-password": "Awal ad n uzri iga ɣir win yat tklit:",
-       "bold_sample": "ⴰⴹⵔⵉⵙ ⵉⵣⵓⵔⵏ",
-       "bold_tip": "ⴰⴹⵔⵉⵙ ⵉⵣⵓⵔⵏ",
-       "italic_sample": "ⴰⴹⵔⵉⵙ ⵉⴽⵯⵏⴰⵏ",
-       "italic_tip": "ⴰⴹⵔⵉⵙ ⵉⴽⵯⵏⴰⵏ",
-       "link_sample": "ⴰⵣⵡⵍ ⵏ ⵓⵍⵉⵏⴽ",
-       "link_tip": "ⴰⵍⵉⵏⴽ ⴰⴳⵯⵏⵙⴰⵏ",
-       "extlink_sample": "http://www.example.com ⴰⵣⵡⵓⵍ ⵏ ⵓⵍⵉⵏⴽ",
-       "extlink_tip": "ⴰⵍⵉⵏⴽ ⴰⴱⵔⵔⴰⵏⵉⵢ (ⴰⴷ ⵓⵔ ⵜⴻⵜⵜⵓⵜ ⵓⵣⵡⵉⵔ http://)",
-       "headline_sample": "ⴰⴹⵔⵉⵙ ⵏ ⵓⵣⵡⵓⵍ",
-       "headline_tip": "Ddu-uzwl taskfalt 2",
-       "nowiki_sample": "Kcm aḍṛiṣ li ur imzln ɣid",
-       "nowiki_tip": "Zri Taseddast n wiki",
-       "image_tip": "ⴰⴼⴰⵢⵍⵓ ⵉⵜⵜⵡⴰⵙⵉⴷⴼⵏ",
-       "media_tip": "ⴰⵍⵉⵏⴽ ⵏ ⵓⴼⴰⵢⵍⵓ",
-       "sig_tip": "ⴰⵙⴳⵎⴹ ⵏⵏⴽ/ⵎ ⵙ ⵜⵉⵣⵉ",
-       "hr_tip": "izriri iɣzzifn (ⴰⴷ ⵜ ⵓⵔ ⵜⵙⵙⵓⴳⵜⵜ)",
        "summary": "ⴰⵣⴳⵣⵍ :",
        "subject": "ⵉⵎⵔⵙⵉ :",
        "minoredit": "ⴰⵙⵏⴼⵍ ⵎⵥⵥⵉⵏ",
index 01c892b..19a2d26 100644 (file)
        "resettokens-token-label": "$1 (ၵႃႈၶၼ် ယၢမ်းလဵဝ်: $2)",
        "resettokens-done": "ၶိုၼ်းတင်ႈ မၢႆၶပ်ႉ",
        "resettokens-resetbutton": "ၶိုၼ်းတင်ႈ မၢႆၶပ်ႉ ဢၼ်လိူၵ်ႈဝႆႉၼႆႉ",
-       "bold_sample": "တူဝ်လိၵ်ႈၼႃ",
-       "bold_tip": "တူဝ်လိၵ်ႈၼႃ",
-       "italic_sample": "တူဝ်လိၵ်ႈၵိူင်း",
-       "italic_tip": "တူဝ်လိၵ်ႈၵိူင်း",
-       "link_sample": "ႁူဝ်ၶေႃႈႁဵင်းၵွင်ႉ",
-       "link_tip": "ႁဵင်းၵွင်ႉတၢင်းၼႂ်း",
-       "extlink_sample": "http://www.example.com ႁူဝ်ၶေႃႈႁဵင်းၵွင်ႉ",
-       "extlink_tip": "ႁဵင်းၵွင်ႉၵႂႃႇတၢင်ႇတီႈ (ယႃႇလိုမ်းသႂ်ႇ http:// ပႃႈၼႃႈသုတ်း)",
-       "headline_sample": "လိၵ်ႈ​ႁူဝ်ၶေႃႈ",
-       "headline_tip": "ႁူဝ်ၶေႃႈ ထၢၼ်ႈ ႒",
-       "nowiki_sample": "ဢဝ်လိၵ်ႈဢၼ်ဢမ်ႇမီးပိူင် သႂ်ႇပၼ်တီႈၼႆႈ",
-       "nowiki_tip": "ၶၢမ်ႈပႅတ်ႈပိူင် wiki",
-       "image_tip": "ၾၢႆႇၽင်ဝႆႉ",
-       "media_tip": "ႁဵင်းၵွင်ႉၾၢႆႇ",
-       "sig_tip": "လၢႆးမိုဝ်းၸဝ်ႈၵဝ်ႇ ၸွမ်း ၸုမ်ႈၶၢဝ်းယၢမ်း",
-       "hr_tip": "သၢႆၼႃႈသုင် - ၸႂ်ႉဢၼ်ၵႅမ်",
        "summary": "ႁူဝ်ႁုပ်ႈ :",
        "subject": "ႁူဝ်ၶေႃႈ :",
        "minoredit": "ပဵၼ်လွင်ႈမူၼ်ႉမႄးဢိတ်းဢီႈ",
index daa8c99..5c997d7 100644 (file)
        "resettokens-watchlist-token": "Tiddest i usuddem (Atom/RSS) web n [[Special:Watchlist|ibeddilen n isebtar n umuɣ inek/inem n uḍfar]]",
        "resettokens-done": "Tiddas i wennezen.",
        "resettokens-resetbutton": "Wennez tiddas i fernen",
-       "bold_sample": "Aḍris aberbuz",
-       "bold_tip": "Aḍris aberbuz",
-       "italic_sample": "Aḍris aṭalyani",
-       "italic_tip": "Aḍris aṭalyani",
-       "link_sample": "Azwel n uzday",
-       "link_tip": "Azday zdaxel",
-       "extlink_sample": "http://www.example.com azwel n uzday",
-       "extlink_tip": "Azday aberrani (cfu belli yessefk at tebduḍ s http://)",
-       "headline_sample": "Aḍris n uzwel azellum",
-       "headline_tip": "Aswir 2 n uzwel azellum",
-       "nowiki_sample": "Sideff da tirra bla taseddast(formatting) n wiki",
-       "nowiki_tip": "Ttu taseddast n wiki",
-       "image_tip": "Tugna yettussekcmen",
-       "media_tip": "Azday n ufaylu media",
-       "sig_tip": "Azmul inek s uzemz",
-       "hr_tip": "Ajerriḍ aglawan (ur teččerɛiḍ ara)",
        "summary": "Agzul:",
        "subject": "Asentel:",
        "minoredit": "Wagi d abeddel afessas",
index 05d6352..b381949 100644 (file)
        "resettokens-watchlist-token": "වෙබ් සංග්රහය (Atom/RSS) සඳහා සංකේත [[Special:Watchlist|ඔබගේ මුර-ලැයිස්තුවෙහි පිටු වෙනස්කම්]]",
        "resettokens-done": "ටෝකන් පත් යළි පිහිටුවන්න.",
        "resettokens-resetbutton": "තෝරාගත් ටෝකන් පත් යළි පිහිටුවන්න",
-       "bold_sample": "තදකුරු",
-       "bold_tip": "තදකුරු",
-       "italic_sample": "ඇලකුරු",
-       "italic_tip": "ඇලකුරු",
-       "link_sample": "සබැඳි ශීර්ෂය",
-       "link_tip": "අභ්‍යන්තර සබැඳිය",
-       "extlink_sample": "http://www.example.com සබැඳුම් මාතෘකාව",
-       "extlink_tip": "බාහිර සබැඳිය (http:// උපසර්ගය සිහි තබාගන්න)",
-       "headline_sample": "සිරස්තල පෙළ",
-       "headline_tip": "2වන මට්ටමේ සිරස්තලය",
-       "nowiki_sample": "ආකෘතිකරණය-නොකල පෙළ මෙහි ඇතුළුකරන්න",
-       "nowiki_tip": "විකි ආකෘතිකරණය නොසලකාහරින්න",
-       "image_sample": "නිදසුන.jpg",
-       "image_tip": "කාවැද්දූ ගොනුව",
-       "media_sample": "නිදසුන.ogg",
-       "media_tip": "ගොනු සබැඳිය",
-       "sig_tip": "වේලා මුද්‍රාව හා සමග ඔබගේ විද්‍යුත් අත්සන",
-       "hr_tip": "තිරස් පේළිය (අවම වශයෙන් භාවිතා කරන්න)",
        "summary": "සාරාංශය:",
        "subject": "විෂයය:",
        "minoredit": "මෙය සුළු සංස්කරණයකි",
index 10882ad..78d9ce7 100644 (file)
@@ -88,6 +88,7 @@
        "tog-norollbackdiff": "Vynechať rozdiel po vykonaní rollbacku",
        "tog-useeditwarning": "Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami",
        "tog-prefershttps": "Po prihlásení používať vždy zabezpečené pripojenie",
+       "tog-requireemail": "Pre obnovu hesla vyžadovať e-mail",
        "underline-always": "Vždy",
        "underline-never": "Nikdy",
        "underline-default": "Podľa nastavení prehliadača alebo témy vzhľadu",
        "returnto": "Späť na $1.",
        "tagline": "Z {{GRAMMAR:genitív|{{SITENAME}}}}",
        "help": "Pomoc",
+       "help-mediawiki": "Nápoveda k MediaWiki",
        "search": "Hľadať",
        "search-ignored-headings": " #<!-- tento riadok je nutné nechať bez zmeny --> <pre>\n# Nadpisy, ktoré bude vyhľadávanie ignorovať.\n# Tieto zmenu sa prejavia akonáhle bude stránka s nadpisom zaindexovaná.\n# Reindexovanie stránky môžete vynútiť uložením prázdnej úpravy.\n# Syntax je nasledovná:\n#   * Všetko počínajúc znakom „#“ do konca riadka je komentár.\n#   * Každý neprázdny riadok je presný názov, ktorý má byť ignorovaný, presne ako je napísaný, pričom na veľkosti písmen záleží.\nReferencie\nExterné odkazy\nPozri aj\n #</pre> <!-- tento riadok je nutné nechať bez zmeny -->",
        "searchbutton": "Hľadať",
        "badarticleerror": "Na tejto stránke túto činnosť nemožno vykonať.",
        "cannotdelete": "Nebolo možné zmazať stránku alebo súbor „$1“.\nMožno ju už zmazal nieto iný.",
        "cannotdelete-title": "Nemôžete zmazať stránku „$1“",
+       "delete-scheduled": "Zmazanie stránky „$1“ bolo naplánované.\nBuďte, prosím, trpezliví.",
        "delete-hook-aborted": "Zmazanie zrušila prídavná funkcia (prípojný bod syntaktického analyzátora).\nNeudala vysvetlenie.",
        "no-null-revision": "Nepodarilo sa vytvoriť novú prázdnu revíziu stránky „$1“",
        "badtitle": "Neplatný nadpis",
        "customcssprotected": "Nemáte právo upravovať túto CSS stránku, pretože obsahuje osobné nastavenie iného používateľa.",
        "customjsonprotected": "Nemáte právo upravovať túto JSON stránku, pretože obsahuje osobné nastavenie iného používateľa.",
        "customjsprotected": "Nemáte právo upravovať túto JavaScript stránku, pretože obsahuje osobné nastavenie iného používateľa.",
+       "sitecssprotected": "Nemáte oprávnenie editovať túto stránku s CSS, pretože to môže mať dopad na všetkých návštevníkov.",
        "mycustomcssprotected": "Nemáte povolenie na úpravu tejto CSS stránky.",
        "mycustomjsonprotected": "Nemáte povolenie na úpravu tejto JSON stránky.",
        "mycustomjsprotected": "Nemáte povolenie na úpravu tejto JavaScriptovej stránky.",
        "createaccountmail": "Použiť dočasné náhodné heslo a poslať ho na uvedenú e-mailovú adresu",
        "createaccountmail-help": "Môže byť použité na vytvorenie účtu pre inú osobu bez prezradenia hesla.",
        "createacct-realname": "Skutočné meno (nepovinné)",
-       "createacct-reason": "Dôvod",
+       "createacct-reason": "Dôvod (verejne zaznamenaný)",
        "createacct-reason-ph": "Prečo si vytvárate ďalší účet",
        "createacct-reason-help": "Správa zobrazená v knihe nových používateľov",
        "createacct-submit": "Vytvoriť si účet",
        "badretype": "Zadané heslá nie sú rovnaké.",
        "usernameinprogress": "Vytváranie účtu s týmto menom už prebieha. Prosím, počkajte.",
        "userexists": "Zadané používateľské meno sa už používa.\nProsím, zvoľte si iné meno.",
+       "createacct-normalization": "Vaše používateľské meno bude z technických dôvodov upravené na „$2“.",
        "loginerror": "Chyba pri prihlasovaní",
        "createacct-error": "Chyba pri vytváraní účtu",
        "createaccounterror": "Nepodarilo sa vytvoriť účet: $1",
        "nosuchusershort": "V súčasnosti neexistuje používateľ s menom „$1“. Skontrolujte preklepy.",
        "nouserspecified": "Musíte uviesť meno používateľa.",
        "login-userblocked": "Tento používateľ je zablokovaný. Nie je mu dovolené prihlásiť sa.",
-       "wrongpassword": "Zadané heslo je nesprávne. Prosím, skúste to znova.",
+       "wrongpassword": "Zadané používateľské meno alebo heslo je nesprávne. Prosím, skúste to znova.",
        "wrongpasswordempty": "Zadané heslo bolo prázdne. Prosím, skúste to znova.",
        "passwordtooshort": "Heslo musí mať dĺžku aspoň $1 {{PLURAL:$1|znak|znaky|znakov}}.",
        "passwordtoolong": "Heslá nemôžu byť dlhšie než {{PLURAL:$1|1 znak|$1 znaky|$1 znakov}}.",
-       "passwordtoopopular": "Nie je možné použiť priveľmi frekventované heslá. Zvoľte si prosím iné, menej frekventované heslo.",
+       "passwordtoopopular": "Nie je možné použiť priveľmi frekventované heslá. Zvoľte si, prosím, iné heslo, ktoré je zložitejšie uhádnuť.",
+       "passwordinlargeblacklist": "Zadané heslo je uvedené na zozname veľmi často používaných hesiel. Zvoľte si, prosím, unikátnejšie heslo.",
        "password-name-match": "Vaše heslo musí byť iné ako vaše používateľské meno.",
        "password-login-forbidden": "Použitie tohto používateľského mena a hesla bolo zakázané.",
        "mailmypassword": "Obnoviť heslo",
        "resetpass-submit-loggedin": "Zmeniť heslo",
        "resetpass-submit-cancel": "Zrušiť",
        "resetpass-wrong-oldpass": "Neplatné, dočasné alebo aktuálne heslo.\nJe možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si vyžiadali nové dočasné heslo.",
-       "resetpass-recycled": "Ako nové heslo si prosím nastavte niečo iné než súčasné heslo.",
+       "resetpass-recycled": "Ako nové heslo si, prosím, nastavte niečo iné ako súčasné heslo.",
        "resetpass-temp-emailed": "Prihlasujete sa dočasným heslom, zaslaným e-mailom. Aby ste dokončili prihlásenie, nastavte si tu nové heslo:",
        "resetpass-temp-password": "Dočasné heslo:",
        "resetpass-abort-generic": "Zmena hesla bola zablokovaná rozšírením.",
        "resettokens-watchlist-token": "Token pre webový kanál (Atom/RSS) [[Special:Watchlist|zmien na stránkach, ktoré sledujete]]",
        "resettokens-done": "Tokeny boli obnovené.",
        "resettokens-resetbutton": "Obnoviť zvolené tokeny.",
-       "bold_sample": "Tučný text",
-       "bold_tip": "Tučný text",
-       "italic_sample": "Kurzíva",
-       "italic_tip": "Kurzíva",
-       "link_sample": "Názov odkazu",
-       "link_tip": "Interný odkaz",
-       "extlink_sample": "http://www.example.com názov odkazu",
-       "extlink_tip": "Externý odkaz (nezabudnite na predponu http://)",
-       "headline_sample": "Text nadpisu",
-       "headline_tip": "Text nadpisu úrovne 2",
-       "nowiki_sample": "Sem vložte neformátovaný text",
-       "nowiki_tip": "Ignoruj wiki formátovanie",
-       "image_sample": "Príklad.jpg",
-       "image_tip": "Vložený obrázok",
-       "media_sample": "Príklad.ogg",
-       "media_tip": "Odkaz na media súbor",
-       "sig_tip": "Váš podpis s dátumom a časom",
-       "hr_tip": "Vodorovná čiara (radšej ju nepoužívajte)",
        "summary": "Zhrnutie úprav:",
        "subject": "Predmet:",
        "minoredit": "Toto je drobná úprava",
        "autoblockedtext": "Vaša IP adresa bola automaticky zablokovaná, pretože ju používa iný používateľ, ktorého zablokoval $1.\nUdaný dôvod zablokovania:\n\n:''$2''\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Blokovanie sa týka: $7\n\nAk potrebujete informácie o blokovaní, môžete kontaktovať $1 alebo niektorého iného\n[[{{MediaWiki:Grouppage-sysop}}|správcu]].\n\nPozn.: Nemôžete použiť funkciu „{{int:emailuser}}“, ak ste si vo svojich\n[[Special:Preferences|používateľských nastaveniach]] nezaregistrovali platnú e-mailovú adresu.\n\nVaša aktuálna IP adresa je $3. ID vášho blokovania je $5.\nProsím, uveďte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
        "systemblockedtext": "Vaša IP adresa bola automaticky zablokovaná.\nUdaný dôvod zablokovania:\n\n:<em>$2</em>\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Blokovanie sa týka: $7\n\nVaša aktuálna IP adresa je $3.\nProsím, uveďte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
        "blockednoreason": "nebol uvedený dôvod",
+       "blockedtext-composite-no-ids": "Vaša IP adresa sa objavuje na niekoľkých čiernych listinách",
+       "blockedtext-composite-reason": "Na váš účet a/alebo vašu IP adresu sa vzťahuje viac blokovaní.",
        "whitelistedittext": "Aby ste mohli upravovať stránky, musíte sa $1",
        "confirmedittext": "Pred úpravami stránok musíte potvrdiť vašu e-mailovú adresu. Prosím, nastavte a overte svoju e-mailovú adresu v [[Special:Preferences|používateľských nastaveniach]].",
        "nosuchsectiontitle": "Sekcia nebola nájdená",
        "nocreate-loggedin": "Nemáte povolenie vytvárať nové stránky.",
        "sectioneditnotsupported-title": "Úprava sekcie nie je podporovaná",
        "sectioneditnotsupported-text": "Táto stránka úprav nepodporuje úpravu sekcie.",
+       "modeleditnotsupported-title": "Editácia nie je podporovaná",
        "permissionserrors": "Chyba oprávnenia",
        "permissionserrorstext": "Na to nemáte povolenie z {{PLURAL:$1|nasledujúceho dôvodu|nasledujúcich dôvodov}}:",
        "permissionserrorstext-withaction": "Nemáte oprávnenie $2 z {{PLURAL:$1|nasledovného dôvodu|nasledovných dôvodov}}:",
        "postedit-confirmation-created": "Stránka bola vytvorená.",
        "postedit-confirmation-restored": "Stránka bola obnovená.",
        "postedit-confirmation-saved": "Vaša úprava bola uložená.",
+       "postedit-confirmation-published": "Vaša úprava bola zverejnená.",
        "edit-already-exists": "Nebolo možné vytvoriť novú stránku.\nUž existuje.",
        "defaultmessagetext": "Predvolený text správy",
        "content-failed-to-parse": "Nepodarilo sa spracovať obsah $2 pre model $1: $3",
        "search-file-match": "(výskyt v obsahu súboru)",
        "search-suggest": "Mali ste na mysli „$1“?",
        "search-rewritten": "Zobrazujú sa výsledky pre $1. Vyhľadať namiesto toho $2.",
-       "search-interwiki-caption": "Sesterské projekty",
+       "search-interwiki-caption": "Výsledky zo sesterských projektov",
        "search-interwiki-default": "Výsledky z $1:",
        "search-interwiki-more": "(viac)",
        "search-interwiki-more-results": "ďalšie výsledky",
        "prefs-advancedwatchlist": "Rozšírené možnosti",
        "prefs-displayrc": "Možnosti zobrazenia",
        "prefs-displaywatchlist": "Možnosti zobrazenia",
+       "prefs-changesrc": "Zobrazené zmeny",
        "prefs-changeswatchlist": "Zobrazené zmeny",
        "prefs-pageswatchlist": "Sledované stránky",
        "prefs-tokenwatchlist": "Kľúč",
        "prefs-help-prefershttps": "Táto voľba sa prejaví pri vašom ďalšom prihlásení.",
        "prefswarning-warning": "Vykonali ste zmeny v nastaveniach, ktoré zatiaľ nie sú uložené. Ak túto stránku opustíte bez kliknutia na „$1“, vaše nastavenia sa neaktualizujú.",
        "prefs-tabs-navigation-hint": "Tip: prepínať medzi záložkami môžete aj pomocou šípok vľavo a vpravo.",
-       "userrights": "Spravovanie používateľských práv",
-       "userrights-lookup-user": "Spravovať členstvo používateľa v skupinách",
+       "userrights": "Používateľské práva",
+       "userrights-lookup-user": "Vybrať používateľa",
        "userrights-user-editname": "Zadajte meno používateľa:",
-       "editusergroup": "Upraviť skupiny {{GENDER:$1|používateľa|používateľky}}",
+       "editusergroup": "Načítať skupiny používateľov",
        "editinguser": "Zmena práv používateľa '''[[User:$1|$1]]''' $2",
        "viewinguserrights": "Prehliadanie práv {{GENDER:$1|používateľa|používateľky}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Upraviť skupiny používateľa",
        "userrights-nodatabase": "Databáza $1 neexistuje alebo nie je lokálna.",
        "userrights-changeable-col": "Skupiny, ktoré môžete zmeniť",
        "userrights-unchangeable-col": "Skupiny, ktoré nemôžete zmeniť",
+       "userrights-expiry-othertime": "Iný čas:",
        "userrights-conflict": "Konflikt zmien práv používateľov! Prosím, skontrolujte ho a potvrďte svoje zmeny.",
        "group": "Skupina:",
        "group-user": "Používatelia",
        "grant-createeditmovepage": "Vytvárať, upravovať a presúvať stránky",
        "grant-delete": "Odstraňovať stránky, revízie a položky záznamu",
        "grant-editinterface": "Upravovať menný priestor MediaWiki a projektový/používateľský JSON",
-       "grant-editmycssjs": "Upravovať váš používateľský CSS/JavaScript",
+       "grant-editmycssjs": "Upravovať váš používateľský CSS/JSON/JavaScript",
        "grant-editmyoptions": "Upravovať nastavenia vášho používateľského účtu",
        "grant-editmywatchlist": "Upravovať váš zoznam sledovaných stránok",
        "grant-editsiteconfig": "Upravovať projektové a používateľské CSS/JS súbory",
        "action-upload_by_url": "nahrať tento súbor z URL adresy",
        "action-writeapi": "použiť API na zápis",
        "action-delete": "zmazať túto stránku",
-       "action-deleterevision": "zmazať túto revíziu",
+       "action-deleterevision": "zmazať revízie",
        "action-deletelogentry": "mazať záznamy",
        "action-deletedhistory": "zobraziť históriu zmazaných revízií tejto stránky",
        "action-deletedtext": "zobraziť si zmazané texty revízií",
        "rcfilters-savedqueries-already-saved": "Tieto filtre sú už uložené. Zmeňte niektoré nastavenia, ak chcete vytvoriť nový uložený filter.",
        "rcfilters-restore-default-filters": "Obnoviť predvolené filtre",
        "rcfilters-clear-all-filters": "Zrušiť všetky filtre",
-       "rcfilters-show-new-changes": "Zobraziť najnovšie zmeny",
-       "rcfilters-search-placeholder": "Filtrovať posledné úpravy (vyhľadávajte alebo začnite písať)",
+       "rcfilters-show-new-changes": "Zobraziť zmeny od $1",
+       "rcfilters-search-placeholder": "Filtrovať posledné úpravy (použite menu alebo vyhľadajte názov filtra)",
+       "rcfilters-search-placeholder-mobile": "Filtre",
        "rcfilters-invalid-filter": "Neplatný filter",
        "rcfilters-empty-filter": "Žiadne aktívne filtre. Všetky príspevky sú zobrazené.",
        "rcfilters-filterlist-title": "Filtre",
        "rcfilters-watchlist-markseen-button": "Označiť všetky úpravy ako zobrazené",
        "rcfilters-watchlist-edit-watchlist-button": "Upraviť zoznam sledovaných stránok",
        "rcfilters-watchlist-showupdated": "Zmeny stránok, ktoré ste od ich zmeny nenavštívili, sú zobrazené <strong>hrubo</strong> s vyplneným krúžkom.",
-       "rcfilters-preference-label": "Skryť vylepšenú verziu posledných úprav",
+       "rcfilters-preference-label": "Použiť rozhranie bez JavaScriptu",
        "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é.",
        "backend-fail-contenttype": "Nebolo možné určiť typ obsahu súboru, ktorý sa má uložiť na „$1“.",
        "backend-fail-batchsize": "Do úložiska bola zaslaná dávka s $1 {{PLURAL:$1|operáciou|operáciami}}; limit je $2 {{PLURAL:$2|operácia|operácie|operácií}}.",
        "backend-fail-usable": "Nie je možné čítať alebo zapísať súbor  $1  kvôli nedostatočným povoleniam alebo chýbajúcim adresárom/kontajnerom.",
+       "backend-fail-stat": "Nepodarilo sa načítať stav súboru „$1“.",
        "filejournal-fail-dbconnect": "Nepodarilo sa pripojiť k žurnálovej databáze úložiska „$1“.",
        "filejournal-fail-dbquery": "Nepodarilo sa aktualizovať žurnálovú databázu úložiska „$1“.",
        "lockmanager-notlocked": "Nepodarilo sa odomknúť zámok „$1“; nie je zamknutý.",
        "uploadstash-refresh": "Obnoviť zoznam súborov",
        "uploadstash-thumbnail": "zobraziť náhľad",
        "uploadstash-exception": "Načítaný súbor sa nepodarilo uložiť do skrýše ($1): „$2“.",
+       "uploadstash-bad-path": "Cesta neexistuje.",
+       "uploadstash-bad-path-invalid": "Cesta nie je platná.",
+       "uploadstash-bad-path-unknown-type": "Neznámy typ „$1“.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Nerozpoznaný názov náhľadu.",
+       "uploadstash-file-not-found-no-thumb": "Nepodarilo sa získať náhľad.",
        "invalid-chunk-offset": "Neplatný posun bloku",
        "img-auth-accessdenied": "Prístup zamietnutý",
        "img-auth-nopathinfo": "Váš server nie je nastavený tak, aby poskytoval tieto informácie.\nMôže byť založený na CGI a nedokáže podporovať img_auth.\nPozri https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "http-timed-out": "Vyhradený čas požiadavky HTTP vypršal.",
        "http-curl-error": "Chyba pri sťahovaní URL: $1",
        "http-bad-status": "Počas požiadavky HTTP nastal problém: $1 $2",
+       "http-internal-error": "Interná chyba HTTP.",
        "upload-curl-error6": "Nedostupný URL",
        "upload-curl-error6-text": "Poskytnutý URL nebol dostupný. Prosím, skontrolujte znova, že URL je správny a lokalita je dostupná.",
        "upload-curl-error28": "Vypršal čas vyhradený pre nahrávanie",
        "listfiles-userdoesnotexist": "Používateľské konto „$1“ nie je zaregistrované.",
        "imgfile": "súbor",
        "listfiles": "Zoznam obrázkov",
+       "listfiles_subpage": "Súbory {{GENDER:$1|používateľa|používateľky}} $1",
        "listfiles_thumb": "Náhľad",
        "listfiles_date": "Dátum",
        "listfiles_name": "Názov",
        "listfiles_size": "Veľkosť (v bajtoch)",
        "listfiles_description": "Popis",
        "listfiles_count": "Verzie",
-       "listfiles-show-all": "Vrátane starších verzií obrázkov",
+       "listfiles-show-all": "Zahrnúť staré verzie súborov",
        "listfiles-latestversion": "Aktuálna verzia",
        "listfiles-latestversion-yes": "Áno",
        "listfiles-latestversion-no": "Nie",
        "pageswithprop-legend": "Stránky s vlastnosťou stránky",
        "pageswithprop-text": "Táto stránka obsahuje stránky, ktoré používajú konkrétnu vlastnosť stránky.",
        "pageswithprop-prop": "Názov vlastnosti:",
+       "pageswithprop-reverse": "Zoradiť v opačnom poradí",
+       "pageswithprop-sortbyvalue": "Zoradiť podľa hodnoty vlastnosti",
        "pageswithprop-submit": "Vykonať",
        "pageswithprop-prophidden-long": "dlhá hodnota textovej vlastnosti bola skrytá ($1)",
        "pageswithprop-prophidden-binary": "hodnota binárnej vlastnosti bola skrytá ($1)",
        "deadendpages": "Slepé stránky",
        "deadendpagestext": "Nasledujúce stránky neodkazujú na žiadne iné stránky na {{GRAMMAR:lokál|{{SITENAME}}}}.",
        "protectedpages": "Zamknuté stránky",
+       "protectedpages-filters": "Filtre:",
        "protectedpages-indef": "Zamknutia iba na neurčito",
        "protectedpages-summary": "Táto stránka obsahuje zoznam existujúcich stránok, ktoré sú momentálne zamknuté. Zoznam názvov zamknutých proti vytvoreniu nájdete na stránke [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Iba kaskádové zamykanie",
        "apisandbox-submit": "Odoslať dopyt",
        "apisandbox-reset": "Vyčistiť",
        "apisandbox-retry": "Skúsiť znova",
+       "apisandbox-helpurls": "Odkazy na nápovedu",
        "apisandbox-examples": "Príklady",
+       "apisandbox-dynamic-parameters": "Doplnkové parametre",
+       "apisandbox-dynamic-parameters-add-label": "Pridať parameter:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Meno parametra",
+       "apisandbox-add-multi": "Pridať",
+       "apisandbox-submit-invalid-fields-title": "Niektoré polia sú neplatné",
+       "apisandbox-submit-invalid-fields-message": "Opravte označené polia a skúste to znova.",
        "apisandbox-results": "Výsledky",
        "apisandbox-request-url-label": "URL požiadavky:",
+       "apisandbox-continue": "Pokračovať",
+       "apisandbox-continue-clear": "Vymazať",
+       "apisandbox-multivalue-all-namespaces": "$1 (Všetky menné priestory)",
+       "apisandbox-multivalue-all-values": "$1 (Všetky hodnoty)",
        "booksources": "Knižné zdroje",
        "booksources-search-legend": "Vyhľadávať knižné zdroje",
        "booksources-search": "Hľadať",
        "speciallogtitlelabel": "Cieľ (názov alebo {{ns:user}}:Používateľské meno):",
        "log": "Záznamy",
        "logeventslist-submit": "Zobraziť",
+       "logeventslist-more-filters": "Zobraziť ďalšie záznamy:",
        "logeventslist-patrol-log": "Kniha preverených úprav",
        "logeventslist-tag-log": "Kniha značiek",
        "all-logs-page": "Všetky verejné záznamy",
        "sessionfailure": "Zdá sa, že je problém s vašou prihlasovacou reláciou;\ntáto akcia bola zrušená ako prevencia proti zneužitiu relácie (session).\nProsím, stlačte \"naspäť\", obnovte stránku, z ktorej ste sa sem dostali, a skúste to znova.",
        "changecontentmodel": "Zmeniť model obsahu stránky",
        "changecontentmodel-legend": "Zmeniť model obsahu",
-       "changecontentmodel-title-label": "Názov stránky",
-       "changecontentmodel-model-label": "Nový model obsahu",
+       "changecontentmodel-title-label": "Názov stránky:",
+       "changecontentmodel-model-label": "Nový model obsahu:",
        "changecontentmodel-reason-label": "Dôvod:",
        "changecontentmodel-submit": "Zmeniť",
        "changecontentmodel-success-title": "Model obsahu bol zmenený",
        "ipbreason": "Dôvod:",
        "ipbreason-dropdown": "* Bežné dôvody blokovania\n** Zámerné vkladanie chybných informácií\n** Mazanie obsahu stránok\n** Spam odkazy na externé stránky\n** Vkladanie nezmyslov do stránok\n** Zastrašujúce správanie/obťažovanie\n** Zneužívanie viacerých účtov\n** Neprípustné používateľské meno",
        "ipb-hardblock": "Zabrániť prihláseným používateľom upravovať z tejto IP adresy",
-       "ipbcreateaccount": "Zabrániť vytváraniu účtov",
-       "ipbemailban": "Zabrániť používateľovi posielať e-maily",
+       "ipbcreateaccount": "Vytváranie účtov",
+       "ipbemailban": "Posielanie e-mailov",
        "ipbenableautoblock": "Automaticky blokovať poslednú IP adresu, ktorú tento používateľ použil, a všetky ďalšie adresy, z ktorých sa pokúsi upravovať.",
        "ipbsubmit": "Zablokovať tohto používateľa",
        "ipbother": "Iný čas",
        "ipboptions": "2 hodiny:2 hours,1 deň:1 day,3 dni:3 days,1 týždeň:1 week,2 týždne:2 weeks,1 mesiac:1 month,3 mesiace:3 months,6 mesiacov:6 months,1 rok:1 year,na neurčito:infinite",
        "ipbhidename": "Skryť meno používateľa z úprav a zoznamov",
        "ipbwatchuser": "Sledovať používateľskú a diskusnú stránku tohto používateľa",
-       "ipb-disableusertalk": "Zabrániť tomuto používateľovi upravovať vlastnú diskusnú stránku, kým je zablokovaný",
+       "ipb-disableusertalk": "Upravovanie vlastnej diskusnej stránky",
        "ipb-change-block": "Znovu zablokovať používateľa s týmito voľbami",
        "ipb-confirm": "Potvrdiť blokovanie",
        "badipaddress": "IP adresa má nesprávny formát.",
        "createaccountblock": "tvorba účtov bola zablokovaná",
        "emailblock": "e-mail blokovaný",
        "blocklist-nousertalk": "nemôže upravovať svoju diskusnú stránku",
+       "blocklist-editing-page": "stránky",
+       "blocklist-editing-ns": "menné priestory",
        "ipblocklist-empty": "Zoznam blokovaní je prázdny.",
-       "ipblocklist-no-results": "Požadovaná IP adresa alebo používateľské meno nie je blokovaná.",
+       "ipblocklist-no-results": "Nebolo nájdené žiadne zablokovanie danej IP adresy alebo používateľa.",
        "blocklink": "zablokovať",
        "unblocklink": "odblokovať",
        "change-blocklink": "zmeniť blokovanie",
+       "empty-username": "(používateľské meno nie je dostupné)",
        "contribslink": "príspevky",
        "emaillink": "poslať e-mail",
        "autoblocker": "Boli ste automaticky zablokovaný, pretože vašu IP adresu nedávno použil „[[User:$1|$1]]“.\nDôvodom zablokovania redaktora $1 bolo „$2“",
        "newimages-summary": "Táto špeciálna stránka zobrazuje posledné nahrané súbory.",
        "newimages-legend": "Filter",
        "newimages-label": "Názov súboru (alebo jeho časť):",
+       "newimages-user": "IP adresa alebo používateľské meno",
        "newimages-showbots": "Zobraziť súbory nahrané botmi",
        "newimages-hidepatrolled": "Skryť preverené nahratia súborov",
+       "newimages-mediatype": "Typ multimédia:",
        "noimages": "Niet čo zobraziť.",
        "gallery-slideshow-toggle": "Prepnúť náhľady",
        "ilsubmit": "Hľadať",
        "confirm-unwatch-top": "Odstrániť túto stránku z vášho zoznamu sledovaných?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Vrátiť úpravy na tejto stránke?",
+       "confirm-mcrundo-title": "Vrátiť späť zmenu",
+       "mcrundofailed": "Vrátenie úpravy sa nepodarilo",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← predošlá stránka",
        "imgmultipagenext": "ďalšia stránka →",
        "diff-form": "Rozdiely",
        "dberr-problems": "Prepáčte! Táto stránka má práve technické problémy.",
        "dberr-again": "Skúste niekoľko minút počkať a potom opäť načítať stránku.",
-       "dberr-info": "(Spojenie s databázovým serverom neúspešné: $1)",
-       "dberr-info-hidden": "(Nie je možné kontaktovať databázový server)",
+       "dberr-info": "(Nie je možné pripojiť sa k databáze: $1)",
+       "dberr-info-hidden": "(Nie je možné pripojiť sa k databáze)",
        "htmlform-invalid-input": "Niekotrý z údajov, ktoré ste zadali je problematický",
        "htmlform-select-badoption": "Hodnota, ktorú ste uviedli nie je platná.",
        "htmlform-int-invalid": "Hodnota, ktorú ste uviedli nie je celé číslo.",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamkol|zamkla}} stránku $3 $4 [kaskádovým zámkom]",
        "logentry-protect-modify": "$1 {{GENDER:$2|zmenil|zmenila}} úroveň zámku stránky $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|zmenil|zmenila}} úroveň zámku stránky $3 $4 [kaskádový zámok]",
-       "logentry-rights-rights": "$1 zmenil členstvo $3 v skupinách z $4 na $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|zmenil|zmenila}} členstvo {{GENDER:$6|používateľa|používateľky}} $3 v skupinách z $4 na $5",
        "logentry-rights-rights-legacy": "$1 zmenil členstvo $3 v skupinách",
        "logentry-rights-autopromote": "$1 bol automaticky povýšený z $4 na $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|pridal|pridala}} $3",
        "expandtemplates": "Substituovať šablóny",
        "expand_templates_intro": "Táto špeciálna stránka prijme na\nvstup text a rekurzívne substituuje všetky šablóny,\nktoré sú v ňom použité. Tiež expanduje funkcie\nsyntaktického analyzátora ako <nowiki>{{</nowiki>#language:...}}\na premenné ako <nowiki>{{</nowiki>CURRENTDAY}}—v podstate\ntakmer všetko v zložených zátvorkách. Robí to pomocou\nvolania relevantnej fázy syntaktického analyzátora\nsamotného MediaWiki.",
        "expand_templates_title": "Názov kontextu pre {{FULLPAGENAME}} atď.:",
-       "expand_templates_input": "Vstupný text:",
+       "expand_templates_input": "Vstupný wikitext:",
        "expand_templates_output": "Výsledok",
        "expand_templates_xml_output": "XML výstup",
        "expand_templates_html_output": "Surový HTML výstup",
        "date-range-from": "Od dátumu:",
        "date-range-to": "Po dátum:",
        "randomrootpage": "Náhodná koreňová stránka",
+       "authmanager-provider-password": "Autentifikácia pomocou hesla",
        "changecredentials": "Zmena prihlasovacích údajov",
+       "changecredentials-submit": "Zmeniť prihlasovacie údaje",
        "removecredentials": "Odstránenie prihlasovacích údajov",
+       "credentialsform-provider": "Typ prihlasovacích údajov:",
+       "credentialsform-account": "Názov účtu:",
        "userjsispublic": "Uvedomte si prosím, že podstránky s JavaScriptom by nemali obsahovať tajné údaje, pretože sú viditeľné ostatným používateľom.",
        "usercssispublic": "Uvedomte si prosím, že podstránky s CSS by nemali obsahovať tajné údaje, pretože sú viditeľné ostatným používateľom.",
        "passwordpolicies": "Pravidlá pre heslá"
index ac72c32..26fb69e 100644 (file)
        "resettokens": "ٹوکناں دی نویں ترتیب",
        "resettokens-tokens": "ٹوکن",
        "resettokens-token-label": "$1 (موجودہ قدر: $2)",
-       "bold_sample": "موٹی لکھائی",
-       "bold_tip": "موٹی لکھائی",
-       "italic_sample": "ترچھا متن",
-       "italic_tip": "ترچھی لکھائی",
-       "link_sample": "جوڑ",
-       "link_tip": "اندرونی جوڑ",
-       "extlink_sample": "http://www.example.com جوڑ دا ناں",
-       "extlink_tip": "باہرلے جوڑ (remember http:// prefix)",
-       "headline_sample": "شہ سرخی",
-       "headline_tip": "ݙوجھے درجے دی سرخی",
-       "nowiki_sample": "فارمیٹ نہ تھئی ہوئی لکھائی اتھ درج کرو",
-       "nowiki_tip": "ویکی فارمیٹ کوں نظرانداز کرو",
-       "image_tip": "پیوستہ فائل",
-       "media_tip": "فائل دا جوڑ",
-       "sig_tip": "تہاݙے دستخط ویلے دے نال",
-       "hr_tip": "اُفقی لکیر (زیادہ استعمال نہ کریں)",
        "summary": "خلاصہ",
        "subject": "عنوان:",
        "minoredit": "ایہ ہک چھوٹی تبدیلی ہے",
index 7cd6220..d9be5c2 100644 (file)
@@ -64,6 +64,7 @@
        "tog-useeditwarning": "Opozori me, ko skušam zapreti urejevalno polje z neshranjenimi spremembami",
        "tog-prefershttps": "Med prijavo vedno uporabljaj varno povezavo",
        "tog-showrollbackconfirmation": "Pokaži potrditveno okno ob kliku na povezavo za vrnitev",
+       "tog-requireemail": "Zahtevaj e-poštni naslov za ponastavitev gesla",
        "underline-always": "Vedno",
        "underline-never": "Nikoli",
        "underline-default": "Koža ali privzeto v brskalniku",
        "createaccountmail": "Ustvari začasno naključno geslo in ga pošlji na spodaj navedeni e-poštni naslov",
        "createaccountmail-help": "Se lahko uporablja za ustvarjanje računa za drugo osebo brez da bi vedeli geslo.",
        "createacct-realname": "Pravo ime (izbirno)",
-       "createacct-reason": "Razlog",
+       "createacct-reason": "Razlog (javno zabeležen)",
        "createacct-reason-ph": "Zakaj ustvarjate drug račun",
        "createacct-reason-help": "Sporočilo, prikazano v dnevniku ustvarjanja računov",
        "createacct-submit": "Ustvarite svoj račun",
        "resettokens-watchlist-token": "Žeton spletnega vira (Atom/RSS) [[Special:Watchlist|sprememb strani na vašem spisku nadzorov]]",
        "resettokens-done": "Žetone sem ponastavil.",
        "resettokens-resetbutton": "Ponastavi izbrane žetone",
-       "bold_sample": "Krepko besedilo",
-       "bold_tip": "Krepko besedilo",
-       "italic_sample": "Ležeče besedilo",
-       "italic_tip": "Ležeče besedilo",
-       "link_sample": "Naslov povezave",
-       "link_tip": "Notranja povezava",
-       "extlink_sample": "http://www.example.com naslov povezave",
-       "extlink_tip": "Zunanja povezava (ne pozabite na predpono http://)",
-       "headline_sample": "Besedilo naslovne vrstice",
-       "headline_tip": "Naslovna vrstica druge ravni",
-       "nowiki_sample": "Tu vnesite neoblikovano besedilo",
-       "nowiki_tip": "Prezri wikioblikovanje",
-       "image_sample": "Zgled.jpg",
-       "image_tip": "Povezava na sliko",
-       "media_sample": "Zgled.ogg",
-       "media_tip": "Povezava na predstavnostno datoteko",
-       "sig_tip": "Vaš podpis z datumom",
-       "hr_tip": "Vodoravna črta (uporabljajte zmerno)",
        "summary": "Povzetek urejanja:",
        "subject": "Zadeva:",
        "minoredit": "manjše urejanje",
        "undo-norev": "Urejanja ni mogoče razveljaviti, ker ne obstaja ali je bilo izbrisano.",
        "undo-nochange": "Zdi se, da je urejanje nekdo že razveljavil.",
        "undo-summary": "Redakcija $1 uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) razveljavljena",
+       "undo-summary-anon": "Razveljavitev redakcije $1 uporabnika [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Razveljavi redakcijo $1 skritega uporabnika",
        "cantcreateaccount-text": "Registracije z IP-naslova ('''$1''') je administrator(ka) [[User:$3|$3]] blokiral(a).\n\nRazlog, ki ga je $3 podal(a), je ''$2''.",
        "cantcreateaccount-range-text": "Ustvarjanje računov z IP-naslovov v območju <strong>$1</strong>, ki vključuje vaš IP-naslov (<strong>$4</strong>), je blokiral(-a) [[User:$3|$3]].\n\nRazlog, ki ga je podal(-a) $3, je <em>$2</em>.",
        "prefs-help-email": "E-poštni naslov ni obvezen, vendar omogoča, da vam v primeru pozabljenega gesla pošljemo novo.",
        "prefs-help-email-others": "Omogočite lahko tudi možnost, da vam lahko ostali uporabniki pošiljajo e-pošto prek vaše uporabniške ali pogovorne strani.\nKo vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo razkrili.",
        "prefs-help-email-required": "E-poštni naslov je obvezen.",
+       "prefs-help-requireemail": "Če je označeno, bo e-pošta za ponastavitev gesla poslana samo, če je oseba, ki je sprožila ponastavitev, vnesla tako uporabniško ime kot e-poštni naslov tega računa.",
        "prefs-info": "Osnovni podatki",
        "prefs-i18n": "Internacionalizacija",
        "prefs-signature": "Podpis",
        "listfiles-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
        "imgfile": "dat.",
        "listfiles": "Seznam datotek",
+       "listfiles_subpage": "Nalaganja $1",
        "listfiles_thumb": "Sličica",
        "listfiles_date": "Datum",
        "listfiles_name": "Ime",
        "alreadyrolled": "Zadnje spremembe [[:$1]] uporabnika [[User:$2|$2]] ([[User talk:$2|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ne morem vrniti;\nstran je spremenil ali vrnil že nekdo drug.\n\nZadnji je stran urejal uporabnik [[User:$3|$3]] ([[User talk:$3|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Povzetek urejanja je bil: <em>$1</em>.",
        "revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
+       "revertpage-anon": "Vrnjena urejanja uporabnika [[Special:Contributions/$2|$2]] na zadnjo redakcijo uporabnika [[User:$1|$1]]",
        "revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Razveljavljene spremembe {{GENDER:$3|uporabnika|uporabnice}} $1;\nvrnjeno na urejanje {{GENDER:$4|uporabnika|uporabnice}} $2.",
        "sessionfailure-title": "Neuspeh seje",
        "ipblocklist-legend": "Poišči blokiranega uporabnika",
        "blocklist-userblocks": "skrij blokade računov",
        "blocklist-tempblocks": "skrij začasne blokade",
+       "blocklist-indefblocks": "Skrij neomejene blokade",
        "blocklist-addressblocks": "skrij blokade posameznih IP-naslovov",
        "blocklist-type": "Vrsta:",
        "blocklist-type-opt-all": "Vse",
        "mycustomjsredirectprotected": "Nimate pravic za urejanje te strani z JavaScriptom, ker je preusmeritev in ne kaže v vaš uporabniški prostor.",
        "easydeflate-invaliddeflate": "Dana vsebina ni pravilno stisnjena",
        "unprotected-js": "Iz varnostnih razlogov JavaScripta ni možno naložiti z nezaščitenih strani. Prosimo, da JavaScript ustvarite samo v imenskem prostoru MediaWiki ali kot uporabniško podstran.",
-       "userlogout-continue": "Se želite odjaviti?"
+       "userlogout-continue": "Se želite odjaviti?",
+       "rest-prefix-mismatch": "Zahtevana pot ($1) ni bila znotraj korenske poti REST API ($2)",
+       "rest-wrong-method": "Zahtevana metoda ($1) ni {{PLURAL:$3|veljavna metoda|ena od veljavnih metod}} za to pot ($2)",
+       "rest-no-match": "Zahtevana relativna pot ($1) se ne ujema z nobenim znanim krmilnikom"
 }
index 673be97..8482423 100644 (file)
        "resetpass-submit-loggedin": "Poaßwurt ändern",
        "resetpass-wrong-oldpass": "Ungiltiges temporäres oder aktuelles Poaßwurt.\nMeeglicherweise host du dei Poaßwurt bereits erfolgreich geändert oder a neues temporäres Poaßwurt beantragt.",
        "resetpass-temp-password": "Temporäres Poaßwurt:",
-       "bold_sample": "Fetter Text",
-       "bold_tip": "Fetter Text",
-       "italic_sample": "Kursiver Text",
-       "italic_tip": "Kursiver Text",
-       "link_sample": "Verknipfungstext",
-       "link_tip": "Interne Verknipfung",
-       "extlink_sample": "http://www.example.com Verknipfungstittel",
-       "extlink_tip": "Externe Verknipfung (http:// beoachta)",
-       "headline_sample": "Ieberschreft (Ebene 2)",
-       "headline_tip": "Ebene 2 Ieberschreft",
-       "nowiki_sample": "unformatierta Text hier eifiega",
-       "nowiki_tip": "unformatierter Text (nowiki)",
-       "image_tip": "Verknipfung miet Datei",
-       "media_tip": "Verknipfung miet Mediadatei",
-       "sig_tip": "Denne Underschrift miet Zeetstempel",
-       "hr_tip": "Hurizuntale Linie (sporsam verwenda)",
        "summary": "Zusammafoassung:",
        "minoredit": "Ocke Kleenigkeeta wurda verändert",
        "watchthis": "Diese Seite beoboachta",
index d46a9d2..c9f7e17 100644 (file)
        "changeemail-newemail": "Ciwaan e-mail oo cusub:",
        "changeemail-none": "(waxna)",
        "changeemail-submit": "Bedel e-mailka",
-       "bold_sample": "Far butac ah",
-       "bold_tip": "Far butac ah",
-       "italic_sample": "Farta caatada ah",
-       "italic_tip": "Farta caatada ah",
-       "link_sample": "Qoraalka linkiga",
-       "extlink_sample": "http://www.example.com qoraalka linkiga",
-       "extlink_tip": "Xiriirka tixraaca (xasuuso http:// prefix)",
-       "headline_sample": "Qoraalka madaxa hore",
-       "headline_tip": "Qeybta 2aad ee ciwaanka kore",
-       "nowiki_sample": "Ku dar meeshaan qoraal aan la format-gareen",
-       "nowiki_tip": "Iska dhagooleey formatka wiki",
-       "image_tip": "Fayl la soo galiyay",
-       "media_tip": "Linkiga file-ka",
-       "sig_tip": "Saxiixaaga oo waqti ku dhufsan",
        "summary": "Qoraal kooban:",
        "minoredit": "Kan waa wax ka bedel yar",
        "watchthis": "Boggaan waardiyey",
index bf58278..f6b5d56 100644 (file)
        "resettokens-token-label": "$1 (vlera aktuale: $2)",
        "resettokens-done": "Tokenët u resetuan.",
        "resettokens-resetbutton": "Reseto tokenët e zgjedhur",
-       "bold_sample": "Stil i theksuar i tekstit",
-       "bold_tip": "Stil i theksuar i tekstit",
-       "italic_sample": "Tekst i pjerrët",
-       "italic_tip": "Tekst i pjerrët",
-       "link_sample": "Titulli i lidhjes",
-       "link_tip": "Lidhje e brendshme",
-       "extlink_sample": "http://www.example.com titulli i lidhjes",
-       "extlink_tip": "Lidhje e jashtme (most harro prefiksin http://)",
-       "headline_sample": "Titulli",
-       "headline_tip": "Titull i nivelit 2",
-       "nowiki_sample": "Vendos tekst që nuk duhet të formatohet",
-       "nowiki_tip": "Mos përdor format wiki",
-       "image_sample": "Shembull.jpg",
-       "image_tip": "Vendos një figurë",
-       "media_sample": "Shembull.ogg",
-       "media_tip": "Lidhje media-skedash",
-       "sig_tip": "Firma juaj me gjithë kohë",
-       "hr_tip": "vijë horizontale (përdoreni rallë)",
        "summary": "Përmbledhje:",
        "subject": "Subjekt:",
        "minoredit": "Ky është një redaktim i vogël",
index 6f15977..9c65b81 100644 (file)
        "resettokens-watchlist-token": "Токен за веб-фид (Atom/RSS) [[Special:Watchlist|промена на страницама у вашем списку надгледања]]",
        "resettokens-done": "Токени су ресетовани.",
        "resettokens-resetbutton": "Ресетуј изабране токене",
-       "bold_sample": "Подебљан текст",
-       "bold_tip": "Подебљан текст",
-       "italic_sample": "Искошен текст",
-       "italic_tip": "Искошен текст",
-       "link_sample": "Наслов везе",
-       "link_tip": "Унутрашња веза",
-       "extlink_sample": "http://www.example.com/ наслов везе",
-       "extlink_tip": "Спољашња веза (са префиксом http://)",
-       "headline_sample": "Текст наслова",
-       "headline_tip": "Поднаслов (ниво 2)",
-       "nowiki_sample": "Овде уметните необликован текст",
-       "nowiki_tip": "Занемари вики обликовање",
-       "image_sample": "Пример.jpg",
-       "image_tip": "Уграђивање датотеке",
-       "media_sample": "Пример.ogg",
-       "media_tip": "Веза до датотеке",
-       "sig_tip": "Ваш потпис са временском ознаком",
-       "hr_tip": "Водоравна линија (користите ретко)",
        "summary": "Опис измене:",
        "subject": "Тема:",
        "minoredit": "Ово је мања измена",
index d9e6449..e06d84d 100644 (file)
        "resettokens-watchlist-token": "Token za veb-fid (Atom/RSS) [[Special:Watchlist|promena na stranicama u vašem spisku nadgledanja]]",
        "resettokens-done": "Tokeni su resetovani.",
        "resettokens-resetbutton": "Resetuj izabrane tokene",
-       "bold_sample": "Podebljan tekst",
-       "bold_tip": "Podebljan tekst",
-       "italic_sample": "Iskošen tekst",
-       "italic_tip": "Iskošen tekst",
-       "link_sample": "Naslov veze",
-       "link_tip": "Unutrašnja veza",
-       "extlink_sample": "http://www.example.com/ naslov veze",
-       "extlink_tip": "Spoljašnja veza (sa prefiksom http://)",
-       "headline_sample": "Tekst naslova",
-       "headline_tip": "Podnaslov (nivo 2)",
-       "nowiki_sample": "Ovde umetnite neoblikovan tekst",
-       "nowiki_tip": "Zanemari viki oblikovanje",
-       "image_sample": "Primer.jpg",
-       "image_tip": "Ugrađivanje datoteke",
-       "media_sample": "Primer.ogg",
-       "media_tip": "Veza do datoteke",
-       "sig_tip": "Vaš potpis sa vremenskom oznakom",
-       "hr_tip": "Vodoravna linija (koristite retko)",
        "summary": "Opis izmene:",
        "subject": "Tema:",
        "minoredit": "Ovo je manja izmena",
index 9de7eaf..579cd76 100644 (file)
        "newpassword": "Nyun waktiwortu:",
        "retypenew": "Nyun psa wortu ete wan tron:",
        "resetpass_submit": "Kenki yu waktiwortu nanga kon",
-       "bold_sample": "Fatu skrifi",
-       "bold_tip": "Fatu",
-       "italic_sample": "Skoinsi skrifi",
-       "italic_tip": "Skoinsi",
-       "link_sample": "Miti nen",
-       "link_tip": "Miti go na insey",
-       "extlink_sample": "http://www.example.com miti nen",
-       "extlink_tip": "Miti go na dorosey (no fergiti fu poti http:// fosi)",
-       "headline_sample": "Pisi ede nen",
-       "headline_tip": "Pisi ede nen",
-       "nowiki_sample": "Skrifi sondro wiki skrifi-fasi dyaso",
-       "nowiki_tip": "Skotu a wiki skrifi-fasi",
-       "image_tip": "Media file",
-       "media_tip": "Miti go na file",
-       "sig_tip": "Yu ondroskrifi nanga a dei nanga a yuru",
-       "hr_tip": "Didon lini (no kebroiki furu)",
        "summary": "In' syatu:",
        "subject": "Abra san/ede:",
        "minoredit": "Disi na wan pikin kenki",
index 330dcb8..c3eb89c 100644 (file)
        "passwordreset-emailtitle": "Benutserkontoinformatione ap {{SITENAME}}",
        "passwordreset-emailelement": "↓Benutsernoome: \n$1\n\nTemporär Paaswoud: \n$2",
        "passwordreset-emailsentemail": "↓Ne Ärinnerenge wuud uur E-Mail fersoand.",
-       "bold_sample": "Fatten Text",
-       "bold_tip": "Fatten Text",
-       "italic_sample": "Kursiven Text",
-       "italic_tip": "Kursive Text",
-       "link_sample": "Link-Text",
-       "link_tip": "Internen Link",
-       "extlink_sample": "http://www.example.com Link-Text",
-       "extlink_tip": "Externen Link (http:// beoachtje)",
-       "headline_sample": "Ieuwene 2 Uurskrift",
-       "headline_tip": "Ieuwene 2 Uurskrift",
-       "nowiki_sample": "Uunformattierden Text hier ienföigje",
-       "nowiki_tip": "Uunformattierden Text",
-       "image_sample": "Biespil.jpg",
-       "image_tip": "Doatäi-Ferbiendenge",
-       "media_sample": "Biespil.ogg",
-       "media_tip": "Mediendoatäi-Ferwies",
-       "sig_tip": "Dien Signatur mäd Tiedstämpel",
-       "hr_tip": "Horizontoale Lienje (spoarsoam ferweende)",
        "summary": "Touhoopefoatenge:",
        "subject": "Themoa:",
        "minoredit": "Bloot litje Seeken wuuden ferannerd",
index 456d31c..270e651 100644 (file)
        "pt-createaccount": "Йаңа аккаунт пултырғалы",
        "pt-userlogout": "Цыҡҡалы",
        "passwordreset": "Парольны пөтөрөү",
-       "bold_sample": "Ҡалын пелән йасыу",
-       "bold_tip": "Ҡалын пелән йасыу",
-       "italic_sample": "Курсив пелән йасыу",
-       "italic_tip": "Курсив пелән йасыу",
-       "link_sample": "Ссылканыңҡы төп исеме",
-       "link_tip": "Эцке ссылка",
-       "extlink_sample": "http://www.example.com ссылканың төп исеме",
-       "extlink_tip": "Тышҡы ссылка (http:// префиксны онотмаң)",
-       "headline_sample": "Төп исем",
-       "headline_tip": "2-нце ҡат төп исем",
-       "nowiki_sample": "Мынта форматлау кәрәкмәйтеген текстны өстәң",
-       "nowiki_tip": "Вики-форматлауға ҡолаҡ салмау",
-       "image_tip": "Кергеселгән файл",
-       "media_tip": "Файлға ссылка",
-       "sig_tip": "Ҡул ҡуйыуығыс пелән уаҡыт",
-       "hr_tip": "Горизонталь цыйыҡ (әлтән ошланмаң)",
        "summary": "Пашҡартыуларны аңнатыу:",
        "minoredit": "Кецкенә пашҡартыу",
        "watchthis": "Пы питне көсәткәле",
index ce0d068..a0e57b7 100644 (file)
        "resettokens-watchlist-token": "Token pikeun asupan raramat (Atom/RSS) [[Special:Watchlist|parobahan kana kaca-kaca anu diponcorong]]",
        "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Setél token anu dipilih",
-       "bold_sample": "Téks kandel",
-       "bold_tip": "Téks kandel",
-       "italic_sample": "Tulisan déngdék",
-       "italic_tip": "Tulisan déngdék",
-       "link_sample": "Judul tutumbu",
-       "link_tip": "Tutumbu internal",
-       "extlink_sample": "http://www.example.com Judul tutumbu",
-       "extlink_tip": "Tutumbu kaluar (inget awalan http://)",
-       "headline_sample": "Téks judul",
-       "headline_tip": "Judul tingkat 2",
-       "nowiki_sample": "Asupkeun téks nu teu diformat di dieu",
-       "nowiki_tip": "Format wiki tong diwaro",
-       "image_sample": "Conto.jpg",
-       "image_tip": "Ngasupkeun gambar",
-       "media_sample": "Conto.ogg",
-       "media_tip": "Tutumbu berkas",
-       "sig_tip": "Paraf anjeun katut cap titimangsa",
-       "hr_tip": "Garis horisontal",
        "summary": "Ringkesan:",
        "subject": "Subyék:",
        "minoredit": "Ieu éditan minor",
index 5fe33ce..af8170c 100644 (file)
        "tog-useeditwarning": "Varna mig om jag lämnar en redigeringssida med osparade ändringar",
        "tog-prefershttps": "Använd alltid en säker anslutning medan jag är inloggad",
        "tog-showrollbackconfirmation": "Visa en bekräftelsedialog när man klickar på en tillbakarullningslänk",
+       "tog-requireemail": "Kräv e-postadress för att återställa lösenord",
        "underline-always": "Alltid",
        "underline-never": "Aldrig",
        "underline-default": "Webbläsarens eller utseendets standardinställning",
        "resettokens-watchlist-token": "Nyckel för webbflöde (Atom/RSS) av [[Special:Watchlist|ändringar i sidor på din bevakningslista]]",
        "resettokens-done": "Nycklarna är återställda.",
        "resettokens-resetbutton": "Återställ valda nycklar",
-       "bold_sample": "Fetstil",
-       "bold_tip": "Fetstil",
-       "italic_sample": "Kursiv stil",
-       "italic_tip": "Kursiv stil",
-       "link_sample": "Länktitel",
-       "link_tip": "Intern länk",
-       "extlink_sample": "http://www.exempel.com länktitel",
-       "extlink_tip": "Extern länk (kom ihåg prefixet http://)",
-       "headline_sample": "Rubriktext",
-       "headline_tip": "Rubrik i nivå 2",
-       "nowiki_sample": "Skriv in oformaterad text här",
-       "nowiki_tip": "Ignorera wikiformatering",
-       "image_sample": "Exempel.jpg",
-       "image_tip": "Inbäddad fil",
-       "media_sample": "Exempel.ogg",
-       "media_tip": "Länk till fil",
-       "sig_tip": "Din signatur med tidsstämpel",
-       "hr_tip": "Horisontell linje (använd sparsamt)",
        "summary": "Sammanfattning:",
        "subject": "Ämne:",
        "minoredit": "Detta är en mindre ändring",
        "userinvalidconfigtitle": "'''Varning:''' Utseendet \"$1\" finns inte. Kom ihåg att .css-, .json- och .js-sidor för enskilda användare börjar på liten bokstav. Exempel: {{ns:user}}:Foo/vector.css i stället för {{ns:user}}:Foo/Vector.css.",
        "updated": "(Uppdaterad)",
        "note": "'''Obs!'''",
-       "previewnote": "'''Kom ihåg att detta bara är en förhandsvisning.'''\nDina ändringar har ännu inte sparats!",
+       "previewnote": "<strong>Kom ihåg att detta bara är en förhandsgranskning.</strong>\nDina ändringar har ännu inte sparats!",
        "continue-editing": "Fortsätt redigera",
        "previewconflict": "Den här förhandsvisningen är resultatet av den\nredigerbara texten ovanför,\nså som det kommer att se ut om du väljer att spara.",
        "session_fail_preview": "Vi kunde inte behandla din redigering eftersom sessionsdata gått förlorad.\nDu kanske har loggats ut. Var god se till att du fortfarande är inloggad och försök igen.\nOm det fortfarande inte fungerar, prova att [[Special:UserLogout|logga ut]] och logga in igen, samt kontrollera att din webbläsare tillåter kakor från denna webbplats.",
        "undo-norev": "Redigeringen kan inte göras ogjord eftersom den inte finns eller har raderats.",
        "undo-nochange": "Det verkar som att redigeringen redan har blivit ogjord.",
        "undo-summary": "Gör version $1 av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]]) ogjord",
+       "undo-summary-anon": "Ångra sidversionen $1 av [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Gör version $1 av en dold användare ogjord",
        "cantcreateaccount-text": "[[User:$3|$3]] har blockerat den här IP-adressen ('''$1''') från att registrera konton.\n\nAnledningen till blockeringen var \"$2\".",
        "cantcreateaccount-range-text": "IP-adresserna i intervallet <strong>$1</strong>, som inkluderar din IP-adress (<strong>$4</strong>), har blockerats från att skapa konton av [[User:$3|$3]].\n\nAnledningen enligt $3 var <em>$2</em>",
        "prefs-help-email": "Att ange e-postadress är valfritt, men gör det möjligt att få ditt lösenord mejlat till dig om du glömmer det.",
        "prefs-help-email-others": "Du kan också välja att låta andra kontakta dig via e-post genom en länk på din användar- eller diskussionssida. \nDin e-postadress avslöjas inte när andra användare kontaktar dig.",
        "prefs-help-email-required": "E-postadress måste anges.",
+       "prefs-help-requireemail": "Om detta markeras kommer lösenordsåterställningar endast skickas via e-post om återställaren har angivit både användarnamn och e-postadress för detta konto.",
        "prefs-info": "Grundläggande information",
        "prefs-i18n": "Internationalisering",
        "prefs-signature": "Signatur",
        "alreadyrolled": "Det gick inte att rulla tillbaka den senaste redigeringen av [[User:$2|$2]] ([[User talk:$2|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) på sidan [[:$1|$1]]. Någon annan har redan rullat tillbaka eller redigerat sidan.\n\nSidan ändrades senast av [[User:$3|$3]] ([[User talk:$3|diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).",
        "editcomment": "Redigeringskommentaren var: <em>$1</em>.",
        "revertpage": "Återställde redigeringar av  [[Special:Contributions/$2|$2]] ([[User talk:$2|användardiskussion]]) till senaste versionen av [[User:$1|$1]]",
+       "revertpage-anon": "Ångrade redigeringar av [[Special:Contributions/$2|$2]] till senaste sidversionen av [[User:$1|$1]]",
        "revertpage-nouser": "Återställde redigeringar av en dold användare till den senaste versionen av {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Återställde ändringar av {{GENDER:$3|$1}};\nändrade tillbaka till senaste versionen av {{GENDER:$4|$2}}.",
        "sessionfailure-title": "Sessionsfel",
        "ipblocklist-legend": "Sök efter en blockerad användare",
        "blocklist-userblocks": "Dölj kontoblockeringar",
        "blocklist-tempblocks": "Dölj tillfälliga blockeringar",
+       "blocklist-indefblocks": "Dölj otydliga blockeringar",
        "blocklist-addressblocks": "Dölj enskilda IP-blockeringar",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Alla",
index 6004a1a..cc29e0b 100644 (file)
        "resettokens-token-label": "$1 (current value: $2)",
        "resettokens-done": "Seti vibazi upya.",
        "resettokens-resetbutton": "Seti vibazi ulivyochagua upya",
-       "bold_sample": "Maandishi ya kooze",
-       "bold_tip": "Kukoozesha maandishi",
-       "italic_sample": "Matini ya italiki",
-       "italic_tip": "Matini ya italiki",
-       "link_sample": "Jina la kiungo",
-       "link_tip": "Kiungo cha ndani",
-       "extlink_sample": "http://www.example.com jina la kiungo",
-       "extlink_tip": "Kiungo cha nje (kumbuka kuanza na http:// )",
-       "headline_sample": "Matini ya kichwa cha habari",
-       "headline_tip": "Kichwa cha habari, saizi 2",
-       "nowiki_sample": "Weka matini bila fomati hapa",
-       "nowiki_tip": "Puuza fomati ya Wiki",
-       "image_tip": "Faili lililotiwa",
-       "media_tip": "Kiungo cha faili la picha, video, au sauti",
-       "sig_tip": "Sahihi yako na saa ya kusahihisha",
-       "hr_tip": "Mstari wa mlalo (usitumie ovyo)",
        "summary": "Muhtasari:",
        "subject": "Kuhusu/kichwa cha habari:",
        "minoredit": "Haya ni mabadiliko madogo",
index cd35ab2..14aba57 100644 (file)
@@ -66,9 +66,9 @@
        "underline-never": "Ńigdy",
        "underline-default": "Podug sztalowańo uoglůndarki",
        "editfont-style": "Styl czćůnki we placu sprowjyń:",
-       "editfont-monospace": "Monotypowe krojło",
-       "editfont-sansserif": "Bezszeryfowe krojło",
-       "editfont-serif": "Szeryfowe krojło",
+       "editfont-monospace": "Monotypowe pismo",
+       "editfont-sansserif": "Bezszeryfowe pismo",
+       "editfont-serif": "Szeryfowe pismo",
        "sunday": "Niydziela",
        "monday": "Pyńdziałek",
        "tuesday": "Wtorek",
        "morenotlisted": "Ńy je to kůmplytno lista",
        "mypage": "Zajta",
        "mytalk": "Dyskusyjŏ",
-       "anontalk": "Godka tygo IP",
+       "anontalk": "Dyskusyjŏ",
        "navigation": "Nawigacyjŏ",
        "and": "&#32;i",
        "faq": "FAQ",
        "viewsourcelink": "pokŏż zdrzōdło",
        "editsectionhint": "Edytuj sekcyjõ: $1",
        "toc": "Wykŏz treści",
-       "showtoc": "uobejrzij",
-       "hidetoc": "schrůń",
+       "showtoc": "pokŏż",
+       "hidetoc": "skryj",
        "collapsible-collapse": "Skryj",
        "collapsible-expand": "Pokŏż",
        "thisisdeleted": "Pokŏzać abo stworzić zaś $1?",
        "sort-ascending": "Sortuj rosnůnco",
        "nstab-main": "Strōna",
        "nstab-user": "{{GENDER:{{BASEPAGENAME}}|Strōna ôd używŏcza|Strōna ôd używŏczki}}",
-       "nstab-media": "Pliki",
+       "nstab-media": "Zbiōr",
        "nstab-special": "Specjalnŏ strōna",
        "nstab-project": "Strōna projektu",
        "nstab-image": "Zbiōr",
        "no-null-revision": "Ńy je mogebne stworzyńe zerowyj wersyji zajty \"$1\"",
        "badtitle": "Niynŏleżny tytuł",
        "badtitletext": "Podany tytuł strōny to je niynŏleżny, prōzny, abo źle zalinkowany tytuł metajynzykowy abo interwiki.\nMoże w nim być jedyn abo wiyncyj znakōw, co niy mogōm być używane we tytułach.",
-       "perfcached": "To co sam je naszkryflane, to ino kopja ze pamjyńći podryncznyj a może ńy być aktualne. Nojwjyncyj {{PLURAL:$1|jydyn wynik je|$1 wyniki sům}} we tyj pamjyńći.",
-       "perfcachedts": "To co sam je naszkryflane, to ino kopja s pamjyńći podryncznyj a bůło uaktualńůne $1. Nojwjyncyj {{PLURAL:$4|jeden wynik je|$4 wyniki sům}} dostympne.",
-       "querypage-no-updates": "Uaktualńyńo lo tyj zajty sům terozki zawarte. Dane, kere sam sům, ńy zostouy uodśwjyżůne.",
+       "perfcached": "Dane niżyj sōm ze cache i mogōm niy być aktualne. Maksymalnie {{PLURAL:$1|jedyn wynik je|$1 wyniki sōm|$1 wynikōw je}} we tyj pamiyńci.",
+       "perfcachedts": "Dane niżyj sōm ze cache i ôstatni rŏz były uaktualniōne $1. Maksymalnie {{PLURAL:$4|jedyn wynik je|$4 wyniki sōm|$4 wynikōw je}} we pamiyńci cache.",
+       "querypage-no-updates": "Aktualizacyje tyj strōny sōm terŏz zastawiōne.\nDane tukej niy bydōm ôdświyżane.",
        "viewsource": "Zdrzōdłowy tekst",
        "viewsource-title": "Pokŏż zdrzōdło $1",
        "actionthrottled": "Akcyjo wstrzimano",
        "filereadonlyerror": "Ńy idźe pomjyńać plika \"$1\" abo repozytorjum \"$2\" terozki je zawarte.\n\nAdministrator kery zawarł wćepał kůmyntorz: \"$3\".",
        "invalidtitle-knownnamespace": "Felerne mjano \"$3\" w przestrzeńy \"$2\".",
        "invalidtitle-unknownnamespace": "Felerne mjano ze ńyznomům nůmerům raumu mjan $1: \"$2\"",
-       "exception-nologin": "Ńy jest żeś zalogůwany",
+       "exception-nologin": "Niy je żeś wlogowany(ŏ)",
        "exception-nologin-text": "Prosza [[Special:Userlogin|zaloguj śe]] coby mjeć mogebność przejśćo do tyj zajty abo akcyji.",
        "virus-badscanner": "Felerno konfiguracyjo – ńyznany skaner antywirusowy ''$1''",
        "virus-scanfailed": "skanowańy ńyudone (feler $1)",
        "virus-unknownscanner": "ńyznajůmy průgram antywirusowy",
-       "logouttext": "'''Terozki jeżeś wylůgowany'''.\n\nDej pozůr, co na ńykerych zajtach przeglůndarka może dali pokozywać co jeżeś zalůgowany, a bydźe tak aże uodśwjyżysz jeij cache.",
+       "logouttext": "<strong>Używŏcz je wylogowany.</strong>\n\nDej pozōr, że podwiela niy ôdświyżysz cache przeglōndarki, niykere strōny mogōm sie durch pokazować choćby trwało zalogowanie.",
        "welcomeuser": "Witej, $1",
        "welcomecreation-msg": "Uotwarli my sam lo Ćebje kůnto.\nPamjyntej coby posztalować [[Special:Preferences|preferencyji]]",
        "yourname": "Miano ôd używŏcza:",
        "login": "Wloguj sie",
        "nav-login-createaccount": "Logowańy / Tworzyńy kůnta",
        "logout": "Wyloguj",
-       "userlogout": "Uodloguj śe",
+       "userlogout": "Ôdlogowanie",
        "notloggedin": "Niy je żeś wlogowany(ŏ)",
        "userlogin-noaccount": "Niy mŏsz kōnta?",
        "userlogin-joinproject": "Dołōncz do {{GRAMMAR:D.lp|{{SITENAME}}}}",
        "nosuchusershort": "Ńy mo sam użytkowńika uo mjańe \"$1\".",
        "nouserspecified": "Musisz podać miano ôd używŏcza.",
        "login-userblocked": "Tyn sprowjorz mo zawarte sprowjyńa. Ńy idźe śe zalogować.",
-       "wrongpassword": "Hasło kere żeś naszkryfloł je felerne. Poprůbůj naszkryflać je jeszcze roz.",
+       "wrongpassword": "Wkludzōny login abo hasło sōm felerne.\nSprōbuj zaś.",
        "wrongpasswordempty": "Hasło kere żeś podou je uostawjůne blank. Naszkryflej je jeszcze roz.",
        "passwordtooshort": "Hasło kere żeś podoł je felerne abo za krůtke.\nHasło muśi mjeć przinojmńij {{PLURAL:$1|1 buchsztaba|$1 buchsztabůw}} a być inksze uod mjana użytkowńika.",
        "password-name-match": "Hasło mo być inksze atoli mjano używocza.",
        "user-mail-no-body": "Bůła průba posłańo e-brifa uo blank abo krůtkim tekśće.",
        "changepassword": "Zmiana hasła",
        "resetpass_announce": "Zalůgowołżeś śe ze tymczasowym kodym uotrzimanym bez e-brif. Coby zakůńczyć proces logůwańo muśisz nasztalować nowe hasło:",
-       "resetpass_header": "Zmjyń hasło lů swojygo kůnta",
+       "resetpass_header": "Zmiyń hasło kōnta",
        "oldpassword": "Stare hasło",
        "newpassword": "Nowe hasło",
        "retypenew": "Naszkryflej jeszcze roz nowe hasło:",
        "changepassword-success": "Twoje hasło zostoło půmyślńy půmjyńone!",
        "botpasswords": "Hasła bota",
        "resetpass_forbidden": "Ńy idźe sam půmjyńyć hasłůw.",
-       "resetpass-no-info": "Muśisz być zalogowany, coby uzyskoć bezpostrzedńi dostymp do tyj zajty.",
-       "resetpass-submit-loggedin": "Zmjyń hasło",
+       "resetpass-no-info": "Żeby mieć bezpostrzedni dostymp do tyj strōny, trzeba sie zalogować.",
+       "resetpass-submit-loggedin": "Zmiyń hasło",
        "resetpass-submit-cancel": "Uodćepej",
        "resetpass-wrong-oldpass": "Felerne tymczasowe abo aktualne hasło.\nMożliwe co właśńy zmjyńiłżeś swoje hasło abo poprosiłżeś uo nowe tymczasowe hasło.",
        "resetpass-temp-password": "Tymczasowe hasło:",
        "changeemail-newemail": "Nowŏ e-mailowŏ adresa:",
        "changeemail-none": "podstawowo",
        "changeemail-submit": "Spamjyntej nowy",
-       "resettokens": "Resetuj tokeny",
-       "bold_sample": "Ruby tekst",
-       "bold_tip": "Ruby tekst",
-       "italic_sample": "Kursywa",
-       "italic_tip": "Kursywa",
-       "link_sample": "Tytuł linku",
-       "link_tip": "Wewnytrzny link",
-       "extlink_sample": "http://www.example.com tytuł linku",
-       "extlink_tip": "Zewnyntrzny link (pamiyntej ô prefiksie http:// )",
-       "headline_sample": "Tekst nŏgōwka",
-       "headline_tip": "Nŏgōwek 2. poziōmu",
-       "nowiki_sample": "Wraź sam niysformatowany tekst",
-       "nowiki_tip": "Ignoruj formatowanie wiki",
-       "image_tip": "Wrażōny zbiōr",
-       "media_tip": "Link do zbioru",
-       "sig_tip": "Twōj podpis ze datōm i czasym",
-       "hr_tip": "Poziōmŏ linijŏ (niy nadużywej)",
+       "resettokens": "Resetuj tokyny",
        "summary": "Ôpis zmian:",
        "subject": "Tyjma/iberszryft:",
        "minoredit": "To je małŏ zmiana",
        "watchthis": "Ôbserwuj tã strōnã",
        "savearticle": "Spamiyntej",
        "publishpage": "Ôpublikuj strōnã",
+       "publishchanges": "Ôpublikuj zmiany",
        "publishpage-start": "Ôpublikuj strōnã...",
        "preview": "Podglōnd",
        "showpreview": "Pokŏż podglōnd",
        "showdiff": "Pokŏż zmiany",
        "anoneditwarning": "<strong>Pozōr:</strong> Niy je żeś wlogowany(ŏ). Jak zrobisz jakeś zmiany, to Twoja adresa IP bydzie publicznie widać. Jeźli <strong>[$1 sie wlogujesz]</strong> abo <strong>[$2 stworzisz kōnto]</strong>, to Twoje zmiany bydōm przipisane do kōnta społym ze inkszymi profitami.",
-       "anonpreviewwarning": "Ńy jeżeś zalogowany. Twój IP ausdruk uostańy spamjyntany, eli ty bydźesz sprowjać zajte.",
+       "anonpreviewwarning": "<em>Niy je żeś wlogowany(ŏ). Spamiyntanie zmian zapisze twoja adresa IP we historyji edycyji tyj strōny.</em>",
        "missingsummary": "'''Pozůr:''' Ńy wprowadźůł żeś uopisu pomjyńań. Kej go ńy chcesz wprowadzać, naćiś knefel Spamjyntej jeszcze roz.",
        "missingcommenttext": "Wkludź kōmyntŏrz niżyj.",
        "missingcommentheader": "'''Dej pozůr:''' Treść nagłůwka je blank - uzupełńij go! Jeli tego ńy zrobisz, Twůj kůmyntorz bydźe naszkryflony bez nagłůwka.",
        "editingold": "'''Dej pozůr: Sprowjosz inkszo wersyjo zajty kej bjeżůnco. Jeli jům naszkryflosz, wszyjske půźńyjsze pomjyńańa bydům wyćepane.'''",
        "yourdiff": "Rōżnice",
        "copyrightwarning": "Pamjyntej uo tym, aże cołki wkłod do {{SITENAME}} udostympńůmy wedle zasad $2 (dokładńij we $1). Jak ńy chcesz, coby kożdy můg go půmjyńać a dalij rozpowszychńoć, ńy wćepuj uůnygo sam. Szkryflajůnc sam tukej pośwjadczosz tyż, co te pisańy je twoje własne, abo żeś go wźůn(a) ze materjołůw kere sům na ''public domain'', abo kůmpatybilne.<br />\n'''PROSZA ŃY WĆEPYWAĆ SAM MATYRJOŁŮW KERE SŮM CHRŮŃONE AUTORSKIM PRAWYM BEZ DOZWOLEŃO WŁAŚĆIĆELA!'''",
-       "copyrightwarning2": "Pamjyntej uo tym, aże cołki wkłod do {{GRAMMAR:MS.lp|{{SITENAME}}}} może być sprowjany, pomjyńany abo wyćepany bez inkszych użytkownikůw. Jak ńy chcysz, coby kożdy můg uůnygo zmjyńać a dalij rozpowszychńoć bez uograniczyń, ńy wćepuj go sam.<br />\nSzkryflajůnc sam tukej pośwjadczosz tyż, co te pisańy je twoje własne, abo żeś go wźůn(a) ze matyrjołůw kere sům na public domain, abo kůmpatybilne (kuknij tyż: $1).\n'''PROSZA ŃY WĆEPYWAĆ SAM MATYRJOŁŮW KERE SŮM CHRŮŃONE PRAWYM AUTORSKIM BEZ DOZWOLEŃO WŁAŚĆIĆELA!'''",
+       "copyrightwarning2": "Dej pozōr, iże cołki wkłŏd na {{SITENAME}} może być edytowany, zmiyniany abo kasowany ôd inkszych używŏczōw. Jeźli niy chcesz, żeby twōj tekst bōł niymiyłosiernie edytowany, to niy wkludzej go sam.<br />\nPrzirzekŏsz tyż nōm, iże wszyjsko je napisane ôd ciebie abo skopiowane ze dōmyny publicznyj abo podobnego wolnego zdrzōdła (po wiyncyj informacyji patrz $1).\n<strong>Niy wkludzej dzieł chrōniōnych autorskimi prawami bez przizwolyniŏ!</strong>",
        "longpageerror": "''Feler: Tekst kery żeś sam wćepywoł mo {{PLURAL:$1|jedyn kilobajt|$1 kilobajtůw}}. Maksymalno dugość tekstu ńy może być srogszo kej {{PLURAL:$2|jedyn kilobajt|$2 kilobajtůw}}. Twůj tekst ńy bydźe sam naszkryflany.'''",
        "readonlywarning": "'''Dej pozůr: Baza danych zostoua filowo zawarto skuli potřeb admińistracyjnych. Bestůž ńy do śe terozki naškryflać Twojich pomjyńań. Radzymy přećepać nowy tekst kajś do plika tekstowego (wytnij/wklej) a wćepać sam zaś po uodymkńyńću bazy.'''\n\nAdmińistrator kery zawar baza dou take wyjaśńyńe: $1",
        "protectedpagewarning": "'''Dej pozůr: Sprowjańe tyj zajty zostoło zawarte. Mogům jům sprowjać ino użytkowńicy ze uprawńyńami admińistratora.'''\nUostatńy wpis w rejerze je poniżej.",
        "cascadeprotectedwarning": "'''Dej pozůr:''' Ta zajta zostoła zawarto a ino użytkowńicy ze uprawńyńami admińistratora mogům jům sprowjać. Zajta ta je podpjynto pod {{PLURAL:$1|nastympujůnco zajta, kero zostoła zawarto|nastympujůncych zajtach, kere zostouy zawarte}} ze załůnczonům uopcjům dźedźiczyńo:",
        "titleprotectedwarning": "'''Dej pozůr: Zajta uo tym titlu zostoła zawarto a ino [[Special:ListGroupRights|ńykerzi użytkowńicy]] mogům jům wćepać.'''\nUostatńy wpis z rejera je ńyżej.",
        "templatesused": "{{PLURAL:$1|Muster użyty|Mustry użyte}} na tyj strōnie:",
-       "templatesusedpreview": "{{PLURAL:$1|Muster użyty|Mustry użyte}} na tyj podglōńdzie:",
+       "templatesusedpreview": "{{PLURAL:$1|Muster użyty|Mustry użyte}} na tym podglōńdzie:",
        "templatesusedsection": "{{PLURAL:$1|Szablon|Szablůny}} użyte we tyj tajli:",
        "template-protected": "(chrōniōny)",
        "template-semiprotected": "(pōłzawarte)",
        "hiddencategories": "Ta strōna je we {{PLURAL:$1|jednyj skrytyj kategoryji|$1 skrytych kategoryjach}}:",
        "nocreatetext": "Na {{GRAMMAR:MS.lp|{{SITENAME}}}} tworzyńy nowych zajtůw uograńiczůno.\nMoges sprowjać te co już sům, abo [[Special:UserLogin|zalogować śe, abo śa zaregisztrować]].",
        "nocreate-loggedin": "Ńy mosz uprowńyń do tworzyńo nowych zajtůw.",
-       "sectioneditnotsupported-title": "Sprowjańy tajli ńymogebne",
-       "sectioneditnotsupported-text": "Sprowjańy tajli ńymogebne na tyj zajće.",
+       "sectioneditnotsupported-title": "Edycyjŏ sekcyje niyma spiyranŏ",
+       "sectioneditnotsupported-text": "Edycyjŏ sekcyji niyma spiyranŏ na tyj strōnie.",
        "permissionserrors": "Feler uprawniyń",
        "permissionserrorstext": "Ńy mosz uprowńyń do takij akcyje {{PLURAL:$1|skuli tego, co:|bestůż, co:}}",
        "permissionserrorstext-withaction": "Niy mŏsz przizwolyniŏ na $2, skuli {{PLURAL:$1|takigo powodu|takich powodōw}}:",
        "edit-no-change": "Twoje sprowjyńe uostoło zignorowane pů takymu, aże ńic żeś we tekśće ńy zmjyńůł.",
        "postedit-confirmation-saved": "Spamjyntano twoje sprowjyńe.",
        "edit-already-exists": "Ńy idźe utworzić nowyj zajty.\nTako zajta już sam je.",
-       "defaultmessagetext": "Tekst důmyślny",
+       "defaultmessagetext": "Wychodny tekst wiadōmości",
        "content-model-wikitext": "wikitekst",
        "expensive-parserfunction-warning": "Dej pozůr: ta zajta mo za dużo uodwouań do funkcyji parsera, kere mocno uobćůnżajům systym.\n\nPowinno być myńi jak $2 {{PLURAL:$2|wywołańy|wywołańo|wywołań}}, a terozki {{PLURAL:$1|je $1 wywołańy|sům $1 wywołańo|je $1 wywołań}}.",
        "expensive-parserfunction-category": "Zajty kere majům za dużo uodwołań do funkcyji parsera, kere mocno uobćůnżajům systym.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> ze <strong>$3</strong>|Rezultaty <strong>$1 – $2</strong> ze <strong>$3</strong>}}",
        "search-nonefound": "Żŏdne wyniki niy ôdpowiadajōm tymu zapytaniu.",
        "powersearch-legend": "Sznupańy zaawansowane",
-       "powersearch-ns": "Sznupej we przestrzyńach mjan:",
+       "powersearch-ns": "Szukej we przestrzyniach mian:",
        "powersearch-togglelabel": "Ôznŏcz:",
        "powersearch-toggleall": "Wszyjsko",
        "powersearch-togglenone": "Nic",
        "prefs-edits": "Liczba edycyji:",
        "prefs-skin": "Skůrka",
        "skin-preview": "podglůnd",
-       "datedefault": "Důmyślny",
+       "datedefault": "Wychodny",
        "prefs-labs": "Funkcyje \"labs\"",
        "prefs-user-pages": "Zajty ôd używŏczōw",
        "prefs-personal": "Dane używocza",
        "prefs-rc": "Ôstatnie zmiany",
-       "prefs-watchlist": "Pozůrlista",
+       "prefs-watchlist": "Ôbserwowane",
        "prefs-watchlist-days": "Liczba dńůw widocznych na liśće artikli, na kere dowosz pozůr:",
        "prefs-watchlist-days-max": "Max $1 {{PLURAL:$1|dźyń|dńi}}",
        "prefs-watchlist-edits": "Liczba půmjyńań pokozywanych we rozszyrzůnyj liśće artiklůw, na kere dowosz pozůr:",
        "prefs-watchlist-edits-max": "Maksymalno liczba: 1000",
        "prefs-watchlist-token": "ID pozůrlisty:",
        "prefs-misc": "Roztůmajte",
-       "prefs-resetpass": "Zmjyń hasło",
+       "prefs-resetpass": "Zmiyń hasło",
        "prefs-changeemail": "Zmiyń abo skasuj adresã e-mail",
        "prefs-setemail": "Nasztaluj adresã e-mail",
        "prefs-email": "Ôpcyje e-maila",
        "prefs-rendering": "Wyglōnd",
        "saveprefs": "Spamjyntej",
        "restoreprefs": "Prziwrōć wszyjske wychodne preferyncyje (we wszyjskich sekcyjach)",
-       "prefs-editing": "Sprowjańy",
+       "prefs-editing": "Edycyjŏ",
        "searchresultshead": "Sznupańy",
        "stub-threshold": "Maksymalny rozmjar artikla uoznaczanygo kej <a href=\"#\" class=\"stub\">stub (kůnsek)</a>",
        "stub-threshold-disabled": "Uodymkńynte",
        "recentchangesdays": "Liczba dńůw do pokazańo we půmjyńanych na uostatku:",
        "recentchangesdays-max": "(maksymalńy $1 {{PLURAL:$1|dźyń|dńi}})",
        "recentchangescount": "Liczba pozycyji na liśće půmjyńanych na uostatku, we historyje zajtůw a zajtach rejerůw:",
-       "prefs-help-recentchangescount": "Ze listům ńydawnych pomjyńan, gyszichta zajt a rejer.",
-       "savedprefs": "Twoje sztalowańo we preferyncyjach zostoły naszkryflane.",
+       "prefs-help-recentchangescount": "Maksymalnŏ wielość: 1000",
+       "savedprefs": "Twoje sztelōnki były spamiyntane.",
        "timezonelegend": "Czasowo sztrefa",
        "localtime": "Lokalny czas:",
        "timezoneuseserverdefault": "Użyj domyślnygo czasu serwera ($1)",
        "timezoneregion-indian": "Ocean Indyjski",
        "timezoneregion-pacific": "Uocean Spokojny",
        "allowemail": "Inksze użytkowńiki můgům posyłać mje e-brify",
-       "prefs-searchoptions": "Sznupańe",
+       "prefs-searchoptions": "Wyszukowanie",
        "prefs-namespaces": "Raumy mjan",
        "default": "důmyślńy",
-       "prefs-files": "Pliki",
+       "prefs-files": "Zbiory",
        "youremail": "E-mail:",
-       "username": "{{GENDER:$1|Mjano używocza}}:",
+       "username": "{{GENDER:$1|Miano ôd używŏcza|Miano ôd używŏczki}}:",
        "prefs-memberingroups": "Należy do {{PLURAL:$1|grupy|grup:}}",
        "prefs-registration": "Data registracyje:",
        "yourrealname": "Prawdźiwe mjano",
        "right-bigdelete": "Wyćep zajty s dugům historyjům půmjyńań",
        "right-deleterevision": "Wyćepywańy a wćepywańy nazod wskazanych sprowjyń zajtůw",
        "right-deletedhistory": "Pokazuj historyjo usuńyntych sprowjyń, bez tekstu uopisu",
-       "right-browsearchive": "Sznupej za wyćepanymi zajtůma",
+       "right-browsearchive": "Szukej we skasowanych strōnach",
        "right-undelete": "Prziwrŏcanie skasowanych strōn",
        "right-suppressrevision": "Přyglůndańy i uodtwařańy sprowjyń schrůńůnych před admińistratorami",
        "right-suppressionlog": "Pokoż prywatne lůgi",
        "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",
+       "newuserlogpagetext": "To je regest tworzōnych używŏczōw.",
        "rightslog": "Regest uprawniyń używŏczōw",
-       "rightslogtext": "Rejer půmjyńań uprawńyń užytkowńikůw.",
+       "rightslogtext": "To je regest zmian uprawniyń używŏczōw.",
        "action-read": "přeglůndańo tyj zajty",
        "action-edit": "edycyje tyj strōny",
        "action-createpage": "tworzyńo zajtůw",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ôbejzdrzij tyż [[Special:NewPages|listã nowych strōn]])",
        "rcfilters-legend-heading": "<strong>Wykŏz skrōtōw:</strong>",
        "rcfilters-other-review-tools": "Inksze nŏrzyńdzia kōntrole",
+       "rcfilters-savedqueries-cancel-label": "Pociep",
+       "rcfilters-search-placeholder": "Filtruj zmiany (użyj myni abo wyszukej podle filtra)",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Edytorzi, co niy sōm zalogowani.",
        "rcfilters-filter-humans-label": "Czowiek (niy bot)",
+       "rcfilters-filter-pageedits-label": "Edycyje strōny",
+       "rcfilters-filter-newpages-label": "Tworzynie strōn",
+       "rcfilters-filter-logactions-label": "Registrowane czyności",
        "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>).",
        "hist": "hist.",
        "hide": "Skryj",
        "show": "Pokŏż",
-       "minoreditletter": "d",
+       "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtōw}} po zmianie",
        "recentchangeslinked-to": "Pokŏż zmiany na strōnach, co linkujōm do podanyj strōny",
        "upload": "Zaladuj zbiōr",
        "uploadbtn": "Prziślij zbiōr",
-       "reuploaddesc": "Nazod do formulařa uod wćepywańo.",
-       "uploadnologin": "Ńy jest žeś zalogůwany",
+       "reuploaddesc": "Pociep przesyłanie i wrōć do formulara.",
+       "uploadnologin": "Niy je żeś wlogowany(ŏ)",
        "uploadnologintext": "Muśyš śe [[Special:UserLogin|zalůgować]] ńim wćepńeš pliki.",
        "upload_directory_missing": "Katalog lo wćepywanych plikůw ($1) ńy istńeje a serwer WWW ńy poradźi go utwořić.",
        "upload_directory_read_only": "Serwer ńy može škryflać do katalůgu ($1) kery je přeznačůny na wćepywane pliki.",
        "uploaderror": "Feler při wćepywańu",
-       "uploadtext": "Ůžyj formulařa půńižej do wćepywańo plikůw.\nJak chceš přejřeć dotychčas wćepane pliki, abo w ńich šnupać, přeńdź do [[Special:FileList|listy douůnčůnych plikůw]]. Wšyjstke wćepańo uodnotowane sům we [[Special:Log/upload|rejeře přesůuanych plikůw]], a jygo wyćepańy we [[Special:Log/delete|rejeře wyćepanych]].\n\nPlik pojawi śe na zajće, jak užyješ linka wedle jydnygo s nastympujůncych wzorůw:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki></code>''' pokože plik we pounyj postaći\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|200px|thumb|left|tekst uopisu]]</nowiki></code>''' pokože šyroko na 200 pikseli mińjaturka umjyščůno při lewym margineśe, uotočůno bez ramka, s podpisym „podpis grafiki”\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki></code>''' dowo bezpostředńi link do plika ńy pokozujůnc go",
+       "uploadtext": "Użyj formulara niżyj, żeby przisłać zbiory.\nŻeby przejzdrzeć abo szukać zaladowane zbiory, idź do [[Special:FileList|listy zaladowanych zbiorōw]], przisłania sōm tyż listowane we [[Special:Log/upload|regeście przisłań]], skasowania sōm we [[Special:Log/delete|regeście skasowań]].\n\nŻeby wrazić zbiōr na strōnã, użyj linka we jednyj ze formōw niżyj:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Zbiōr.jpg]]</nowiki></code></strong>, żeby użyć połnyj wersyje zbioru\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Zbiōr.png|200px|thumb|left|alt text]]</nowiki></code></strong>, żeby użyć 200 pikselōw szyrokõ miniaturã we rōmce przi lewym marginesie ze „alt text” za ôpis\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Zbiōr.ogg]]</nowiki></code></strong>, żeby bezpostrzednio linkować zbiōr bez jego pokazowaniŏ",
        "upload-permitted": "Dopuščalne formaty plikůw: $1.",
        "upload-preferred": "Zalecane formaty plikůw: $1.",
        "upload-prohibited": "Zakozane formaty plikůw: $1.",
        "filedelete-reason-otherlist": "Inkszy powůd",
        "filedelete-reason-dropdown": "* Nojczynstsze powody wyćepańa\n** Naruszyńy praw autorskych\n** Kopja plika kery już sam jest",
        "filedelete-edit-reasonlist": "Sprowjańe powodůw wyćepańo zajty",
-       "mimesearch": "Sznupej MIME",
+       "mimesearch": "Szukanie podle typu MIME",
        "mimesearch-summary": "Ta zajta ůmožliwjo šnupańe za plikůma wedle jeich typu MIME. Užyće: typtreśći/podtyp, np. <code>image/jpeg</code>.",
        "mimetype": "Typ MIME:",
        "download": "pobier",
        "unwatchedpages": "Zajty na kere ńy je dowany pozůr",
        "listredirects": "Lista przekerowań",
+       "listduplicatedfiles": "Lista zbiorōw ze tuplikatami",
        "unusedtemplates": "Niyużywane mustry",
        "unusedtemplatestext": "Půńižej znojdowo śe lista wšyjstkich zajtůw s přestřyńi mjan {{ns:template}}, kere ńy sům užywane bez inkše zajty. Sprowdź inkše adresowańa ku šablůnům, ńim wyćepńeš ta zajta.",
        "unusedtemplateswlh": "ku adresatu",
        "statistics-header-users": "Statystyka užytkowńikůw",
        "statistics-articles": "Zajty",
        "statistics-pages": "Zajty",
-       "statistics-pages-desc": "Wszyjstke zajty na wiki, wroz ze zajtami godki, przekerowańami a t.p.",
-       "statistics-files": "Wćepane pliki",
-       "statistics-edits": "Sprowjyńa wykůnane uod powstańo {{grammar:D.lp|{{SITENAME}}}}",
+       "statistics-pages-desc": "Wszyjske strōny na wiki, społym ze dyskusyjami, pōnkniyńciami itp.",
+       "statistics-files": "Zaladowane zbiory",
+       "statistics-edits": "Edycyje strōn ôd powstaniŏ {{grammar:D.lp|{{SITENAME}}}}",
        "statistics-edits-average": "Strzedńo liczba sprowjyń na zajta",
        "statistics-users": "Zarejerowanych użytkowńikůw",
        "statistics-users-active": "Aktywnych użytkowńikůw",
        "nrevisions": "$1 {{PLURAL:$1|wersja|wersje|wersjůw}}",
        "specialpage-empty": "Ta zajta je pusto.",
        "lonelypages": "Sierocie strōny",
-       "lonelypagestext": "Do zajtůw půńiżyj ńy adresuje żodno inkszo zajta we {{SITENAME}}.",
+       "lonelypagestext": "Do tych strōn niy linkuje żŏdnŏ inkszŏ strōna we {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
        "uncategorizedpages": "Niyskategoryzowane strōny",
        "uncategorizedcategories": "Kategoryje bez kategoryji",
        "uncategorizedimages": "Niyskategoryzowane zbiory",
        "wantedpages": "Potrzebne strōny",
        "wantedfiles": "Potrzebne zbiory",
        "wantedtemplates": "Potrzebne mustry",
-       "mostlinked": "Nojczyńśćij adresowane",
-       "mostlinkedcategories": "Kategoryje we kerych je nojwjyncyj artikli",
+       "mostlinked": "Nojczyńścij linkowane",
+       "mostlinkedcategories": "Nojwiyncyj używane kategoryje",
        "mostlinkedtemplates": "Nojczyńśćij adresowane mustry",
-       "mostcategories": "Zajty kere majům nojwiyncyj kategoryjůw",
-       "mostimages": "Nojczyńśćij adresowane pliki",
-       "mostrevisions": "Nojczyńśćij sprowjane artikle",
+       "mostcategories": "Strōny, co majōm nojwiyncyj kategoryji",
+       "mostimages": "Nojczyńścij używane zbiory",
+       "mostinterwikis": "Strōny, co majōm nojwiyncyj linkōw interwiki",
+       "mostrevisions": "Nojwiyncyj edytowane strōny",
        "prefixindex": "Wszyjske strōny ze prefiksym",
        "shortpages": "Nojkrōtsze strōny",
        "longpages": "Duge strōny",
        "protectedpages-cascade": "Yno zajty zabezpjeczůne rekursywńy",
        "protectedpagesempty": "Żodno zajta ńy je terozki zawarto ze podanymi parametrami.",
        "protectedtitles": "Zastawiōne tytuły",
-       "protectedtitlesempty": "Do tych štalowań utwořyńy artikla uo dowolnym mjańy ńy je zawarte",
+       "protectedtitlesempty": "Żŏdne strōny niy sōm terŏz zawarte ze tymi parametrami.",
        "listusers": "Lista używŏczōw",
        "listusers-editsonly": "Pokoż yno użytkowńikůw kere majům sprowjyńa",
        "usereditcount": "$1 {{PLURAL:$1|sprowjyńe|sprowjyńa|sprowjyń}}",
        "move": "Przeniyś",
        "movethispage": "Přećepej ta zajta",
        "unusedimagestext": "Pamjyntej, proša, aže inkše witryny, np. projekty Wikimedja w inkšych godkach, můgům adresować do tych plikůw užywajůnc bezpośredńo URL. Bez tůž ńykere ze plikůw můgům sam być na tej liśće pokozane mimo, aže žodna zajta ńy adresuje do ńich.",
-       "unusedcategoriestext": "Katygorje pokazane půńižej istńejům, choć ńy kořisto s ńich žadyn artikel ańi katygorja.",
+       "unusedcategoriestext": "Te strōny kategoryji istniyjōm, chociŏż żŏdnŏ inkszŏ strōna ani kategoryjŏ ich niy używŏ.",
        "notargettitle": "Wskazywano zajta ńy istńeje",
        "notargettext": "Ńy podano zajty abo užytkowńika, do kerych ta uoperacyjo mo być wykůnano.",
        "nopagetitle": "Ńy ma sam zajty docelowyj",
        "booksources": "Zdrzōdła ksiōnżek",
        "booksources-search-legend": "Szukej informacyji ô ksiōnżkach",
        "booksources-search": "Szukej",
-       "booksources-text": "Půńiżyj je lista uodnośńikůw do inkszych witryn, kere pośredńiczům we sprzedaży nowych a używanych buchůw, a tyż můgům mjeć dolsze informacyje uo poszukiwanym bez ćebje buchu.",
+       "booksources-text": "Niżyj je wykŏz linkōw do inkszych strōn, co przedŏwajōm nowe i używane ksiōnżki, i mogōm mieć dalsze informacyje ô ksiōnżkach, co ich szukŏsz:",
        "booksources-invalid-isbn": "Podany numer ISBN zostoł rozpoznany kej felerny. Sprowdź aże podany numer je zgodny s numerym kery je we zdrzůdle.",
        "specialloguserlabel": "Fto:",
        "speciallogtitlelabel": "Cyl (nazwa abo {{ns:user}}:miano ôd używŏcza):",
        "log": "Regest ôperacyji",
-       "all-logs-page": "Wszyjske Ã³peracyje",
+       "all-logs-page": "Wszyjske Ã´peracyje",
        "alllogstext": "Spōlne pokŏzanie wszyjskich dostympnych regestōw {{SITENAME}}.\nMożesz uakuratnić widok bez ôbranie zorty regestu, miana ôd używŏcza, abo tykanyj strōny (dŏwŏ pozōr na małe i sroge litery).",
        "logempty": "Niy ma we regeście zgodliwych elymyntōw.",
        "log-title-wildcard": "Szukej tytułōw, co sie zaczynajōm ôd tego tekstu",
        "categories": "Kategoryje",
        "categoriespagetext": "Zajta przedstowjo lista katygoryji s zajtůma a plikůma.\n[[Special:UnusedCategories|Ńyużywane kategoryj]] ńy zostoły tukej pokozane.\nKukńij tyż [[Special:WantedCategories|ńyistńyjůnce kategoryje]].",
        "categoriesfrom": "Pokož kategoryje začynajůnc uod:",
-       "deletedcontributions": "Wyćepane sprowjyńa użytkowńika",
-       "deletedcontributions-title": "Wyćepane sprowjyńa użytkowńika",
+       "deletedcontributions": "Skasowany wkłŏd ôd używŏcza",
+       "deletedcontributions-title": "Skasowany wkłŏd ôd używŏcza",
        "sp-deletedcontributions-contribs": "wkłŏd",
-       "linksearch": "Necowe uodwołańa",
+       "linksearch": "Szukanie zewnyntrznych linkōw",
        "linksearch-pat": "Wzorzec sznupańo",
        "linksearch-ns": "Przestrzyń mjan",
        "linksearch-ok": "Šnupej",
        "linksearch-text": "Idźe użyć symbola wjeloznacznygo „*”. Lů bajszpila „*.wikipedia.org” spowoduje sznupańy za wszyjstkimi linkůma kere prowadzům ku důmyńy „wikipedia.org” a jeij poddůmyn.<br />\nUobsůgiwane protokoły: $1",
        "linksearch-line": "$1 link na zajće $2",
        "linksearch-error": "Symbola wjeloznacznygo idźe użyć yno na anfangu mjana hosta.",
-       "listusersfrom": "Pokaž užytkowńikůw začynojůnc uod:",
+       "listusersfrom": "Pokŏż używŏczōw ôd:",
        "listusers-submit": "Uobejrzij",
        "listusers-noresult": "Ńy znejdźůno žodnygo užytkowńika.",
        "activeusers": "Lista aktywnych używŏczōw",
        "emailsend": "Wyślij",
        "emailccme": "Wyślij mi kopja moiy wjadomości.",
        "emailccsubject": "Kopja Twojej wjadůmośći do $1: $2",
-       "emailsent": "Wjadůmość zostoua wysuano",
-       "emailsenttext": "Twoja wjadůmość zostoua wysuano.",
+       "emailsent": "E-mail wysłany",
+       "emailsenttext": "Twoja wiadōmość e-mail je wysłanŏ.",
        "emailuserfooter": "Wjadůmość e-brif zostoła wysłano s {{GRAMMAR:D.lp|{{SITENAME}}}} ku $2 bez $1 s użyćym „Wyślij e-brif ku tym użytkowńikowi”.",
        "usermessage-editor": "Nadŏwca systymowych kōmunikatōw",
        "watchlist": "Ôbserwowane",
        "watchlistfor2": "{{GENDER:$1|Używŏcza|Używŏczki}} $1 $2",
        "nowatchlist": "Ńy ma žodnych pozycyji na liśće zajtůw, na kere dowoš pozůr.",
        "watchlistanontext": "$1 coby uobejřeć abo sprowjać elymynty listy zajtůw, na kere dowoš pozůr",
-       "watchnologin": "Ńy jest žeś zalůgowany",
+       "watchnologin": "Niy je żeś wlogowany(ŏ)",
        "addedwatchtext": "Zajta \"[[:$1]]\" zostoua dodano do Twojij [[Special:Watchlist|listy artiklůw, na kere dowoš pozůr]].\nNa tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty godki, a mjano zajty bydźeš mjou škryflane '''tustym''' na [[Special:RecentChanges|liśće půmjyńanych na ůostatku]], cobyś mjou wygoda w jei pomjyńańa filować.",
        "removedwatchtext": "Artikel \"[[:$1]]\" zostou wyćepńjynty s [[Special:Watchlist|Twojij pozorlisty]].",
        "watch": "Ôbserwuj",
        "unwatch": "Niy ôbserwuj",
        "unwatchthispage": "Přestoń dować pozůr",
        "notanarticle": "To ńy je artikel",
-       "notvisiblerev": "Wersyja zostoua wyćepano",
+       "notvisiblerev": "Ôstatniŏ wersyjŏ ôd inkszego używŏcza była skasowanŏ",
        "watchlist-details": "Na Twojij liście ôbserwowanych {{PLURAL:$1|je $1 strōna|sōm $1 strōny|je $1 strōn}} (plus strōny dyskusyje).",
        "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>.",
        "confirmdeletetext": "Zarŏz wyciepniesz artikel i cołkõ ôd niygo historyjõ. Przitupluj, iże na isto chcesz to zrobić, miarkujesz kōnsekwyncyje, i co robisz to podle [[{{MediaWiki:Policy-url}}|prawideł]].",
        "actioncomplete": "Fertig",
        "actionfailed": "Ńy udało śe.",
-       "deletedtext": "Wyćepano \"$1\". Rejer uostatnio zrobiůnych wyćepań možeš uobejžyć tukej: $2.",
+       "deletedtext": "Strōna „$1” była skasowanŏ.\nWejzdrzij na $2 po regest ôstatnich skasowań.",
        "dellogpage": "Regest kasowań",
        "dellogpagetext": "To je lista uostatńo wykůnanych wyćepań.",
-       "deletionlog": "rejer wyćepań",
+       "deletionlog": "regest skasowań",
        "reverted": "Prziwrōcōnŏ poprzedniõ wersyjõ",
        "deletecomment": "Čymu:",
        "deleteotherreason": "Inkšy powůd:",
        "rollbacklink": "cŏfej",
        "rollbacklinkcount": "cŏfnij $1 {{PLURAL:$1|edycyjõ|edycyje|edycyji}}",
        "rollbackfailed": "Niy szło wycŏfać zmiany",
-       "cantrollback": "Ńy idże cofnůńć pomjyńyńo, sam je ino jedna wersyja tyi zajty.",
+       "cantrollback": "Niy idzie cŏfnōńć edycyje;\nôstatni edytōr to je jedyny autōr tyj strōny.",
        "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>.",
        "revertpage": "Wycofano sprowjyńe użytkowńika [[Special:Contributions/$2|$2]] ([[User talk:$2|godka]]). Autor prziwrůcůnej wersyji to [[User:$1|$1]].",
        "modifiedarticleprotection": "zmiyniōł(yła) poziōm zawarciŏ „[[$1]]”",
        "unprotectedarticle": "uodymknyu [[$1]]",
        "movedarticleprotection": "przekludzůno sztalowańa zabezpjeczyńo s „[[$2]]” ku „[[$1]]”",
-       "protect-title": "Pomjyńeńe poźomu zawarćo „$1”",
+       "protect-title": "Zmiana poziōmu zawarciŏ „$1”",
        "prot_1movedto2": "[[$1]] přećepano do [[$2]]",
        "protect-legend": "Potwjyrdź zawarće",
        "protectcomment": "Čymu:",
-       "protectexpiry": "Wygaso:",
+       "protectexpiry": "Wygasŏ:",
        "protect_expiry_invalid": "Čas wygaśńjyńćo je zuy.",
        "protect_expiry_old": "Čas wygaśńjyńćo je w downiej ńiž terozki.",
-       "protect-text": "Sam tukej možyš uobejžeć i pomjyńyć poźům zawarcia zajty '''$1'''.",
+       "protect-text": "Sam możesz ôbejzdrzeć i zmiynić poziōmy zawarciŏ strōny <strong>$1</strong>.",
        "protect-locked-blocked": "Ńy možeš půmjyńać poźůmůw zawarćo kej žeś sům je zawarty uod sprowjyń. Terozki štalowańa dla zajty '''$1''' to:",
        "protect-locked-dblock": "Ńy idźe půmjyńić poźůmu zawarća s kuli tygo co baza danych tyž je zawarto. Uobecne štalowańa dla zajty '''$1''' to:",
        "protect-locked-access": "Ńy moš uprowńyń coby pomjyńyć poziům zawarcia zajty. Uobecne ustawjyńo dlo zajty '''$1''' to:",
        "protect-summary-cascade": "dźedźičyńy",
        "protect-expiring": "wygaso $1 (UTC)",
        "protect-expiry-indefinite": "na zowdy",
-       "protect-cascade": "Dźedźyčyńe zawarćo - zawřij wšyskie zajty kere sům na tyi zajće.",
+       "protect-cascade": "Zawrzij strōny, co sōm wrażōne do tyj strōny (erbowanie zawarciŏ)",
        "protect-cantedit": "Ńy možeš pomjyńyć poziůmu zawarća tyi zajty, po takiymu, co uona je dlo Ćebje zawarto uod pomjyńańa.",
        "protect-othertime": "Inkszy uokres:",
        "protect-othertime-op": "inkszy uokres",
        "protect-existing-expiry": "Czas wygaśńyńćo nasztalowany terozki: $2 uo $3",
+       "protect-existing-expiry-infinity": "Czas wygaśniyńciŏ: niyskōńczōny",
        "protect-otherreason": "Inkszy/dodatkowy powůd:",
        "protect-otherreason-op": "inkszy/dodatkowy powůd",
        "protect-dropdown": "*Nojczynstsze powody zawarćo uod sprowjyń\n** Czynste wandalizmy\n** Czynste spamowańy\n** Wojna edycyjno\n** Wygupy",
-       "protect-edit-reasonlist": "Sprowjej powody zawarćo uod sprowjyń",
+       "protect-edit-reasonlist": "Edytuj powody zawarciŏ",
        "protect-expiry-options": "2 godźiny:2 hours,1 dźyń:1 day,3 dńi:3 days,1 tydźyń:1 week,2 tygodńy:2 weeks,1 mjeśůnc:1 month,3 mjeśůnce:3 months,6 mjeśency:6 months,1 rok:1 year,ńyskůńčůny:infińite",
        "restriction-type": "Pozwolyńy:",
-       "restriction-level": "Poźům:",
+       "restriction-level": "Poziōm:",
        "minimum-size": "Minimalnŏ srogość",
        "maximum-size": "Maksymalnŏ srogość:",
        "pagesize": "(bajtōw)",
        "undeleteinvert": "Zaznocz na uopy",
        "undeletecomment": "Powůd wćepańo nazod:",
        "cannotundelete": "Wćepańy nazod ńy powjodo śe.\nKto inkšy můgu wćepać nazod zajta pjyrwšy.",
-       "undeletedpage": "'''Wćepano nazod zajta $1.'''\n\nUobejřij [[Special:Log/delete|rejer wyćepań]], kejbyś chćou přeglůndnůnć uostatnie uoperacyje wyćepywańo i wćepywańo nazod zajtůw.",
-       "undelete-header": "Uobejřij [[Special:Log/delete|rejer wyćepań]] coby sprawdźić uostatńo wyćepane zajty.",
+       "undeletedpage": "<strong>Strōna „$1” była prziwrōcōnŏ</strong>\n\nWejzdrzij do [[Special:Log/delete|regestu skasowań]] po lista ôstatnich skasowań i prziwrōcyń.",
+       "undelete-header": "Wejzdrzij na [[Special:Log/delete|regest skasowań]] po ôstatnio skasowane strōny.",
        "undelete-search-box": "Šnupej za wyćepńjyntymi zajtami",
        "undelete-search-prefix": "Strōny, co sie zaczynajōm ôd:",
        "undelete-search-submit": "Šnupej",
        "ipboptions": "2 godziny:2 hours,1 dziyń:1 day,3 dni:3 days,1 tydziyń:1 week,2 tydnie:2 weeks,1 miesiōnc:1 month,3 miesiōnce:3 months,6 miesiyncy:6 months,1 rok:1 year,na dycki:infinite",
        "ipbhidename": "Schrůń mjano użytkowńika/adres IP w rejerze zawarć, na liśće aktywnych zawarć i liśće użytkowńikůw",
        "ipbwatchuser": "Ôbserwuj włŏsnõ strōnã i strōnã dyskusyje ôd tego używŏcza",
-       "ipb-change-block": "Zmjyń sztalowańa zawarća uod sprowjyń",
+       "ipb-change-block": "Zablokuj zaś tego używŏcza z tymi sztelōnkami",
        "badipaddress": "Felerny adres IP",
        "blockipsuccesssub": "Zawarće uod sprowjyń udane",
        "blockipsuccesstext": "Užytkowńik [[Special:Contributions/$1|$1]] zostou zawarty uod sprowjyń.<br />\nPřyńdź do [[Special:BlockList|listy zawartych adresůw IP]] coby přejřeć zawarća.",
        "block-log-flags-noemail": "e-mail zablokowany",
        "block-log-flags-nousertalk": "ńy może sprowjać włosnyj zajty godki",
        "block-log-flags-angry-autoblock": "rozszerzůne automatyczne zawjyrańe załůnczůne",
-       "range_block_disabled": "Možliwość zawjerańo zakresu adresůw IP zostoua wůuůnčůno.",
+       "range_block_disabled": "Blokowanie zŏkresu adres IP je zakŏzane.",
        "ipb_expiry_invalid": "Felerny čas wygaśńjyńćo zawarća.",
        "ipb_expiry_temp": "Schrůńůne mjano użytkowńika noleży zawrzić trwale.",
        "ipb_already_blocked": "\"$1\" je już zawarty uod sprowjyń",
        "lockbtn": "Zawřij baza danych",
        "unlockbtn": "Uodymkńij baza danych",
        "locknoconfirm": "Ńy zaznačůužeś potwjerdzyńo.",
-       "lockdbsuccesssub": "Baza danych zostoua půmyślńy zawarto",
-       "unlockdbsuccesssub": "Baza danych zostoua půmyślńy uodymkńynto",
-       "lockdbsuccesstext": "Baza danych zostoua zawarto.<br />\nPamjyntej coby [[Special:UnlockDB|jům uodymknůńć]] po zakůńčyńu dźouań admińistracyjnych.",
-       "unlockdbsuccesstext": "Baza danych zostoua uodymkńynto.",
+       "lockdbsuccesssub": "Zablokowanie bazy danych sie podarziło",
+       "unlockdbsuccesssub": "Blokada bazy danych symniyntŏ",
+       "lockdbsuccesstext": "Baza danych je zablokowanŏ.<br />\nPamiyntej, żeby [[Special:UnlockDB|jōm ôtworzić]] jak robota bydzie skōńczōnŏ.",
+       "unlockdbsuccesstext": "Baza danych je ôdblokowanŏ.",
        "lockfilenotwritable": "Ńy idźe naškreflać plika zawarća bazy danych.\nZawjerańy i uodmykańy bazy danych wymogo coby plik můgu być naškreflany bez web serwer.",
        "databasenotlocked": "Baza danych ńy je zawarto.",
        "move-page": "Przećep $1",
        "movepage-moved": "'''\"$1\" przećiśńjynto ku \"$2\"'''",
        "articleexists": "Artikel ze takym mjanym już je, abo mjano je złe.\nWybjer inksze mjano.",
        "cantmove-titleprotected": "Ńy możesz przećepnůńć zajty, beztuż co jeij nowe mjano je ńydozwolůne skuli zabezpjeczyńo przed utworzyńym",
-       "movetalk": "Przećiś godke, jak możno.",
+       "movetalk": "Przeniyś zwiōnzanõ ze strōnōm dyskusyjõ",
        "move-subpages": "Přećepńij podzajty",
        "move-talk-subpages": "Jeli je to możliwe przekludź wszyjstke zajty godki podzajtůw",
        "movepage-page-exists": "Zajta $1 już istńeje a ńy idźe jeij autůmatyczńy nadszkryflać.",
        "export-templates": "Douůnč šablůny",
        "allmessages": "Komunikaty",
        "allmessagesname": "Mjano",
-       "allmessagesdefault": "Tekst důmyślny",
+       "allmessagesdefault": "Wychodny tekst wiadōmości",
        "allmessagescurrent": "Tekst uobecny",
        "allmessagestext": "Uoto lista wšyjstkych kůmůńikatůw systymowych dostympnych w přestřyńi mjan MedjaWiki.\nUodwjydź [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Tuůmačyńy MediaWiki] a tyž [https://translatewiki.net translatewiki.net] kejbyś chćou učestńičyć w tuůmačyńu uoprůgramowańo MediaWiki.",
        "allmessages-not-supported-database": "Ta zajta ńy može być užyta, bez tůž co zmjynna '''$wgUseDatabaseMessages''' je wůuůnčůno.",
        "import-token-mismatch": "Straćiły śe dane ze sesyje. Prosza spróbować zaś.",
        "import-invalid-interwiki": "Ńy idźe importować s podanyj wiki.",
        "importlogpage": "Regest importōw",
-       "importlogpagetext": "Rejer přeprowadzůnych importůw zajtůw s inkšych serwisůw wiki.",
+       "importlogpagetext": "Regest importōw strōn społym ze jejich historyjami ze inkszych wiki.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|wersyja|wersyje|wersyji}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|wersyja|wersyje|wersyji}} ze $2",
        "tooltip-pt-userpage": "{{GENDER:|Moja}} strōna",
        "show-big-image-preview": "Srogość tego podglōndu: $1.",
        "show-big-image-other": "{{PLURAL:$2|Inkszŏ rozdzielczość|Inksze rozdzielczości}}: $1.",
        "show-big-image-size": "$1 x $2 pikselōw",
-       "newimages": "Galerjo nowych uobrozkůw",
+       "newimages": "Galeryjŏ nowych ôbrŏzkōw",
        "imagelisttext": "Půnižyj na {{PLURAL:$1||posortowanyj $2}} liśće {{PLURAL:$1|znojdowo|znojdujům|znojdowo}} śe '''$1''' {{PLURAL:$1|plik|pliki|plikůw}}.",
        "newimages-summary": "Na tyj ekstra zajće prezyntowane sům uostatńo wćepńynte pliki.",
        "newimages-legend": "Filtruj",
        "confirmemail_text": "Projekt {{SITENAME}} wymago weryfikacyji adresa e-brif před užyćym fůnkcyji kořistajůncych s počty.\nWćiś knefel půńižy coby wysúać na swůj adres list s linkym do zajty WWW.\nList bydźe zawjeroú link do zajty, w kerym zakodowany bydźe idyntyfikator.\nUodymkńij tyn link we přyglůndarce, čym potwjerdźiš, co ježeś užytkowńikym tygo adresa e-brif.",
        "confirmemail_pending": "Kod potwierdzyniŏ bōł prawie do Ciebie wysłany. Jak Twoje kōnto było niydŏwno zaregistrowane, to poczekej pŏrã minut na jego dotarcie, podwiela wyślesz prośbã ô nowy.",
        "confirmemail_send": "Wyślij kod potwjerdzyńo",
-       "confirmemail_sent": "Wjadůmość e-brif s kodym uwjeřitelńajůncym zostoua wysuano.",
+       "confirmemail_sent": "E-mail ze potwiyrdzyniym wysłany.",
        "confirmemail_oncreate": "Link s kodym potwjerdzyńo zostou wysuany na Twůj adres e-brif.\nKod tyn ńy je wymagany coby śe sam lůgować, ale bydźeš muśou go aktywować uodmykajůnc uotřimany link we přyglůndarce ńim zouůnčyš ńykere uopcyje e-brif na wiki.",
        "confirmemail_sendfailed": "{{SITENAME}} ńy poradźiła wysłać potwjerdzajůncyj wjadůmośći e-brif.\nSprowdź aże we adreśe ńy ma felernyj buchsztaby.\n\nSystym pocztowy zwrůćił kůmůńikat: $1",
        "confirmemail_invalid": "Felerny kod potwjerdzyńo.\nKod može być předawńůny",
        "imgmultigoto": "Idź do strōny $1",
        "table_pager_next": "Nastympnŏ strōna",
        "table_pager_prev": "Poprzedniŏ strōna",
-       "table_pager_first": "Pjyrwšo zajta",
-       "table_pager_last": "Uostatńo zajta",
+       "table_pager_first": "Piyrszŏ strōna",
+       "table_pager_last": "Ôstatniŏ strōna",
        "table_pager_limit": "Pokož $1 pozycyji na zajće",
        "table_pager_limit_submit": "Pokož",
        "table_pager_empty": "Brak wynikůw",
        "autosumm-blank": "POZŮR! Usůńjyńće treśći (zajta pozostoła pusto)!",
-       "autosumm-replace": "POZŮR! Zastůmpjyńy treśći hasua bardzo krůtkym tekstym: „$1”",
+       "autosumm-replace": "Zastōmpiynie zawartości tekstym „$1”",
        "autoredircomment": "Przekerowanie do [[$1]]",
        "autosumm-new": "Stworzōnŏ nowõ strōnã: \"$1\"",
        "lag-warn-normal": "Na tyj liśće zmjany nowsze jak {{PLURAL:$1|sekůnda|sekůnd}} můgům ńy być widoczne.",
        "watchlistedit-normal-legend": "Wyćep zajty s listy artikli na kere dowoš pozůr",
        "watchlistedit-normal-explain": "Půńiżyj mosz lista artikli na kere dowosz pozůr.\nCoby wyćepać z ńij jako zajta, zaznocz pole przi ńij i naćiś knefel „{{int:Watchlistedit-normal-submit}}”.\nMożesz tyż skorzistać ze [[Special:EditWatchlist/raw|tekstowygo sprowjorza listy artikli na kere dowosz pozůr]].",
        "watchlistedit-normal-submit": "Wyćep s listy",
-       "watchlistedit-normal-done": "Z Twoi listy artikli na kere dowoš pozůr {{PLURAL:$1|zostoua wyćepano 1 zajta|zostouy wyćepane $1 zajty|zostouo wyćepanych $1 zajtůw}}:",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Była skasowanŏ jedna strōna|Były skasowane $1 strōny|Było skasowanych $1 strōn}} ze twojij listy ôbserwowanych:",
        "watchlistedit-raw-title": "Tekstowy edytor listy artikli na kere dowosz pozůr",
        "watchlistedit-raw-legend": "Tekstowy edytor listy artikli na kere dowoš pozůr",
        "watchlistedit-raw-explain": "Půńižy moš lista artikli na kere dowoš pozůr. W koždej lińii znojdowo śe titel jydnygo artikla. Lista možeš sprowjać dodajůnc nowe zajty i wyćepujůnc te kere na ńij sům. Jak skůńčyš, naćiś knefel „Uaktualńij lista zajtůw na kere dowům pozůr”.\nMožeš tyž [[Special:EditWatchlist|užyć standardowygo edytora]].",
        "watchlistedit-raw-titles": "Title:",
        "watchlistedit-raw-submit": "Uaktualńij lista",
-       "watchlistedit-raw-done": "Lista zajtůw na kere dowoš pozůr zostoua uaktualńůna",
+       "watchlistedit-raw-done": "Lista twojich ôbserwowanych była zaktualizowanŏ.",
        "watchlistedit-raw-added": "Dodano {{PLURAL:$1|1 pozycyja|$1 pozycyje|$1 pozycyji}} do listy artikli na kere dowoš pozůr:",
        "watchlistedit-raw-removed": "Wyćepano {{PLURAL:$1|1 pozycyja|$1 pozycyje|$1 pozycyji}} z listy zajtůw na kere dowoš pozůr:",
        "watchlisttools-clear": "Wysnŏż ôbserwowane",
        "redirect-page": "Idyntyfikatōr strōny",
        "redirect-revision": "Wersyjŏ strōny",
        "redirect-file": "Miano zbioru",
-       "fileduplicatesearch": "Šnupej za duplikatym plika",
+       "fileduplicatesearch": "Szukej tuplikatōw zbioru",
        "fileduplicatesearch-summary": "Šnupej za duplikatůma plika na podstawje wartośći fůnkcyji skrůtu.",
        "fileduplicatesearch-filename": "Mjano pliku:",
        "fileduplicatesearch-submit": "Šnupej",
        "specialpages": "Ekstra strōny",
        "specialpages-note-restricted": "* Ekstra zajty uogůlńy dostympne.\n* <strong class=\"mw-specialpagerestricted\">Ekstra zajty do kerych dostymp je uograńiczůny.</strong>",
        "specialpages-group-maintenance": "Reporty kōnserwacyjne",
-       "specialpages-group-other": "Inkše ekstra zajty",
+       "specialpages-group-other": "Inksze ekstra strōny",
        "specialpages-group-login": "Logowanie / registracyjŏ",
-       "specialpages-group-changes": "Pomjyńane na uostatku a rejery",
-       "specialpages-group-media": "Pliki",
+       "specialpages-group-changes": "Ôstatnie zmiany i regesty",
+       "specialpages-group-media": "Zbiory",
        "specialpages-group-users": "Używŏcze i uprawniynia",
-       "specialpages-group-highuse": "Zajty čynsto užywane",
+       "specialpages-group-highuse": "Czynsto używane strōny",
        "specialpages-group-pages": "Listy strōn",
-       "specialpages-group-pagetools": "Nořyńdźa zajtůw",
-       "specialpages-group-wiki": "Informacyje a werkcojgi wiki",
-       "specialpages-group-redirects": "Ekstra zajty, kere kerujům",
+       "specialpages-group-pagetools": "Norzyńdzia strōn",
+       "specialpages-group-wiki": "Norzyńdzia i dane",
+       "specialpages-group-redirects": "Ekstra zajty przekerowaniŏ",
        "specialpages-group-spam": "Nořyńdźa do wyćepywanio spamu",
        "blankpage": "Pusto zajta",
        "intentionallyblankpage": "Ta zajta nauůmyślńy uostoua śe pusto",
        "searchsuggest-search": "Szukej we {{SITENAME}}",
        "duration-days": "$1 {{PLURAL:$1|dziyń|dni}}",
        "expand_templates_ok": "OK",
+       "mediastatistics": "Statystyki mediōw",
        "randomrootpage": "Losowŏ strōna (bez podstrōn)",
        "changecredentials": "Zmiyń poświadczynia",
-       "changecredentials-submit": "Zmiyń poświadczynia"
+       "changecredentials-submit": "Zmiyń poświadczynia",
+       "removecredentials": "Kasowanie poświadczyń"
 }
index 337b503..a0e5ae8 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|உங்கள் கவனிப்புப் பட்டியல் பக்களின் மாற்றத்திற்கான]] வலை ஓடைச் (Atom/RSS) சீட்டுகள்",
        "resettokens-done": "சீட்டுகள் புதுப்பிப்பு.",
        "resettokens-resetbutton": "தேர்தெடுத்த வில்லைகளை மறுஅமை",
-       "bold_sample": "தடித்த எழுத்துக்கள்",
-       "bold_tip": "தடித்த எழுத்து",
-       "italic_sample": "சாய்வெழுத்து",
-       "italic_tip": "சாய்வெழுத்து",
-       "link_sample": "இணைப்புத் தலைப்பு",
-       "link_tip": "உள்ளக இணைப்பு",
-       "extlink_sample": "http://www.example.com இணைப்புத் தலைப்பு",
-       "extlink_tip": "வெளியிணைப்பு (http:// முன்னிணைப்பை மறக்காதீர்)",
-       "headline_sample": "தலைப்பு",
-       "headline_tip": "இரண்டாம் படித் தலைப்பு",
-       "nowiki_sample": "விக்கி நிரலாக்கத்தால் புறக்கணிக்கப்படவேண்டிய உரையை இங்கே இடவும்",
-       "nowiki_tip": "விக்கி நிரலாக்கத்தைப் புறக்கணி",
-       "image_tip": "பொதிந்துள்ள படிமம்",
-       "media_tip": "கோப்பு இணைப்பு",
-       "sig_tip": "நேர முத்திரையுடன் உங்கள் கையொப்பம்",
-       "hr_tip": "கிடைக் கோடு (அரிதாகவே பயன்படுத்துங்கள்)",
        "summary": "சுருக்கம்:",
        "subject": "விடயம்:",
        "minoredit": "இது ஒரு சிறு தொகுப்பு",
index 2f50898..d297dbf 100644 (file)
        "resettokens": "T’ringun kbalay lawziy niwan sawsu’",
        "resettokens-tokens": "Niwan sawsu’:",
        "resettokens-done": "Wal t’aring kbalay lawziy niwan sawsu’ na mima’.",
-       "bold_sample": "Qthuy na biru’",
-       "bold_tip": "Qthuy na biru’",
-       "italic_sample": "Mtkkiy na biru’",
-       "italic_tip": "Mtkkiy na biru’",
-       "link_sample": "Spzyang lalu’ na ’ubuy sqaniy",
-       "link_tip": "’nubuy sa qsahuy",
-       "extlink_sample": "http://www.example.com qaniy quw lalu’ na ’ubuy",
-       "extlink_tip": "’ubuy tay bzinah(zngyay su’ yaquw http://quw tqsu’ miru’)",
-       "headline_sample": "Biru’ spzyang lalu’ tay msinqutux",
-       "headline_tip": "Biru’ na spzyang lalu’ na binrwan tay msinsazing",
-       "nowiki_sample": "Si’ quw biru’ na iyat minKs’ xwa’",
-       "nowiki_tip": "Ini’ si’ inlung quw minKs’xwa’ kkayal kay’ na Wiki’",
-       "image_tip": "Pinraw niya’  biru’ na zayzyuwaw",
-       "media_tip": "’ubuy sa biru’ na kwara’ zayzyuwaw",
-       "sig_tip": "Cyux pglgan bnrwan zikang ru ryax nquw binrwan lalu’",
-       "hr_tip": "Swe ping syen (laxiy brwaniy iyal)",
        "summary": "Lalu’ na spzyang bbiru’ su’:",
        "subject": "Spzyang na ptzyuwaw:",
        "minoredit": "Iyat spzyang balay ssr’tun miru’ balay qaniy hya’",
index 63a7abf..ced033d 100644 (file)
        "resettokens-watchlist-token": "ಜಾಲ ಆಹಾರದ ಸಂಕೇತಬಿಲ್ಲೆ (ಆಟಂ/ಆರ್.ಎಸ್.ಎಸ್) \n ವೀಕ್ಷಣಪಟ್ಟಿದ ಪುಟ ಬದಲಾವಣೆಲು\n[[Special:Watchlist|changes to pages on your watchlist]]",
        "resettokens-done": "ಸಂಕೇತಬಿಲ್ಲೆಲು ಪಿರತಾಪನೆ ಆತಾ.",
        "resettokens-resetbutton": "ಜತ್ತಿನ ಸಂಕೇತಬಿಲ್ಲೆಲೆನ್ ಪಿರತಾಪನೆ ಮಲ್ಪುಲೆ",
-       "bold_sample": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
-       "bold_tip": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
-       "italic_sample": "ಓರೆ ಅಕ್ಷರೊಲು",
-       "italic_tip": "ಓರೆ ಅಕ್ಷರೊಲು",
-       "link_sample": "ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
-       "link_tip": "ಉಲಯಿದ ಕೊಂಡಿ",
-       "extlink_sample": "http://www.example.com ಕೊಂಡಿದ ಸೀರ್ಸಿಕೆ",
-       "extlink_tip": "ಪಿದಯಿದ ಕೊಂಡಿ(http:// ರ್ದ್ ಸುರು ಮಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ)",
-       "headline_sample": "ತರೆಬರವುದ ಪಟ್ಯೊ",
-       "headline_tip": "2ನೇ ಮಟ್ಟೊದ ತರೆಬರವು",
-       "nowiki_sample": "ಮುಲ್ಪ ಫಾರ್ಮೇಟ್ ಆವಂದಿನಂಚಿನ ಪಟ್ಯೊನು ಸೇರಲೆ",
-       "nowiki_tip": "ವಿಕಿ ಫಾರ್ಮ್ಯಾಟಿಂಗ್‍ನ್ ಗೆನ್ಪೊಡ್ಚಿ",
-       "image_tip": "ಸೇರ್ಪಾಯಿನ ಫೈಲ್",
-       "media_tip": "ಫೈಲ್‍ದ ಕೊಂಡಿ",
-       "sig_tip": "ಪೊರ್ತುಮುದ್ರೆದೊಟ್ಟುಗು ಇರೆನ ದಸ್ಕತ್",
-       "hr_tip": "ಅಡ್ಡೊ ಗೆರೆ(ಆಯಿನಾತ್ ಕಮ್ಮಿ ಗಲಸ್‌ಲೆ)",
        "summary": "ಸಾರಾಂಸೊ:",
        "subject": "ವಿಷಯ/ಮುಖ್ಯಾ೦ಶ:",
        "minoredit": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
index f9c80aa..83a72df 100644 (file)
@@ -64,6 +64,7 @@
        "tog-watchlisthideminor": "చిన్న మార్పులను నా వీక్షణా జాబితాలో చూపించొద్దు",
        "tog-watchlisthideliu": "లాగిన్ ఐన వాడుకరులు చేసే మార్పులను వీక్షణా జాబితాలో చూపించకు",
        "tog-watchlistreloadautomatically": "ఫిల్టరు మారినప్పుడెల్లా వీక్షణ జాబితాను తిరిగి లోడు చెయ్యి (JavaScript అవసరం)",
+       "tog-watchlistunwatchlinks": "మార్పులు జరిగిన వీక్షణ పేజీలకు నేరుగా వీక్షించు/వద్దు సూచికలను ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) చేర్చు (టాగుల్ చెయాలంటే JavaScript ఆవశ్యకం)",
        "tog-watchlisthideanons": "అజ్ఞాత వాడుకరుల మార్పులను వీక్షణా జాబితాలో చూపించకు",
        "tog-watchlisthidepatrolled": "నిఘా ఉన్న మార్పులను వీక్షణజాబితా నుంచి దాచిపెట్టు",
        "tog-watchlisthidecategorization": "పేజీ వర్గీకరణను దాచు",
@@ -74,6 +75,7 @@
        "tog-useeditwarning": "ఏదైనా పేజీని నేను వదిలివెళ్తున్నప్పుడు దానిలో భద్రపరచని మార్పులు ఉంటే నన్ను హెచ్చరించు",
        "tog-prefershttps": "లాగిన్ అయి ఉన్నప్పుడెల్లా భద్ర కనెక్షనునే వాడు",
        "tog-showrollbackconfirmation": "రోల్‌బ్యాక్ లింకును నొక్కినపుడు నిర్ధారించుకునే సందేశాన్ని చూపించు",
+       "tog-requireemail": "సంకేతపదం మార్చుకోడానికి ఈమెయిలు ఆవశ్యకం",
        "underline-always": "ఎల్లప్పుడూ",
        "underline-never": "ఎప్పటికీ వద్దు",
        "underline-default": "అలంకారపు లేదా విహారిణి అప్రమేయం",
        "createaccountmail": "ఏదో ఒక తాత్కాలిక సంకేతపదాన్ని వాడి దాన్ని పేర్కొన్న ఈమెయిలు చిరునామాకు పంపించు",
        "createaccountmail-help": "సంకేతపదం తెలుసుకోనవసరం లేకుండా వేరొకరి కోసం ఖాతా సృష్టించేందుకు వాడవచ్చు.",
        "createacct-realname": "అసలు పేరు (ఐచ్చికం)",
-       "createacct-reason": "కారణం",
+       "createacct-reason": "కారణం (అందరికీ కనిపిస్తుంది)",
        "createacct-reason-ph": "మీరు మరో ఖాతాను ఎందుకు సృష్టించుకుంటున్నారు",
        "createacct-reason-help": "సృష్టించిన ఖాతాల చిట్టాలో చూపించే సందేశం",
        "createacct-submit": "మీ ఖాతాను సృష్టించుకోండి",
        "botpasswords": "బాట్ సంకేతపదాలు",
        "botpasswords-disabled": "బాట్ సంకేతపదాలను అచేతనం చేసాం.",
        "botpasswords-no-central-id": "బాఅత్ సంకేతపదాలను వాడాలంటే, మీరు ఒక కేంద్రీకృత ఖాతాలోకి లాగినవ్వాలి.",
+       "botpasswords-existing": "ప్రస్తుతం ఉన్న బాట్ సంకేతపదాలు",
        "botpasswords-createnew": "ఓ కొత్త బాట్ సంకేతపదాన్ని సృష్టించండి",
        "botpasswords-editexisting": "ఉనికిలో ఉన్న బాట్ సంకేతపదాన్ని మార్చండి",
+       "botpasswords-label-needsreset": "(సంకేతపదాన్ని మార్చాల్సిన అవసరం ఉంది)",
        "botpasswords-label-appid": "బాట్ పేరు:",
        "botpasswords-label-create": "సృష్టించు",
        "botpasswords-label-update": "తాజాకరించు",
        "resettokens-watchlist-token": "[[Special:Watchlist|changes to pages on your watchlist]] యొక్క జాల వడ్డన (Atom/RSS) కు టోకెన్",
        "resettokens-done": "టోకెన్లను రీసెట్ చేసాం.",
        "resettokens-resetbutton": "ఎంచుకున్న టోకెన్లను రీసెట్ చెయ్యి",
-       "bold_sample": "బొద్దు అక్షరాలు",
-       "bold_tip": "బొద్దు అక్షరాలు",
-       "italic_sample": "వాలు పాఠ్యం",
-       "italic_tip": "వాలు పాఠ్యం",
-       "link_sample": "లంకె పేరు",
-       "link_tip": "అంతర్గత లంకె",
-       "extlink_sample": "http://www.example.com లింకు పేరు",
-       "extlink_tip": "బయటి లింకు (దీనికి ముందు http:// ఇవ్వటం మరువకండి)",
-       "headline_sample": "శీర్షిక పాఠ్యం",
-       "headline_tip": "2వ స్థాయి శీర్షిక",
-       "nowiki_sample": "ఫార్మాటు చేయని పాఠ్యాన్ని ఇక్కడ చేర్చండి",
-       "nowiki_tip": "వికీ ఫార్మాటును పట్టించుకోవద్దు",
-       "image_sample": "Example.jpg",
-       "image_tip": "ఇమిడ్చిన ఫైలు",
-       "media_sample": "Example.ogg",
-       "media_tip": "దస్త్రపు లంకె",
-       "sig_tip": "సమయంతో సహా మీ సంతకం",
-       "hr_tip": "అడ్డగీత (అరుదుగా వాడండి)",
        "summary": "సారాంశం:",
        "subject": "విషయం:",
        "minoredit": "ఇది ఒక చిన్న మార్పు",
index d6e0181..6e5ecfc 100644 (file)
        "resetpass_text": "<!-- Hakerek testu iha ne'e -->",
        "passwordreset-username": "Naran uza-na'in:",
        "passwordreset-email": "Diresaun korreiu eletróniku:",
-       "link_tip": "Ligasaun ba laran",
-       "extlink_sample": "http://www.example.com ligasaun ba li'ur",
-       "extlink_tip": "Ligasaun ba li'ur (tau tan http://)",
-       "image_sample": "Ezemplu.jpg",
-       "media_sample": "Ezemplu.ogg",
-       "sig_tip": "Ita-nia asinatura ho data/oras",
        "summary": "Rezumu:",
        "minoredit": "Ne'e muda ki'ik",
        "watchthis": "Hateke pájina ne'e",
index 5989777..02478ca 100644 (file)
        "resettokens-tokens": "Нишонаҳо:",
        "resettokens-done": "Нишонаҳо тазим шуданд.",
        "resettokens-resetbutton": "Нишонаҳои интихобшуда танзим шаванд",
-       "bold_sample": "Матни пурранг",
-       "bold_tip": "Матни пурранг",
-       "italic_sample": "Матни хобида",
-       "italic_tip": "Матни хобида",
-       "link_sample": "Унвони пайванд",
-       "link_tip": "Пайванди дохилӣ",
-       "extlink_sample": "http://www.example.com унвони пайванд",
-       "extlink_tip": "Пайванди беруна (пешванди http:// фаромӯш накунед)",
-       "headline_sample": "Матни унвон",
-       "headline_tip": "Унвони сатҳи 2",
-       "nowiki_sample": "Инҷо матни қолаббанди-нашударо дохил кунед",
-       "nowiki_tip": "Рад кардани қолаббандии вики",
-       "image_sample": "Намуна.jpg",
-       "image_tip": "Тасвири дохили матн",
-       "media_sample": "Намуна.ogg",
-       "media_tip": "Пайванди парвандаи расона",
-       "sig_tip": "Имзои Шумо бо мӯҳри сана",
-       "hr_tip": "Хати уфуқӣ (сарфакорона истифода кунед)",
        "summary": "Хулоса:",
        "subject": "Мавзӯъ:",
        "minoredit": "Ин вироиши хурд аст",
index 8ad66c4..1dcbcc3 100644 (file)
        "resetpass-submit-loggedin": "Taƣjiri guzarvoƶa",
        "resetpass-wrong-oldpass": "Guzarvoƶai muvaqat jo oxir nomū'tabar.\nMumkin ast, ki şumo allakaj guzarvoƶaatonro bo muvaffaqijat taƣjir doda boşed jo darxosti jak guzarvoƶai muvaqatī karda boşed.",
        "resetpass-temp-password": "Guzarvoƶai muvaqqatī:",
-       "bold_sample": "Matni purrang",
-       "bold_tip": "Matni purrang",
-       "italic_sample": "Matni xobida",
-       "italic_tip": "Matni xobida",
-       "link_sample": "Unvoni pajvand",
-       "link_tip": "Pajvandi doxilī",
-       "extlink_sample": "http://www.example.com unvoni pajvand",
-       "extlink_tip": "Pajvandi beruna (peşvandi http:// faromūş nakuned)",
-       "headline_sample": "Matni unvon",
-       "headline_tip": "Unvoni sathi 2",
-       "nowiki_sample": "Inço matni qolabbandi-naşudaro doxil kuned",
-       "nowiki_tip": "Rad kardani qolabbandiji viki",
-       "image_tip": "Tasviri doxili matn",
-       "media_tip": "Pajvandi parvandai rasona",
-       "sig_tip": "Imzoi Şumo bo mūhri sana",
-       "hr_tip": "Xati ufuqī (sarfakorona istifoda kuned)",
        "summary": "Xulosa:",
        "subject": "Mavzū'/sarlavha:",
        "minoredit": "In viroişi xurd ast",
index 8f363c8..007435e 100644 (file)
        "resettokens-watchlist-token": "โทเค็นสำหรับเว็บฟีด (Atom/RSS) ของ[[Special:Watchlist|การเปลี่ยนแปลงแก่หน้าในรายการเฝ้าดูของคุณ]]",
        "resettokens-done": "ตั้งค่าโทเค็นใหม่แล้ว",
        "resettokens-resetbutton": "ตั้งโทเค็นที่เลือกใหม่",
-       "bold_sample": "ข้อความตัวหนา",
-       "bold_tip": "ทำตัวหนา",
-       "italic_sample": "ข้อความตัวเอน",
-       "italic_tip": "ทำตัวเอน",
-       "link_sample": "เชื่อมโยงหัวเรื่อง",
-       "link_tip": "ลิงก์ภายใน",
-       "extlink_sample": "http://www.example.com ชื่อเรื่องเชื่อมโยง",
-       "extlink_tip": "ลิงก์ภายนอก (อย่าลืมใส่ http:// นำหน้าเสมอ)",
-       "headline_sample": "ข้อความพาดหัว",
-       "headline_tip": "พาดหัวระดับ 2",
-       "nowiki_sample": "แทรกข้อความที่ไม่จัดรูปแบบที่นี่",
-       "nowiki_tip": "ไม่สนใจการจัดรูปแบบวิกิ",
-       "image_sample": "ตัวอย่าง.jpg",
-       "image_tip": "ใส่ไฟล์",
-       "media_sample": "ตัวอย่าง.ogg",
-       "media_tip": "เชื่อมโยงไฟล์",
-       "sig_tip": "ลายเซ็นของคุณพร้อมตราเวลา",
-       "hr_tip": "เส้นนอน (ใช้อย่างจำกัด)",
        "summary": "ความย่อ:",
        "subject": "เรื่อง:",
        "minoredit": "เป็นการแก้ไขเล็กน้อย",
index b247d3d..8ec343b 100644 (file)
        "changeemail-newemail": "Täze e-poçta adresi:",
        "changeemail-none": "(hiç biri)",
        "changeemail-submit": "E-poçtany üýtget",
-       "bold_sample": "Goýy tekst",
-       "bold_tip": "Goýy tekst",
-       "italic_sample": "Kursiw tekst",
-       "italic_tip": "Kursiw tekst",
-       "link_sample": "Çykgydyň ady",
-       "link_tip": "Içerki çykgyt",
-       "extlink_sample": "http://www.example.com çykgyt düşündirişi",
-       "extlink_tip": "Daşarky çykgyt (Adresiň öňüne http:// ýazmagy unutmaň)",
-       "headline_sample": "Adyň teksti",
-       "headline_tip": "2-nji derejeli at",
-       "nowiki_sample": "Formatirlenmedik teksti şu ýere salyň",
-       "nowiki_tip": "Wiki formatirlemesini hasap etme",
-       "image_tip": "Salnan faýl",
-       "media_tip": "Multimediýa faýlyna çykgyt",
-       "sig_tip": "Wagt belgili goluňyz",
-       "hr_tip": "Gorizontal liniýa (ýygy-ýygydan ulanmaň)",
        "summary": "Gysgaça düşündiriş:",
        "subject": "Tema/at:",
        "minoredit": "Ujypsyzja özgerdiş",
index 0f5287c..3dc685c 100644 (file)
        "changeemail-throttled": "Masyadong madami ang kamakailan lamang mong pagsubok sa pag-login.\nMaghintay po muna ng $1 bago subukan uli.",
        "resettokens": "I-reset ang mga token o susi",
        "resettokens-token-label": "$1 (kasalukuyang halaga: $2)",
-       "bold_sample": "Makapal na panitik",
-       "bold_tip": "Makapal na panitik",
-       "italic_sample": "Nakahilig na panitik",
-       "italic_tip": "Nakahilig na panitik",
-       "link_sample": "Pamagat ng kawing",
-       "link_tip": "Panloob na kawing",
-       "extlink_sample": "http://www.example.com na link ng pamagat",
-       "extlink_tip": "Panlabas na link (tandaan ang unlaping http://)",
-       "headline_sample": "Teksto ng ulong pambungad",
-       "headline_tip": "Antas 2 na ulong pambungad",
-       "nowiki_sample": "Isingit ang hindi nakapormat na teksto dito",
-       "nowiki_tip": "Balewalain ang pormat na pangwiki",
-       "image_sample": "Halimbawa.jpg",
-       "image_tip": "File na naka-embed",
-       "media_sample": "Halimbawa.ogg",
-       "media_tip": "Link ng file",
-       "sig_tip": "Lagda mo na may tatak ng oras",
-       "hr_tip": "Pahalagang na guhit (gamitin nang madalang)",
        "summary": "Buod:",
        "subject": "Paksa:",
        "minoredit": "Ito ay isang munting pagbabago",
index 7c78121..4259731 100644 (file)
        "changeemail-newemail": "Е-номә тожә унвон:",
        "changeemail-none": "(ни)",
        "changeemail-submit": "Е-номә дәгиш кардеј",
-       "bold_sample": "Нимәтындә шрифт",
-       "bold_tip": "Нимәтындә шрифт",
-       "italic_sample": "Курсивә мәтн",
-       "italic_tip": "Курсивә мәтн",
-       "link_sample": "Сәбони сәрловһә",
-       "link_tip": "Дыләтонә сәбон",
-       "extlink_sample": "http://www.example.com сәбони сәрловһә",
-       "extlink_tip": "Хариҹә сәбон (сыханәсә http:// јодәдә огәтән)",
-       "headline_sample": "Сәрловһә мәтн",
-       "headline_tip": "2-нә сәвијјә сәрловһә",
-       "nowiki_sample": "Формат кардә ныбә мәтн дәғандән ијо",
-       "nowiki_tip": "Вики формат кардеј бә нәзә ныстәнеј",
-       "image_tip": "Дахыл кардә быә фајл",
-       "media_tip": "Сәбон бә медијә-фајл",
-       "sig_tip": "Шымә ғол ијән вахт",
-       "hr_tip": "Уфуғијә ријә (рә-рә истифодә мәкән)",
        "summary": "Дәгишон тәсвир:",
        "subject": "Мıvzu:",
        "minoredit": "Ым гадә дәгишије",
index 8bf2af4..2fc7671 100644 (file)
        "oldpassword": "Ko e leatapu motuʻa:",
        "newpassword": "Ko e leatapu foʻou:",
        "retypenew": "Toe ʻai leatapu foʻou:",
-       "bold_sample": "Tohi sinolahi",
-       "bold_tip": "Tohi sinolahi",
-       "italic_sample": "Mataʻitohi mahei",
-       "italic_tip": "Mataʻitohi mahei",
-       "link_sample": "Hingoa ʻo e fehokotaki",
-       "link_tip": "Fehokotaki fakalotovā",
-       "extlink_sample": "http://www.example.com Hingoa fakafehokotaki",
-       "extlink_tip": "Fehokotaki ki tuʻa (manatuʻi ko e fakapipikimuʻa — http://)",
-       "headline_sample": "Mataʻitohi tuʻumuʻa",
-       "headline_tip": "Tuʻumuʻa fakatuʻunga hono 2",
-       "nowiki_sample": "Hulumaki ʻa e ʻū mataʻitohi taʻengaohi ʻi heni",
-       "nowiki_tip": "taʻetokaʻi ngaohi ''wiki''",
-       "sig_tip": "Ko e fakamoʻoniʻi ʻaʻau mo hono taimi",
        "summary": "Fakanounou:",
        "subject": "Tuʻunga lea:",
        "minoredit": "Ko e fatu siʻi pē ia",
index 8ed6373..dbf76f6 100644 (file)
        "mailmypassword": "E-mel nupela paswot",
        "loginlanguagelabel": "Tokples: $1",
        "changepassword": "Senis paswot",
-       "link_sample": "Link taitel",
-       "extlink_sample": "http://www.example.com link taitel",
-       "media_tip": "Link bilong fail",
        "summary": "Liklik toksave bilong senis:",
        "subject": "Nem bilong pes (o hap bilong pes):",
        "minoredit": "Dispela emi liklik senis",
index 821ce9d..ec025df 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|İzleme listenizdeki sayfa değişiklikleri]] için web beslemeleri (Atom/RSS) anahtarı",
        "resettokens-done": "Belirteçler sıfırlandı.",
        "resettokens-resetbutton": "Seçili anahtarları sıfırla",
-       "bold_sample": "Kalın yazı",
-       "bold_tip": "Kalın yazı",
-       "italic_sample": "Eğik yazı",
-       "italic_tip": "Eğik yazı",
-       "link_sample": "Bağlantı başlığı",
-       "link_tip": "İç bağlantı",
-       "extlink_sample": "http://www.example.com bağlantı başlığı",
-       "extlink_tip": "Dış bağlantı (Adresin önüne http:// koymayı unutmayın)",
-       "headline_sample": "Başlık metni",
-       "headline_tip": "2. seviye başlık",
-       "nowiki_sample": "Biçimlendirilmeyecek metni buraya girin",
-       "nowiki_tip": "viki formatlamasını devre dışı bırak",
-       "image_sample": "Örnek.jpg",
-       "image_tip": "Gömülü dosya",
-       "media_sample": "Örnek.ogg",
-       "media_tip": "Dosya bağlantısı",
-       "sig_tip": "İmzanız ve zaman",
-       "hr_tip": "Yatay çizgi (çok sık kullanmayın)",
        "summary": "Özet:",
        "subject": "Konu:",
        "minoredit": "Bu bir küçük değişiklik",
index 04c7c52..40abaa8 100644 (file)
        "resetpass-submit-loggedin": "Mşaḥlaf uQliḍo",
        "passwordreset-username": "Işme duHadomo:",
        "changeemail-newemail": "Email-adres ḥaṭo:",
-       "bold_sample": "Ḥarfe ḥlime",
-       "bold_tip": "Ḥarfe ḥlime",
-       "italic_sample": "Ḥarfe 3wije",
-       "italic_tip": "Ḥarfe 3wije",
-       "link_sample": "Link title",
-       "link_tip": "Internal link",
-       "extlink_sample": "http://www.example.com link title",
-       "extlink_tip": "External link (remember http:// prefix)",
-       "headline_sample": "Headline text",
-       "headline_tip": "Level 2 headline",
-       "nowiki_sample": "Insert non-formatted text here",
-       "nowiki_tip": "uSyomano latyo buFormat",
-       "image_tip": "Embedded file",
-       "media_tip": "File link",
-       "sig_tip": "Mḍay herke u kṭaw iSa³aye muqa yo.",
-       "hr_tip": "Horizontal line (use sparingly)",
        "summary": "Summary:",
        "minoredit": "This is a minor edit",
        "watchthis": "Watch this page",
index eeffb2d..a385cf7 100644 (file)
        "resetpass-submit-cancel": "Pkungat",
        "passwordreset": "Psbgurah powsa sspgan lniing",
        "passwordreset-username": "seejiq mduuy hangan:",
-       "bold_sample": "Patas qthur",
-       "bold_tip": "Patas qthur",
-       "italic_sample": "Atas gmisil",
-       "italic_tip": "Atas gmisil",
-       "link_sample": "Mggaluk pusu kari",
-       "link_tip": "Mggaluk ruwan",
-       "extlink_sample": "http://www.example.com/ mggaluk pusu kari",
-       "extlink_tip": "Lipax mggaluk (saw peeniq qsahur http:// pnrjingan)",
-       "headline_sample": "Tg1 tntunan patas pusu kari",
-       "headline_tip": "Tg2 tntunan patas pusu kari",
-       "nowiki_sample": "Maat kska aji smmalu iyax ptasan patas",
-       "nowiki_tip": "Brkagan Wiki smmalu iyax ptasan elug kari",
-       "image_tip": "Numal pusu patas",
-       "media_tip": "Mggaluk pusu patas",
-       "sig_tip": "Patas hangan su ni jiyax",
-       "hr_tip": "Qtaan ayus msbalay (bilaq bi dmuuy)",
        "summary": "Ramas kari:",
        "minoredit": "Asaw nii snsul smmalu patas",
        "watchthis": "Gmraka qmita ruwahan patas nii",
index 99d8e5c..e8f2153 100644 (file)
        "loginsuccess": "'''Ule ndzeni ka {{SITENAME}} tani hi \"$1\".'''",
        "mailmypassword": "Rhumela vito-mpfungulo lerintwsa",
        "loginlanguagelabel": "Ririmi: $1",
-       "bold_sample": "Marito yo bumbula",
-       "bold_tip": "Marito yo bumbula",
-       "italic_sample": "Tsalawa ra xitaliki",
-       "italic_tip": "Tsalawa ra xitaliki",
-       "link_sample": "Khwekerisa nhlokomhaka",
-       "link_tip": "Xikhwekerisi xala ndzeni ka wiki leyi",
-       "extlink_sample": "http://www.example.com khwekerisa nhlokomhaka",
-       "extlink_tip": "Xikhwekerisi xa tluka ralehandle ka wiki leyi (tsundzuka xi rhangi xa http:// )",
-       "headline_sample": "tsala ra nhlokomhaka",
-       "headline_tip": "Nhloko mhaka ya xiyenge xa 2",
-       "nowiki_sample": "Hoxa xivulwa lexi nga sasekisiwangiki mavonele laha",
-       "nowiki_tip": "bakanya kuxongisa marito ka wiki",
-       "image_tip": "Fayili leyi angarhiweke",
-       "media_tip": "Xikhwekerisi xa fayili",
-       "sig_tip": "Nsayino wawena wurina mfungo wa nkarhi",
-       "hr_tip": "Ntila wo khwatiheta (wu tirhise hivukheta)",
        "summary": "Nkomiso:",
        "minoredit": "Lowu i ndzulamiso wu tsongo",
        "watchthis": "Langutisa tluka leri",
index 16310eb..1369401 100644 (file)
        "resettokens-token-label": "$1 (агымдагы мәгънә: $2)",
        "resettokens-done": "Токеннар ташланды.",
        "resettokens-resetbutton": "Сайланган токеннарны ташлау",
-       "bold_sample": "Калын язылыш",
-       "bold_tip": "Калын язылыш",
-       "italic_sample": "Курсив язылыш",
-       "italic_tip": "Курсив язылыш",
-       "link_sample": "Сылтама исеме",
-       "link_tip": "Эчке сылтама",
-       "extlink_sample": "http://www.example.com сылтама исеме",
-       "extlink_tip": "Тышкы сылтама (http:// алкушымчасы турында онытмагыз)",
-       "headline_sample": "Башисем",
-       "headline_tip": "2 нче дәрәҗәле исем",
-       "nowiki_sample": "Форматланмаган текстны монда өстәгез",
-       "nowiki_tip": "Вики-форматлауны исәпкә алмау",
-       "image_sample": "Мисал.jpg",
-       "image_tip": "Куелган файл",
-       "media_sample": "Мисал.ogg",
-       "media_tip": "Файлга сылтама",
-       "sig_tip": "Имзагыз вакыт белән",
-       "hr_tip": "Горизонталь сызык (еш кулланмагыз)",
        "summary": "Кыскача аңлатма:",
        "subject": "Тема:",
        "minoredit": "Бу кече төзәтмә",
        "grouppage-suppress": "{{ns:project}}:Назирләр",
        "right-read": "Битләрне карау",
        "right-edit": "Битләрне үзгәртү",
-       "right-createpage": "биÑ\82лÓ\99Ñ\80 Ñ\8fÑ\81аÑ\83 (бÓ\99Ñ\85Ó\99Ñ\81 Ð±Ñ\83лмаганнаÑ\80Ñ\8bн)",
-       "right-createtalk": "бÓ\99Ñ\85Ó\99Ñ\81 Ð±Ð¸Ñ\82ен Ñ\8fÑ\81аÑ\83",
-       "right-createaccount": "яңа кулланучы хисап язмасын ясау",
+       "right-createpage": "Ð\91иÑ\82лÓ\99Ñ\80не Ñ\82өзү (бÓ\99Ñ\85Ó\99Ñ\81 Ð±Ð¸Ñ\82лÓ\99Ñ\80е Ð±Ñ\83лмаган)",
+       "right-createtalk": "Ð\91Ó\99Ñ\85Ó\99Ñ\81 Ð±Ð¸Ñ\82лÓ\99Ñ\80ен Ñ\82өзү",
+       "right-createaccount": "Яңа кулланучы хисап язмасын төзү",
        "right-minoredit": "\"кече төзәтмә\" тамгасын кую",
        "right-move": "Битләрне күчерү",
        "right-move-subpages": "Битләрне асбитләр белән бергә күчерү",
        "rcfilters-restore-default-filters": "Гадәттәге сөзгечләрне торгызу",
        "rcfilters-clear-all-filters": "Барлык сөзгечләрне бушату",
        "rcfilters-show-new-changes": "$1 башлап яңа үзгәрешләрне карау",
-       "rcfilters-search-placeholder": "ҮзгÓ\99Ñ\80еÑ\88лÓ\99Ñ\80не Ñ\81өзү (менÑ\8e ÐºÑ\83лланÑ\8bгÑ\8bз Ñ\8fки Ñ\81өзгеÑ\87 Ð°Ñ\82Ñ\8b Ð±Ñ\83енÑ\87а Ñ\8dзлигез)",
+       "rcfilters-search-placeholder": "ҮзгÓ\99Ñ\80еÑ\88лÓ\99Ñ\80не Ñ\81өзү (менÑ\8e ÐºÑ\83лланÑ\8bгÑ\8bз Ñ\8fки Ñ\81өзгеÑ\87 Ð¸Ñ\81еме Ð±Ñ\83енÑ\87а Ñ\8dзлÓ\99гез)",
        "rcfilters-search-placeholder-mobile": "Сөзгечләр",
        "rcfilters-invalid-filter": "Яраксыз сөзгеч",
        "rcfilters-filterlist-title": "Сөзгечләр",
        "notargettitle": "Максатсыз",
        "nopagetitle": "Мондый бит юк",
        "nopagetext": "Күрсәтелгән бит юк.",
-       "pager-newer-n": "{{PLURAL:$1|$1 яңарак}}",
-       "pager-older-n": "$1 {{PLURAL:$1|искерәк}}",
+       "pager-newer-n": "{{PLURAL:$1|1 яңарак|$1 яңарак}}",
+       "pager-older-n": "{{PLURAL:$1|1 искерәк|$1 искерәк}}",
        "suppress": "Яшерү",
        "apihelp": "API ярдәм",
        "apihelp-no-such-module": "«$1» модуле табылмады.",
        "apisandbox": "API комлыгы",
-       "apisandbox-reset": "Чистарту",
+       "apisandbox-submit": "Сорату ясарга",
+       "apisandbox-reset": "Бушату",
        "apisandbox-retry": "Кабатлау",
+       "apisandbox-helpurls": "Белешмәгә сылтамалар",
        "apisandbox-examples": "Мисаллар",
        "apisandbox-dynamic-parameters": "Өстәмә параметрлар",
+       "apisandbox-dynamic-parameters-add-label": "Параметр өстәргә:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Параметр исеме",
+       "apisandbox-dynamic-error-exists": "«$1» исемле параметр бар инде.",
+       "apisandbox-templated-parameter-reason": "Бу [[Special:ApiHelp/main#main/templatedparams|калып параметры]] $2 исемлегенең {{PLURAL:$1|мәгънә}} нигезендә тәкъдим ителә.",
+       "apisandbox-deprecated-parameters": "Искергән параметрлар",
+       "apisandbox-fetch-token": "Торенны автотутыру",
+       "apisandbox-add-multi": "Өстәү",
+       "apisandbox-submit-invalid-fields-title": "Кайбер кырлар дөрес түгел",
+       "apisandbox-submit-invalid-fields-message": "Билгеләнгән кырларны төзәтегез һәм яңадан тырышып карагыз.",
        "apisandbox-results": "Нәтиҗәләр",
        "apisandbox-continue": "Дәвам итү",
-       "apisandbox-continue-clear": "ЧиÑ\81Ñ\82аÑ\80ту",
+       "apisandbox-continue-clear": "Ð\91Ñ\83Ñ\88ату",
        "apisandbox-multivalue-all-namespaces": "$1 (Барлык исемнәр киңлекләре)",
        "apisandbox-multivalue-all-values": "$1 (Барлык мәгънәләр)",
        "booksources": "Китап чыганаклары",
        "activeusers": "Актив кулланучылар исемлеге",
        "activeusers-noresult": "Кулланучылар табылмады.",
        "listgrouprights": "Кулланучы төркемнәренең хокуклары",
-       "listgrouprights-key": "Ð\9bегенда:\n* <span class=\"listgrouprights-granted\">Бирелгән хокуклар</span>\n* <span class=\"listgrouprights-revoked\">Алынган хокуклар</span>",
+       "listgrouprights-key": "Ð\90ңлаÑ\82ма:\n* <span class=\"listgrouprights-granted\">Бирелгән хокуклар</span>\n* <span class=\"listgrouprights-revoked\">Алынган хокуклар</span>",
        "listgrouprights-group": "Төркем",
        "listgrouprights-rights": "Хокуклар",
        "listgrouprights-helppage": "Help:Төркемнәрнең хокуклары",
        "confirm": "Раслау",
        "excontent": "эчтәлек: «$1»",
        "excontentauthor": "эчтәлеге: «$1», бердәнбер авторы [[Special:Contributions/$2|$2]] ([[User talk:$2|бәхәс]])",
-       "exbeforeblank": "чистартуга кадәр булган эчтәлек: «$1»",
+       "exbeforeblank": "бушатуга кадәр булган эчтәлек: «$1»",
        "delete-confirm": "«$1» бетерү",
        "delete-legend": "Бетерү",
        "historywarning": "<strong>Игътибар:</strong> Сез бетерергә теләгән биттә үзгәртү тарихы бар, ул $1 {{PLURAL:$1|юрамадан тора}}:",
        "delete_and_move_confirm": "Әйе, битне бетерү",
        "delete_and_move_reason": "Күчерүне мөмкин итәр өчен бетерелде «[[$1]]»",
        "move-leave-redirect": "Юнәлтү калдырылсын",
-       "export": "Битләрне чыгаруы",
+       "export": "Битләрне чыгару",
        "export-submit": "Экспортлау",
        "export-addcattext": "Бу төркемнән битләр өстәү:",
        "export-addcat": "Өстәү",
        "recreate": "Яңадан төзү",
        "unit-pixel": "нкт",
        "confirm_purge_button": "Ярар",
-       "confirm-purge-top": "Бу битнең кэшы чистартылсынмы?",
-       "confirm-purge-bottom": "Кэшны чистартудан соң аның соңгы юрамасы күрсәтеләчәк.",
+       "confirm-purge-top": "Бу битнең кэшын бушатыргамы?",
+       "confirm-purge-bottom": "Кэшны бушатудан соң аның соңгы юрамасы күрсәтеләчәк.",
        "confirm-watch-button": "Ярар",
        "confirm-unwatch-button": "Ярар",
        "confirm-rollback-button": "Ярар",
        "version-software": "Урнаштырылган программа белән тәэмин ителешне",
        "version-software-product": "Продукт",
        "version-software-version": "Версия",
+       "version-entrypoints-header-entrypoint": "Керү урыны",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "Китапханә",
        "version-libraries-version": "Версия",
        "redirect-page": "Бит идентификаторы",
        "redirect-revision": "Бит юрамасы",
        "redirect-file": "Файл исеме",
-       "fileduplicatesearch": "Бер үк файлларны эзләү",
+       "redirect-logid": "Көндәлек ID",
+       "redirect-not-exists": "Мәгънәсе табылмады",
+       "redirect-not-numeric": "Мәгънәсе сан зурлыгы түгел",
+       "fileduplicatesearch": "Бердәй файлларны эзләү",
+       "fileduplicatesearch-summary": "Бердәй файлларны хэш-код буенча эзләү.",
        "fileduplicatesearch-filename": "Файл исеме:",
        "fileduplicatesearch-submit": "Эзләү",
        "fileduplicatesearch-info": "$1 × $2 нокта<br />Файл зурлыгы: $3<br />MIME төре: $4",
        "specialpages": "Махсус битләр",
+       "specialpages-note-top": "Аңлатма",
        "specialpages-note-restricted": "* Гади махсус битләр.\n* <span class=\"mw-specialpagerestricted\">Чикләнелгән махсус битләр.</span>",
        "specialpages-group-maintenance": "Техник карау хисапнамәсе",
        "specialpages-group-other": "Башка махсус битләр",
index 2e842e0..4c78486 100644 (file)
        "resetpass-submit-cancel": "Kire qağu",
        "resetpass-wrong-oldpass": "Yalğış sersüz.\nSez sersüzegezne üzgärtkän yäisä yaña waqıtlı sersüz soratqan bulırğa mömkinsez.",
        "resetpass-temp-password": "Waqıtlı sersüz:",
-       "bold_sample": "Qalın yazılış",
-       "bold_tip": "Qalın yazılış",
-       "italic_sample": "Kursiv yazılış",
-       "italic_tip": "Kursiv yazılış",
-       "link_sample": "Sıltama iseme",
-       "link_tip": "Eçke sıltama",
-       "extlink_sample": "http://www.example.com sıltama iseme",
-       "extlink_tip": "Tışqı sıltama (http:// alquşımçası turında onıtmağız)",
-       "headline_sample": "Başisem",
-       "headline_tip": "2 nçe däräcäle isem",
-       "nowiki_sample": "Formatlanmağan tekstnı monda östägez",
-       "nowiki_tip": "Wiki-formatlawnı isäpkä almaw",
-       "image_sample": "Misal.jpg",
-       "image_tip": "Quyılğan fayl",
-       "media_sample": "Mísal.ogg",
-       "media_tip": "Media-faylğa sıltama",
-       "sig_tip": "İmza häm waqıt",
-       "hr_tip": "Gorizontal sızıq (yış qullanmağız)",
        "summary": "Üzgärtülär taswirlaması:",
        "subject": "Tema/başisem:",
        "minoredit": "Bu keçe üzgärtü",
index bffe592..b4acae0 100644 (file)
        "changeemail-newemail": "Чаа э-чагааның адреси:",
        "changeemail-none": "(чок)",
        "changeemail-submit": "Э-чагааны өскертири",
-       "bold_sample": "семис үжүк",
-       "bold_tip": "семис үжүк",
-       "italic_sample": "курсив хевир",
-       "italic_tip": "Курсив хевир",
-       "link_sample": "Шөлүлгениң ады",
-       "link_tip": "Иштики арынче айтыг",
-       "extlink_sample": "http://www.example.com холбааның ады",
-       "extlink_tip": "Даштыкы арынче айтыг (\"http://\" префикс дугайында утпаңар)",
-       "headline_sample": "Эге аттың сөзүглели",
-       "headline_tip": "2-ги деңнелдиң эге ады",
-       "nowiki_sample": "Форматтавас сөзүглелди бээр салыңар",
-       "nowiki_tip": "Вики-форматтаашкын кылбас",
-       "image_sample": "Чижек.jpg",
-       "image_tip": "Киирген файл",
-       "media_sample": "Чижек.ogg",
-       "media_tip": "Файлче айтыг",
-       "sig_tip": "Холуңар үжүү, үе-шагы",
-       "hr_tip": "Доора шугум (көвей ажыглаваңар)",
        "summary": "Түңнел:",
        "subject": "Кол сөс:",
        "minoredit": "Бо эдилге бичии-дир",
index c3b206e..6d917e3 100644 (file)
        "changeemail-submit": "ⴱⴷⴷⴻⵍ ⴰⵎⵢⴰⵣⴰⵍ ⴰⵍⵉⴽⵜⵔⵓⵏⵉ",
        "resettokens-tokens": "ⵜⵉⵙⵓⵔⴰ:",
        "resettokens-done": "ⴱⴷⴷⴻⵍ ⵜⵉⵙⵓⵔⴰ",
-       "bold_sample": "Bold text",
-       "bold_tip": "Bold text",
-       "italic_sample": "Italic text",
-       "italic_tip": "Italic text",
-       "link_sample": "ⴰⵣⵡⵉⵍ ⵏ ⵓⵣⴷⴰⵢ",
-       "link_tip": "ⴰⵣⴷⴰⵢ ⵏ ⵓⴳⵏⵙⵓ",
-       "extlink_sample": "http://www.example.com ⴰⵣⵡⵉⵍ ⵓⵣⴷⴰⵢ",
-       "image_sample": "Example.jpg",
-       "media_sample": "Example.ogg",
-       "media_tip": "ⴰⵣⴷⴰⵢ ⵓⵙⴷⴰⵡ",
        "savearticle": "ⵣⵎⵎⴻⵎ ⵜⴰⵙⵏⴰ",
        "preview": "ⴰⵥⵕⵉ ⴰⵎⵣⵡⴰⵔⵓ",
        "showpreview": "ⵥⵕ",
index aa79090..87d541e 100644 (file)
        "botpasswords-deleted-title": "Пароль палэнтыны боты",
        "passwordreset": "Пароль куштыны",
        "passwordreset-username": "Пырон ним:",
-       "bold_sample": "Зӧк шрифт",
-       "bold_tip": "Зӧк шрифт",
-       "italic_sample": "Бекырес текст",
-       "italic_tip": "Бекырес текст",
-       "link_sample": "Чӧлсконлэн йыръянэз",
-       "link_tip": "Пуш чӧлскон",
-       "extlink_sample": "http://www.example.com чӧлсконлэн йыръянэз",
-       "extlink_tip": "Педпала чӧлскон (http:// префиксэз эн вунэтэ)",
-       "headline_sample": "Йыръян текст",
-       "headline_tip": "2-тӥ уровеньем йыръян",
-       "nowiki_sample": "Вики-пусъёсыз санэ басьтытэк кельтоно текстэз пуктэ татчы",
-       "nowiki_tip": "Вики-пусъёсыз лыдэ басьтоно ӧвӧл",
-       "image_tip": "Пыӵатэм файл",
-       "media_tip": "Файл чӧлскон",
-       "sig_tip": "Тӥляд гожтӥськонды но дыр пусъён",
-       "hr_tip": "Горизонтальной гож (эн пыртэ ӵем)",
        "summary": "Мар но малы тупатэмын? (вакчияк):",
        "minoredit": "Ичи воштон",
        "watchthis": "Та бамез чаклан списоке пыртыны",
index 0c47afc..7dbbeca 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|كۆزىتىش تىزىملىكىڭىزدىكى بەتلەر ئۆزگىرىشى]] (Atom/RSS) تور مەنبەسىنىڭ ئاچقۇچلۇق بەلگىسى",
        "resettokens-done": "ئاچقۇچلۇق بەلگىلەر قايتا بېكىتىلدى.",
        "resettokens-resetbutton": "تاللانغان ئاچقۇچلۇق بەلگىلەرنى قايتا بېكىت",
-       "bold_sample": "توم خەت",
-       "bold_tip": "توم خەت",
-       "italic_sample": "يانتۇ خەت",
-       "italic_tip": "يانتۇ خەت",
-       "link_sample": "ئۇلانما ماۋزۇ",
-       "link_tip": "ئىچكى ئۇلانما",
-       "extlink_sample": "http://www.example.com ئۇلانما ماۋزۇسى",
-       "extlink_tip": "سىرتقى ئۇلانما (http:// ئالدى قوشۇلغۇچى قوشۇڭ)",
-       "headline_sample": "ماۋزۇ تېكستى",
-       "headline_tip": "2- دەرىجىلىك ماۋزۇ",
-       "nowiki_sample": "فورماتى يوق تېكست قىستۇر",
-       "nowiki_tip": "wiki فورماتىغا پەرۋا قىلما",
-       "image_sample": "Example.jpg",
-       "image_tip": "سىڭدۈرمە ھۆججەت",
-       "media_sample": "Example.ogg",
-       "media_tip": "ھۆججەت ئۇلىنىشى",
-       "sig_tip": "ۋاقىت تامغىلىق ئىمزايىڭىز",
-       "hr_tip": "توغرىسىغا سىزىق (ئېھتىيات بىلەن ئىشلىتىڭ)",
        "summary": "ئۈزۈندە",
        "subject": "ماۋزۇ:",
        "minoredit": "بۇ ئازراقلا تەھرىرلەش",
index 519a355..583ef08 100644 (file)
@@ -97,7 +97,7 @@
        "tog-watchdefault": "Додавати змінені мною сторінки та файли до мого списку спостереження",
        "tog-watchmoves": "Додавати перейменовані мною сторінки та файли до мого списку спостереження",
        "tog-watchdeletion": "Додавати вилучені мною сторінки та файли до мого списку спостереження",
-       "tog-watchuploads": "Додавати до мого списку спостереження нові файли, завантажені мною",
+       "tog-watchuploads": "Додавати файли, завантажені мною до списку спостереження",
        "tog-watchrollback": "Додавати відкочені мною сторінки до мого списку спостереження",
        "tog-minordefault": "Позначати всі зміни як незначні за замовчуванням",
        "tog-previewontop": "Показувати попередній перегляд перед вікном редагування, а не після",
        "tog-useeditwarning": "Попереджати мене, якщо я залишаю сторінку редагування з незбереженими змінами",
        "tog-prefershttps": "Завжди використовувати безпечне з'єднання при вході в систему",
        "tog-showrollbackconfirmation": "Показати підтверджувальне вікно при натисканні на посилання відкоту",
+       "tog-requireemail": "Вимагає вказання електронної пошти для скидання пароля",
        "underline-always": "Завжди",
        "underline-never": "Ніколи",
        "underline-default": "Використовувати налаштування браузера",
        "category-empty": "''Ця категорія зараз порожня.''",
        "hidden-categories": "{{PLURAL:$1|1=Прихована категорія|Приховані категорії}}",
        "hidden-category-category": "Приховані категорії",
-       "category-subcat-count": "{{PLURAL:$2|Показано $1 {{PLURAL:$1|підкатегорію з|підкатегорії з|підкатегорій із}} $2.|1=Ця категорія має тільки таку підкатегорію.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ця категорія має тільки таку підкатегорію.|Показано $1 {{PLURAL:$1|підкатегорію з|підкатегорії з|підкатегорій із}} $2.}}",
        "category-subcat-count-limited": "У цій категорії {{PLURAL:$1|$1 підкатегорія|$1 підкатегорії|$1 підкатегорій}}.",
        "category-article-count": "Показано $1 {{PLURAL:$1|сторінку|сторінки|сторінок}} цієї категорії (із $2).",
        "category-article-count-limited": "У цій категорії {{PLURAL:$1|$1 сторінка|$1 сторінки|$1 сторінок}}.",
        "createaccountmail": "Використати тимчасовий випадковий пароль і надіслати його на вказану адресу електронної пошти",
        "createaccountmail-help": "Може використовуватися, щоб створити обліковий запис для іншої особи, не дізнаючись пароль.",
        "createacct-realname": "Справжнє ім'я (не обов'язково)",
-       "createacct-reason": "Причина",
+       "createacct-reason": "Причина (публічно видима)",
        "createacct-reason-ph": "Чому ви створюєте інший обліковий запис",
        "createacct-reason-help": "Повідомлення, що показується в журналі створення облікових записів",
        "createacct-submit": "Створіть ваш обліковий запис",
        "changeemail-nochange": "Будь ласка, введіть адресу електронної пошти, відмінну від попередньої.",
        "resettokens": "Скидання токенів",
        "resettokens-text": "Ви можете скинути токени, що забезпечують доступ до певних особистих даних, пов'язаних тут із вашим обліковим записом.\nВам слід це зробити, якщо ви випадково поділились токенами з кимось, або якщо ваш обліковий запис було зламано.",
-       "resettokens-no-tokens": "Немає жетонів до скидання.",
+       "resettokens-no-tokens": "Немає токенів до скидання.",
        "resettokens-tokens": "Токени:",
        "resettokens-token-label": "$1 (поточне значення: $2)",
        "resettokens-watchlist-token": "Маркер стрічки новин (Atom/RSS) щодо [[Special:Watchlist|зміни на сторінці з вашого списку спостереження]]",
        "resettokens-done": "Токени скинуто.",
        "resettokens-resetbutton": "Скинути обрані токени",
-       "bold_sample": "Жирний текст",
-       "bold_tip": "Жирний текст",
-       "italic_sample": "Курсив",
-       "italic_tip": "Курсив",
-       "link_sample": "Назва посилання",
-       "link_tip": "Внутрішнє посилання",
-       "extlink_sample": "http://www.example.com назва посилання",
-       "extlink_tip": "Зовнішнє посилання (не забудьте про префікс http://)",
-       "headline_sample": "Текст заголовка",
-       "headline_tip": "Заголовок 2-го рівня",
-       "nowiki_sample": "Додайте сюди неформатований текст.",
-       "nowiki_tip": "Ігнорувати вікі-форматування",
-       "image_sample": "Example.jpg",
-       "image_tip": "Файл",
-       "media_sample": "Example.ogg",
-       "media_tip": "Посилання на медіа-файл",
-       "sig_tip": "Ваш підпис з часовою міткою",
-       "hr_tip": "Горизонтальна лінія (використовуйте скупо)",
        "summary": "Короткий опис змін:",
        "subject": "Тема:",
        "minoredit": "Незначна зміна",
        "undo-norev": "Редагування не може бути скасоване, бо його не існує або було вилучено.",
        "undo-nochange": "Схоже, редагування вже було скасовано.",
        "undo-summary": "Скасування редагування № $1 користувача [[Special:Contribs/$2|$2]] ([[User talk:$2|обговорення]])",
+       "undo-summary-anon": "Скасування версії $1 від [[Special:Contributions/$2|$2]]",
        "undo-summary-username-hidden": "Скасувати версію $1, виконану прихованим користувачем",
        "cantcreateaccount-text": "Створення облікових записів із цієї IP-адреси ('''$1''') було заблоковане [[User:$3|користувачем $3]].\n\n$3 зазначив таку причину: ''$2''",
        "cantcreateaccount-range-text": "Створення облікового запису із IP-адрес у діапазоні  <strong>$1</strong>, який включає вашу IP-адресу (<strong>$4</strong>), було заблоковано користувачем [[User:$3|$3]].\n\nКористувач $3 вказав як причину <em>$2</em>",
        "prefs-help-email": "Адреса електронної пошти не є обов'язковою, але необхідна для скидання пароля, якщо Ви його забудете.",
        "prefs-help-email-others": "Також вона дозволить іншим користувачам зв'язатися з Вами через посилання на Вашій сторінці користувача чи на сторінці обговорення. При цьому Ваша електронна адреса залишиться нерозкритою.",
        "prefs-help-email-required": "Потрібно зазначити адресу електронної пошти.",
+       "prefs-help-requireemail": "Якщо вибране, то надішле електронного листа із скинутим паролем за умови, що в обліковому записі було вказано ім'я користувача та електронна пошта.",
        "prefs-info": "Основні відомості",
        "prefs-i18n": "Інтернаціоналізація",
        "prefs-signature": "Підпис",
        "alreadyrolled": "Неможливо відкинути останні редагування [[:$1]], зроблені [[User:$2|$2]] ([[User talk:$2|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), оскільки хтось інший уже змінив чи відкинув редагування цієї статті.\n\nОстанні редагування зроблено [[User:$3|$3]] ([[User talk:$3|обговорення]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Пояснення редагування було: «<em>$1</em>.».",
        "revertpage": "Відкинуто редагування [[Special:Contributions/$2|$2]] ([[User talk:$2|обговорення]]) до зробленого [[User:$1|$1]]",
+       "revertpage-anon": "Відкинуто правки [[Special:Contributions/$2|$2]] до останньої версії [[User:$1|$1]]",
        "revertpage-nouser": "Відкинуто редагування прихованого користувача до останньої версії, зробленої {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Відкинуті редагування {{GENDER:$3|користувача|користувачки}} $1; повернення до версії {{GENDER:$4|користувача|користувачки}} $2.",
        "sessionfailure-title": "Помилка сеансу",
        "ipblocklist-legend": "Пошук заблокованого користувача",
        "blocklist-userblocks": "Сховати блокування облікових записів",
        "blocklist-tempblocks": "Сховати тимчасові блокування",
+       "blocklist-indefblocks": "Сховати безстрокові блокування",
        "blocklist-addressblocks": "Приховати блокування окремих IP-адрес",
        "blocklist-type": "Тип:",
        "blocklist-type-opt-all": "Всі",
index fa0c309..164552f 100644 (file)
        "resettokens-watchlist-token": "[[Special:Watchlist|آپ کی زیرنظر فہرست میں موجود صفحات کی تبدیلیوں]] کی ویب فیڈ (آٹوم/آر ایس ایس) کا ٹوکن",
        "resettokens-done": "ٹوکنوں کی ترتیب نو مکمل۔",
        "resettokens-resetbutton": "منتخب ٹوکنوں کو دوبارہ مرتب کریں",
-       "bold_sample": "دبیز متن",
-       "bold_tip": "دبیز متن",
-       "italic_sample": "ترچھا متن",
-       "italic_tip": "ترچھی لکھائی",
-       "link_sample": "ربط کا عنوان",
-       "link_tip": "اندرونی ربط",
-       "extlink_sample": "http://www.example.com ربط کا عنوان",
-       "extlink_tip": "بیرونی ربط (http:// کا سابقہ نہ بھولیں)",
-       "headline_sample": "شہ سرخی",
-       "headline_tip": "شہ سرخی درجہ دوم",
-       "nowiki_sample": "غیرشکلبندشدہ متن یہاں درج کریں",
-       "nowiki_tip": "ویکی فارمیٹ کو نظرانداز کریں",
-       "image_tip": "پیوستہ فائل",
-       "media_tip": "فائل کا ربط",
-       "sig_tip": "آپکا دستخط بمع مہرِوقت",
-       "hr_tip": "اُفقی لکیر (زیادہ استعمال نہ کریں)",
        "summary": "خلاصہ:",
        "subject": "عنوان:",
        "minoredit": "معمولی ترمیم",
index b54cc10..8bdb26c 100644 (file)
        "resettokens-token-label": "$1 (joriy koʻrsatkich: $2)",
        "resettokens-done": "Kalitlar yangilandi.",
        "resettokens-resetbutton": "Belgilangan kalitlarni yangilash",
-       "bold_sample": "Qalin matn",
-       "bold_tip": "Qalin matn",
-       "italic_sample": "Yotiq matn",
-       "italic_tip": "Yotiq matn",
-       "link_sample": "Ishorat nomi",
-       "link_tip": "Ichki ishorat",
-       "extlink_sample": "http://www.example.com ishorat nomi",
-       "extlink_tip": "Tashqi ishorat (http:// prefiksini unutmang)",
-       "headline_sample": "Sarlavha",
-       "headline_tip": "2-darajadagi sarlavha",
-       "nowiki_sample": "Bu yerga formatlash zarur boʻlmagan matnni qoʻying",
-       "nowiki_tip": "Viki-formatlashga eʼtibor berilmasin",
-       "image_tip": "Fayl oʻrnatish",
-       "media_tip": "Faylga havola",
-       "sig_tip": "Imzoingiz va sana",
-       "hr_tip": "Yotiq (gorizontal) chiziq (ko'p ishlatmang)",
        "summary": "Qisqa izoh:",
        "subject": "Mavzu/sarlavha",
        "minoredit": "Bu kichik tahrir",
index 37649c8..bc20ee6 100644 (file)
        "changeemail-password": "Ła password so {{SITENAME}}:",
        "changeemail-submit": "Canbia indiriso de posta ełetronega",
        "resettokens-token-label": "$1 (valor atuale: $2)",
-       "bold_sample": "Testo in grosso",
-       "bold_tip": "Testo in grosso",
-       "italic_sample": "Corsivo",
-       "italic_tip": "Corsivo",
-       "link_sample": "Titolo del colegamento",
-       "link_tip": "Colegamento interno",
-       "extlink_sample": "http://www.example.com titolo del colegamento",
-       "extlink_tip": "Colegamento foresto (tiente in mente el prefiso http:// )",
-       "headline_sample": "Intestassion",
-       "headline_tip": "Intestassion de 2° livèl",
-       "nowiki_sample": "Inserire qua el testo no formatà",
-       "nowiki_tip": "Ignora ła formatasion wiki",
-       "image_sample": "Esenpio.jpg",
-       "image_tip": "File incorporà",
-       "media_sample": "Esenpio.ogg",
-       "media_tip": "Cołegamento al file multimediałe",
-       "sig_tip": "Firma co data e ora",
-       "hr_tip": "Łinea orizontałe (usare con giudisio)",
        "summary": "Comento:",
        "subject": "Argomento (intestassion):",
        "minoredit": "Segna come canbiamento picenin",
index d07840c..7ca9bc6 100644 (file)
        "changeemail-none": "(ei ole)",
        "changeemail-submit": "Toižetada e-počtan adres",
        "resettokens-tokens": "Tokenad:",
-       "bold_sample": "Lihavoitud tekst",
-       "bold_tip": "Lihavoitud tekst",
-       "italic_sample": "Kursivtekst",
-       "italic_tip": "Kursivtekst",
-       "link_sample": "Kosketusen pälkirjutez",
-       "link_tip": "Südäikosketuz",
-       "extlink_sample": "http://www.example.com kosketusen pälkirjutez",
-       "extlink_tip": "Irdkosketuz (muštkat prefiksas http://)",
-       "headline_sample": "Pälkirjutesen tekst",
-       "headline_tip": "Toižen pindan pälkirjutez",
-       "nowiki_sample": "Pangat formatiruimatoman tekstan nakhu",
-       "nowiki_tip": "Ignoriruida wiki-formatiruind",
-       "image_sample": "Ozutez.jpg",
-       "image_tip": "Mülütadud fail",
-       "media_sample": "Ozutez.ogg",
-       "media_tip": "Kosketuz mediafailale",
-       "sig_tip": "Teiden allekirjutez da tarkoiktan aigan vestatez",
-       "hr_tip": "Gorizontaline pird (algat kävutagoi paksus)",
        "summary": "Toižetusiden ümbrikacund:",
        "subject": "Tem/pälkirjutez:",
        "minoredit": "Nece om pen' redakcii",
index c593305..a613ae4 100644 (file)
        "resettokens-watchlist-token": "Dấu hiệu cho nguồn cấp [[Special:Watchlist|thay đổi trong danh sách theo dõi]] (dạng Atom/RSS)",
        "resettokens-done": "Đã đặt lại các dấu hiệu.",
        "resettokens-resetbutton": "Đặt lại các dấu hiệu được chọn",
-       "bold_sample": "Chữ đậm",
-       "bold_tip": "Chữ đậm",
-       "italic_sample": "Chữ xiên",
-       "italic_tip": "Chữ xiên",
-       "link_sample": "Liên kết",
-       "link_tip": "Liên kết",
-       "extlink_sample": "http://www.example.com liên kết ngoài",
-       "extlink_tip": "Liên kết ngoài (nhớ ghi http://)",
-       "headline_sample": "Đề mục",
-       "headline_tip": "Đề mục cấp 2",
-       "nowiki_sample": "Nhập dòng chữ không theo định dạng wiki vào đây",
-       "nowiki_tip": "Không theo định dạng wiki",
-       "image_sample": "Ví dụ.jpg",
-       "image_tip": "Chèn hình",
-       "media_sample": "Ví dụ.ogg",
-       "media_tip": "Liên kết phương tiện",
-       "sig_tip": "Chữ ký có ngày",
-       "hr_tip": "Dòng kẻ ngang (không nên lạm dụng)",
        "summary": "Tóm lược:",
        "subject": "Đề mục:",
        "minoredit": "Sửa đổi nhỏ",
index 34169e1..e6f6de5 100644 (file)
        "mailmypassword": " najs passwôrd iwâr iimejl dsuschign lasn",
        "loginlanguagelabel": "Sproch: $1",
        "changepassword": "S'bhaswôrd ändârn",
-       "bold_sample": "Dägsd in fäd",
-       "bold_tip": "Fädâr dhägschd",
-       "italic_sample": "Ghursiif-dhägsd",
-       "italic_tip": "Ghursiif-dhägsd",
-       "link_sample": "Lingg-dhägsd",
-       "link_tip": "Lingg inârhalb fom Wighi",
-       "extlink_sample": "http://www.example.com Lingg-dhägsde",
-       "extlink_tip": "Lingg nach ausârhalb (achdung, „http://“ ghäärd fôrnewäch dâdsu)",
-       "headline_sample": "Iiwârschrifd 2. ôrdnung",
-       "headline_tip": "Iiwârschrifd 2. ôrdnung",
-       "nowiki_sample": "Dô än uunfôrmadiirdn dhägsd nâjschrajm",
-       "nowiki_tip": "Uufôrmadiirdâr dhägsd",
-       "image_tip": "Âjbedâde dadaj",
-       "media_tip": "Lingh af â meedjâ-dadaj",
-       "sig_tip": "Dâj signadhuur dsamm mid'm dadum",
-       "hr_tip": "Horidsondaalâr schdrich (bide schbôôrsam âjsedsâ)",
        "summary": "Dsamfasung:",
        "subject": "Bedräf:",
        "minoredit": "Blos a weng wôs is gändârd wôrn",
index 8a356ce..b594755 100644 (file)
        "changeemail-none": "(nonik)",
        "changeemail-password": "Letavöd olik su {{SITENAME}}:",
        "changeemail-submit": "Votükön ladeti leäktronik",
-       "bold_sample": "Vödem bigik",
-       "bold_tip": "Vödem bigik",
-       "italic_sample": "Korsiv",
-       "italic_tip": "Korsiv",
-       "link_sample": "Yümatiäd",
-       "link_tip": "Yüm ninik",
-       "extlink_sample": "http://www.example.com yümatiäd",
-       "extlink_tip": "Yüm plödik (memolös foyümoti: http://)",
-       "headline_sample": "Tiädavödem",
-       "headline_tip": "Tiäd nivoda 2id",
-       "nowiki_sample": "Pladolös isio vödemi no pefomätöli",
-       "nowiki_tip": "Nedemön vükifomätami",
-       "image_tip": "Magod penüpladöl",
-       "media_tip": "Yüm lü ragiv mediatik",
-       "sig_tip": "Dispenäd olik kobü dät e tim",
-       "hr_tip": "Lien horitätik (no gebolös tu suvo)",
        "summary": "Plän brefik:",
        "subject": "Subyet/tiäd:",
        "minoredit": "Votükam pülik",
index ac77d85..016b48d 100644 (file)
        "resetpass-submit-cancel": "Otmeńoit",
        "passwordreset-username": "Cäüttijänimi:",
        "changeemail-newemail": "Vassõn e-mail:",
-       "bold_sample": "Pimmiä teksti",
-       "bold_tip": "Pimmiä teksti",
-       "italic_sample": "Kursiivoi teksti",
-       "italic_tip": "Kursiivi",
-       "link_sample": "Linkki",
-       "link_tip": "Sisipooliin linkki",
-       "extlink_sample": "http://www.example.com linki nimi",
-       "extlink_tip": "Eräpooliin linkki (mäleht http:// prefiksi)",
-       "headline_sample": "Zagolofkka-teksti",
-       "headline_tip": "Zagolofkka",
-       "nowiki_sample": "Lissä formattimatoo teksti tänne",
-       "nowiki_tip": "Ignoriiroit viki formatti",
-       "image_tip": "Kuva",
-       "media_tip": "Faililinkki",
-       "sig_tip": "Alacirjutuz aikamerkikaa",
-       "hr_tip": "Gorizontalnoi viiru",
        "summary": "Turvotuz:",
        "subject": "Teema:",
        "minoredit": "Kase on peeni muutuz",
index 7bf5967..5aba430 100644 (file)
        "resetpass-recycled": "Olõq hää, valiq umas salasõnas midägi muud, ku parhillanõ salasõna.",
        "resetpass-temp-password": "Aotlinõ salasõna:",
        "passwordreset": "Salasõna vahtsõndaminõ",
-       "bold_sample": "Paks kiri",
-       "bold_tip": "Paks kiri",
-       "italic_sample": "Liuhkakiri",
-       "italic_tip": "Liuhkakiri",
-       "link_sample": "Lingi päälkiri",
-       "link_tip": "Siselink",
-       "extlink_sample": "http://www.example.com Lingi nimi",
-       "extlink_tip": "Välislink (unõhtagu-i ette pandaq http://)",
-       "headline_sample": "Päälkiri",
-       "headline_tip": "Tõõsõ tasõmõ päälkiri",
-       "nowiki_sample": "Kirodaq kujondamalda tekst",
-       "nowiki_tip": "Tunnistagu-i viki kujondust",
-       "image_sample": "Näüdüs.jpg",
-       "image_tip": "Pästet pilt",
-       "media_sample": "Näüdüs.ogg",
-       "media_tip": "Meediäteedüstü",
-       "sig_tip": "Suq allkiri üten aotempliga",
-       "hr_tip": "Horisontaaljuun",
        "summary": "Kokkovõtõq:",
        "subject": "Päälkiri:",
        "minoredit": "Taa om väiku parandus",
index efebbb0..1688707 100644 (file)
        "changeemail-newemail": "Novele adresse emile:",
        "changeemail-none": "(nole)",
        "changeemail-submit": "Candjî l' emile",
-       "bold_sample": "Cråssès letes",
-       "bold_tip": "Tecse e cråssès letes",
-       "italic_sample": "Clintcheyès letes",
-       "italic_tip": "Tecse e clintcheyès letes",
-       "link_sample": "Tecse pol loyén",
-       "link_tip": "Divintrin loyén",
-       "extlink_sample": "http://www.example.com tecse pol hårdêye",
-       "extlink_tip": "Difoûtrinne hårdêye (èn rovyîz nén di mete «http://» pa dvant)",
-       "headline_sample": "Tecse di tite",
-       "headline_tip": "Tite di 2inme livea",
-       "nowiki_sample": "Tapez l' tecse nén wiki chal",
-       "nowiki_tip": "Èn nén analijhî des côdes wiki, eyet purade les håyner sins fôrmater",
-       "image_sample": "Egzimpe.jpg",
-       "image_tip": "Ravalêye imådje",
-       "media_sample": "Egzimpe.ogg",
-       "media_tip": "Loyén viè on fitchî multimedia (come do son evnd)",
-       "sig_tip": "Li sinateure da vosse, avou l' date et l' eure",
-       "hr_tip": "Roye di coûtchî (a n' nén eployî d' trop)",
        "summary": "Rascourti:",
        "subject": "Sudjet:",
        "minoredit": "Ci n' est k' ene tchitcheye",
index d54ed05..eb70fa4 100644 (file)
        "resettokens-watchlist-token": "Token para han web feed (Atom/RSS) han[[Special:Watchlist|mga pagbag-o ha imo pakli han talaan-barantayon]]",
        "resettokens-done": "Narest an mga token.",
        "resettokens-resetbutton": "Igreset an pinili nga mga token",
-       "bold_sample": "dakmola an agi",
-       "bold_tip": "Dakmola an agi",
-       "italic_sample": "Pakiling nga agi",
-       "italic_tip": "Pakiling nga agi",
-       "link_sample": "Titulo han sumpay",
-       "link_tip": "Sumpay ha sulod",
-       "extlink_sample": "http://www.example.com sumpay nga titulo",
-       "extlink_tip": "Sumpay ha gawas (hinumdomi http:// pahiuna-nga-panumpay)",
-       "headline_sample": "teksto han katukiban",
-       "headline_tip": "Katupngan 2 nga katukiban",
-       "nowiki_sample": "Igsuksok an diri-nakaayos nga mga teksto dinhi",
-       "nowiki_tip": "Pabay-i la an pagfoformat nga wiki",
-       "image_tip": "Nakatampo nga paypay",
-       "media_tip": "sumpay han paypay",
-       "sig_tip": "Imo pirma nga may-ada marka hin oras",
-       "hr_tip": "Patumba nga bagis (hinay-hinay la it paggamit)",
        "summary": "Halipotay nga masisiring:",
        "subject": "Himangrawan:",
        "minoredit": "Gutiay ini nga pagliwat",
index 703314d..1480e97 100644 (file)
        "resetpass-wrong-oldpass": "Baatujall bu diiru walla bi teew baaxul.\nXèj-na baatujàll bi soppi nga ko ba noppi, walla xéj-na it dangaa laaj beneen baatujàll bu diiru.",
        "resetpass-temp-password": "Baatujàll bu diiru :",
        "passwordreset": "Neenal baatujàll bi",
-       "bold_sample": "Duufal mbind mi",
-       "bold_tip": "Duufal mbind mi",
-       "italic_sample": "Wengal mbind mi",
-       "italic_tip": "Wengal mbind mi",
-       "link_sample": "Koju lëkkalekaay bi",
-       "link_tip": "Lëkkalekaay yu biir",
-       "extlink_sample": "http://www.example.com koju lëkkalekaay bi",
-       "extlink_tip": "Lëkkalekaay yu biti (bul fattee jiital http://)",
-       "headline_sample": "Ron-koj",
-       "headline_tip": "Ron-koj 2 tolluwaay",
-       "nowiki_sample": "Dugalal fii mbind mi ñu joxul melokaan",
-       "nowiki_tip": "Jéllaleel mbindinu wiki",
-       "image_sample": "Misaal.jpg",
-       "image_tip": "Roof ab nataal",
-       "media_sample": "Misaal.ogg",
-       "media_tip": "Lëkkalekaay buy jëme ciw ŋara",
-       "sig_tip": "Xaatimee waxtu wi",
-       "hr_tip": "Rëdd wu tëdd (bul ci ëppal)",
        "summary": "Tënk&nbsp;:",
        "subject": "Tëriit/koj:",
        "minoredit": "Coppite yu néewal",
index 38131aa..5c250c7 100644 (file)
        "resettokens-token-label": "$1(当前值:$2)",
        "resettokens-done": "密钥已重置。",
        "resettokens-resetbutton": "重置选中个密钥",
-       "bold_sample": "粗体文字",
-       "bold_tip": "粗体文字",
-       "italic_sample": "斜体文字",
-       "italic_tip": "斜体文字",
-       "link_sample": "链接标题",
-       "link_tip": "内部链接",
-       "extlink_sample": "http://www.example.com 链接标题",
-       "extlink_tip": "外部链接(前头记牢加 http://)",
-       "headline_sample": "标题文本",
-       "headline_tip": "2级标题文字",
-       "nowiki_sample": "来箇里插入非格式文本",
-       "nowiki_tip": "弗管wiki格式",
-       "image_tip": "嵌入文件",
-       "media_tip": "文件链接",
-       "sig_tip": "签名搭辰光戳",
-       "hr_tip": "水平线 (小心用)",
        "summary": "摘要:",
        "subject": "主题:",
        "minoredit": "箇是小变化",
index 2abbe5e..8d9092c 100644 (file)
        "changepassword-success": "Тана нууц үгиг йовудта сольв! Та ода орнат...",
        "resetpass-submit-loggedin": "Нууц үг сольх",
        "resetpass-submit-cancel": "Буцх",
-       "bold_sample": "Тарһн бичг",
-       "bold_tip": "Тарһн бичг",
-       "italic_sample": "Өкәсн бичг",
-       "italic_tip": "Өкәсн бичг",
-       "link_sample": "Заалһин нерн",
-       "link_tip": "Дотрк заалһ",
-       "extlink_sample": "http://www.example.com заалһин һарцг",
-       "extlink_tip": "Һазак заалһ (http:// эклвр бичә мартн)",
-       "headline_sample": "Һарцгин бичәсн",
-       "headline_tip": "Дү һарцг",
-       "nowiki_sample": "Энд кевлүлх кергго бичәсн орултн",
-       "nowiki_tip": "Вики кевлүллт басх",
-       "image_tip": "Углсн боомг",
-       "media_tip": "Боомгур заалһ",
-       "sig_tip": "Тана тәвсн һар цаг хойр",
-       "hr_tip": "Кевтә татасн (нигтәр биш керглтн)",
        "summary": "Үндсн:",
        "subject": "Төр/һарцг:",
        "minoredit": "Баһ ясвр",
index cc010c2..e7a5cc0 100644 (file)
        "resettokens-watchlist-token": "ტოკენი ვებ-არხისთვის (Atom/RSS) [[Special:Watchlist|გვერდების ცვლილებები თქვენი კონტროლის სიაში]]",
        "resettokens-done": "ჟეტონების ჩამოყრა.",
        "resettokens-resetbutton": "არჩეული ჟეტონების ჩამოყრა",
-       "bold_sample": "რუმე ტექსტი",
-       "bold_tip": "რუმე ტექსტი",
-       "italic_sample": "ელართელი ტექსტი",
-       "italic_tip": "ელართელი ტექსტი",
-       "link_sample": "რცხუშ ჯოხო",
-       "link_tip": "დინოხოლენი რცხუ",
-       "extlink_sample": "http://www.example.com რცხუშ ჯოხო",
-       "extlink_tip": "გალენი რცხუ (ქორშუდანი http:// პრეფიქსი)",
-       "headline_sample": "დუდლანდარიშ ტექსტი",
-       "headline_tip": "მაჟირა დონეშ დუდლანდარი",
-       "nowiki_sample": "ქინახუნეთ უგუფორმატაფუ ტექსტი თაქ",
-       "nowiki_tip": "ვიკიშ ფორმატირაფაშ იგნორირაფა",
-       "image_tip": "დინოხუნაფილი ფაილი",
-       "media_tip": "ფაილიშ რცხუ",
-       "sig_tip": "თქვან ხეშმოჭარა დო ბორჯი",
-       "hr_tip": "ჰორიზონტალური ღოზი (ვაგიმირინუათ შხირას)",
        "summary": "რეზიუმე:",
        "subject": "თემა/დუდლანდარი:",
        "minoredit": "თენა რე ჭიჭე რედაქტირაფა",
index 33ff1ad..073dff9 100644 (file)
        "resetpass-submit-cancel": "kayni’",
        "passwordreset": " ’in’alay naehan paskayzaeh ka mima:",
        "passwordreset-username": " kamamatawaw raro:o’:",
-       "bold_sample": " pinakrarahoe’ ka kina:at",
-       "bold_tip": " pinakrarahoe’ ka kina:at",
-       "italic_sample": " kina:at pinay’iring",
-       "italic_tip": " kina:at pinay’iring",
-       "link_sample": " kalotoran raro:o’",
-       "link_tip": "izo’ kalotoran",
-       "extlink_sample": "http://www.example.com kalotoran raro:o’",
-       "extlink_tip": " ’oehaez kalotoran ( hoehoero: ’anoka http:// ’on’alay)",
-       "headline_sample": "minayhal ka raro:o’ kina:at",
-       "headline_tip": "minaypoSal ka raro:o’ kina:at",
-       "nowiki_sample": "paksilaeh ’inoki ke:Se’hwa’ ka kina:at",
-       "nowiki_tip": "’itayso: ka wiki pinke:Se’hwa’",
-       "image_tip": "tang’an rinpa:",
-       "media_tip": " tang’an kalotoran",
-       "sig_tip": "’inSo’a kina:at raro:o’ ki hahila: jikang",
-       "hr_tip": "hinoba:ang ’imatatihingha’ (’okik rengreng)",
        "summary": "zhayaw:",
        "minoredit": "hini ’aehae’ ka pinaybiil kaponrowa’en",
        "watchthis": "kitkita’ ka hini ye:myen",
index 46c9688..aaae647 100644 (file)
        "resettokens-watchlist-token": "טאקן פארן וועב־פֿיד (Atom/RSS) פון [[Special:Watchlist|ענדערונגען צו בלעטער אויף אייער אויפֿפאסונג ליסטע]]",
        "resettokens-done": "טאקנס צוריקגעזעצט.",
        "resettokens-resetbutton": "צוריקזעצן אויסגעקליבענע טאקנס",
-       "bold_sample": "דיקער טעקסט",
-       "bold_tip": "דיקער טעקסט",
-       "italic_sample": "דאס וועט מאכן ''שיף'' די אויסגעוועלט ווארט.",
-       "italic_tip": "דאס וועט מאכן ''שיף'' די אויסגעוועלט פאנט.",
-       "link_sample": "שרײַבט דאָ אַרײַן די װערטער װאָס װעט זײַן אַ לינק צו {{SITENAME}} אַרטיקל אין דעם נושא",
-       "link_tip": "מאך דאס א '''לינק''' צו א וויקיפעדיע ארטיקל",
-       "extlink_sample": "http://www.example.com לינק טיטל",
-       "extlink_tip": "דערויסענדיגע לינק (געדענק http:// פרעפיקס)",
-       "headline_sample": "קעפּל",
-       "headline_tip": "קעפּל -2טער שטאפל",
-       "nowiki_sample": "נישט פֿארמאַטירטער טעקסט",
-       "nowiki_tip": "נישט פֿאָרמאַטירטער טעקסט",
-       "image_sample": "PictureFileName.jpg|קליין|250px|לייגט דא א קעפל פֿארן בילד",
-       "image_tip": "טעקע געוויזן אין בלאט",
-       "media_sample": "ביישפיל.ogg",
-       "media_tip": "פארבינדונג צו א מעדיע טעקע",
-       "sig_tip": "אייער אינטערשריפט, מיט א צייט סטעמפּל ווען איר האט אונטערגעשריבן.",
-       "hr_tip": "א שטרייך אין די ברייט, (נישט נוצן אפט)",
        "summary": "קורץ וואָרט:",
        "subject": "טעמע:",
        "minoredit": "דאס איז א מינערדיגע ענדערונג",
index 03552cf..871febd 100644 (file)
        "changeemail-none": "(kòsí)",
        "changeemail-password": "Ọ̀rọ̀ìpamọ́ {{SITENAME}} yín:",
        "changeemail-submit": "Ìyípadà E-mail",
-       "bold_sample": "Ìkọ kedere",
-       "bold_tip": "Ìkọ kedere",
-       "italic_sample": "Ìkọ italiki",
-       "italic_tip": "Ìkọ̀wé italiki",
-       "link_sample": "Àkọlé ìjápọ̀",
-       "link_tip": "Ìjápọ̀ inú",
-       "extlink_sample": "http://www.example.com àkọlé ìjápọ̀",
-       "extlink_tip": "Ìjápọ̀ lóde (ẹ mọ́ gbàgbé àlẹ̀mọ́wájú http://)",
-       "headline_sample": "Ìkọ àkọlé",
-       "headline_tip": "Àkọlé onípele 2",
-       "nowiki_sample": "Ìkìbọ̀ ìkọ àìjẹ́ síṣèdá síbí",
-       "nowiki_tip": "Kí á fojú fo bí wiki ṣe rí",
-       "image_tip": "Fáìlì tí a kìbọ̀",
-       "media_tip": "Ìjápọ̀ fáìlì",
-       "sig_tip": "Ìtọwọ́bọ̀wé yín pẹ̀lú àsìkò àti déètì",
-       "hr_tip": "Ìlà gbọlọjọ (ẹ lọ̀ọ́ pẹ̀lú àkíyèsì)",
        "summary": "Àkótán:",
        "subject": "Ìdálé-ọ̀rọ̀:",
        "minoredit": "Àtúnṣe kékeré nìyí",
index 143b9a7..6709950 100644 (file)
        "resettokens-watchlist-token": "訂[[Special:Watchlist|監視清單]] Atom/RSS 嘅密匙",
        "resettokens-done": "密匙已經重設。",
        "resettokens-resetbutton": "重設指定密匙",
-       "bold_sample": "粗體字",
-       "bold_tip": "粗體字",
-       "italic_sample": "斜體字",
-       "italic_tip": "斜體字",
-       "link_sample": "連結標題",
-       "link_tip": "內部連結",
-       "extlink_sample": "http://www.example.com 連結標題",
-       "extlink_tip": "連出去(記住加 http:// 開頭)",
-       "headline_sample": "標題文字",
-       "headline_tip": "二級標題",
-       "nowiki_sample": "喺呢度插入非格式代文字",
-       "nowiki_tip": "唔理 wiki 格式",
-       "image_tip": "嵌入檔案",
-       "media_tip": "檔案連結",
-       "sig_tip": "你嘅簽名同埋時間戳",
-       "hr_tip": "橫線(請小心用)",
        "summary": "摘要:",
        "subject": "主題:",
        "minoredit": "呢個係細修改",
index 64c64ed..5b00d86 100644 (file)
        "resetpass_submit": "Wachtwoôrd instell'n en anmelden",
        "changepassword-success": "Je wachtwoord is ewiezigd. Bezig mie anmelden ...",
        "resetpass_forbidden": "Wachtwoôrden kunn'n op {{SITENAME}} nie ewiezigd worn",
-       "bold_sample": "Vette tekst",
-       "bold_tip": "Vet",
-       "italic_sample": "Schuunhedrukte tekst",
-       "italic_tip": "Schuun",
-       "link_sample": "Onderwerp",
-       "link_tip": "Interne lienk",
-       "extlink_sample": "http://www.example.com lienktekst",
-       "extlink_tip": "Externe lienk (verheet http:// nie)",
-       "headline_sample": "Deêlonderwerp",
-       "headline_tip": "Tussenkopje (oôgste niveau)",
-       "nowiki_sample": "Voer ier de nie op te maeken tekst in",
-       "nowiki_tip": "Wiki-opmaek neheren",
-       "image_tip": "Mediabestand",
-       "media_tip": "Lienk ni bestand",
-       "sig_tip": "Jen 'andteêkenienge mie datum en tied",
-       "hr_tip": "Horizontaele lien (gebruuk spaerzaem)",
        "summary": "Saemenvatting:",
        "subject": "Onderwerp/kop:",
        "minoredit": "Dit is een kleine wieziging",
index d0d4c8a..b2944ca 100644 (file)
        "history": "ⴰⵎⵣⵔⴰⵢ ⵏ ⵜⴰⵙⵏⴰ",
        "history_short": "ⴰⵎⵣⵔⵓⵢ",
        "history_small": "ⴰⵎⵣⵔⵓⵢ",
-       "updatedmarker": "âµ\9cⵡⴰâµ\99âµ\99âµ\8fâ´¼âµ\8d âµ\9câµ\89â´³âµ\89âµ\94â´° âµ\8f âµ\93âµ\94ⵣⴰⴼ âµ\89âµ\8fâµ\93",
+       "updatedmarker": "âµ\9cⵡⴰâµ\99âµ\99âµ\8fâ´¼âµ\8d âµ\9câµ\89â´³âµ\89âµ\94â´° âµ\8f âµ\93âµ\94ⵣⴰⴼ âµ\8fâ´½:",
        "printableversion": "ⵜⵓⵏⵖⵉⵍⵜ ⵉⵜⵜⵡⴰⵙⵉⴳⴳⵣⵏ",
        "permalink": "ⴰⵙⵖⵏ ⴰⵎⵖⵍⴰⵍ",
        "print": "ⵙⵉⴳⴳⵣ",
        "changeemail-newemail-help": "ⴰⵊⵊ ⵉⴳⵔ ⴰⴷ ⵢⵓⵔⴰⵏ ⵉⵖ ⵜⵔⵉⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵏⴽ. ⵓⵔ ⵔⴰ ⵙⵓⵍ ⵜⵉⵥⴹⵓⵔⴷ ⴰⴷ ⵜⵔⴰⵔⴷ ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵉⵖ ⵜⵜ ⵜⵜⵓⴷ ⴷ ⵓⵔ ⵔⴰ ⴽⵉⵏ ⵙⵓⵍ ⵍⴽⴽⵎⵏⵜ ⵜⵓⵣⵉⵏⵉⵏ ⵜⴰⵍⵉⵟⵕⵓⵏⵉⵜⵉⵏ ⵙⴳ ⵓⵡⵉⴽⵉ ⴰⴷ ⵉⵖ ⵜⴽⴽⵙⴷ ⴰⵏⵙⴰ ⴰⵍⵉⴽⵟⵕⵓⵏⵉ ⵏⴽ.",
        "changeemail-none": "(ⵓⵍⴰ ⵢⴰⵏ)",
        "changeemail-password": "ⴰⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵏⴽ ⴳ {{SITENAME}}:",
-       "bold_sample": "ⴰⴹⵔⵉⵙ ⴰⵣⵓⵔⴰⵔ",
-       "bold_tip": "ⴰⴹⵔⵉⵙ ⴰⵣⵓⵔⴰⵔ",
-       "italic_sample": "ⴰⴹⵔⵉⵙ ⵓⵣⵍⵉⴳ",
-       "italic_tip": "ⴰⴹⵔⵉⵙ ⵓⵣⵍⵉⴳ",
-       "link_sample": "ⴰⵣⵡⵍ ⵏ ⵓⵙⵖⵓⵏ",
-       "link_tip": "ⴰⵙⵖⵓⵏ ⴰⴳⵯⵏⵙⴰⵏ",
-       "extlink_sample": "http://www.example.com ⴰⵣⵡⵍ ⵏ ⵓⵙⵖⵓⵏ",
-       "extlink_tip": "ⴰⵙⵖⵓⵏ ⴰⴱⵕⵕⴰⵏⵉ (ⴽⵜⵢ ⴰⵣⵡⵉⵔ http://)",
-       "headline_sample": "ⴰⴹⵕⵉⵚ ⵏ ⵓⵣⵡⵍ",
-       "headline_tip": "ⴰⵣⵡⵍ ⵏ ⵓⵙⵡⵉⵔ 2",
-       "nowiki_sample": "ⵙⵙⴽⵛⵎ ⴰⴹⵕⵉⵚ ⵡⴰⵔⴰⵙⵎⵓⵜⵜⴳ ⴷⴳⵉ",
-       "nowiki_tip": "ⴰⴷ ⵓⵔ ⵜⴰⵡⵉⵜ ⵅⴼ ⵜⵙⵏⴰⵢⵜ ⵏ ⵓⵡⵉⴽⵉ",
-       "image_tip": "ⴰⴼⴰⵢⵍⵓ ⵉⵜⵜⵓⵙⵉⴷⴼⵏ",
-       "media_tip": "ⴰⵙⵖⵓⵏ ⵏ ⵓⴼⴰⵢⵍⵓ",
-       "sig_tip": "ⴰⴷⵔⵉⵣ ⵏⴽ ⴷ ⵓⵙⴰⴽⵓⴷ",
-       "hr_tip": "ⵉⵣⵔⵉⵔⵉ ⴰⴳⵍⴰⵡⴰⵏ (ⵓⵔ ⵜⵄⵢⵢⵇ)",
        "summary": "ⴰⵙⴳⵣⵍ:",
        "minoredit": "ⵡⴰ ⴷ ⴰⵙⵏⴼⵍ ⵓⵎⵥⵉⵢ",
        "watchthis": "ⵎⵎⴰⵜⵔ ⵜⴰⵙⵏⴰ ⴰⴷ",
        "accmailtitle": "ⵜⴰⴳⵓⵔⵉ ⵓⵣⵔⴰⵢ ⵜⴻⵜⵜⵡⴰⵣⵏ",
        "newarticle": "(ⴰⵎⴰⵢⵏⵓ)",
        "newarticletext": "ⵜⴹⴼⴰⵔⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵖⵔ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵓⵔ ⵜⴰ ⵉⵍⵍⵉⵏ. \nⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ, ⵙⵙⵏⵜⵉ ⵜⵉⵔⵔⴰ ⴳ ⵓⴼⵏⵉⵇ ⴳ ⵉⵣⴷⴷⴰⵔ (ⵥⵔ [$1 ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ] ⵉ ⵡⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ). \nⵎⴽ ⵜⵍⵍⵉⴷ ⴷⴰ ⵙ ⵓⵣⴳⴰⵍ, ⴰⴽⵍ ⵖⴼ <strong>ⴰⵖⵓⵍ</strong> ⴳ ⵓⵙⴰⵔⴰ ⵏⵏⴽ.",
-       "anontalkpagetext": "----\n<em>ⵜⵍⵍⵉⴷ ⴳ ⵜⴰⵙⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵏ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⵏⵏⴰ ⵜⴰ ⵓⵔ ⵉⵙⴽⵉⵔⵏ ⴰⵎⵉⴹⴰⵏ ⵏⵖ ⵏⵏⴰ ⵜ ⵓⵔ ⵉⵙⵙⵎⵔⵉⵙⵏ</em>.\nⴰⵢⴰ ⴰ ⵖⴼ ⵉⴼⵓⴽⴽ ⴰⴷ ⵏⵙⵙⵎⵔⵙ ⵜⴰⵏⵙⴰ ⵏⵏⵙ IP ⴼⴰⴷ ⴰⴷ ⵜ ⵏⵙⵎⴰⴳⵉ.\nⵢⴰⵜ ⵜⴰⵏⵙⴰ IP ⵥⴹⴰⵔⵏ ⴰⴷ ⵜⵜ ⵙⵙⵓⵔⵏ ⵎⵏⵏⴰⵡ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵎⴽ ⵜⴳⵉⴷ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⴷ ⴽ ⵜⵖⴹⴼⴷ ⵎⴰⵙ ⴽ ⵡⴰⵜⵙⵏ ⴽⵔⴰ ⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵙⵉⴽ ⵉⵥⵍⵉⵏ, ⵜⵓⴼⵉⴷ ⴰⴷ  [[Special:CreateAccount|ⵙⴽⵔ ⵢⴰⵏ ⵓⵎⵉⴹⴰⵏ]] ⵏⵖ ⴷ [[Special:UserLogin|ⴽⵛⵎ]] ⴱⴰⵔ ⴰⴷ ⵜⴰⵏⴼⴷ ⵉ ⴽⵔⴰⵢⴳⴰⵜ ⴰⵎⵔⴽⵙ ⴷ ⵉⵎⴷⵔⴰⵡⵏ ⵢⴰⴹⵏ.",
+       "anontalkpagetext": "----\n<em>ⵜⵍⵍⵉⴷ ⴳ ⵜⴰⵙⵏ ⵏ ⵓⵎⵙⴰⵡⴰⵍ ⵏ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⵏⵏⴰ ⵜⴰ ⵓⵔ ⵉⵙⴽⵉⵔⵏ ⴰⵎⵉⴹⴰⵏ ⵏⵖ ⵏⵏⴰ ⵜ ⵓⵔ ⵉⵙⵙⵎⵔⵉⵙⵏ</em>.\nⴰⵢⴰ ⴰ ⵖⴼ ⵉⴼⵓⴽⴽ ⴰⴷ ⵏⵙⵙⵎⵔⵙ ⵜⴰⵏⵙⴰ ⵏⵏⵙ IP ⴼⴰⴷ ⴰⴷ ⵜ ⵏⵙⵎⴰⴳⵉ.\nⵢⴰⵜ ⵜⴰⵏⵙⴰ IP ⵥⴹⴰⵔⵏ ⴰⴷ ⵜⵜ ⵙⵙⵓⵔⵏ ⵎⵏⵏⴰⵡ ⵏ ⵉⵏⵙⵙⵎⵔⵙⵏ.\nⵎⴽ ⵜⴳⵉⴷ ⵢⴰⵏ ⵓⵏⵙⵙⵎⵔⵙ ⵡⴰⵔⵉⵙⵎ ⴷ ⴽ ⵜⵖⴹⴼⴷ ⵎⴰⵙ ⴽ ⵡⴰⵜⵙⵏ ⴽⵔⴰ ⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ ⵓⵔ ⵙⵉⴽ ⵉⵥⵍⵉⵏ, ⵜⵓⴼⵉⴷ ⴰⴷ  [[Special:CreateAccount|ⵙⴽⵔ ⵢⴰⵏ ⵓⵎⵉⴹⴰⵏ]] ⵏⵖ ⴷ [[Special:UserLogin|ⴽⵛⵎ]] ⴱⴰⵔ ⴰⴷ ⵜⴰⵏⴼⴷ ⵉ ⴽⵔⴰⵢⴳⴰⵜ ⴰⵎⵔⴽⵙ ⴷ ⵉⵎⴷⵔⴰⵡⵏ ⵢⴰⴹⵏ.",
        "noarticletext": "ⵓⵔ ⵉⵍⵍⵉ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵙ ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ ⵖⵉⵍⴰ. \nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ logs ⵖⵔⵙ ⵉⵇⵇⵏⴻⵏ],\nⵏⵖ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ]</span>.",
        "noarticletext-nopermission": "ⴷⵖⵉ ⵓⵔ ⵉⵍⵍⵉ ⴰⵡⴷ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵚ ⴳ ⵜⴰⵙⵏⴰ ⴰ.\nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏⵉⵏ, ⵏⵖ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ ⵉⵣⵎⵎⴻⵎⵏ ⵉⵣⴷⵉⵏ]</span>, ⵎⴰⵛⴰ ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ ⴰ.",
        "userpage-userdoesnotexist-view": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵎⵙⵙⵎⵔⵙ $1 ⵓⵔ ⵉⵜⵜⵓⵣⵎⵎⴻⵎ.",
        "last": "ⵓⵣⵡⵔ",
        "page_last": "ⴰⵎⴳⴳⴰⵔⵓ",
        "histlegend": "ⴰⵙⵜⴰⵢ ⵏ ⵓⵎⵣⴰⵔⴰⵢ : ⵔⵛⵎ ⵜⴰⵏⴽⵓⵍⵉⵏ ⵏ ⵜⵓⵏⵖⵉⵍⵉⵏ ⵏⵏⴰ ⵜⵔⵉⴷ ⴰⴷ ⵜⵙⵎⵣⴰⵣⴰⵍⴷ ⵜⴰⴷⵔⴷ ⵉ ⴰⴽⵎ ⵏⵖ ⵉ ⵜⵙⴰⵔⵓⵜ ⵏ ⵢⵉⵣⴷⴰⵔ.<br />\nⵜⴰⴱⴰⴷⵓⵜ : <strong>({{int:cur}})</strong> = ⴰⵎⵣⴰⵔⴰⵢ ⴰⴽⴷ ⵜⵓⵏⵖⵉⵍⵜ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ, <strong>({{int:last}})</strong> = ⴰⵎⵣⴰⵔⴰⵢ ⴰⴽⴷ ⵜⵓⵏⵖⵉⵍⵜ ⵉⵣⵔⵉⵏ, <strong>{{int:minoreditletter}}</strong> = ⵉⵙⵏⵉⴼⵉⵍⵏ ⵉⵎⵥⵥⵉⵢⵏ.",
-       "history-fieldset-title": "âµ\94âµ£âµ\93 âµ\96â´¼ ⵉⵣⵣⵔⴰⵢⵏ",
+       "history-fieldset-title": "âµ\99âµ\9câµ\89 ⵉⵣⵣⵔⴰⵢⵏ",
        "histfirst": "ⴰⵇⴱⵓⵔ",
        "histlast": "ⴰⵎⴰⵢⵏⵓ",
        "history-feed-title": "ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵣⵣⵔⴰⵢ",
        "rcfilters-savedqueries-already-saved": "ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ ⴰⴷ ⵜⵜⵡⴰⵃⴹⴰⵏⵜ ⵢⴰⴷ. ⵙⵏⴼⵍ ⵜⵉⵙⵖⴰⵍ ⵏⴽ ⵃⵎⴰ ⴰⴷ ⵜⵙⵏⴼⵍⴷ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵜⴰⵎⴰⵢⵏⵓⵜ ⵉⵜⵜⵡⴰⵃⴹⴰⵏ.",
        "rcfilters-restore-default-filters": "ⵔⴰⵔ ⴷ ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ ⵙ ⵓⵎⵕⴰⴹ",
        "rcfilters-clear-all-filters": "ⵚⵚⴼⴹ ⴰⴽⴽⵯ ⵜⵉⵎⵣⵉⵣⴷⴳⵉⵜⵉⵏ",
-       "rcfilters-show-new-changes": "ⵙⴽⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ",
+       "rcfilters-show-new-changes": "ⵙⴽⵏ ⵉⵙⵏⴼⵍⵏ ⵉⵎⴰⵢⵏⵓⵜⵏ ⵣⴳ $1",
        "rcfilters-search-placeholder": "ⵣⵉⵣⴷⵉⴳ ⵉⵙⵏⴼⵍⵏ (ⵙⵎⵔⵙ ⵓⵎⵓⵖ ⵏⵖ ⵔⵣⵓ ⵖⴼ ⵉⵙⵎ ⵏ ⵜⵎⵣⵉⵣⴷⴳⵜ)",
        "rcfilters-invalid-filter": "ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵓⵔ ⵉⵖⵥⴰⵏⵏ",
        "rcfilters-empty-filter": "ⵃⵜⵜⴰ ⴽⵔⴰ ⵏ ⵜⵉⵎⵣⵉⵣⴷⴳⵜ ⵉⵙⵡⵓⵔⵉⵏ. ⴰⴽⴽⵯ ⵉⵙⵏⵍⵏ ⵜⵜⵡⴰⵙⴽⵏⵏ.",
index a65b321..5d75381 100644 (file)
        "tog-useeditwarning": "当我离开编辑页面时,如果有尚未保存的更改,请提醒我",
        "tog-prefershttps": "在登录后总是使用安全连接",
        "tog-showrollbackconfirmation": "当点击回退链接时显示确认提示",
+       "tog-requireemail": "需要电子邮件用于重置密码",
        "underline-always": "始终",
        "underline-never": "从不",
        "underline-default": "皮肤或浏览器默认设置",
        "createaccountmail": "使用一个临时的随机密码并将其发送到指定的电子邮件地址中",
        "createaccountmail-help": "可被用于为另一个人创建账户而不需要得知密码。",
        "createacct-realname": "真实姓名(可选)",
-       "createacct-reason": "原因",
+       "createacct-reason": "原因(公开记录)",
        "createacct-reason-ph": "您为什么要创建另一个账户",
        "createacct-reason-help": "在账户创建日志中显示的消息",
        "createacct-submit": "创建您的账户",
        "resettokens-watchlist-token": "[[Special:Watchlist|对你的监视列表中的页面的更改]]的网页feed(Atom/RSS)的密钥",
        "resettokens-done": "密钥已重置。",
        "resettokens-resetbutton": "重置选择的密钥",
-       "bold_sample": "粗体文字",
-       "bold_tip": "粗体文字",
-       "italic_sample": "斜体文字",
-       "italic_tip": "斜体文字",
-       "link_sample": "链接标题",
-       "link_tip": "内部链接",
-       "extlink_sample": "http://www.example.com 链接标题",
-       "extlink_tip": "外部链接(加前缀 http://)",
-       "headline_sample": "大标题文字",
-       "headline_tip": "2级标题",
-       "nowiki_sample": "在此插入非格式文本",
-       "nowiki_tip": "插入非格式文本",
-       "image_sample": "范例.jpg",
-       "image_tip": "插入文件",
-       "media_sample": "范例.ogg",
-       "media_tip": "文件链接",
-       "sig_tip": "带时间戳的签名",
-       "hr_tip": "水平线(请小心使用)",
        "summary": "摘要:",
        "subject": "主题:",
        "minoredit": "标记为小编辑",
        "content-model-css": "CSS",
        "content-json-empty-object": "空的对象",
        "content-json-empty-array": "空的数组",
+       "unsupported-content-model": "<strong>警告:</strong>内容模型$1在此wiki上不支持。",
        "deprecated-self-close-category": "使用无效自封闭HTML标签的页面",
        "deprecated-self-close-category-desc": "页面包含无效的自封闭HTML标签,例如<code>&lt;b/></code>或<code>&lt;span/></code>。这些标签的行为将很快被更改以与HTML5规格相一致,所以它们在wiki文本中的使用已弃用。",
        "duplicate-args-warning": "<strong>警告:</strong>[[:$1]]正在调用超过一个[[:$2]]中“$3”参数的值。只有最后提供的值会被使用。",
        "listfiles-userdoesnotexist": "用户帐户“$1”未注册。",
        "imgfile": "文件",
        "listfiles": "文件列表",
+       "listfiles_subpage": "由$1上传",
        "listfiles_thumb": "缩略图",
        "listfiles_date": "日期",
        "listfiles_name": "名称",
        "ipblocklist-legend": "查找被封禁用户",
        "blocklist-userblocks": "隐藏账户封禁",
        "blocklist-tempblocks": "隐藏临时封禁",
+       "blocklist-indefblocks": "隐藏无限期封禁",
        "blocklist-addressblocks": "隐藏单个IP封禁",
        "blocklist-type": "类型:",
        "blocklist-type-opt-all": "全部",
index 208449b..49b362f 100644 (file)
        "tog-useeditwarning": "在我離開未儲存的編輯頁面時警告我",
        "tog-prefershttps": "登入時永遠使用安全連線",
        "tog-showrollbackconfirmation": "當點擊回退連結時顯示確認提示",
+       "tog-requireemail": "需要電子郵件用來重設密碼",
        "underline-always": "永遠使用",
        "underline-never": "永不使用",
        "underline-default": "佈景主題或瀏覽器預設",
        "createaccountmail": "使用臨時的隨機密碼,並將它寄至指定的電子郵件地址",
        "createaccountmail-help": "可用來建立其他人的帳號 (不需要知道密碼)。",
        "createacct-realname": "真實姓名 (選填)",
-       "createacct-reason": "原因",
+       "createacct-reason": "原因(公開記錄)",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
        "createacct-reason-help": "顯示於帳號建立日誌的訊息",
        "createacct-submit": "建立您的帳號",
        "nouserspecified": "您必須指定一個使用者名稱。",
        "login-userblocked": "這位使用者已被封鎖,不允許登入。",
        "wrongpassword": "您輸入的使用者名稱或密碼錯誤,請再試一次。",
-       "wrongpasswordempty": "輸入的密碼是空的。\n請再試一次。",
+       "wrongpasswordempty": "輸入的密碼是空的。請再試一次。",
        "passwordtooshort": "您的密碼至少需要 $1 個字元。",
        "passwordtoolong": "密碼不能超過 {{PLURAL:$1|1 個字元|$1 個字元}}。",
        "passwordtoopopular": "不能使用普遍選擇的密碼。請選擇更難猜出的密碼",
        "cannotchangeemail": "此 wiki 無法變更帳號的電子郵件地址。",
        "emaildisabled": "此網站不能傳送電子郵件。",
        "accountcreated": "已建立帳號",
-       "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|討論]]) 已建立。",
+       "accountcreatedtext": "使用者帳號[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])已建立。",
        "createaccount-title": "{{SITENAME}} 的帳號建立",
        "createaccount-text": "不明人士使用您的電子郵件地址在 {{SITENAME}} ($4) 建立了一個帳號名稱為 \"$2\",密碼為 \"$3\"。\n您應該立即登入並更改密碼。\n\n如果該帳號是建立錯誤的話,您可以忽略此訊息。",
        "login-throttled": "您已經嘗試太多次的登入動作。\n請稍等 $1 後再試。",
        "changeemail-oldemail": "目前的電子郵件地址:",
        "changeemail-newemail": "新的電子郵件地址:",
        "changeemail-newemail-help": "若您想移除您的電子郵件地址,此欄位應留空。若移除電子郵件地址您將無法重設忘記的密碼並且將不會再收到來自此 wiki 的電子郵件。",
-       "changeemail-none": "(無)",
+       "changeemail-none": "(無)",
        "changeemail-password": "您於 {{SITENAME}} 的密碼:",
        "changeemail-submit": "變更電子郵件",
        "changeemail-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "resettokens-watchlist-token": "用來訂閱 [[Special:Watchlist|監視清單]] Atom/RSS 的密鑰",
        "resettokens-done": "已重設金鑰。",
        "resettokens-resetbutton": "重設已選擇的金鑰",
-       "bold_sample": "粗體文字",
-       "bold_tip": "粗體文字",
-       "italic_sample": "斜體文字",
-       "italic_tip": "斜體文字",
-       "link_sample": "連結標題",
-       "link_tip": "內部連結",
-       "extlink_sample": "http://www.example.com 連結標題",
-       "extlink_tip": "外部連結(記得以 http:// 開頭)",
-       "headline_sample": "標題文字",
-       "headline_tip": "2級標題",
-       "nowiki_sample": "插入非格式化文字",
-       "nowiki_tip": "忽略 Wiki 格式化語法",
-       "image_sample": "範例.jpg",
-       "image_tip": "附加檔案",
-       "media_sample": "範例.ogg",
-       "media_tip": "檔案連結",
-       "sig_tip": "您的簽名與日期時間",
-       "hr_tip": "水平線(謹慎使用)",
        "summary": "摘要:",
        "subject": "主旨:",
        "minoredit": "這是一個次要修訂",
        "undo-main-slot-only": "編輯無法還原,因為有包含到在主分配之外的內容。",
        "undo-norev": "此編輯不存在或已被刪除,無法還原。",
        "undo-nochange": "此編輯已被還原。",
-       "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|討論]]) 所作出的修訂 $1",
+       "undo-summary": "取消由[[Special:Contributions/$2|$2]]([[User talk:$2|討論]])所作出的修訂$1",
+       "undo-summary-anon": "取消由[[Special:Contributions/$2|$2]]所作出的修訂$1",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccount-text": "自這個 IP 位址 (<strong>$1</strong>) 建立帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是$2",
        "cantcreateaccount-range-text": "來自 IP 位址範圍 <strong>$1</strong>,包含您的 IP 位址 (<strong>$4</strong>) 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 <em>$2</em>",
        "datedefault": "預設值",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
-       "prefs-personal": "使用者基本資料",
+       "prefs-personal": "用戶資料",
        "prefs-rc": "近期變更",
        "prefs-watchlist": "監視清單",
        "prefs-editwatchlist": "編輯監視清單",
        "prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
        "email": "Email",
        "prefs-help-realname": "真實姓名為選填欄位。\n若提供,真實姓名可能會用來作為您的作品的署名。",
-       "prefs-help-email": "電子郵件地址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密碼。",
+       "prefs-help-email": "電子郵件地址為選填欄位,但是當您忘記密碼而要重設時需要此資訊。",
        "prefs-help-email-others": "您亦可以選擇讓其他使用者透過您的電子郵件、使用者頁面或討論頁面的連結與您聯絡。\n您的電子郵件地址不會洩漏給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
+       "prefs-help-requireemail": "如果選取,則只有在重設密碼的人同時提供此帳戶的使用者名稱和電子郵件時,才會發送重設密碼的電子郵件。",
        "prefs-info": "基本資訊",
        "prefs-i18n": "國際化",
        "prefs-signature": "簽名",
        "upload-preferred": "建議的檔案類型:$1。",
        "upload-prohibited": "禁止的檔案類型:$1。",
        "uploadlogpage": "上傳日誌",
-       "uploadlogpagetext": "以下清單為最近上傳的檔案。\n請檢視 [[Special:NewFiles|最新檔案圖庫]] 以視覺化的方式檢視。",
+       "uploadlogpagetext": "以下清單為最近上傳的檔案。以視覺化的方式檢視請見[[Special:NewFiles|最新檔案圖庫]]。",
        "filename": "檔案名稱",
        "filedesc": "摘要",
        "fileuploadsummary": "摘要:",
        "listfiles-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
        "imgfile": "檔案",
        "listfiles": "檔案清單",
+       "listfiles_subpage": "由 $1 上傳",
        "listfiles_thumb": "縮圖",
        "listfiles_date": "日期",
        "listfiles_name": "名稱",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
        "listgrouprights-helppage": "Help:使用者群組權限",
-       "listgrouprights-members": "(成員清單)",
+       "listgrouprights-members": "(成員清單)",
        "listgrouprights-addgroup": "加入{{PLURAL:$2|群組}}:$1",
        "listgrouprights-removegroup": "移除{{PLURAL:$2|群組|群組}}:$1",
        "listgrouprights-addgroup-all": "加入所有群組",
        "alreadyrolled": "無法回退由[[User:$2|$2]]([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])所作的最後一次編輯[[:$1]],已有其他人編輯或回退了該頁面。\n\n最後一次編輯該頁面的使用者是[[User:$3|$3]]([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "editcomment": "編輯摘要為:<em>$1</em>。",
        "revertpage": "已還原[[Special:Contributions/$2|$2]]([[User talk:$2|討論]])的編輯至最後由[[User:$1|$1]]所修訂的版本",
+       "revertpage-anon": "已還原[[Special:Contributions/$2|$2]]的編輯至最後由[[User:$1|$1]]所修訂的版本",
        "revertpage-nouser": "已還原隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
-       "rollback-success": "已還原 {{GENDER:$3|$1}} 所做的編輯;\n變更回由 {{GENDER:$4|$2}} 修訂的最後一個版本。",
+       "rollback-success": "已還原{{GENDER:$3|$1}}所做的編輯;變更回由{{GENDER:$4|$2}}修訂的最後一個版本。",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "您的登入連線階段似乎有問題,為了預防連線階段受到劫持攻擊,此動作已經被取消。請重新提交表單。",
        "changecontentmodel": "變更頁面的內容模型",
        "ipblocklist-legend": "搜尋已封鎖的使用者",
        "blocklist-userblocks": "隱藏帳號封鎖",
        "blocklist-tempblocks": "隱藏暫時封鎖",
+       "blocklist-indefblocks": "隱藏無限期封鎖",
        "blocklist-addressblocks": "隱藏單一 IP 封鎖",
        "blocklist-type": "類型:",
        "blocklist-type-opt-all": "所有",
        "move-watch": "監視來源以及目標頁面",
        "movepagebtn": "移動頁面",
        "pagemovedsub": "已成功移動",
-       "cannotmove": "ç\84¡æ³\95移é\99¤é \81é\9d¢ï¼\8cå\87ºæ\96¼ä»¥ä¸\8b{{PLURAL:$1|å\8e\9få\9b |å\8e\9få\9b }}:",
+       "cannotmove": "ç\94±æ\96¼ä»¥ä¸\8b{{PLURAL:$1|å\8e\9få\9b }}ä¸\8dè\83½ç§»å\8b\95é \81é\9d¢:",
        "movepage-moved": "<strong>已移動 \"$1\" 至 \"$2\"</strong>",
        "movepage-moved-redirect": "已建立重新導向頁面。",
        "movepage-moved-noredirect": "已取消建立重新導向頁面。",
        "logentry-import-upload": "$1 已由檔案上傳{{GENDER:$2|匯入}} $3",
        "logentry-import-upload-details": "$1 已使用檔案上傳{{GENDER:$2|匯入}} $3 ($4 {{PLURAL:$4|修訂|修訂}})",
        "logentry-import-interwiki": "$1 已由其他 wiki {{GENDER:$2|匯入}} $3",
-       "logentry-import-interwiki-details": "$1 已自 $5 {{GENDER:$2|匯入}} $3 ($4 {{PLURAL:$4|修訂|修訂}})",
+       "logentry-import-interwiki-details": "$1已自$5{{GENDER:$2|匯入}}$3($4{{PLURAL:$4|修訂|修訂}})",
        "logentry-merge-merge": "$1 將 $3 {{GENDER:$2|合併}}至 $4 (修訂版本至 $5)",
        "logentry-move-move": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4,不留重新導向",
        "mycustomjsredirectprotected": "您無權編輯此JavaScript頁面,因為它是重新導向,且不是重新導向到您的用戶空間。",
        "easydeflate-invaliddeflate": "提供的內容未被正常的壓縮",
        "unprotected-js": "基於安全因素,JavaScript 不能從未保護的頁面來載入。請僅在 MediaWiki:命名空間或使用者子頁面中建立 JavaScript。",
-       "userlogout-continue": "您想要登出嗎?"
+       "userlogout-continue": "您想要登出嗎?",
+       "rest-prefix-mismatch": "請求的路徑($1)不在REST API的根路徑($2)內",
+       "rest-wrong-method": "請求的方法($1)不是{{PLURAL:$3|此路徑允許的方法|此路徑允許的方法之一}}($2)",
+       "rest-no-match": "請求的相對路徑($1)不符合任何已知的處理器"
 }
index 68a0380..2334a83 100644 (file)
@@ -18,7 +18,8 @@
                        "Wxyveronica",
                        "和平至上",
                        "A2093064",
-                       "WQL"
+                       "WQL",
+                       "Sunny00217"
                ]
        },
        "tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
        "revdelete-suppress-text": "壓制'''只'''應用於以下的情況:\n* 不合適的個人資料\n*: ''地址、電話號碼、身份證號碼等。''",
        "editundo": "復原",
        "prefs-user-pages": "用戶頁面",
+       "prefs-personal": "用戶資料",
        "username": "{{GENDER:$1|用戶名稱}}:",
        "prefs-help-gender": "可選:用於軟件中的性別指定。此項資料將會被公開。",
        "group-user": "用戶",
index 1a5daca..0d1579d 100644 (file)
@@ -59,11 +59,6 @@ ALIASES                = "type{1}=<b> \1 </b>:" \
                          "codeCoverageIgnore=" \
                          "codingStandardsIgnoreEnd=" \
                          "codingStandardsIgnoreStart=" \
-                         "covers=" \
-                         "dataProvider=" \
-                         "expectedException=" \
-                         "expectedExceptionMessage=" \
-                         "group=" \
                          "phan=" \
                          "suppress="
 TCL_SUBST              =
@@ -112,8 +107,8 @@ SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
 STRICT_PROTO_MATCHING  = NO
 GENERATE_TODOLIST      = YES
-GENERATE_TESTLIST      = YES
-GENERATE_BUGLIST       = YES
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
 GENERATE_DEPRECATEDLIST= YES
 ENABLED_SECTIONS       =
 MAX_INITIALIZER_LINES  = 30
@@ -148,6 +143,7 @@ EXCLUDE_PATTERNS       = LocalSettings.php \
                          AdminSettings.php \
                          .svn \
                          */.git/* \
+                         */README.md \
                          {{EXCLUDE_PATTERNS}}
 EXCLUDE_SYMBOLS        =
 EXAMPLE_PATH           =
index f89fa62..f741cd2 100644 (file)
@@ -587,7 +587,7 @@ abstract class Maintenance {
                        "server name detection may fail in command line scripts.", false, true );
                $this->addOption( 'profiler', 'Profiler output format (usually "text")', false, true );
                // This is named --mwdebug, because --debug would conflict in the phpunit.php CLI script.
-               $this->addOption( 'mwdebug', 'Enable built-in MediaWiki development settings', false, true );
+               $this->addOption( 'mwdebug', 'Enable built-in MediaWiki development settings', false, false );
 
                # Save generic options to display them separately in help
                $this->mGenericParameters = $this->mParams;
index b63a2e2..c1a1b07 100644 (file)
@@ -52,7 +52,7 @@ class AddChangeTag extends Maintenance {
                );
 
                if ( !$status->isGood() ) {
-                       $this->fatalError( $status->getWikiText( null, null, 'en' ) );
+                       $this->fatalError( $status->getMessage( false, false, 'en' )->text() );
                }
 
                $this->output( "$tag was created.\n" );
diff --git a/maintenance/archives/patch-archive-ar_comment_id.sql b/maintenance/archives/patch-archive-ar_comment_id.sql
new file mode 100644 (file)
index 0000000..cb7b8a7
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE /*_*/archive
+  ALTER COLUMN ar_comment SET DEFAULT '',
+  ADD COLUMN ar_comment_id bigint unsigned NOT NULL DEFAULT 0 AFTER ar_comment;
index c8bf958..bbe7810 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-comment-table.sql
 --
--- T166732. Add a `comment` table and various columns (and temporary tables) to reference it.
+-- T166732. Add a `comment` table.
 
 CREATE TABLE /*_*/comment (
   comment_id bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
@@ -10,50 +10,3 @@ CREATE TABLE /*_*/comment (
   comment_data BLOB
 ) /*$wgDBTableOptions*/;
 CREATE INDEX /*i*/comment_hash ON /*_*/comment (comment_hash);
-
-CREATE TABLE /*_*/revision_comment_temp (
-  revcomment_rev int unsigned NOT NULL,
-  revcomment_comment_id bigint unsigned NOT NULL,
-  PRIMARY KEY (revcomment_rev, revcomment_comment_id)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev);
-
-CREATE TABLE /*_*/image_comment_temp (
-  imgcomment_name varchar(255) binary NOT NULL,
-  imgcomment_description_id bigint unsigned NOT NULL,
-  PRIMARY KEY (imgcomment_name, imgcomment_description_id)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/imgcomment_name ON /*_*/image_comment_temp (imgcomment_name);
-
-ALTER TABLE /*_*/revision
-  ALTER COLUMN rev_comment SET DEFAULT '';
-
-ALTER TABLE /*_*/archive
-  ALTER COLUMN ar_comment SET DEFAULT '',
-  ADD COLUMN ar_comment_id bigint unsigned NOT NULL DEFAULT 0 AFTER ar_comment;
-
-ALTER TABLE /*_*/ipblocks
-  ALTER COLUMN ipb_reason SET DEFAULT '',
-  ADD COLUMN ipb_reason_id bigint unsigned NOT NULL DEFAULT 0 AFTER ipb_reason;
-
-ALTER TABLE /*_*/image
-  ALTER COLUMN img_description SET DEFAULT '';
-
-ALTER TABLE /*_*/oldimage
-  ALTER COLUMN oi_description SET DEFAULT '',
-  ADD COLUMN oi_description_id bigint unsigned NOT NULL DEFAULT 0 AFTER oi_description;
-
-ALTER TABLE /*_*/filearchive
-  ADD COLUMN fa_deleted_reason_id bigint unsigned NOT NULL DEFAULT 0 AFTER fa_deleted_reason,
-  ALTER COLUMN fa_description SET DEFAULT '',
-  ADD COLUMN fa_description_id bigint unsigned NOT NULL DEFAULT 0 AFTER fa_description;
-
-ALTER TABLE /*_*/recentchanges
-  ADD COLUMN rc_comment_id bigint unsigned NOT NULL DEFAULT 0 AFTER rc_comment;
-
-ALTER TABLE /*_*/logging
-  ADD COLUMN log_comment_id bigint unsigned NOT NULL DEFAULT 0 AFTER log_comment;
-
-ALTER TABLE /*_*/protected_titles
-  ALTER COLUMN pt_reason SET DEFAULT '',
-  ADD COLUMN pt_reason_id bigint unsigned NOT NULL DEFAULT 0 AFTER pt_reason;
diff --git a/maintenance/archives/patch-drop-archive-ar_usertext_timestamp.sql b/maintenance/archives/patch-drop-archive-ar_usertext_timestamp.sql
new file mode 100644 (file)
index 0000000..158d9ae
--- /dev/null
@@ -0,0 +1,7 @@
+-- T233221: The index on `archive` variously known as `ar_usertext_timestamp`
+-- and `usertext_timestamp` has a long and sordid history. We're dropping the
+-- `ar_user_text` column entirely now (see patch-drop-user-fields.sql), but
+-- this index needs special care thanks to said history.
+
+-- Do not use the /*i*/ thing here!
+DROP INDEX ar_usertext_timestamp ON /*_*/archive;
diff --git a/maintenance/archives/patch-drop-archive-usertext_timestamp.sql b/maintenance/archives/patch-drop-archive-usertext_timestamp.sql
new file mode 100644 (file)
index 0000000..f409e97
--- /dev/null
@@ -0,0 +1,7 @@
+-- T233221: The index on `archive` variously known as `ar_usertext_timestamp`
+-- and `usertext_timestamp` has a long and sordid history. We're dropping the
+-- `ar_user_text` column entirely now (see patch-drop-user-fields.sql), but
+-- this index needs special care thanks to said history.
+
+-- Do not use the /*i*/ thing here!
+DROP INDEX usertext_timestamp ON /*_*/archive;
index 7faa593..1d0b057 100644 (file)
@@ -4,7 +4,6 @@
 -- T188327. Drop old xx_user and xx_user_text fields, and defaults from xx_actor fields.
 
 ALTER TABLE /*_*/archive
-  DROP INDEX /*i*/ar_usertext_timestamp,
   DROP COLUMN ar_user,
   DROP COLUMN ar_user_text,
   ALTER COLUMN ar_actor DROP DEFAULT;
diff --git a/maintenance/archives/patch-filearchive-fa_description_id.sql b/maintenance/archives/patch-filearchive-fa_description_id.sql
new file mode 100644 (file)
index 0000000..93ddd50
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/filearchive
+  ADD COLUMN fa_deleted_reason_id bigint unsigned NOT NULL DEFAULT 0 AFTER fa_deleted_reason,
+  ALTER COLUMN fa_description SET DEFAULT '',
+  ADD COLUMN fa_description_id bigint unsigned NOT NULL DEFAULT 0 AFTER fa_description;
diff --git a/maintenance/archives/patch-image-img_description-default.sql b/maintenance/archives/patch-image-img_description-default.sql
new file mode 100644 (file)
index 0000000..43d54dc
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/image
+  ALTER COLUMN img_description SET DEFAULT '';
diff --git a/maintenance/archives/patch-image_comment_temp-table.sql b/maintenance/archives/patch-image_comment_temp-table.sql
new file mode 100644 (file)
index 0000000..f873c91
--- /dev/null
@@ -0,0 +1,6 @@
+CREATE TABLE /*_*/image_comment_temp (
+  imgcomment_name varchar(255) binary NOT NULL,
+  imgcomment_description_id bigint unsigned NOT NULL,
+  PRIMARY KEY (imgcomment_name, imgcomment_description_id)
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/imgcomment_name ON /*_*/image_comment_temp (imgcomment_name);
diff --git a/maintenance/archives/patch-ipblocks-ipb_reason_id.sql b/maintenance/archives/patch-ipblocks-ipb_reason_id.sql
new file mode 100644 (file)
index 0000000..8816a7f
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE /*_*/ipblocks
+  ALTER COLUMN ipb_reason SET DEFAULT '',
+  ADD COLUMN ipb_reason_id bigint unsigned NOT NULL DEFAULT 0 AFTER ipb_reason;
diff --git a/maintenance/archives/patch-logging-log_comment_id.sql b/maintenance/archives/patch-logging-log_comment_id.sql
new file mode 100644 (file)
index 0000000..0032900
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/logging
+  ADD COLUMN log_comment_id bigint unsigned NOT NULL DEFAULT 0 AFTER log_comment;
diff --git a/maintenance/archives/patch-oldimage-oi_description_id.sql b/maintenance/archives/patch-oldimage-oi_description_id.sql
new file mode 100644 (file)
index 0000000..be24a80
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE /*_*/oldimage
+  ALTER COLUMN oi_description SET DEFAULT '',
+  ADD COLUMN oi_description_id bigint unsigned NOT NULL DEFAULT 0 AFTER oi_description;
diff --git a/maintenance/archives/patch-protected_titles-pt_reason_id.sql b/maintenance/archives/patch-protected_titles-pt_reason_id.sql
new file mode 100644 (file)
index 0000000..02efd2f
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE /*_*/protected_titles
+  ALTER COLUMN pt_reason SET DEFAULT '',
+  ADD COLUMN pt_reason_id bigint unsigned NOT NULL DEFAULT 0 AFTER pt_reason;
diff --git a/maintenance/archives/patch-recentchanges-rc_comment_id.sql b/maintenance/archives/patch-recentchanges-rc_comment_id.sql
new file mode 100644 (file)
index 0000000..38bff08
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/recentchanges
+  ADD COLUMN rc_comment_id bigint unsigned NOT NULL DEFAULT 0 AFTER rc_comment;
diff --git a/maintenance/archives/patch-rename-mysql-user_newtalk-indexes.sql b/maintenance/archives/patch-rename-mysql-user_newtalk-indexes.sql
new file mode 100644 (file)
index 0000000..3177b4d
--- /dev/null
@@ -0,0 +1,10 @@
+-- T233240: The indexes on `user_newtalk` may be named `un_user_id`/`un_user_ip`
+-- or `user_id`/`user_ip`. At least it won't be both or mixed. Rename them to
+-- the former.
+
+-- Do not use the /*i*/ hack here!
+ALTER TABLE /*_*/user_newtalk
+       DROP INDEX user_id,
+       DROP INDEX user_ip,
+       ADD INDEX un_user_id (user_id),
+       ADD INDEX un_user_ip (user_ip);
diff --git a/maintenance/archives/patch-revision-rev_comment-default.sql b/maintenance/archives/patch-revision-rev_comment-default.sql
new file mode 100644 (file)
index 0000000..2beedcc
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/revision
+  ALTER COLUMN rev_comment SET DEFAULT '';
diff --git a/maintenance/archives/patch-revision_comment_temp-table.sql b/maintenance/archives/patch-revision_comment_temp-table.sql
new file mode 100644 (file)
index 0000000..689e5d5
--- /dev/null
@@ -0,0 +1,6 @@
+CREATE TABLE /*_*/revision_comment_temp (
+  revcomment_rev int unsigned NOT NULL,
+  revcomment_comment_id bigint unsigned NOT NULL,
+  PRIMARY KEY (revcomment_rev, revcomment_comment_id)
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev);
index 6faeee8..98a2b59 100644 (file)
@@ -23,6 +23,8 @@
 
 require __DIR__ . '/../commandLine.inc';
 
+use Wikimedia\Rdbms\Database;
+
 /**
  * Maintenance script that upgrade for log_id/log_deleted fields in a
  * replication-safe way.
index e7df448..aa45154 100644 (file)
@@ -60,7 +60,7 @@ class ChangePassword extends Maintenance {
                if ( $status->isGood() ) {
                        $this->output( "Password set for " . $user->getName() . "\n" );
                } else {
-                       $this->fatalError( $status->getWikiText( null, null, 'en' ) );
+                       $this->fatalError( $status->getMessage( false, false, 'en' )->text() );
                }
        }
 }
index da241e5..2c81adf 100644 (file)
@@ -163,7 +163,7 @@ class CleanupCaps extends TableCleanup {
                        $mp = MediaWikiServices::getInstance()->getMovePageFactory()
                                ->newMovePage( $current, $target );
                        $status = $mp->move( $this->user, $reason, $createRedirect );
-                       $ok = $status->isOK() ? 'OK' : $status->getWikiText( false, false, 'en' );
+                       $ok = $status->isOK() ? 'OK' : $status->getMessage( false, false, 'en' )->text();
                        $this->output( "\"$display\" -> \"$targetDisplay\": $ok\n" );
                }
 
diff --git a/maintenance/cleanupRevActorPage.php b/maintenance/cleanupRevActorPage.php
new file mode 100644 (file)
index 0000000..ac655fc
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script that cleans up cases where rev_page and revactor_page
+ * became desynced, e.g. from T232464.
+ *
+ * @ingroup Maintenance
+ * @since 1.34
+ */
+class CleanupRevActorPage extends LoggedUpdateMaintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription(
+                       'Resyncs revactor_page with rev_page when they differ, e.g. from T232464.'
+               );
+               $this->setBatchSize( 1000 );
+       }
+
+       protected function getUpdateKey() {
+               return __CLASS__;
+       }
+
+       protected function doDBUpdates() {
+               $dbw = $this->getDB( DB_MASTER );
+               $max = $dbw->selectField( 'revision', 'MAX(rev_id)', '', __METHOD__ );
+               $batchSize = $this->mBatchSize;
+
+               $this->output( "Resyncing revactor_page with rev_page...\n" );
+
+               $count = 0;
+               for ( $start = 1; $start <= $max; $start += $batchSize ) {
+                       $end = $start + $batchSize - 1;
+                       $this->output( "... rev_id $start - $end, $count changed\n" );
+
+                       // Fetch the rows needing update
+                       $res = $dbw->select(
+                               [ 'revision', 'revision_actor_temp' ],
+                               [ 'rev_id', 'rev_page' ],
+                               [
+                                       'rev_page != revactor_page',
+                                       "rev_id >= $start",
+                                       "rev_id <= $end",
+                               ],
+                               __METHOD__,
+                               [],
+                               [ 'revision_actor_temp' => [ 'JOIN', 'rev_id = revactor_rev' ] ]
+                       );
+
+                       if ( !$res->numRows() ) {
+                               continue;
+                       }
+
+                       // Update the existing rows
+                       foreach ( $res as $row ) {
+                               $dbw->update(
+                                       'revision_actor_temp',
+                                       [ 'revactor_page' => $row->rev_page ],
+                                       [ 'revactor_rev' => $row->rev_id ],
+                                       __METHOD__
+                               );
+                               $count += $dbw->affectedRows();
+                       }
+
+                       wfWaitForSlaves();
+               }
+
+               $this->output( "Completed resync, $count row(s) updated\n" );
+
+               return true;
+       }
+}
+
+$maintClass = CleanupRevActorPage::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index 4cc52a4..60f3884 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/Maintenance.php';
 
index b78e691..a7a6465 100644 (file)
@@ -87,7 +87,7 @@ class TableCleanup extends Maintenance {
 
                $this->output(
                        sprintf( "%s %s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec <%.2f%% updated>\n",
-                               wfWikiID(),
+                               WikiMap::getCurrentWikiDbDomain()->getId(),
                                wfTimestamp( TS_DB, intval( $now ) ),
                                $portion * 100.0,
                                $this->table,
index ce40638..9e36742 100644 (file)
@@ -260,7 +260,7 @@ class CopyFileBackend extends Maintenance {
                        // Note: prepare() is usually fast for key/value backends
                        $status = $dst->prepare( [ 'dir' => dirname( $dstPath ), 'bypassReadOnly' => 1 ] );
                        if ( !$status->isOK() ) {
-                               $this->error( print_r( Status::wrap( $status )->getWikiText(), true ) );
+                               $this->error( Status::wrap( $status )->getMessage( false, false, 'en' )->text() );
                                $this->fatalError( "$domainId: Could not copy $srcPath to $dstPath." );
                        }
                        $ops[] = [ 'op' => 'store',
@@ -277,7 +277,7 @@ class CopyFileBackend extends Maintenance {
                }
                $elapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( !$status->isOK() ) {
-                       $this->error( print_r( Status::wrap( $status )->getWikiText(), true ) );
+                       $this->error( Status::wrap( $status )->getMessage( false, false, 'en' )->text() );
                        $this->fatalError( "$domainId: Could not copy file batch." );
                } elseif ( count( $copiedRel ) ) {
                        $this->output( "\n\tCopied these file(s) [{$elapsed_ms}ms]:\n\t" .
@@ -314,7 +314,7 @@ class CopyFileBackend extends Maintenance {
                }
                $elapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( !$status->isOK() ) {
-                       $this->error( print_r( Status::wrap( $status )->getWikiText(), true ) );
+                       $this->error( Status::wrap( $status )->getMessage( false, false, 'en' )->text() );
                        $this->fatalError( "$domainId: Could not delete file batch." );
                } elseif ( count( $deletedRel ) ) {
                        $this->output( "\n\tDeleted these file(s) [{$elapsed_ms}ms]:\n\t" .
index 505168e..b92735b 100644 (file)
@@ -121,7 +121,7 @@ class CreateAndPromote extends Maintenance {
                                false
                        );
                        if ( !$status->isGood() ) {
-                               $this->fatalError( $status->getWikiText( null, null, 'en' ) );
+                               $this->fatalError( $status->getMessage( false, false, 'en' )->text() );
                        }
                }
 
@@ -134,7 +134,7 @@ class CreateAndPromote extends Maintenance {
                                        'retype' => $password,
                                ] );
                                if ( !$status->isGood() ) {
-                                       throw new PasswordError( $status->getWikiText( null, null, 'en' ) );
+                                       throw new PasswordError( $status->getMessage( false, false, 'en' )->text() );
                                }
                                if ( $exists ) {
                                        $this->output( "Password set.\n" );
index 3609cf2..825e9ca 100644 (file)
@@ -122,7 +122,7 @@ class EditCLI extends Maintenance {
                        $exit = 1;
                }
                if ( !$status->isGood() ) {
-                       $this->output( $status->getWikiText( false, false, 'en' ) . "\n" );
+                       $this->output( $status->getMessage( false, false, 'en' )->text() . "\n" );
                }
                exit( $exit );
        }
index d4f9c2d..03035f7 100644 (file)
@@ -20,6 +20,7 @@
  *
  * @file
  * @ingroup Maintenance
+ * @phan-file-suppress PhanUndeclaredProperty Lots of custom properties
  */
 
 require_once __DIR__ . '/Maintenance.php';
index ca67c83..3b7ba63 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/Maintenance.php';
 
index d5f94ad..6640148 100644 (file)
@@ -326,7 +326,7 @@ TEXT
                        $statusRootPage = $importer->setTargetRootPage( $this->getOption( 'rootpage' ) );
                        if ( !$statusRootPage->isGood() ) {
                                // Die here so that it doesn't print "Done!"
-                               $this->fatalError( $statusRootPage->getMessage()->text() );
+                               $this->fatalError( $statusRootPage->getMessage( false, false, 'en' )->text() );
                                return false;
                        }
                }
index 954f36d..0c4ff0a 100644 (file)
@@ -326,7 +326,7 @@ class ImportImages extends Maintenance {
                                        $archive = $image->publish( $file, $flags, $publishOptions );
                                        if ( !$archive->isGood() ) {
                                                $this->output( "failed. (" .
-                                                        $archive->getWikiText( false, false, 'en' ) .
+                                                        $archive->getMessage( false, false, 'en' )->text() .
                                                         ")\n" );
                                                $failed++;
                                                continue;
index 28a1746..20254b0 100644 (file)
@@ -118,7 +118,7 @@ class CommandLineInstaller extends Maintenance {
                try {
                        $installer = InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
                } catch ( \MediaWiki\Installer\InstallException $e ) {
-                       $this->output( $e->getStatus()->getMessage()->text() . "\n" );
+                       $this->output( $e->getStatus()->getMessage( false, false, 'en' )->text() . "\n" );
                        return false;
                }
 
@@ -133,6 +133,8 @@ class CommandLineInstaller extends Maintenance {
                if ( !$envChecksOnly ) {
                        $status = $installer->execute();
                        if ( !$status->isGood() ) {
+                               $installer->showStatusMessage( $status );
+
                                return false;
                        }
                        $installer->writeConfigurationFile( $this->getOption( 'confpath', $IP ) );
index 7a5e93e..7576781 100644 (file)
@@ -267,7 +267,7 @@ U+2B127𫄧|U+07D96綖|
 U+2B128𫄨|U+07D7A絺|
 U+2B137𫄷|U+07E76繶|
 U+2B138𫄸|U+07E81纁|
-U+2B1ED𫇭|U+0853F蔿|
+U+2B1ED𫇭|U+0848D蒍|U+0853F蔿|
 U+2B300𫌀|U+08940襀|
 U+2B363𫍣|U+08A77詷|
 U+2B36F𫍯|U+08AF4諴|
index e1016dc..43c7e61 100644 (file)
 聖吉斯納域斯     圣基茨和尼维斯
 聖克里斯多福及尼維斯 圣基茨和尼维斯
 聖文森及格瑞那丁       圣文森特和格林纳丁斯
+聖文森國   圣文森特和格林纳丁斯
 聖馬利諾   圣马力诺
 蓋亞那      圭亚那
 坦尚尼亞   坦桑尼亚
 提比里西   第比利斯
 巴斯拉      巴士拉
 杜拜 迪拜
+喬治亞字母        格鲁吉亚字母
 坚杜拜      坚杜拜
 堅杜拜      坚杜拜
 賽普勒斯   塞浦路斯
@@ -2728,3 +2730,7 @@ A型肝炎        甲型肝炎
 普立茲獎   普利策奖
 富比士      福布斯
 聖多美普林西比  圣多美和普林西比
+札格瑞布   萨格勒布
+溫荷克      温得和克
+普利托利亞        比勒陀利亚
+阿迪斯阿貝巴     亚的斯亚贝巴
\ No newline at end of file
index 915050b..1eaa387 100644 (file)
 镇里 鎮裏
 》里 》裏
 空里 空裏
+牢里 牢裏
 版本里      版本裏
 苑裡 苑裡
 霄裡 霄裡
 軟體動物   軟體動物
 軟體家具   軟體家具
 網路 網絡
+全角 全形
+全角度      全角度
+全角色      全角色
 人工智慧   人工智能
 航天飞机   穿梭機
 太空梭      穿梭機
 圣基茨和尼维斯  聖吉斯納域斯
 聖克里斯多福及尼維斯 聖吉斯納域斯
 聖文森及格瑞那丁       聖文森特和格林納丁斯
+聖文森國   聖文森特和格林納丁斯
 聖馬利諾   聖馬力諾
 蓋亞那      圭亞那
 坦尚尼亞   坦桑尼亞
 西臺人      赫梯人
 阿联酋      阿聯酋
 迪拜 杜拜
-格鲁吉亚   格魯吉亞
+喬治亞字母        格魯吉亞字母
 提比里西   第比利斯
 諾鲁 瑙魯
 玻里尼西亞        波利尼西亞
@@ -3092,3 +3097,7 @@ IP地址  IP位址
 普利策奖   普立茲獎
 聖多美普林西比  聖多美和普林西比
 塔希提      大溪地
+札格瑞布   薩格勒布
+溫荷克      溫得和克
+普利托利亞        比勒陀利亞
+阿迪斯阿貝巴     亞的斯亞貝巴
\ No newline at end of file
index 6329133..45fef1d 100644 (file)
 高陞 高升
 晉陞 晋升
 歷陞 历升
+尋陞 寻升
 官陞 官升
 榮陞 荣升
 又陞 又升
index 6b5ecdd..39fd1f3 100644 (file)
 三極管      三極體
 软件 軟體
 軟件 軟體
+全角 全形
+全角度      全角度
+全角色      全角色
 人工智能   人工智慧
 航天飞机   太空梭
 穿梭機      太空梭
 布隆迪      蒲隆地
 帕劳 帛琉
 意大利      義大利
+意大利面   義大利麵
 所罗门群岛        索羅門群島
 所羅門群島        索羅門群島
 文莱 汶萊
@@ -808,6 +812,7 @@ IP地址    IP位址
 残奥会      帕運會
 殘奧會      帕運會
 残疾人奥林匹克  帕拉林匹克
+殘疾人奧林匹克  帕拉林匹克
 不列颠哥伦比亚省       卑詩省
 登巴萨      丹帕沙
 登巴薩      丹帕沙
@@ -824,6 +829,12 @@ IP地址   IP位址
 格林納丁斯        格瑞那丁
 空中客车   空中巴士
 普利策奖   普立茲獎
-圣多美和普林西比       聖多美普林西比
-聖多美和普林西比       聖多美普林西比
+多美和普林西比  多美普林西比 #聖多美普林西比
 塔希提      大溪地
+萨格勒布   札格瑞布
+薩格勒布   札格瑞布
+温得和克   溫荷克
+溫得和克   溫荷克
+比勒陀利   普利托利 #普利托利亚
+亚的斯亚贝巴     阿迪斯阿貝巴
+亞的斯亞貝巴     阿迪斯阿貝巴
index 78b5a73..8bd2665 100644 (file)
@@ -6,6 +6,7 @@
 ’m   ’m
 ’t   ’t
 ’re  ’re
+𬞟   蘋
 手塚治虫   手塚治虫
 寇仇 寇讎
 往日无仇   往日無讎
@@ -78,6 +79,7 @@
 乾象曆      乾象曆
 乾象历      乾象曆
 不好干預   不好干預
+可能干預   可能干預
 范文瀾      范文瀾
 機械系      機械系
 頂多 頂多
@@ -97,6 +99,7 @@
 于帥 于帥
 于濤 于濤
 于贈 于贈
+于闐 于闐
 于會泳      于會泳
 于偉國      于偉國
 于光遠      于光遠
 于學忠      于學忠
 于小偉      于小偉
 于山國      于山國
+于山島      于山島
 于幼軍      于幼軍
 于廣洲      于廣洲
 于從濂      于從濂
 更钟情      更鍾情
 更钟爱      更鍾愛
 更钟意      更鍾意
+温嵐 温嵐
index 74064bb..5c30eb8 100644 (file)
@@ -586,6 +586,7 @@ U+08432萲|U+08431萱|
 U+08457著|U+08457著|U+07740着|
 U+08460葠|U+053C2参|
 U+0846F葯|U+0836F药|
+U+0848D蒍|U+2B1ED𫇭|
 U+08493蒓|U+083BC莼|
 U+084C6蓆|U+05E2D席|
 U+084E1蓡|U+053C2参|
index 2cf35ba..522ae31 100644 (file)
 併為一家
 併吞
 並吞下
+入侵並 #分詞用
 提摩太後書
 裏海
 不採
 捲葉蛾
 捲尾猴
 捲積雲
+被捲回
 夸父
 夸克
 夸特
 伊府麵
 藥麵兒
 意大利麵
+意大利面臨
 湯下麵
 茶麵
 麵團
 鹹豬
 甜鹹
 鹹甜
+鹹吃
 甜、鹹
 鹹、甜
 錦綉花園
 幹仗
 包幹
 幹過
+大幹一
 李連杰
 周杰
 杰倫
 不占算
 不好干涉
 不好干預
+可能干預
 不斗膽
 不每只
 不采聲
 詞裡
 》裡
 空裡
+牢裡
 版本裡
 裏白 #植物常用名
 烏蘇里 #分詞用
 于衡
 于贈
 于越
+於越南
 于靖
 于勒
 于格
+於格林
 鳳凰于飛
 于仁泰
 于會泳
 于小偉
 于小彤
 于山國
+于山島
 于幼軍
 于廣洲
 于康震
 關系科
 銹病
 嚐糞
+温嵐
index 5dd9432..9fc5513 100755 (executable)
@@ -67,7 +67,13 @@ class GeneratePhpCharToUpperMappings extends Maintenance {
                        $phpUpper = $wgContLang->ucfirst( $char );
                        $jsUpper = $jsUpperChars[$i];
                        if ( $jsUpper !== $phpUpper ) {
-                               $data[$char] = $phpUpper;
+                               if ( $char === $phpUpper ) {
+                                       // Optimisation: Use the empty string to signal "leave character unchanged".
+                                       // Reduces the transfer size by ~50%. Reduces browser memory cost as well.
+                                       $data[$char] = '';
+                               } else {
+                                       $data[$char] = $phpUpper;
+                               }
                        }
                }
 
@@ -76,6 +82,9 @@ class GeneratePhpCharToUpperMappings extends Maintenance {
                ) . "\n";
                $outputPath = '/resources/src/mediawiki.Title/phpCharToUpper.json';
                $file = fopen( $IP . $outputPath, 'w' );
+               if ( !$file ) {
+                       $this->fatalError( "Unable to write file \"$IP$outputPath\"" );
+               }
                fwrite( $file, $mappingJson );
 
                $this->output( count( $data ) . " differences found.\n" );
index 2271c39..7bbf3d0 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -57,6 +59,10 @@ class MigrateArchiveText extends LoggedUpdateMaintenance {
        protected function doDBUpdates() {
                $replaceMissing = $this->hasOption( 'replace-missing' );
                $defaultExternalStore = $this->getConfig()->get( 'DefaultExternalStore' );
+               // @phan-suppress-next-line PhanAccessMethodInternal
+               $blobStore = MediaWikiServices::getInstance()
+                       ->getBlobStoreFactory()
+                       ->newSqlBlobStore();
                $batchSize = $this->getBatchSize();
 
                $dbr = $this->getDB( DB_REPLICA, [ 'vslow' ] );
@@ -90,8 +96,9 @@ class MigrateArchiveText extends LoggedUpdateMaintenance {
 
                                // Recompress the text (and store in external storage, if
                                // applicable) if it's not already in external storage.
-                               if ( !in_array( 'external', explode( ',', $row->ar_flags ), true ) ) {
-                                       $data = Revision::getRevisionText( $row, 'ar_' );
+                               $arFlags = explode( ',', $row->ar_flags );
+                               if ( !in_array( 'external', $arFlags, true ) ) {
+                                       $data = $blobStore->decompressData( $row->ar_text, $arFlags );
                                        if ( $data !== false ) {
                                                $flags = Revision::compressRevisionText( $data );
 
index 09f3120..b54ed45 100644 (file)
@@ -111,7 +111,7 @@ class MoveBatch extends Maintenance {
                                ->newMovePage( $source, $dest );
                        $status = $mp->move( $wgUser, $reason, !$noredirects );
                        if ( !$status->isOK() ) {
-                               $this->output( "\nFAILED: " . $status->getWikiText( false, false, 'en' ) );
+                               $this->output( "\nFAILED: " . $status->getMessage( false, false, 'en' )->text() );
                        }
                        $this->commitTransaction( $dbw, __METHOD__ );
                        $this->output( "\n" );
index f600f13..6b22097 100644 (file)
@@ -83,8 +83,10 @@ class MWDocGen extends Maintenance {
                $this->addOption( 'output',
                        'Path to write doc to',
                        false, true );
-               $this->addOption( 'no-extensions',
-                       'Ignore extensions' );
+               $this->addOption( 'extensions',
+                       'Process the extensions/ directory as well (ignored if --file is used)' );
+               $this->addOption( 'skins',
+                       'Process the skins/ directory as well (ignored if --file is used)' );
        }
 
        public function getDbType() {
@@ -115,15 +117,23 @@ class MWDocGen extends Maintenance {
 
                $this->template = $IP . '/maintenance/Doxyfile';
                $this->excludes = [
-                       'vendor',
-                       'node_modules',
-                       'resources/lib',
                        'images',
+                       'node_modules',
+                       'resources',
                        'static',
+                       'tests',
+                       'vendor',
                ];
                $this->excludePatterns = [];
-               if ( $this->hasOption( 'no-extensions' ) ) {
-                       $this->excludePatterns[] = 'extensions';
+               if ( $this->input === '' ) {
+                       // If no explicit --file filter is set, we're indexing all of $IP,
+                       // but any extension or skin submodules should be excluded by default.
+                       if ( !$this->hasOption( 'extensions' ) ) {
+                               $this->excludePatterns[] = 'extensions';
+                       }
+                       if ( !$this->hasOption( 'skins' ) ) {
+                               $this->excludePatterns[] = 'skins';
+                       }
                }
 
                $this->doDot = shell_exec( 'which dot' );
index e48b6ab..1e73540 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
index 243a3b3..4b91815 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- patch-comment-table.sql
 --
--- T166732. Add a `comment` table, and temporary tables to reference it.
+-- T166732. Add a `comment` table
 
 CREATE SEQUENCE comment_comment_id_seq;
 CREATE TABLE comment (
@@ -11,17 +11,3 @@ CREATE TABLE comment (
        comment_data TEXT
 );
 CREATE INDEX comment_hash ON comment (comment_hash);
-
-CREATE TABLE revision_comment_temp (
-       revcomment_rev        INTEGER NOT NULL,
-       revcomment_comment_id INTEGER NOT NULL,
-       PRIMARY KEY (revcomment_rev, revcomment_comment_id)
-);
-CREATE UNIQUE INDEX revcomment_rev ON revision_comment_temp (revcomment_rev);
-
-CREATE TABLE image_comment_temp (
-       imgcomment_name       TEXT NOT NULL,
-       imgcomment_description_id INTEGER NOT NULL,
-       PRIMARY KEY (imgcomment_name, imgcomment_description_id)
-);
-CREATE UNIQUE INDEX imgcomment_name ON image_comment_temp (imgcomment_name);
diff --git a/maintenance/postgres/archives/patch-image_comment_temp-table.sql b/maintenance/postgres/archives/patch-image_comment_temp-table.sql
new file mode 100644 (file)
index 0000000..be7bb82
--- /dev/null
@@ -0,0 +1,6 @@
+CREATE TABLE image_comment_temp (
+       imgcomment_name       TEXT NOT NULL,
+       imgcomment_description_id INTEGER NOT NULL,
+       PRIMARY KEY (imgcomment_name, imgcomment_description_id)
+);
+CREATE UNIQUE INDEX imgcomment_name ON image_comment_temp (imgcomment_name);
diff --git a/maintenance/postgres/archives/patch-revision_comment_temp-table.sql b/maintenance/postgres/archives/patch-revision_comment_temp-table.sql
new file mode 100644 (file)
index 0000000..cbfaa06
--- /dev/null
@@ -0,0 +1,6 @@
+CREATE TABLE revision_comment_temp (
+       revcomment_rev        INTEGER NOT NULL,
+       revcomment_comment_id INTEGER NOT NULL,
+       PRIMARY KEY (revcomment_rev, revcomment_comment_id)
+);
+CREATE UNIQUE INDEX revcomment_rev ON revision_comment_temp (revcomment_rev);
index fddac8a..ec759da 100644 (file)
@@ -26,7 +26,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/dumpIterator.php';
 
index d558c47..540d275 100644 (file)
@@ -65,9 +65,14 @@ class PurgeList extends Maintenance {
                        } elseif ( $page !== '' ) {
                                $title = Title::newFromText( $page );
                                if ( $title ) {
-                                       $url = $title->getInternalURL();
-                                       $this->output( "$url\n" );
-                                       $urls[] = $url;
+                                       $newUrls = $title->getCdnUrls();
+
+                                       foreach ( $newUrls as $url ) {
+                                               $this->output( "$url\n" );
+                                       }
+
+                                       $urls = array_merge( $urls, $newUrls );
+
                                        if ( $this->getOption( 'purge' ) ) {
                                                $title->invalidateCache();
                                        }
@@ -110,8 +115,7 @@ class PurgeList extends Maintenance {
                        $urls = [];
                        foreach ( $res as $row ) {
                                $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $url = $title->getInternalURL();
-                               $urls[] = $url;
+                               $urls = array_merge( $urls, $title->getCdnUrls() );
                                $startId = $row->page_id;
                        }
                        $this->sendPurgeRequest( $urls );
index db8a19a..264ba57 100644 (file)
@@ -143,6 +143,10 @@ class RefreshFileHeaders extends Maintenance {
                $this->output( "Done. Updated headers for $count file(s).\n" );
        }
 
+       /**
+        * @param LocalRepo $repo
+        * @param array $backendOperations
+        */
        protected function updateFileHeaders( $repo, $backendOperations ) {
                $status = $repo->getBackend()->doQuickOperations( $backendOperations );
 
index 3f48abb..c1170fc 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
diff --git a/maintenance/sqlite/archives/patch-archive-ar_comment_id.sql b/maintenance/sqlite/archives/patch-archive-ar_comment_id.sql
new file mode 100644 (file)
index 0000000..d06b81c
--- /dev/null
@@ -0,0 +1,46 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/archive_tmp;
+CREATE TABLE /*_*/archive_tmp (
+  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  ar_namespace int NOT NULL default 0,
+  ar_title varchar(255) binary NOT NULL default '',
+  ar_text mediumblob NOT NULL,
+  ar_comment varbinary(767) NOT NULL default '',
+  ar_comment_id bigint unsigned NOT NULL DEFAULT 0,
+  ar_user int unsigned NOT NULL default 0,
+  ar_user_text varchar(255) binary NOT NULL,
+  ar_timestamp binary(14) NOT NULL default '',
+  ar_minor_edit tinyint NOT NULL default 0,
+  ar_flags tinyblob NOT NULL,
+  ar_rev_id int unsigned,
+  ar_text_id int unsigned,
+  ar_deleted tinyint unsigned NOT NULL default 0,
+  ar_len int unsigned,
+  ar_page_id int unsigned,
+  ar_parent_id int unsigned default NULL,
+  ar_sha1 varbinary(32) NOT NULL default '',
+  ar_content_model varbinary(32) DEFAULT NULL,
+  ar_content_format varbinary(64) DEFAULT NULL
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/archive_tmp (
+       ar_id, ar_namespace, ar_title, ar_text, ar_comment, ar_user, ar_user_text,
+       ar_timestamp, ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted,
+       ar_len, ar_page_id, ar_parent_id, ar_sha1, ar_content_model,
+       ar_content_format)
+  SELECT
+       ar_id, ar_namespace, ar_title, ar_text, ar_comment, ar_user, ar_user_text,
+       ar_timestamp, ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted,
+       ar_len, ar_page_id, ar_parent_id, ar_sha1, ar_content_model,
+       ar_content_format
+  FROM /*_*/archive;
+
+DROP TABLE /*_*/archive;
+ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
+CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
+CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
+CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
+
+COMMIT;
+
diff --git a/maintenance/sqlite/archives/patch-comment-table.sql b/maintenance/sqlite/archives/patch-comment-table.sql
deleted file mode 100644 (file)
index d74c3a6..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
---
--- patch-comment-table.sql
---
--- T166732. Add a `comment` table and various columns (and temporary tables) to reference it.
--- Sigh, sqlite, such trouble just to change the default value of a column.
-
-CREATE TABLE /*_*/comment (
-  comment_id bigint unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  comment_hash INT NOT NULL,
-  comment_text BLOB NOT NULL,
-  comment_data BLOB
-) /*$wgDBTableOptions*/;
-CREATE INDEX /*i*/comment_hash ON /*_*/comment (comment_hash);
-
-CREATE TABLE /*_*/revision_comment_temp (
-  revcomment_rev int unsigned NOT NULL,
-  revcomment_comment_id bigint unsigned NOT NULL,
-  PRIMARY KEY (revcomment_rev, revcomment_comment_id)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/revcomment_rev ON /*_*/revision_comment_temp (revcomment_rev);
-
-CREATE TABLE /*_*/image_comment_temp (
-  imgcomment_name varchar(255) binary NOT NULL,
-  imgcomment_description_id bigint unsigned NOT NULL,
-  PRIMARY KEY (imgcomment_name, imgcomment_description_id)
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/imgcomment_name ON /*_*/image_comment_temp (imgcomment_name);
-
-ALTER TABLE /*_*/recentchanges
-  ADD COLUMN rc_comment_id bigint unsigned NOT NULL DEFAULT 0;
-
-ALTER TABLE /*_*/logging
-  ADD COLUMN log_comment_id bigint unsigned NOT NULL DEFAULT 0;
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/revision_tmp;
-CREATE TABLE /*_*/revision_tmp (
-  rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  rev_page int unsigned NOT NULL,
-  rev_text_id int unsigned NOT NULL,
-  rev_comment varbinary(767) NOT NULL default '',
-  rev_user int unsigned NOT NULL default 0,
-  rev_user_text varchar(255) binary NOT NULL default '',
-  rev_timestamp binary(14) NOT NULL default '',
-  rev_minor_edit tinyint unsigned NOT NULL default 0,
-  rev_deleted tinyint unsigned NOT NULL default 0,
-  rev_len int unsigned,
-  rev_parent_id int unsigned default NULL,
-  rev_sha1 varbinary(32) NOT NULL default '',
-  rev_content_model varbinary(32) DEFAULT NULL,
-  rev_content_format varbinary(64) DEFAULT NULL
-) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
-
-INSERT OR IGNORE INTO /*_*/revision_tmp (
-       rev_id, rev_page, rev_text_id, rev_comment, rev_user, rev_user_text,
-       rev_timestamp, rev_minor_edit, rev_deleted, rev_len, rev_parent_id,
-       rev_sha1, rev_content_model, rev_content_format)
- SELECT
-       rev_id, rev_page, rev_text_id, rev_comment, rev_user, rev_user_text,
-       rev_timestamp, rev_minor_edit, rev_deleted, rev_len, rev_parent_id,
-       rev_sha1, rev_content_model, rev_content_format
-  FROM /*_*/revision;
-
-DROP TABLE /*_*/revision;
-ALTER TABLE /*_*/revision_tmp RENAME TO /*_*/revision;
-CREATE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
-CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
-CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
-CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
-CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
-CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/archive_tmp;
-CREATE TABLE /*_*/archive_tmp (
-  ar_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  ar_namespace int NOT NULL default 0,
-  ar_title varchar(255) binary NOT NULL default '',
-  ar_text mediumblob NOT NULL,
-  ar_comment varbinary(767) NOT NULL default '',
-  ar_comment_id bigint unsigned NOT NULL DEFAULT 0,
-  ar_user int unsigned NOT NULL default 0,
-  ar_user_text varchar(255) binary NOT NULL,
-  ar_timestamp binary(14) NOT NULL default '',
-  ar_minor_edit tinyint NOT NULL default 0,
-  ar_flags tinyblob NOT NULL,
-  ar_rev_id int unsigned,
-  ar_text_id int unsigned,
-  ar_deleted tinyint unsigned NOT NULL default 0,
-  ar_len int unsigned,
-  ar_page_id int unsigned,
-  ar_parent_id int unsigned default NULL,
-  ar_sha1 varbinary(32) NOT NULL default '',
-  ar_content_model varbinary(32) DEFAULT NULL,
-  ar_content_format varbinary(64) DEFAULT NULL
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/archive_tmp (
-       ar_id, ar_namespace, ar_title, ar_text, ar_comment, ar_user, ar_user_text,
-       ar_timestamp, ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted,
-       ar_len, ar_page_id, ar_parent_id, ar_sha1, ar_content_model,
-       ar_content_format)
-  SELECT
-       ar_id, ar_namespace, ar_title, ar_text, ar_comment, ar_user, ar_user_text,
-       ar_timestamp, ar_minor_edit, ar_flags, ar_rev_id, ar_text_id, ar_deleted,
-       ar_len, ar_page_id, ar_parent_id, ar_sha1, ar_content_model,
-       ar_content_format
-  FROM /*_*/archive;
-
-DROP TABLE /*_*/archive;
-ALTER TABLE /*_*/archive_tmp RENAME TO /*_*/archive;
-CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
-CREATE INDEX /*i*/ar_usertext_timestamp ON /*_*/archive (ar_user_text,ar_timestamp);
-CREATE INDEX /*i*/ar_revid ON /*_*/archive (ar_rev_id);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS ipblocks_tmp;
-CREATE TABLE /*_*/ipblocks_tmp (
-  ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  ipb_address tinyblob NOT NULL,
-  ipb_user int unsigned NOT NULL default 0,
-  ipb_by int unsigned NOT NULL default 0,
-  ipb_by_text varchar(255) binary NOT NULL default '',
-  ipb_reason varbinary(767) NOT NULL default '',
-  ipb_reason_id bigint unsigned NOT NULL DEFAULT 0,
-  ipb_timestamp binary(14) NOT NULL default '',
-  ipb_auto bool NOT NULL default 0,
-  ipb_anon_only bool NOT NULL default 0,
-  ipb_create_account bool NOT NULL default 1,
-  ipb_enable_autoblock bool NOT NULL default '1',
-  ipb_expiry varbinary(14) NOT NULL default '',
-  ipb_range_start tinyblob NOT NULL,
-  ipb_range_end tinyblob NOT NULL,
-  ipb_deleted bool NOT NULL default 0,
-  ipb_block_email bool NOT NULL default 0,
-  ipb_allow_usertalk bool NOT NULL default 0,
-  ipb_parent_block_id int default NULL
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/ipblocks_tmp (
-       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
-       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
-       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
-       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id)
-  SELECT
-       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
-       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
-       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
-       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id
-  FROM /*_*/ipblocks;
-
-DROP TABLE /*_*/ipblocks;
-ALTER TABLE /*_*/ipblocks_tmp RENAME TO /*_*/ipblocks;
-CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
-CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
-CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
-CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
-CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
-CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/image_tmp;
-CREATE TABLE /*_*/image_tmp (
-  img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
-  img_size int unsigned NOT NULL default 0,
-  img_width int NOT NULL default 0,
-  img_height int NOT NULL default 0,
-  img_metadata mediumblob NOT NULL,
-  img_bits int NOT NULL default 0,
-  img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
-  img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
-  img_minor_mime varbinary(100) NOT NULL default "unknown",
-  img_description varbinary(767) NOT NULL default '',
-  img_user int unsigned NOT NULL default 0,
-  img_user_text varchar(255) binary NOT NULL,
-  img_timestamp varbinary(14) NOT NULL default '',
-  img_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/image_tmp (
-       img_name, img_size, img_width, img_height, img_metadata, img_bits,
-       img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
-       img_user_text, img_timestamp, img_sha1)
-  SELECT
-       img_name, img_size, img_width, img_height, img_metadata, img_bits,
-       img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
-       img_user_text, img_timestamp, img_sha1
-  FROM /*_*/image;
-
-DROP TABLE /*_*/image;
-ALTER TABLE /*_*/image_tmp RENAME TO /*_*/image;
-CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
-CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
-CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
-CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
-CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
-
-COMMIT;
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/oldimage_tmp;
-CREATE TABLE /*_*/oldimage_tmp (
-  oi_name varchar(255) binary NOT NULL default '',
-  oi_archive_name varchar(255) binary NOT NULL default '',
-  oi_size int unsigned NOT NULL default 0,
-  oi_width int NOT NULL default 0,
-  oi_height int NOT NULL default 0,
-  oi_bits int NOT NULL default 0,
-  oi_description varbinary(767) NOT NULL default '',
-  oi_description_id bigint unsigned NOT NULL DEFAULT 0,
-  oi_user int unsigned NOT NULL default 0,
-  oi_user_text varchar(255) binary NOT NULL,
-  oi_timestamp binary(14) NOT NULL default '',
-  oi_metadata mediumblob NOT NULL,
-  oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
-  oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
-  oi_minor_mime varbinary(100) NOT NULL default "unknown",
-  oi_deleted tinyint unsigned NOT NULL default 0,
-  oi_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/oldimage_tmp (
-       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
-       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
-       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1)
-  SELECT
-       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
-       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
-       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1
-  FROM /*_*/oldimage;
-
-DROP TABLE /*_*/oldimage;
-ALTER TABLE /*_*/oldimage_tmp RENAME TO /*_*/oldimage;
-CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
-CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
-CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
-
-COMMIT;
-
--- filearchive is done in patch-filearchive-fa_description_id.sql
-
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/protected_titles_tmp;
-CREATE TABLE /*_*/protected_titles_tmp (
-  pt_namespace int NOT NULL,
-  pt_title varchar(255) binary NOT NULL,
-  pt_user int unsigned NOT NULL,
-  pt_reason varbinary(767) default '',
-  pt_reason_id bigint unsigned NOT NULL DEFAULT 0,
-  pt_timestamp binary(14) NOT NULL,
-  pt_expiry varbinary(14) NOT NULL default '',
-  pt_create_perm varbinary(60) NOT NULL
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/protected_titles_tmp (
-       pt_namespace, pt_title, pt_user, pt_reason, pt_timestamp, pt_expiry, pt_create_perm)
-  SELECT
-       pt_namespace, pt_title, pt_user, pt_reason, pt_timestamp, pt_expiry, pt_create_perm
-  FROM /*_*/protected_titles;
-
-DROP TABLE /*_*/protected_titles;
-ALTER TABLE /*_*/protected_titles_tmp RENAME TO /*_*/protected_titles;
-CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
-CREATE INDEX /*i*/pt_timestamp ON /*_*/protected_titles (pt_timestamp);
-
-COMMIT;
diff --git a/maintenance/sqlite/archives/patch-image-img_description-default.sql b/maintenance/sqlite/archives/patch-image-img_description-default.sql
new file mode 100644 (file)
index 0000000..b810ed5
--- /dev/null
@@ -0,0 +1,40 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/image_tmp;
+CREATE TABLE /*_*/image_tmp (
+  img_name varchar(255) binary NOT NULL default '' PRIMARY KEY,
+  img_size int unsigned NOT NULL default 0,
+  img_width int NOT NULL default 0,
+  img_height int NOT NULL default 0,
+  img_metadata mediumblob NOT NULL,
+  img_bits int NOT NULL default 0,
+  img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
+  img_minor_mime varbinary(100) NOT NULL default "unknown",
+  img_description varbinary(767) NOT NULL default '',
+  img_user int unsigned NOT NULL default 0,
+  img_user_text varchar(255) binary NOT NULL,
+  img_timestamp varbinary(14) NOT NULL default '',
+  img_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/image_tmp (
+       img_name, img_size, img_width, img_height, img_metadata, img_bits,
+       img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
+       img_user_text, img_timestamp, img_sha1)
+  SELECT
+       img_name, img_size, img_width, img_height, img_metadata, img_bits,
+       img_media_type, img_major_mime, img_minor_mime, img_description, img_user,
+       img_user_text, img_timestamp, img_sha1
+  FROM /*_*/image;
+
+DROP TABLE /*_*/image;
+ALTER TABLE /*_*/image_tmp RENAME TO /*_*/image;
+CREATE INDEX /*i*/img_user_timestamp ON /*_*/image (img_user,img_timestamp);
+CREATE INDEX /*i*/img_usertext_timestamp ON /*_*/image (img_user_text,img_timestamp);
+CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
+CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
+CREATE INDEX /*i*/img_media_mime ON /*_*/image (img_media_type,img_major_mime,img_minor_mime);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-ipblocks-ipb_reason_id.sql b/maintenance/sqlite/archives/patch-ipblocks-ipb_reason_id.sql
new file mode 100644 (file)
index 0000000..b1079fc
--- /dev/null
@@ -0,0 +1,47 @@
+BEGIN;
+
+DROP TABLE IF EXISTS ipblocks_tmp;
+CREATE TABLE /*_*/ipblocks_tmp (
+  ipb_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  ipb_address tinyblob NOT NULL,
+  ipb_user int unsigned NOT NULL default 0,
+  ipb_by int unsigned NOT NULL default 0,
+  ipb_by_text varchar(255) binary NOT NULL default '',
+  ipb_reason varbinary(767) NOT NULL default '',
+  ipb_reason_id bigint unsigned NOT NULL DEFAULT 0,
+  ipb_timestamp binary(14) NOT NULL default '',
+  ipb_auto bool NOT NULL default 0,
+  ipb_anon_only bool NOT NULL default 0,
+  ipb_create_account bool NOT NULL default 1,
+  ipb_enable_autoblock bool NOT NULL default '1',
+  ipb_expiry varbinary(14) NOT NULL default '',
+  ipb_range_start tinyblob NOT NULL,
+  ipb_range_end tinyblob NOT NULL,
+  ipb_deleted bool NOT NULL default 0,
+  ipb_block_email bool NOT NULL default 0,
+  ipb_allow_usertalk bool NOT NULL default 0,
+  ipb_parent_block_id int default NULL
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/ipblocks_tmp (
+       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
+       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
+       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
+       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id)
+  SELECT
+       ipb_id, ipb_address, ipb_user, ipb_by, ipb_by_text, ipb_reason,
+       ipb_timestamp, ipb_auto, ipb_anon_only, ipb_create_account,
+       ipb_enable_autoblock, ipb_expiry, ipb_range_start, ipb_range_end,
+       ipb_deleted, ipb_block_email, ipb_allow_usertalk, ipb_parent_block_id
+  FROM /*_*/ipblocks;
+
+DROP TABLE /*_*/ipblocks;
+ALTER TABLE /*_*/ipblocks_tmp RENAME TO /*_*/ipblocks;
+CREATE UNIQUE INDEX /*i*/ipb_address ON /*_*/ipblocks (ipb_address(255), ipb_user, ipb_auto, ipb_anon_only);
+CREATE INDEX /*i*/ipb_user ON /*_*/ipblocks (ipb_user);
+CREATE INDEX /*i*/ipb_range ON /*_*/ipblocks (ipb_range_start(8), ipb_range_end(8));
+CREATE INDEX /*i*/ipb_timestamp ON /*_*/ipblocks (ipb_timestamp);
+CREATE INDEX /*i*/ipb_expiry ON /*_*/ipblocks (ipb_expiry);
+CREATE INDEX /*i*/ipb_parent_block_id ON /*_*/ipblocks (ipb_parent_block_id);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-logging-log_comment_id.sql b/maintenance/sqlite/archives/patch-logging-log_comment_id.sql
new file mode 100644 (file)
index 0000000..784a88d
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/logging
+  ADD COLUMN log_comment_id bigint unsigned NOT NULL DEFAULT 0;
diff --git a/maintenance/sqlite/archives/patch-oldimage-oi_description_id.sql b/maintenance/sqlite/archives/patch-oldimage-oi_description_id.sql
new file mode 100644 (file)
index 0000000..c0191a7
--- /dev/null
@@ -0,0 +1,41 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/oldimage_tmp;
+CREATE TABLE /*_*/oldimage_tmp (
+  oi_name varchar(255) binary NOT NULL default '',
+  oi_archive_name varchar(255) binary NOT NULL default '',
+  oi_size int unsigned NOT NULL default 0,
+  oi_width int NOT NULL default 0,
+  oi_height int NOT NULL default 0,
+  oi_bits int NOT NULL default 0,
+  oi_description varbinary(767) NOT NULL default '',
+  oi_description_id bigint unsigned NOT NULL DEFAULT 0,
+  oi_user int unsigned NOT NULL default 0,
+  oi_user_text varchar(255) binary NOT NULL,
+  oi_timestamp binary(14) NOT NULL default '',
+  oi_metadata mediumblob NOT NULL,
+  oi_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  oi_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") NOT NULL default "unknown",
+  oi_minor_mime varbinary(100) NOT NULL default "unknown",
+  oi_deleted tinyint unsigned NOT NULL default 0,
+  oi_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/oldimage_tmp (
+       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
+       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
+       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1)
+  SELECT
+       oi_name, oi_archive_name, oi_size, oi_width, oi_height, oi_bits,
+       oi_description, oi_user, oi_user_text, oi_timestamp, oi_metadata,
+       oi_media_type, oi_major_mime, oi_minor_mime, oi_deleted, oi_sha1
+  FROM /*_*/oldimage;
+
+DROP TABLE /*_*/oldimage;
+ALTER TABLE /*_*/oldimage_tmp RENAME TO /*_*/oldimage;
+CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timestamp);
+CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
+CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
+CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-protected_titles-pt_reason_id.sql b/maintenance/sqlite/archives/patch-protected_titles-pt_reason_id.sql
new file mode 100644 (file)
index 0000000..793144c
--- /dev/null
@@ -0,0 +1,26 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/protected_titles_tmp;
+CREATE TABLE /*_*/protected_titles_tmp (
+  pt_namespace int NOT NULL,
+  pt_title varchar(255) binary NOT NULL,
+  pt_user int unsigned NOT NULL,
+  pt_reason varbinary(767) default '',
+  pt_reason_id bigint unsigned NOT NULL DEFAULT 0,
+  pt_timestamp binary(14) NOT NULL,
+  pt_expiry varbinary(14) NOT NULL default '',
+  pt_create_perm varbinary(60) NOT NULL
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/protected_titles_tmp (
+       pt_namespace, pt_title, pt_user, pt_reason, pt_timestamp, pt_expiry, pt_create_perm)
+  SELECT
+       pt_namespace, pt_title, pt_user, pt_reason, pt_timestamp, pt_expiry, pt_create_perm
+  FROM /*_*/protected_titles;
+
+DROP TABLE /*_*/protected_titles;
+ALTER TABLE /*_*/protected_titles_tmp RENAME TO /*_*/protected_titles;
+CREATE UNIQUE INDEX /*i*/pt_namespace_title ON /*_*/protected_titles (pt_namespace,pt_title);
+CREATE INDEX /*i*/pt_timestamp ON /*_*/protected_titles (pt_timestamp);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-recentchanges-rc_comment_id.sql b/maintenance/sqlite/archives/patch-recentchanges-rc_comment_id.sql
new file mode 100644 (file)
index 0000000..55bf9b5
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*_*/recentchanges
+  ADD COLUMN rc_comment_id bigint unsigned NOT NULL DEFAULT 0;
diff --git a/maintenance/sqlite/archives/patch-revision-rev_comment-default.sql b/maintenance/sqlite/archives/patch-revision-rev_comment-default.sql
new file mode 100644 (file)
index 0000000..0194079
--- /dev/null
@@ -0,0 +1,40 @@
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/revision_tmp;
+CREATE TABLE /*_*/revision_tmp (
+  rev_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  rev_page int unsigned NOT NULL,
+  rev_text_id int unsigned NOT NULL,
+  rev_comment varbinary(767) NOT NULL default '',
+  rev_user int unsigned NOT NULL default 0,
+  rev_user_text varchar(255) binary NOT NULL default '',
+  rev_timestamp binary(14) NOT NULL default '',
+  rev_minor_edit tinyint unsigned NOT NULL default 0,
+  rev_deleted tinyint unsigned NOT NULL default 0,
+  rev_len int unsigned,
+  rev_parent_id int unsigned default NULL,
+  rev_sha1 varbinary(32) NOT NULL default '',
+  rev_content_model varbinary(32) DEFAULT NULL,
+  rev_content_format varbinary(64) DEFAULT NULL
+) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
+
+INSERT OR IGNORE INTO /*_*/revision_tmp (
+       rev_id, rev_page, rev_text_id, rev_comment, rev_user, rev_user_text,
+       rev_timestamp, rev_minor_edit, rev_deleted, rev_len, rev_parent_id,
+       rev_sha1, rev_content_model, rev_content_format)
+ SELECT
+       rev_id, rev_page, rev_text_id, rev_comment, rev_user, rev_user_text,
+       rev_timestamp, rev_minor_edit, rev_deleted, rev_len, rev_parent_id,
+       rev_sha1, rev_content_model, rev_content_format
+  FROM /*_*/revision;
+
+DROP TABLE /*_*/revision;
+ALTER TABLE /*_*/revision_tmp RENAME TO /*_*/revision;
+CREATE INDEX /*i*/rev_page_id ON /*_*/revision (rev_page, rev_id);
+CREATE INDEX /*i*/rev_timestamp ON /*_*/revision (rev_timestamp);
+CREATE INDEX /*i*/page_timestamp ON /*_*/revision (rev_page,rev_timestamp);
+CREATE INDEX /*i*/user_timestamp ON /*_*/revision (rev_user,rev_timestamp);
+CREATE INDEX /*i*/usertext_timestamp ON /*_*/revision (rev_user_text,rev_timestamp);
+CREATE INDEX /*i*/page_user_timestamp ON /*_*/revision (rev_page,rev_user,rev_timestamp);
+
+COMMIT;
index 979e68a..e3c6c02 100644 (file)
@@ -1,6 +1,6 @@
 -- Blobs table for external storage
 
-CREATE TABLE /*$wgDBprefix*/blobs (
+CREATE TABLE IF NOT EXISTS /*$wgDBprefix*/blobs (
        blob_id integer UNSIGNED NOT NULL AUTO_INCREMENT,
        blob_text longblob,
        PRIMARY KEY  (blob_id)
index 060f327..3741959 100644 (file)
@@ -232,7 +232,7 @@ class CheckStorage {
                                }
                                foreach ( $externalConcatBlobs as $cluster => $xBlobIds ) {
                                        $blobIds = array_keys( $xBlobIds );
-                                       $extDb =& $this->dbStore->getSlave( $cluster );
+                                       $extDb =& $this->dbStore->getReplica( $cluster );
                                        $blobsTable = $this->dbStore->getTable( $extDb );
                                        $res = $extDb->select( $blobsTable,
                                                [ 'blob_id' ],
@@ -433,7 +433,7 @@ class CheckStorage {
 
                foreach ( $externalConcatBlobs as $cluster => $oldIds ) {
                        $blobIds = array_keys( $oldIds );
-                       $extDb =& $this->dbStore->getSlave( $cluster );
+                       $extDb =& $this->dbStore->getReplica( $cluster );
                        $blobsTable = $this->dbStore->getTable( $extDb );
                        $headerLength = strlen( self::CONCAT_HEADER );
                        $res = $extDb->select( $blobsTable,
@@ -556,10 +556,27 @@ class CheckStorage {
 
                // Find text row again
                $dbr = wfGetDB( DB_REPLICA );
-               $oldId = $dbr->selectField( 'revision', 'rev_text_id', [ 'rev_id' => $id ], __METHOD__ );
+               global $wgMultiContentRevisionSchemaMigrationStage;
+               if ( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_READ_OLD ) {
+                       $oldId = $dbr->selectField( 'revision', 'rev_text_id', [ 'rev_id' => $id ], __METHOD__ );
+               } else {
+                       $res = $dbr->selectRow(
+                               [ 'slots', 'content' ],
+                               [ 'content_address' ],
+                               [ 'slot_revision_id' => $id ],
+                               __METHOD__,
+                               [],
+                               [ 'content' => [ 'INNER JOIN', [ 'content_id = slot_content_id' ] ] ]
+                       );
+                       // @phan-suppress-next-line PhanAccessMethodInternal
+                       $blobStore = MediaWikiServices::getInstance()
+                               ->getBlobStoreFactory()
+                               ->newSqlBlobStore();
+                       $oldId = $blobStore->getTextIdFromAddress( $res->content_address );
+               }
+
                if ( !$oldId ) {
                        echo "Missing revision row for rev_id $id\n";
-
                        return;
                }
 
index b6aa626..c4779b9 100644 (file)
@@ -239,6 +239,10 @@ class CompressOld extends Maintenance {
                        /** @var ExternalStoreDB $storeObj */
                        $storeObj = $esFactory->getStore( 'DB' );
                }
+               // @phan-suppress-next-line PhanAccessMethodInternal
+               $blobStore = MediaWikiServices::getInstance()
+                       ->getBlobStoreFactory()
+                       ->newSqlBlobStore();
 
                # Get all articles by page_id
                if ( !$maxPageId ) {
@@ -370,8 +374,12 @@ class CompressOld extends Maintenance {
                                for ( $j = 0; $j < $thisChunkSize && $chunk->isHappy(); $j++ ) {
                                        $oldid = $revs[$i + $j]->old_id;
 
-                                       # Get text
-                                       $text = Revision::getRevisionText( $revs[$i + $j] );
+                                       # Get text. We do not need the full `extractBlob` since the query is built
+                                       # to fetch non-externalstore blobs.
+                                       $text = $blobStore->decompressData(
+                                               $revs[$i + $j]->old_text,
+                                               explode( ',', $revs[$i + $j]->old_flags )
+                                       );
 
                                        if ( $text === false ) {
                                                $this->error( "\nError, unable to get text in old_id $oldid" );
diff --git a/maintenance/storage/fixT22757.php b/maintenance/storage/fixT22757.php
deleted file mode 100644 (file)
index 61f1177..0000000
+++ /dev/null
@@ -1,335 +0,0 @@
-<?php
-/**
- * Script to fix T22757.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance ExternalStorage
- */
-
-require_once __DIR__ . '/../Maintenance.php';
-
-/**
- * Maintenance script to fix T22757.
- *
- * @ingroup Maintenance ExternalStorage
- */
-class FixT22757 extends Maintenance {
-       public $batchSize = 10000;
-       public $mapCache = [];
-       public $mapCacheSize = 0;
-       public $maxMapCacheSize = 1000000;
-
-       function __construct() {
-               parent::__construct();
-               $this->addDescription( 'Script to fix T22757 assuming that blob_tracking is intact' );
-               $this->addOption( 'dry-run', 'Report only' );
-               $this->addOption( 'start', 'old_id to start at', false, true );
-       }
-
-       function execute() {
-               $dbr = $this->getDB( DB_REPLICA );
-               $dbw = $this->getDB( DB_MASTER );
-
-               $dryRun = $this->getOption( 'dry-run' );
-               if ( $dryRun ) {
-                       print "Dry run only.\n";
-               }
-
-               $startId = $this->getOption( 'start', 0 );
-               $numGood = 0;
-               $numFixed = 0;
-               $numBad = 0;
-
-               $totalRevs = $dbr->selectField( 'text', 'MAX(old_id)', '', __METHOD__ );
-
-               // In MySQL 4.1+, the binary field old_text has a non-working LOWER() function
-               $lowerLeft = 'LOWER(CONVERT(LEFT(old_text,22) USING latin1))';
-
-               while ( true ) {
-                       print "ID: $startId / $totalRevs\r";
-
-                       $res = $dbr->select(
-                               'text',
-                               [ 'old_id', 'old_flags', 'old_text' ],
-                               [
-                                       'old_id > ' . intval( $startId ),
-                                       'old_flags LIKE \'%object%\' AND old_flags NOT LIKE \'%external%\'',
-                                       "$lowerLeft = 'o:15:\"historyblobstub\"'",
-                               ],
-                               __METHOD__,
-                               [
-                                       'ORDER BY' => 'old_id',
-                                       'LIMIT' => $this->batchSize,
-                               ]
-                       );
-
-                       if ( !$res->numRows() ) {
-                               break;
-                       }
-
-                       $secondaryIds = [];
-                       $stubs = [];
-
-                       foreach ( $res as $row ) {
-                               $startId = $row->old_id;
-
-                               // Basic sanity checks
-                               $obj = unserialize( $row->old_text );
-                               if ( $obj === false ) {
-                                       print "{$row->old_id}: unrecoverable: cannot unserialize\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( !is_object( $obj ) ) {
-                                       print "{$row->old_id}: unrecoverable: unserialized to type " .
-                                               gettype( $obj ) . ", possible double-serialization\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               if ( strtolower( get_class( $obj ) ) !== 'historyblobstub' ) {
-                                       print "{$row->old_id}: unrecoverable: unexpected object class " .
-                                               get_class( $obj ) . "\n";
-                                       ++$numBad;
-                                       continue;
-                               }
-
-                               // Process flags
-                               $flags = explode( ',', $row->old_flags );
-                               if ( in_array( 'utf-8', $flags ) || in_array( 'utf8', $flags ) ) {
-                                       $legacyEncoding = false;
-                               } else {
-                                       $legacyEncoding = true;
-                               }
-
-                               // Queue the stub for future batch processing
-                               $id = intval( $obj->mOldId );
-                               $secondaryIds[] = $id;
-                               $stubs[$row->old_id] = [
-                                       'legacyEncoding' => $legacyEncoding,
-                                       'secondaryId' => $id,
-                                       'hash' => $obj->mHash,
-                               ];
-                       }
-
-                       $secondaryIds = array_unique( $secondaryIds );
-
-                       if ( !count( $secondaryIds ) ) {
-                               continue;
-                       }
-
-                       // Run the batch query on blob_tracking
-                       $res = $dbr->select(
-                               'blob_tracking',
-                               '*',
-                               [
-                                       'bt_text_id' => $secondaryIds,
-                               ],
-                               __METHOD__
-                       );
-                       $trackedBlobs = [];
-                       foreach ( $res as $row ) {
-                               $trackedBlobs[$row->bt_text_id] = $row;
-                       }
-
-                       // Process the stubs
-                       foreach ( $stubs as $primaryId => $stub ) {
-                               $secondaryId = $stub['secondaryId'];
-                               if ( !isset( $trackedBlobs[$secondaryId] ) ) {
-                                       // No tracked blob. Work out what went wrong
-                                       $secondaryRow = $dbr->selectRow(
-                                               'text',
-                                               [ 'old_flags', 'old_text' ],
-                                               [ 'old_id' => $secondaryId ],
-                                               __METHOD__
-                                       );
-                                       if ( !$secondaryRow ) {
-                                               print "$primaryId: unrecoverable: secondary row is missing\n";
-                                               ++$numBad;
-                                       } elseif ( $this->isUnbrokenStub( $stub, $secondaryRow ) ) {
-                                               // Not broken yet, and not in the tracked clusters so it won't get
-                                               // broken by the current RCT run.
-                                               ++$numGood;
-                                       } elseif ( strpos( $secondaryRow->old_flags, 'external' ) !== false ) {
-                                               print "$primaryId: unrecoverable: secondary gone to {$secondaryRow->old_text}\n";
-                                               ++$numBad;
-                                       } else {
-                                               print "$primaryId: unrecoverable: miscellaneous corruption of secondary row\n";
-                                               ++$numBad;
-                                       }
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               $trackRow = $trackedBlobs[$secondaryId];
-
-                               // Check that the specified text really is available in the tracked source row
-                               $url = "DB://{$trackRow->bt_cluster}/{$trackRow->bt_blob_id}/{$stub['hash']}";
-                               $text = ExternalStore::fetchFromURL( $url );
-                               if ( $text === false ) {
-                                       print "$primaryId: unrecoverable: source text missing\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-                               if ( md5( $text ) !== $stub['hash'] ) {
-                                       print "$primaryId: unrecoverable: content hashes do not match\n";
-                                       ++$numBad;
-                                       unset( $stubs[$primaryId] );
-                                       continue;
-                               }
-
-                               // Find the page_id and rev_id
-                               // The page is probably the same as the page of the secondary row
-                               $pageId = intval( $trackRow->bt_page );
-                               if ( !$pageId ) {
-                                       $revId = $pageId = 0;
-                               } else {
-                                       $revId = $this->findTextIdInPage( $pageId, $primaryId );
-                                       if ( !$revId ) {
-                                               // Actually an orphan
-                                               $pageId = $revId = 0;
-                                       }
-                               }
-
-                               $newFlags = $stub['legacyEncoding'] ? 'external' : 'external,utf-8';
-
-                               if ( !$dryRun ) {
-                                       // Reset the text row to point to the original copy
-                                       $this->beginTransaction( $dbw, __METHOD__ );
-                                       $dbw->update(
-                                               'text',
-                                               // SET
-                                               [
-                                                       'old_flags' => $newFlags,
-                                                       'old_text' => $url
-                                               ],
-                                               // WHERE
-                                               [ 'old_id' => $primaryId ],
-                                               __METHOD__
-                                       );
-
-                                       // Add a blob_tracking row so that the new reference can be recompressed
-                                       // without needing to run trackBlobs.php again
-                                       $dbw->insert( 'blob_tracking',
-                                               [
-                                                       'bt_page' => $pageId,
-                                                       'bt_rev_id' => $revId,
-                                                       'bt_text_id' => $primaryId,
-                                                       'bt_cluster' => $trackRow->bt_cluster,
-                                                       'bt_blob_id' => $trackRow->bt_blob_id,
-                                                       'bt_cgz_hash' => $stub['hash'],
-                                                       'bt_new_url' => null,
-                                                       'bt_moved' => 0,
-                                               ],
-                                               __METHOD__
-                                       );
-                                       $this->commitTransaction( $dbw, __METHOD__ );
-                               }
-
-                               print "$primaryId: resolved to $url\n";
-                               ++$numFixed;
-                       }
-               }
-
-               print "\n";
-               print "Fixed: $numFixed\n";
-               print "Unrecoverable: $numBad\n";
-               print "Good stubs: $numGood\n";
-       }
-
-       function findTextIdInPage( $pageId, $textId ) {
-               $ids = $this->getRevTextMap( $pageId );
-               return $ids[$textId] ?? null;
-       }
-
-       function getRevTextMap( $pageId ) {
-               if ( !isset( $this->mapCache[$pageId] ) ) {
-                       // Limit cache size
-                       while ( $this->mapCacheSize > $this->maxMapCacheSize ) {
-                               $key = key( $this->mapCache );
-                               $this->mapCacheSize -= count( $this->mapCache[$key] );
-                               unset( $this->mapCache[$key] );
-                       }
-
-                       $dbr = $this->getDB( DB_REPLICA );
-                       $map = [];
-                       $res = $dbr->select( 'revision',
-                               [ 'rev_id', 'rev_text_id' ],
-                               [ 'rev_page' => $pageId ],
-                               __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               $map[$row->rev_text_id] = $row->rev_id;
-                       }
-                       $this->mapCache[$pageId] = $map;
-                       $this->mapCacheSize += count( $map );
-               }
-
-               return $this->mapCache[$pageId];
-       }
-
-       /**
-        * This is based on part of HistoryBlobStub::getText().
-        * Determine if the text can be retrieved from the row in the normal way.
-        * @param array $stub
-        * @param stdClass $secondaryRow
-        * @return bool
-        */
-       function isUnbrokenStub( $stub, $secondaryRow ) {
-               $flags = explode( ',', $secondaryRow->old_flags );
-               $text = $secondaryRow->old_text;
-               if ( in_array( 'external', $flags ) ) {
-                       $url = $text;
-                       Wikimedia\suppressWarnings();
-                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
-                       Wikimedia\restoreWarnings();
-
-                       if ( $path == "" ) {
-                               return false;
-                       }
-                       $text = ExternalStore::fetchFromURL( $url );
-               }
-               if ( !in_array( 'object', $flags ) ) {
-                       return false;
-               }
-
-               if ( in_array( 'gzip', $flags ) ) {
-                       $obj = unserialize( gzinflate( $text ) );
-               } else {
-                       $obj = unserialize( $text );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       // Correct for old double-serialization bug.
-                       $obj = unserialize( $obj );
-               }
-
-               if ( !is_object( $obj ) ) {
-                       return false;
-               }
-
-               $obj->uncompress();
-               $text = $obj->getItem( $stub['hash'] );
-
-               return $text !== false;
-       }
-}
-
-$maintClass = FixT22757::class;
-require_once RUN_MAINTENANCE_IF_MAIN;
index 9f20e67..0068046 100644 (file)
@@ -22,6 +22,7 @@
  * @ingroup Maintenance ExternalStorage
  */
 
+use MediaWiki\Storage\SqlBlobStore;
 use Wikimedia\Rdbms\IMaintainableDatabase;
 use MediaWiki\Logger\LegacyLogger;
 use MediaWiki\MediaWikiServices;
@@ -63,18 +64,20 @@ class RecompressTracked {
        public $numProcs = 1;
        public $numBatches = 0;
        public $pageBlobClass, $orphanBlobClass;
-       public $replicaPipes, $replicaProcs, $prevReplicaId;
+       public $childPipes, $childProcs, $prevChildId;
        public $copyOnly = false;
        public $isChild = false;
-       public $replicaId = false;
+       public $childId = false;
        public $noCount = false;
        public $debugLog, $infoLog, $criticalLog;
        /** @var ExternalStoreDB */
        public $store;
+       /** @var SqlBlobStore */
+       private $blobStore;
 
        private static $optionsWithArgs = [
                'procs',
-               'replica-id',
+               'child-id',
                'debug-log',
                'info-log',
                'critical-log'
@@ -85,7 +88,7 @@ class RecompressTracked {
                'procs' => 'numProcs',
                'copy-only' => 'copyOnly',
                'child' => 'isChild',
-               'replica-id' => 'replicaId',
+               'child-id' => 'childId',
                'debug-log' => 'debugLog',
                'info-log' => 'infoLog',
                'critical-log' => 'criticalLog',
@@ -114,12 +117,16 @@ class RecompressTracked {
                $this->store = $esFactory->getStore( 'DB' );
                if ( !$this->isChild ) {
                        $GLOBALS['wgDebugLogPrefix'] = "RCT M: ";
-               } elseif ( $this->replicaId !== false ) {
-                       $GLOBALS['wgDebugLogPrefix'] = "RCT {$this->replicaId}: ";
+               } elseif ( $this->childId !== false ) {
+                       $GLOBALS['wgDebugLogPrefix'] = "RCT {$this->childId}: ";
                }
                $this->pageBlobClass = function_exists( 'xdiff_string_bdiff' ) ?
                        DiffHistoryBlob::class : ConcatenatedGzipHistoryBlob::class;
                $this->orphanBlobClass = ConcatenatedGzipHistoryBlob::class;
+               // @phan-suppress-next-line PhanAccessMethodInternal
+               $this->blobStore = MediaWikiServices::getInstance()
+                       ->getBlobStoreFactory()
+                       ->newSqlBlobStore();
        }
 
        function debug( $msg ) {
@@ -145,8 +152,8 @@ class RecompressTracked {
 
        function logToFile( $msg, $file ) {
                $header = '[' . date( 'd\TH:i:s' ) . '] ' . wfHostname() . ' ' . posix_getpid();
-               if ( $this->replicaId !== false ) {
-                       $header .= "({$this->replicaId})";
+               if ( $this->childId !== false ) {
+                       $header .= "({$this->childId})";
                }
                $header .= ' ' . WikiMap::getCurrentWikiDbDomain()->getId();
                LegacyLogger::emit( sprintf( "%-50s %s\n", $header, $msg ), $file );
@@ -184,10 +191,10 @@ class RecompressTracked {
                }
 
                $this->syncDBs();
-               $this->startReplicaProcs();
+               $this->startChildProcs();
                $this->doAllPages();
                $this->doAllOrphans();
-               $this->killReplicaProcs();
+               $this->killChildProcs();
        }
 
        /**
@@ -217,12 +224,12 @@ class RecompressTracked {
         * This necessary because text recompression is slow: loading, compressing and
         * writing are all slow.
         */
-       function startReplicaProcs() {
+       function startChildProcs() {
                $wiki = WikiMap::getWikiIdFromDbDomain( WikiMap::getCurrentWikiDbDomain() );
 
                $cmd = 'php ' . Shell::escape( __FILE__ );
                foreach ( self::$cmdLineOptionMap as $cmdOption => $classOption ) {
-                       if ( $cmdOption == 'replica-id' ) {
+                       if ( $cmdOption == 'child-id' ) {
                                continue;
                        } elseif ( in_array( $cmdOption, self::$optionsWithArgs ) && isset( $this->$classOption ) ) {
                                $cmd .= " --$cmdOption " . Shell::escape( $this->$classOption );
@@ -234,7 +241,7 @@ class RecompressTracked {
                        ' --wiki ' . Shell::escape( $wiki ) .
                        ' ' . Shell::escape( ...$this->destClusters );
 
-               $this->replicaPipes = $this->replicaProcs = [];
+               $this->childPipes = $this->childProcs = [];
                for ( $i = 0; $i < $this->numProcs; $i++ ) {
                        $pipes = [];
                        $spec = [
@@ -243,28 +250,28 @@ class RecompressTracked {
                                [ 'file', 'php://stderr', 'w' ]
                        ];
                        Wikimedia\suppressWarnings();
-                       $proc = proc_open( "$cmd --replica-id $i", $spec, $pipes );
+                       $proc = proc_open( "$cmd --child-id $i", $spec, $pipes );
                        Wikimedia\restoreWarnings();
                        if ( !$proc ) {
-                               $this->critical( "Error opening replica DB process: $cmd" );
+                               $this->critical( "Error opening child process: $cmd" );
                                exit( 1 );
                        }
-                       $this->replicaProcs[$i] = $proc;
-                       $this->replicaPipes[$i] = $pipes[0];
+                       $this->childProcs[$i] = $proc;
+                       $this->childPipes[$i] = $pipes[0];
                }
-               $this->prevReplicaId = -1;
+               $this->prevChildId = -1;
        }
 
        /**
         * Gracefully terminate the child processes
         */
-       function killReplicaProcs() {
-               $this->info( "Waiting for replica DB processes to finish..." );
+       function killChildProcs() {
+               $this->info( "Waiting for child processes to finish..." );
                for ( $i = 0; $i < $this->numProcs; $i++ ) {
-                       $this->dispatchToReplica( $i, 'quit' );
+                       $this->dispatchToChild( $i, 'quit' );
                }
                for ( $i = 0; $i < $this->numProcs; $i++ ) {
-                       $status = proc_close( $this->replicaProcs[$i] );
+                       $status = proc_close( $this->childProcs[$i] );
                        if ( $status ) {
                                $this->critical( "Warning: child #$i exited with status $status" );
                        }
@@ -273,24 +280,24 @@ class RecompressTracked {
        }
 
        /**
-        * Dispatch a command to the next available replica DB.
-        * This may block until a replica DB finishes its work and becomes available.
+        * Dispatch a command to the next available child process.
+        * This may block until a child process finishes its work and becomes available.
         * @param array|string ...$args
         */
        function dispatch( ...$args ) {
-               $pipes = $this->replicaPipes;
+               $pipes = $this->childPipes;
                $x = [];
                $y = [];
                $numPipes = stream_select( $x, $pipes, $y, 3600 );
                if ( !$numPipes ) {
-                       $this->critical( "Error waiting to write to replica DBs. Aborting" );
+                       $this->critical( "Error waiting to write to child process. Aborting" );
                        exit( 1 );
                }
                for ( $i = 0; $i < $this->numProcs; $i++ ) {
-                       $replicaId = ( $i + $this->prevReplicaId + 1 ) % $this->numProcs;
-                       if ( isset( $pipes[$replicaId] ) ) {
-                               $this->prevReplicaId = $replicaId;
-                               $this->dispatchToReplica( $replicaId, $args );
+                       $childId = ( $i + $this->prevChildId + 1 ) % $this->numProcs;
+                       if ( isset( $pipes[$childId] ) ) {
+                               $this->prevChildId = $childId;
+                               $this->dispatchToChild( $childId, $args );
 
                                return;
                        }
@@ -300,14 +307,14 @@ class RecompressTracked {
        }
 
        /**
-        * Dispatch a command to a specified replica DB
-        * @param int $replicaId
+        * Dispatch a command to a specified child process
+        * @param int $childId
         * @param array|string $args
         */
-       function dispatchToReplica( $replicaId, $args ) {
+       function dispatchToChild( $childId, $args ) {
                $args = (array)$args;
                $cmd = implode( ' ', $args );
-               fwrite( $this->replicaPipes[$replicaId], "$cmd\n" );
+               fwrite( $this->childPipes[$childId], "$cmd\n" );
        }
 
        /**
@@ -531,7 +538,7 @@ class RecompressTracked {
                                }
                                $lastTextId = $row->bt_text_id;
                                // Load the text
-                               $text = Revision::getRevisionText( $row );
+                               $text = $this->blobStore->expandBlob( $row->old_text, $row->old_flags );
                                if ( $text === false ) {
                                        $this->critical( "Error loading {$row->bt_rev_id}/{$row->bt_text_id}" );
                                        continue;
@@ -685,7 +692,7 @@ class RecompressTracked {
                );
 
                foreach ( $res as $row ) {
-                       $text = Revision::getRevisionText( $row );
+                       $text = $this->blobStore->expandBlob( $row->old_text, $row->old_flags );
                        if ( $text === false ) {
                                $this->critical( "Error: cannot load revision text for old_id={$row->old_id}" );
                                continue;
index 5d756e8..7e57f67 100644 (file)
@@ -42,12 +42,13 @@ class UpdateSpecialPages extends Maintenance {
        }
 
        public function execute() {
-               global $wgQueryCacheLimit, $wgDisableQueryPageUpdate;
+               global $wgQueryCacheLimit;
 
                $dbw = $this->getDB( DB_MASTER );
 
                $this->doSpecialPageCacheUpdates( $dbw );
 
+               $disabledQueryPages = QueryPage::getDisabledQueryPages( $this->getConfig() );
                foreach ( QueryPage::getPages() as $page ) {
                        list( , $special ) = $page;
                        $limit = $page[2] ?? null;
@@ -59,7 +60,7 @@ class UpdateSpecialPages extends Maintenance {
                        }
 
                        if ( !$this->hasOption( 'override' )
-                               && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate )
+                               && isset( $disabledQueryPages[$special] )
                        ) {
                                $this->output( sprintf( "%-30s [QueryPage] disabled\n", $special ) );
                                continue;
index 038ef23..cbe5d27 100644 (file)
@@ -36,7 +36,7 @@ use Wikimedia\Rdbms\IMaintainableDatabase;
  */
 class UserDupes {
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        private $db;
        private $reassigned;
@@ -110,8 +110,9 @@ class UserDupes {
         * @return bool
         */
        private function checkDupes( $doDelete = false ) {
+               $dbDomain = WikiMap::getCurrentWikiDbDomain()->getId();
                if ( $this->hasUniqueIndex() ) {
-                       echo wfWikiID() . " already has a unique index on its user table.\n";
+                       echo "$dbDomain already has a unique index on its user table.\n";
 
                        return true;
                }
@@ -122,7 +123,7 @@ class UserDupes {
                $dupes = $this->getDupes();
                $count = count( $dupes );
 
-               $this->out( "Found $count accounts with duplicate records on " . wfWikiID() . ".\n" );
+               $this->out( "Found $count accounts with duplicate records on $dbDomain.\n" );
                $this->trimmed = 0;
                $this->reassigned = 0;
                $this->failed = 0;
@@ -145,11 +146,13 @@ class UserDupes {
 
                if ( $this->trimmed > 0 ) {
                        if ( $doDelete ) {
-                               $this->out( "$this->trimmed duplicate user records were deleted from "
-                                       . wfWikiID() . ".\n" );
+                               $this->out(
+                                       "$this->trimmed duplicate user records were deleted from $dbDomain.\n" );
                        } else {
-                               $this->out( "$this->trimmed duplicate user accounts were found on "
-                                       . wfWikiID() . " which can be removed safely.\n" );
+                               $this->out(
+                                       "$this->trimmed duplicate user accounts were found on $dbDomain " .
+                                       "which can be removed safely.\n"
+                               );
                        }
                }
 
index 98f1c24..2f8941f 100644 (file)
@@ -110,11 +110,10 @@ The new option is NOT validated.' );
                                        $ret[$option][$userValue] = ( $ret[$option][$userValue] ?? 0 ) + 1;
                                }
                        } else {
-
                                foreach ( $defaultOptions as $name => $defaultValue ) {
                                        $userValue = $user->getOption( $name );
                                        if ( $userValue != $defaultValue ) {
-                                               $ret[$option][$userValue] = ( $ret[$option][$userValue] ?? 0 ) + 1;
+                                               $ret[$name][$userValue] = ( $ret[$name][$userValue] ?? 0 ) + 1;
                                        }
                                }
                        }
index 6084c84..72fe286 100644 (file)
        color: #008000;
 }
 
-.success-box {
-       font-size: 130%;
-}
-
 .config-cc-wrapper {
        clear: left;
        /* If you change this height, also change it in WebInstallerOptions::submitCC() */
index 1388128..0b0e485 100644 (file)
@@ -155,17 +155,6 @@ return [
 
        /* jQuery Plugins */
 
-       'jquery.accessKeyLabel' => [
-               'deprecated' => 'Please use "mediawiki.util" instead.',
-               'dependencies' => [
-                       'mediawiki.util',
-               ],
-               'targets' => [ 'mobile', 'desktop' ],
-       ],
-       'jquery.checkboxShiftClick' => [
-               'scripts' => 'resources/src/jquery/jquery.checkboxShiftClick.js',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.chosen' => [
                'scripts' => 'resources/lib/jquery.chosen/chosen.jquery.js',
                'styles' => 'resources/lib/jquery.chosen/chosen.css',
@@ -175,11 +164,10 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.color' => [
-               'scripts' => 'resources/src/jquery/jquery.color.js',
-               'dependencies' => 'jquery.colorUtil',
-       ],
-       'jquery.colorUtil' => [
-               'scripts' => 'resources/src/jquery/jquery.colorUtil.js',
+               'scripts' => [
+                       'resources/src/jquery.color/jquery.colorUtil.js',
+                       'resources/src/jquery.color/jquery.color.js',
+               ],
        ],
        'jquery.confirmable' => [
                'scripts' => [
@@ -895,6 +883,7 @@ return [
                'dependencies' => [
                        'mediawiki.api',
                        'oojs',
+                       'mediawiki.Uri',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -940,6 +929,9 @@ return [
                'scripts' => [
                        'resources/src/mediawiki.htmlform.checker.js',
                ],
+               'dependencies' => [
+                       'mediawiki.util',
+               ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.ooui' => [
@@ -1252,8 +1244,8 @@ return [
                ]
        ],
        'mediawiki.util' => [
-               'localBasePath' => "$IP/resources/src/mediawiki.util/",
-               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.util/",
+               'localBasePath' => "$IP/resources/src/mediawiki.util",
+               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.util",
                'packageFiles' => [
                        'util.js',
                        'jquery.accessKeyLabel.js',
@@ -1660,9 +1652,13 @@ return [
                ]
        ],
        'mediawiki.page.ready' => [
-               'scripts' => 'resources/src/mediawiki.page.ready.js',
+               'localBasePath' => "$IP/resources/src/mediawiki.page.ready",
+               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.page.ready",
+               'packageFiles' => [
+                       'ready.js',
+                       'checkboxShift.js',
+               ],
                'dependencies' => [
-                       'jquery.checkboxShiftClick',
                        'mediawiki.util',
                        'mediawiki.notify',
                        'mediawiki.api'
@@ -1987,6 +1983,7 @@ return [
                        'resources/src/mediawiki.special/special.less',
                        'resources/src/mediawiki.special/apisandbox.css',
                        'resources/src/mediawiki.special/comparepages.less',
+                       'resources/src/mediawiki.special/contributions.less',
                        'resources/src/mediawiki.special/edittags.css',
                        'resources/src/mediawiki.special/movePage.css',
                        'resources/src/mediawiki.special/newpages.less',
@@ -1995,6 +1992,7 @@ return [
                        'resources/src/mediawiki.special/userrights.css',
                        'resources/src/mediawiki.special/watchlist.css',
                        'resources/src/mediawiki.special/block.less',
+                       'resources/src/mediawiki.special/listFiles.less',
                        'resources/src/mediawiki.special/blocklist.less',
                ],
                'targets' => [ 'desktop', 'mobile' ],
@@ -2149,9 +2147,12 @@ return [
        'mediawiki.special.contributions' => [
                'scripts' => 'resources/src/mediawiki.special.contributions.js',
                'dependencies' => [
+                       'jquery.makeCollapsible',
+                       'oojs-ui',
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
-               ]
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.special.edittags' => [
                'scripts' => 'resources/src/mediawiki.special.edittags.js',
@@ -2198,6 +2199,9 @@ return [
                'styles' => 'resources/src/mediawiki.special.preferences.styles.ooui.less',
        ],
        'mediawiki.special.recentchanges' => [
+               'dependencies' => [
+                       'mediawiki.widgets'
+               ],
                'scripts' => 'resources/src/mediawiki.special.recentchanges.js',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -2313,7 +2317,6 @@ return [
                'dependencies' => [
                        'mediawiki.api',
                        'mediawiki.jqueryMsg',
-                       'jquery.throttle-debounce',
                        'mediawiki.htmlform.checker',
                ],
        ],
index 9ab1b49..5db52a4 100644 (file)
@@ -253,8 +253,8 @@ oojs-router:
 
 ooui:
   type: tar
-  src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.34.0.tgz
-  integrity: sha384-DVG3XayKF02r0rqXSJUEWJImcK8XJeiIVC/Ii5R20cINYpTaAs+x4rdCU52VaKKw
+  src: https://registry.npmjs.org/oojs-ui/-/oojs-ui-0.34.1.tgz
+  integrity: sha384-QXYp5vK60xpu4nkv/JStszI6U4TYGCNe7uXb5rYb7FYURLTR41mtNO74gl7HXgpz
 
   dest:
     # Main stuff
index 9408e9b..501b768 100644 (file)
@@ -1,4 +1,16 @@
 # OOUI Release History
+## v0.34.1 / 2019-09-10
+### Deprecating changes
+* [DEPRECATING CHANGE] icons: Rename 'beaker' to 'labFlask' (Volker E.)
+
+### Styles
+* icons: Add 'userGroup' (Volker E.)
+
+### Code
+* Wrap long strings in popups (Sam Wilson)
+* demos: Add missing file to PHP demo to fix infusion (Bartosz Dziewoński)
+
+
 ## v0.34.0 / 2019-09-04
 ### Breaking changes
 * [BREAKING CHANGE] Use OOjs v3.0.0, up from v2.2.2 (James D. Forrester)
index 6bfe4d6..8595f61 100644 (file)
        "ooui-item-remove": "Supprimer",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuler",
-       "ooui-dialog-process-error": "Quelque chose s'est mal passé",
+       "ooui-dialog-process-error": "Quelque chose sest mal passé",
        "ooui-dialog-process-dismiss": "Fermer",
        "ooui-dialog-process-retry": "Réessayer",
        "ooui-dialog-process-continue": "Continuer",
-       "ooui-combobox-button-label": "Liste déroulante de combobox",
+       "ooui-combobox-button-label": "Liste déroulante pour boîte de saisie",
        "ooui-selectfile-button-select": "Sélectionner un fichier",
        "ooui-selectfile-not-supported": "La sélection de fichier n’est pas prise en charge",
        "ooui-selectfile-placeholder": "Aucun fichier sélectionné",
index affc066..d13cb45 100644 (file)
@@ -18,7 +18,8 @@
                        "Gloria sah",
                        "Andrzej aa",
                        "The Polish",
-                       "Railfail536"
+                       "Railfail536",
+                       "Rail"
                ]
        },
        "ooui-outline-control-move-down": "Przesuń w dół",
index d48a492..667f11e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index bb58190..e06ece0 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-element-hidden {
   display: none !important;
@@ -917,6 +917,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-popup {
   position: relative;
   overflow: hidden;
+  word-wrap: break-word;
+  overflow-wrap: break-word;
 }
 .oo-ui-popupWidget-anchor {
   display: none;
index cfbf7d6..d4eaea5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-element-hidden {
   display: none !important;
@@ -1059,6 +1059,8 @@ body:not( :-moz-handler-blocked ) .oo-ui-fieldsetLayout {
 .oo-ui-popupWidget-popup {
   position: relative;
   overflow: hidden;
+  word-wrap: break-word;
+  overflow-wrap: break-word;
 }
 .oo-ui-popupWidget-anchor {
   display: none;
index 11e132e..9754fb8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index fda6a81..768d107 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-checkIcon {
   display: none;
index c011942..5e8b9c9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-tool {
   -webkit-box-sizing: border-box;
index 000b9eb..e8a571e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 854d8e3..f94e98b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
index 73da6f8..8bc82a8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 .oo-ui-draggableElement-handle:not( .oo-ui-draggableElement-undraggable ).oo-ui-widget {
   cursor: move;
index bdf0d2f..7afac69 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 75f1acd..5355835 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 8ac442f..5a11914 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 
 .oo-ui-window {
index e406188..b1a067b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:59Z
+ * Date: 2019-09-10T23:46:11Z
  */
 
 .oo-ui-window {
index 8885525..d8db8d1 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOUI v0.34.0-pre (d5e74518ab)
+ * OOUI v0.34.1-pre (3913589098)
  * https://www.mediawiki.org/wiki/OOUI
  *
  * Copyright 2011–2019 OOUI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2019-09-04T18:28:52Z
+ * Date: 2019-09-10T23:46:03Z
  */
 ( function ( OO ) {
 
index 732d70f..516dc08 100644 (file)
@@ -15,7 +15,8 @@
                        "file": "../wikimediaui/images/icons/attachment.svg"
                },
                "beaker": {
-                       "file": "../wikimediaui/images/icons/beaker.svg"
+                       "file": "../wikimediaui/images/icons/labFlask.svg",
+                       "deprecated": "Renamed since v0.34.1, use 'labFlask' instead."
                },
                "calendar": {
                        "file": "../wikimediaui/images/icons/calendar.svg"
@@ -38,6 +39,9 @@
                "imageLayoutThumbnail": {
                        "file": "../wikimediaui/images/icons/imageLayoutThumbnail.svg"
                },
+               "labFlask": {
+                       "file": "../wikimediaui/images/icons/labFlask.svg"
+               },
                "language": {
                        "file": "../wikimediaui/images/icons/language.svg"
                },
index e13bb1d..de7a118 100644 (file)
                "userAvatarOutline": {
                        "file": "../wikimediaui/images/icons/userAvatarOutline.svg"
                },
+               "userGroup": {
+                       "file": {
+                               "ltr": "../wikimediaui/images/icons/userGroup-ltr.svg",
+                               "rtl": "../wikimediaui/images/icons/userGroup-rtl.svg"
+                       }
+               },
                "userTalk": {
                        "file": {
                                "ltr": "../wikimediaui/images/icons/userTalk-ltr.svg",
index 4f4fd4e..23dd607 100644 (file)
@@ -38,7 +38,8 @@
                        "file": "images/icons/attachment.svg"
                },
                "beaker": {
-                       "file": "images/icons/beaker.svg"
+                       "file": "images/icons/labFlask.svg",
+                       "deprecated": "Renamed since v0.34.1, use 'labFlask' instead."
                },
                "calendar": {
                        "file": "images/icons/calendar.svg"
@@ -61,6 +62,9 @@
                "imageLayoutThumbnail": {
                        "file": "images/icons/imageLayoutThumbnail.svg"
                },
+               "labFlask": {
+                       "file": "images/icons/labFlask.svg"
+               },
                "language": {
                        "file": "images/icons/language.svg"
                },
index 7266d34..5a382ce 100644 (file)
                "userAvatarOutline": {
                        "file": "images/icons/userAvatarOutline.svg"
                },
+               "userGroup": {
+                       "file": {
+                               "ltr": "images/icons/userGroup-ltr.svg",
+                               "rtl": "images/icons/userGroup-rtl.svg"
+                       }
+               },
                "userTalk": {
                        "file": {
                                "ltr": "images/icons/userTalk-ltr.svg",
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png
deleted file mode 100644 (file)
index 89d2d3d..0000000
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.png and /dev/null differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-invert.svg
deleted file mode 100644 (file)
index c031daf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
-       <title>
-               beaker
-       </title><g fill="#fff">
-       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
-</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png
deleted file mode 100644 (file)
index 78736ac..0000000
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.png and /dev/null differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker-progressive.svg
deleted file mode 100644 (file)
index 1f8efbd..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
-       <title>
-               beaker
-       </title><g fill="#36c">
-       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
-</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png
deleted file mode 100644 (file)
index 63a1a80..0000000
Binary files a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.png and /dev/null differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/beaker.svg
deleted file mode 100644 (file)
index 7a37c5a..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
-       <title>
-               beaker
-       </title>
-       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
-</svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png
new file mode 100644 (file)
index 0000000..89d2d3d
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-invert.svg
new file mode 100644 (file)
index 0000000..bfb66da
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               laboratory flask
+       </title><g fill="#fff">
+       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png
new file mode 100644 (file)
index 0000000..78736ac
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask-progressive.svg
new file mode 100644 (file)
index 0000000..1db0d6b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               laboratory flask
+       </title><g fill="#36c">
+       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png
new file mode 100644 (file)
index 0000000..63a1a80
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/labFlask.svg
new file mode 100644 (file)
index 0000000..c95a51a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               laboratory flask
+       </title>
+       <path d="M13 7.61V3h1V1H6v2h1v4.61l-5.86 9.88A1 1 0 0 0 2 19h16a1 1 0 0 0 .86-1.51zm-4.2.88a1 1 0 0 0 .2-.6V3h2v4.89a1 1 0 0 0 .14.51l2.14 3.6H6.72z"/>
+</svg>
index 3b5187d..268dc30 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
        <title>
                user avatar
index 047a18c..681a468 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
        <title>
                user avatar
index 7608cd2..8236235 100644 (file)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
        <title>
                user avatar
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png
new file mode 100644 (file)
index 0000000..bc9c111
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-invert.svg
new file mode 100644 (file)
index 0000000..d05ad38
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#fff">
+       <path d="M14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zM6 3c1.66 0 3 1.34 3 3S7.66 9 6 9 3 7.66 3 6s1.34-3 3-3zm8 7c3.31 0 6 1.79 6 4v2h-6v-2c0-1.48-1.21-2.77-3-3.46.88-.35 1.91-.54 3-.54zm-8 0c3.31 0 6 1.79 6 4v2H0v-2c0-2.21 2.69-4 6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png
new file mode 100644 (file)
index 0000000..5cd3d1c
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr-progressive.svg
new file mode 100644 (file)
index 0000000..71d354a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#36c">
+       <path d="M14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zM6 3c1.66 0 3 1.34 3 3S7.66 9 6 9 3 7.66 3 6s1.34-3 3-3zm8 7c3.31 0 6 1.79 6 4v2h-6v-2c0-1.48-1.21-2.77-3-3.46.88-.35 1.91-.54 3-.54zm-8 0c3.31 0 6 1.79 6 4v2H0v-2c0-2.21 2.69-4 6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png
new file mode 100644 (file)
index 0000000..43c0be2
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-ltr.svg
new file mode 100644 (file)
index 0000000..248d056
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title>
+       <path d="M14 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zM6 3c1.66 0 3 1.34 3 3S7.66 9 6 9 3 7.66 3 6s1.34-3 3-3zm8 7c3.31 0 6 1.79 6 4v2h-6v-2c0-1.48-1.21-2.77-3-3.46.88-.35 1.91-.54 3-.54zm-8 0c3.31 0 6 1.79 6 4v2H0v-2c0-2.21 2.69-4 6-4z"/>
+</svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png
new file mode 100644 (file)
index 0000000..2147e81
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-invert.svg
new file mode 100644 (file)
index 0000000..5604358
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#fff">
+       <path d="M6 3C4.34 3 3 4.34 3 6s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8 0c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm-8 7c-3.31 0-6 1.79-6 4v2h6v-2c0-1.48 1.21-2.77 3-3.46-.88-.35-1.91-.54-3-.54zm8 0c-3.31 0-6 1.79-6 4v2h12v-2c0-2.21-2.69-4-6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png
new file mode 100644 (file)
index 0000000..d9082d3
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl-progressive.svg
new file mode 100644 (file)
index 0000000..75436e9
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title><g fill="#36c">
+       <path d="M6 3C4.34 3 3 4.34 3 6s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8 0c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm-8 7c-3.31 0-6 1.79-6 4v2h6v-2c0-1.48 1.21-2.77 3-3.46-.88-.35-1.91-.54-3-.54zm8 0c-3.31 0-6 1.79-6 4v2h12v-2c0-2.21-2.69-4-6-4z"/>
+</g></svg>
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png
new file mode 100644 (file)
index 0000000..4eedd2e
Binary files /dev/null and b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.png differ
diff --git a/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.svg b/resources/lib/ooui/themes/wikimediaui/images/icons/userGroup-rtl.svg
new file mode 100644 (file)
index 0000000..5bd5bf5
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
+       <title>
+               user group
+       </title>
+       <path d="M6 3C4.34 3 3 4.34 3 6s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm8 0c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3zm-8 7c-3.31 0-6 1.79-6 4v2h6v-2c0-1.48 1.21-2.77 3-3.46-.88-.35-1.91-.54-3-.54zm8 0c-3.31 0-6 1.79-6 4v2h12v-2c0-2.21-2.69-4-6-4z"/>
+</svg>
diff --git a/resources/src/jquery.color/jquery.color.js b/resources/src/jquery.color/jquery.color.js
new file mode 100644 (file)
index 0000000..6df02ad
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * jQuery Color Animations
+ *
+ * @author John Resig, 2007
+ * @author Krinkle, 2011
+ * Released under the MIT and GPL licenses.
+ *
+ * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
+ */
+( function () {
+
+       function getColor( elem, attr ) {
+               var color;
+
+               do {
+                       color = $.css( elem, attr );
+
+                       // Keep going until we find an element that has color, or we hit the body
+                       if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) {
+                               break;
+                       }
+
+                       attr = 'backgroundColor';
+               // eslint-disable-next-line no-cond-assign
+               } while ( elem = elem.parentNode );
+
+               return $.colorUtil.getRGB( color );
+       }
+
+       // We override the animation for all of these color styles
+       [
+               'backgroundColor',
+               'borderBottomColor',
+               'borderLeftColor',
+               'borderRightColor',
+               'borderTopColor',
+               'color',
+               'outlineColor'
+       ].forEach( function ( attr ) {
+               $.fx.step[ attr ] = function ( fx ) {
+                       if ( !fx.colorInit ) {
+                               fx.start = getColor( fx.elem, attr );
+                               fx.end = $.colorUtil.getRGB( fx.end );
+                               fx.colorInit = true;
+                       }
+
+                       fx.elem.style[ attr ] = 'rgb(' + [
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 0 ] - fx.start[ 0 ] ) ) + fx.start[ 0 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 1 ] - fx.start[ 1 ] ) ) + fx.start[ 1 ], 10 ), 255 ), 0 ),
+                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 2 ] - fx.start[ 2 ] ) ) + fx.start[ 2 ], 10 ), 255 ), 0 )
+                       ].join( ',' ) + ')';
+               };
+       } );
+
+}() );
diff --git a/resources/src/jquery.color/jquery.colorUtil.js b/resources/src/jquery.color/jquery.colorUtil.js
new file mode 100644 (file)
index 0000000..009be1a
--- /dev/null
@@ -0,0 +1,268 @@
+/*!
+ * jQuery Color Utilities
+ *
+ * Released under the MIT and GPL licenses.
+ *
+ * Mostly based on other plugins and functions (linted and optimized a little).
+ * Sources cited inline.
+ */
+( function () {
+       /**
+        * @class jQuery.colorUtil
+        * @singleton
+        */
+       $.colorUtil = {
+
+               /**
+                * Parse CSS color strings looking for color tuples
+                *
+                * Based on highlightFade by Blair Mitchelmore
+                * <http://jquery.offput.ca/highlightFade/>
+                *
+                * @param {Array|string} color
+                * @return {Array}
+                */
+               getRGB: function ( color ) {
+                       var result;
+
+                       // Check if we're already dealing with an array of colors
+                       if ( color && Array.isArray( color ) && color.length === 3 ) {
+                               return color;
+                       }
+                       if ( typeof color !== 'string' ) {
+                               return undefined;
+                       }
+
+                       // Look for rgb(num,num,num)
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) ) {
+                               return [
+                                       parseInt( result[ 1 ], 10 ),
+                                       parseInt( result[ 2 ], 10 ),
+                                       parseInt( result[ 3 ], 10 )
+                               ];
+                       }
+
+                       // Look for rgb(num%,num%,num%)
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec( color ) ) {
+                               return [
+                                       parseFloat( result[ 1 ] ) * 2.55,
+                                       parseFloat( result[ 2 ] ) * 2.55,
+                                       parseFloat( result[ 3 ] ) * 2.55
+                               ];
+                       }
+
+                       // Look for #a0b1c2
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) ) {
+                               return [
+                                       parseInt( result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ], 16 )
+                               ];
+                       }
+
+                       // Look for #fff
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) ) {
+                               return [
+                                       parseInt( result[ 1 ] + result[ 1 ], 16 ),
+                                       parseInt( result[ 2 ] + result[ 2 ], 16 ),
+                                       parseInt( result[ 3 ] + result[ 3 ], 16 )
+                               ];
+                       }
+
+                       // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+                       // eslint-disable-next-line no-cond-assign
+                       if ( result = /rgba\(0, 0, 0, 0\)/.exec( color ) ) {
+                               return $.colorUtil.colors.transparent;
+                       }
+
+                       // Otherwise, we're most likely dealing with a named color
+                       return $.colorUtil.colors[ color.trim().toLowerCase() ];
+               },
+
+               /**
+                * Named color map
+                *
+                * Based on Interface by Stefan Petre
+                * <http://interface.eyecon.ro/>
+                *
+                * @property {Object}
+                */
+               colors: {
+                       aqua: [ 0, 255, 255 ],
+                       azure: [ 240, 255, 255 ],
+                       beige: [ 245, 245, 220 ],
+                       black: [ 0, 0, 0 ],
+                       blue: [ 0, 0, 255 ],
+                       brown: [ 165, 42, 42 ],
+                       cyan: [ 0, 255, 255 ],
+                       darkblue: [ 0, 0, 139 ],
+                       darkcyan: [ 0, 139, 139 ],
+                       darkgrey: [ 169, 169, 169 ],
+                       darkgreen: [ 0, 100, 0 ],
+                       darkkhaki: [ 189, 183, 107 ],
+                       darkmagenta: [ 139, 0, 139 ],
+                       darkolivegreen: [ 85, 107, 47 ],
+                       darkorange: [ 255, 140, 0 ],
+                       darkorchid: [ 153, 50, 204 ],
+                       darkred: [ 139, 0, 0 ],
+                       darksalmon: [ 233, 150, 122 ],
+                       darkviolet: [ 148, 0, 211 ],
+                       fuchsia: [ 255, 0, 255 ],
+                       gold: [ 255, 215, 0 ],
+                       green: [ 0, 128, 0 ],
+                       indigo: [ 75, 0, 130 ],
+                       khaki: [ 240, 230, 140 ],
+                       lightblue: [ 173, 216, 230 ],
+                       lightcyan: [ 224, 255, 255 ],
+                       lightgreen: [ 144, 238, 144 ],
+                       lightgrey: [ 211, 211, 211 ],
+                       lightpink: [ 255, 182, 193 ],
+                       lightyellow: [ 255, 255, 224 ],
+                       lime: [ 0, 255, 0 ],
+                       magenta: [ 255, 0, 255 ],
+                       maroon: [ 128, 0, 0 ],
+                       navy: [ 0, 0, 128 ],
+                       olive: [ 128, 128, 0 ],
+                       orange: [ 255, 165, 0 ],
+                       pink: [ 255, 192, 203 ],
+                       purple: [ 128, 0, 128 ],
+                       violet: [ 128, 0, 128 ],
+                       red: [ 255, 0, 0 ],
+                       silver: [ 192, 192, 192 ],
+                       white: [ 255, 255, 255 ],
+                       yellow: [ 255, 255, 0 ],
+                       transparent: [ 255, 255, 255 ]
+               },
+
+               /**
+                * Convert an RGB color value to HSL.
+                *
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `r`, `g`, and `b` are contained in the set `[0, 255]` and
+                * returns `h`, `s`, and `l` in the set `[0, 1]`.
+                *
+                * @param {number} r The red color value
+                * @param {number} g The green color value
+                * @param {number} b The blue color value
+                * @return {number[]} The HSL representation
+                */
+               rgbToHsl: function ( r, g, b ) {
+                       var d, h, s, l, min, max;
+
+                       r = r / 255;
+                       g = g / 255;
+                       b = b / 255;
+
+                       max = Math.max( r, g, b );
+                       min = Math.min( r, g, b );
+                       l = ( max + min ) / 2;
+
+                       if ( max === min ) {
+                               // achromatic
+                               h = s = 0;
+                       } else {
+                               d = max - min;
+                               s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
+                               switch ( max ) {
+                                       case r:
+                                               h = ( g - b ) / d + ( g < b ? 6 : 0 );
+                                               break;
+                                       case g:
+                                               h = ( b - r ) / d + 2;
+                                               break;
+                                       case b:
+                                               h = ( r - g ) / d + 4;
+                                               break;
+                               }
+                               h /= 6;
+                       }
+
+                       return [ h, s, l ];
+               },
+
+               /**
+                * Convert an HSL color value to RGB.
+                *
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `h`, `s`, and `l` are contained in the set `[0, 1]` and
+                * returns `r`, `g`, and `b` in the set `[0, 255]`.
+                *
+                * @param {number} h The hue
+                * @param {number} s The saturation
+                * @param {number} l The lightness
+                * @return {number[]} The RGB representation
+                */
+               hslToRgb: function ( h, s, l ) {
+                       var r, g, b, hue2rgb, q, p;
+
+                       if ( s === 0 ) {
+                               r = g = b = l; // achromatic
+                       } else {
+                               hue2rgb = function ( p, q, t ) {
+                                       if ( t < 0 ) {
+                                               t += 1;
+                                       }
+                                       if ( t > 1 ) {
+                                               t -= 1;
+                                       }
+                                       if ( t < 1 / 6 ) {
+                                               return p + ( q - p ) * 6 * t;
+                                       }
+                                       if ( t < 1 / 2 ) {
+                                               return q;
+                                       }
+                                       if ( t < 2 / 3 ) {
+                                               return p + ( q - p ) * ( 2 / 3 - t ) * 6;
+                                       }
+                                       return p;
+                               };
+
+                               q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
+                               p = 2 * l - q;
+                               r = hue2rgb( p, q, h + 1 / 3 );
+                               g = hue2rgb( p, q, h );
+                               b = hue2rgb( p, q, h - 1 / 3 );
+                       }
+
+                       return [ r * 255, g * 255, b * 255 ];
+               },
+
+               /**
+                * Get a brighter or darker rgb() value string.
+                *
+                * Usage:
+                *
+                *     $.colorUtil.getColorBrightness( 'red', +0.1 );
+                *     // > "rgb(255,50,50)"
+                *     $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
+                *     // > "rgb(118,29,29)"
+                *
+                * @param {Mixed} currentColor Current value in css
+                * @param {number} mod Wanted brightness modification between -1 and 1
+                * @return {string} Like `'rgb(r,g,b)'`
+                */
+               getColorBrightness: function ( currentColor, mod ) {
+                       var rgbArr = $.colorUtil.getRGB( currentColor ),
+                               hslArr = $.colorUtil.rgbToHsl( rgbArr[ 0 ], rgbArr[ 1 ], rgbArr[ 2 ] );
+                       rgbArr = $.colorUtil.hslToRgb( hslArr[ 0 ], hslArr[ 1 ], hslArr[ 2 ] + mod );
+
+                       return 'rgb(' +
+                               [ parseInt( rgbArr[ 0 ], 10 ), parseInt( rgbArr[ 1 ], 10 ), parseInt( rgbArr[ 2 ], 10 ) ].join( ',' ) +
+                               ')';
+               }
+
+       };
+
+}() );
diff --git a/resources/src/jquery/jquery.checkboxShiftClick.js b/resources/src/jquery/jquery.checkboxShiftClick.js
deleted file mode 100644 (file)
index 435e23f..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * @class jQuery.plugin.checkboxShiftClick
- */
-( function () {
-
-       /**
-        * Enable checkboxes to be checked or unchecked in a row by clicking one,
-        * holding shift and clicking another one.
-        *
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.checkboxShiftClick = function () {
-               var prevCheckbox = null,
-                       $box = this;
-               // When our boxes are clicked..
-               $box.on( 'click', function ( e ) {
-                       // And one has been clicked before...
-                       if ( prevCheckbox !== null && e.shiftKey ) {
-                               // Check or uncheck this one and all in-between checkboxes,
-                               // except for disabled ones
-                               $box
-                                       .slice(
-                                               Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
-                                               Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
-                                       )
-                                       .filter( function () {
-                                               return !this.disabled;
-                                       } )
-                                       .prop( 'checked', !!e.target.checked );
-                       }
-                       // Either way, update the prevCheckbox variable to the one clicked now
-                       prevCheckbox = e.target;
-               } );
-               return $box;
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.checkboxShiftClick
-        */
-
-}() );
diff --git a/resources/src/jquery/jquery.color.js b/resources/src/jquery/jquery.color.js
deleted file mode 100644 (file)
index 6df02ad..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * jQuery Color Animations
- *
- * @author John Resig, 2007
- * @author Krinkle, 2011
- * Released under the MIT and GPL licenses.
- *
- * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
- */
-( function () {
-
-       function getColor( elem, attr ) {
-               var color;
-
-               do {
-                       color = $.css( elem, attr );
-
-                       // Keep going until we find an element that has color, or we hit the body
-                       if ( color !== '' && color !== 'transparent' || elem.nodeName.toLowerCase() === 'body' ) {
-                               break;
-                       }
-
-                       attr = 'backgroundColor';
-               // eslint-disable-next-line no-cond-assign
-               } while ( elem = elem.parentNode );
-
-               return $.colorUtil.getRGB( color );
-       }
-
-       // We override the animation for all of these color styles
-       [
-               'backgroundColor',
-               'borderBottomColor',
-               'borderLeftColor',
-               'borderRightColor',
-               'borderTopColor',
-               'color',
-               'outlineColor'
-       ].forEach( function ( attr ) {
-               $.fx.step[ attr ] = function ( fx ) {
-                       if ( !fx.colorInit ) {
-                               fx.start = getColor( fx.elem, attr );
-                               fx.end = $.colorUtil.getRGB( fx.end );
-                               fx.colorInit = true;
-                       }
-
-                       fx.elem.style[ attr ] = 'rgb(' + [
-                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 0 ] - fx.start[ 0 ] ) ) + fx.start[ 0 ], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 1 ] - fx.start[ 1 ] ) ) + fx.start[ 1 ], 10 ), 255 ), 0 ),
-                               Math.max( Math.min( parseInt( ( fx.pos * ( fx.end[ 2 ] - fx.start[ 2 ] ) ) + fx.start[ 2 ], 10 ), 255 ), 0 )
-                       ].join( ',' ) + ')';
-               };
-       } );
-
-}() );
diff --git a/resources/src/jquery/jquery.colorUtil.js b/resources/src/jquery/jquery.colorUtil.js
deleted file mode 100644 (file)
index 009be1a..0000000
+++ /dev/null
@@ -1,268 +0,0 @@
-/*!
- * jQuery Color Utilities
- *
- * Released under the MIT and GPL licenses.
- *
- * Mostly based on other plugins and functions (linted and optimized a little).
- * Sources cited inline.
- */
-( function () {
-       /**
-        * @class jQuery.colorUtil
-        * @singleton
-        */
-       $.colorUtil = {
-
-               /**
-                * Parse CSS color strings looking for color tuples
-                *
-                * Based on highlightFade by Blair Mitchelmore
-                * <http://jquery.offput.ca/highlightFade/>
-                *
-                * @param {Array|string} color
-                * @return {Array}
-                */
-               getRGB: function ( color ) {
-                       var result;
-
-                       // Check if we're already dealing with an array of colors
-                       if ( color && Array.isArray( color ) && color.length === 3 ) {
-                               return color;
-                       }
-                       if ( typeof color !== 'string' ) {
-                               return undefined;
-                       }
-
-                       // Look for rgb(num,num,num)
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) ) {
-                               return [
-                                       parseInt( result[ 1 ], 10 ),
-                                       parseInt( result[ 2 ], 10 ),
-                                       parseInt( result[ 3 ], 10 )
-                               ];
-                       }
-
-                       // Look for rgb(num%,num%,num%)
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec( color ) ) {
-                               return [
-                                       parseFloat( result[ 1 ] ) * 2.55,
-                                       parseFloat( result[ 2 ] ) * 2.55,
-                                       parseFloat( result[ 3 ] ) * 2.55
-                               ];
-                       }
-
-                       // Look for #a0b1c2
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) ) {
-                               return [
-                                       parseInt( result[ 1 ], 16 ),
-                                       parseInt( result[ 2 ], 16 ),
-                                       parseInt( result[ 3 ], 16 )
-                               ];
-                       }
-
-                       // Look for #fff
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) ) {
-                               return [
-                                       parseInt( result[ 1 ] + result[ 1 ], 16 ),
-                                       parseInt( result[ 2 ] + result[ 2 ], 16 ),
-                                       parseInt( result[ 3 ] + result[ 3 ], 16 )
-                               ];
-                       }
-
-                       // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-                       // eslint-disable-next-line no-cond-assign
-                       if ( result = /rgba\(0, 0, 0, 0\)/.exec( color ) ) {
-                               return $.colorUtil.colors.transparent;
-                       }
-
-                       // Otherwise, we're most likely dealing with a named color
-                       return $.colorUtil.colors[ color.trim().toLowerCase() ];
-               },
-
-               /**
-                * Named color map
-                *
-                * Based on Interface by Stefan Petre
-                * <http://interface.eyecon.ro/>
-                *
-                * @property {Object}
-                */
-               colors: {
-                       aqua: [ 0, 255, 255 ],
-                       azure: [ 240, 255, 255 ],
-                       beige: [ 245, 245, 220 ],
-                       black: [ 0, 0, 0 ],
-                       blue: [ 0, 0, 255 ],
-                       brown: [ 165, 42, 42 ],
-                       cyan: [ 0, 255, 255 ],
-                       darkblue: [ 0, 0, 139 ],
-                       darkcyan: [ 0, 139, 139 ],
-                       darkgrey: [ 169, 169, 169 ],
-                       darkgreen: [ 0, 100, 0 ],
-                       darkkhaki: [ 189, 183, 107 ],
-                       darkmagenta: [ 139, 0, 139 ],
-                       darkolivegreen: [ 85, 107, 47 ],
-                       darkorange: [ 255, 140, 0 ],
-                       darkorchid: [ 153, 50, 204 ],
-                       darkred: [ 139, 0, 0 ],
-                       darksalmon: [ 233, 150, 122 ],
-                       darkviolet: [ 148, 0, 211 ],
-                       fuchsia: [ 255, 0, 255 ],
-                       gold: [ 255, 215, 0 ],
-                       green: [ 0, 128, 0 ],
-                       indigo: [ 75, 0, 130 ],
-                       khaki: [ 240, 230, 140 ],
-                       lightblue: [ 173, 216, 230 ],
-                       lightcyan: [ 224, 255, 255 ],
-                       lightgreen: [ 144, 238, 144 ],
-                       lightgrey: [ 211, 211, 211 ],
-                       lightpink: [ 255, 182, 193 ],
-                       lightyellow: [ 255, 255, 224 ],
-                       lime: [ 0, 255, 0 ],
-                       magenta: [ 255, 0, 255 ],
-                       maroon: [ 128, 0, 0 ],
-                       navy: [ 0, 0, 128 ],
-                       olive: [ 128, 128, 0 ],
-                       orange: [ 255, 165, 0 ],
-                       pink: [ 255, 192, 203 ],
-                       purple: [ 128, 0, 128 ],
-                       violet: [ 128, 0, 128 ],
-                       red: [ 255, 0, 0 ],
-                       silver: [ 192, 192, 192 ],
-                       white: [ 255, 255, 255 ],
-                       yellow: [ 255, 255, 0 ],
-                       transparent: [ 255, 255, 255 ]
-               },
-
-               /**
-                * Convert an RGB color value to HSL.
-                *
-                * Conversion formula based on
-                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
-                *
-                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
-                *
-                * Assumes `r`, `g`, and `b` are contained in the set `[0, 255]` and
-                * returns `h`, `s`, and `l` in the set `[0, 1]`.
-                *
-                * @param {number} r The red color value
-                * @param {number} g The green color value
-                * @param {number} b The blue color value
-                * @return {number[]} The HSL representation
-                */
-               rgbToHsl: function ( r, g, b ) {
-                       var d, h, s, l, min, max;
-
-                       r = r / 255;
-                       g = g / 255;
-                       b = b / 255;
-
-                       max = Math.max( r, g, b );
-                       min = Math.min( r, g, b );
-                       l = ( max + min ) / 2;
-
-                       if ( max === min ) {
-                               // achromatic
-                               h = s = 0;
-                       } else {
-                               d = max - min;
-                               s = l > 0.5 ? d / ( 2 - max - min ) : d / ( max + min );
-                               switch ( max ) {
-                                       case r:
-                                               h = ( g - b ) / d + ( g < b ? 6 : 0 );
-                                               break;
-                                       case g:
-                                               h = ( b - r ) / d + 2;
-                                               break;
-                                       case b:
-                                               h = ( r - g ) / d + 4;
-                                               break;
-                               }
-                               h /= 6;
-                       }
-
-                       return [ h, s, l ];
-               },
-
-               /**
-                * Convert an HSL color value to RGB.
-                *
-                * Conversion formula based on
-                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
-                *
-                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
-                *
-                * Assumes `h`, `s`, and `l` are contained in the set `[0, 1]` and
-                * returns `r`, `g`, and `b` in the set `[0, 255]`.
-                *
-                * @param {number} h The hue
-                * @param {number} s The saturation
-                * @param {number} l The lightness
-                * @return {number[]} The RGB representation
-                */
-               hslToRgb: function ( h, s, l ) {
-                       var r, g, b, hue2rgb, q, p;
-
-                       if ( s === 0 ) {
-                               r = g = b = l; // achromatic
-                       } else {
-                               hue2rgb = function ( p, q, t ) {
-                                       if ( t < 0 ) {
-                                               t += 1;
-                                       }
-                                       if ( t > 1 ) {
-                                               t -= 1;
-                                       }
-                                       if ( t < 1 / 6 ) {
-                                               return p + ( q - p ) * 6 * t;
-                                       }
-                                       if ( t < 1 / 2 ) {
-                                               return q;
-                                       }
-                                       if ( t < 2 / 3 ) {
-                                               return p + ( q - p ) * ( 2 / 3 - t ) * 6;
-                                       }
-                                       return p;
-                               };
-
-                               q = l < 0.5 ? l * ( 1 + s ) : l + s - l * s;
-                               p = 2 * l - q;
-                               r = hue2rgb( p, q, h + 1 / 3 );
-                               g = hue2rgb( p, q, h );
-                               b = hue2rgb( p, q, h - 1 / 3 );
-                       }
-
-                       return [ r * 255, g * 255, b * 255 ];
-               },
-
-               /**
-                * Get a brighter or darker rgb() value string.
-                *
-                * Usage:
-                *
-                *     $.colorUtil.getColorBrightness( 'red', +0.1 );
-                *     // > "rgb(255,50,50)"
-                *     $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
-                *     // > "rgb(118,29,29)"
-                *
-                * @param {Mixed} currentColor Current value in css
-                * @param {number} mod Wanted brightness modification between -1 and 1
-                * @return {string} Like `'rgb(r,g,b)'`
-                */
-               getColorBrightness: function ( currentColor, mod ) {
-                       var rgbArr = $.colorUtil.getRGB( currentColor ),
-                               hslArr = $.colorUtil.rgbToHsl( rgbArr[ 0 ], rgbArr[ 1 ], rgbArr[ 2 ] );
-                       rgbArr = $.colorUtil.hslToRgb( hslArr[ 0 ], hslArr[ 1 ], hslArr[ 2 ] + mod );
-
-                       return 'rgb(' +
-                               [ parseInt( rgbArr[ 0 ], 10 ), parseInt( rgbArr[ 1 ], 10 ), parseInt( rgbArr[ 2 ], 10 ) ].join( ',' ) +
-                               ')';
-               }
-
-       };
-
-}() );
index 20bd405..de307a6 100644 (file)
                                .toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed );
                }
 
+               // Toggle `aria-expanded` attribute, if requested (for default and premade togglers by default).
+               if ( options.toggleARIA ) {
+                       $toggle.attr( 'aria-expanded', wasCollapsed ? 'true' : 'false' );
+               }
+
                // Toggle the text ("Show"/"Hide") within elements tagged with mw-collapsible-text
                if ( options.toggleText ) {
                        collapseText = options.toggleText.collapseText;
                        actionHandler = function ( e, opts ) {
                                var defaultOpts = {
                                        toggleClasses: true,
+                                       toggleARIA: true,
                                        toggleText: { collapseText: collapseText, expandText: expandText }
                                };
                                opts = $.extend( defaultOpts, options, opts );
 
                        // Attach event handlers to togglelink
                        $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+                               .attr( 'aria-expanded', 'true' )
                                .prop( 'tabIndex', 0 );
 
                        $( this ).data( 'mw-collapsible', {
index ac89616..23e86f7 100644 (file)
@@ -125,12 +125,6 @@ li,
        }
 }
 
-fieldset.mw-collapsible .mw-collapsible-toggle {
-       position: absolute;
-       right: 0;
-       z-index: 1;
-}
-
 // special treatment for list items to match above
 // !important necessary to override overly-specific float left and right above.
 ol.mw-collapsible:not( @{exclude} ):before,
index 4b6313b..83ea0ce 100644 (file)
@@ -59,7 +59,6 @@
                                        }
                                },
                                parameters: {
-                                       // Add 'origin' query parameter to all requests.
                                        origin: this.getOrigin()
                                }
                        },
         * any).
         *
         * @protected
-        * @return {string}
+        * @return {string|undefined}
         */
        CoreForeignApi.prototype.getOrigin = function () {
-               var origin;
+               var origin, apiUri, apiOrigin;
                if ( this.anonymous ) {
                        return '*';
                }
+
                origin = location.protocol + '//' + location.hostname;
                if ( location.port ) {
                        origin += ':' + location.port;
                }
+
+               apiUri = new mw.Uri( this.apiUrl );
+               apiOrigin = apiUri.protocol + '://' + apiUri.getAuthority();
+               if ( origin === apiOrigin ) {
+                       // requests are not cross-origin, omit parameter
+                       return undefined;
+               }
+
                return origin;
        };
 
                if ( ajaxOptions.type === 'POST' ) {
                        url = ( ajaxOptions && ajaxOptions.url ) || this.defaults.ajax.url;
                        origin = ( parameters && parameters.origin ) || this.defaults.parameters.origin;
-                       url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
-                               // Depending on server configuration, MediaWiki may forbid periods in URLs, due to an IE 6
-                               // XSS bug. So let's escape them here. See WebRequest::checkUrlExtension() and T30235.
-                               'origin=' + encodeURIComponent( origin ).replace( /\./g, '%2E' );
+                       if ( origin !== undefined ) {
+                               url += ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) +
+                                       // Depending on server configuration, MediaWiki may forbid periods in URLs, due to an IE 6
+                                       // XSS bug. So let's escape them here. See WebRequest::checkUrlExtension() and T30235.
+                                       'origin=' + encodeURIComponent( origin ).replace( /\./g, '%2E' );
+                       }
                        newAjaxOptions = $.extend( {}, ajaxOptions, { url: url } );
                } else {
                        newAjaxOptions = ajaxOptions;
index 3f39fd1..843f00f 100644 (file)
 
 /* Private members */
 
-var
+var toUpperMap,
        mwString = require( 'mediawiki.String' ),
 
-       toUpperMapping = require( './phpCharToUpper.json' ),
-
        namespaceIds = mw.config.get( 'wgNamespaceIds' ),
 
        /**
@@ -765,8 +763,15 @@ Title.normalizeExtension = function ( extension ) {
  * @return {string} Unicode character, in upper case, according to the same rules as in PHP
  */
 Title.phpCharToUpper = function ( chr ) {
-       var mapped = toUpperMapping[ chr ];
-       return mapped || chr.toUpperCase();
+       if ( !toUpperMap ) {
+               toUpperMap = require( './phpCharToUpper.json' );
+       }
+       if ( toUpperMap[ chr ] === '' ) {
+               // Optimisation: When the override is to keep the character unchanged,
+               // we use an empty string in JSON. This reduces the data by 50%.
+               return chr;
+       }
+       return toUpperMap[ chr ] || chr.toUpperCase();
 };
 
 /* Public members */
index 2ba08cf..0334039 100644 (file)
 {
-       "ß": "ß",
-       "ʼn": "ʼn",
-       "ƀ": "ƀ",
-       "ƚ": "ƚ",
-       "Dž": "Dž",
+       "ß": "",
+       "ʼn": "",
+       "ƀ": "",
+       "ƚ": "",
+       "Dž": "",
        "dž": "Dž",
-       "Lj": "Lj",
+       "Lj": "",
        "lj": "Lj",
-       "Nj": "Nj",
+       "Nj": "",
        "nj": "Nj",
-       "ǰ": "ǰ",
-       "Dz": "Dz",
+       "ǰ": "",
+       "Dz": "",
        "dz": "Dz",
-       "ȼ": "ȼ",
-       "ȿ": "ȿ",
-       "ɀ": "ɀ",
-       "ɂ": "ɂ",
-       "ɇ": "ɇ",
-       "ɉ": "ɉ",
-       "ɋ": "ɋ",
-       "ɍ": "ɍ",
-       "ɏ": "ɏ",
-       "ɐ": "ɐ",
-       "ɑ": "ɑ",
-       "ɒ": "ɒ",
-       "ɜ": "ɜ",
-       "ɡ": "ɡ",
-       "ɥ": "ɥ",
-       "ɦ": "ɦ",
-       "ɪ": "ɪ",
-       "ɫ": "ɫ",
-       "ɬ": "ɬ",
-       "ɱ": "ɱ",
-       "ɽ": "ɽ",
-       "ʂ": "ʂ",
-       "ʇ": "ʇ",
-       "ʉ": "ʉ",
-       "ʌ": "ʌ",
-       "ʝ": "ʝ",
-       "ʞ": "ʞ",
-       "ͅ": "ͅ",
-       "ͱ": "ͱ",
-       "ͳ": "ͳ",
-       "ͷ": "ͷ",
-       "ͻ": "ͻ",
-       "ͼ": "ͼ",
-       "ͽ": "ͽ",
-       "ΐ": "ΐ",
-       "ΰ": "ΰ",
-       "ϗ": "ϗ",
+       "ȼ": "",
+       "ȿ": "",
+       "ɀ": "",
+       "ɂ": "",
+       "ɇ": "",
+       "ɉ": "",
+       "ɋ": "",
+       "ɍ": "",
+       "ɏ": "",
+       "ɐ": "",
+       "ɑ": "",
+       "ɒ": "",
+       "ɜ": "",
+       "ɡ": "",
+       "ɥ": "",
+       "ɦ": "",
+       "ɪ": "",
+       "ɫ": "",
+       "ɬ": "",
+       "ɱ": "",
+       "ɽ": "",
+       "ʂ": "",
+       "ʇ": "",
+       "ʉ": "",
+       "ʌ": "",
+       "ʝ": "",
+       "ʞ": "",
+       "ͅ": "",
+       "ͱ": "",
+       "ͳ": "",
+       "ͷ": "",
+       "ͻ": "",
+       "ͼ": "",
+       "ͽ": "",
+       "ΐ": "",
+       "ΰ": "",
+       "ϗ": "",
        "ϲ": "Σ",
-       "ϳ": "ϳ",
-       "ϸ": "ϸ",
-       "ϻ": "ϻ",
-       "ӏ": "ӏ",
-       "ӷ": "ӷ",
-       "ӻ": "ӻ",
-       "ӽ": "ӽ",
-       "ӿ": "ӿ",
-       "ԑ": "ԑ",
-       "ԓ": "ԓ",
-       "ԕ": "ԕ",
-       "ԗ": "ԗ",
-       "ԙ": "ԙ",
-       "ԛ": "ԛ",
-       "ԝ": "ԝ",
-       "ԟ": "ԟ",
-       "ԡ": "ԡ",
-       "ԣ": "ԣ",
-       "ԥ": "ԥ",
-       "ԧ": "ԧ",
-       "ԩ": "ԩ",
-       "ԫ": "ԫ",
-       "ԭ": "ԭ",
-       "ԯ": "ԯ",
-       "և": "և",
-       "ა": "",
-       "ბ": "",
-       "გ": "",
-       "დ": "",
-       "ე": "",
-       "ვ": "",
-       "ზ": "",
-       "თ": "",
-       "ი": "",
-       "კ": "",
-       "ლ": "",
-       "მ": "",
-       "ნ": "",
-       "ო": "",
-       "პ": "",
-       "ჟ": "",
-       "რ": "",
-       "ს": "",
-       "ტ": "",
-       "უ": "",
-       "ფ": "",
-       "ქ": "",
-       "ღ": "",
-       "ყ": "",
-       "შ": "",
-       "ჩ": "",
-       "ც": "",
-       "ძ": "",
-       "წ": "",
-       "ჭ": "",
-       "ხ": "",
-       "ჯ": "",
-       "ჰ": "",
-       "ჱ": "",
-       "ჲ": "",
-       "ჳ": "",
-       "ჴ": "",
-       "ჵ": "",
-       "ჶ": "",
-       "ჷ": "",
-       "ჸ": "",
-       "ჹ": "",
-       "ჺ": "",
-       "ჽ": "",
-       "ჾ": "",
-       "ჿ": "",
-       "ᏸ": "",
-       "ᏹ": "",
-       "ᏺ": "",
-       "ᏻ": "",
-       "ᏼ": "",
-       "ᏽ": "",
-       "ᲀ": "",
-       "ᲁ": "",
-       "ᲂ": "",
-       "ᲃ": "",
-       "ᲄ": "",
-       "ᲅ": "",
-       "ᲆ": "",
-       "ᲇ": "",
-       "ᲈ": "",
-       "ᵹ": "",
-       "ᵽ": "",
-       "ᶎ": "",
-       "ẖ": "",
-       "ẗ": "",
-       "ẘ": "",
-       "ẙ": "",
-       "ẚ": "",
-       "ỻ": "",
-       "ỽ": "",
-       "ỿ": "ỿ",
-       "ὐ": "",
-       "ὒ": "",
-       "ὔ": "",
-       "ὖ": "",
+       "ϳ": "",
+       "ϸ": "",
+       "ϻ": "",
+       "ӏ": "",
+       "ӷ": "",
+       "ӻ": "",
+       "ӽ": "",
+       "ӿ": "",
+       "ԑ": "",
+       "ԓ": "",
+       "ԕ": "",
+       "ԗ": "",
+       "ԙ": "",
+       "ԛ": "",
+       "ԝ": "",
+       "ԟ": "",
+       "ԡ": "",
+       "ԣ": "",
+       "ԥ": "",
+       "ԧ": "",
+       "ԩ": "",
+       "ԫ": "",
+       "ԭ": "",
+       "ԯ": "",
+       "և": "",
+       "ა": "",
+       "ბ": "",
+       "გ": "",
+       "დ": "",
+       "ე": "",
+       "ვ": "",
+       "ზ": "",
+       "თ": "",
+       "ი": "",
+       "კ": "",
+       "ლ": "",
+       "მ": "",
+       "ნ": "",
+       "ო": "",
+       "პ": "",
+       "ჟ": "",
+       "რ": "",
+       "ს": "",
+       "ტ": "",
+       "უ": "",
+       "ფ": "",
+       "ქ": "",
+       "ღ": "",
+       "ყ": "",
+       "შ": "",
+       "ჩ": "",
+       "ც": "",
+       "ძ": "",
+       "წ": "",
+       "ჭ": "",
+       "ხ": "",
+       "ჯ": "",
+       "ჰ": "",
+       "ჱ": "",
+       "ჲ": "",
+       "ჳ": "",
+       "ჴ": "",
+       "ჵ": "",
+       "ჶ": "",
+       "ჷ": "",
+       "ჸ": "",
+       "ჹ": "",
+       "ჺ": "",
+       "ჽ": "",
+       "ჾ": "",
+       "ჿ": "",
+       "ᏸ": "",
+       "ᏹ": "",
+       "ᏺ": "",
+       "ᏻ": "",
+       "ᏼ": "",
+       "ᏽ": "",
+       "ᲀ": "",
+       "ᲁ": "",
+       "ᲂ": "",
+       "ᲃ": "",
+       "ᲄ": "",
+       "ᲅ": "",
+       "ᲆ": "",
+       "ᲇ": "",
+       "ᲈ": "",
+       "ᵹ": "",
+       "ᵽ": "",
+       "ᶎ": "",
+       "ẖ": "",
+       "ẗ": "",
+       "ẘ": "",
+       "ẙ": "",
+       "ẚ": "",
+       "ỻ": "",
+       "ỽ": "",
+       "ỿ": "",
+       "ὐ": "",
+       "ὒ": "",
+       "ὔ": "",
+       "ὖ": "",
        "ᾀ": "ᾈ",
        "ᾁ": "ᾉ",
        "ᾂ": "ᾊ",
        "ᾅ": "ᾍ",
        "ᾆ": "ᾎ",
        "ᾇ": "ᾏ",
-       "ᾈ": "",
-       "ᾉ": "",
-       "ᾊ": "",
-       "ᾋ": "",
-       "ᾌ": "",
-       "ᾍ": "",
-       "ᾎ": "",
-       "ᾏ": "",
+       "ᾈ": "",
+       "ᾉ": "",
+       "ᾊ": "",
+       "ᾋ": "",
+       "ᾌ": "",
+       "ᾍ": "",
+       "ᾎ": "",
+       "ᾏ": "",
        "ᾐ": "ᾘ",
        "ᾑ": "ᾙ",
        "ᾒ": "ᾚ",
        "ᾕ": "ᾝ",
        "ᾖ": "ᾞ",
        "ᾗ": "ᾟ",
-       "ᾘ": "",
-       "ᾙ": "",
-       "ᾚ": "",
-       "ᾛ": "",
-       "ᾜ": "",
-       "ᾝ": "",
-       "ᾞ": "",
-       "ᾟ": "",
+       "ᾘ": "",
+       "ᾙ": "",
+       "ᾚ": "",
+       "ᾛ": "",
+       "ᾜ": "",
+       "ᾝ": "",
+       "ᾞ": "",
+       "ᾟ": "",
        "ᾠ": "ᾨ",
        "ᾡ": "ᾩ",
        "ᾢ": "ᾪ",
        "ᾥ": "ᾭ",
        "ᾦ": "ᾮ",
        "ᾧ": "ᾯ",
-       "ᾨ": "",
-       "ᾩ": "",
-       "ᾪ": "",
-       "ᾫ": "",
-       "ᾬ": "",
-       "ᾭ": "",
-       "ᾮ": "",
-       "ᾯ": "",
-       "ᾲ": "",
+       "ᾨ": "",
+       "ᾩ": "",
+       "ᾪ": "",
+       "ᾫ": "",
+       "ᾬ": "",
+       "ᾭ": "",
+       "ᾮ": "",
+       "ᾯ": "",
+       "ᾲ": "",
        "ᾳ": "ᾼ",
-       "ᾴ": "",
-       "ᾶ": "",
-       "ᾷ": "",
-       "ᾼ": "",
-       "ῂ": "",
+       "ᾴ": "",
+       "ᾶ": "",
+       "ᾷ": "",
+       "ᾼ": "",
+       "ῂ": "",
        "ῃ": "ῌ",
-       "ῄ": "",
-       "ῆ": "",
-       "ῇ": "",
-       "ῌ": "",
-       "ῒ": "",
-       "ΐ": "",
-       "ῖ": "",
-       "ῗ": "",
-       "ῢ": "",
-       "ΰ": "",
-       "ῤ": "",
-       "ῦ": "",
-       "ῧ": "",
-       "ῲ": "",
+       "ῄ": "",
+       "ῆ": "",
+       "ῇ": "",
+       "ῌ": "",
+       "ῒ": "",
+       "ΐ": "",
+       "ῖ": "",
+       "ῗ": "",
+       "ῢ": "",
+       "ΰ": "",
+       "ῤ": "",
+       "ῦ": "",
+       "ῧ": "",
+       "ῲ": "",
        "ῳ": "ῼ",
-       "ῴ": "",
-       "ῶ": "",
-       "ῷ": "",
-       "ῼ": "",
-       "ⅎ": "",
-       "ⅰ": "",
-       "ⅱ": "",
-       "ⅲ": "",
-       "ⅳ": "",
-       "ⅴ": "",
-       "ⅵ": "",
-       "ⅶ": "",
-       "ⅷ": "",
-       "ⅸ": "",
-       "ⅹ": "",
-       "ⅺ": "",
-       "ⅻ": "",
-       "ⅼ": "",
-       "ⅽ": "",
-       "ⅾ": "",
-       "ⅿ": "",
-       "ↄ": "",
-       "ⓐ": "",
-       "ⓑ": "",
-       "ⓒ": "",
-       "ⓓ": "",
-       "ⓔ": "",
-       "ⓕ": "",
-       "ⓖ": "",
-       "ⓗ": "",
-       "ⓘ": "",
-       "ⓙ": "",
-       "ⓚ": "",
-       "ⓛ": "",
-       "ⓜ": "",
-       "ⓝ": "",
-       "ⓞ": "",
-       "ⓟ": "",
-       "ⓠ": "",
-       "ⓡ": "",
-       "ⓢ": "",
-       "ⓣ": "",
-       "ⓤ": "",
-       "ⓥ": "",
-       "ⓦ": "",
-       "ⓧ": "",
-       "ⓨ": "",
-       "ⓩ": "",
-       "ⰰ": "",
-       "ⰱ": "",
-       "ⰲ": "",
-       "ⰳ": "",
-       "ⰴ": "",
-       "ⰵ": "",
-       "ⰶ": "",
-       "ⰷ": "",
-       "ⰸ": "",
-       "ⰹ": "",
-       "ⰺ": "",
-       "ⰻ": "",
-       "ⰼ": "",
-       "ⰽ": "",
-       "ⰾ": "",
-       "ⰿ": "ⰿ",
-       "ⱀ": "",
-       "ⱁ": "",
-       "ⱂ": "",
-       "ⱃ": "",
-       "ⱄ": "",
-       "ⱅ": "",
-       "ⱆ": "",
-       "ⱇ": "",
-       "ⱈ": "",
-       "ⱉ": "",
-       "ⱊ": "",
-       "ⱋ": "",
-       "ⱌ": "",
-       "ⱍ": "",
-       "ⱎ": "",
-       "ⱏ": "",
-       "ⱐ": "",
-       "ⱑ": "",
-       "ⱒ": "",
-       "ⱓ": "",
-       "ⱔ": "",
-       "ⱕ": "",
-       "ⱖ": "",
-       "ⱗ": "",
-       "ⱘ": "",
-       "ⱙ": "",
-       "ⱚ": "",
-       "ⱛ": "",
-       "ⱜ": "",
-       "ⱝ": "",
-       "ⱞ": "",
-       "ⱡ": "",
-       "ⱥ": "",
-       "ⱦ": "",
-       "ⱨ": "",
-       "ⱪ": "",
-       "ⱬ": "",
-       "ⱳ": "",
-       "ⱶ": "",
-       "ⲁ": "",
-       "ⲃ": "",
-       "ⲅ": "",
-       "ⲇ": "",
-       "ⲉ": "",
-       "ⲋ": "",
-       "ⲍ": "",
-       "ⲏ": "",
-       "ⲑ": "",
-       "ⲓ": "",
-       "ⲕ": "",
-       "ⲗ": "",
-       "ⲙ": "",
-       "ⲛ": "",
-       "ⲝ": "",
-       "ⲟ": "",
-       "ⲡ": "",
-       "ⲣ": "",
-       "ⲥ": "",
-       "ⲧ": "",
-       "ⲩ": "",
-       "ⲫ": "",
-       "ⲭ": "",
-       "ⲯ": "",
-       "ⲱ": "",
-       "ⲳ": "",
-       "ⲵ": "",
-       "ⲷ": "",
-       "ⲹ": "",
-       "ⲻ": "",
-       "ⲽ": "",
-       "ⲿ": "ⲿ",
-       "ⳁ": "",
-       "ⳃ": "",
-       "ⳅ": "",
-       "ⳇ": "",
-       "ⳉ": "",
-       "ⳋ": "",
-       "ⳍ": "",
-       "ⳏ": "",
-       "ⳑ": "",
-       "ⳓ": "",
-       "ⳕ": "",
-       "ⳗ": "",
-       "ⳙ": "",
-       "ⳛ": "",
-       "ⳝ": "",
-       "ⳟ": "",
-       "ⳡ": "",
-       "ⳣ": "",
-       "ⳬ": "",
-       "ⳮ": "",
-       "ⳳ": "",
-       "ⴀ": "",
-       "ⴁ": "",
-       "ⴂ": "",
-       "ⴃ": "",
-       "ⴄ": "",
-       "ⴅ": "",
-       "ⴆ": "",
-       "ⴇ": "",
-       "ⴈ": "",
-       "ⴉ": "",
-       "ⴊ": "",
-       "ⴋ": "",
-       "ⴌ": "",
-       "ⴍ": "",
-       "ⴎ": "",
-       "ⴏ": "",
-       "ⴐ": "",
-       "ⴑ": "",
-       "ⴒ": "",
-       "ⴓ": "",
-       "ⴔ": "",
-       "ⴕ": "",
-       "ⴖ": "",
-       "ⴗ": "",
-       "ⴘ": "",
-       "ⴙ": "",
-       "ⴚ": "",
-       "ⴛ": "",
-       "ⴜ": "",
-       "ⴝ": "",
-       "ⴞ": "",
-       "ⴟ": "",
-       "ⴠ": "",
-       "ⴡ": "",
-       "ⴢ": "",
-       "ⴣ": "",
-       "ⴤ": "",
-       "ⴥ": "",
-       "ⴧ": "",
-       "ⴭ": "",
-       "ꙁ": "",
-       "ꙃ": "",
-       "ꙅ": "",
-       "ꙇ": "",
-       "ꙉ": "",
-       "ꙋ": "",
-       "ꙍ": "",
-       "ꙏ": "",
-       "ꙑ": "",
-       "ꙓ": "",
-       "ꙕ": "",
-       "ꙗ": "",
-       "ꙙ": "",
-       "ꙛ": "",
-       "ꙝ": "",
-       "ꙟ": "",
-       "ꙡ": "",
-       "ꙣ": "",
-       "ꙥ": "",
-       "ꙧ": "",
-       "ꙩ": "",
-       "ꙫ": "",
-       "ꙭ": "",
-       "ꚁ": "",
-       "ꚃ": "",
-       "ꚅ": "",
-       "ꚇ": "",
-       "ꚉ": "",
-       "ꚋ": "",
-       "ꚍ": "",
-       "ꚏ": "",
-       "ꚑ": "",
-       "ꚓ": "",
-       "ꚕ": "",
-       "ꚗ": "",
-       "ꚙ": "",
-       "ꚛ": "",
-       "ꜣ": "",
-       "ꜥ": "",
-       "ꜧ": "",
-       "ꜩ": "",
-       "ꜫ": "",
-       "ꜭ": "",
-       "ꜯ": "",
-       "ꜳ": "",
-       "ꜵ": "",
-       "ꜷ": "",
-       "ꜹ": "",
-       "ꜻ": "",
-       "ꜽ": "",
-       "ꜿ": "",
-       "ꝁ": "",
-       "ꝃ": "",
-       "ꝅ": "",
-       "ꝇ": "",
-       "ꝉ": "",
-       "ꝋ": "",
-       "ꝍ": "",
-       "ꝏ": "",
-       "ꝑ": "",
-       "ꝓ": "",
-       "ꝕ": "",
-       "ꝗ": "",
-       "ꝙ": "",
-       "ꝛ": "",
-       "ꝝ": "",
-       "ꝟ": "",
-       "ꝡ": "",
-       "ꝣ": "",
-       "ꝥ": "",
-       "ꝧ": "",
-       "ꝩ": "",
-       "ꝫ": "",
-       "ꝭ": "",
-       "ꝯ": "",
-       "ꝺ": "",
-       "ꝼ": "",
-       "ꝿ": "",
-       "ꞁ": "",
-       "ꞃ": "",
-       "ꞅ": "",
-       "ꞇ": "",
-       "ꞌ": "",
-       "ꞑ": "",
-       "ꞓ": "",
-       "ꞔ": "",
-       "ꞗ": "",
-       "ꞙ": "",
-       "ꞛ": "",
-       "ꞝ": "",
-       "ꞟ": "",
-       "ꞡ": "",
-       "ꞣ": "",
-       "ꞥ": "",
-       "ꞧ": "",
-       "ꞩ": "",
-       "ꞵ": "",
-       "ꞷ": "",
-       "ꞹ": "",
-       "ꞻ": "",
-       "ꞽ": "",
-       "ꞿ": "",
-       "ꟃ": "",
-       "ꭓ": "",
-       "ꭰ": "",
-       "ꭱ": "",
-       "ꭲ": "",
-       "ꭳ": "",
-       "ꭴ": "",
-       "ꭵ": "",
-       "ꭶ": "",
-       "ꭷ": "",
-       "ꭸ": "",
-       "ꭹ": "",
-       "ꭺ": "",
-       "ꭻ": "",
-       "ꭼ": "",
-       "ꭽ": "",
-       "ꭾ": "",
-       "ꭿ": "ꭿ",
-       "ꮀ": "",
-       "ꮁ": "",
-       "ꮂ": "",
-       "ꮃ": "",
-       "ꮄ": "",
-       "ꮅ": "",
-       "ꮆ": "",
-       "ꮇ": "",
-       "ꮈ": "",
-       "ꮉ": "",
-       "ꮊ": "",
-       "ꮋ": "",
-       "ꮌ": "",
-       "ꮍ": "",
-       "ꮎ": "",
-       "ꮏ": "",
-       "ꮐ": "",
-       "ꮑ": "",
-       "ꮒ": "",
-       "ꮓ": "",
-       "ꮔ": "",
-       "ꮕ": "",
-       "ꮖ": "",
-       "ꮗ": "",
-       "ꮘ": "",
-       "ꮙ": "",
-       "ꮚ": "",
-       "ꮛ": "",
-       "ꮜ": "",
-       "ꮝ": "",
-       "ꮞ": "",
-       "ꮟ": "",
-       "ꮠ": "",
-       "ꮡ": "",
-       "ꮢ": "",
-       "ꮣ": "",
-       "ꮤ": "",
-       "ꮥ": "",
-       "ꮦ": "",
-       "ꮧ": "",
-       "ꮨ": "",
-       "ꮩ": "",
-       "ꮪ": "",
-       "ꮫ": "",
-       "ꮬ": "",
-       "ꮭ": "",
-       "ꮮ": "",
-       "ꮯ": "",
-       "ꮰ": "",
-       "ꮱ": "",
-       "ꮲ": "",
-       "ꮳ": "",
-       "ꮴ": "",
-       "ꮵ": "",
-       "ꮶ": "",
-       "ꮷ": "",
-       "ꮸ": "",
-       "ꮹ": "",
-       "ꮺ": "",
-       "ꮻ": "",
-       "ꮼ": "",
-       "ꮽ": "",
-       "ꮾ": "",
-       "ꮿ": "ꮿ",
-       "ff": "",
-       "fi": "",
-       "fl": "",
-       "ffi": "",
-       "ffl": "",
-       "ſt": "",
-       "st": "",
-       "ﬓ": "",
-       "ﬔ": "",
-       "ﬕ": "",
-       "ﬖ": "",
-       "ﬗ": "",
-       "𐑎": "𐑎",
-       "𐑏": "𐑏",
-       "𐓘": "𐓘",
-       "𐓙": "𐓙",
-       "𐓚": "𐓚",
-       "𐓛": "𐓛",
-       "𐓜": "𐓜",
-       "𐓝": "𐓝",
-       "𐓞": "𐓞",
-       "𐓟": "𐓟",
-       "𐓠": "𐓠",
-       "𐓡": "𐓡",
-       "𐓢": "𐓢",
-       "𐓣": "𐓣",
-       "𐓤": "𐓤",
-       "𐓥": "𐓥",
-       "𐓦": "𐓦",
-       "𐓧": "𐓧",
-       "𐓨": "𐓨",
-       "𐓩": "𐓩",
-       "𐓪": "𐓪",
-       "𐓫": "𐓫",
-       "𐓬": "𐓬",
-       "𐓭": "𐓭",
-       "𐓮": "𐓮",
-       "𐓯": "𐓯",
-       "𐓰": "𐓰",
-       "𐓱": "𐓱",
-       "𐓲": "𐓲",
-       "𐓳": "𐓳",
-       "𐓴": "𐓴",
-       "𐓵": "𐓵",
-       "𐓶": "𐓶",
-       "𐓷": "𐓷",
-       "𐓸": "𐓸",
-       "𐓹": "𐓹",
-       "𐓺": "𐓺",
-       "𐓻": "𐓻",
-       "𐳀": "𐳀",
-       "𐳁": "𐳁",
-       "𐳂": "𐳂",
-       "𐳃": "𐳃",
-       "𐳄": "𐳄",
-       "𐳅": "𐳅",
-       "𐳆": "𐳆",
-       "𐳇": "𐳇",
-       "𐳈": "𐳈",
-       "𐳉": "𐳉",
-       "𐳊": "𐳊",
-       "𐳋": "𐳋",
-       "𐳌": "𐳌",
-       "𐳍": "𐳍",
-       "𐳎": "𐳎",
-       "𐳏": "𐳏",
-       "𐳐": "𐳐",
-       "𐳑": "𐳑",
-       "𐳒": "𐳒",
-       "𐳓": "𐳓",
-       "𐳔": "𐳔",
-       "𐳕": "𐳕",
-       "𐳖": "𐳖",
-       "𐳗": "𐳗",
-       "𐳘": "𐳘",
-       "𐳙": "𐳙",
-       "𐳚": "𐳚",
-       "𐳛": "𐳛",
-       "𐳜": "𐳜",
-       "𐳝": "𐳝",
-       "𐳞": "𐳞",
-       "𐳟": "𐳟",
-       "𐳠": "𐳠",
-       "𐳡": "𐳡",
-       "𐳢": "𐳢",
-       "𐳣": "𐳣",
-       "𐳤": "𐳤",
-       "𐳥": "𐳥",
-       "𐳦": "𐳦",
-       "𐳧": "𐳧",
-       "𐳨": "𐳨",
-       "𐳩": "𐳩",
-       "𐳪": "𐳪",
-       "𐳫": "𐳫",
-       "𐳬": "𐳬",
-       "𐳭": "𐳭",
-       "𐳮": "𐳮",
-       "𐳯": "𐳯",
-       "𐳰": "𐳰",
-       "𐳱": "𐳱",
-       "𐳲": "𐳲",
-       "𑣀": "𑣀",
-       "𑣁": "𑣁",
-       "𑣂": "𑣂",
-       "𑣃": "𑣃",
-       "𑣄": "𑣄",
-       "𑣅": "𑣅",
-       "𑣆": "𑣆",
-       "𑣇": "𑣇",
-       "𑣈": "𑣈",
-       "𑣉": "𑣉",
-       "𑣊": "𑣊",
-       "𑣋": "𑣋",
-       "𑣌": "𑣌",
-       "𑣍": "𑣍",
-       "𑣎": "𑣎",
-       "𑣏": "𑣏",
-       "𑣐": "𑣐",
-       "𑣑": "𑣑",
-       "𑣒": "𑣒",
-       "𑣓": "𑣓",
-       "𑣔": "𑣔",
-       "𑣕": "𑣕",
-       "𑣖": "𑣖",
-       "𑣗": "𑣗",
-       "𑣘": "𑣘",
-       "𑣙": "𑣙",
-       "𑣚": "𑣚",
-       "𑣛": "𑣛",
-       "𑣜": "𑣜",
-       "𑣝": "𑣝",
-       "𑣞": "𑣞",
-       "𑣟": "𑣟",
-       "𖹠": "𖹠",
-       "𖹡": "𖹡",
-       "𖹢": "𖹢",
-       "𖹣": "𖹣",
-       "𖹤": "𖹤",
-       "𖹥": "𖹥",
-       "𖹦": "𖹦",
-       "𖹧": "𖹧",
-       "𖹨": "𖹨",
-       "𖹩": "𖹩",
-       "𖹪": "𖹪",
-       "𖹫": "𖹫",
-       "𖹬": "𖹬",
-       "𖹭": "𖹭",
-       "𖹮": "𖹮",
-       "𖹯": "𖹯",
-       "𖹰": "𖹰",
-       "𖹱": "𖹱",
-       "𖹲": "𖹲",
-       "𖹳": "𖹳",
-       "𖹴": "𖹴",
-       "𖹵": "𖹵",
-       "𖹶": "𖹶",
-       "𖹷": "𖹷",
-       "𖹸": "𖹸",
-       "𖹹": "𖹹",
-       "𖹺": "𖹺",
-       "𖹻": "𖹻",
-       "𖹼": "𖹼",
-       "𖹽": "𖹽",
-       "𖹾": "𖹾",
-       "𖹿": "𖹿",
-       "𞤢": "𞤢",
-       "𞤣": "𞤣",
-       "𞤤": "𞤤",
-       "𞤥": "𞤥",
-       "𞤦": "𞤦",
-       "𞤧": "𞤧",
-       "𞤨": "𞤨",
-       "𞤩": "𞤩",
-       "𞤪": "𞤪",
-       "𞤫": "𞤫",
-       "𞤬": "𞤬",
-       "𞤭": "𞤭",
-       "𞤮": "𞤮",
-       "𞤯": "𞤯",
-       "𞤰": "𞤰",
-       "𞤱": "𞤱",
-       "𞤲": "𞤲",
-       "𞤳": "𞤳",
-       "𞤴": "𞤴",
-       "𞤵": "𞤵",
-       "𞤶": "𞤶",
-       "𞤷": "𞤷",
-       "𞤸": "𞤸",
-       "𞤹": "𞤹",
-       "𞤺": "𞤺",
-       "𞤻": "𞤻",
-       "𞤼": "𞤼",
-       "𞤽": "𞤽",
-       "𞤾": "𞤾",
-       "𞤿": "𞤿",
-       "𞥀": "𞥀",
-       "𞥁": "𞥁",
-       "𞥂": "𞥂",
-       "𞥃": "𞥃"
+       "ῴ": "",
+       "ῶ": "",
+       "ῷ": "",
+       "ῼ": "",
+       "ⅎ": "",
+       "ⅰ": "",
+       "ⅱ": "",
+       "ⅲ": "",
+       "ⅳ": "",
+       "ⅴ": "",
+       "ⅵ": "",
+       "ⅶ": "",
+       "ⅷ": "",
+       "ⅸ": "",
+       "ⅹ": "",
+       "ⅺ": "",
+       "ⅻ": "",
+       "ⅼ": "",
+       "ⅽ": "",
+       "ⅾ": "",
+       "ⅿ": "",
+       "ↄ": "",
+       "ⓐ": "",
+       "ⓑ": "",
+       "ⓒ": "",
+       "ⓓ": "",
+       "ⓔ": "",
+       "ⓕ": "",
+       "ⓖ": "",
+       "ⓗ": "",
+       "ⓘ": "",
+       "ⓙ": "",
+       "ⓚ": "",
+       "ⓛ": "",
+       "ⓜ": "",
+       "ⓝ": "",
+       "ⓞ": "",
+       "ⓟ": "",
+       "ⓠ": "",
+       "ⓡ": "",
+       "ⓢ": "",
+       "ⓣ": "",
+       "ⓤ": "",
+       "ⓥ": "",
+       "ⓦ": "",
+       "ⓧ": "",
+       "ⓨ": "",
+       "ⓩ": "",
+       "ⰰ": "",
+       "ⰱ": "",
+       "ⰲ": "",
+       "ⰳ": "",
+       "ⰴ": "",
+       "ⰵ": "",
+       "ⰶ": "",
+       "ⰷ": "",
+       "ⰸ": "",
+       "ⰹ": "",
+       "ⰺ": "",
+       "ⰻ": "",
+       "ⰼ": "",
+       "ⰽ": "",
+       "ⰾ": "",
+       "ⰿ": "",
+       "ⱀ": "",
+       "ⱁ": "",
+       "ⱂ": "",
+       "ⱃ": "",
+       "ⱄ": "",
+       "ⱅ": "",
+       "ⱆ": "",
+       "ⱇ": "",
+       "ⱈ": "",
+       "ⱉ": "",
+       "ⱊ": "",
+       "ⱋ": "",
+       "ⱌ": "",
+       "ⱍ": "",
+       "ⱎ": "",
+       "ⱏ": "",
+       "ⱐ": "",
+       "ⱑ": "",
+       "ⱒ": "",
+       "ⱓ": "",
+       "ⱔ": "",
+       "ⱕ": "",
+       "ⱖ": "",
+       "ⱗ": "",
+       "ⱘ": "",
+       "ⱙ": "",
+       "ⱚ": "",
+       "ⱛ": "",
+       "ⱜ": "",
+       "ⱝ": "",
+       "ⱞ": "",
+       "ⱡ": "",
+       "ⱥ": "",
+       "ⱦ": "",
+       "ⱨ": "",
+       "ⱪ": "",
+       "ⱬ": "",
+       "ⱳ": "",
+       "ⱶ": "",
+       "ⲁ": "",
+       "ⲃ": "",
+       "ⲅ": "",
+       "ⲇ": "",
+       "ⲉ": "",
+       "ⲋ": "",
+       "ⲍ": "",
+       "ⲏ": "",
+       "ⲑ": "",
+       "ⲓ": "",
+       "ⲕ": "",
+       "ⲗ": "",
+       "ⲙ": "",
+       "ⲛ": "",
+       "ⲝ": "",
+       "ⲟ": "",
+       "ⲡ": "",
+       "ⲣ": "",
+       "ⲥ": "",
+       "ⲧ": "",
+       "ⲩ": "",
+       "ⲫ": "",
+       "ⲭ": "",
+       "ⲯ": "",
+       "ⲱ": "",
+       "ⲳ": "",
+       "ⲵ": "",
+       "ⲷ": "",
+       "ⲹ": "",
+       "ⲻ": "",
+       "ⲽ": "",
+       "ⲿ": "",
+       "ⳁ": "",
+       "ⳃ": "",
+       "ⳅ": "",
+       "ⳇ": "",
+       "ⳉ": "",
+       "ⳋ": "",
+       "ⳍ": "",
+       "ⳏ": "",
+       "ⳑ": "",
+       "ⳓ": "",
+       "ⳕ": "",
+       "ⳗ": "",
+       "ⳙ": "",
+       "ⳛ": "",
+       "ⳝ": "",
+       "ⳟ": "",
+       "ⳡ": "",
+       "ⳣ": "",
+       "ⳬ": "",
+       "ⳮ": "",
+       "ⳳ": "",
+       "ⴀ": "",
+       "ⴁ": "",
+       "ⴂ": "",
+       "ⴃ": "",
+       "ⴄ": "",
+       "ⴅ": "",
+       "ⴆ": "",
+       "ⴇ": "",
+       "ⴈ": "",
+       "ⴉ": "",
+       "ⴊ": "",
+       "ⴋ": "",
+       "ⴌ": "",
+       "ⴍ": "",
+       "ⴎ": "",
+       "ⴏ": "",
+       "ⴐ": "",
+       "ⴑ": "",
+       "ⴒ": "",
+       "ⴓ": "",
+       "ⴔ": "",
+       "ⴕ": "",
+       "ⴖ": "",
+       "ⴗ": "",
+       "ⴘ": "",
+       "ⴙ": "",
+       "ⴚ": "",
+       "ⴛ": "",
+       "ⴜ": "",
+       "ⴝ": "",
+       "ⴞ": "",
+       "ⴟ": "",
+       "ⴠ": "",
+       "ⴡ": "",
+       "ⴢ": "",
+       "ⴣ": "",
+       "ⴤ": "",
+       "ⴥ": "",
+       "ⴧ": "",
+       "ⴭ": "",
+       "ꙁ": "",
+       "ꙃ": "",
+       "ꙅ": "",
+       "ꙇ": "",
+       "ꙉ": "",
+       "ꙋ": "",
+       "ꙍ": "",
+       "ꙏ": "",
+       "ꙑ": "",
+       "ꙓ": "",
+       "ꙕ": "",
+       "ꙗ": "",
+       "ꙙ": "",
+       "ꙛ": "",
+       "ꙝ": "",
+       "ꙟ": "",
+       "ꙡ": "",
+       "ꙣ": "",
+       "ꙥ": "",
+       "ꙧ": "",
+       "ꙩ": "",
+       "ꙫ": "",
+       "ꙭ": "",
+       "ꚁ": "",
+       "ꚃ": "",
+       "ꚅ": "",
+       "ꚇ": "",
+       "ꚉ": "",
+       "ꚋ": "",
+       "ꚍ": "",
+       "ꚏ": "",
+       "ꚑ": "",
+       "ꚓ": "",
+       "ꚕ": "",
+       "ꚗ": "",
+       "ꚙ": "",
+       "ꚛ": "",
+       "ꜣ": "",
+       "ꜥ": "",
+       "ꜧ": "",
+       "ꜩ": "",
+       "ꜫ": "",
+       "ꜭ": "",
+       "ꜯ": "",
+       "ꜳ": "",
+       "ꜵ": "",
+       "ꜷ": "",
+       "ꜹ": "",
+       "ꜻ": "",
+       "ꜽ": "",
+       "ꜿ": "",
+       "ꝁ": "",
+       "ꝃ": "",
+       "ꝅ": "",
+       "ꝇ": "",
+       "ꝉ": "",
+       "ꝋ": "",
+       "ꝍ": "",
+       "ꝏ": "",
+       "ꝑ": "",
+       "ꝓ": "",
+       "ꝕ": "",
+       "ꝗ": "",
+       "ꝙ": "",
+       "ꝛ": "",
+       "ꝝ": "",
+       "ꝟ": "",
+       "ꝡ": "",
+       "ꝣ": "",
+       "ꝥ": "",
+       "ꝧ": "",
+       "ꝩ": "",
+       "ꝫ": "",
+       "ꝭ": "",
+       "ꝯ": "",
+       "ꝺ": "",
+       "ꝼ": "",
+       "ꝿ": "",
+       "ꞁ": "",
+       "ꞃ": "",
+       "ꞅ": "",
+       "ꞇ": "",
+       "ꞌ": "",
+       "ꞑ": "",
+       "ꞓ": "",
+       "ꞔ": "",
+       "ꞗ": "",
+       "ꞙ": "",
+       "ꞛ": "",
+       "ꞝ": "",
+       "ꞟ": "",
+       "ꞡ": "",
+       "ꞣ": "",
+       "ꞥ": "",
+       "ꞧ": "",
+       "ꞩ": "",
+       "ꞵ": "",
+       "ꞷ": "",
+       "ꞹ": "",
+       "ꞻ": "",
+       "ꞽ": "",
+       "ꞿ": "",
+       "ꟃ": "",
+       "ꭓ": "",
+       "ꭰ": "",
+       "ꭱ": "",
+       "ꭲ": "",
+       "ꭳ": "",
+       "ꭴ": "",
+       "ꭵ": "",
+       "ꭶ": "",
+       "ꭷ": "",
+       "ꭸ": "",
+       "ꭹ": "",
+       "ꭺ": "",
+       "ꭻ": "",
+       "ꭼ": "",
+       "ꭽ": "",
+       "ꭾ": "",
+       "ꭿ": "",
+       "ꮀ": "",
+       "ꮁ": "",
+       "ꮂ": "",
+       "ꮃ": "",
+       "ꮄ": "",
+       "ꮅ": "",
+       "ꮆ": "",
+       "ꮇ": "",
+       "ꮈ": "",
+       "ꮉ": "",
+       "ꮊ": "",
+       "ꮋ": "",
+       "ꮌ": "",
+       "ꮍ": "",
+       "ꮎ": "",
+       "ꮏ": "",
+       "ꮐ": "",
+       "ꮑ": "",
+       "ꮒ": "",
+       "ꮓ": "",
+       "ꮔ": "",
+       "ꮕ": "",
+       "ꮖ": "",
+       "ꮗ": "",
+       "ꮘ": "",
+       "ꮙ": "",
+       "ꮚ": "",
+       "ꮛ": "",
+       "ꮜ": "",
+       "ꮝ": "",
+       "ꮞ": "",
+       "ꮟ": "",
+       "ꮠ": "",
+       "ꮡ": "",
+       "ꮢ": "",
+       "ꮣ": "",
+       "ꮤ": "",
+       "ꮥ": "",
+       "ꮦ": "",
+       "ꮧ": "",
+       "ꮨ": "",
+       "ꮩ": "",
+       "ꮪ": "",
+       "ꮫ": "",
+       "ꮬ": "",
+       "ꮭ": "",
+       "ꮮ": "",
+       "ꮯ": "",
+       "ꮰ": "",
+       "ꮱ": "",
+       "ꮲ": "",
+       "ꮳ": "",
+       "ꮴ": "",
+       "ꮵ": "",
+       "ꮶ": "",
+       "ꮷ": "",
+       "ꮸ": "",
+       "ꮹ": "",
+       "ꮺ": "",
+       "ꮻ": "",
+       "ꮼ": "",
+       "ꮽ": "",
+       "ꮾ": "",
+       "ꮿ": "",
+       "ff": "",
+       "fi": "",
+       "fl": "",
+       "ffi": "",
+       "ffl": "",
+       "ſt": "",
+       "st": "",
+       "ﬓ": "",
+       "ﬔ": "",
+       "ﬕ": "",
+       "ﬖ": "",
+       "ﬗ": "",
+       "𐑎": "",
+       "𐑏": "",
+       "𐓘": "",
+       "𐓙": "",
+       "𐓚": "",
+       "𐓛": "",
+       "𐓜": "",
+       "𐓝": "",
+       "𐓞": "",
+       "𐓟": "",
+       "𐓠": "",
+       "𐓡": "",
+       "𐓢": "",
+       "𐓣": "",
+       "𐓤": "",
+       "𐓥": "",
+       "𐓦": "",
+       "𐓧": "",
+       "𐓨": "",
+       "𐓩": "",
+       "𐓪": "",
+       "𐓫": "",
+       "𐓬": "",
+       "𐓭": "",
+       "𐓮": "",
+       "𐓯": "",
+       "𐓰": "",
+       "𐓱": "",
+       "𐓲": "",
+       "𐓳": "",
+       "𐓴": "",
+       "𐓵": "",
+       "𐓶": "",
+       "𐓷": "",
+       "𐓸": "",
+       "𐓹": "",
+       "𐓺": "",
+       "𐓻": "",
+       "𐳀": "",
+       "𐳁": "",
+       "𐳂": "",
+       "𐳃": "",
+       "𐳄": "",
+       "𐳅": "",
+       "𐳆": "",
+       "𐳇": "",
+       "𐳈": "",
+       "𐳉": "",
+       "𐳊": "",
+       "𐳋": "",
+       "𐳌": "",
+       "𐳍": "",
+       "𐳎": "",
+       "𐳏": "",
+       "𐳐": "",
+       "𐳑": "",
+       "𐳒": "",
+       "𐳓": "",
+       "𐳔": "",
+       "𐳕": "",
+       "𐳖": "",
+       "𐳗": "",
+       "𐳘": "",
+       "𐳙": "",
+       "𐳚": "",
+       "𐳛": "",
+       "𐳜": "",
+       "𐳝": "",
+       "𐳞": "",
+       "𐳟": "",
+       "𐳠": "",
+       "𐳡": "",
+       "𐳢": "",
+       "𐳣": "",
+       "𐳤": "",
+       "𐳥": "",
+       "𐳦": "",
+       "𐳧": "",
+       "𐳨": "",
+       "𐳩": "",
+       "𐳪": "",
+       "𐳫": "",
+       "𐳬": "",
+       "𐳭": "",
+       "𐳮": "",
+       "𐳯": "",
+       "𐳰": "",
+       "𐳱": "",
+       "𐳲": "",
+       "𑣀": "",
+       "𑣁": "",
+       "𑣂": "",
+       "𑣃": "",
+       "𑣄": "",
+       "𑣅": "",
+       "𑣆": "",
+       "𑣇": "",
+       "𑣈": "",
+       "𑣉": "",
+       "𑣊": "",
+       "𑣋": "",
+       "𑣌": "",
+       "𑣍": "",
+       "𑣎": "",
+       "𑣏": "",
+       "𑣐": "",
+       "𑣑": "",
+       "𑣒": "",
+       "𑣓": "",
+       "𑣔": "",
+       "𑣕": "",
+       "𑣖": "",
+       "𑣗": "",
+       "𑣘": "",
+       "𑣙": "",
+       "𑣚": "",
+       "𑣛": "",
+       "𑣜": "",
+       "𑣝": "",
+       "𑣞": "",
+       "𑣟": "",
+       "𖹠": "",
+       "𖹡": "",
+       "𖹢": "",
+       "𖹣": "",
+       "𖹤": "",
+       "𖹥": "",
+       "𖹦": "",
+       "𖹧": "",
+       "𖹨": "",
+       "𖹩": "",
+       "𖹪": "",
+       "𖹫": "",
+       "𖹬": "",
+       "𖹭": "",
+       "𖹮": "",
+       "𖹯": "",
+       "𖹰": "",
+       "𖹱": "",
+       "𖹲": "",
+       "𖹳": "",
+       "𖹴": "",
+       "𖹵": "",
+       "𖹶": "",
+       "𖹷": "",
+       "𖹸": "",
+       "𖹹": "",
+       "𖹺": "",
+       "𖹻": "",
+       "𖹼": "",
+       "𖹽": "",
+       "𖹾": "",
+       "𖹿": "",
+       "𞤢": "",
+       "𞤣": "",
+       "𞤤": "",
+       "𞤥": "",
+       "𞤦": "",
+       "𞤧": "",
+       "𞤨": "",
+       "𞤩": "",
+       "𞤪": "",
+       "𞤫": "",
+       "𞤬": "",
+       "𞤭": "",
+       "𞤮": "",
+       "𞤯": "",
+       "𞤰": "",
+       "𞤱": "",
+       "𞤲": "",
+       "𞤳": "",
+       "𞤴": "",
+       "𞤵": "",
+       "𞤶": "",
+       "𞤷": "",
+       "𞤸": "",
+       "𞤹": "",
+       "𞤺": "",
+       "𞤻": "",
+       "𞤼": "",
+       "𞤽": "",
+       "𞤾": "",
+       "𞤿": "",
+       "𞥀": "",
+       "𞥁": "",
+       "𞥂": "",
+       "𞥃": ""
 }
index b6aa5fd..2bf685e 100644 (file)
@@ -4,57 +4,58 @@
  * @class mw.errorLogger
  * @singleton
  */
-( function () {
-       'use strict';
+mw.errorLogger = {
+       /**
+        * Fired via mw.track when an error is not handled by local code and is caught by the
+        * window.onerror handler.
+        *
+        * @event global_error
+        * @param {string} errorMessage Error errorMessage.
+        * @param {string} url URL where error was raised.
+        * @param {number} lineNumber Line number where error was raised.
+        * @param {number} [columnNumber] Line number where error was raised. Not all browsers
+        *   support this.
+        * @param {Error|Mixed} [errorObject] The error object. Typically an instance of Error, but anything
+        *   (even a primitive value) passed to a throw clause will end up here.
+        */
 
-       mw.errorLogger = {
-               /**
-                * Fired via mw.track when an error is not handled by local code and is caught by the
-                * window.onerror handler.
-                *
-                * @event global_error
-                * @param {string} errorMessage Error errorMessage.
-                * @param {string} url URL where error was raised.
-                * @param {number} lineNumber Line number where error was raised.
-                * @param {number} [columnNumber] Line number where error was raised. Not all browsers
-                *   support this.
-                * @param {Error|Mixed} [errorObject] The error object. Typically an instance of Error, but anything
-                *   (even a primitive value) passed to a throw clause will end up here.
-                */
+       /**
+        * Install a window.onerror handler that will report via mw.track, while preserving
+        * any previous handler.
+        *
+        * @param {Object} window
+        */
+       installGlobalHandler: function ( window ) {
+               // We will preserve the return value of the previous handler. window.onerror works the
+               // opposite way than normal event handlers (returning true will prevent the default
+               // action, returning false will let the browser handle the error normally, by e.g.
+               // logging to the console), so our fallback old handler needs to return false.
+               var oldHandler = window.onerror || function () {
+                       return false;
+               };
 
                /**
-                * Install a window.onerror handler that will report via mw.track, while preserving
-                * any previous handler.
+                * Dumb window.onerror handler which forwards the errors via mw.track.
                 *
-                * @param {Object} window
+                * @param {string} errorMessage
+                * @param {string} url
+                * @param {number} lineNumber
+                * @param {number} [columnNumber]
+                * @param {Error|Mixed} [errorObject]
+                * @return {boolean} True to prevent the default action
+                * @fires global_error
                 */
-               installGlobalHandler: function ( window ) {
-                       // We will preserve the return value of the previous handler. window.onerror works the
-                       // opposite way than normal event handlers (returning true will prevent the default
-                       // action, returning false will let the browser handle the error normally, by e.g.
-                       // logging to the console), so our fallback old handler needs to return false.
-                       var oldHandler = window.onerror || function () {
-                               return false;
-                       };
-
-                       /**
-                        * Dumb window.onerror handler which forwards the errors via mw.track.
-                        *
-                        * @param {string} errorMessage
-                        * @param {string} url
-                        * @param {number} lineNumber
-                        * @param {number} [columnNumber]
-                        * @param {Error|Mixed} [errorObject]
-                        * @return {boolean} True to prevent the default action
-                        * @fires global_error
-                        */
-                       window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
-                               mw.track( 'global.error', { errorMessage: errorMessage, url: url,
-                                       lineNumber: lineNumber, columnNumber: columnNumber, errorObject: errorObject } );
-                               return oldHandler.apply( this, arguments );
-                       };
-               }
-       };
+               window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
+                       mw.track( 'global.error', {
+                               errorMessage: errorMessage,
+                               url: url,
+                               lineNumber: lineNumber,
+                               columnNumber: columnNumber,
+                               errorObject: errorObject
+                       } );
+                       return oldHandler.apply( this, arguments );
+               };
+       }
+};
 
-       mw.errorLogger.installGlobalHandler( window );
-}() );
+mw.errorLogger.installGlobalHandler( window );
index 33207d4..473635a 100644 (file)
@@ -3,14 +3,6 @@
        // FIXME: mw.htmlform.Element also sets this to empty object
        mw.htmlform = {};
 
-       function debounce( delay, callback ) {
-               var timeout;
-               return function () {
-                       clearTimeout( timeout );
-                       timeout = setTimeout( Function.prototype.apply.bind( callback, this, arguments ), delay );
-               };
-       }
-
        /**
         * @class mw.htmlform.Checker
         */
@@ -60,7 +52,7 @@
                if ( $extraElements ) {
                        $e = $e.add( $extraElements );
                }
-               $e.on( events, debounce( 1000, this.validate.bind( this ) ) );
+               $e.on( events, mw.util.debounce( 1000, this.validate.bind( this ) ) );
 
                return this;
        };
index 470d826..22dc924 100644 (file)
@@ -6,6 +6,7 @@
 @ooui-font-size-browser: 16; // assumed browser default of `16px`
 @ooui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
 
+@ooui-spacing-small: 8 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.57142857em`≈`8px`
 @ooui-spacing-medium: 12 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.8571429em`≈`12px`
 @ooui-spacing-large: 16 / @ooui-font-size-browser / @ooui-font-size-base; // equals `1.1428571em`≈`16px`
 @ooui-padding-horizontal: 12 / @ooui-font-size-browser / @ooui-font-size-base;
        // Reducing `padding-top`, as the heading's `line-height` provides similar distance.
        padding: @ooui-spacing-medium @ooui-spacing-large @ooui-spacing-large;
 
-       // Trigger only when collapsible & JS is available via `.mw-collapsed`.
-       .client-js & .oo-ui-fieldsetLayout.mw-collapsed .oo-ui-fieldsetLayout-header {
-               // Negative margin to match the reduced distance on the top caused by the previous rule.
-               margin-bottom: -( @ooui-spacing-large - @ooui-spacing-medium );
+       .client-js & .oo-ui-fieldsetLayout.mw-collapsible .oo-ui-fieldsetLayout-header {
+               // Push legend up when JS is on, to increase clickable area.
+               margin-top: -@ooui-spacing-small;
+               margin-bottom: @ooui-spacing-small;
+               // Add `padding-top` to make up for negative `margin` above.
+               padding: @ooui-spacing-small;
+               // Make space for toggle icon defined below.
+               padding-left: 24 / @ooui-font-size-browser / @ooui-font-size-base;
 
                .oo-ui-labelElement-label {
                        margin-bottom: 0;
                }
        }
+
+       // Trigger only when collapsible & JS is available via `.mw-collapsed`.
+       .client-js & .oo-ui-fieldsetLayout.mw-collapsed .oo-ui-fieldsetLayout-header {
+               min-height: 30px;
+               // Negative margin to match the reduced distance on the top caused by the previous rule.
+               margin-bottom: -@ooui-spacing-medium;
+       }
 }
 
 .mw-htmlform-ooui {
 .mw-htmlform-ooui .mw-htmlform-submit-buttons {
        margin-top: @ooui-spacing-medium;
 }
+
+.oo-ui-fieldsetLayout.mw-collapsible {
+       .oo-ui-fieldsetLayout-header {
+               max-width: none;
+       }
+
+       .mw-collapsible-toggle .oo-ui-iconElement-icon {
+               position: absolute;
+               top: 0;
+               left: 0;
+               // Special case: Reduce to `16px` icon size here.
+               min-width: 16px;
+               width: 16 / @ooui-font-size-browser / @ooui-font-size-base;
+               margin-right: 0.5em;
+       }
+
+       // When expanded: only 'collapse' icon visible
+       .mw-collapsible-toggle .oo-ui-icon-expand {
+               display: none;
+       }
+
+       // When collapsed: only 'expand' icon visible
+       &.mw-collapsed {
+               .mw-collapsible-toggle .oo-ui-icon-expand {
+                       display: inline-block;
+               }
+
+               .mw-collapsible-toggle .oo-ui-icon-collapse {
+                       display: none;
+               }
+       }
+}
index 3b99696..13ef390 100644 (file)
@@ -354,7 +354,7 @@ a.new {
        font-weight: bold;
 }
 
-/* Error, warning and success messages */
+/* Error, warning, success and neutral messages */
 .error,
 .warning,
 .success {
@@ -373,41 +373,45 @@ a.new {
        color: #14866d;
 }
 
+.messagebox,
 .errorbox,
 .warningbox,
 .successbox {
+       color: #000;
+       margin-bottom: 1em;
        border: 1px solid;
        padding: 0.5em 1em;
-       margin-bottom: 1em;
-       display: inline-block;
 }
 
+.messagebox h2,
 .errorbox h2,
 .warningbox h2,
 .successbox h2 {
        color: inherit;
-       font-size: 1em;
-       font-weight: bold;
        display: inline;
        margin: 0 0.5em 0 0;
        border: 0;
+       font-size: 1em;
+       font-weight: bold;
+}
+
+.messagebox {
+       background-color: #eaecf0;
+       border-color: #a2a9b1;
 }
 
 .errorbox {
        background-color: #fee7e6;
-       color: #000;
        border-color: #d33;
 }
 
 .warningbox {
        background-color: #fef6e7;
-       color: #000;
        border-color: #fc3;
 }
 
 .successbox {
        background-color: #d5fdf4;
-       color: #000;
        border-color: #14866d;
 }
 
@@ -431,15 +435,9 @@ a.new {
 
 /* Note on preview page */
 .previewnote {
-       color: #d33;
        margin-bottom: 1em;
 }
 
-.previewnote p {
-       text-indent: 3em;
-       margin: 0.8em 0;
-}
-
 .visualClear {
        clear: both;
 }
index 667c2ba..a36e409 100644 (file)
@@ -24,7 +24,7 @@
                this.drawCarousel();
                this.setSizeRequirement();
                this.toggleThumbnails( !!this.$gallery.attr( 'data-showthumbnails' ) );
-               this.showCurrentImage();
+               this.showCurrentImage( true );
 
                // Events
                $( window ).on(
 
        /**
         * Displays the image set as {@link #$currentImage} in the carousel.
+        *
+        * @param {boolean} init Image being show during gallery init (i.e. first image)
         */
-       mw.GallerySlideshow.prototype.showCurrentImage = function () {
+       mw.GallerySlideshow.prototype.showCurrentImage = function ( init ) {
                var $thumbnail, $imgLink,
                        $imageLi = this.getCurrentImage(),
                        $caption = $imageLi.find( '.gallerytext' );
                        if ( this.$thumbnail.attr( 'src' ) === $thumbnail.attr( 'src' ) ) {
                                this.$img.attr( 'src', info.thumburl );
                                this.setImageSize();
-                               mw.hook( 'wikipage.content' ).fire( this.$imgContainer );
+                               // Don't fire hook twice during init
+                               if ( !init ) {
+                                       mw.hook( 'wikipage.content' ).fire( this.$imgContainer );
+                               }
 
                                // Pre-fetch the next image
                                this.loadImage( this.getNextImage().find( 'img' ) );
index 4541c58..a0ac0ca 100644 (file)
                        // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
                        // We avoid using the URL in the link directly since it could have been manipulated (T68608)
                        page = Number( mw.util.getParamValue( 'page', this.href ) );
-                       url = mw.util.getUrl( mw.config.get( 'wgPageName' ), { page: page } );
+                       url = mw.util.getUrl( null, { page: page } );
 
                        switchPage( url );
                        e.preventDefault();
diff --git a/resources/src/mediawiki.page.ready.js b/resources/src/mediawiki.page.ready.js
deleted file mode 100644 (file)
index 0e59da6..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-( function () {
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $sortable, $collapsible;
-
-               $collapsible = $content.find( '.mw-collapsible' );
-               if ( $collapsible.length ) {
-                       // Preloaded by Skin::getDefaultModules()
-                       mw.loader.using( 'jquery.makeCollapsible', function () {
-                               $collapsible.makeCollapsible();
-                       } );
-               }
-
-               $sortable = $content.find( 'table.sortable' );
-               if ( $sortable.length ) {
-                       // Preloaded by Skin::getDefaultModules()
-                       mw.loader.using( 'jquery.tablesorter', function () {
-                               $sortable.tablesorter();
-                       } );
-               }
-
-               // Run jquery.checkboxShiftClick
-               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
-       } );
-
-       // Things outside the wikipage content
-       $( function () {
-               var $nodes;
-
-               // Add accesskey hints to the tooltips
-               $( '[accesskey]' ).updateTooltipAccessKeys();
-
-               $nodes = $( '.catlinks[data-mw="interface"]' );
-               if ( $nodes.length ) {
-                       /**
-                        * Fired when categories are being added to the DOM
-                        *
-                        * It is encouraged to fire it before the main DOM is changed (when $content
-                        * is still detached).  However, this order is not defined either way, so you
-                        * should only rely on $content itself.
-                        *
-                        * This includes the ready event on a page load (including post-edit loads)
-                        * and when content has been previewed with LivePreview.
-                        *
-                        * @event wikipage_categories
-                        * @member mw.hook
-                        * @param {jQuery} $content The most appropriate element containing the content,
-                        *   such as .catlinks
-                        */
-                       mw.hook( 'wikipage.categories' ).fire( $nodes );
-               }
-
-               $( '#t-print a' ).on( 'click', function ( e ) {
-                       window.print();
-                       e.preventDefault();
-               } );
-
-               // Turn logout to a POST action
-               $( '#pt-logout a' ).on( 'click', function ( e ) {
-                       var api = new mw.Api(),
-                               returnUrl = $( '#pt-logout a' ).attr( 'href' );
-                       mw.notify(
-                               mw.message( 'logging-out-notify' ),
-                               { tag: 'logout', autoHide: false }
-                       );
-                       api.postWithToken( 'csrf', {
-                               action: 'logout'
-                       } ).then(
-                               function () {
-                                       location.href = returnUrl;
-                               },
-                               function ( e ) {
-                                       mw.notify(
-                                               mw.message( 'logout-failed', e ),
-                                               { type: 'error', tag: 'logout', autoHide: false }
-                                       );
-                               }
-                       );
-                       e.preventDefault();
-               } );
-       } );
-
-}() );
diff --git a/resources/src/mediawiki.page.ready/.eslintrc.json b/resources/src/mediawiki.page.ready/.eslintrc.json
new file mode 100644 (file)
index 0000000..ad8dbb3
--- /dev/null
@@ -0,0 +1,5 @@
+{
+       "parserOptions": {
+               "sourceType": "module"
+       }
+}
diff --git a/resources/src/mediawiki.page.ready/checkboxShift.js b/resources/src/mediawiki.page.ready/checkboxShift.js
new file mode 100644 (file)
index 0000000..86e0ec2
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * @private
+ * @class mw.plugin.pageready
+ */
+/**
+ * Enable checkboxes to be checked or unchecked in a row by clicking one,
+ * holding shift and clicking another one.
+ *
+ * @method checkboxShift
+ * @param {jQuery} $box
+ */
+module.exports = function ( $box ) {
+       var prev;
+       // When our boxes are clicked..
+       $box.on( 'click', function ( e ) {
+               // And one has been clicked before...
+               if ( prev && e.shiftKey ) {
+                       // Check or uncheck this one and all in-between checkboxes,
+                       // except for disabled ones
+                       $box
+                               .slice(
+                                       Math.min( $box.index( prev ), $box.index( e.target ) ),
+                                       Math.max( $box.index( prev ), $box.index( e.target ) ) + 1
+                               )
+                               .filter( function () {
+                                       return !this.disabled;
+                               } )
+                               .prop( 'checked', e.target.checked );
+               }
+               // Either way, remember this as the last clicked one
+               prev = e.target;
+       } );
+};
diff --git a/resources/src/mediawiki.page.ready/ready.js b/resources/src/mediawiki.page.ready/ready.js
new file mode 100644 (file)
index 0000000..48d605d
--- /dev/null
@@ -0,0 +1,79 @@
+var checkboxShift = require( './checkboxShift.js' );
+mw.hook( 'wikipage.content' ).add( function ( $content ) {
+       var $sortable, $collapsible;
+
+       $collapsible = $content.find( '.mw-collapsible' );
+       if ( $collapsible.length ) {
+               // Preloaded by Skin::getDefaultModules()
+               mw.loader.using( 'jquery.makeCollapsible', function () {
+                       $collapsible.makeCollapsible();
+               } );
+       }
+
+       $sortable = $content.find( 'table.sortable' );
+       if ( $sortable.length ) {
+               // Preloaded by Skin::getDefaultModules()
+               mw.loader.using( 'jquery.tablesorter', function () {
+                       $sortable.tablesorter();
+               } );
+       }
+
+       checkboxShift( $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ) );
+} );
+
+// Handle elements outside the wikipage content
+$( function () {
+       var $nodes;
+
+       // Add accesskey hints to the tooltips
+       $( '[accesskey]' ).updateTooltipAccessKeys();
+
+       $nodes = $( '.catlinks[data-mw="interface"]' );
+       if ( $nodes.length ) {
+               /**
+                * Fired when categories are being added to the DOM
+                *
+                * It is encouraged to fire it before the main DOM is changed (when $content
+                * is still detached).  However, this order is not defined either way, so you
+                * should only rely on $content itself.
+                *
+                * This includes the ready event on a page load (including post-edit loads)
+                * and when content has been previewed with LivePreview.
+                *
+                * @event wikipage_categories
+                * @member mw.hook
+                * @param {jQuery} $content The most appropriate element containing the content,
+                *   such as .catlinks
+                */
+               mw.hook( 'wikipage.categories' ).fire( $nodes );
+       }
+
+       $( '#t-print a' ).on( 'click', function ( e ) {
+               window.print();
+               e.preventDefault();
+       } );
+
+       // Turn logout to a POST action
+       $( '#pt-logout a' ).on( 'click', function ( e ) {
+               var api = new mw.Api(),
+                       url = this.href;
+               mw.notify(
+                       mw.message( 'logging-out-notify' ),
+                       { tag: 'logout', autoHide: false }
+               );
+               api.postWithToken( 'csrf', {
+                       action: 'logout'
+               } ).then(
+                       function () {
+                               location.href = url;
+                       },
+                       function ( err ) {
+                               mw.notify(
+                                       mw.message( 'logout-failed', err ),
+                                       { type: 'error', tag: 'logout', autoHide: false }
+                               );
+                       }
+               );
+               e.preventDefault();
+       } );
+} );
index dff7881..9559d3a 100644 (file)
        font-weight: bold;
 }
 
+// on smaller screen, set .watchlistDetail to full width
+// so that the spinner doesn't appear beside it. T225127#5518870
+@media screen and ( max-width: @width-breakpoint-tablet ) {
+       .client-js {
+               /* stylelint-disable-next-line selector-class-pattern */
+               .watchlistDetails {
+                       float: none;
+                       width: auto;
+               }
+       }
+}
+
 @-webkit-keyframes rcfiltersBouncedelay {
        // 50% equals 800ms
        0%,
index 52f7ff2..75da5dd 100644 (file)
                border-top: 2px solid @colorGray14;
        }
 }
+
+// On small screens, remove the table properties from the
+// top section. T225127#5518870
+@media screen and ( max-width: @width-breakpoint-tablet ) {
+       .mw-rcfilters-ui-watchlistTopSectionWidget {
+               .mw-rcfilters-ui-table,
+               .mw-rcfilters-ui-row,
+               .mw-rcfilters-ui-cell {
+                       display: block;
+               }
+
+               &-editWatchlistButton {
+                       margin-top: 1em;
+               }
+       }
+}
index 310832d..c62acd9 100644 (file)
@@ -2,7 +2,7 @@
  * JavaScript for Special:RecentChanges
  */
 ( function () {
-       var rc, $checkboxes, $select;
+       var rc, $checkboxes, $select, namespaceDropdown;
 
        /**
         * @class mw.special.recentchanges
                 */
                updateCheckboxes: function () {
                        // The option element for the 'all' namespace has an empty value
-                       var isAllNS = $select.val() === '';
+                       var value = $select.val(),
+                               isAllNS = value === 'all' || value === '';
 
                        // Iterates over checkboxes and propagate the selected option
                        $checkboxes.toggleClass( 'mw-input-hidden', isAllNS );
                },
 
                init: function () {
-                       $select = $( '#namespace' );
-                       $checkboxes = $( '#nsassociated, #nsinvert' ).closest( '.mw-input-with-label' );
+                       $select = $( 'select#namespace' );
+                       $checkboxes = $( '#nsassociated, #nsinvert, .contribs-ns-filters' )
+                               .closest( '.mw-input-with-label' );
 
-                       // Bind to change event of the checkboxes.
-                       // The initial state is already set in HTML.
-                       $select.on( 'change', rc.updateCheckboxes );
+                       if ( $select.length === 0 ) {
+                               $select = $( '#namespace select' );
+                               if ( $select.length > 0 ) {
+                                       namespaceDropdown = OO.ui.infuse( $( '#namespace' ).closest( '[data-ooui]' ) );
+                                       namespaceDropdown.on( 'change', rc.updateCheckboxes );
+                               }
+                       } else {
+                               // Bind to change event of the checkboxes.
+                               // The initial state is already set in HTML.
+                               $select.on( 'change', rc.updateCheckboxes );
+                       }
                }
        };
 
diff --git a/resources/src/mediawiki.special/contributions.less b/resources/src/mediawiki.special/contributions.less
new file mode 100644 (file)
index 0000000..cc0e538
--- /dev/null
@@ -0,0 +1,65 @@
+/*!
+ * Styling for Special:Contributions
+ */
+@import 'mediawiki.ui/variables.less';
+
+// OOUIHTMLForm styles.
+@ooui-font-size-browser: 16; // Assumed browser default of `16px`.
+@ooui-font-size-base: 0.875em; // Equals `14px` at browser default of `16px`.
+
+@ooui-spacing-small: 8 / @ooui-font-size-browser / @ooui-font-size-base; // Equals `0.57142857em`≈`8px`.
+@ooui-spacing-medium: 12 / @ooui-font-size-browser / @ooui-font-size-base; // Equals `0.8571429em`≈`12px`.
+@ooui-spacing-large: 16 / @ooui-font-size-browser / @ooui-font-size-base; // Equals `1.1428571em`≈`16px`.
+
+.oo-ui-fieldsetLayout-group {
+       max-width: 50em;
+
+       .oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
+               margin: 0;
+               border: 0;
+               padding: 0;
+       }
+
+       // Hide extra `legend`s when grouping form in sections.
+       .oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-fieldsetLayout-header {
+               display: none;
+       }
+}
+
+.mw-autocomplete-user.oo-ui-fieldLayout {
+       margin-top: @ooui-spacing-small;
+}
+
+// Higher specificity needed to override OOUIHTMLForm styles.
+.mw-htmlform-field-HTMLMultiSelectField.mw-htmlform-flatlist.oo-ui-fieldLayout {
+       margin-top: @ooui-spacing-small;
+}
+
+.mw-htmlform-field-HTMLTagFilter ~ .mw-htmlform-field-HTMLCheckField.oo-ui-fieldLayout {
+       display: inline-block;
+       padding-right: @ooui-spacing-large;
+}
+
+// Clearfix for floated `.mw-htmlform-field-HTMLDateTimeField` below.
+#mw-htmlform-contribs-date:after {
+       content: '';
+       clear: both;
+       display: block;
+}
+
+.mw-htmlform-field-HTMLDateTimeField {
+       margin-right: @ooui-spacing-large;
+       margin-bottom: @ooui-spacing-small;
+
+       .oo-ui-fieldLayout.oo-ui-labelElement&:first-child {
+               margin-top: @ooui-spacing-medium;
+       }
+}
+
+@media all and ( min-width: @width-breakpoint-tablet ) {
+       .mw-htmlform-field-HTMLDateTimeField {
+               float: left;
+               // Same `width` as DateInputWidget.
+               width: 21em;
+       }
+}
diff --git a/resources/src/mediawiki.special/listFiles.less b/resources/src/mediawiki.special/listFiles.less
new file mode 100644 (file)
index 0000000..c54eb09
--- /dev/null
@@ -0,0 +1,43 @@
+@import 'mediawiki.ui/variables';
+
+// On mobile devices the table layout is collapsed.
+@media all and ( max-width: @width-breakpoint-tablet ) {
+       .mw-special-Listfiles {
+               // stylelint-disable selector-class-pattern
+               thead,
+               .TablePager_col_count,
+               .TablePager_col_img_size,
+               .TablePager_col_img_name,
+               .TablePager_col_img_timestamp {
+                       display: none;
+               }
+
+               tbody,
+               tr,
+               td,
+               .mw-datatable,
+               .TablePager_col_img_description,
+               .TablePager_col_thumb {
+                       display: block;
+               }
+
+               .mw-datatable,
+               .mw-datatable th,
+               .mw-datatable td {
+                       border: 0;
+               }
+
+               .TablePager_col_img_user_text,
+               .TablePager_col_img_description {
+                       color: @colorGray5;
+                       margin: 0.5em 0 0;
+                       padding-bottom: 40px;
+                       line-height: 1.5;
+               }
+
+               .TablePager_col_img_user_text {
+                       padding: 0;
+               }
+               // stylelint-enable selector-class-pattern
+       }
+}
index 3f76cf0..40a2ec2 100644 (file)
        font-weight: bold;
 }
 
-.mw-contributions-form select {
-       vertical-align: middle;
-}
-
 /* Special:EditWatchlist */
 .watchlistredir {
        font-style: italic;
index 01318c9..1d364ce 100644 (file)
        //
        // Markup:
        // <form class="mw-ui-vform">
-       //   <div class="errorbox">An error occurred</div>
+       //   <div class="errorbox">
+       //     <ul><li>An error occurred. There are problems with some of your input.</li></ul>
+       //   </div>
        //   <div class="warningbox">A warning to be noted</div>
        //   <div class="successbox">Action successful!</div>
-       //   <div class="error">A different kind of error</div>
-       //   <div class="error">
-       //     <ul><li>There are problems with some of your input.</li></ul>
-       //   </div>
        //   <div class="mw-ui-vform-field">
        //     <input type="text" value="input" class="mw-ui-input">
        //   </div>
        // </form>
        //
        // Styleguide 5.2.
-       .error,
-       .warning,
        .errorbox,
        .warningbox,
        .successbox {
                word-wrap: break-word;
        }
 
-       // Colours taken from those for .errorbox in shared.css
-       .error {
-               background-color: @backgroundColorError;
-               color: @colorTextEmphasized;
-               border: 1px solid @borderColorError;
-       }
-
-       // Colours taken from those for .warningbox in shared.css
-       .warning {
-               background-color: @backgroundColorWarning;
-               color: @colorTextEmphasized;
-               border: 1px solid @borderColorWarning;
-       }
-
        // This specifies styling for individual field validation error messages.
        // Show them below the fields to prevent line break glitches, and leave
        // some space between the field and the error message box.
        .mw-ui-vform-field {
-               .error,
-               .warning {
-                       display: block;
+               .errorbox,
+               .warningbox {
                        margin-top: 5px;
                }
        }
index e8823e1..8521664 100644 (file)
@@ -13,8 +13,7 @@ require( './jquery.accessKeyLabel.js' );
  * @return {string} Encoded string
  */
 function rawurlencode( str ) {
-       str = String( str );
-       return encodeURIComponent( str )
+       return encodeURIComponent( String( str ) )
                .replace( /!/g, '%21' ).replace( /'/g, '%27' ).replace( /\(/g, '%28' )
                .replace( /\)/g, '%29' ).replace( /\*/g, '%2A' ).replace( /~/g, '%7E' );
 }
@@ -59,33 +58,50 @@ util = {
        rawurlencode: rawurlencode,
 
        /**
-        * Encode string into HTML id compatible form suitable for use in HTML
-        * Analog to PHP Sanitizer::escapeIdForAttribute()
+        * Encode a string as CSS id, for use as HTML id attribute value.
         *
-        * @since 1.30
+        * Analog to `Sanitizer::escapeIdForAttribute()` in PHP.
         *
+        * @since 1.30
         * @param {string} str String to encode
         * @return {string} Encoded string
         */
        escapeIdForAttribute: function ( str ) {
-               var mode = config.FragmentMode[ 0 ];
-
-               return escapeIdInternal( str, mode );
+               return escapeIdInternal( str, config.FragmentMode[ 0 ] );
        },
 
        /**
-        * Encode string into HTML id compatible form suitable for use in links
-        * Analog to PHP Sanitizer::escapeIdForLink()
+        * Encode a string as URL fragment, for use as HTML anchor link.
         *
-        * @since 1.30
+        * Analog to `Sanitizer::escapeIdForLink()` in PHP.
         *
+        * @since 1.30
         * @param {string} str String to encode
         * @return {string} Encoded string
         */
        escapeIdForLink: function ( str ) {
-               var mode = config.FragmentMode[ 0 ];
+               return escapeIdInternal( str, config.FragmentMode[ 0 ] );
+       },
 
-               return escapeIdInternal( str, mode );
+       /**
+        * Return a wrapper function that is debounced for the given duration.
+        *
+        * When it is first called, a timeout is scheduled. If before the timer
+        * is reached the wrapper is called again, it gets rescheduled for the
+        * same duration from now until it stops being called. The original function
+        * is called from the "tail" of such chain, with the last set of arguments.
+        *
+        * @since 1.34
+        * @param {number} delay Time in milliseconds
+        * @param {Function} callback
+        * @return {Function}
+        */
+       debounce: function ( delay, callback ) {
+               var timeout;
+               return function () {
+                       clearTimeout( timeout );
+                       timeout = setTimeout( Function.prototype.apply.bind( callback, this, arguments ), delay );
+               };
        },
 
        /**
@@ -126,16 +142,15 @@ util = {
         * @return {string} Url of the page with name of `pageName`
         */
        getUrl: function ( pageName, params ) {
-               var titleFragmentStart, url, query,
-                       fragment = '',
+               var fragmentIdx, url, query, fragment,
                        title = typeof pageName === 'string' ? pageName : mw.config.get( 'wgPageName' );
 
                // Find any fragment
-               titleFragmentStart = title.indexOf( '#' );
-               if ( titleFragmentStart !== -1 ) {
-                       fragment = title.slice( titleFragmentStart + 1 );
+               fragmentIdx = title.indexOf( '#' );
+               if ( fragmentIdx !== -1 ) {
+                       fragment = title.slice( fragmentIdx + 1 );
                        // Exclude the fragment from the page name
-                       title = title.slice( 0, titleFragmentStart );
+                       title = title.slice( 0, fragmentIdx );
                }
 
                // Produce query string
@@ -152,7 +167,7 @@ util = {
                }
 
                // Append the encoded fragment
-               if ( fragment.length ) {
+               if ( fragment && fragment.length ) {
                        url += '#' + util.escapeIdForLink( fragment );
                }
 
@@ -160,16 +175,14 @@ util = {
        },
 
        /**
-        * Get address to a script in the wiki root.
-        * For index.php use `mw.config.get( 'wgScript' )`.
+        * Get URL to a MediaWiki entry point.
         *
         * @since 1.18
-        * @param {string} str Name of script (e.g. 'api'), defaults to 'index'
-        * @return {string} Address to script (e.g. '/w/api.php' )
+        * @param {string} [str="index"] Name of MW entry point (e.g. 'index' or 'api')
+        * @return {string} URL to the script file (e.g. '/w/api.php' )
         */
        wikiScript: function ( str ) {
-               str = str || 'index';
-               if ( str === 'index' ) {
+               if ( !str || str === 'index' ) {
                        return mw.config.get( 'wgScript' );
                } else if ( str === 'load' ) {
                        return config.LoadScript;
@@ -195,7 +208,7 @@ util = {
         */
        addCSS: function ( text ) {
                var s = mw.loader.addStyleTag( text );
-               return s.sheet || s.styleSheet || s;
+               return s.sheet;
        },
 
        /**
@@ -440,15 +453,15 @@ util = {
         * @return {boolean}
         */
        isIPv4Address: function ( address, allowBlock ) {
-               var block, RE_IP_BYTE, RE_IP_ADD;
+               var block,
+                       RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])',
+                       RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
 
                if ( typeof address !== 'string' ) {
                        return false;
                }
 
                block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '';
-               RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])';
-               RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
 
                return ( new RegExp( '^' + RE_IP_ADD + block + '$' ).test( address ) );
        },
index 0eb1134..89de155 100644 (file)
@@ -73,7 +73,7 @@
 
                // Highlight matching parts of link suggestion
                if ( config.query ) {
-                       this.setHighlightedQuery( config.data, config.query, config.compare );
+                       this.setHighlightedQuery( config.data, config.query, config.compare, true );
                }
                this.$label.attr( 'title', config.data );
 
index 21d95df..f814d89 100644 (file)
@@ -13,7 +13,7 @@
        'use strict';
 
        var mw, StringSet, log,
-               hasOwn = Object.prototype.hasOwnProperty;
+               hasOwn = Object.hasOwnProperty;
 
        /**
         * FNV132 hash function
                                        try {
                                                sortDependencies( modules[ i ], resolved );
                                        } catch ( err ) {
-                                               // This module is unknown or has unknown dependencies.
-                                               // Undo any incomplete resolutions made and keep going.
+                                               // This module is not currently known, or has invalid dependencies.
+                                               // Most likely due to a cached reference after the module was
+                                               // removed, otherwise made redundant, or omitted from the registry
+                                               // by the ResourceLoader "target" system.
                                                resolved = saved;
-                                               mw.trackError( 'resourceloader.exception', {
-                                                       exception: err,
-                                                       source: 'resolve'
-                                               } );
+                                               mw.log.warn( 'Skipped unresolvable module ' + modules[ i ] );
+                                               if ( modules[ i ] in registry ) {
+                                                       // If the module was known but had unknown or circular dependencies,
+                                                       // also track it as an error.
+                                                       mw.trackError( 'resourceloader.exception', {
+                                                               exception: err,
+                                                               source: 'resolve'
+                                                       } );
+                                               }
                                        }
                                }
                                return resolved;
index afb4737..2787f58 100644 (file)
@@ -1,54 +1,51 @@
 /* global mw */
-( function () {
-       var maxBusy = 50;
+mw.requestIdleCallbackInternal = function ( callback ) {
+       setTimeout( function () {
+               var start = mw.now();
+               callback( {
+                       didTimeout: false,
+                       timeRemaining: function () {
+                               // Hard a target maximum busy time of 50 milliseconds
+                               return Math.max( 0, 50 - ( mw.now() - start ) );
+                       }
+               } );
+       }, 1 );
+};
 
-       mw.requestIdleCallbackInternal = function ( callback ) {
-               setTimeout( function () {
-                       var start = mw.now();
-                       callback( {
-                               didTimeout: false,
-                               timeRemaining: function () {
-                                       return Math.max( 0, maxBusy - ( mw.now() - start ) );
-                               }
-                       } );
-               }, 1 );
-       };
-
-       /**
-        * Schedule a deferred task to run in the background.
-        *
-        * This allows code to perform tasks in the main thread without impacting
-        * time-critical operations such as animations and response to input events.
-        *
-        * Basic logic is as follows:
-        *
-        * - User input event should be acknowledged within 100ms per [RAIL].
-        * - Idle work should be grouped in blocks of upto 50ms so that enough time
-        *   remains for the event handler to execute and any rendering to take place.
-        * - Whenever a native event happens (e.g. user input), the deadline for any
-        *   running idle callback drops to 0.
-        * - As long as the deadline is non-zero, other callbacks pending may be
-        *   executed in the same idle period.
-        *
-        * See also:
-        *
-        * - <https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback>
-        * - <https://w3c.github.io/requestidlecallback/>
-        * - <https://developers.google.com/web/updates/2015/08/using-requestidlecallback>
-        * [RAIL]: https://developers.google.com/web/fundamentals/performance/rail
-        *
-        * @member mw
-        * @param {Function} callback
-        * @param {Object} [options]
-        * @param {number} [options.timeout] If set, the callback will be scheduled for
-        *  immediate execution after this amount of time (in milliseconds) if it didn't run
-        *  by that time.
-        */
-       mw.requestIdleCallback = window.requestIdleCallback ?
-               // Bind because it throws TypeError if context is not window
-               window.requestIdleCallback.bind( window ) :
-               mw.requestIdleCallbackInternal;
-       // Note: Polyfill was previously disabled due to
-       // https://bugs.chromium.org/p/chromium/issues/detail?id=647870
-       // See also <http://codepen.io/Krinkle/full/XNGEvv>
-}() );
+/**
+ * Schedule a deferred task to run in the background.
+ *
+ * This allows code to perform tasks in the main thread without impacting
+ * time-critical operations such as animations and response to input events.
+ *
+ * Basic logic is as follows:
+ *
+ * - User input event should be acknowledged within 100ms per [RAIL].
+ * - Idle work should be grouped in blocks of upto 50ms so that enough time
+ *   remains for the event handler to execute and any rendering to take place.
+ * - Whenever a native event happens (e.g. user input), the deadline for any
+ *   running idle callback drops to 0.
+ * - As long as the deadline is non-zero, other callbacks pending may be
+ *   executed in the same idle period.
+ *
+ * See also:
+ *
+ * - <https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback>
+ * - <https://w3c.github.io/requestidlecallback/>
+ * - <https://developers.google.com/web/updates/2015/08/using-requestidlecallback>
+ * [RAIL]: https://developers.google.com/web/fundamentals/performance/rail
+ *
+ * @member mw
+ * @param {Function} callback
+ * @param {Object} [options]
+ * @param {number} [options.timeout] If set, the callback will be scheduled for
+ *  immediate execution after this amount of time (in milliseconds) if it didn't run
+ *  by that time.
+ */
+mw.requestIdleCallback = window.requestIdleCallback ?
+       // Bind because it throws TypeError if context is not window
+       window.requestIdleCallback.bind( window ) :
+       mw.requestIdleCallbackInternal;
+// Note: Polyfill was previously disabled due to
+// https://bugs.chromium.org/p/chromium/issues/detail?id=647870
+// See also <http://codepen.io/Krinkle/full/XNGEvv>
index 00ff2c9..c479c2d 100644 (file)
@@ -178,7 +178,6 @@ $wgAutoloadClasses += [
        'MediaWiki\Tests\Revision\RevisionSlotsTest' => "$testDir/phpunit/includes/Revision/RevisionSlotsTest.php",
        'MediaWiki\Tests\Revision\RevisionRecordTests' => "$testDir/phpunit/includes/Revision/RevisionRecordTests.php",
        'MediaWiki\Tests\Revision\RevisionStoreDbTestBase' => "$testDir/phpunit/includes/Revision/RevisionStoreDbTestBase.php",
-       'MediaWiki\Tests\Revision\PreMcrSchemaOverride' => "$testDir/phpunit/includes/Revision/PreMcrSchemaOverride.php",
        'MediaWiki\Tests\Revision\RevisionStoreRecordTest' => "$testDir/phpunit/includes/Revision/RevisionStoreRecordTest.php",
 
        # tests/phpunit/languages
index d563235..4f78be4 100644 (file)
@@ -9251,7 +9251,7 @@ Template parameter named "constructor"
 !! wikitext
 {{echo|  constructor =  |hi}}
 !! html/parsoid
-<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"constructor","named":true,"spc":["  "," ","","  "]},{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi"},"constructor":{"wt":""}},"i":0}}]}'>hi</p>
+<p about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"constructor","named":true,"spc":["  "," ","","  "]},{"k":"1"}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"constructor":{"wt":""},"1":{"wt":"hi"}},"i":0}}]}'>hi</p>
 !! end
 
 !! article
@@ -25601,7 +25601,7 @@ __TOC__
 !! article
 MediaWiki:T34057
 !! text
-== {{int:headline_sample}} ==
+== {{int:ok}} ==
 !! endarticle
 
 !! test
@@ -25611,7 +25611,7 @@ title=[[Main Page]]
 !! wikitext
 {{int:T34057}}
 !! html
-<h2><span class="mw-headline" id="Headline_text">Headline text</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
+<h2><span class="mw-headline" id="OK">OK</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: OK">edit</a><span class="mw-editsection-bracket">]</span></span></h2>
 !! end
 
 !! test
index ce3f2e2..ca400bf 100644 (file)
@@ -45,6 +45,6 @@ trait MediaWikiCoversValidator {
                        }
                }
 
-               $this->assertEquals( '', $bad );
+               $this->assertSame( '', $bad );
        }
 }
index b738312..a82c064 100644 (file)
@@ -1465,7 +1465,7 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                        $db->_originalTablePrefix = $oldPrefix;
 
                        $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
-                       $lb->setTempTablesOnlyMode( self::$useTemporaryTables, $lb->getLocalDomainID() );
+                       $lb->setTempTablesOnlyMode( self::$useTemporaryTables, $db->getDomainID() );
                }
 
                return true;
@@ -1821,22 +1821,30 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
        /**
         * Empty all tables so they can be repopulated for tests
         *
-        * @param Database $db|null Database to reset
-        * @param array $tablesUsed Tables to reset
+        * @param IDatabase $db|null Database to reset
+        * @param string[] $tablesUsed Tables to reset
         */
-       private function resetDB( $db, $tablesUsed ) {
+       private function resetDB( IDatabase $db = null, array $tablesUsed ) {
                if ( $db ) {
-                       $userTables = [ 'user', 'user_groups', 'user_properties', 'actor' ];
-                       $pageTables = [
-                               'page', 'revision', 'ip_changes', 'revision_comment_temp', 'comment', 'archive',
-                               'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
-                               'change_tag',
+                       // some groups of tables are connected such that if any is used, all should be cleared
+                       $extraTables = [
+                               'user' => [ 'user', 'user_groups', 'user_properties', 'actor' ],
+                               'page' => [ 'page', 'revision', 'ip_changes', 'revision_comment_temp', 'comment', 'archive',
+                                       'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
+                                       'change_tag' ],
+                               'logging' => [ 'logging', 'log_search', 'change_tag' ],
                        ];
-                       $coreDBDataTables = array_merge( $userTables, $pageTables );
+                       $coreDBDataTables = array_merge( $extraTables['user'], $extraTables['page'] );
 
-                       // If any of the user or page tables were marked as used, we should clear all of them.
-                       if ( array_intersect( $tablesUsed, $userTables ) ) {
-                               $tablesUsed = array_unique( array_merge( $tablesUsed, $userTables ) );
+                       foreach ( $extraTables as $i => $group ) {
+                               if ( !array_intersect( $tablesUsed, $group ) ) {
+                                       unset( $extraTables[$i] );
+                               }
+                       }
+                       $extraTables = array_values( $extraTables );
+                       $tablesUsed = array_unique( array_merge( $tablesUsed, ...$extraTables ) );
+
+                       if ( in_array( 'user', $tablesUsed ) ) {
                                TestUserRegistry::clear();
 
                                // Reset $wgUser, which is probably 127.0.0.1, as its loaded data is probably not valid
@@ -1845,9 +1853,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                                global $wgUser;
                                $wgUser->clearInstanceCache( $wgUser->mFrom );
                        }
-                       if ( array_intersect( $tablesUsed, $pageTables ) ) {
-                               $tablesUsed = array_unique( array_merge( $tablesUsed, $pageTables ) );
-                       }
 
                        // Postgres uses mwuser/pagecontent
                        // instead of user/text. But Postgres does not remap the
@@ -2382,32 +2387,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ $hookName => [ $handler ] ] );
        }
 
-       /**
-        * Check whether file contains given data.
-        * @param string $fileName
-        * @param string $actualData
-        * @param bool $createIfMissing If true, and file does not exist, create it with given data
-        *                              and skip the test.
-        * @param string $msg
-        * @since 1.30
-        */
-       protected function assertFileContains(
-               $fileName,
-               $actualData,
-               $createIfMissing = false,
-               $msg = ''
-       ) {
-               if ( $createIfMissing ) {
-                       if ( !file_exists( $fileName ) ) {
-                               file_put_contents( $fileName, $actualData );
-                               $this->markTestSkipped( "Data file $fileName does not exist" );
-                       }
-               } else {
-                       self::assertFileExists( $fileName );
-               }
-               self::assertEquals( file_get_contents( $fileName ), $actualData, $msg );
-       }
-
        /**
         * Edits or creates a page/revision
         * @param string $pageName Page title
index 4ccfe39..918b51b 100644 (file)
@@ -29,4 +29,30 @@ trait MediaWikiTestCaseTrait {
                $mock->expects( $this->never() )->method( $this->anythingBut( '__destruct' ) );
                return $mock;
        }
+
+       /**
+        * Check whether file contains given data.
+        * @param string $fileName
+        * @param string $actualData
+        * @param bool $createIfMissing If true, and file does not exist, create it with given data
+        *                              and skip the test.
+        * @param string $msg
+        * @since 1.30
+        */
+       protected function assertFileContains(
+               $fileName,
+               $actualData,
+               $createIfMissing = false,
+               $msg = ''
+       ) {
+               if ( $createIfMissing ) {
+                       if ( !file_exists( $fileName ) ) {
+                               file_put_contents( $fileName, $actualData );
+                               $this->markTestSkipped( "Data file $fileName does not exist" );
+                       }
+               } else {
+                       self::assertFileExists( $fileName );
+               }
+               self::assertEquals( file_get_contents( $fileName ), $actualData, $msg );
+       }
 }
diff --git a/tests/phpunit/data/media/jpeg-xmp-nullchar.jpg b/tests/phpunit/data/media/jpeg-xmp-nullchar.jpg
new file mode 100644 (file)
index 0000000..76ae2b4
Binary files /dev/null and b/tests/phpunit/data/media/jpeg-xmp-nullchar.jpg differ
index 9c08b9f..57cc073 100644 (file)
@@ -73,6 +73,47 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                return $store;
        }
 
+       /**
+        * @dataProvider provideConstructor
+        * @param int $stage
+        * @param string|null $exceptionMsg
+        */
+       public function testConstructor( $stage, $exceptionMsg ) {
+               try {
+                       $m = new CommentStore( Language::factory( 'qqx' ), $stage );
+                       if ( $exceptionMsg !== null ) {
+                               $this->fail( 'Expected exception not thrown' );
+                       }
+                       $this->assertInstanceOf( CommentStore::class, $m );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame( $exceptionMsg, $ex->getMessage() );
+               }
+       }
+
+       public static function provideConstructor() {
+               return [
+                       [ 0, '$stage must include a write mode' ],
+                       [ SCHEMA_COMPAT_READ_OLD, '$stage must include a write mode' ],
+                       [ SCHEMA_COMPAT_READ_NEW, '$stage must include a write mode' ],
+                       [ SCHEMA_COMPAT_READ_BOTH, '$stage must include a write mode' ],
+
+                       [ SCHEMA_COMPAT_WRITE_OLD, '$stage must include a read mode' ],
+                       [ SCHEMA_COMPAT_WRITE_OLD | SCHEMA_COMPAT_READ_OLD, null ],
+                       [ SCHEMA_COMPAT_WRITE_OLD | SCHEMA_COMPAT_READ_NEW, null ],
+                       [ SCHEMA_COMPAT_WRITE_OLD | SCHEMA_COMPAT_READ_BOTH, null ],
+
+                       [ SCHEMA_COMPAT_WRITE_NEW, '$stage must include a read mode' ],
+                       [ SCHEMA_COMPAT_WRITE_NEW | SCHEMA_COMPAT_READ_OLD, null ],
+                       [ SCHEMA_COMPAT_WRITE_NEW | SCHEMA_COMPAT_READ_NEW, null ],
+                       [ SCHEMA_COMPAT_WRITE_NEW | SCHEMA_COMPAT_READ_BOTH, null ],
+
+                       [ SCHEMA_COMPAT_WRITE_BOTH, '$stage must include a read mode' ],
+                       [ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, null ],
+                       [ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, null ],
+                       [ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_BOTH, null ],
+               ];
+       }
+
        /**
         * @dataProvider provideGetFields
         * @param int $stage
@@ -115,6 +156,14 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                MIGRATION_NEW, 'ipb_reason',
                                [ 'ipb_reason_id' => 'ipb_reason_id' ],
                        ],
+                       'Simple table, write-both/read-old' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, 'ipb_reason',
+                               [ 'ipb_reason_text' => 'ipb_reason', 'ipb_reason_data' => 'NULL', 'ipb_reason_cid' => 'NULL' ],
+                       ],
+                       'Simple table, write-both/read-new' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, 'ipb_reason',
+                               [ 'ipb_reason_id' => 'ipb_reason_id' ],
+                       ],
 
                        'Revision, old' => [
                                MIGRATION_OLD, 'rev_comment',
@@ -136,6 +185,18 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                MIGRATION_NEW, 'rev_comment',
                                [ 'rev_comment_pk' => 'rev_id' ],
                        ],
+                       'Revision, write-both/read-old' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, 'rev_comment',
+                               [
+                                       'rev_comment_text' => 'rev_comment',
+                                       'rev_comment_data' => 'NULL',
+                                       'rev_comment_cid' => 'NULL',
+                               ],
+                       ],
+                       'Revision, write-both/read-new' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, 'rev_comment',
+                               [ 'rev_comment_pk' => 'rev_id' ],
+                       ],
 
                        'Image, old' => [
                                MIGRATION_OLD, 'img_description',
@@ -165,6 +226,20 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                        'img_description_id' => 'img_description_id'
                                ],
                        ],
+                       'Image, write-both/read-old' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, 'img_description',
+                               [
+                                       'img_description_text' => 'img_description',
+                                       'img_description_data' => 'NULL',
+                                       'img_description_cid' => 'NULL',
+                               ],
+                       ],
+                       'Image, write-both/read-new' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, 'img_description',
+                               [
+                                       'img_description_id' => 'img_description_id'
+                               ],
+                       ],
                ];
        }
 
@@ -244,6 +319,30 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                        ],
                                ],
                        ],
+                       'Simple table, write-both/read-old' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, 'ipb_reason', [
+                                       'tables' => [],
+                                       'fields' => [
+                                               'ipb_reason_text' => 'ipb_reason',
+                                               'ipb_reason_data' => 'NULL',
+                                               'ipb_reason_cid' => 'NULL',
+                                       ],
+                                       'joins' => [],
+                               ],
+                       ],
+                       'Simple table, write-both/read-new' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, 'ipb_reason', [
+                                       'tables' => [ 'comment_ipb_reason' => 'comment' ],
+                                       'fields' => [
+                                               'ipb_reason_text' => 'comment_ipb_reason.comment_text',
+                                               'ipb_reason_data' => 'comment_ipb_reason.comment_data',
+                                               'ipb_reason_cid' => 'comment_ipb_reason.comment_id',
+                                       ],
+                                       'joins' => [
+                                               'comment_ipb_reason' => [ 'JOIN', 'comment_ipb_reason.comment_id = ipb_reason_id' ],
+                                       ],
+                               ],
+                       ],
 
                        'Revision, old' => [
                                MIGRATION_OLD, 'rev_comment', [
@@ -310,6 +409,35 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                        ],
                                ],
                        ],
+                       'Revision, write-both/read-old' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, 'rev_comment', [
+                                       'tables' => [],
+                                       'fields' => [
+                                               'rev_comment_text' => 'rev_comment',
+                                               'rev_comment_data' => 'NULL',
+                                               'rev_comment_cid' => 'NULL',
+                                       ],
+                                       'joins' => [],
+                               ],
+                       ],
+                       'Revision, write-both/read-new' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, 'rev_comment', [
+                                       'tables' => [
+                                               'temp_rev_comment' => 'revision_comment_temp',
+                                               'comment_rev_comment' => 'comment',
+                                       ],
+                                       'fields' => [
+                                               'rev_comment_text' => 'comment_rev_comment.comment_text',
+                                               'rev_comment_data' => 'comment_rev_comment.comment_data',
+                                               'rev_comment_cid' => 'comment_rev_comment.comment_id',
+                                       ],
+                                       'joins' => [
+                                               'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
+                                               'comment_rev_comment' => [ 'JOIN',
+                                                       'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
+                                       ],
+                               ],
+                       ],
 
                        'Image, old' => [
                                MIGRATION_OLD, 'img_description', [
@@ -373,6 +501,34 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                        ],
                                ],
                        ],
+                       'Image, write-both/read-old' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, 'img_description', [
+                                       'tables' => [],
+                                       'fields' => [
+                                               'img_description_text' => 'img_description',
+                                               'img_description_data' => 'NULL',
+                                               'img_description_cid' => 'NULL',
+                                       ],
+                                       'joins' => [],
+                               ],
+                       ],
+                       'Image, write-both/read-new' => [
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, 'img_description', [
+                                       'tables' => [
+                                               'comment_img_description' => 'comment',
+                                       ],
+                                       'fields' => [
+                                               'img_description_text' => 'comment_img_description.comment_text',
+                                               'img_description_data' => 'comment_img_description.comment_data',
+                                               'img_description_cid' => 'comment_img_description.comment_id',
+                                       ],
+                                       'joins' => [
+                                               'comment_img_description' => [ 'JOIN',
+                                                       'comment_img_description.comment_id = img_description_id',
+                                               ],
+                                       ],
+                               ],
+                       ],
                ];
        }
 
@@ -413,6 +569,15 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                MIGRATION_NEW ],
                        MIGRATION_WRITE_NEW => [ MIGRATION_WRITE_BOTH, MIGRATION_WRITE_NEW, MIGRATION_NEW ],
                        MIGRATION_NEW => [ MIGRATION_WRITE_BOTH, MIGRATION_WRITE_NEW, MIGRATION_NEW ],
+
+                       SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD => [
+                               MIGRATION_OLD, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD,
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, MIGRATION_NEW
+                       ],
+                       SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW => [
+                               MIGRATION_OLD, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD,
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, MIGRATION_NEW
+                       ],
                ];
 
                foreach ( $stages as $writeStage => $possibleReadStages ) {
@@ -427,12 +592,12 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                $fields = $wstore->insert( $this->db, $key, $comment, $data );
                        }
 
-                       if ( $writeStage <= MIGRATION_WRITE_BOTH ) {
+                       if ( $writeStage & SCHEMA_COMPAT_WRITE_OLD ) {
                                $this->assertSame( $expect['text'], $fields[$key], "old field, stage=$writeStage" );
                        } else {
                                $this->assertArrayNotHasKey( $key, $fields, "old field, stage=$writeStage" );
                        }
-                       if ( $writeStage >= MIGRATION_WRITE_BOTH && !$usesTemp ) {
+                       if ( ( $writeStage & SCHEMA_COMPAT_WRITE_NEW ) && !$usesTemp ) {
                                $this->assertArrayHasKey( "{$key}_id", $fields, "new field, stage=$writeStage" );
                        } else {
                                $this->assertArrayNotHasKey( "{$key}_id", $fields, "new field, stage=$writeStage" );
@@ -463,13 +628,17 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                        $queryInfo['joins']
                                );
 
+                               $expectForCombination = (
+                                       ( $writeStage & SCHEMA_COMPAT_WRITE_BOTH ) === SCHEMA_COMPAT_WRITE_OLD ||
+                                       ( $readStage & SCHEMA_COMPAT_READ_BOTH ) === SCHEMA_COMPAT_READ_OLD
+                               ) ? $expectOld : $expect;
                                $this->assertComment(
-                                       $writeStage === MIGRATION_OLD || $readStage === MIGRATION_OLD ? $expectOld : $expect,
+                                       $expectForCombination,
                                        $rstore->getCommentLegacy( $this->db, $key, $fieldRow ),
                                        "w=$writeStage, r=$readStage, from getFields()"
                                );
                                $this->assertComment(
-                                       $writeStage === MIGRATION_OLD || $readStage === MIGRATION_OLD ? $expectOld : $expect,
+                                       $expectForCombination,
                                        $rstore->getComment( $key, $joinRow ),
                                        "w=$writeStage, r=$readStage, from getJoin()"
                                );
@@ -503,6 +672,15 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                MIGRATION_NEW ],
                        MIGRATION_WRITE_NEW => [ MIGRATION_WRITE_BOTH, MIGRATION_WRITE_NEW, MIGRATION_NEW ],
                        MIGRATION_NEW => [ MIGRATION_WRITE_BOTH, MIGRATION_WRITE_NEW, MIGRATION_NEW ],
+
+                       SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD => [
+                               MIGRATION_OLD, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD,
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, MIGRATION_NEW
+                       ],
+                       SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW => [
+                               MIGRATION_OLD, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD,
+                               SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, MIGRATION_NEW
+                       ],
                ];
 
                foreach ( $stages as $writeStage => $possibleReadStages ) {
@@ -517,12 +695,12 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                $fields = $wstore->insert( $this->db, $comment, $data );
                        }
 
-                       if ( $writeStage <= MIGRATION_WRITE_BOTH ) {
+                       if ( $writeStage & SCHEMA_COMPAT_WRITE_OLD ) {
                                $this->assertSame( $expect['text'], $fields[$key], "old field, stage=$writeStage" );
                        } else {
                                $this->assertArrayNotHasKey( $key, $fields, "old field, stage=$writeStage" );
                        }
-                       if ( $writeStage >= MIGRATION_WRITE_BOTH && !$usesTemp ) {
+                       if ( ( $writeStage & SCHEMA_COMPAT_WRITE_NEW ) && !$usesTemp ) {
                                $this->assertArrayHasKey( "{$key}_id", $fields, "new field, stage=$writeStage" );
                        } else {
                                $this->assertArrayNotHasKey( "{$key}_id", $fields, "new field, stage=$writeStage" );
@@ -553,13 +731,17 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                                        $queryInfo['joins']
                                );
 
+                               $expectForCombination = (
+                                       ( $writeStage & SCHEMA_COMPAT_WRITE_BOTH ) === SCHEMA_COMPAT_WRITE_OLD ||
+                                       ( $readStage & SCHEMA_COMPAT_READ_BOTH ) === SCHEMA_COMPAT_READ_OLD
+                               ) ? $expectOld : $expect;
                                $this->assertComment(
-                                       $writeStage === MIGRATION_OLD || $readStage === MIGRATION_OLD ? $expectOld : $expect,
+                                       $expectForCombination,
                                        $rstore->getCommentLegacy( $this->db, $fieldRow ),
                                        "w=$writeStage, r=$readStage, from getFields()"
                                );
                                $this->assertComment(
-                                       $writeStage === MIGRATION_OLD || $readStage === MIGRATION_OLD ? $expectOld : $expect,
+                                       $expectForCombination,
                                        $rstore->getComment( $joinRow ),
                                        "w=$writeStage, r=$readStage, from getJoin()"
                                );
@@ -725,6 +907,9 @@ class CommentStoreTest extends MediaWikiLangTestCase {
                        'MIGRATION_WRITE_BOTH' => [ MIGRATION_WRITE_BOTH ],
                        'MIGRATION_WRITE_NEW' => [ MIGRATION_WRITE_NEW ],
                        'MIGRATION_NEW' => [ MIGRATION_NEW ],
+
+                       'SCHEMA_COMPAT write-both/read-old' => [ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD ],
+                       'SCHEMA_COMPAT write-both/read-new' => [ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW ],
                ];
        }
 
index d2540f6..1f9465d 100644 (file)
@@ -351,7 +351,7 @@ class EditPageTest extends MediaWikiLangTestCase {
 
                wfGetDB( DB_MASTER )->commit( __METHOD__ );
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount(), 'No deferred updates' );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount(), 'No deferred updates' );
 
                if ( $expectedCode != EditPage::AS_BLANK_ARTICLE ) {
                        $latest = $page->getLatest();
index c054caa..7b7f6b9 100644 (file)
@@ -50,7 +50,7 @@ class FauxRequestTest extends PHPUnit\Framework\TestCase {
        public function testGetText() {
                $req = new FauxRequest( [ 'x' => 'Value' ] );
                $this->assertEquals( 'Value', $req->getText( 'x' ) );
-               $this->assertEquals( '', $req->getText( 'z' ) );
+               $this->assertSame( '', $req->getText( 'z' ) );
        }
 
        /**
@@ -287,8 +287,8 @@ class FauxRequestTest extends PHPUnit\Framework\TestCase {
         */
        public function testDummies() {
                $req = new FauxRequest();
-               $this->assertEquals( '', $req->getRawQueryString() );
-               $this->assertEquals( '', $req->getRawPostString() );
-               $this->assertEquals( '', $req->getRawInput() );
+               $this->assertSame( '', $req->getRawQueryString() );
+               $this->assertSame( '', $req->getRawPostString() );
+               $this->assertSame( '', $req->getRawInput() );
        }
 }
index 5d83b7e..35d06dd 100644 (file)
@@ -161,12 +161,12 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::expandAttributes
         */
        public function testExpandAttributesForBooleans() {
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        Html::expandAttributes( [ 'selected' => false ] ),
                        'Boolean attributes do not generates output when value is false'
                );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        Html::expandAttributes( [ 'selected' => null ] ),
                        'Boolean attributes do not generates output when value is null'
@@ -566,11 +566,11 @@ class HtmlTest extends MediaWikiTestCase {
                        '<div class="errorbox">err</div>'
                );
                $this->assertEquals(
-                       Html::errorBox( 'err', 'heading' ),
-                       '<div class="errorbox"><h2>heading</h2>err</div>'
+                       Html::errorBox( 'err', 'heading', 'errorbox-custom-class' ),
+                       '<div class="errorbox errorbox-custom-class"><h2>heading</h2>err</div>'
                );
                $this->assertEquals(
-                       Html::errorBox( 'err', '0' ),
+                       Html::errorBox( 'err', '0', '' ),
                        '<div class="errorbox"><h2>0</h2>err</div>'
                );
        }
index fe32507..dcac471 100644 (file)
@@ -453,7 +453,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                $user = $context->getUser();
                $user->setOption( 'showrollbackconfirmation', $rollbackEnabled );
 
-               $this->assertEquals( 0, Title::newFromText( $title )->getArticleID() );
+               $this->assertSame( 0, Title::newFromText( $title )->getArticleID() );
                $pageData = $this->insertPage( $title );
                $page = WikiPage::factory( $pageData['title'] );
 
index 8fa0cd6..e4c068f 100644 (file)
@@ -227,7 +227,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                // This should do nothing. In particular, it should not create a service instance.
                $services->resetServiceForTesting( 'Test' );
-               $this->assertEquals( 0, $serviceCounter, 'No service instance should be created yet.' );
+               $this->assertSame( 0, $serviceCounter, 'No service instance should be created yet.' );
 
                $oldInstance = $services->getService( 'Test' );
                $this->assertEquals( 1, $serviceCounter, 'A service instance should exit now.' );
@@ -308,7 +308,16 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                                throw new MWException( 'All service callbacks must have a return type defined, ' .
                                        "none found for $name" );
                        }
-                       $ret[$name] = [ $name, $fun->getReturnType()->__toString() ];
+
+                       $returnType = $fun->getReturnType();
+
+                       // ReflectionType::__toString() generates deprecation notices in PHP 7.4 and above
+                       // TODO: T228342 - remove this check after MediaWiki only supports PHP 7.1+
+                       if ( is_callable( [ $returnType, 'getName' ] ) ) {
+                               $ret[$name] = [ $name, $returnType->getName() ];
+                       } else {
+                               $ret[$name] = [ $name, $fun->getReturnType()->__toString() ];
+                       }
                }
                return $ret;
        }
index aa6e494..6ab56eb 100644 (file)
@@ -93,7 +93,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                'Some syndication links should be there' );
                } else {
                        $this->assertFalse( $outputPage->isSyndicated(), 'No syndication should be offered' );
-                       $this->assertEquals( 0, count( $outputPage->getSyndicationLinks() ),
+                       $this->assertSame( 0, count( $outputPage->getSyndicationLinks() ),
                                'No syndication links should be there' );
                }
        }
index 2d1fd98..d5bbb11 100644 (file)
@@ -3,7 +3,7 @@
 namespace MediaWiki\Tests\Rest\BasicAccess;
 
 use GuzzleHttp\Psr7\Uri;
-use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\BasicAccess\MWBasicAuthorizer;
 use MediaWiki\Rest\Handler;
 use MediaWiki\Rest\RequestData;
@@ -26,30 +26,28 @@ use Wikimedia\ObjectFactory;
 class MWBasicRequestAuthorizerTest extends MediaWikiTestCase {
        private function createRouter( $userRights, $request ) {
                $user = User::newFromName( 'Test user' );
-               // Don't allow the rights to everybody so that user rights kick in.
-               $this->mergeMwGlobalArrayValue( 'wgGroupPermissions', [ '*' => $userRights ] );
-               $this->overrideUserPermissions(
-                       $user,
-                       array_keys( array_filter( $userRights ), function ( $value ) {
-                               return $value === true;
-                       } )
-               );
-
-               global $IP;
-
                $objectFactory = new ObjectFactory(
                        $this->getMockForAbstractClass( ContainerInterface::class )
                );
+               $permissionManager = $this->createMock( PermissionManager::class );
+               // Don't allow the rights to everybody so that user rights kick in.
+               $permissionManager->method( 'isEveryoneAllowed' )->willReturn( false );
+               $permissionManager->method( 'userHasRight' )
+                       ->will( $this->returnCallback( function ( $user, $action ) use ( $userRights ) {
+                               return isset( $userRights[$action] ) && $userRights[$action];
+                       } ) );
+
+               global $IP;
 
                return new Router(
                        [ "$IP/tests/phpunit/unit/includes/Rest/testRoutes.json" ],
                        [],
                        '/rest',
                        new \EmptyBagOStuff(),
-                       new ResponseFactory(),
-                       new MWBasicAuthorizer( $user, MediaWikiServices::getInstance()->getPermissionManager() ),
+                       new ResponseFactory( [] ),
+                       new MWBasicAuthorizer( $user, $permissionManager ),
                        $objectFactory,
-                       new Validator( $objectFactory, $request, $user )
+                       new Validator( $objectFactory, $permissionManager, $request, $user )
                );
        }
 
index b984895..d05c797 100644 (file)
@@ -5,6 +5,7 @@ namespace MediaWiki\Tests\Rest;
 use EmptyBagOStuff;
 use GuzzleHttp\Psr7\Uri;
 use GuzzleHttp\Psr7\Stream;
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\BasicAccess\StaticBasicAuthorizer;
 use MediaWiki\Rest\Handler;
 use MediaWiki\Rest\EntryPoint;
@@ -32,16 +33,17 @@ class EntryPointTest extends \MediaWikiTestCase {
                $objectFactory = new ObjectFactory(
                        $this->getMockForAbstractClass( ContainerInterface::class )
                );
+               $permissionManager = $this->createMock( PermissionManager::class );
 
                return new Router(
                        [ "$IP/tests/phpunit/unit/includes/Rest/testRoutes.json" ],
                        [],
                        '/rest',
                        new EmptyBagOStuff(),
-                       new ResponseFactory(),
+                       new ResponseFactory( [] ),
                        new StaticBasicAuthorizer(),
                        $objectFactory,
-                       new Validator( $objectFactory, $request, new User )
+                       new Validator( $objectFactory, $permissionManager, $request, new User )
                );
        }
 
index c0ff44b..e4d6b54 100644 (file)
@@ -3,12 +3,17 @@
 namespace MediaWiki\Tests\Revision;
 
 use CommentStoreComment;
+use ContentHandler;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Revision\SlotRecord;
+use MediaWiki\Storage\SqlBlobStore;
+use Revision;
+use StatusValue;
 use TextContent;
 use Title;
+use Wikimedia\TestingAccessWrapper;
 use WikitextContent;
 
 /**
@@ -239,4 +244,49 @@ class McrRevisionStoreDbTest extends RevisionStoreDbTestBase {
                        ]
                ] ], $result->getErrors() );
        }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+        */
+       public function testNewRevisionFromBatchUsesGetBlobBatch() {
+               $page1 = $this->getTestPage();
+               $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
+               /** @var Revision $rev1 */
+               $rev1 = $editStatus->getValue()['revision'];
+
+               $contentAddress = $rev1->getRevisionRecord()->getSlot( SlotRecord::MAIN )->getAddress();
+               $mockBlobStore = $this->getMockBuilder( SqlBlobStore::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mockBlobStore
+                       ->expects( $this->once() )
+                       ->method( 'getBlobBatch' )
+                       ->with( [ $contentAddress ], $this->anything() )
+                       ->willReturn( StatusValue::newGood( [
+                               $contentAddress => 'Content_From_Mock'
+                       ] ) );
+               $mockBlobStore
+                       ->expects( $this->never() )
+                       ->method( 'getBlob' );
+
+               $revStore = MediaWikiServices::getInstance()
+                       ->getRevisionStoreFactory()
+                       ->getRevisionStore();
+               $wrappedRevStore = TestingAccessWrapper::newFromObject( $revStore );
+               $wrappedRevStore->blobStore = $mockBlobStore;
+
+               $result = $revStore->newRevisionsFromBatch(
+                       [ $this->revisionToRow( $rev1 ) ],
+                       [
+                               'slots' => [ SlotRecord::MAIN ],
+                               'content' => true
+                       ]
+               );
+               $this->assertTrue( $result->isGood() );
+               $this->assertSame( 'Content_From_Mock',
+                       ContentHandler::getContentText( $result->getValue()[$rev1->getId()]
+                               ->getContent( SlotRecord::MAIN ) ) );
+       }
 }
diff --git a/tests/phpunit/includes/Revision/NoContentModelRevisionStoreDbTest.php b/tests/phpunit/includes/Revision/NoContentModelRevisionStoreDbTest.php
deleted file mode 100644 (file)
index 51cfc63..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-<?php
-
-namespace MediaWiki\Tests\Revision;
-
-use Revision;
-
-/**
- * Tests RevisionStore against the pre-MCR, pre-ContentHandler DB schema.
- *
- * @covers \MediaWiki\Revision\RevisionStore
- *
- * @group RevisionStore
- * @group Storage
- * @group Database
- * @group medium
- */
-class NoContentModelRevisionStoreDbTest extends RevisionStoreDbTestBase {
-
-       use PreMcrSchemaOverride;
-
-       protected function getContentHandlerUseDB() {
-               return false;
-       }
-
-       protected function revisionToRow( Revision $rev, $options = [ 'page', 'user', 'comment' ] ) {
-               $row = parent::revisionToRow( $rev, $options );
-
-               $row->rev_text_id = (string)$rev->getTextId();
-
-               return $row;
-       }
-
-       public function provideGetArchiveQueryInfo() {
-               yield [
-                       [
-                               'tables' => [ 'archive' ],
-                               'fields' => array_merge(
-                                       $this->getDefaultArchiveFields(),
-                                       [
-                                               'ar_comment_text' => 'ar_comment',
-                                               'ar_comment_data' => 'NULL',
-                                               'ar_comment_cid' => 'NULL',
-                                               'ar_user_text' => 'ar_user_text',
-                                               'ar_user' => 'ar_user',
-                                               'ar_actor' => 'NULL',
-                                       ]
-                               ),
-                               'joins' => [],
-                       ]
-               ];
-       }
-
-       public function provideGetQueryInfo() {
-               yield [
-                       [],
-                       [
-                               'tables' => [ 'revision' ],
-                               'fields' => array_merge(
-                                       $this->getDefaultQueryFields(),
-                                       $this->getCommentQueryFields(),
-                                       $this->getActorQueryFields()
-                               ),
-                               'joins' => [],
-                       ]
-               ];
-               yield [
-                       [ 'page' ],
-                       [
-                               'tables' => [ 'revision', 'page' ],
-                               'fields' => array_merge(
-                                       $this->getDefaultQueryFields(),
-                                       $this->getCommentQueryFields(),
-                                       $this->getActorQueryFields(),
-                                       [
-                                               'page_namespace',
-                                               'page_title',
-                                               'page_id',
-                                               'page_latest',
-                                               'page_is_redirect',
-                                               'page_len',
-                                       ]
-                               ),
-                               'joins' => [
-                                       'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
-                               ],
-                       ]
-               ];
-               yield [
-                       [ 'user' ],
-                       [
-                               'tables' => [ 'revision', 'user' ],
-                               'fields' => array_merge(
-                                       $this->getDefaultQueryFields(),
-                                       $this->getCommentQueryFields(),
-                                       $this->getActorQueryFields(),
-                                       [
-                                               'user_name',
-                                       ]
-                               ),
-                               'joins' => [
-                                       'user' => [ 'LEFT JOIN', [ 'rev_user != 0', 'user_id = rev_user' ] ],
-                               ],
-                       ]
-               ];
-               yield [
-                       [ 'text' ],
-                       [
-                               'tables' => [ 'revision', 'text' ],
-                               'fields' => array_merge(
-                                       $this->getDefaultQueryFields(),
-                                       $this->getCommentQueryFields(),
-                                       $this->getActorQueryFields(),
-                                       [
-                                               'old_text',
-                                               'old_flags',
-                                       ]
-                               ),
-                               'joins' => [
-                                       'text' => [ 'JOIN', [ 'rev_text_id=old_id' ] ],
-                               ],
-                       ]
-               ];
-       }
-
-       public function provideGetSlotsQueryInfo() {
-               $db = wfGetDB( DB_REPLICA );
-
-               yield [
-                       [],
-                       [
-                               'tables' => [
-                                       'slots' => 'revision',
-                               ],
-                               'fields' => array_merge(
-                                       [
-                                               'slot_revision_id' => 'slots.rev_id',
-                                               'slot_content_id' => 'NULL',
-                                               'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
-                                       ]
-                               ),
-                               'joins' => [],
-                       ]
-               ];
-               yield [
-                       [ 'content' ],
-                       [
-                               'tables' => [
-                                       'slots' => 'revision',
-                               ],
-                               'fields' => array_merge(
-                                       [
-                                               'slot_revision_id' => 'slots.rev_id',
-                                               'slot_content_id' => 'NULL',
-                                               'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
-                                               'content_size' => 'slots.rev_len',
-                                               'content_sha1' => 'slots.rev_sha1',
-                                               'content_address' =>
-                                                       $db->buildConcat( [ $db->addQuotes( 'tt:' ), 'slots.rev_text_id' ] ),
-                                               'model_name' => 'NULL',
-                                       ]
-                               ),
-                               'joins' => [],
-                       ]
-               ];
-       }
-
-       public function provideNewMutableRevisionFromArray() {
-               foreach ( parent::provideNewMutableRevisionFromArray() as $case ) {
-                       yield $case;
-               }
-
-               yield 'Basic array, with page & id' => [
-                       [
-                               'id' => 2,
-                               'page' => 1,
-                               'text_id' => 2,
-                               'timestamp' => '20171017114835',
-                               'user_text' => '111.0.1.2',
-                               'user' => 0,
-                               'minor_edit' => false,
-                               'deleted' => 0,
-                               'len' => 46,
-                               'parent_id' => 1,
-                               'sha1' => 'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
-                               'comment' => 'Goat Comment!',
-                       ]
-               ];
-       }
-
-       /**
-        * Conditions to use together with getSlotsQueryInfo() when selecting slot rows for a given
-        * revision.
-        *
-        * @return array
-        */
-       protected function getSlotRevisionConditions( $revId ) {
-               return [ 'rev_id' => $revId ];
-       }
-
-}
diff --git a/tests/phpunit/includes/Revision/PreMcrRevisionStoreDbTest.php b/tests/phpunit/includes/Revision/PreMcrRevisionStoreDbTest.php
deleted file mode 100644 (file)
index 468ab60..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace MediaWiki\Tests\Revision;
-
-use InvalidArgumentException;
-use MediaWiki\Revision\RevisionRecord;
-use Revision;
-use WikitextContent;
-
-/**
- * Tests RevisionStore against the pre-MCR DB schema.
- *
- * @covers \MediaWiki\Revision\RevisionStore
- *
- * @group RevisionStore
- * @group Storage
- * @group Database
- * @group medium
- */
-class PreMcrRevisionStoreDbTest extends RevisionStoreDbTestBase {
-
-       use PreMcrSchemaOverride;
-
-       protected function revisionToRow( Revision $rev, $options = [ 'page', 'user', 'comment' ] ) {
-               $row = parent::revisionToRow( $rev, $options );
-
-               $row->rev_text_id = (string)$rev->getTextId();
-               $row->rev_content_format = (string)$rev->getContentFormat();
-               $row->rev_content_model = (string)$rev->getContentModel();
-
-               return $row;
-       }
-
-       protected function assertRevisionExistsInDatabase( RevisionRecord $rev ) {
-               // Legacy schema is still being written
-               $this->assertSelect(
-                       [ 'revision', 'text' ],
-                       [ 'count(*)' ],
-                       [ 'rev_id' => $rev->getId(), 'rev_text_id > 0' ],
-                       [ [ 1 ] ],
-                       [],
-                       [ 'text' => [ 'JOIN', [ 'rev_text_id = old_id' ] ] ]
-               );
-
-               parent::assertRevisionExistsInDatabase( $rev );
-       }
-
-       public function provideInsertRevisionOn_failures() {
-               foreach ( parent::provideInsertRevisionOn_failures() as $case ) {
-                       yield $case;
-               }
-
-               yield 'slot that is not main slot' => [
-                       [
-                               'content' => [
-                                       'main' => new WikitextContent( 'Chicken' ),
-                                       'lalala' => new WikitextContent( 'Duck' ),
-                               ],
-                               'comment' => $this->getRandomCommentStoreComment(),
-                               'timestamp' => '20171117010101',
-                               'user' => true,
-                       ],
-                       new InvalidArgumentException( 'Only the main slot is supported' )
-               ];
-       }
-
-       public function provideNewMutableRevisionFromArray() {
-               foreach ( parent::provideNewMutableRevisionFromArray() as $case ) {
-                       yield $case;
-               }
-
-               yield 'Basic array, with page & id' => [
-                       [
-                               'id' => 2,
-                               'page' => 1,
-                               'text_id' => 2,
-                               'timestamp' => '20171017114835',
-                               'user_text' => '111.0.1.2',
-                               'user' => 0,
-                               'minor_edit' => false,
-                               'deleted' => 0,
-                               'len' => 46,
-                               'parent_id' => 1,
-                               'sha1' => 'rdqbbzs3pkhihgbs8qf2q9jsvheag5z',
-                               'comment' => 'Goat Comment!',
-                               'content_format' => 'text/x-wiki',
-                               'content_model' => 'wikitext',
-                       ]
-               ];
-       }
-
-       /**
-        * Conditions to use together with getSlotsQueryInfo() when selecting slot rows for a given
-        * revision.
-        *
-        * @return array
-        */
-       protected function getSlotRevisionConditions( $revId ) {
-               return [ 'rev_id' => $revId ];
-       }
-
-}
diff --git a/tests/phpunit/includes/Revision/PreMcrSchemaOverride.php b/tests/phpunit/includes/Revision/PreMcrSchemaOverride.php
deleted file mode 100644 (file)
index 1fe2d6f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-namespace MediaWiki\Tests\Revision;
-
-use Wikimedia\Rdbms\IMaintainableDatabase;
-use MediaWiki\DB\PatchFileLocation;
-
-/**
- * Trait providing schema overrides that allow tests to run against the pre-MCR database schema.
- */
-trait PreMcrSchemaOverride {
-
-       use PatchFileLocation;
-       use McrSchemaDetection;
-
-       /**
-        * @return int
-        */
-       protected function getMcrMigrationStage() {
-               return MIGRATION_OLD;
-       }
-
-       /**
-        * @return string[]
-        */
-       protected function getMcrTablesToReset() {
-               return [];
-       }
-
-       /**
-        * @return array[]
-        */
-       protected function getSchemaOverrides( IMaintainableDatabase $db ) {
-               $overrides = [
-                       'scripts' => [],
-                       'drop' => [],
-                       'create' => [],
-                       'alter' => [],
-               ];
-
-               if ( $this->hasMcrTables( $db ) ) {
-                       $overrides['drop'] = [ 'slots', 'content', 'slot_roles', 'content_models', ];
-                       $overrides['scripts'][] = $this->getSqlPatchPath( $db, '/drop-mcr-tables', __DIR__ );
-               }
-
-               if ( !$this->hasPreMcrFields( $db ) ) {
-                       $overrides['alter'][] = 'revision';
-                       $overrides['scripts'][] = $this->getSqlPatchPath( $db, '/create-pre-mcr-fields', __DIR__ );
-               }
-
-               return $overrides;
-       }
-
-}
index 9665867..7115515 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Tests\Revision;
 
 use Content;
 use Language;
+use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\MutableRevisionSlots;
 use MediaWiki\Revision\RenderedRevision;
@@ -122,7 +123,9 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $mock->expects( $this->any() )
                        ->method( 'userCan' )
                        ->willReturnCallback( function ( $perm, User $user ) use ( $mock ) {
-                               return $user->isAllowed( $perm );
+                               return MediaWikiServices::getInstance()
+                                       ->getPermissionManager()
+                                       ->userHasRight( $user, $perm );
                        } );
 
                return $mock;
index 949b664..0196c5d 100644 (file)
@@ -172,29 +172,6 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                ],
                        ]
                ];
-               yield 'pre-MCR, no model' => [
-                       [
-                               'wgContentHandlerUseDB' => false,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [
-                               'tables' => [
-                                       'archive',
-                                       'actor_ar_user' => 'actor',
-                                       'comment_ar_comment' => 'comment',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getArchiveQueryFields( true ),
-                                       $this->getNewActorQueryFields( 'ar' ),
-                                       $this->getNewCommentQueryFields( 'ar' )
-                               ),
-                               'joins' => [
-                                       'comment_ar_comment'
-                                               => [ 'JOIN', 'comment_ar_comment.comment_id = ar_comment_id' ],
-                                       'actor_ar_user' => [ 'JOIN', 'actor_ar_user.actor_id = ar_actor' ],
-                               ],
-                       ]
-               ];
        }
 
        public function provideQueryInfo() {
@@ -397,238 +374,6 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                ],
                        ]
                ];
-               yield 'pre-MCR' => [
-                       [
-                               'wgContentHandlerUseDB' => true,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [],
-                       [
-                               'tables' => [
-                                       'revision',
-                                       'temp_rev_comment' => 'revision_comment_temp',
-                                       'comment_rev_comment' => 'comment',
-                                       'temp_rev_user' => 'revision_actor_temp',
-                                       'actor_rev_user' => 'actor',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getRevisionQueryFields( true ),
-                                       $this->getContentHandlerQueryFields( 'rev' ),
-                                       $this->getNewActorQueryFields( 'rev', true ),
-                                       $this->getNewCommentQueryFields( 'rev' )
-                               ),
-                               'joins' => [
-                                       'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
-                                       'comment_rev_comment'
-                                               => [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
-                                       'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
-                                       'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
-                               ],
-                       ]
-               ];
-               yield 'pre-MCR, page, user' => [
-                       [
-                               'wgContentHandlerUseDB' => true,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [ 'page', 'user' ],
-                       [
-                               'tables' => [
-                                       'revision', 'page', 'user',
-                                       'temp_rev_comment' => 'revision_comment_temp',
-                                       'comment_rev_comment' => 'comment',
-                                       'temp_rev_user' => 'revision_actor_temp',
-                                       'actor_rev_user' => 'actor',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getRevisionQueryFields( true ),
-                                       $this->getContentHandlerQueryFields( 'rev' ),
-                                       $this->getPageQueryFields(),
-                                       $this->getUserQueryFields(),
-                                       $this->getNewActorQueryFields( 'rev', true ),
-                                       $this->getNewCommentQueryFields( 'rev' )
-                               ),
-                               'joins' => [
-                                       'page' => [ 'JOIN', [ 'page_id = rev_page' ] ],
-                                       'user' => [ 'LEFT JOIN', [
-                                               'actor_rev_user.actor_user != 0',
-                                               'user_id = actor_rev_user.actor_user',
-                                       ] ],
-                                       'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
-                                       'comment_rev_comment'
-                                               => [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
-                                       'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
-                                       'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
-                               ],
-                       ]
-               ];
-               yield 'pre-MCR, no model' => [
-                       [
-                               'wgContentHandlerUseDB' => false,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [],
-                       [
-                               'tables' => [
-                                       'revision',
-                                       'temp_rev_comment' => 'revision_comment_temp',
-                                       'comment_rev_comment' => 'comment',
-                                       'temp_rev_user' => 'revision_actor_temp',
-                                       'actor_rev_user' => 'actor',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getRevisionQueryFields( true ),
-                                       $this->getNewActorQueryFields( 'rev', true ),
-                                       $this->getNewCommentQueryFields( 'rev' )
-                               ),
-                               'joins' => [
-                                       'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
-                                       'comment_rev_comment'
-                                               => [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
-                                       'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
-                                       'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
-                               ],
-                       ],
-               ];
-               yield 'pre-MCR, no model, page' => [
-                       [
-                               'wgContentHandlerUseDB' => false,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [ 'page' ],
-                       [
-                               'tables' => [
-                                       'revision', 'page',
-                                       'temp_rev_comment' => 'revision_comment_temp',
-                                       'comment_rev_comment' => 'comment',
-                                       'temp_rev_user' => 'revision_actor_temp',
-                                       'actor_rev_user' => 'actor',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getRevisionQueryFields( true ),
-                                       $this->getPageQueryFields(),
-                                       $this->getNewActorQueryFields( 'rev', true ),
-                                       $this->getNewCommentQueryFields( 'rev' )
-                               ),
-                               'joins' => [
-                                       'page' => [ 'JOIN', [ 'page_id = rev_page' ], ],
-                                       'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
-                                       'comment_rev_comment'
-                                               => [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
-                                       'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
-                                       'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
-                               ],
-                       ],
-               ];
-               yield 'pre-MCR, no model, user' => [
-                       [
-                               'wgContentHandlerUseDB' => false,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [ 'user' ],
-                       [
-                               'tables' => [
-                                       'revision', 'user',
-                                       'temp_rev_comment' => 'revision_comment_temp',
-                                       'comment_rev_comment' => 'comment',
-                                       'temp_rev_user' => 'revision_actor_temp',
-                                       'actor_rev_user' => 'actor',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getRevisionQueryFields( true ),
-                                       $this->getUserQueryFields(),
-                                       $this->getNewActorQueryFields( 'rev', true ),
-                                       $this->getNewCommentQueryFields( 'rev' )
-                               ),
-                               'joins' => [
-                                       'user' => [ 'LEFT JOIN', [
-                                               'actor_rev_user.actor_user != 0',
-                                               'user_id = actor_rev_user.actor_user',
-                                       ] ],
-                                       'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
-                                       'comment_rev_comment'
-                                               => [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
-                                       'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
-                                       'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
-                               ],
-                       ],
-               ];
-               yield 'pre-MCR, no model, text' => [
-                       [
-                               'wgContentHandlerUseDB' => false,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [ 'text' ],
-                       [
-                               'tables' => [
-                                       'revision', 'text',
-                                       'temp_rev_comment' => 'revision_comment_temp',
-                                       'comment_rev_comment' => 'comment',
-                                       'temp_rev_user' => 'revision_actor_temp',
-                                       'actor_rev_user' => 'actor',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getRevisionQueryFields( true ),
-                                       $this->getTextQueryFields(),
-                                       $this->getNewActorQueryFields( 'rev', true ),
-                                       $this->getNewCommentQueryFields( 'rev' )
-                               ),
-                               'joins' => [
-                                       'text' => [ 'JOIN', [ 'rev_text_id=old_id' ] ],
-                                       'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
-                                       'comment_rev_comment'
-                                               => [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
-                                       'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
-                                       'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
-                               ],
-                       ],
-               ];
-               yield 'pre-MCR, no model, text, page, user' => [
-                       [
-                               'wgContentHandlerUseDB' => false,
-                               'wgMultiContentRevisionSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
-                       ],
-                       [ 'text', 'page', 'user' ],
-                       [
-                               'tables' => [
-                                       'revision', 'page', 'user', 'text',
-                                       'temp_rev_comment' => 'revision_comment_temp',
-                                       'comment_rev_comment' => 'comment',
-                                       'temp_rev_user' => 'revision_actor_temp',
-                                       'actor_rev_user' => 'actor',
-                               ],
-                               'fields' => array_merge(
-                                       $this->getRevisionQueryFields( true ),
-                                       $this->getPageQueryFields(),
-                                       $this->getUserQueryFields(),
-                                       $this->getTextQueryFields(),
-                                       $this->getNewActorQueryFields( 'rev', true ),
-                                       $this->getNewCommentQueryFields( 'rev' )
-                               ),
-                               'joins' => [
-                                       'page' => [
-                                               'JOIN',
-                                               [ 'page_id = rev_page' ],
-                                       ],
-                                       'user' => [
-                                               'LEFT JOIN',
-                                               [
-                                                       'actor_rev_user.actor_user != 0',
-                                                       'user_id = actor_rev_user.actor_user',
-                                               ],
-                                       ],
-                                       'text' => [
-                                               'JOIN',
-                                               [ 'rev_text_id=old_id' ],
-                                       ],
-                                       'temp_rev_comment' => [ 'JOIN', 'temp_rev_comment.revcomment_rev = rev_id' ],
-                                       'comment_rev_comment'
-                                               => [ 'JOIN', 'comment_rev_comment.comment_id = temp_rev_comment.revcomment_comment_id' ],
-                                       'temp_rev_user' => [ 'JOIN', 'temp_rev_user.revactor_rev = rev_id' ],
-                                       'actor_rev_user' => [ 'JOIN', 'actor_rev_user.actor_id = temp_rev_user.revactor_actor' ],
-                               ],
-                       ],
-               ];
        }
 
        public function provideSlotsQueryInfo() {
@@ -805,54 +550,6 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                'joins' => [],
                        ]
                ];
-               yield 'pre-MCR' => [
-                       [
-                               'wgMultiContentRevisionSchemaMigrationStage'
-                                       => SCHEMA_COMPAT_OLD,
-                       ],
-                       [],
-                       [
-                               'tables' => [
-                                       'revision',
-                               ],
-                               'fields' => array_merge(
-                                       [
-                                               'slot_revision_id' => 'rev_id',
-                                               'slot_content_id' => 'NULL',
-                                               'slot_origin' => 'rev_id',
-                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
-                                       ]
-                               ),
-                               'joins' => [],
-                       ]
-               ];
-               yield 'pre-MCR, content' => [
-                       [
-                               'wgMultiContentRevisionSchemaMigrationStage'
-                                       => SCHEMA_COMPAT_OLD,
-                       ],
-                       [ 'content' ],
-                       [
-                               'tables' => [
-                                       'revision',
-                               ],
-                               'fields' => array_merge(
-                                       [
-                                               'slot_revision_id' => 'rev_id',
-                                               'slot_content_id' => 'NULL',
-                                               'slot_origin' => 'rev_id',
-                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
-                                               'content_size' => 'rev_len',
-                                               'content_sha1' => 'rev_sha1',
-                                               'content_address' =>
-                                                       $db->buildConcat( [ $db->addQuotes( 'tt:' ), 'rev_text_id' ] ),
-                                               'rev_text_id' => 'rev_text_id',
-                                               'model_name' => 'rev_content_model',
-                                       ]
-                               ),
-                               'joins' => [],
-                       ]
-               ];
        }
 
        /**
index 76190e0..6bf219d 100644 (file)
@@ -4,8 +4,10 @@ namespace MediaWiki\Tests\Revision;
 
 use CommentStoreComment;
 use Content;
+use ContentHandler;
 use Exception;
 use HashBagOStuff;
+use IDBAccessObject;
 use InvalidArgumentException;
 use Language;
 use MediaWiki\Linker\LinkTarget;
@@ -105,7 +107,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
         * @return WikiPage
         */
        protected function getTestPage( $pageTitle = null ) {
-               if ( !is_null( $pageTitle ) && $this->testPage ) {
+               if ( is_null( $pageTitle ) && $this->testPage ) {
                        return $this->testPage;
                }
 
@@ -1992,23 +1994,17 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        ) {
                $page1 = $this->getTestPage();
                $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
                /** @var Revision $rev1 */
-               $rev1 = $page1->doEditContent(
-                       new WikitextContent( $text . '1' ),
-                       __METHOD__ . 'b',
-                       0,
-                       false,
-                       $this->getTestUser()->getUser()
-               )->value['revision'];
+               $rev1 = $editStatus->getValue()['revision'];
+
                $page2 = $this->getTestPage( $otherPageTitle );
+               $editStatus = $this->editPage( $page2->getTitle()->getPrefixedDBkey(), $text . '2' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 2' );
                /** @var Revision $rev2 */
-               $rev2 = $page2->doEditContent(
-                       new WikitextContent( $text . '2' ),
-                       __METHOD__ . 'b',
-                       0,
-                       false,
-                       $this->getTestUser()->getUser()
-               )->value['revision'];
+               $rev2 = $editStatus->getValue()['revision'];
+
                $store = MediaWikiServices::getInstance()->getRevisionStore();
                $result = $store->newRevisionsFromBatch(
                        [ $this->revisionToRow( $rev1 ), $this->revisionToRow( $rev2 ) ],
@@ -2016,14 +2012,15 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                );
                $this->assertTrue( $result->isGood() );
                $this->assertEmpty( $result->getErrors() );
+               /** @var RevisionRecord[] $records */
                $records = $result->getValue();
                $this->assertRevisionRecordMatchesRevision( $rev1, $records[$rev1->getId()] );
                $this->assertRevisionRecordMatchesRevision( $rev2, $records[$rev2->getId()] );
 
                $this->assertSame( $text . '1',
-                       $records[$rev1->getId()]->getContent( SlotRecord::MAIN )->serialize() );
+                       ContentHandler::getContentText( $records[$rev1->getId()]->getContent( SlotRecord::MAIN ) ) );
                $this->assertSame( $text . '2',
-                       $records[$rev2->getId()]->getContent( SlotRecord::MAIN )->serialize() );
+                       ContentHandler::getContentText( $records[$rev2->getId()]->getContent( SlotRecord::MAIN ) ) );
                $this->assertEquals( $page1->getTitle()->getDBkey(),
                        $records[$rev1->getId()]->getPageAsLinkTarget()->getDBkey() );
                $this->assertEquals( $page2->getTitle()->getDBkey(),
@@ -2046,4 +2043,43 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertEmpty( $result->getValue() );
                $this->assertEmpty( $result->getErrors() );
        }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+        */
+       public function testNewRevisionsFromBatch_wrongTitle() {
+               $page1 = $this->getTestPage();
+               $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
+               /** @var Revision $rev1 */
+               $rev1 = $editStatus->getValue()['revision'];
+
+               $this->setExpectedException( InvalidArgumentException::class );
+               MediaWikiServices::getInstance()->getRevisionStore()
+                       ->newRevisionsFromBatch(
+                               [ $this->revisionToRow( $rev1 ) ],
+                               [],
+                               IDBAccessObject::READ_NORMAL,
+                               $this->getTestPage( 'Title_Other_Then_The_One_Revision_Belongs_To' )->getTitle()
+                       );
+       }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+        */
+       public function testNewRevisionsFromBatch_DuplicateRows() {
+               $page1 = $this->getTestPage();
+               $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
+               /** @var Revision $rev1 */
+               $rev1 = $editStatus->getValue()['revision'];
+
+               $status = MediaWikiServices::getInstance()->getRevisionStore()
+                       ->newRevisionsFromBatch( [ $this->revisionToRow( $rev1 ), $this->revisionToRow( $rev1 ) ] );
+
+               $this->assertFalse( $status->isGood() );
+               $this->assertTrue( $status->hasMessage( 'internalerror' ) );
+       }
 }
index f4d324d..d42ab16 100644 (file)
@@ -4,7 +4,6 @@ namespace MediaWiki\Tests\Revision;
 
 use ActorMigration;
 use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
 use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\RevisionStoreFactory;
 use MediaWiki\Revision\SlotRoleRegistry;
@@ -34,8 +33,8 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                        $this->getHashWANObjectCache(),
                        $this->getMockCommentStore(),
                        ActorMigration::newMigration(),
-                       MIGRATION_OLD,
-                       $this->getMockLoggerSpi(),
+                       MIGRATION_NEW,
+                       new NullLogger(),
                        true
                );
                $this->assertTrue( true );
@@ -45,8 +44,6 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                yield [ true ];
                yield [ false ];
                yield [ 'somewiki' ];
-               yield [ 'somewiki', MIGRATION_OLD , false ];
-               yield [ 'somewiki', MIGRATION_NEW , true ];
        }
 
        /**
@@ -55,7 +52,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
         */
        public function testGetRevisionStore(
                $dbDomain,
-               $mcrMigrationStage = MIGRATION_OLD,
+               $mcrMigrationStage = MIGRATION_NEW,
                $contentHandlerUseDb = true
        ) {
                $lbFactory = $this->getMockLoadBalancerFactory();
@@ -65,7 +62,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                $cache = $this->getHashWANObjectCache();
                $commentStore = $this->getMockCommentStore();
                $actorMigration = ActorMigration::newMigration();
-               $loggerProvider = $this->getMockLoggerSpi();
+               $logger = new NullLogger();
 
                $factory = new RevisionStoreFactory(
                        $lbFactory,
@@ -76,7 +73,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                        $commentStore,
                        $actorMigration,
                        $mcrMigrationStage,
-                       $loggerProvider,
+                       $logger,
                        $contentHandlerUseDb
                );
 
@@ -178,16 +175,4 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                return new WANObjectCache( [ 'cache' => new \HashBagOStuff() ] );
        }
 
-       /**
-        * @return \PHPUnit_Framework_MockObject_MockObject|LoggerSpi
-        */
-       private function getMockLoggerSpi() {
-               $mock = $this->getMock( LoggerSpi::class );
-
-               $mock->method( 'getLogger' )
-                       ->willReturn( new NullLogger() );
-
-               return $mock;
-       }
-
 }
index 83872e3..9b26c37 100644 (file)
@@ -120,9 +120,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
 
        public function provideSetContentHandlerUseDB() {
                return [
-                       // ContentHandlerUseDB can be true of false pre migration.
-                       [ false, SCHEMA_COMPAT_OLD, false ],
-                       [ true, SCHEMA_COMPAT_OLD, false ],
+                       // ContentHandlerUseDB can be true or false pre migration.
                        // During and after migration it can not be false...
                        [ false, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, true ],
                        [ false, SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, true ],
@@ -563,7 +561,6 @@ class RevisionStoreTest extends MediaWikiTestCase {
 
        public function provideMigrationConstruction() {
                return [
-                       [ SCHEMA_COMPAT_OLD, false ],
                        [ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD, false ],
                        [ SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW, false ],
                        [ SCHEMA_COMPAT_NEW, false ],
diff --git a/tests/phpunit/includes/RevisionNoContentModelDbTest.php b/tests/phpunit/includes/RevisionNoContentModelDbTest.php
deleted file mode 100644 (file)
index f19bc52..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
-
-/**
- * Tests Revision against the pre-MCR, pre ContentHandler DB schema.
- *
- * @covers Revision
- *
- * @group Revision
- * @group Storage
- * @group ContentHandler
- * @group Database
- * @group medium
- */
-class RevisionNoContentModelDbTest extends RevisionDbTestBase {
-
-       use PreMcrSchemaOverride;
-
-       protected function getContentHandlerUseDB() {
-               return false;
-       }
-
-       public function provideGetTextId() {
-               yield [ [], null ];
-
-               $row = (object)[
-                       'rev_id' => 7,
-                       'rev_page' => 1, // should match actual page id
-                       'rev_text_id' => 789,
-                       'rev_timestamp' => '20180101000000',
-                       'rev_len' => 7,
-                       'rev_minor_edit' => 0,
-                       'rev_deleted' => 0,
-                       'rev_parent_id' => 0,
-                       'rev_sha1' => 'deadbeef',
-                       'rev_comment' => 'some comment',
-                       'rev_comment_text' => 'some comment',
-                       'rev_comment_data' => '{}',
-                       'rev_user' => 17,
-                       'rev_user_text' => 'some user',
-               ];
-
-               yield [ $row, 789 ];
-       }
-
-       public function provideGetRevisionText() {
-               yield [
-                       [ 'text' ]
-               ];
-       }
-
-}
diff --git a/tests/phpunit/includes/RevisionPreMcrDbTest.php b/tests/phpunit/includes/RevisionPreMcrDbTest.php
deleted file mode 100644 (file)
index 444c150..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
-
-/**
- * Tests Revision against the pre-MCR DB schema.
- *
- * @covers Revision
- *
- * @group Revision
- * @group Storage
- * @group ContentHandler
- * @group Database
- * @group medium
- */
-class RevisionPreMcrDbTest extends RevisionDbTestBase {
-
-       use PreMcrSchemaOverride;
-
-       protected function getContentHandlerUseDB() {
-               return true;
-       }
-
-       public function provideGetTextId() {
-               yield [ [], null ];
-
-               $row = (object)[
-                       'rev_id' => 7,
-                       'rev_page' => 1, // should match actual page id
-                       'rev_text_id' => 789,
-                       'rev_timestamp' => '20180101000000',
-                       'rev_len' => 7,
-                       'rev_minor_edit' => 0,
-                       'rev_deleted' => 0,
-                       'rev_parent_id' => 0,
-                       'rev_sha1' => 'deadbeef',
-                       'rev_comment' => 'some comment',
-                       'rev_comment_text' => 'some comment',
-                       'rev_comment_data' => '{}',
-                       'rev_user' => 17,
-                       'rev_user_text' => 'some user',
-               ];
-
-               yield [ $row, 789 ];
-       }
-
-       public function provideGetRevisionText() {
-               yield [
-                       [ 'text' ]
-               ];
-       }
-}
index ed4a27f..249fa78 100644 (file)
@@ -850,8 +850,7 @@ class RevisionTest extends MediaWikiTestCase {
                );
 
                $cacheKey = $cache->makeGlobalKey(
-                       'BlobStore',
-                       'address',
+                       'SqlBlobStore-blob',
                        $lb->getLocalDomainID(),
                        'tt:7777'
                );
index b0d89a6..ff9fa7b 100644 (file)
@@ -21,7 +21,7 @@ class SiteStatsTest extends MediaWikiTestCase {
                );
 
                $jobq->get( 'null' )->delete();  // clear jobqueue
-               $this->assertEquals( 0, $jobq->get( 'null' )->getSize(),
+               $this->assertSame( 0, $jobq->get( 'null' )->getSize(),
                        'Job queue for NullJob has been cleaned' );
 
                $cache->delete( $cache->makeKey( 'SiteStats', 'jobscount' ) );
@@ -29,7 +29,7 @@ class SiteStatsTest extends MediaWikiTestCase {
                        'jobs count is kept in process cache' );
 
                $cache->clearProcessCache();
-               $this->assertEquals( 0, SiteStats::jobs() );
+               $this->assertSame( 0, SiteStats::jobs() );
        }
 
 }
index 2148411..c64169f 100644 (file)
@@ -1062,7 +1062,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $this->db->endAtomic( __METHOD__ ); // run deferred updates
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
        }
 
        /**
@@ -1095,7 +1095,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $this->db->endAtomic( __METHOD__ ); // run deferred updates
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
                $this->assertNotFalse( $pcache->get( $page, $updater->getCanonicalParserOptions() ) );
        }
 
index 77d6f59..ec002e0 100644 (file)
@@ -327,7 +327,7 @@ class TitleMethodsTest extends MediaWikiLangTestCase {
 
                $title2 = Title::newFromText( 'Foo' );
                $this->assertNotSame( $title1, $title2, 'title cache should be empty' );
-               $this->assertEquals( 0, $linkCache->getGoodLinkID( 'Foo' ), 'link cache should be empty' );
+               $this->assertSame( 0, $linkCache->getGoodLinkID( 'Foo' ), 'link cache should be empty' );
        }
 
        public function provideGetLinkURL() {
index 82ccb9a..608d590 100644 (file)
@@ -834,8 +834,23 @@ class TitleTest extends MediaWikiTestCase {
                return [
                        [ Title::makeTitle( NS_SPECIAL, 'Test' ) ],
                        [ Title::makeTitle( NS_MEDIA, 'Test' ) ],
-                       [ Title::makeTitle( NS_MAIN, '', 'Kittens' ) ],
-                       [ Title::makeTitle( NS_MAIN, 'Kittens', '', 'acme' ) ],
+               ];
+       }
+
+       public static function provideGetTalkPage_broken() {
+               // These cases *should* be bad, but are not treated as bad, for backwards compatibility.
+               // See discussion on T227817.
+               return [
+                       [
+                               Title::makeTitle( NS_MAIN, '', 'Kittens' ),
+                               Title::makeTitle( NS_TALK, '' ), // Section is lost!
+                               false,
+                       ],
+                       [
+                               Title::makeTitle( NS_MAIN, 'Kittens', '', 'acme' ),
+                               Title::makeTitle( NS_TALK, 'Kittens', '' ), // Interwiki prefix is lost!
+                               true,
+                       ],
                ];
        }
 
@@ -895,6 +910,23 @@ class TitleTest extends MediaWikiTestCase {
                $title->getTalkPage();
        }
 
+       /**
+        * @dataProvider provideGetTalkPage_broken
+        * @covers Title::getTalkPageIfDefined
+        */
+       public function testGetTalkPage_broken( Title $title, Title $expected, $valid ) {
+               $errorLevel = error_reporting( E_ERROR );
+
+               // NOTE: Eventually we want to throw in this case. But while there is still code that
+               // calls this method without checking, we want to avoid fatal errors.
+               // See discussion on T227817.
+               $result = $title->getTalkPage();
+               $this->assertTrue( $expected->equals( $result ) );
+               $this->assertSame( $valid, $result->isValid() );
+
+               error_reporting( $errorLevel );
+       }
+
        /**
         * @dataProvider provideGetTalkPage_good
         * @covers Title::getTalkPageIfDefined
index ab9abbb..f95505b 100644 (file)
@@ -46,7 +46,7 @@ class XmlTest extends MediaWikiTestCase {
                $this->assertNull( Xml::expandAttributes( null ),
                        'Converting a null list of attributes'
                );
-               $this->assertEquals( '', Xml::expandAttributes( [] ),
+               $this->assertSame( '', Xml::expandAttributes( [] ),
                        'Converting an empty list of attributes'
                );
        }
index 2d19d38..fe6fcfc 100644 (file)
@@ -182,7 +182,6 @@ class ApiBlockTest extends ApiTestCase {
                $this->setMwGlobals( [
                        'wgEnableEmail' => true,
                        'wgEnableUserEmail' => true,
-                       'wgSysopEmailBans' => true,
                ] );
 
                $res = $this->doBlock( [ 'noemail' => '' ] );
@@ -200,7 +199,6 @@ class ApiBlockTest extends ApiTestCase {
                $this->setMwGlobals( [
                        'wgEnableEmail' => true,
                        'wgEnableUserEmail' => true,
-                       'wgSysopEmailBans' => true,
                ] );
 
                $this->setExpectedException( ApiUsageException::class,
index 3a3f5f1..1606275 100644 (file)
@@ -2,6 +2,7 @@
 
 use Wikimedia\Rdbms\DBQueryError;
 use Wikimedia\TestingAccessWrapper;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
 
 /**
  * @group API
@@ -169,6 +170,10 @@ class ApiMainTest extends ApiTestCase {
        }
 
        public function testAddRequestedFieldsCurTimestamp() {
+               // Fake timestamp for better testability, CI can sometimes take
+               // unreasonably long to run the simple test request here.
+               $reset = ConvertibleTimestamp::setFakeTime( '20190102030405' );
+
                $req = new FauxRequest( [
                        'action' => 'query',
                        'meta' => 'siteinfo',
@@ -177,7 +182,7 @@ class ApiMainTest extends ApiTestCase {
                $api = new ApiMain( $req );
                $api->execute();
                $timestamp = $api->getResult()->getResultData()['curtimestamp'];
-               $this->assertLessThanOrEqual( 1, abs( strtotime( $timestamp ) - time() ) );
+               $this->assertSame( '2019-01-02T03:04:05Z', $timestamp );
        }
 
        public function testAddRequestedFieldsResponseLangInfo() {
index fdc9c1b..b1b8a42 100644 (file)
@@ -214,7 +214,7 @@ class ApiPageSetTest extends ApiTestCase {
                        'titles' => 'User:' . implode( '|User:', $userNames ),
                ] );
 
-               $this->assertEquals( 0, $genderCache->misses,
+               $this->assertSame( 0, $genderCache->misses,
                        'ApiPageSet does not prefill the gender cache correctly' );
                $this->assertEquals( $userNames, array_keys( $genderCache->cache ),
                        'ApiPageSet does not prefill all users into the gender cache' );
diff --git a/tests/phpunit/includes/api/ApiQueryBlockInfoTraitTest.php b/tests/phpunit/includes/api/ApiQueryBlockInfoTraitTest.php
new file mode 100644 (file)
index 0000000..cded9dd
--- /dev/null
@@ -0,0 +1,77 @@
+<?php
+
+use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
+use Wikimedia\Timestamp\ConvertibleTimestamp;
+
+/**
+ * @covers ApiQueryBlockInfoTrait
+ */
+class ApiQueryBlockInfoTraitTest extends MediaWikiTestCase {
+
+       public function testUsesApiBlockInfoTrait() {
+               $this->assertTrue( method_exists( ApiQueryBlockInfoTrait::class, 'getBlockDetails' ),
+                       'ApiQueryBlockInfoTrait::getBlockDetails exists' );
+       }
+
+       /**
+        * @dataProvider provideAddBlockInfoToQuery
+        */
+       public function testAddBlockInfoToQuery( $args, $expect ) {
+               // Fake timestamp to show up in the queries
+               $reset = ConvertibleTimestamp::setFakeTime( '20190101000000' );
+
+               $data = [];
+
+               $mock = $this->getMockForTrait( ApiQueryBlockInfoTrait::class );
+               $mock->method( 'getDB' )->willReturn( wfGetDB( DB_REPLICA ) );
+               $mock->method( 'getPermissionManager' )
+                       ->willReturn( MediaWikiServices::getInstance()->getPermissionManager() );
+               $mock->method( 'getUser' )
+                       ->willReturn( $this->getMutableTestUser()->getUser() );
+               $mock->method( 'addTables' )->willReturnCallback( function ( $v ) use ( &$data ) {
+                       $data['tables'] = array_merge( $data['tables'] ?? [], (array)$v );
+               } );
+               $mock->method( 'addFields' )->willReturnCallback( function ( $v ) use ( &$data ) {
+                       $data['fields'] = array_merge( $data['fields'] ?? [], (array)$v );
+               } );
+               $mock->method( 'addWhere' )->willReturnCallback( function ( $v ) use ( &$data ) {
+                       $data['where'] = array_merge( $data['where'] ?? [], (array)$v );
+               } );
+               $mock->method( 'addJoinConds' )->willReturnCallback( function ( $v ) use ( &$data ) {
+                       $data['joins'] = array_merge( $data['joins'] ?? [], (array)$v );
+               } );
+
+               TestingAccessWrapper::newFromObject( $mock )->addBlockInfoToQuery( ...$args );
+               $this->assertEquals( $expect, $data );
+       }
+
+       public function provideAddBlockInfoToQuery() {
+               $queryInfo = DatabaseBlock::getQueryInfo();
+
+               $db = wfGetDB( DB_REPLICA );
+               $ts = $db->addQuotes( $db->timestamp( '20190101000000' ) );
+
+               return [
+                       [ [ false ], [
+                               'tables' => [ 'blk' => [ 'ipblocks' ] ],
+                               'fields' => [ 'ipb_deleted' ],
+                               'where' => [ 'ipb_deleted = 0 OR ipb_deleted IS NULL' ],
+                               'joins' => [
+                                       'blk' => [ 'LEFT JOIN', [ 'ipb_user=user_id', "ipb_expiry > $ts" ] ]
+                               ],
+                       ] ],
+
+                       [ [ true ], [
+                               'tables' => [ 'blk' => $queryInfo['tables'] ],
+                               'fields' => $queryInfo['fields'],
+                               'where' => [ 'ipb_deleted = 0 OR ipb_deleted IS NULL' ],
+                               'joins' => $queryInfo['joins'] + [
+                                       'blk' => [ 'LEFT JOIN', [ 'ipb_user=user_id', "ipb_expiry > $ts" ] ]
+                               ],
+                       ] ],
+               ];
+       }
+
+}
index 0a2558a..7f5ee0c 100644 (file)
@@ -79,15 +79,46 @@ class ApiQuerySiteinfoTest extends ApiTestCase {
                $this->assertSame( 'Need more donations', $data['readonlyreason'] );
        }
 
-       public function testNamespaces() {
-               $this->setMwGlobals( 'wgExtraNamespaces', [ '138' => 'Testing' ] );
+       public function testNamespacesBasic() {
+               $this->assertSame(
+                       array_keys( MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() ),
+                       array_keys( $this->doQuery( 'namespaces' ) )
+               );
+       }
 
+       public function testNamespacesExtraNS() {
+               $this->setMwGlobals( 'wgExtraNamespaces', [ '138' => 'Testing' ] );
                $this->assertSame(
                        array_keys( MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() ),
                        array_keys( $this->doQuery( 'namespaces' ) )
                );
        }
 
+       public function testNamespacesProtection() {
+               $this->setMwGlobals(
+                       'wgNamespaceProtection',
+                       [
+                               '0' => '',
+                               '2' => [ '' ],
+                               '4' => 'editsemiprotected',
+                               '8' => [
+                                       'editinterface',
+                                       'noratelimit'
+                               ],
+                               '14' => [
+                                       'move-categorypages',
+                                       ''
+                               ]
+                       ]
+               );
+               $data = $this->doQuery( 'namespaces' );
+               $this->assertArrayNotHasKey( 'namespaceprotection', $data['0'] );
+               $this->assertArrayNotHasKey( 'namespaceprotection', $data['2'] );
+               $this->assertSame( 'editsemiprotected', $data['4']['namespaceprotection'] );
+               $this->assertSame( 'editinterface|noratelimit', $data['8']['namespaceprotection'] );
+               $this->assertSame( 'move-categorypages', $data['14']['namespaceprotection'] );
+       }
+
        public function testNamespaceAliases() {
                global $wgNamespaceAliases;
 
@@ -634,17 +665,13 @@ class ApiQuerySiteinfoTest extends ApiTestCase {
        }
 
        public function testContinuation() {
-               // We make lots and lots of URL protocols that are each 100 bytes
+               // Use $wgUrlProtocols to forge the size of the API query
                global $wgAPIMaxResultSize, $wgUrlProtocols;
 
-               $this->setMwGlobals( 'wgUrlProtocols', [] );
-
-               // Just under the limit
-               $chunks = $wgAPIMaxResultSize / 100 - 1;
+               $protocol = 'foo://';
 
-               for ( $i = 0; $i < $chunks; $i++ ) {
-                       $wgUrlProtocols[] = substr( str_repeat( "$i ", 50 ), 0, 100 );
-               }
+               $this->setMwGlobals( 'wgUrlProtocols', [ $protocol ] );
+               $this->setMwGlobals( 'wgAPIMaxResultSize', strlen( $protocol ) );
 
                $res = $this->doApiRequest( [
                        'action' => 'query',
index 2b08a81..26fedba 100644 (file)
@@ -1575,7 +1575,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $pages = array_values( $result[0]['query']['pages'] );
 
                $this->assertCount( 1, $pages );
-               $this->assertEquals( 0, $pages[0]['ns'] );
+               $this->assertSame( 0, $pages[0]['ns'] );
                $this->assertEquals( $this->getPrefixedText( $target ), $pages[0]['title'] );
                $this->assertArraySubsetsEqual(
                        $pages[0]['revisions'],
index c554fb3..b41c3e5 100644 (file)
@@ -535,7 +535,7 @@ class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
                // $result[0]['query']['pages'] uses page ids as keys
                $item = array_values( $result[0]['query']['pages'] )[0];
 
-               $this->assertEquals( 0, $item['ns'] );
+               $this->assertSame( 0, $item['ns'] );
                $this->assertEquals( 'ApiQueryWatchlistRawIntegrationTestPage', $item['title'] );
        }
 
index 5dcea65..7dc63fb 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\Block\Restriction\PageRestriction;
+
 /**
  * Tests for action=revisiondelete
  * @covers APIRevisionDelete
@@ -113,4 +116,32 @@ class ApiRevisionDeleteTest extends ApiTestCase {
                $this->assertTrue( $item['texthidden'], 'texthidden' );
                $this->assertEquals( $item['id'], $revid );
        }
+
+       public function testPartiallyBlockedPage() {
+               $this->setExpectedApiException( 'apierror-blocked-partial' );
+
+               $user = static::getTestSysop()->getUser();
+
+               $block = new DatabaseBlock( [
+                       'address' => $user,
+                       'by' => static::getTestSysop()->getUser()->getId(),
+                       'sitewide' => false,
+               ] );
+
+               $block->setRestrictions( [
+                       new PageRestriction( 0, Title::newFromText( self::$page )->getArticleID() )
+               ] );
+               $block->insert();
+
+               $revid = array_shift( $this->revs );
+
+               $this->doApiRequest( [
+                       'action' => 'revisiondelete',
+                       'type' => 'revision',
+                       'target' => self::$page,
+                       'ids' => $revid,
+                       'hide' => 'content|user|comment',
+                       'token' => $user->getEditToken(),
+               ] );
+       }
 }
index 6d64a17..24d016e 100644 (file)
@@ -64,7 +64,7 @@ class ApiWatchTest extends ApiTestCase {
                                unset( $data[0]['query']['watchlist'][$index] );
                        }
                }
-               $this->assertEquals( 0, count( $data[0]['query']['watchlist'] ) );
+               $this->assertSame( 0, count( $data[0]['query']['watchlist'] ) );
 
                return $data;
        }
index f8be1d4..55d4e10 100644 (file)
@@ -2120,9 +2120,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        }
 
                        if ( $created ) {
-                               $this->assertNotEquals( 0, \User::idFromName( $username ) );
+                               $this->assertNotNull( \User::idFromName( $username ) );
                        } else {
-                               $this->assertEquals( 0, \User::idFromName( $username ) );
+                               $this->assertNull( \User::idFromName( $username ) );
                        }
 
                        $first = false;
@@ -2474,7 +2474,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertEquals( $expect, $ret );
                $this->assertNotEquals( 0, $user->getId() );
                $this->assertSame( 'UTSysop', $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, '{username} already exists locally' ],
                ], $logger->getBuffer() );
@@ -2489,9 +2489,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( wfMessage( 'readonlytext', 'Because' ) ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'denied by wfReadOnly(): {reason}' ],
                ], $logger->getBuffer() );
@@ -2506,9 +2506,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'test' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'blacklisted in session {sessionid}' ],
                ], $logger->getBuffer() );
@@ -2521,9 +2521,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'test2' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'blacklisted in session {sessionid}' ],
                ], $logger->getBuffer() );
@@ -2536,9 +2536,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'noname' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username . '@', $user->getId() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'name "{username}" is not creatable' ],
                ], $logger->getBuffer() );
@@ -2554,9 +2554,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'authmanager-autocreate-noperm' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'IP lacks the ability to create or autocreate accounts' ],
                ], $logger->getBuffer() );
@@ -2608,9 +2608,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                unset( $lock );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'usernameinprogress' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Could not acquire account creation lock' ],
                ], $logger->getBuffer() );
@@ -2623,9 +2623,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'fail-in-pre' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Provider denied creation of {username}: {reason}' ],
                ], $logger->getBuffer() );
@@ -2640,9 +2640,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'fail-in-primary' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Provider denied creation of {username}: {reason}' ],
                ], $logger->getBuffer() );
@@ -2657,9 +2657,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'fail-in-secondary' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Provider denied creation of {username}: {reason}' ],
                ], $logger->getBuffer() );
@@ -2678,9 +2678,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'authmanager-autocreate-exception' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, '{username} denied by prior creation attempt failures' ],
                ], $logger->getBuffer() );
@@ -2697,9 +2697,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $user->setName( $username );
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->assertEquals( \Status::newFatal( 'because' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::INFO, 'creating new user ({username}) - from: {from}' ],
                        [ LogLevel::ERROR, '{username} failed with message {msg}' ],
@@ -2723,8 +2723,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                } catch ( \Exception $ex ) {
                        $this->assertSame( 'Excepted', $ex->getMessage() );
                }
-               $this->assertEquals( 0, $user->getId() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $user->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::INFO, 'creating new user ({username}) - from: {from}' ],
                        [ LogLevel::ERROR, '{username} failed with exception {exception}' ],
@@ -2790,7 +2790,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertEquals( \Status::newGood(), $ret );
                $this->assertNotEquals( 0, $user->getId() );
                $this->assertEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::INFO, 'creating new user ({username}) - from: {from}' ],
                ], $logger->getBuffer() );
index d4133b7..230d36a 100644 (file)
@@ -6,6 +6,7 @@ use MediaWiki\Block\CompositeBlock;
 use MediaWiki\Block\SystemBlock;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
+use Psr\Log\LoggerInterface;
 
 /**
  * @group Blocking
@@ -48,15 +49,15 @@ class BlockManagerTest extends MediaWikiTestCase {
        private function getBlockManagerConstructorArgs( $overrideConfig ) {
                $blockManagerConfig = array_merge( $this->blockManagerConfig, $overrideConfig );
                $this->setMwGlobals( $blockManagerConfig );
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
                return [
                        new LoggedServiceOptions(
                                self::$serviceOptionsAccessLog,
                                BlockManager::$constructorOptions,
                                MediaWikiServices::getInstance()->getMainConfig()
                        ),
-                       $this->user,
-                       $this->user->getRequest(),
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       MediaWikiServices::getInstance()->getPermissionManager(),
+                       $logger
                ];
        }
 
index ebbfde2..b1e23ba 100644 (file)
@@ -282,7 +282,7 @@ class BlockRestrictionStoreTest extends \MediaWikiLangTestCase {
                        [ 'ir_ipb_id' => $block->getId() ]
                );
 
-               $this->assertEquals( 0, $result->numRows() );
+               $this->assertSame( 0, $result->numRows() );
        }
 
        /**
index 0ef571d..9182609 100644 (file)
@@ -314,7 +314,7 @@ class DatabaseBlockTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'Meta>MetaWikiUser', $block->getBlocker()->getName(),
                        'Correct blocker name' );
                $this->assertEquals( 'Meta>MetaWikiUser', $block->getByName(), 'Correct blocker name' );
-               $this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
+               $this->assertSame( 0, $block->getBy(), 'Correct blocker id' );
        }
 
        protected function addXffBlocks() {
index 7abddd4..869236b 100644 (file)
@@ -124,7 +124,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                $this->makePage( 'Go', 'de', 'Race!' );
                $dbw->endAtomic( __METHOD__ );
 
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        DeferredUpdates::pendingUpdatesCount(),
                        'Post-commit deferred update triggers a run of all updates' );
 
@@ -155,7 +155,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                // Populate one key
                $this->makePage( 'Key1', 'de', 'Value1' );
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        DeferredUpdates::pendingUpdatesCount(),
                        'Post-commit deferred update triggers a run of all updates' );
                $this->assertEquals( 'Value1', $messageCache->get( 'Key1' ), 'Key1 was successfully edited' );
@@ -168,7 +168,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                // Populate the second key
                $this->makePage( 'Key2', 'de', 'Value2' );
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        DeferredUpdates::pendingUpdatesCount(),
                        'Post-commit deferred update triggers a run of all updates' );
                $this->assertEquals( 'Value2', $messageCache->get( 'Key2' ), 'Key2 was successfully edited' );
@@ -208,14 +208,14 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                MessageCache::singleton()->getMsgFromNamespace( 'allpages', $wgContLanguageCode );
 
-               $this->assertEquals( 0, $dbr->trxLevel() );
+               $this->assertSame( 0, $dbr->trxLevel() );
                $dbr->setFlag( DBO_TRX, $dbr::REMEMBER_PRIOR ); // make queries trigger TRX
 
                MessageCache::singleton()->getMsgFromNamespace( 'go', $wgContLanguageCode );
 
                $dbr->restoreFlags();
 
-               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries (content language)" );
+               $this->assertSame( 0, $dbr->trxLevel(), "No DB read queries (content language)" );
        }
 
        public function testNoDBAccessNonContentLanguage() {
@@ -223,14 +223,14 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                MessageCache::singleton()->getMsgFromNamespace( 'allpages/nl', 'nl' );
 
-               $this->assertEquals( 0, $dbr->trxLevel() );
+               $this->assertSame( 0, $dbr->trxLevel() );
                $dbr->setFlag( DBO_TRX, $dbr::REMEMBER_PRIOR ); // make queries trigger TRX
 
                MessageCache::singleton()->getMsgFromNamespace( 'go/nl', 'nl' );
 
                $dbr->restoreFlags();
 
-               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries (non-content language)" );
+               $this->assertSame( 0, $dbr->trxLevel(), "No DB read queries (non-content language)" );
        }
 
        /**
index 7ad6541..31929d3 100644 (file)
@@ -83,12 +83,12 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( '(recentchanges-page-added-to-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
-               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertSame( 0, self::$lastNotifyArgs[5] );
+               $this->assertSame( 0, self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
                $this->assertEquals( 1, self::$lastNotifyArgs[8] );
                $this->assertEquals( null, self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
        public function testChangeRemovedNoRev() {
@@ -103,12 +103,12 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( '(recentchanges-page-removed-from-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
-               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertSame( 0, self::$lastNotifyArgs[5] );
+               $this->assertSame( 0, self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
                $this->assertEquals( 1, self::$lastNotifyArgs[8] );
                $this->assertEquals( null, self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
        public function testChangeAddedWithRev() {
@@ -127,9 +127,9 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$pageRev->getParentId(), self::$lastNotifyArgs[5] );
                $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertSame( 0, self::$lastNotifyArgs[8] );
                $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
        public function testChangeRemovedWithRev() {
@@ -148,9 +148,9 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$pageRev->getParentId(), self::$lastNotifyArgs[5] );
                $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertSame( 0, self::$lastNotifyArgs[8] );
                $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
 }
index 1511d46..895a3cb 100644 (file)
@@ -76,7 +76,7 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                $recentChange2 = $this->getEditChange( '20131103092253' );
                $html = $enhancedChangesList->recentChangesLine( $recentChange2, false );
 
-               $this->assertEquals( '', $html );
+               $this->assertSame( '', $html );
        }
 
        public function testRecentChangesPrefix() {
index 8f914b7..a59ba7d 100644 (file)
@@ -61,7 +61,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertSame( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
                $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertUserLinks( $user->getName(), $cacheEntry );
@@ -96,7 +96,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertSame( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
                $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertDeleteLogLink( $cacheEntry );
@@ -130,7 +130,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertSame( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
                $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertRevDel( $cacheEntry );
index e73b554..39b5380 100644 (file)
@@ -181,7 +181,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $content = null;
 
                $text = ContentHandler::getContentText( $content );
-               $this->assertEquals( '', $text );
+               $this->assertSame( '', $text );
        }
 
        public static function dataGetContentText_TextContent() {
index bc1d3c6..0572289 100644 (file)
@@ -49,7 +49,7 @@ class UnknownContentHandlerTest extends MediaWikiLangTestCase {
                $content = $handler->makeEmptyContent();
 
                $this->assertTrue( $content->isEmpty() );
-               $this->assertEquals( '', $content->getData() );
+               $this->assertSame( '', $content->getData() );
        }
 
        public static function dataIsSupportedFormat() {
index fd8e3ba..2b6f3f1 100644 (file)
@@ -139,7 +139,7 @@ class UnknownContentTest extends MediaWikiLangTestCase {
        public function testGetWikitextForTransclusion() {
                $content = $this->newContent( 'hello world.' );
 
-               $this->assertEquals( '', $content->getWikitextForTransclusion() );
+               $this->assertFalse( $content->getWikitextForTransclusion() );
        }
 
        /**
index b372e37..e18cecb 100644 (file)
@@ -64,7 +64,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $content = $this->handler->makeEmptyContent();
 
                $this->assertTrue( $content->isEmpty() );
-               $this->assertEquals( '', $content->getText() );
+               $this->assertSame( '', $content->getText() );
        }
 
        public static function dataIsSupportedFormat() {
index 32e71e0..3bb79e4 100644 (file)
@@ -49,7 +49,7 @@ class RequestContextTest extends MediaWikiTestCase {
 
                $oInfo = $context->exportSession();
                $this->assertEquals( '127.0.0.1', $oInfo['ip'], "Correct initial IP address." );
-               $this->assertEquals( 0, $oInfo['userId'], "Correct initial user ID." );
+               $this->assertSame( 0, $oInfo['userId'], "Correct initial user ID." );
                $this->assertFalse( MediaWiki\Session\SessionManager::getGlobalSession()->isPersistent(),
                        'Global session isn\'t persistent to start' );
 
index c789e83..f00499f 100644 (file)
@@ -187,7 +187,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                };
 
                $factory = $this->newLBFactoryMultiLBs();
-               $this->assertEquals( 0, $countLBsFunc( $factory ) );
+               $this->assertSame( 0, $countLBsFunc( $factory ) );
                $dbw = $factory->getMainLB()->getConnection( DB_MASTER );
                $this->assertEquals( 1, $countLBsFunc( $factory ) );
                // Test that LoadBalancer instances made during pre-commit callbacks in do not
@@ -208,7 +208,7 @@ class LBFactoryTest extends MediaWikiTestCase {
 
                $called = 0;
                $factory = $this->newLBFactoryMultiLBs();
-               $this->assertEquals( 0, $countLBsFunc( $factory ) );
+               $this->assertSame( 0, $countLBsFunc( $factory ) );
                $dbw = $factory->getMainLB()->getConnection( DB_MASTER );
                $this->assertEquals( 1, $countLBsFunc( $factory ) );
                // Test that LoadBalancer instances made during pre-commit callbacks in do not
@@ -475,17 +475,16 @@ class LBFactoryTest extends MediaWikiTestCase {
                /** @var IMaintainableDatabase $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $db->getDomainId(),
                        'Null domain ID handle used'
                );
-               $this->assertEquals(
-                       '',
+               $this->assertNull(
                        $db->getDBname(),
                        'Null domain ID handle used'
                );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $db->tablePrefix(),
                        'Main domain ID handle used; prefix is empty though'
@@ -555,7 +554,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                /** @var IMaintainableDatabase $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
 
-               $this->assertEquals( '', $db->getDomainID(), "Null domain used" );
+               $this->assertSame( '', $db->getDomainID(), "Null domain used" );
 
                $this->assertEquals(
                        $this->quoteTable( $db, 'page' ),
@@ -717,7 +716,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                $lb->forEachOpenConnection( function () use ( &$n ) {
                        ++$n;
                } );
-               $this->assertEquals( 0, $n, "Connections closed" );
+               $this->assertSame( 0, $n, "Connections closed" );
 
                $conn2 = $lb->getConnectionRef( DB_MASTER );
                $this->assertEquals(
index cd3ddfa..1f9d29e 100644 (file)
@@ -430,4 +430,18 @@ class LinksUpdateTest extends MediaWikiLangTestCase {
                        $queueGroup->ack( $job );
                }
        }
+
+       public function testIsRecursive() {
+               list( $title, $po ) = $this->makeTitleAndParserOutput( 'Test', 1 );
+               $linksUpdate = new LinksUpdate( $title, $po );
+               $this->assertTrue( $linksUpdate->isRecursive(), 'LinksUpdate is recursive by default' );
+
+               $linksUpdate = new LinksUpdate( $title, $po, true );
+               $this->assertTrue( $linksUpdate->isRecursive(),
+                       'LinksUpdate is recursive when asked to be recursive' );
+
+               $linksUpdate = new LinksUpdate( $title, $po, false );
+               $this->assertFalse( $linksUpdate->isRecursive(),
+                       'LinksUpdate is not recursive when asked to be not recursive' );
+       }
 }
index ccfcc18..f820f60 100644 (file)
@@ -20,8 +20,8 @@ class SiteStatsUpdateTest extends MediaWikiTestCase {
                $this->assertEquals( 1, $wrapped->pages );
                $this->assertEquals( 3, $wrapped->users );
                $this->assertEquals( 1, $wrapped->images );
-               $this->assertEquals( 0, $wrapped->edits );
-               $this->assertEquals( 0, $wrapped->articles );
+               $this->assertSame( 0, $wrapped->edits );
+               $this->assertSame( 0, $wrapped->articles );
        }
 
        /**
@@ -42,7 +42,7 @@ class SiteStatsUpdateTest extends MediaWikiTestCase {
                $fi = SiteStats::images();
                $ai = SiteStats::articles();
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount() );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount() );
 
                $dbw->begin( __METHOD__ ); // block opportunistic updates
 
@@ -64,7 +64,7 @@ class SiteStatsUpdateTest extends MediaWikiTestCase {
 
                $this->assertEquals( 1, DeferredUpdates::pendingUpdatesCount() );
                DeferredUpdates::doUpdates();
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount() );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount() );
 
                SiteStats::unload();
                $this->assertEquals( $pi + 2, SiteStats::pages(), 'page count' );
index 3b30d7e..7bc7918 100644 (file)
@@ -2422,7 +2422,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "$base/subdir2/subdir/sub/120-px-file.txt",
                ];
 
-               for ( $i = 0; $i < 25; $i++ ) {
+               for ( $i = 0; $i < 2; $i++ ) {
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
                        $this->assertEquals( print_r( [], true ), print_r( $status->getErrors(), true ),
                                "Locking of files succeeded ($backendName) ($i)." );
@@ -2554,7 +2554,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $be->getReadIndexFromParams( [ 'latest' => 1 ] ),
                        'Reads with "latest" flag use backend 1'
                );
-               $this->assertEquals(
+               $this->assertSame(
                        0,
                        $be->getReadIndexFromParams( [ 'latest' => 0 ] ),
                        'Reads without "latest" flag use backend 0'
index 35eca28..13f2b17 100644 (file)
@@ -13,7 +13,7 @@ use Wikimedia\TestingAccessWrapper;
  * @covers SwiftFileBackendList
  */
 class SwiftFileBackendTest extends MediaWikiTestCase {
-       /** @var TestingAccessWrapper Proxy to SwiftFileBackend */
+       /** @var TestingAccessWrapper|SwiftFileBackend */
        private $backend;
 
        protected function setUp() {
@@ -34,26 +34,28 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provider_testSanitizeHdrsStrict
+        * @covers SwiftFileBackend::extractMutableContentHeaders
+        * @dataProvider provider_testExtractPostableContentHeaders
         */
-       public function testSanitizeHdrsStrict( $raw, $sanitized ) {
-               $hdrs = $this->backend->sanitizeHdrsStrict( [ 'headers' => $raw ] );
+       public function testExtractPostableContentHeaders( $raw, $sanitized ) {
+               $hdrs = $this->backend->extractMutableContentHeaders( $raw );
 
-               $this->assertEquals( $hdrs, $sanitized, 'sanitizeHdrsStrict() has expected result' );
+               $this->assertEquals( $hdrs, $sanitized, 'Correct extractPostableContentHeaders() result' );
        }
 
-       public static function provider_testSanitizeHdrsStrict() {
+       public static function provider_testExtractPostableContentHeaders() {
                return [
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline',
                                        'content-duration' => 35.6363,
                                        'content-Custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -63,13 +65,14 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-Disposition' => 'inline; filename=xxx; ' . str_repeat( 'o', 1024 ),
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline;filename=xxx',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -79,13 +82,14 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => '',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -96,75 +100,11 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provider_testSanitizeHdrs
-        */
-       public function testSanitizeHdrs( $raw, $sanitized ) {
-               $hdrs = $this->backend->sanitizeHdrs( [ 'headers' => $raw ] );
-
-               $this->assertEquals( $hdrs, $sanitized, 'sanitizeHdrs() has expected result' );
-       }
-
-       public static function provider_testSanitizeHdrs() {
-               return [
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline',
-                                       'content-duration' => 35.6363,
-                                       'content-Custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ],
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-Disposition' => 'inline; filename=xxx; ' . str_repeat( 'o', 1024 ),
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline;filename=xxx',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ],
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => '',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ]
-               ];
-       }
-
-       /**
+        * @covers SwiftFileBackend::extractMetadataHeaders
         * @dataProvider provider_testGetMetadataHeaders
         */
        public function testGetMetadataHeaders( $raw, $sanitized ) {
-               $hdrs = $this->backend->getMetadataHeaders( $raw );
+               $hdrs = $this->backend->extractMetadataHeaders( $raw );
 
                $this->assertEquals( $hdrs, $sanitized, 'getMetadataHeaders() has expected result' );
        }
@@ -188,10 +128,11 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers SwiftFileBackend::getMetadataFromHeaders
         * @dataProvider provider_testGetMetadata
         */
        public function testGetMetadata( $raw, $sanitized ) {
-               $hdrs = $this->backend->getMetadata( $raw );
+               $hdrs = $this->backend->getMetadataFromHeaders( $raw );
 
                $this->assertEquals( $hdrs, $sanitized, 'getMetadata() has expected result' );
        }
index 7acd237..fe5dba1 100644 (file)
@@ -52,7 +52,7 @@ class LocalFileTest extends MediaWikiTestCase {
         * @covers File::getHashPath
         */
        public function testGetHashPath() {
-               $this->assertEquals( '', $this->file_hl0->getHashPath() );
+               $this->assertSame( '', $this->file_hl0->getHashPath() );
                $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
                $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
        }
@@ -193,4 +193,26 @@ class LocalFileTest extends MediaWikiTestCase {
                        'wfLocalFile() returns LocalFile for valid Titles'
                );
        }
+
+       /**
+        * @covers File::getUser
+        */
+       public function testGetUserForNonExistingFile() {
+               $this->assertSame( 'Unknown user', $this->file_hl0->getUser() );
+               $this->assertSame( 0, $this->file_hl0->getUser( 'id' ) );
+       }
+
+       /**
+        * @covers File::getUser
+        */
+       public function testDescriptionShortUrlForNonExistingFile() {
+               $this->assertNull( $this->file_hl0->getDescriptionShortUrl() );
+       }
+
+       /**
+        * @covers File::getUser
+        */
+       public function testDescriptionTextForNonExistingFile() {
+               $this->assertFalse( $this->file_hl0->getDescriptionText() );
+       }
 }
index c9356b6..ff0a9eb 100644 (file)
@@ -109,7 +109,7 @@ class GuzzleHttpRequestTest extends MediaWikiTestCase {
                $s = $r->execute();
                $errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
 
-               $this->assertEquals( 0, $r->getStatus() );
+               $this->assertSame( 0, $r->getStatus() );
                $this->assertEquals( 'http-invalid-url', $errorMsg );
        }
 
@@ -121,7 +121,7 @@ class GuzzleHttpRequestTest extends MediaWikiTestCase {
                $s = $r->execute();
                $errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
 
-               $this->assertEquals( 0, $r->getStatus() );
+               $this->assertSame( 0, $r->getStatus() );
                $this->assertEquals( 'http-request-error', $errorMsg );
        }
 
@@ -133,7 +133,7 @@ class GuzzleHttpRequestTest extends MediaWikiTestCase {
                $s = $r->execute();
                $errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
 
-               $this->assertEquals( 0, $r->getStatus() );
+               $this->assertSame( 0, $r->getStatus() );
                $this->assertEquals( 'http-timed-out', $errorMsg );
        }
 
index ef499a1..94b8c91 100644 (file)
@@ -14,7 +14,7 @@ class HttpTest extends MediaWikiTestCase {
                $this->hideDeprecated( 'Http::getProxy' );
 
                $this->setMwGlobals( 'wgHTTPProxy', false );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        Http::getProxy(),
                        'default setting'
index 8f8dde5..1db7085 100644 (file)
@@ -108,8 +108,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                $this->assertNull( $queue->push( $this->newJob() ), "Push worked ($desc)" );
                $this->assertNull( $queue->batchPush( [ $this->newJob() ] ), "Push worked ($desc)" );
@@ -118,7 +118,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 2, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
                $jobs = iterator_to_array( $queue->getAllQueuedJobs() );
                $this->assertEquals( 2, count( $jobs ), "Queue iterator size is correct ($desc)" );
 
@@ -135,7 +135,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $job2 = $queue->pop();
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
                if ( $recycles ) {
@@ -152,7 +152,7 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->ack( $job2 );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
 
                $this->assertNull( $queue->batchPush( [ $this->newJob(), $this->newJob() ] ),
                        "Push worked ($desc)" );
@@ -161,7 +161,7 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->delete();
                $queue->flushCaches();
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
        }
 
        /**
@@ -177,8 +177,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                $this->assertNull(
                        $queue->batchPush(
@@ -190,7 +190,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
                $this->assertNull(
                        $queue->batchPush(
@@ -203,13 +203,13 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
                $job1 = $queue->pop();
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
                if ( $recycles ) {
                        $this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
                }
@@ -217,7 +217,7 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->ack( $job1 );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
        }
 
        /**
@@ -256,8 +256,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                $root1 = Job::newRootJobParams( "nulljobspam:testId" ); // task ID/timestamp
                for ( $i = 0; $i < 5; ++$i ) {
@@ -282,7 +282,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 10, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
                $dupcount = 0;
                $jobs = [];
@@ -314,8 +314,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                for ( $i = 0; $i < 10; ++$i ) {
                        $this->assertNull( $queue->push( $this->newJob( $i ) ), "Push worked ($desc)" );
@@ -332,8 +332,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertFalse( $queue->pop(), "Queue is not empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
        }
 
        /**
index 90b57f2..c7596bf 100644 (file)
@@ -66,7 +66,7 @@ class ClearUserWatchlistJobTest extends MediaWikiTestCase {
                $this->assertEquals( 1, JobQueueGroup::singleton()->getQueueSizes()['clearUserWatchlist'] );
                $this->assertEquals( 2, $watchedItemStore->countWatchedItems( $user ) );
                $this->runJobs( 1 );
-               $this->assertEquals( 0, JobQueueGroup::singleton()->getQueueSizes()['clearUserWatchlist'] );
+               $this->assertSame( 0, JobQueueGroup::singleton()->getQueueSizes()['clearUserWatchlist'] );
                $this->assertEquals( 2, $watchedItemStore->countWatchedItems( $user ) );
 
                $this->assertTrue( $watchedItemStore->isWatched( $user, new TitleValue( 0, 'C' ) ) );
index 8e91e70..78af366 100644 (file)
@@ -16,7 +16,7 @@ class ProcessCacheLRUTest extends PHPUnit\Framework\TestCase {
         * Compare against an array so we get the cache content difference.
         */
        protected function assertCacheEmpty( $cache, $msg = 'Cache should be empty' ) {
-               $this->assertEquals( 0, $cache->getEntriesCount(), $msg );
+               $this->assertSame( 0, $cache->getEntriesCount(), $msg );
        }
 
        /**
index fcfa53e..79d5788 100644 (file)
@@ -125,4 +125,28 @@ class StringUtilsTest extends PHPUnit\Framework\TestCase {
                        'noncharacters 2' => [ $PASS, "\xef\xbf\xbf" ],
                ];
        }
+
+       /**
+        * @param strin $input
+        * @param bool $expected
+        * @dataProvider provideRegexps
+        * @covers StringUtils::isValidRegex
+        */
+       public function testIsValidRegex( $input, $expected ) {
+               $this->assertSame( $expected, StringUtils::isValidRegex( $input ) );
+       }
+
+       /**
+        * Data provider for testValidRegex
+        */
+       public static function provideRegexps() {
+               return [
+                       [ 'foo', false ],
+                       [ '/foo/', true ],
+                       [ '//', true ],
+                       [ '/(foo/', false ],
+                       [ '!(f[o]{2})!', true ],
+                       [ '/foo\/', false ]
+               ];
+       }
 }
index 581a518..90abd8c 100644 (file)
@@ -55,7 +55,7 @@ class TimingTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 'a', $entry['name'] );
                $this->assertEquals( 'mark', $entry['entryType'] );
                $this->assertArrayHasKey( 'startTime', $entry );
-               $this->assertEquals( 0, $entry['duration'] );
+               $this->assertSame( 0, $entry['duration'] );
 
                usleep( 100 );
                $timing->mark( 'a' );
index 332e23b..3e08250 100644 (file)
@@ -82,7 +82,7 @@ class HashBagOStuffTest extends PHPUnit\Framework\TestCase {
                $cache->set( 'bar', 1, 10 );
                $cache->set( 'baz', 1, -10 );
 
-               $this->assertEquals( 0, $cacheInternal->bag['foo'][$cache::KEY_EXP], 'Indefinite' );
+               $this->assertSame( 0, $cacheInternal->bag['foo'][$cache::KEY_EXP], 'Indefinite' );
                // 2 seconds tolerance
                $this->assertEquals( time() + 10, $cacheInternal->bag['bar'][$cache::KEY_EXP], 'Future', 2 );
                $this->assertEquals( time() - 10, $cacheInternal->bag['baz'][$cache::KEY_EXP], 'Past', 2 );
index ac988e6..72ac567 100644 (file)
@@ -128,6 +128,32 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertFalse( $this->cache->get( $key ), "Stale set() value ignored" );
        }
 
+       /**
+        * @covers WANObjectCache::getWithSetCallback
+        */
+       public function testProcessCacheTTL() {
+               $cache = $this->cache;
+               $mockWallClock = 1549343530.2053;
+               $cache->setMockTime( $mockWallClock );
+
+               $key = "mykey-" . wfRandomString();
+
+               $hits = 0;
+               $callback = function ( $oldValue, &$ttl, &$setOpts ) use ( &$hits ) {
+                       ++$hits;
+                       return 42;
+               };
+
+               $cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
+               $cache->delete( $key, $cache::HOLDOFF_NONE ); // clear persistent cache
+               $cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
+               $this->assertEquals( 1, $hits, "Value process cached" );
+
+               $mockWallClock += 6;
+               $cache->getWithSetCallback( $key, 100, $callback, [ 'pcTTL' => 5 ] );
+               $this->assertEquals( 2, $hits, "Value expired in process cache" );
+       }
+
        /**
         * @covers WANObjectCache::getWithSetCallback
         */
@@ -318,7 +344,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $v = $cache->getWithSetCallback(
                        $key, 30, $func, [ 'lowTTL' => 0, 'lockTSE' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+               $this->assertSame( 0, $wasSet, "Value not regenerated" );
 
                $mockWallClock += 1;
 
@@ -584,7 +610,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $asycList[0](); // run the refresh callback
                $asycList = [];
                $this->assertEquals( 2, $wasSet, "Value calculated at later time" );
-               $this->assertEquals( 0, count( $asycList ), "No deferred refreshes added." );
+               $this->assertSame( 0, count( $asycList ), "No deferred refreshes added." );
                $v = $cache->getWithSetCallback( $key, 300, $func, $opts );
                $this->assertEquals( $value, $v, "New value stored" );
 
@@ -678,13 +704,13 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $v = $cache->getMultiWithSetCallback(
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $mockWallClock += 1;
 
@@ -846,13 +872,13 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $v = $cache->getMultiWithUnionSetCallback(
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $mockWallClock += 1;
 
@@ -1478,7 +1504,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $wasSet = 0;
                $v = $cache->getWithSetCallback( $key, 30, $funcV2, $verOpts + $extOpts );
                $this->assertEquals( $valueV2, $v, "Value not regenerated (secondary key)" );
-               $this->assertEquals( 0, $wasSet, "Value not regenerated (secondary key)" );
+               $this->assertSame( 0, $wasSet, "Value not regenerated (secondary key)" );
 
                // Clear out the older or unversioned key
                $cache->delete( $key, 0 );
@@ -1981,6 +2007,8 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        [ 'domain:page:5', 'page' ],
                        [ 'domain:main-key', 'main-key' ],
                        [ 'domain:page:history', 'page' ],
+                       // Regression test for T232907
+                       [ 'domain:foo-bar-1.2:abc:v2', 'foo-bar-1_2' ],
                        [ 'missingdomainkey', 'missingdomainkey' ]
                ];
        }
index 4c92545..6fff68f 100644 (file)
@@ -316,8 +316,8 @@ class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase {
         * @dataProvider provideCommonDomainGTIDs
         * @covers Wikimedia\Rdbms\MySQLMasterPos
         */
-       public function testCommonGtidDomains( MySQLMasterPos $pos, MySQLMasterPos $ref, $gtids ) {
-               $this->assertEquals( $gtids, MySQLMasterPos::getCommonDomainGTIDs( $pos, $ref ) );
+       public function testGetRelevantActiveGTIDs( MySQLMasterPos $pos, MySQLMasterPos $ref, $gtids ) {
+               $this->assertEquals( $gtids, MySQLMasterPos::getRelevantActiveGTIDs( $pos, $ref ) );
        }
 
        public static function provideCommonDomainGTIDs() {
@@ -327,6 +327,12 @@ class DatabaseMysqlBaseTest extends PHPUnit\Framework\TestCase {
                                new MySQLMasterPos( '255-11-1000', 1 ),
                                [ '255-13-99' ]
                        ],
+                       [
+                               ( new MySQLMasterPos( '255-13-99,256-12-50,257-14-50', 1 ) )
+                                       ->setActiveDomain( 257 ),
+                               new MySQLMasterPos( '255-11-1000,257-14-30', 1 ),
+                               [ '257-14-50' ]
+                       ],
                        [
                                new MySQLMasterPos(
                                        '2E11FA47-71CA-11E1-9E33-C80AA9429562:1-5,' .
index 4419533..16f6a6c 100644 (file)
@@ -2014,7 +2014,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ );
                $wrapper->trxStatus = Database::STATUS_TRX_ERROR;
                $this->database->rollback( __METHOD__ );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
                $this->assertEquals( Database::STATUS_TRX_NONE, $wrapper->trxStatus() );
                $this->assertLastSql( 'BEGIN; ROLLBACK' );
 
@@ -2024,7 +2024,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->endAtomic( __METHOD__ );
                $this->assertEquals( Database::STATUS_TRX_NONE, $wrapper->trxStatus() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'1\'; COMMIT' );
-               $this->assertEquals( 0, $this->database->trxLevel(), 'Use after rollback()' );
+               $this->assertSame( 0, $this->database->trxLevel(), 'Use after rollback()' );
 
                $this->database->begin( __METHOD__ );
                $this->database->startAtomic( __METHOD__, Database::ATOMIC_CANCELABLE );
@@ -2038,7 +2038,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->commit( __METHOD__ );
                // phpcs:ignore Generic.Files.LineLength
                $this->assertLastSql( 'BEGIN; SAVEPOINT wikimedia_rdbms_atomic1; UPDATE y SET a = \'1\' WHERE field = \'1\'; ROLLBACK TO SAVEPOINT wikimedia_rdbms_atomic1; DELETE FROM y WHERE field = \'1\'; COMMIT' );
-               $this->assertEquals( 0, $this->database->trxLevel(), 'Use after rollback()' );
+               $this->assertSame( 0, $this->database->trxLevel(), 'Use after rollback()' );
 
                // Next transaction
                $this->database->startAtomic( __METHOD__ );
@@ -2047,7 +2047,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->endAtomic( __METHOD__ );
                $this->assertEquals( Database::STATUS_TRX_NONE, $wrapper->trxStatus() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; COMMIT' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2194,7 +2194,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; ROLLBACK; SELECT 2' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2223,7 +2223,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; ROLLBACK; SELECT 2' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2246,7 +2246,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; ROLLBACK' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2261,7 +2261,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; SELECT 1; ROLLBACK' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
index 93b1bf8..fddbab2 100644 (file)
@@ -490,13 +490,13 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->method( 'isOpen' )->willReturn( true );
                $db->method( 'getDBname' )->willReturn( 'unittest' );
 
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
                $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) );
                $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) );
                $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) );
                $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
 
                $db->setFlag( DBO_TRX );
                $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
@@ -507,7 +507,7 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->clearFlag( DBO_TRX );
 
                // Pending writes with DBO_TRX
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'meow', __METHOD__ ) );
                $db->setFlag( DBO_TRX );
                $db->query( "DELETE FROM test WHERE t = 1" ); // trigger DBO_TRX transaction before lock
@@ -521,7 +521,7 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->rollback( __METHOD__, IDatabase::FLUSHING_ALL_PEERS );
                // Pending writes without DBO_TRX
                $db->clearFlag( DBO_TRX );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'meow2', __METHOD__ ) );
                $db->begin( __METHOD__ );
                $db->query( "DELETE FROM test WHERE t = 1" ); // trigger DBO_TRX transaction before lock
@@ -535,17 +535,17 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->rollback( __METHOD__ );
                // No pending writes, with DBO_TRX
                $db->setFlag( DBO_TRX );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'wuff', __METHOD__ ) );
                $db->query( "SELECT 1", __METHOD__ );
                $this->assertEquals( 1, $db->trxLevel() );
                $lock = $db->getScopedLockAndFlush( 'wuff', __METHOD__, 1 );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertFalse( $db->lockIsFree( 'wuff', __METHOD__ ), 'Lock already acquired' );
                $db->rollback( __METHOD__, IDatabase::FLUSHING_ALL_PEERS );
                // No pending writes, without DBO_TRX
                $db->clearFlag( DBO_TRX );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'wuff2', __METHOD__ ) );
                $db->begin( __METHOD__ );
                try {
index b26a247..d176e39 100644 (file)
@@ -168,7 +168,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
 
                $linkRenderer = new LinkRenderer( $titleFormatter, $linkCache, $nsInfo );
                $linkRenderer->setStubThreshold( 0 );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $linkRenderer->getLinkClasses( $foobarTitle )
                );
@@ -186,7 +186,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
                );
 
                $linkRenderer->setStubThreshold( 20 );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $linkRenderer->getLinkClasses( $userTitle )
                );
index 1c076ca..7feaa93 100644 (file)
@@ -428,4 +428,46 @@ class ProtectLogFormatterTest extends LogFormatterTestCase {
        public function testMoveProtLogDatabaseRows( $row, $extra ) {
                $this->doTestLogFormatter( $row, $extra );
        }
+
+       public function provideGetActionLinks() {
+               yield [
+                       [ 'protect' ],
+                       true
+               ];
+               yield [
+                       [],
+                       false
+               ];
+       }
+
+       /**
+        * @param string[] $permissions
+        * @param bool $shouldMatch
+        * @dataProvider provideGetActionLinks
+        * @covers ProtectLogFormatter::getActionLinks
+        */
+       public function testGetActionLinks( array $permissions, $shouldMatch ) {
+               RequestContext::resetMain();
+               $user = $this->getTestUser()->getUser();
+               $this->overrideUserPermissions( $user, $permissions );
+               $row = $this->expandDatabaseRow( [
+                       'type' => 'protect',
+                       'action' => 'unprotect',
+                       'comment' => 'unprotect comment',
+                       'namespace' => NS_MAIN,
+                       'title' => 'ProtectPage',
+                       'params' => [],
+               ], false );
+               $context = new RequestContext();
+               $context->setUser( $user );
+               $formatter = LogFormatter::newFromRow( $row );
+               $formatter->setContext( $context );
+               if ( $shouldMatch ) {
+                       $this->assertStringMatchesFormat(
+                               '%Aaction=protect%A', $formatter->getActionLinks() );
+               } else {
+                       $this->assertStringNotMatchesFormat(
+                               '%Aaction=protect%A', $formatter->getActionLinks() );
+               }
+       }
 }
index 6c56510..4a0a6d0 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * @todo Could use a test of extended XMP segments. Hard to find programs that
- * create example files, and creating my own in vim propbably wouldn't
+ * create example files, and creating my own in vim probably wouldn't
  * serve as a very good "test". (Adobe photoshop probably creates such files
  * but it costs money). The implementation of it currently in MediaWiki is based
  * solely on reading the standard, without any real world test files.
@@ -76,6 +76,12 @@ class JpegMetadataExtractorTest extends MediaWikiIntegrationTestCase {
                $this->assertEquals( $expected, bin2hex( $res['PSIR'][0] ) );
        }
 
+       public function testXMPExtractionNullChar() {
+               $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-nullchar.jpg' );
+               $expected = file_get_contents( $this->filePath . 'jpeg-xmp-psir.xmp' );
+               $this->assertEquals( $expected, $res['XMP'] );
+       }
+
        public function testXMPExtractionAltAppId() {
                $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-alt.jpg' );
                $expected = file_get_contents( $this->filePath . 'jpeg-xmp-psir.xmp' );
index 630df54..8d0ddf8 100644 (file)
@@ -54,7 +54,7 @@ class JpegPixelFormatTest extends MediaWikiMediaTestCase {
                        '%[jpeg:sampling-factor]',
                        $path
                )->execute();
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        $result->getExitCode(),
                        "ImageMagick's identify command should return success"
                );
index 22de935..4d7ff48 100644 (file)
@@ -72,9 +72,9 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
-               $this->assertEquals( 0, $meta['frameCount'] );
+               $this->assertSame( 0, $meta['frameCount'] );
                $this->assertEquals( 1, $meta['loopCount'] );
-               $this->assertEquals( 0, $meta['duration'] );
+               $this->assertSame( 0.0, $meta['duration'] );
        }
 
        /**
@@ -87,7 +87,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 
                $this->assertEquals( 20, $meta['frameCount'] );
                // Note loop count of 0 = infinity
-               $this->assertEquals( 0, $meta['loopCount'] );
+               $this->assertSame( 0, $meta['loopCount'] );
                $this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
        }
 
diff --git a/tests/phpunit/includes/page/PageArchivePreMcrTest.php b/tests/phpunit/includes/page/PageArchivePreMcrTest.php
deleted file mode 100644 (file)
index 4c95579..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-use MediaWiki\MediaWikiServices;
-use MediaWiki\Revision\SlotRecord;
-use MediaWiki\Storage\SqlBlobStore;
-use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
-
-/**
- * Test class for page archiving, using the pre-MCR schema.
- *
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- *
- * @group medium
- * ^--- important, causes tests not to fail with timeout
- */
-class PageArchivePreMcrTest extends PageArchiveTestBase {
-
-       use PreMcrSchemaOverride;
-
-       protected function getExpectedArchiveRows() {
-               /** @var SqlBlobStore $blobStore */
-               $blobStore = MediaWikiServices::getInstance()->getBlobStore();
-
-               return [
-                       [
-                               'ar_minor_edit' => '0',
-                               'ar_user' => null,
-                               'ar_user_text' => $this->ipEditor,
-                               'ar_actor' => (string)User::newFromName( $this->ipEditor, false )->getActorId( $this->db ),
-                               'ar_len' => '11',
-                               'ar_deleted' => '0',
-                               'ar_rev_id' => strval( $this->ipRev->getId() ),
-                               'ar_timestamp' => $this->db->timestamp( $this->ipRev->getTimestamp() ),
-                               'ar_sha1' => '0qdrpxl537ivfnx4gcpnzz0285yxryy',
-                               'ar_page_id' => strval( $this->ipRev->getPageId() ),
-                               'ar_comment_text' => 'just a test',
-                               'ar_comment_data' => null,
-                               'ar_comment_cid' => '2',
-                               'ar_content_format' => null,
-                               'ar_content_model' => null,
-                               'ts_tags' => null,
-                               'ar_id' => '2',
-                               'ar_namespace' => '0',
-                               'ar_title' => 'PageArchiveTest_thePage',
-                               'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
-                                       $this->ipRev->getSlot( SlotRecord::MAIN )->getAddress()
-                               ),
-                               'ar_parent_id' => strval( $this->ipRev->getParentId() ),
-                       ],
-                       [
-                               'ar_minor_edit' => '0',
-                               'ar_user' => (string)$this->getTestUser()->getUser()->getId(),
-                               'ar_user_text' => $this->getTestUser()->getUser()->getName(),
-                               'ar_actor' => (string)$this->getTestUser()->getUser()->getActorId(),
-                               'ar_len' => '7',
-                               'ar_deleted' => '0',
-                               'ar_rev_id' => strval( $this->firstRev->getId() ),
-                               'ar_timestamp' => $this->db->timestamp( $this->firstRev->getTimestamp() ),
-                               'ar_sha1' => 'pr0s8e18148pxhgjfa0gjrvpy8fiyxc',
-                               'ar_page_id' => strval( $this->firstRev->getPageId() ),
-                               'ar_comment_text' => 'testing',
-                               'ar_comment_data' => null,
-                               'ar_comment_cid' => '1',
-                               'ar_content_format' => null,
-                               'ar_content_model' => null,
-                               'ts_tags' => null,
-                               'ar_id' => '1',
-                               'ar_namespace' => '0',
-                               'ar_title' => 'PageArchiveTest_thePage',
-                               'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
-                                       $this->firstRev->getSlot( SlotRecord::MAIN )->getAddress()
-                               ),
-                               'ar_parent_id' => '0',
-                       ],
-               ];
-       }
-
-}
index f071e4b..f0d895e 100644 (file)
@@ -439,7 +439,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $n = $res->numRows();
                $res->free();
 
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+               $this->assertSame( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
        /**
@@ -637,7 +637,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $n = $res->numRows();
                $res->free();
 
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+               $this->assertSame( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
        /**
@@ -1577,20 +1577,20 @@ more stuff
                $page->updateCategoryCounts( [ 'A' ], [], 0 );
 
                $this->assertEquals( 1, Category::newFromName( 'A' )->getPageCount() );
-               $this->assertEquals( 0, Category::newFromName( 'B' )->getPageCount() );
-               $this->assertEquals( 0, Category::newFromName( 'C' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'B' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'C' )->getPageCount() );
 
                // Add a new category
                $page->updateCategoryCounts( [ 'B' ], [], 0 );
 
                $this->assertEquals( 1, Category::newFromName( 'A' )->getPageCount() );
                $this->assertEquals( 1, Category::newFromName( 'B' )->getPageCount() );
-               $this->assertEquals( 0, Category::newFromName( 'C' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'C' )->getPageCount() );
 
                // Add and remove a category
                $page->updateCategoryCounts( [ 'C' ], [ 'A' ], 0 );
 
-               $this->assertEquals( 0, Category::newFromName( 'A' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'A' )->getPageCount() );
                $this->assertEquals( 1, Category::newFromName( 'B' )->getPageCount() );
                $this->assertEquals( 1, Category::newFromName( 'C' )->getPageCount() );
        }
diff --git a/tests/phpunit/includes/page/WikiPageNoContentModelDbTest.php b/tests/phpunit/includes/page/WikiPageNoContentModelDbTest.php
deleted file mode 100644 (file)
index 6f8d363..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
-
-/**
- * Tests WikiPage against the pre-MCR, pre ContentHandler DB schema.
- *
- * @covers WikiPage
- *
- * @group WikiPage
- * @group Storage
- * @group ContentHandler
- * @group Database
- * @group medium
- */
-class WikiPageNoContentModelDbTest extends WikiPageDbTestBase {
-
-       use PreMcrSchemaOverride;
-
-       protected function getContentHandlerUseDB() {
-               return false;
-       }
-
-       public function testGetDeletionUpdates() {
-               $mainContent1 = new WikitextContent( '' );
-
-               $title = Title::makeTitle( $this->getDefaultWikitextNS(), __METHOD__ );
-               $page = new WikiPage( $title );
-               $page = $this->createPage(
-                       $page,
-                       [ 'main' => $mainContent1 ]
-               );
-
-               $dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
-               $this->assertNotEmpty( $dataUpdates );
-
-               $updateNames = array_map( function ( $du ) {
-                       return isset( $du->_name ) ? $du->_name : get_class( $du );
-               }, $dataUpdates );
-
-               $this->assertContains( LinksDeletionUpdate::class, $updateNames );
-       }
-
-}
diff --git a/tests/phpunit/includes/page/WikiPagePreMcrDbTest.php b/tests/phpunit/includes/page/WikiPagePreMcrDbTest.php
deleted file mode 100644 (file)
index 028beca..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-use MediaWiki\Tests\Revision\PreMcrSchemaOverride;
-
-/**
- * Tests WikiPage against the pre-MCR DB schema.
- *
- * @covers WikiPage
- *
- * @group WikiPage
- * @group Storage
- * @group ContentHandler
- * @group Database
- * @group medium
- */
-class WikiPagePreMcrDbTest extends WikiPageDbTestBase {
-
-       use PreMcrSchemaOverride;
-
-       protected function getContentHandlerUseDB() {
-               return true;
-       }
-
-       /**
-        * @covers WikiPage::getContentModel
-        */
-       public function testGetContentModel() {
-               $page = $this->createPage(
-                       __METHOD__,
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
-       }
-
-       /**
-        * @covers WikiPage::getContentHandler
-        */
-       public function testGetContentHandler() {
-               $page = $this->createPage(
-                       __METHOD__,
-                       "some text",
-                       CONTENT_MODEL_JAVASCRIPT
-               );
-
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( JavaScriptContentHandler::class, get_class( $page->getContentHandler() ) );
-       }
-
-}
index e7f7067..c7a3fe6 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Preferences\DefaultPreferencesFactory;
 use Wikimedia\TestingAccessWrapper;
 
@@ -49,9 +50,10 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
 
        /**
         * Get a basic PreferencesFactory for testing with.
+        * @param PermissionManager $mockPM
         * @return DefaultPreferencesFactory
         */
-       protected function getPreferencesFactory() {
+       protected function getPreferencesFactory( PermissionManager $mockPM ) {
                $mockNsInfo = $this->createMock( NamespaceInfo::class );
                $mockNsInfo->method( 'getValidNamespaces' )->willReturn( [
                        NS_MAIN, NS_TALK, NS_USER, NS_USER_TALK
@@ -65,7 +67,8 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                        new Language(),
                        AuthManager::singleton(),
                        MediaWikiServices::getInstance()->getLinkRenderer(),
-                       $mockNsInfo
+                       $mockNsInfo,
+                       $mockPM
                );
        }
 
@@ -76,7 +79,9 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                $this->setTemporaryHook( 'GetPreferences', null );
 
                $testUser = $this->getTestUser();
-               $form = $this->getPreferencesFactory()->getForm( $testUser->getUser(), $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasRight' )->willReturn( true );
+               $form = $this->getPreferencesFactory( $pm )->getForm( $testUser->getUser(), $this->context );
                $this->assertInstanceOf( PreferencesFormOOUI::class, $form );
                $this->assertCount( 5, $form->getPreferenceSections() );
        }
@@ -88,7 +93,9 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
         * @dataProvider emailAuthenticationProvider
         */
        public function testEmailAuthentication( $user, $cssClass ) {
-               $prefs = $this->getPreferencesFactory()->getFormDescriptor( $user, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasRight' )->willReturn( true );
+               $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $user, $this->context );
                $this->assertArrayHasKey( 'cssclass', $prefs['emailauthentication'] );
                $this->assertEquals( $cssClass, $prefs['emailauthentication']['cssclass'] );
        }
@@ -100,16 +107,18 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                $userMock = $this->getMockBuilder( User::class )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $userMock->method( 'isAllowed' )
-                       ->willReturn( false );
                $userMock->method( 'getEffectiveGroups' )
                        ->willReturn( [] );
                $userMock->method( 'getGroupMemberships' )
                        ->willReturn( [] );
                $userMock->method( 'getOptions' )
                        ->willReturn( [ 'test' => 'yes' ] );
-
-               $prefs = $this->getPreferencesFactory()->getFormDescriptor( $userMock, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyoptions', true ]
+                       ] ) );
+               $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $userMock, $this->context );
                $this->assertArrayNotHasKey( 'showrollbackconfirmation', $prefs );
        }
 
@@ -120,16 +129,19 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                $userMock = $this->getMockBuilder( User::class )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $userMock->method( 'isAllowed' )
-                       ->willReturn( true );
                $userMock->method( 'getEffectiveGroups' )
                        ->willReturn( [] );
                $userMock->method( 'getGroupMemberships' )
                        ->willReturn( [] );
                $userMock->method( 'getOptions' )
                        ->willReturn( [ 'test' => 'yes' ] );
-
-               $prefs = $this->getPreferencesFactory()->getFormDescriptor( $userMock, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyoptions', true ],
+                               [ $userMock, 'rollback', true ]
+                       ] ) );
+               $prefs = $this->getPreferencesFactory( $pm )->getFormDescriptor( $userMock, $this->context );
                $this->assertArrayHasKey( 'showrollbackconfirmation', $prefs );
                $this->assertEquals(
                        'rendering/advancedrendering',
@@ -181,10 +193,6 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                        ->getMock();
                $userMock->method( 'getOptions' )
                        ->willReturn( $oldOptions );
-               $userMock->method( 'isAllowedAny' )
-                       ->willReturn( true );
-               $userMock->method( 'isAllowed' )
-                       ->willReturn( true );
 
                $userMock->expects( $this->exactly( 2 ) )
                        ->method( 'setOption' )
@@ -193,18 +201,25 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                                [ $this->equalTo( 'option' ), $this->equalTo( $newOptions[ 'option' ] ) ]
                        );
 
-               $form->expects( $this->any() )
-                       ->method( 'getModifiedUser' )
+               $form->method( 'getModifiedUser' )
                        ->willReturn( $userMock );
 
-               $form->expects( $this->any() )
-                       ->method( 'getContext' )
+               $form->method( 'getContext' )
                        ->willReturn( $this->context );
 
-               $form->expects( $this->any() )
-                       ->method( 'getConfig' )
+               $form->method( 'getConfig' )
                        ->willReturn( $configMock );
 
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasAnyRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyprivateinfo', 'editmyoptions', true ]
+                       ] ) );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $userMock, 'editmyoptions', true ]
+                       ] ) );
+
                $this->setTemporaryHook( 'PreferencesFormPreSave',
                        function ( $formData, $form, $user, &$result, $oldUserOptions )
                                use ( $newOptions, $oldOptions, $userMock ) {
@@ -220,7 +235,7 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                );
 
                /** @var DefaultPreferencesFactory $factory */
-               $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory() );
+               $factory = TestingAccessWrapper::newFromObject( $this->getPreferencesFactory( $pm ) );
                $factory->saveFormData( $newOptions, $form, [] );
        }
 
@@ -233,7 +248,14 @@ class DefaultPreferencesFactoryTest extends \MediaWikiTestCase {
                // Test a string with leading zeros (i.e. not octal) and spaces.
                $this->context->getRequest()->setVal( 'wprclimit', ' 0012 ' );
                $user = new User;
-               $form = $this->getPreferencesFactory()->getForm( $user, $this->context );
+               $pm = $this->createMock( PermissionManager::class );
+               $pm->method( 'userHasAnyRight' )
+                       ->willReturn( true );
+               $pm->method( 'userHasRight' )
+                       ->will( $this->returnValueMap( [
+                               [ $user, 'editmyoptions', true ]
+                       ] ) );
+               $form = $this->getPreferencesFactory( $pm )->getForm( $user, $this->context );
                $form->show();
                $form->trySubmit();
                $this->assertEquals( 12, $user->getOption( 'rclimit' ) );
index dad9f1e..6ebbc3a 100644 (file)
@@ -292,9 +292,8 @@ TEXT
                        ->disableOriginalConstructor()
                        ->getMock();
                $image->method( 'getDataUri' )
-                       ->will( $this->returnValue( $dataUriReturnValue ) );
-               $image->expects( $this->any() )
-                       ->method( 'getUrl' )
+                       ->willReturn( $dataUriReturnValue );
+               $image->method( 'getUrl' )
                        ->will( $this->returnValueMap( [
                                [ $context, 'load.php', null, 'original', 'original.svg' ],
                                [ $context, 'load.php', null, 'rasterized', 'rasterized.png' ],
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php
deleted file mode 100644 (file)
index c3fc55a..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-
-/**
- * @group ResourceLoader
- */
-class ResourceLoaderImageTest extends ResourceLoaderTestCase {
-
-       protected $imagesPath;
-
-       protected function setUp() {
-               parent::setUp();
-               $this->imagesPath = __DIR__ . '/../../data/resourceloader';
-       }
-
-       protected function getTestImage( $name ) {
-               $options = ResourceLoaderImageModuleTest::$commonImageData[$name];
-               $fileDescriptor = is_string( $options ) ? $options : $options['file'];
-               $allowedVariants = ( is_array( $options ) && isset( $options['variants'] ) ) ?
-                       $options['variants'] : [];
-               $variants = array_fill_keys( $allowedVariants, [ 'color' => 'red' ] );
-               return new ResourceLoaderImageTestable(
-                       $name,
-                       'test',
-                       $fileDescriptor,
-                       $this->imagesPath,
-                       $variants
-               );
-       }
-
-       public static function provideGetPath() {
-               return [
-                       [ 'abc', 'en', 'abc.gif' ],
-                       [ 'abc', 'he', 'abc.gif' ],
-                       [ 'def', 'en', 'def.svg' ],
-                       [ 'def', 'he', 'def.svg' ],
-                       [ 'ghi', 'en', 'ghi.svg' ],
-                       [ 'ghi', 'he', 'jkl.svg' ],
-                       [ 'mno', 'en', 'mno-ltr.svg' ],
-                       [ 'mno', 'ar', 'mno-rtl.svg' ],
-                       [ 'mno', 'he', 'mno-ltr.svg' ],
-                       [ 'pqr', 'en', 'pqr-b.svg' ],
-                       [ 'pqr', 'en-gb', 'pqr-b.svg' ],
-                       [ 'pqr', 'de', 'pqr-f.svg' ],
-                       [ 'pqr', 'de-formal', 'pqr-f.svg' ],
-                       [ 'pqr', 'ar', 'pqr-f.svg' ],
-                       [ 'pqr', 'fr', 'pqr-a.svg' ],
-                       [ 'pqr', 'he', 'pqr-a.svg' ],
-               ];
-       }
-
-       /**
-        * @covers ResourceLoaderImage::getPath
-        * @dataProvider provideGetPath
-        */
-       public function testGetPath( $imageName, $languageCode, $path ) {
-               static $dirMap = [
-                       'en' => 'ltr',
-                       'en-gb' => 'ltr',
-                       'de' => 'ltr',
-                       'de-formal' => 'ltr',
-                       'fr' => 'ltr',
-                       'he' => 'rtl',
-                       'ar' => 'rtl',
-               ];
-
-               $image = $this->getTestImage( $imageName );
-               $context = $this->getResourceLoaderContext( [
-                       'lang' => $languageCode,
-                       'dir' => $dirMap[$languageCode],
-               ] );
-
-               $this->assertEquals( $image->getPath( $context ), $this->imagesPath . '/' . $path );
-       }
-
-       /**
-        * @covers ResourceLoaderImage::getExtension
-        * @covers ResourceLoaderImage::getMimeType
-        */
-       public function testGetExtension() {
-               $image = $this->getTestImage( 'def' );
-               $this->assertEquals( $image->getExtension(), 'svg' );
-               $this->assertEquals( $image->getExtension( 'original' ), 'svg' );
-               $this->assertEquals( $image->getExtension( 'rasterized' ), 'png' );
-               $image = $this->getTestImage( 'abc' );
-               $this->assertEquals( $image->getExtension(), 'gif' );
-               $this->assertEquals( $image->getExtension( 'original' ), 'gif' );
-               $this->assertEquals( $image->getExtension( 'rasterized' ), 'gif' );
-       }
-
-       /**
-        * @covers ResourceLoaderImage::getImageData
-        * @covers ResourceLoaderImage::variantize
-        * @covers ResourceLoaderImage::massageSvgPathdata
-        */
-       public function testGetImageData() {
-               $context = $this->getResourceLoaderContext();
-
-               $image = $this->getTestImage( 'def' );
-               $data = file_get_contents( $this->imagesPath . '/def.svg' );
-               $dataConstructive = file_get_contents( $this->imagesPath . '/def_variantize.svg' );
-               $this->assertEquals( $image->getImageData( $context, null, 'original' ), $data );
-               $this->assertEquals(
-                       $image->getImageData( $context, 'destructive', 'original' ),
-                       $dataConstructive
-               );
-               // Stub, since we don't know if we even have a SVG handler, much less what exactly it'll output
-               $this->assertEquals( $image->getImageData( $context, null, 'rasterized' ), 'RASTERIZESTUB' );
-
-               $image = $this->getTestImage( 'abc' );
-               $data = file_get_contents( $this->imagesPath . '/abc.gif' );
-               $this->assertEquals( $image->getImageData( $context, null, 'original' ), $data );
-               $this->assertEquals( $image->getImageData( $context, null, 'rasterized' ), $data );
-       }
-
-       /**
-        * @covers ResourceLoaderImage::massageSvgPathdata
-        */
-       public function testMassageSvgPathdata() {
-               $image = $this->getTestImage( 'ghi' );
-               $data = file_get_contents( $this->imagesPath . '/ghi.svg' );
-               $dataMassaged = file_get_contents( $this->imagesPath . '/ghi_massage.svg' );
-               $this->assertEquals( $image->massageSvgPathdata( $data ), $dataMassaged );
-       }
-}
-
-class ResourceLoaderImageTestable extends ResourceLoaderImage {
-       // Make some protected methods public
-       public function massageSvgPathdata( $svg ) {
-               return parent::massageSvgPathdata( $svg );
-       }
-
-       // Stub, since we don't know if we even have a SVG handler, much less what exactly it'll output
-       public function rasterize( $svg ) {
-               return 'RASTERIZESTUB';
-       }
-}
index e728ad5..f0c97f4 100644 (file)
@@ -727,7 +727,7 @@ END
                ] );
                $context = $this->getResourceLoaderContext( [], $rl );
 
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $rl->getCombinedVersion( $context, [] ),
                        'empty list'
index 67493c4..8135d57 100644 (file)
@@ -7,7 +7,7 @@ class SearchNearMatchResultSetTest extends PHPUnit\Framework\TestCase {
         */
        public function testNumRows() {
                $resultSet = new SearchNearMatchResultSet( null );
-               $this->assertEquals( 0, $resultSet->numRows() );
+               $this->assertSame( 0, $resultSet->numRows() );
 
                $resultSet = new SearchNearMatchResultSet( Title::newMainPage() );
                $this->assertEquals( 1, $resultSet->numRows() );
index cd0867d..b2f525d 100644 (file)
@@ -259,14 +259,14 @@ class SessionManagerTest extends MediaWikiTestCase {
                try {
                        $manager->getSessionForRequest( $request );
                        $this->fail( 'Expcected exception not thrown' );
-               } catch ( \OverflowException $ex ) {
+               } catch ( SessionOverflowException $ex ) {
                        $this->assertStringStartsWith(
                                'Multiple sessions for this request tied for top priority: ',
                                $ex->getMessage()
                        );
-                       $this->assertCount( 2, $ex->sessionInfos );
-                       $this->assertContains( $request->info1, $ex->sessionInfos );
-                       $this->assertContains( $request->info2, $ex->sessionInfos );
+                       $this->assertCount( 2, $ex->getSessionInfos() );
+                       $this->assertContains( $request->info1, $ex->getSessionInfos() );
+                       $this->assertContains( $request->info2, $ex->getSessionInfos() );
                }
                $this->assertFalse( $request->unpersist1 );
                $this->assertFalse( $request->unpersist2 );
index 5fb3ac0..0dd88bb 100644 (file)
@@ -65,7 +65,7 @@ class ShellTest extends MediaWikiTestCase {
 
                $wrapper = TestingAccessWrapper::newFromObject( $command );
                $this->assertEquals( $expected, $wrapper->command );
-               $this->assertEquals( 0, $wrapper->restrictions & Shell::NO_LOCALSETTINGS );
+               $this->assertSame( 0, $wrapper->restrictions & Shell::NO_LOCALSETTINGS );
        }
 
        public function provideMakeScriptCommand() {
index df12eba..fc04fb7 100644 (file)
@@ -149,7 +149,7 @@ class CachingSiteStoreTest extends \MediaWikiIntegrationTestCase {
                $this->assertNull( $site );
 
                $sites = $store->getSites();
-               $this->assertEquals( 0, $sites->count() );
+               $this->assertSame( 0, $sites->count() );
        }
 
        /**
index 14ee15b..e125d71 100644 (file)
@@ -138,7 +138,7 @@ class DBSiteStoreTest extends MediaWikiTestCase {
                $this->assertNull( $site );
 
                $sites = $store->getSites();
-               $this->assertEquals( 0, $sites->count() );
+               $this->assertSame( 0, $sites->count() );
        }
 
        /**
index 9ad61b2..2119d31 100644 (file)
@@ -222,7 +222,7 @@ class SiteTest extends MediaWikiTestCase {
                $path = '//acme.com/'; // protocol-relative URL
                $site->setPath( $type, $path );
 
-               $this->assertEquals( '', $site->getProtocol() );
+               $this->assertSame( '', $site->getProtocol() );
        }
 
        public static function provideGetPageUrl() {
index 879acfe..5435afa 100644 (file)
@@ -8,6 +8,11 @@
  */
 class SpecialBlankPageTest extends SpecialPageTestBase {
 
+       protected function setUp() {
+               parent::setUp();
+               $this->setUserLang( 'qqx' );
+       }
+
        /**
         * Returns a new instance of the special page under test.
         *
@@ -19,7 +24,7 @@ class SpecialBlankPageTest extends SpecialPageTestBase {
 
        public function testHasWikiMsg() {
                list( $html, ) = $this->executeSpecialPage();
-               $this->assertContains( wfMessage( 'intentionallyblankpage' )->text(), $html );
+               $this->assertContains( '(intentionallyblankpage)', $html );
        }
 
 }
index 4075406..b11973c 100644 (file)
@@ -9,6 +9,12 @@
  */
 class SpecialPageDataTest extends SpecialPageTestBase {
 
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setContentLang( 'qqx' );
+       }
+
        protected function newSpecialPage() {
                $page = new SpecialPageData();
 
@@ -130,17 +136,12 @@ class SpecialPageDataTest extends SpecialPageTestBase {
        }
 
        public function testSpecialPageWithoutParameters() {
-               $this->setContentLang( Language::factory( 'en' ) );
                $request = new FauxRequest();
                $request->response()->header( 'Status: 200 OK', true, 200 ); // init/reset
 
                list( $output, ) = $this->executeSpecialPage( '', $request );
 
-               $this->assertContains(
-                       "Content negotiation applies based on your client's Accept header.",
-                       $output,
-                       "output"
-               );
+               $this->assertContains( '(pagedata-text)', $output );
        }
 
 }
index e38d77b..0e46744 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\Block\DatabaseBlock;
+use MediaWiki\MediaWikiServices;
 
 /**
  * @covers LocalIdLookup
@@ -47,12 +48,12 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testLookupCentralIds() {
                $lookup = new LocalIdLookup();
-
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
-               $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
-               $this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
+               $this->assertTrue( $permissionManager->userHasRight( $user1, 'hideuser' ), 'sanity check' );
+               $this->assertFalse( $permissionManager->userHasRight( $user2, 'hideuser' ), 'sanity check' );
 
                $this->assertSame( [], $lookup->lookupCentralIds( [] ) );
 
@@ -76,11 +77,12 @@ class LocalIdLookupTest extends MediaWikiTestCase {
 
        public function testLookupUserNames() {
                $lookup = new LocalIdLookup();
+               $permissionManager = MediaWikiServices::getInstance()->getPermissionManager();
                $user1 = $this->getLookupUser();
                $user2 = User::newFromName( 'UTLocalIdLookup2' );
 
-               $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
-               $this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
+               $this->assertTrue( $permissionManager->userHasRight( $user1, 'hideuser' ), 'sanity check' );
+               $this->assertFalse( $permissionManager->userHasRight( $user2, 'hideuser' ), 'sanity check' );
 
                $this->assertSame( [], $lookup->lookupUserNames( [] ) );
 
index b0c0fec..4a7aa05 100644 (file)
@@ -4,6 +4,7 @@ use MediaWiki\Auth\AuthManager;
 use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\Block\CompositeBlock;
 use MediaWiki\Block\SystemBlock;
+use MediaWiki\Permissions\PermissionManager;
 
 /**
  * @covers PasswordReset
@@ -30,16 +31,19 @@ class PasswordResetTest extends MediaWikiTestCase {
                $user->expects( $this->any() )->method( 'getName' )->willReturn( 'Foo' );
                $user->expects( $this->any() )->method( 'getBlock' )->willReturn( $block );
                $user->expects( $this->any() )->method( 'getGlobalBlock' )->willReturn( $globalBlock );
-               $user->expects( $this->any() )->method( 'isAllowed' )
-                       ->will( $this->returnCallback( function ( $perm ) use ( $canEditPrivate ) {
-                               if ( $perm === 'editmyprivateinfo' ) {
-                                       return $canEditPrivate;
-                               } else {
-                                       $this->fail( 'Unexpected permission check' );
-                               }
-                       } ) );
 
-               $passwordReset = new PasswordReset( $config, $authManager );
+               $permissionManager = $this->getMockBuilder( PermissionManager::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $permissionManager->method( 'userHasRight' )
+                       ->with( $user, 'editmyprivateinfo' )
+                       ->willReturn( $canEditPrivate );
+
+               $passwordReset = new PasswordReset(
+                       $config,
+                       $authManager,
+                       $permissionManager
+               );
 
                $this->assertSame( $isAllowed, $passwordReset->isAllowed( $user )->isGood() );
        }
@@ -204,9 +208,16 @@ class PasswordResetTest extends MediaWikiTestCase {
                $request->setIP( '1.2.3.4' );
                $performingUser = $this->getMockBuilder( User::class )->getMock();
                $performingUser->expects( $this->any() )->method( 'getRequest' )->willReturn( $request );
-               $performingUser->expects( $this->any() )->method( 'isAllowed' )->willReturn( true );
                $performingUser->expects( $this->any() )->method( 'getName' )->willReturn( 'Performer' );
 
+               $permissionManager = $this->getMockBuilder( PermissionManager::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $permissionManager->expects( $this->once() )
+                       ->method( 'userHasRight' )
+                       ->with( $performingUser, 'editmyprivateinfo' )
+                       ->willReturn( true );
+
                $targetUser1 = $this->getMockBuilder( User::class )->getMock();
                $targetUser2 = $this->getMockBuilder( User::class )->getMock();
                $targetUser1->expects( $this->any() )->method( 'getName' )->willReturn( 'User1' );
@@ -217,7 +228,8 @@ class PasswordResetTest extends MediaWikiTestCase {
                $targetUser2->expects( $this->any() )->method( 'getEmail' )->willReturn( 'foo@bar.baz' );
 
                $passwordReset = $this->getMockBuilder( PasswordReset::class )
-                       ->setMethods( [ 'getUsersByEmail' ] )->setConstructorArgs( [ $config, $authManager ] )
+                       ->setConstructorArgs( [ $config, $authManager, $permissionManager ] )
+                       ->setMethods( [ 'getUsersByEmail' ] )
                        ->getMock();
                $passwordReset->expects( $this->any() )->method( 'getUsersByEmail' )->with( 'foo@bar.baz' )
                        ->willReturn( [ $targetUser1, $targetUser2 ] );
index 4862747..6f57578 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  */
@@ -61,7 +63,9 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
                $user->clearInstanceCache();
                $this->assertContains( 'unittesters', $user->getGroups() );
                $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
-               $this->assertTrue( $user->isAllowed( 'runtest' ) );
+               $this->assertTrue( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'runtest' ) );
 
                // try updating without allowUpdate. Should fail
                $ugm = new UserGroupMembership( $user->getId(), 'unittesters', $this->expiryTime );
@@ -72,7 +76,9 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
                $user->clearInstanceCache();
                $this->assertContains( 'unittesters', $user->getGroups() );
                $this->assertArrayHasKey( 'unittesters', $user->getGroupMemberships() );
-               $this->assertTrue( $user->isAllowed( 'runtest' ) );
+               $this->assertTrue( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'runtest' ) );
 
                // try removing the group
                $ugm->delete();
@@ -81,7 +87,9 @@ class UserGroupMembershipTest extends MediaWikiTestCase {
                        $this->logicalNot( $this->contains( 'unittesters' ) ) );
                $this->assertThat( $user->getGroupMemberships(),
                        $this->logicalNot( $this->arrayHasKey( 'unittesters' ) ) );
-               $this->assertFalse( $user->isAllowed( 'runtest' ) );
+               $this->assertFalse( MediaWikiServices::getInstance()
+                       ->getPermissionManager()
+                       ->userHasRight( $user, 'runtest' ) );
 
                // check that the user group is now in user_former_groups
                $this->assertContains( 'unittesters', $user->getFormerGroups() );
index 3005ae9..f24255b 100644 (file)
@@ -559,10 +559,10 @@ class UserTest extends MediaWikiTestCase {
                $this->markTestSkippedIfDbType( 'postgres' );
 
                $users = User::findUsersByGroup( [] );
-               $this->assertEquals( 0, iterator_count( $users ) );
+               $this->assertSame( 0, iterator_count( $users ) );
 
                $users = User::findUsersByGroup( 'foo' );
-               $this->assertEquals( 0, iterator_count( $users ) );
+               $this->assertSame( 0, iterator_count( $users ) );
 
                $user = $this->getMutableTestUser( [ 'foo' ] )->getUser();
                $users = User::findUsersByGroup( 'foo' );
@@ -1488,10 +1488,6 @@ class UserTest extends MediaWikiTestCase {
                // logged in users should be inmune to cookie block of type ip/range
                $this->assertNull( $user->getBlock() );
 
-               // cookie is being cleared
-               $cookies = $request->response()->getCookies();
-               $this->assertEquals( '', $cookies['wikiBlockID']['value'] );
-
                // clean up
                $block->delete();
        }
index 0b1d013..45fa143 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\User\UserIdentityValue;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\LoadBalancer;
@@ -66,14 +67,16 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
 
        /**
         * @param PHPUnit_Framework_MockObject_MockObject|Database $mockDb
+        * @param PHPUnit_Framework_MockObject_MockObject|PermissionManager $mockPM
         * @return WatchedItemQueryService
         */
-       private function newService( $mockDb ) {
+       private function newService( $mockDb, $mockPM = null ) {
                return new WatchedItemQueryService(
                        $this->getMockLoadBalancer( $mockDb ),
                        $this->getMockCommentStore(),
                        $this->getMockActorMigration(),
-                       $this->getMockWatchedItemStore()
+                       $this->getMockWatchedItemStore(),
+                       $mockPM ?: $this->getMockPermissionManager()
                );
        }
 
@@ -153,6 +156,25 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
                return $mock;
        }
 
+       /**
+        * @param string $notAllowedAction
+        * @return PHPUnit_Framework_MockObject_MockObject|PermissionManager
+        */
+       private function getMockPermissionManager( $notAllowedAction = null ) {
+               $mock = $this->getMockBuilder( PermissionManager::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mock->method( 'userHasRight' )
+                       ->will( $this->returnCallback( function ( $user, $action ) use ( $notAllowedAction ) {
+                               return $action !== $notAllowedAction;
+                       } ) );
+               $mock->method( 'userHasAnyRight' )
+                       ->will( $this->returnCallback( function ( $user, ...$actions ) use ( $notAllowedAction ) {
+                               return !in_array( $notAllowedAction, $actions );
+                       } ) );
+               return $mock;
+       }
+
        /**
         * @param int $id
         * @param string[] $extraMethods Extra methods that are expected might be called
@@ -177,9 +199,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
         */
        private function getMockUnrestrictedNonAnonUserWithId( $id, array $extraMethods = [] ) {
                $mock = $this->getMockNonAnonUserWithId( $id,
-                       array_merge( [ 'isAllowed', 'isAllowedAny', 'useRCPatrol' ], $extraMethods ) );
-               $mock->method( 'isAllowed' )->willReturn( true );
-               $mock->method( 'isAllowedAny' )->willReturn( true );
+                       array_merge( [ 'useRCPatrol' ], $extraMethods ) );
                $mock->method( 'useRCPatrol' )->willReturn( true );
                return $mock;
        }
@@ -189,18 +209,9 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
         * @param string $notAllowedAction
         * @return PHPUnit_Framework_MockObject_MockObject|User
         */
-       private function getMockNonAnonUserWithIdAndRestrictedPermissions( $id, $notAllowedAction ) {
+       private function getMockNonAnonUserWithIdAndRestrictedPermissions( $id ) {
                $mock = $this->getMockNonAnonUserWithId( $id,
-                       [ 'isAllowed', 'isAllowedAny', 'useRCPatrol', 'useNPPatrol' ] );
-
-               $mock->method( 'isAllowed' )
-                       ->will( $this->returnCallback( function ( $action ) use ( $notAllowedAction ) {
-                               return $action !== $notAllowedAction;
-                       } ) );
-               $mock->method( 'isAllowedAny' )
-                       ->will( $this->returnCallback( function ( ...$actions ) use ( $notAllowedAction ) {
-                               return !in_array( $notAllowedAction, $actions );
-                       } ) );
+                       [ 'useRCPatrol', 'useNPPatrol' ] );
                $mock->method( 'useRCPatrol' )->willReturn( false );
                $mock->method( 'useNPPatrol' )->willReturn( false );
 
@@ -213,15 +224,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
         */
        private function getMockNonAnonUserWithIdAndNoPatrolRights( $id ) {
                $mock = $this->getMockNonAnonUserWithId( $id,
-                       [ 'isAllowed', 'isAllowedAny', 'useRCPatrol', 'useNPPatrol' ] );
-
-               $mock->expects( $this->any() )
-                       ->method( 'isAllowed' )
-                       ->will( $this->returnValue( true ) );
-               $mock->expects( $this->any() )
-                       ->method( 'isAllowedAny' )
-                       ->will( $this->returnValue( true ) );
-
+                       [ 'useRCPatrol', 'useNPPatrol' ] );
                $mock->expects( $this->any() )
                        ->method( 'useRCPatrol' )
                        ->will( $this->returnValue( false ) );
@@ -1132,9 +1135,10 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
                        )
                        ->will( $this->returnValue( [] ) );
 
-               $user = $this->getMockNonAnonUserWithIdAndRestrictedPermissions( 1, $notAllowedAction );
+               $permissionManager = $this->getMockPermissionManager( $notAllowedAction );
+               $user = $this->getMockNonAnonUserWithIdAndRestrictedPermissions( 1 );
 
-               $queryService = $this->newService( $mockDb );
+               $queryService = $this->newService( $mockDb, $permissionManager );
                $items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
 
                $this->assertEmpty( $items );
index fbb893e..e40417c 100644 (file)
@@ -1180,7 +1180,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                $this->assertInstanceOf( WatchedItem::class, $watchedItem );
                $this->assertEquals( 1, $watchedItem->getUser()->getId() );
                $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
-               $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
+               $this->assertSame( 0, $watchedItem->getLinkTarget()->getNamespace() );
        }
 
        public function testLoadWatchedItem_noItem() {
@@ -1382,7 +1382,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                $this->assertInstanceOf( WatchedItem::class, $watchedItem );
                $this->assertEquals( 1, $watchedItem->getUser()->getId() );
                $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
-               $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
+               $this->assertSame( 0, $watchedItem->getLinkTarget()->getNamespace() );
        }
 
        public function testGetWatchedItem_cachedItem() {
index 53edbf2..77fcff2 100644 (file)
@@ -233,7 +233,7 @@ class DatabaseSqliteTest extends \MediaWikiIntegrationTestCase {
                $index = $indexList->next();
                $this->assertEquals( 'baz_index2', $index->name );
                $this->assertEquals( '1', $index->unique );
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        $db->selectField( 'sqlite_master', 'COUNT(*)', [ 'name' => 'baz' ] ),
                        'Create a temporary duplicate only'
                );
@@ -524,7 +524,7 @@ class DatabaseSqliteTest extends \MediaWikiIntegrationTestCase {
                $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
                $this->assertInstanceOf( ResultWrapper::class, $databaseCreation, "Failed to create table a" );
                $res = $db->select( 'a', '*' );
-               $this->assertEquals( 0, $db->numFields( $res ), "expects to get 0 fields for an empty table" );
+               $this->assertSame( 0, $db->numFields( $res ), "expects to get 0 fields for an empty table" );
                $insertion = $db->insert( 'a', [ 'a_1' => 10 ], __METHOD__ );
                $this->assertTrue( $insertion, "Insertion failed" );
                $res = $db->select( 'a', '*' );
index 2f6fa39..628d248 100644 (file)
@@ -1799,7 +1799,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $s = $lang->getMessageFromDB( 'word-separator' );
                $c = $lang->getMessageFromDB( 'comma-separator' );
 
-               $this->assertEquals( '', $lang->listToText( [] ) );
+               $this->assertSame( '', $lang->listToText( [] ) );
                $this->assertEquals( 'a', $lang->listToText( [ 'a' ] ) );
                $this->assertEquals( "a{$and}{$s}b", $lang->listToText( [ 'a', 'b' ] ) );
                $this->assertEquals( "a{$c}b{$and}{$s}c", $lang->listToText( [ 'a', 'b', 'c' ] ) );
index 7647915..0387535 100644 (file)
@@ -185,7 +185,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                // 2. Do the real output checking on our own.
                $lines = explode( "\n", $this->getActualOutput() );
                $this->assertGreaterThan( 1, count( $lines ), "Minimal lines of produced output" );
-               $this->assertEquals( '', array_pop( $lines ), "Output ends in LF" );
+               $this->assertSame( '', array_pop( $lines ), "Output ends in LF" );
                $timestamp_re = "[0-9]{4}-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9]";
                foreach ( $lines as $line ) {
                        $this->assertRegExp(
index 22b5938..edb7618 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 /**
-* @covers MWDoxygenFilter
+ * @covers MWDoxygenFilter
  */
 class MWDoxygenFilterTest extends \PHPUnit\Framework\TestCase {
 
index 8eadb0e..ca71d32 100644 (file)
@@ -4,7 +4,7 @@ namespace MediaWiki\Tests\Maintenance;
 
 use ContentHandler;
 use FetchText;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWikiTestCase;
 use MWException;
 use Title;
index 91652a2..ca3cf10 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Tests\Rest\Handler;
 
 use EmptyBagOStuff;
 use GuzzleHttp\Psr7\Uri;
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\BasicAccess\StaticBasicAuthorizer;
 use MediaWiki\Rest\RequestData;
 use MediaWiki\Rest\ResponseFactory;
@@ -55,17 +56,17 @@ class HelloHandlerTest extends \MediaWikiUnitTestCase {
                $objectFactory = new ObjectFactory(
                        $this->getMockForAbstractClass( ContainerInterface::class )
                );
-
+               $permissionManager = $this->createMock( PermissionManager::class );
                $request = new RequestData( $requestInfo );
                $router = new Router(
                        [ __DIR__ . '/../testRoutes.json' ],
                        [],
                        '/rest',
                        new EmptyBagOStuff(),
-                       new ResponseFactory(),
+                       new ResponseFactory( [] ),
                        new StaticBasicAuthorizer(),
                        $objectFactory,
-                       new Validator( $objectFactory, $request, new User )
+                       new Validator( $objectFactory, $permissionManager, $request, new User )
                );
                $response = $router->execute( $request );
                if ( isset( $responseInfo['statusCode'] ) ) {
index 04d54de..0a98686 100644 (file)
@@ -6,6 +6,8 @@ use ArrayIterator;
 use MediaWiki\Rest\HttpException;
 use MediaWiki\Rest\ResponseFactory;
 use MediaWikiUnitTestCase;
+use Wikimedia\Message\ITextFormatter;
+use Wikimedia\Message\MessageValue;
 
 /** @covers \MediaWiki\Rest\ResponseFactory */
 class ResponseFactoryTest extends MediaWikiUnitTestCase {
@@ -18,14 +20,27 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
                ];
        }
 
+       private function createResponseFactory() {
+               $fakeTextFormatter = new class implements ITextFormatter {
+                       function getLangCode() {
+                               return 'qqx';
+                       }
+
+                       function format( MessageValue $message ) {
+                               return $message->getKey();
+                       }
+               };
+               return new ResponseFactory( [ $fakeTextFormatter ] );
+       }
+
        /** @dataProvider provideEncodeJson */
        public function testEncodeJson( $input, $expected ) {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $this->assertSame( $expected, $rf->encodeJson( $input ) );
        }
 
        public function testCreateJson() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createJson( [] );
                $response->getBody()->rewind();
                $this->assertSame( 'application/json', $response->getHeaderLine( 'Content-Type' ) );
@@ -35,7 +50,7 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
        }
 
        public function testCreateNoContent() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createNoContent();
                $this->assertSame( [], $response->getHeader( 'Content-Type' ) );
                $this->assertSame( 0, $response->getBody()->getSize() );
@@ -43,35 +58,35 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
        }
 
        public function testCreatePermanentRedirect() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createPermanentRedirect( 'http://www.example.com/' );
                $this->assertSame( [ 'http://www.example.com/' ], $response->getHeader( 'Location' ) );
                $this->assertSame( 301, $response->getStatusCode() );
        }
 
        public function testCreateLegacyTemporaryRedirect() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createLegacyTemporaryRedirect( 'http://www.example.com/' );
                $this->assertSame( [ 'http://www.example.com/' ], $response->getHeader( 'Location' ) );
                $this->assertSame( 302, $response->getStatusCode() );
        }
 
        public function testCreateTemporaryRedirect() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createTemporaryRedirect( 'http://www.example.com/' );
                $this->assertSame( [ 'http://www.example.com/' ], $response->getHeader( 'Location' ) );
                $this->assertSame( 307, $response->getStatusCode() );
        }
 
        public function testCreateSeeOther() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createSeeOther( 'http://www.example.com/' );
                $this->assertSame( [ 'http://www.example.com/' ], $response->getHeader( 'Location' ) );
                $this->assertSame( 303, $response->getStatusCode() );
        }
 
        public function testCreateNotModified() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createNotModified();
                $this->assertSame( 0, $response->getBody()->getSize() );
                $this->assertSame( 304, $response->getStatusCode() );
@@ -79,12 +94,12 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
 
        /** @expectedException \InvalidArgumentException */
        public function testCreateHttpErrorInvalid() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $rf->createHttpError( 200 );
        }
 
        public function testCreateHttpError() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createHttpError( 415, [ 'message' => '...' ] );
                $this->assertSame( 415, $response->getStatusCode() );
                $body = $response->getBody();
@@ -95,7 +110,7 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
        }
 
        public function testCreateFromExceptionUnlogged() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createFromException( new HttpException( 'hello', 415 ) );
                $this->assertSame( 415, $response->getStatusCode() );
                $body = $response->getBody();
@@ -106,7 +121,7 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
        }
 
        public function testCreateFromExceptionLogged() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createFromException( new \Exception( "hello", 415 ) );
                $this->assertSame( 500, $response->getStatusCode() );
                $body = $response->getBody();
@@ -131,7 +146,7 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
 
        /** @dataProvider provideCreateFromReturnValue */
        public function testCreateFromReturnValue( $input, $expected ) {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $response = $rf->createFromReturnValue( $input );
                $body = $response->getBody();
                $body->rewind();
@@ -140,7 +155,17 @@ class ResponseFactoryTest extends MediaWikiUnitTestCase {
 
        /** @expectedException \InvalidArgumentException */
        public function testCreateFromReturnValueInvalid() {
-               $rf = new ResponseFactory;
+               $rf = $this->createResponseFactory();
                $rf->createFromReturnValue( new ArrayIterator );
        }
+
+       public function testCreateLocalizedHttpError() {
+               $rf = $this->createResponseFactory();
+               $response = $rf->createLocalizedHttpError( 404, new MessageValue( 'rftest' ) );
+               $body = $response->getBody();
+               $body->rewind();
+               $this->assertSame(
+                       '{"messageTranslations":{"qqx":"rftest"},"httpCode":404,"httpReason":"Not Found"}',
+                       $body->getContents() );
+       }
 }
index e16ea25..270bcfc 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Tests\Rest;
 
 use GuzzleHttp\Psr7\Uri;
+use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\Rest\BasicAccess\StaticBasicAuthorizer;
 use MediaWiki\Rest\Handler;
 use MediaWiki\Rest\HttpException;
@@ -24,15 +25,16 @@ class RouterTest extends \MediaWikiUnitTestCase {
                $objectFactory = new ObjectFactory(
                        $this->getMockForAbstractClass( ContainerInterface::class )
                );
+               $permissionManager = $this->createMock( PermissionManager::class );
                return new Router(
                        [ __DIR__ . '/testRoutes.json' ],
                        [],
                        '/rest',
                        new \EmptyBagOStuff(),
-                       new ResponseFactory(),
+                       new ResponseFactory( [] ),
                        new StaticBasicAuthorizer( $authError ),
                        $objectFactory,
-                       new Validator( $objectFactory, $request, new User )
+                       new Validator( $objectFactory, $permissionManager, $request, new User )
                );
        }
 
@@ -55,6 +57,16 @@ class RouterTest extends \MediaWikiUnitTestCase {
                $this->assertSame( 'GET', $response->getHeaderLine( 'Allow' ) );
        }
 
+       public function testHeadToGet() {
+               $request = new RequestData( [
+                       'uri' => new Uri( '/rest/user/joe/hello' ),
+                       'method' => 'HEAD'
+               ] );
+               $router = $this->createRouter( $request );
+               $response = $router->execute( $request );
+               $this->assertSame( 200, $response->getStatusCode() );
+       }
+
        public function testNoMatch() {
                $request = new RequestData( [ 'uri' => new Uri( '/rest/bogus' ) ] );
                $router = $this->createRouter( $request );
index 4e1aced..17487ac 100644 (file)
@@ -50,7 +50,7 @@ class DiffOpTest extends \MediaWikiUnitTestCase {
         */
        public function testNorig() {
                $obj = new FakeDiffOp();
-               $this->assertEquals( 0, $obj->norig() );
+               $this->assertSame( 0, $obj->norig() );
                $obj->orig = [ 'foo' ];
                $this->assertEquals( 1, $obj->norig() );
        }
@@ -60,7 +60,7 @@ class DiffOpTest extends \MediaWikiUnitTestCase {
         */
        public function testNclosing() {
                $obj = new FakeDiffOp();
-               $this->assertEquals( 0, $obj->nclosing() );
+               $this->assertSame( 0, $obj->nclosing() );
                $obj->closing = [ 'foo' ];
                $this->assertEquals( 1, $obj->nclosing() );
        }
index cbfddd4..2c852e0 100644 (file)
@@ -7,7 +7,7 @@ class PasswordFactoryTest extends MediaWikiUnitTestCase {
        public function testConstruct() {
                $pf = new PasswordFactory();
                $this->assertEquals( [ '' ], array_keys( $pf->getTypes() ) );
-               $this->assertEquals( '', $pf->getDefaultType() );
+               $this->assertSame( '', $pf->getDefaultType() );
 
                $pf = new PasswordFactory( [
                        'foo' => [ 'class' => 'FooPassword' ],
diff --git a/tests/phpunit/unit/includes/resourceloader/ResourceLoaderImageTest.php b/tests/phpunit/unit/includes/resourceloader/ResourceLoaderImageTest.php
new file mode 100644 (file)
index 0000000..5265b3e
--- /dev/null
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * @group ResourceLoader
+ */
+class ResourceLoaderImageTest extends MediaWikiUnitTestCase {
+
+       private $imagesPath;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->imagesPath = __DIR__ . '/../../../data/resourceloader';
+       }
+
+       protected function tearDown() {
+               Language::$dataCache = null;
+       }
+
+       protected function getTestImage( $name ) {
+               $options = ResourceLoaderImageModuleTest::$commonImageData[$name];
+               $fileDescriptor = is_string( $options ) ? $options : $options['file'];
+               $allowedVariants = ( is_array( $options ) && isset( $options['variants'] ) ) ?
+                       $options['variants'] : [];
+               $variants = array_fill_keys( $allowedVariants, [ 'color' => 'red' ] );
+               return new ResourceLoaderImageTestable(
+                       $name,
+                       'test',
+                       $fileDescriptor,
+                       $this->imagesPath,
+                       $variants
+               );
+       }
+
+       public static function provideGetPath() {
+               return [
+                       [ 'abc', 'en', 'abc.gif' ],
+                       [ 'abc', 'he', 'abc.gif' ],
+                       [ 'def', 'en', 'def.svg' ],
+                       [ 'def', 'he', 'def.svg' ],
+                       [ 'ghi', 'en', 'ghi.svg' ],
+                       [ 'ghi', 'he', 'jkl.svg' ],
+                       [ 'mno', 'en', 'mno-ltr.svg' ],
+                       [ 'mno', 'ar', 'mno-rtl.svg' ],
+                       [ 'mno', 'he', 'mno-ltr.svg' ],
+                       [ 'pqr', 'en', 'pqr-b.svg' ],
+                       [ 'pqr', 'en-gb', 'pqr-b.svg' ],
+                       [ 'pqr', 'de', 'pqr-f.svg' ],
+                       [ 'pqr', 'de-formal', 'pqr-f.svg' ],
+                       [ 'pqr', 'ar', 'pqr-f.svg' ],
+                       [ 'pqr', 'fr', 'pqr-a.svg' ],
+                       [ 'pqr', 'he', 'pqr-a.svg' ],
+               ];
+       }
+
+       /**
+        * @covers ResourceLoaderImage::getPath
+        * @dataProvider provideGetPath
+        */
+       public function testGetPath( $imageName, $languageCode, $path ) {
+               static $dirMap = [
+                       'en' => 'ltr',
+                       'en-gb' => 'ltr',
+                       'de' => 'ltr',
+                       'de-formal' => 'ltr',
+                       'fr' => 'ltr',
+                       'he' => 'rtl',
+                       'ar' => 'rtl',
+               ];
+
+               $image = $this->getTestImage( $imageName );
+               $context = new DerivativeResourceLoaderContext(
+                       $this->createMock( ResourceLoaderContext::class )
+               );
+               $context->setLanguage( $languageCode );
+               $context->setDirection( $dirMap[$languageCode] );
+               Language::$dataCache = $this->createMock( LocalisationCache::class );
+               Language::$dataCache->method( 'getItem' )->will( $this->returnCallback( function ( $code ) {
+                       return ( [
+                               'en-gb' => [ 'en' ],
+                               'de-formal' => [ 'de' ],
+                       ] )[ $code ] ?? [];
+               } ) );
+
+               $this->assertEquals( $image->getPath( $context ), $this->imagesPath . '/' . $path );
+       }
+
+       /**
+        * @covers ResourceLoaderImage::getExtension
+        * @covers ResourceLoaderImage::getMimeType
+        */
+       public function testGetExtension() {
+               $image = $this->getTestImage( 'def' );
+               $this->assertEquals( $image->getExtension(), 'svg' );
+               $this->assertEquals( $image->getExtension( 'original' ), 'svg' );
+               $this->assertEquals( $image->getExtension( 'rasterized' ), 'png' );
+               $image = $this->getTestImage( 'abc' );
+               $this->assertEquals( $image->getExtension(), 'gif' );
+               $this->assertEquals( $image->getExtension( 'original' ), 'gif' );
+               $this->assertEquals( $image->getExtension( 'rasterized' ), 'gif' );
+       }
+
+       /**
+        * @covers ResourceLoaderImage::getImageData
+        * @covers ResourceLoaderImage::variantize
+        * @covers ResourceLoaderImage::massageSvgPathdata
+        */
+       public function testGetImageData() {
+               $context = $this->createMock( ResourceLoaderContext::class );
+
+               $image = $this->getTestImage( 'def' );
+               $data = file_get_contents( $this->imagesPath . '/def.svg' );
+               $dataConstructive = file_get_contents( $this->imagesPath . '/def_variantize.svg' );
+               $this->assertEquals( $image->getImageData( $context, null, 'original' ), $data );
+               $this->assertEquals(
+                       $image->getImageData( $context, 'destructive', 'original' ),
+                       $dataConstructive
+               );
+               // Stub, since we don't know if we even have a SVG handler, much less what exactly it'll output
+               $this->assertEquals( $image->getImageData( $context, null, 'rasterized' ), 'RASTERIZESTUB' );
+
+               $image = $this->getTestImage( 'abc' );
+               $data = file_get_contents( $this->imagesPath . '/abc.gif' );
+               $this->assertEquals( $image->getImageData( $context, null, 'original' ), $data );
+               $this->assertEquals( $image->getImageData( $context, null, 'rasterized' ), $data );
+       }
+
+       /**
+        * @covers ResourceLoaderImage::massageSvgPathdata
+        */
+       public function testMassageSvgPathdata() {
+               $image = $this->getTestImage( 'ghi' );
+               $data = file_get_contents( $this->imagesPath . '/ghi.svg' );
+               $dataMassaged = file_get_contents( $this->imagesPath . '/ghi_massage.svg' );
+               $this->assertEquals( $image->massageSvgPathdata( $data ), $dataMassaged );
+       }
+}
+
+class ResourceLoaderImageTestable extends ResourceLoaderImage {
+       // Make some protected methods public
+       public function massageSvgPathdata( $svg ) {
+               return parent::massageSvgPathdata( $svg );
+       }
+
+       // Stub, since we don't know if we even have a SVG handler, much less what exactly it'll output
+       public function rasterize( $svg ) {
+               return 'RASTERIZESTUB';
+       }
+}
index fb0309d..fce21f7 100644 (file)
@@ -27,7 +27,7 @@ class SearchSuggestionSetTest extends \MediaWikiUnitTestCase {
         */
        public function testAppend() {
                $set = SearchSuggestionSet::emptySuggestionSet();
-               $this->assertEquals( 0, $set->getSize() );
+               $this->assertSame( 0, $set->getSize() );
                $set->append( new SearchSuggestion( 3 ) );
                $this->assertEquals( 3, $set->getWorstScore() );
                $this->assertEquals( 3, $set->getBestScore() );
@@ -61,7 +61,7 @@ class SearchSuggestionSetTest extends \MediaWikiUnitTestCase {
         */
        public function testInsertBest() {
                $set = SearchSuggestionSet::emptySuggestionSet();
-               $this->assertEquals( 0, $set->getSize() );
+               $this->assertSame( 0, $set->getSize() );
                $set->prepend( new SearchSuggestion( 3 ) );
                $this->assertEquals( 3, $set->getWorstScore() );
                $this->assertEquals( 3, $set->getBestScore() );
@@ -104,7 +104,7 @@ class SearchSuggestionSetTest extends \MediaWikiUnitTestCase {
                $this->assertEquals( 10, $set->getSize() );
 
                $set->shrink( 0 );
-               $this->assertEquals( 0, $set->getSize() );
+               $this->assertSame( 0, $set->getSize() );
        }
 
        // TODO: test for fromTitles
index cab6c3b..a3a165f 100644 (file)
@@ -102,7 +102,6 @@ return [
                ],
                'dependencies' => [
                        'jquery.color',
-                       'jquery.colorUtil',
                        'jquery.getAttrs',
                        'jquery.highlightText',
                        'jquery.lengthLimit',
index 541c610..22a3a4b 100644 (file)
                return api.post( {} );
        } );
 
+       QUnit.test( 'origin is not included in same-origin GET requests', function ( assert ) {
+               var apiUrl = location.protocol + '//' + location.host + '/w/api.php',
+                       api = new mw.ForeignApi( apiUrl );
+
+               this.server.respond( function ( request ) {
+                       assert.strictEqual( request.url.match( /origin=.*?(?:&|$)/ ), null, 'origin is not included in GET requests' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               return api.get( {} );
+       } );
+
+       QUnit.test( 'origin is not included in same-origin POST requests', function ( assert ) {
+               var apiUrl = location.protocol + '//' + location.host + '/w/api.php',
+                       api = new mw.ForeignApi( apiUrl );
+
+               this.server.respond( function ( request ) {
+                       assert.strictEqual( request.requestBody.match( /origin=.*?(?:&|$)/ ), null, 'origin is not included in POST request body' );
+                       assert.strictEqual( request.url.match( /origin=.*?(?:&|$)/ ), null, 'origin is not included in POST request URL, either' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+
+               return api.post( {} );
+       } );
+
 }() );
index 4c6e7c9..16c3183 100644 (file)
                        [ 'test.load.circleB', '0', [ 'test.load.circleC' ] ],
                        [ 'test.load.circleC', '0', [ 'test.load.circleA' ] ]
                ] );
-               this.sandbox.stub( mw, 'track', function ( topic, data ) {
+               this.sandbox.stub( mw, 'trackError', function ( topic, data ) {
                        capture.push( {
                                topic: topic,
                                error: data.exception && data.exception.message,
                mw.loader.register( [
                        [ 'test.load.circleDirect', '0', [ 'test.load.circleDirect' ] ]
                ] );
-               this.sandbox.stub( mw, 'track', function ( topic, data ) {
+               this.sandbox.stub( mw, 'trackError', function ( topic, data ) {
                        capture.push( {
                                topic: topic,
                                error: data.exception && data.exception.message,
 
        QUnit.test( '.load() - Error: Unregistered', function ( assert ) {
                var capture = [];
-               this.sandbox.stub( mw, 'track', function ( topic, data ) {
-                       capture.push( {
-                               topic: topic,
-                               error: data.exception && data.exception.message,
-                               source: data.source
-                       } );
+               this.sandbox.stub( mw.log, 'warn', function ( str ) {
+                       capture.push( str );
                } );
 
                mw.loader.load( 'test.load.unreg' );
-               assert.deepEqual(
-                       [ {
-                               topic: 'resourceloader.exception',
-                               error: 'Unknown module: test.load.unreg',
-                               source: 'resolve'
-                       } ],
-                       capture
-               );
+               assert.deepEqual( capture, [ 'Skipped unresolvable module test.load.unreg' ] );
        } );
 
        // Regression test for T36853
        QUnit.test( '.load() - Error: Missing dependency', function ( assert ) {
                var capture = [];
-               this.sandbox.stub( mw, 'track', function ( topic, data ) {
+               this.sandbox.stub( mw, 'trackError', function ( topic, data ) {
                        capture.push( {
                                topic: topic,
                                error: data.exception && data.exception.message,
                this.useStubClock();
 
                // Don't actually emit an error event
-               this.sandbox.stub( mw, 'track' );
+               this.sandbox.stub( mw, 'trackError' );
 
                mw.loader.register( [
                        [ 'test.module1', '0' ],
                }, {}, {} );
                this.tick();
 
-               assert.strictEqual( mw.loader.getState( 'test.module1' ), 'error', 'Expected "error" state for test.module1' );
-               assert.strictEqual( mw.loader.getState( 'test.module2' ), 'error', 'Expected "error" state for test.module2' );
-               assert.strictEqual( mw.loader.getState( 'test.module3' ), 'error', 'Expected "error" state for test.module3' );
+               assert.strictEqual( mw.loader.getState( 'test.module1' ), 'error', 'State of test.module1' );
+               assert.strictEqual( mw.loader.getState( 'test.module2' ), 'error', 'State of test.module2' );
+               assert.strictEqual( mw.loader.getState( 'test.module3' ), 'error', 'State of test.module3' );
 
-               assert.strictEqual( mw.track.callCount, 1 );
+               assert.strictEqual( mw.trackError.callCount, 1 );
        } );
 
        QUnit.test( 'Out-of-order implementation', function ( assert ) {
 
                mw.loader.implement( 'test.module4', function () {} );
                this.tick();
-               assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
-               assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
-               assert.strictEqual( mw.loader.getState( 'test.module6' ), 'registered', 'Expected "registered" state for test.module6' );
+               assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'State of test.module4' );
+               assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'State of test.module5' );
+               assert.strictEqual( mw.loader.getState( 'test.module6' ), 'registered', 'State of test.module6' );
 
                mw.loader.implement( 'test.module6', function () {} );
                this.tick();
-               assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
-               assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
-               assert.strictEqual( mw.loader.getState( 'test.module6' ), 'loaded', 'Expected "loaded" state for test.module6' );
+               assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'State of test.module4' );
+               assert.strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'State of test.module5' );
+               assert.strictEqual( mw.loader.getState( 'test.module6' ), 'loaded', 'State of test.module6' );
 
                mw.loader.implement( 'test.module5', function () {} );
                this.tick();
-               assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
-               assert.strictEqual( mw.loader.getState( 'test.module5' ), 'ready', 'Expected "ready" state for test.module5' );
-               assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
+               assert.strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'State of test.module4' );
+               assert.strictEqual( mw.loader.getState( 'test.module5' ), 'ready', 'State of test.module5' );
+               assert.strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'State of test.module6' );
        } );
 
        QUnit.test( 'Missing dependency', function ( assert ) {
index 4f61abd..a05b50b 100644 (file)
 
                assert.strictEqual( mw.util.escapeRegExp( normal ), normal, 'Alphanumerals are left alone' );
        } );
+
+       QUnit.test( 'debounce', function ( assert ) {
+               var fn,
+                       q = [],
+                       done = assert.async();
+
+               fn = mw.util.debounce( 0, function ( data ) {
+                       q.push( data );
+               } );
+
+               fn( 1 );
+               fn( 2 );
+               fn( 3 );
+
+               setTimeout( function () {
+                       assert.deepEqual(
+                               q,
+                               [ 3 ],
+                               'Last one ran'
+                       );
+                       done();
+               } );
+       } );
 }() );
index 6b674b9..8a28e4d 100644 (file)
@@ -3,11 +3,37 @@ const MWBot = require( 'mwbot' );
 // TODO: Once we require Node 7 or later, we can use async-await.
 
 module.exports = {
+       /**
+        * Get a logged-in instance of `MWBot` with edit token already set up.
+        * Default username, password and base URL is used unless specified.
+        *
+        * @since 0.5.0
+        * @param {string} username - Optional
+        * @param {string} password - Optional
+        * @param {string} baseUrl - Optional
+        * @return {Promise<MWBot>}
+        */
+       bot(
+               username = browser.options.username,
+               password = browser.options.password,
+               baseUrl = browser.options.baseUrl
+       ) {
+               const bot = new MWBot();
+
+               return bot.loginGetEditToken( {
+                       apiUrl: `${baseUrl}/api.php`,
+                       username: username,
+                       password: password
+               } ).then( function () {
+                       return bot;
+               } );
+       },
+
        /**
         * Shortcut for `MWBot#edit( .. )`.
         * Default username, password and base URL is used unless specified
         *
-        * @since 1.0.0
+        * @since 0.1.0
         * @see <https://www.mediawiki.org/wiki/API:Edit>
         * @param {string} title
         * @param {string} content
@@ -22,42 +48,32 @@ module.exports = {
                password = browser.options.password,
                baseUrl = browser.options.baseUrl
        ) {
-               const bot = new MWBot();
-
-               return bot.loginGetEditToken( {
-                       apiUrl: `${baseUrl}/api.php`,
-                       username: username,
-                       password: password
-               } ).then( function () {
-                       return bot.edit( title, content, `Created or updated page with "${content}"` );
-               } );
+               return this.bot( username, password, baseUrl )
+                       .then( function ( bot ) {
+                               return bot.edit( title, content, `Created or updated page with "${content}"` );
+                       } );
        },
 
        /**
         * Shortcut for `MWBot#delete( .. )`.
         *
-        * @since 1.0.0
+        * @since 0.1.0
         * @see <https://www.mediawiki.org/wiki/API:Delete>
         * @param {string} title
         * @param {string} reason
         * @return {Object} Promise for API action=delete response data.
         */
        delete( title, reason ) {
-               const bot = new MWBot();
-
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( function () {
-                       return bot.delete( title, reason );
-               } );
+               return this.bot()
+                       .then( function ( bot ) {
+                               return bot.delete( title, reason );
+                       } );
        },
 
        /**
         * Shortcut for `MWBot#request( { acount: 'createaccount', .. } )`.
         *
-        * @since 1.0.0
+        * @since 0.1.0
         * @see <https://www.mediawiki.org/wiki/API:Account_creation>
         * @param {string} username
         * @param {string} password
@@ -94,23 +110,17 @@ module.exports = {
         * @return {Object} Promise for API action=block response data.
         */
        blockUser( username, expiry ) {
-               const bot = new MWBot();
-
-               // Log in as admin
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( () => {
-                       // block user. default = admin
-                       return bot.request( {
-                               action: 'block',
-                               user: username || browser.options.username,
-                               reason: 'browser test',
-                               token: bot.editToken,
-                               expiry
+               return this.bot()
+                       .then( function ( bot ) {
+                               // block user. default = admin
+                               return bot.request( {
+                                       action: 'block',
+                                       user: username || browser.options.username,
+                                       reason: 'browser test',
+                                       token: bot.editToken,
+                                       expiry
+                               } );
                        } );
-               } );
        },
 
        /**
@@ -122,21 +132,15 @@ module.exports = {
         * @return {Object} Promise for API action=unblock response data.
         */
        unblockUser( username ) {
-               const bot = new MWBot();
-
-               // Log in as admin
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( () => {
-                       // unblock user. default = admin
-                       return bot.request( {
-                               action: 'unblock',
-                               user: username || browser.options.username,
-                               reason: 'browser test done',
-                               token: bot.editToken
+               return this.bot()
+                       .then( function ( bot ) {
+                               // unblock user. default = admin
+                               return bot.request( {
+                                       action: 'unblock',
+                                       user: username || browser.options.username,
+                                       reason: 'browser test done',
+                                       token: bot.editToken
+                               } );
                        } );
-               } );
        }
 };
index ed6c78a..79356a2 100644 (file)
@@ -1,3 +1,7 @@
+## 0.5.0 / 2019-09-18
+
+* Api: Added `bot()` method.
+
 ## 0.4.0 / 2019-07-18
 
 * Util: Added a `waitForModuleState()` method.
index dc16e81..d2698f7 100644 (file)
@@ -22,11 +22,12 @@ Utilities to interact with the MediaWiki API. Uses the [mwbot](https://github.co
 Actions are performed logged-in using `browser.options.username` and `browser.options.password`,
 which typically come from `MEDIAWIKI_USER` and `MEDIAWIKI_PASSWORD` environment variables.
 
-* `edit(title, content [, string username [, string password [, string baseUrl ] ] ])`
-* `delete(title, reason)`
-* `createAccount(username, password)`
-* `blockUser(username, expiry)`
-* `unblockUser(username)`
+* `edit(string title, string content [, string username [, string password [, string baseUrl ] ] ])`
+* `delete(string title, string reason)`
+* `createAccount(string username, string password)`
+* `blockUser([ string username [, string expiry ] ])`
+* `unblockUser([ string username ])`
+* `bot([string username [, string password [, string baseUrl ] ] ])`
 
 ### RunJobs
 
index 423487f..58a5390 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "wdio-mediawiki",
-  "version": "0.4.0",
+  "version": "0.5.0",
   "description": "WebdriverIO plugin for testing a MediaWiki site.",
   "homepage": "https://gerrit.wikimedia.org/g/mediawiki/core/+/master/tests/selenium/wdio-mediawiki/",
   "license": "MIT",
index 6512e7d..72a89dd 100644 (file)
@@ -39,16 +39,8 @@ exports.config = {
        // Sauce Labs
        // ======
        // See http://webdriver.io/guide/services/sauce.html
-       // and https://docs.saucelabs.com/reference/platforms-configurator
-       services: [ 'sauce' ],
-       user: process.env.SAUCE_USERNAME,
-       key: process.env.SAUCE_ACCESS_KEY,
-
-       // Default timeout in milliseconds for Selenium Grid requests
-       connectionRetryTimeout: 90 * 1000,
-
-       // Default request retries count
-       connectionRetryCount: 3,
+       // and https://github.com/bermi/sauce-connect-launcher#advanced-usage
+       services: process.env.SAUCE_ACCESS_KEY ? [ 'sauce' ] : [],
 
        // ==================
        // Test Files
index 5be1ed0..bedf171 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -524,7 +524,7 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
  * /w/images/thumb/a/ab/Foo.png/120px-Foo.png. The $thumbRel parameter
  * of this function would be set to "a/ab/Foo.png/120px-Foo.png".
  * This method is responsible for turning that into an array
- * with the folowing keys:
+ * with the following keys:
  *  * f => the filename (Foo.png)
  *  * rel404 => the whole thing (a/ab/Foo.png/120px-Foo.png)
  *  * archived => 1 (If the request is for an archived thumb)